grpc-server-ts
Version:
a grpc server side module built by typescrpt
97 lines (80 loc) • 2.48 kB
text/typescript
import * as GRPC from 'grpc';
import * as FS from 'fs';
import { ServiceContainer } from './ServiceContainer';
import { SettingRegistry } from './SettingRegistry';
export class RpcRegistry {
private static _port: number | string;
private static _host: string;
private static _ca: string;
private static _cert: string;
private static _key: string;
private static _credentials: GRPC.ServerCredentials;
static get port(): string | number {
return this._port;
}
static get host(): string {
return this._host;
}
static get ca(): string {
return this._ca;
}
static get cert(): string {
return this._cert;
}
static get key(): string {
return this._key;
}
private static _server: GRPC.Server = new GRPC.Server();
static get server() {
return this._server;
}
static start() {
this._loadSettings();
this._registryService();
this._addTls();
this._start();
}
private static _start() {
let address = `${this.host}:${this.port}`;
this.server.bind(address, this._credentials);
this.server.start();
}
private static _loadSettings() {
let { port, host, ca, cert, key } = SettingRegistry.settings;
this._port = port;
this._host = host || '127.0.0.1';
this._ca = ca;
this._cert = cert;
this._key = key;
}
private static _registryService() {
for (let serviceContainer of ServiceContainer.services) {
let rpc: { [x: string]: Function } = {};
for (let key in serviceContainer.service) {
let route = serviceContainer.target.prototype[key];
if (route) {
let routeContainer = ServiceContainer.routes.find(r => {
return (r.target.constructor === serviceContainer.target && route === r.route);
});
let _func = ServiceContainer.generateRouteFunc(serviceContainer.service, route);
routeContainer.func = _func;
rpc[key] = routeContainer.func;
}
}
this.server.addService(serviceContainer.service, rpc);
}
}
private static _addTls() {
if (!this.ca || !this.cert || !this.key) {
this._credentials = GRPC.ServerCredentials.createInsecure();
} else {
let ca = FS.readFileSync(this.ca);
let cert = FS.readFileSync(this.cert);
let key = FS.readFileSync(this.key);
this._credentials = GRPC.ServerCredentials.createSsl(ca, [{
cert_chain: cert,
private_key: key
}], true);
}
}
}