📅 You're Invited: Meet the Socket team at RSAC (April 28 – May 1).RSVP

@graffy/server

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@graffy/server - npm Package Compare versions

Comparing version

to
0.14.7-alpha.10

@@ -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"
}
}

@@ -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;