@nanobot248/rxstack-express-http2-server
v0.1.1
Published
RxStack express server module supporting http2 (via spdy)
Readme
RxStack express server module with HTTP2 support
The ExpressServer module integrates expressjs in rxstack framework
and uses spdy for HTTP2 support.
Based on the express-server moudule of the RxStack project.
Tests have not yet been adapted as the originally used request-promise package is deprecated.
Installation
npm install @nanobot248/rxstack-express-http2-server --save
// peerDependencies
npm install @rxstack/async-event-dispatcher@^0.5 @rxstack/core@^0.6 @rxstack/exceptions@^0.5 winston@^3.2.1Documentation
Setup
ExpressHttp2Server module needs to be registered in the application. Let's create the application:
import {Application, ApplicationOptions} from '@rxstack/core';
import {ExpressHttp2Module} from '@nanobot248/rxstack-express-http2-server';
export const EXPRESS_APP_OPTIONS: ApplicationOptions = {
imports: [
ExpressHttp2Module.configure({
'host': 'localhost',
'port': 3000,
'prefix': '/api',
'http2': true,
'http': true,
'tlsCertificateFile': './path/to/certificate.pem',
'tlsKeyFile': './path/to/key.pem'
})
],
servers: ['express-http2'], //enables the server
providers: [
// ...
]
};
new Application(EXPRESS_APP_OPTIONS).start();Module Options
The module accepts the following options:
host: the server host, ex:127.0.0.1or0.0.0.0(for docker). By default is set tolocalhostport: the server port. By default is set to3000prefix: the prefix for each route, ex: '/api/products. By default is set tonullhttp2: activate HTTP2 (and HTTP 1.1) support.tlsCertificateFileandtlsKeyFileare required in this case as only secure HTTP2/HTTP1.1 over TLS are supported.https: ifhttp2is false, only HTTP 1.1 will be made available over TLS (aka HTTPS). If neitherhttp2norhttpsare true, a simple HTTP 1.1 server without TLS will be created.tlsCertificateFile: the path of the PEM formatted certificate file.tlsKeyFile: the path of the PEM formatted key file.
Express Options
In order to configure expressjs application you need to listen to ServerEvents.CONFIGURE.
import {ServerEvents, ServerConfigurationEvent, InjectorAwareInterface} from '@rxstack/core';
import {ExpressHttp2Server} from '@rxstack/express-http2-server';
import {Observe} from '@rxstack/async-event-dispatcher';
import {Injectable, Injector} from 'injection-js';
import {Application} from 'express';
@Injectable()
export class ConfigurationListener implements InjectorAwareInterface {
private injector: Injector;
setInjector(injector: Injector): void {
this.injector = injector;
}
@Observe(ServerEvents.CONFIGURE)
async onConfigure(event: ServerConfigurationEvent): Promise<void> {
if (event.server.getName() !== ExpressHttp2Server.serverName) {
return;
}
const app: Application = event.server.getEngine();
// register any express middleware
}
}Express Middleware
In addition to rxstack controllers you can register express middleware to you application.
Important: If response is sent then native express middleware will bypass
kernel.
import {
Request as ExpressRequest, Response as ExpressResponse,
NextFunction, RequestHandler
} from 'express';
import {Injector} from 'injection-js';
export function myCustomExpressMiddleware(injector: Injector): RequestHandler {
return (request: ExpressRequest, response: ExpressResponse, next: NextFunction): void => {
response.json({'id': 'express'});
};
}You need to register myCustomExpressMiddleware in the express application by using ConfigurationListener.
/// ...
const app: Application;
app.get('/my-custom-express-middleware', expressMiddleware(this.injector));You need to register the listener in the application providers
You can get any of the registered services from injector.
License
Licensed under the MIT license.
