rxdb-server
Version:
RxDB Server Plugin
127 lines (126 loc) • 3.55 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RxServerAdapterExpress = exports.HTTP_SERVER_BY_EXPRESS = void 0;
var _express = _interopRequireDefault(require("express"));
var _cors = _interopRequireDefault(require("cors"));
var _core = require("rxdb/plugins/core");
var HTTP_SERVER_BY_EXPRESS = exports.HTTP_SERVER_BY_EXPRESS = new WeakMap();
var RxServerAdapterExpress = exports.RxServerAdapterExpress = {
async create() {
var app = (0, _express.default)();
app.use(_express.default.json());
return app;
},
setCors(serverApp, path, cors) {
serverApp.use('/' + path + '/*splat', (0, _cors.default)({
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 = (0, _core.ensureNotFalsy)(serverApp).listen(port, hostname, () => {
res(ret);
});
});
HTTP_SERVER_BY_EXPRESS.set(serverApp, httpServer);
},
async close(serverApp) {
var httpServer = (0, _core.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