@graffy/server
Advanced tools
@@ -6,16 +6,8 @@ "use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = server; | ||
exports.default = server; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator")); | ||
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); | ||
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends")); | ||
var _setInterval2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-interval")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator")); | ||
var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncIterator")); | ||
var _url = _interopRequireDefault(require("url")); | ||
@@ -27,275 +19,68 @@ | ||
if (!store) throw new Error('server.store_undef'); | ||
return /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(req, res) { | ||
var parsed, query, options, keepAlive, stream, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, _value3, chunks, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, _value2, chunk, change, _value4; | ||
return async (req, res) => { | ||
const parsed = _url.default.parse(req.url, true); | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
parsed = _url["default"].parse(req.url, true); | ||
query = parsed.query.q && (0, _common.decodeUrl)(parsed.query.q); | ||
options = parsed.query.opts && (0, _common.deserialize)(decodeURIComponent(parsed.query.opts)); | ||
const query = parsed.query.q && (0, _common.decodeUrl)(parsed.query.q); | ||
const options = parsed.query.opts && (0, _common.deserialize)(decodeURIComponent(parsed.query.opts)); | ||
if (!(req.method === 'GET')) { | ||
_context.next = 67; | ||
break; | ||
} | ||
if (req.method === 'GET') { | ||
try { | ||
if (req.headers['accept'] === 'text/event-stream') { | ||
res.setHeader('content-type', 'text/event-stream'); | ||
const keepAlive = (0, _setInterval2.default)(() => { | ||
if (req.aborted || res.finished) { | ||
clearInterval(keepAlive); | ||
return; | ||
} | ||
_context.prev = 4; | ||
res.write(': \n\n'); | ||
}, 29000); // TODO: Resumable subscriptions using timestamp ID. | ||
// const lastId = req.headers['last-event-id']; | ||
if (!(req.headers['accept'] === 'text/event-stream')) { | ||
_context.next = 53; | ||
break; | ||
} | ||
try { | ||
const stream = store.call('watch', query, { ...options, | ||
raw: true | ||
}); | ||
res.setHeader('content-type', 'text/event-stream'); | ||
keepAlive = (0, _setInterval2["default"])(function () { | ||
if (req.aborted || res.finished) { | ||
clearInterval(keepAlive); | ||
return; | ||
} | ||
res.write(': \n\n'); | ||
}, 29000); // TODO: Resumable subscriptions using timestamp ID. | ||
// const lastId = req.headers['last-event-id']; | ||
_context.prev = 8; | ||
stream = store.call('watch', query, (0, _extends2["default"])({}, options, { | ||
raw: true | ||
})); | ||
_iteratorNormalCompletion = true; | ||
_didIteratorError = false; | ||
_context.prev = 12; | ||
_iterator = (0, _asyncIterator2["default"])(stream); | ||
case 14: | ||
_context.next = 16; | ||
return _iterator.next(); | ||
case 16: | ||
_step = _context.sent; | ||
_iteratorNormalCompletion = _step.done; | ||
_context.next = 20; | ||
return _step.value; | ||
case 20: | ||
_value = _context.sent; | ||
if (_iteratorNormalCompletion) { | ||
_context.next = 29; | ||
break; | ||
} | ||
value = _value; | ||
if (!(req.aborted || res.finished)) { | ||
_context.next = 25; | ||
break; | ||
} | ||
return _context.abrupt("break", 29); | ||
case 25: | ||
for await (const value of stream) { | ||
if (req.aborted || res.finished) break; | ||
res.write("data: " + (0, _common.serialize)(value) + "\n\n"); | ||
} | ||
} catch (e) { | ||
res.write("event: graffyerror\ndata: " + e.message + "\n\n"); | ||
} | ||
case 26: | ||
_iteratorNormalCompletion = true; | ||
_context.next = 14; | ||
break; | ||
res.end(); | ||
} else { | ||
const value = await store.call('read', query, { ...options, | ||
raw: true | ||
}); | ||
res.writeHead(200); | ||
res.end((0, _common.serialize)(value)); | ||
} | ||
} catch (e) { | ||
res.writeHead(400); | ||
res.end(e.message + "\n\n"); | ||
return; | ||
} | ||
} else if (req.method === 'POST') { | ||
try { | ||
const chunks = []; | ||
case 29: | ||
_context.next = 35; | ||
break; | ||
for await (const chunk of req) chunks.push(chunk); | ||
case 31: | ||
_context.prev = 31; | ||
_context.t0 = _context["catch"](12); | ||
_didIteratorError = true; | ||
_iteratorError = _context.t0; | ||
case 35: | ||
_context.prev = 35; | ||
_context.prev = 36; | ||
if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { | ||
_context.next = 40; | ||
break; | ||
} | ||
_context.next = 40; | ||
return _iterator["return"](); | ||
case 40: | ||
_context.prev = 40; | ||
if (!_didIteratorError) { | ||
_context.next = 43; | ||
break; | ||
} | ||
throw _iteratorError; | ||
case 43: | ||
return _context.finish(40); | ||
case 44: | ||
return _context.finish(35); | ||
case 45: | ||
_context.next = 50; | ||
break; | ||
case 47: | ||
_context.prev = 47; | ||
_context.t1 = _context["catch"](8); | ||
res.write("event: graffyerror\ndata: " + _context.t1.message + "\n\n"); | ||
case 50: | ||
res.end(); | ||
_context.next = 58; | ||
break; | ||
case 53: | ||
_context.next = 55; | ||
return store.call('read', query, (0, _extends2["default"])({}, options, { | ||
raw: true | ||
})); | ||
case 55: | ||
_value3 = _context.sent; | ||
res.writeHead(200); | ||
res.end((0, _common.serialize)(_value3)); | ||
case 58: | ||
_context.next = 65; | ||
break; | ||
case 60: | ||
_context.prev = 60; | ||
_context.t2 = _context["catch"](4); | ||
res.writeHead(400); | ||
res.end(_context.t2.message + "\n\n"); | ||
return _context.abrupt("return"); | ||
case 65: | ||
_context.next = 120; | ||
break; | ||
case 67: | ||
if (!(req.method === 'POST')) { | ||
_context.next = 118; | ||
break; | ||
} | ||
_context.prev = 68; | ||
chunks = []; | ||
_iteratorNormalCompletion2 = true; | ||
_didIteratorError2 = false; | ||
_context.prev = 72; | ||
_iterator2 = (0, _asyncIterator2["default"])(req); | ||
case 74: | ||
_context.next = 76; | ||
return _iterator2.next(); | ||
case 76: | ||
_step2 = _context.sent; | ||
_iteratorNormalCompletion2 = _step2.done; | ||
_context.next = 80; | ||
return _step2.value; | ||
case 80: | ||
_value2 = _context.sent; | ||
if (_iteratorNormalCompletion2) { | ||
_context.next = 87; | ||
break; | ||
} | ||
chunk = _value2; | ||
chunks.push(chunk); | ||
case 84: | ||
_iteratorNormalCompletion2 = true; | ||
_context.next = 74; | ||
break; | ||
case 87: | ||
_context.next = 93; | ||
break; | ||
case 89: | ||
_context.prev = 89; | ||
_context.t3 = _context["catch"](72); | ||
_didIteratorError2 = true; | ||
_iteratorError2 = _context.t3; | ||
case 93: | ||
_context.prev = 93; | ||
_context.prev = 94; | ||
if (!(!_iteratorNormalCompletion2 && _iterator2["return"] != null)) { | ||
_context.next = 98; | ||
break; | ||
} | ||
_context.next = 98; | ||
return _iterator2["return"](); | ||
case 98: | ||
_context.prev = 98; | ||
if (!_didIteratorError2) { | ||
_context.next = 101; | ||
break; | ||
} | ||
throw _iteratorError2; | ||
case 101: | ||
return _context.finish(98); | ||
case 102: | ||
return _context.finish(93); | ||
case 103: | ||
change = (0, _common.deserialize)((0, _concat["default"])(Buffer).call(Buffer, chunks).toString()); | ||
_context.next = 106; | ||
return store.call('write', change, options); | ||
case 106: | ||
_value4 = _context.sent; | ||
res.writeHead(200); | ||
res.end((0, _common.serialize)(_value4)); | ||
_context.next = 116; | ||
break; | ||
case 111: | ||
_context.prev = 111; | ||
_context.t4 = _context["catch"](68); | ||
res.writeHead(400); | ||
res.end(_context.t4.message + "\n\n"); | ||
return _context.abrupt("return"); | ||
case 116: | ||
_context.next = 120; | ||
break; | ||
case 118: | ||
res.writeHead(501); | ||
res.end('Not implemented'); | ||
case 120: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[4, 60], [8, 47], [12, 31, 35, 45], [36,, 40, 44], [68, 111], [72, 89, 93, 103], [94,, 98, 102]]); | ||
})); | ||
return function (_x, _x2) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
const change = (0, _common.deserialize)((0, _concat.default)(Buffer).call(Buffer, chunks).toString()); | ||
const value = await store.call('write', change, options); | ||
res.writeHead(200); | ||
res.end((0, _common.serialize)(value)); | ||
} catch (e) { | ||
res.writeHead(400); | ||
res.end(e.message + "\n\n"); | ||
return; | ||
} | ||
} else { | ||
res.writeHead(501); | ||
res.end('Not implemented'); | ||
} | ||
}; | ||
} // TODO: Write tests! | ||
@@ -302,0 +87,0 @@ |
@@ -10,6 +10,6 @@ "use strict"; | ||
exports.httpServer = _httpServer["default"]; | ||
exports.httpServer = _httpServer.default; | ||
var _wsServer = _interopRequireDefault(require("./wsServer")); | ||
exports.wsServer = _wsServer["default"]; | ||
exports.wsServer = _wsServer.default; |
@@ -5,6 +5,11 @@ { | ||
"author": "aravind (https://github.com/aravindet)", | ||
"version": "0.14.7-alpha.9", | ||
"main": "index.js", | ||
"source": "src/index.js", | ||
"esnext": "src/index.js", | ||
"version": "0.14.7-alpha.10", | ||
"main": "./index.js", | ||
"exports": { | ||
"import": "./src/index.js", | ||
"require": "./index.js" | ||
}, | ||
"module": "./src/index.js", | ||
"source": "./src/index.js", | ||
"esnext": "./src/index.js", | ||
"repository": { | ||
@@ -17,5 +22,5 @@ "type": "git", | ||
"@babel/runtime-corejs3": "^7.9.2", | ||
"@graffy/common": "0.14.7-alpha.9", | ||
"@graffy/common": "0.14.7-alpha.10", | ||
"ws": "^7.2.3" | ||
} | ||
} |
250
wsServer.js
@@ -6,3 +6,3 @@ "use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = server; | ||
exports.default = server; | ||
@@ -15,10 +15,2 @@ var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now")); | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator")); | ||
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator")); | ||
var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncIterator")); | ||
var _ws = _interopRequireDefault(require("ws")); | ||
@@ -28,7 +20,7 @@ | ||
var PING_INTERVAL = 30000; | ||
const PING_INTERVAL = 30000; | ||
function server(store) { | ||
if (!store) throw new Error('server.store_undef'); | ||
var wss = new _ws["default"].Server({ | ||
const wss = new _ws.default.Server({ | ||
noServer: true | ||
@@ -39,171 +31,52 @@ }); | ||
ws.on('message', /*#__PURE__*/function () { | ||
var _message = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(msg) { | ||
var _deserialize, id, op, payload, options, result, stream, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; | ||
ws.on('message', async function message(msg) { | ||
try { | ||
const [id, op, payload, options] = (0, _common.deserialize)(msg); | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.prev = 0; | ||
_deserialize = (0, _common.deserialize)(msg), id = _deserialize[0], op = _deserialize[1], payload = _deserialize[2], options = _deserialize[3]; | ||
if (id === ':pong') { | ||
ws.pingPending = false; | ||
return; | ||
} | ||
if (!(id === ':pong')) { | ||
_context.next = 5; | ||
break; | ||
} | ||
switch (op) { | ||
case 'read': | ||
case 'write': | ||
try { | ||
const result = await store.call(op, payload, options); | ||
ws.send((0, _common.serialize)([id, null, result])); | ||
} catch (e) { | ||
ws.send((0, _common.serialize)([id, e.message])); | ||
} | ||
ws.pingPending = false; | ||
return _context.abrupt("return"); | ||
break; | ||
case 5: | ||
_context.t0 = op; | ||
_context.next = _context.t0 === 'read' ? 8 : _context.t0 === 'write' ? 8 : _context.t0 === 'watch' ? 19 : _context.t0 === 'unwatch' ? 61 : 66; | ||
break; | ||
case 'watch': | ||
try { | ||
const stream = store.call('watch', payload, { ...options, | ||
raw: true | ||
}); | ||
ws.graffyStreams[id] = stream; | ||
case 8: | ||
_context.prev = 8; | ||
_context.next = 11; | ||
return store.call(op, payload, options); | ||
case 11: | ||
result = _context.sent; | ||
ws.send((0, _common.serialize)([id, null, result])); | ||
_context.next = 18; | ||
break; | ||
case 15: | ||
_context.prev = 15; | ||
_context.t1 = _context["catch"](8); | ||
ws.send((0, _common.serialize)([id, _context.t1.message])); | ||
case 18: | ||
return _context.abrupt("break", 66); | ||
case 19: | ||
_context.prev = 19; | ||
stream = store.call('watch', payload, (0, _extends2["default"])({}, options, { | ||
raw: true | ||
})); | ||
ws.graffyStreams[id] = stream; | ||
_iteratorNormalCompletion = true; | ||
_didIteratorError = false; | ||
_context.prev = 24; | ||
_iterator = (0, _asyncIterator2["default"])(stream); | ||
case 26: | ||
_context.next = 28; | ||
return _iterator.next(); | ||
case 28: | ||
_step = _context.sent; | ||
_iteratorNormalCompletion = _step.done; | ||
_context.next = 32; | ||
return _step.value; | ||
case 32: | ||
_value = _context.sent; | ||
if (_iteratorNormalCompletion) { | ||
_context.next = 39; | ||
break; | ||
} | ||
value = _value; | ||
for await (const value of stream) { | ||
ws.send((0, _common.serialize)([id, null, value])); | ||
} | ||
} catch (e) { | ||
ws.send((0, _common.serialize)([id, e.message])); | ||
} | ||
case 36: | ||
_iteratorNormalCompletion = true; | ||
_context.next = 26; | ||
break; | ||
break; | ||
case 39: | ||
_context.next = 45; | ||
break; | ||
case 41: | ||
_context.prev = 41; | ||
_context.t2 = _context["catch"](24); | ||
_didIteratorError = true; | ||
_iteratorError = _context.t2; | ||
case 45: | ||
_context.prev = 45; | ||
_context.prev = 46; | ||
if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { | ||
_context.next = 50; | ||
break; | ||
} | ||
_context.next = 50; | ||
return _iterator["return"](); | ||
case 50: | ||
_context.prev = 50; | ||
if (!_didIteratorError) { | ||
_context.next = 53; | ||
break; | ||
} | ||
throw _iteratorError; | ||
case 53: | ||
return _context.finish(50); | ||
case 54: | ||
return _context.finish(45); | ||
case 55: | ||
_context.next = 60; | ||
break; | ||
case 57: | ||
_context.prev = 57; | ||
_context.t3 = _context["catch"](19); | ||
ws.send((0, _common.serialize)([id, _context.t3.message])); | ||
case 60: | ||
return _context.abrupt("break", 66); | ||
case 61: | ||
if (ws.graffyStreams[id]) { | ||
_context.next = 63; | ||
break; | ||
} | ||
return _context.abrupt("break", 66); | ||
case 63: | ||
ws.graffyStreams[id]["return"](); | ||
delete ws.graffyStreams[id]; | ||
return _context.abrupt("break", 66); | ||
case 66: | ||
_context.next = 71; | ||
break; | ||
case 68: | ||
_context.prev = 68; | ||
_context.t4 = _context["catch"](0); | ||
ws.close(); | ||
case 71: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[0, 68], [8, 15], [19, 57], [24, 41, 45, 55], [46,, 50, 54]]); | ||
})); | ||
function message(_x) { | ||
return _message.apply(this, arguments); | ||
case 'unwatch': | ||
if (!ws.graffyStreams[id]) break; | ||
ws.graffyStreams[id].return(); | ||
delete ws.graffyStreams[id]; | ||
break; | ||
} | ||
} catch (_) { | ||
ws.close(); | ||
} | ||
return message; | ||
}()); | ||
ws.on('close', function () { | ||
for (var id in ws.graffyStreams) { | ||
ws.graffyStreams[id]["return"](); | ||
}); | ||
ws.on('close', () => { | ||
for (const id in ws.graffyStreams) { | ||
ws.graffyStreams[id].return(); | ||
delete ws.graffyStreams[id]; | ||
@@ -213,35 +86,18 @@ } | ||
}); | ||
(0, _setInterval2["default"])(function ping() { | ||
var _context2; | ||
(0, _setInterval2.default)(function ping() { | ||
var _context; | ||
(0, _forEach["default"])(_context2 = wss.clients).call(_context2, function each(ws) { | ||
(0, _forEach.default)(_context = wss.clients).call(_context, function each(ws) { | ||
if (ws.pingPending) return ws.terminate(); | ||
ws.pingPending = true; | ||
ws.send((0, _common.serialize)([':ping', (0, _now["default"])()])); | ||
ws.send((0, _common.serialize)([':ping', (0, _now.default)()])); | ||
}); | ||
}, PING_INTERVAL); | ||
return /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, socket, head) { | ||
return _regenerator["default"].wrap(function _callee2$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
wss.handleUpgrade(request, socket, head, function done(ws) { | ||
wss.emit('connection', ws, request); | ||
}); | ||
case 1: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return function (_x2, _x3, _x4) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
return async (request, socket, head) => { | ||
wss.handleUpgrade(request, socket, head, function done(ws) { | ||
wss.emit('connection', ws, request); | ||
}); | ||
}; | ||
} | ||
module.exports = exports.default; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
11566
-49.01%293
-47.86%1
Infinity%