nice-grpc
Version:
A Node.js gRPC library that is nice to you
123 lines • 5.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createServer = createServer;
const grpc_js_1 = require("@grpc/grpc-js");
const nice_grpc_common_1 = require("nice-grpc-common");
const service_definitions_1 = require("../service-definitions");
const handleBidiStreamingCall_1 = require("./handleBidiStreamingCall");
const handleClientStreamingCall_1 = require("./handleClientStreamingCall");
const handleServerStreamingCall_1 = require("./handleServerStreamingCall");
const handleUnaryCall_1 = require("./handleUnaryCall");
/**
* Create a new server.
*
* @param options Optional channel options.
* @returns The new server.
*/
function createServer(options = {}) {
return createServerWithMiddleware(options);
}
function createServerWithMiddleware(options, middleware) {
const services = [];
let server;
function createAddBuilder(middleware) {
return {
with(newMiddleware) {
return createAddBuilder(middleware == null
? newMiddleware
: (0, nice_grpc_common_1.composeServerMiddleware)(middleware, newMiddleware));
},
add(definition, implementation) {
if (server != null) {
throw new Error('server.add() must be used before listen()');
}
services.push({
definition: (0, service_definitions_1.normalizeServiceDefinition)(definition),
middleware,
implementation,
});
},
};
}
return {
use(newMiddleware) {
if (server != null) {
throw new Error('server.use() must be used before listen()');
}
if (services.length > 0) {
throw new Error('server.use() must be used before adding any services');
}
return createServerWithMiddleware(options, middleware == null
? newMiddleware
: (0, nice_grpc_common_1.composeServerMiddleware)(middleware, newMiddleware));
},
...createAddBuilder(middleware),
async listen(address, credentials) {
if (server != null) {
throw new Error('server.listen() has already been called');
}
server = new grpc_js_1.Server(options);
for (const { definition, middleware, implementation } of services) {
const grpcImplementation = {};
for (const [methodName, methodDefinition] of Object.entries(definition)) {
const methodImplementation = implementation[methodName].bind(implementation);
if (!methodDefinition.requestStream) {
if (!methodDefinition.responseStream) {
grpcImplementation[methodName] = (0, handleUnaryCall_1.createUnaryMethodHandler)(methodDefinition, methodImplementation, middleware);
}
else {
grpcImplementation[methodName] =
(0, handleServerStreamingCall_1.createServerStreamingMethodHandler)(methodDefinition, methodImplementation, middleware);
}
}
else {
if (!methodDefinition.responseStream) {
grpcImplementation[methodName] =
(0, handleClientStreamingCall_1.createClientStreamingMethodHandler)(methodDefinition, methodImplementation, middleware);
}
else {
grpcImplementation[methodName] = (0, handleBidiStreamingCall_1.createBidiStreamingMethodHandler)(methodDefinition, methodImplementation, middleware);
}
}
}
server.addService((0, service_definitions_1.toGrpcJsServiceDefinition)(definition), grpcImplementation);
}
const port = await new Promise((resolve, reject) => {
server.bindAsync(address, credentials ?? grpc_js_1.ServerCredentials.createInsecure(), (err, port) => {
if (err != null) {
server = undefined;
reject(err);
}
else {
resolve(port);
}
});
});
return port;
},
async shutdown() {
if (server == null) {
return;
}
await new Promise((resolve, reject) => {
server.tryShutdown(err => {
if (err != null) {
reject(err);
}
else {
resolve();
}
});
});
server = undefined;
},
forceShutdown() {
if (server == null) {
return;
}
server.forceShutdown();
server = undefined;
},
};
}
//# sourceMappingURL=Server.js.map