UNPKG

rxdb-server

Version:
120 lines 3.19 kB
import express from 'express'; import expressCors from 'cors'; import { ensureNotFalsy, getFromMapOrThrow } from 'rxdb/plugins/core'; export var HTTP_SERVER_BY_EXPRESS = new WeakMap(); export var RxServerAdapterExpress = { async create() { var app = express(); app.use(express.json()); return app; }, setCors(serverApp, path, cors) { serverApp.use('/' + path + '/*splat', expressCors({ origin: cors, // some legacy browsers (IE11, various SmartTVs) choke on 204 optionsSuccessStatus: 200, credentials: true })); }, getRequestBody(req) { return req.body; }, getRequestHeaders(req) { return req.headers; }, getRequestQuery(req) { return req.query; }, onRequestClose(req, fn) { req.on('close', () => { fn(); }); }, setResponseHeader(res, k, v) { res.setHeader(k, v); }, responseWrite(res, data) { res.write(data); }, endResponseJson(res, data) { res.json(data); }, endResponse(res) { res.end(); }, async closeConnection(response, code, message) { var responseWrite = { code, error: true, message }; response.status(code); response.set("Connection", "close"); await response.write(JSON.stringify(responseWrite)); response.end(); }, setSSEHeaders(res) { res.writeHead(200, { /** * Use exact these headers to make is less likely * for people to have problems. * @link https://www.youtube.com/watch?v=0PcMuYGJPzM */ 'Content-Type': 'text/event-stream; charset=utf-8', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', /** * @link https://github.com/pubkey/rxdb-server/pull/58 */ 'access-control-allow-credentials': 'true', /** * Required for nginx * @link https://stackoverflow.com/q/61029079/3443137 */ 'X-Accel-Buffering': 'no' }); res.flushHeaders(); }, get(serverApp, path, handler) { serverApp.get(path, handler); }, post(serverApp, path, handler) { serverApp.post(path, handler); }, all(serverApp, path, handler) { serverApp.all(path, handler); }, async listen(serverApp, port, hostname) { var httpServer = await new Promise((res, rej) => { var ret = ensureNotFalsy(serverApp).listen(port, hostname, () => { res(ret); }); }); HTTP_SERVER_BY_EXPRESS.set(serverApp, httpServer); }, async close(serverApp) { var httpServer = getFromMapOrThrow(HTTP_SERVER_BY_EXPRESS, serverApp); await new Promise((res, rej) => { httpServer.close(err => { if (err) { rej(err); } else { res(); } }); /** * By default it will await all ongoing connections * before it closes. So we have to close it directly. * @link https://stackoverflow.com/a/36830072/3443137 */ setImmediate(() => httpServer.emit('close')); }); }, async closeAllConnections(serverApp) { var httpServer = HTTP_SERVER_BY_EXPRESS.get(serverApp); if (httpServer) { await httpServer.closeAllConnections(); } } }; //# sourceMappingURL=index.js.map