grpc-server-ts
Version:
a grpc server side module built by typescrpt
171 lines • 6.44 kB
JavaScript
;
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