UNPKG

@restorecommerce/chassis-srv

Version:
171 lines 6.24 kB
"use strict"; 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