@restorecommerce/chassis-srv
Version:
Restore Commerce microservice chassis
171 lines • 6.24 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Server = exports.registerTransport = void 0;
const logger_1 = require("@restorecommerce/logger");
const _ = __importStar(require("lodash"));
const events_1 = require("events");
const grpc_1 = require("./transport/provider/grpc");
const transports = {};
/**
* register transport provider
*
* @param {string} name transport provider identifier
* @param {constructor} provider transport provider constructor function
*/
const registerTransport = (name, provider) => {
transports[name] = provider;
};
exports.registerTransport = registerTransport;
// register included providers
(0, exports.registerTransport)('grpc', grpc_1.grpcServer);
/**
* Initializes all configured transports.
* @param {object} config Configuration
* @param {object} logger
* @return {object} Transport
*/
const setupTransport = (config, logger) => {
const transport = {};
logger.debug('available transport providers', Object.keys(transports).join(','));
for (let i = 0; i < config.length; i += 1) {
const transportCfg = config[i];
const providerName = transportCfg.provider;
if (_.isNil(providerName)) {
throw new Error('transport configuration without a provider');
}
const transportName = transportCfg.name;
if (_.isNil(providerName)) {
throw new Error('transport configuration without a name');
}
const TransportProvider = transports[providerName];
if (_.isNil(TransportProvider)) {
throw new Error(`transport provider ${providerName} does not exist`);
}
const provider = new TransportProvider(transportCfg, logger);
transport[transportName] = provider;
}
logger.debug('using transports', Object.keys(transport).join(','));
return transport;
};
/**
* Server is a microservice server chassis.
* It enables business logic to be accessed over transports and listen to events.
* Default event providers: 'kafka'
* Default transports: 'grpc'
* @class
*/
class Server extends events_1.EventEmitter {
/**
* @constructor
* @param {object} config Server config.
* @param {Logger} logger
*/
constructor(config, logger) {
super();
if (_.isNil(config)) {
throw new Error('mising argument config');
}
this.config = config;
// logger
if (_.isNil(logger)) {
if (_.isNil(this.config.logger)) {
this.logger = (0, logger_1.createLogger)();
}
else {
const loggerCfg = this.config.logger;
this.logger = (0, logger_1.createLogger)(loggerCfg);
}
}
else {
this.logger = logger;
}
// services
this.logger.debug('setting up service endpoints');
// transports
this.logger.debug('setting up transports');
try {
this.transport = setupTransport(this.config.transports, this.logger);
}
catch (error) {
this.logger.error('setupTransports', { code: error.code, message: error.message, stack: error.stack });
throw error;
}
}
/**
* bind connects the service to configured transports.
*
* @param {string} name Service name.
* @param {BindConfig} bindConfig A business logic service.
*/
async bind(name, bindConfig) {
if (_.isNil(name)) {
throw new Error('missing argument name');
}
if (!_.isString(name)) {
throw new Error('argument name is not of type string');
}
if (_.isNil(bindConfig)) {
throw new Error('missing argument bindConfig');
}
this.logger.debug('binding endpoints to transports');
const transportNames = Object.keys(this.transport);
const transport = this.transport;
for (let i = 0; i < transportNames.length; i += 1) {
const transportName = transportNames[i];
const provider = transport[transportName];
await provider.bind(bindConfig);
this.emit('bound', name, bindConfig, provider);
}
}
/**
* start launches the server by starting transports and listening to events.
*/
async start() {
const transportNames = Object.keys(this.transport);
for (let i = 0; i < transportNames.length; i += 1) {
const name = transportNames[i];
const provider = this.transport[name];
await provider.start();
this.logger.info(`transport ${name} started`);
}
this.emit('serving', this.transport);
}
/**
* Shuts down all transport provider servers.
*/
async stop() {
const transportNames = _.keys(this.transport);
for (let i = 0; i < transportNames.length; i += 1) {
const name = transportNames[i];
if (this.transport[name].end) {
await this.transport[name].end();
}
}
this.emit('stopped', this.transport);
}
}
exports.Server = Server;
//# sourceMappingURL=server.js.map