Example #1
0
function* handleRequest(httpChannel, socket) {
  var req = yield httpChannel.take;

  if (req.method !== "GET") {
    return [405, ["Allow", "GET"]];
  }
  // Convert headers list to node-style headers object.
  var headers = {};
  req.headers.forEach(function (pair) {
    headers[pair[0].toLowerCase()] = pair[1];
  });

  var key = headers["sec-websocket-key"];
  var protocol = headers["sec-websocket-protocol"];
  var version = headers["sec-websocket-version"];

  if (headers.upgrade !== "websocket" || !key || protocol !== "tedit-remote" || version !== "13") {
    return [200, {"Content-Type": "text/plain"}, "Only tedit-remote websocket v13 protocol supported.\n"];
  }

  var accept = bodec.encodeBase64(
    bodec.decodeHex(sha1(key + magic))
  );

  httpChannel.put({
    code: 101,
    headers: [
      ["Upgrade", "websocket"],
      ["Connection", "Upgrade"],
      ["Sec-WebSocket-Accept", accept],
      ["Sec-WebSocket-Protocol", "tedit-remote"],
    ]
  });

  // Add the websocket framing protocol to the stream
  // The new channel speaks raw type 2 binary messages.
  var wsChannel = addCodec(httpChannel, {
    encoder: function (emit) {
      var send = websocketCodec.encoder(emit);
      return function (item) {
        if (item === undefined) return emit();
        send({opcode: 2, body: item});
      };
    },
    decoder: function (emit) {
      return websocketCodec.decoder(function (item) {
        if (item === undefined) return emit();
        if (item.opcode === 2) return emit(item.body);
      });
    }
  });

  console.log("New RPC client", socket.address());
  rpc(wsChannel, api);
}
Example #2
0
function encodeTree(body) {
  var tree = "";
  var names = Object.keys(body).sort(pathCmp);
  for (var i = 0, l = names.length; i < l; i++) {
    var name = names[i];
    var entry = body[name];
    tree += entry.mode.toString(8) + " " + name +
            "\0" + binary.decodeHex(entry.hash);
  }
  return tree;
}
Example #3
0
function encodeTree(body) {
  var tree = "";
  var names = Object.keys(body).sort();
  for (var i = 0, l = names.length; i < l; i++) {
    var name = names[i];
    var entry = body[name];
    tree += entry.mode.toString(8) + " " + bodec.encodeUtf8(name) +
            "\0" + bodec.decodeHex(entry.hash);
  }
  return bodec.fromRaw(tree);
}
Example #4
0
function encodeTree(body) {
  var tree = "";
  if (Array.isArray(body)) throw new TypeError("Tree must be in object form");
  var names = Object.keys(body).sort(treeSort);
  for (var i = 0, l = names.length; i < l; i++) {
    var name = names[i];
    var entry = body[name];
    tree += entry.mode.toString(8) + " " + bodec.encodeUtf8(name) +
            "\0" + bodec.decodeHex(entry.hash);
  }
  return bodec.fromRaw(tree);
}