@graffy/server
Version:
Node.js library for building an API for a Graffy store.
302 lines (230 loc) • 9.04 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
exports.__esModule = true;
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"));
var _common = require("@graffy/common");
function server(store) {
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 _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));
if (!(req.method === 'GET')) {
_context.next = 67;
break;
}
_context.prev = 4;
if (!(req.headers['accept'] === 'text/event-stream')) {
_context.next = 53;
break;
}
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:
res.write("data: " + (0, _common.serialize)(value) + "\n\n");
case 26:
_iteratorNormalCompletion = true;
_context.next = 14;
break;
case 29:
_context.next = 35;
break;
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);
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);
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);
};
}();
} // TODO: Write tests!
module.exports = exports.default;