UNPKG

@graffy/server

Version:

Node.js library for building an API for a Graffy store.

302 lines (230 loc) 9.04 kB
"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;