@infect/rda-service
Version:
Microservice Framework for RDA
146 lines (97 loc) • 3.71 kB
JavaScript
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;
}
}