UNPKG

grpc-server-ts

Version:

a grpc server side module built by typescrpt

171 lines 6.44 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * @author Xuezi * @email xzj15859722542@hotmail.com * @create date 2018-06-14 06:11:20 * @modify date 2018-06-14 06:11:20 * @desc [description] */ const GRPC = require("grpc"); const protoLoader = require("@grpc/proto-loader"); class ServiceContainer { /** * @description registry grpc service * @author Xuezi * @static * @param {Function} target service constructor * @param {string} path proto file path * @memberof ServiceContainer */ static registryService(target, path) { let packageDefinition = protoLoader.loadSync(path, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true }); let protoDescriptor = GRPC.loadPackageDefinition(packageDefinition); const packages = Object.keys(protoDescriptor); for (let packageKey of packages) { for (let key in protoDescriptor[packageKey]) { this._setServiceClient(protoDescriptor[packageKey][key], target); // if (protoDescriptor[packageKey][key].hasOwnProperty('service')) { // this.services.push({ service: protoDescriptor[packageKey][key]['service'], target }); // } } } } static _setServiceClient(service, target) { if (!service) { return; } if (service.name === 'ServiceClient') { this.services.push({ service: service['service'], target }); } else { for (const key in service) { this._setServiceClient(service[key], target); } } } static registryRoute(target, route) { if (this.routes.find(r => (r.target === target && r.route === route))) { return; } this.routes.push({ target, route }); } static generateRouteFunc(...args) { return this._generateRouteFunc.apply(this, args); } static _generateRouteFunc(service, route) { let key = route.name; let rawFunc = service[key]; let { requestStream, responseStream } = rawFunc; let func; if (requestStream && responseStream) { // requestStream: true // responseStream: true func = function (call) { return __awaiter(this, void 0, void 0, function* () { call.on('data', function (chunk) { return __awaiter(this, void 0, void 0, function* () { try { let result = yield route(chunk); call.write(result); } catch (e) { call.emit('error', e); } }); }); call.on('error', error => { console.error(error); }); call.on('end', () => { call.end && call.end(); }); }); }; } else if (requestStream && !responseStream) { // requestStream: true // responseStream: false func = function (call) { return __awaiter(this, arguments, void 0, function* () { let callback = arguments[1]; call.on('data', (chunk) => __awaiter(this, void 0, void 0, function* () { try { let result = yield route(chunk); callback(null, result); } catch (e) { callback(e); } })); call.on('error', error => { console.error(error); }); call.on('end', () => { call.end && call.end(); }); }); }; } else if (!requestStream && responseStream) { // requestStream: false // responseStream: true func = function (call) { return __awaiter(this, void 0, void 0, function* () { try { let result = yield route(call.request); call.write(result); } catch (e) { call.emit('error', e); } call.on('error', error => { console.error(error); }); call.on('end', () => { call.end && call.end(); }); }); }; } else { // requestStream: false // responseStream: false func = function (call) { return __awaiter(this, arguments, void 0, function* () { let callback = arguments[1]; try { let result = yield route(call.request); callback(null, result); } catch (e) { callback(e); } }); }; } return func; } static getService(target) { let services = this.services.filter(service => service.target === target); return services; } } ServiceContainer.services = []; ServiceContainer.routes = []; exports.ServiceContainer = ServiceContainer; //# sourceMappingURL=ServiceContainer.js.map