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); }
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; }
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); }
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); }