UNPKG

@infect/rda-service

Version:
146 lines (97 loc) 3.71 kB
import HTTP2Server from '@distributed-systems/http2-server'; import logd from 'logd'; import PortFinder from 'get-available-port'; const log = logd.module('Server'); export default class Server { constructor({ serviceName, allowCors, } = {}) { this.serviceName = serviceName; this.server = new HTTP2Server({ secure: false, }); this.allowCors = allowCors; // add middlewares this.addMiddlewares(); // get port from args const portConfig = process.argv.find(item => item.startsWith('--port=')); this.port = portConfig ? parseInt(portConfig.substr(7), 10) : false; this.portFinder = new PortFinder(); } /** * register middlewares on the server */ addMiddlewares() { // set the service name on the response if (this.serviceName) { this.server.registerMiddleware(async (request) => { request.response().setHeader('x-rda-service', this.serviceName); }); } // add english as default language this.server.registerMiddleware(async (request) => { if (request.hasHeader('accept-language')) { request.setHeader('accept-language', request.getHeader('accept-language') + ',en; q=.1'); } else { request.setHeader('accept-language', 'en; q=.1'); } }); // cors this.server.registerMiddleware(async (request) => { const headers = []; if (this.allowCors === true) { headers.push(['Access-Control-Allow-Origin', request.getHeader('origin') || '*']); if (request.method('options')) { headers.push(['Access-Control-Allow-Methods', request.getHeader('access-control-request-method') || 'GET, OPTIONS']); headers.push(['Access-Control-Allow-Headers', request.getHeader('access-control-request-headers') || '']); headers.push(['Access-Control-Allow-Credentials', request.getHeader('access-control-request-credentials') || 'true']); } } else if (this.allowCors === false) { // do nothing } else { // old questionable code headers.push(['Access-Control-Allow-Origin', request.getHeader('origin')]); headers.push(['Access-Control-Allow-Methods', 'GET, OPTIONS']); headers.push(['Access-Control-Allow-Headers', 'select, filter']); headers.push(['Access-Control-Allow-Credentials', 'true']); } request.response().setHeaders(headers); if (request.method('options')) { log.debug('Sent reponse for OPTIONS request'); request.response().status(204).send(); return false; } }); } /** * start the web server, use the port passed by the --port argv * or the port passed to the function or a random free port */ async listen(port) { this.port = this.port || port || await this.portFinder.getPort(); await this.server.listen(this.port); log.info(`Server is listening on port ${this.port}`); return this.port; } /** * shut down the server */ async close() { await this.server.close(); } /** * return the servers router * * @return {router} The router. */ getRouter() { return this.server.getRouter(); } /** * returns the express app */ getServer() { return this.server; } }