-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathindex.js
63 lines (54 loc) · 1.92 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const grpc = require("grpc");
const protoLoader = require("@grpc/proto-loader");
function getProtoFromPackageDefinition(packageDefinition, packageName) {
const pathArr = packageName.split(".");
return pathArr.reduce((obj, key) => (obj && obj[key] !== 'undefined') ? obj[key] : undefined, packageDefinition);
}
function createClient({ protoPath, packageName, serviceName, options }, address, creds=grpc.credentials.createInsecure()){
const pkgDef = grpc.loadPackageDefinition(protoLoader.loadSync(protoPath, options));
const proto = getProtoFromPackageDefinition(pkgDef, packageName);
return new proto[serviceName](address, creds);
}
function createServer(){
return new GrpcServer();
}
class GrpcServer {
constructor(){
this.server = new grpc.Server();
}
use({ protoPath, packageName, serviceName, routes, options }){
const pkgDef = grpc.loadPackageDefinition(protoLoader.loadSync(protoPath, options));
const proto = getProtoFromPackageDefinition(pkgDef, packageName);
const router = Object.entries(routes).reduce((_router, [action, handler]) => {
_router[action] = handleWhetherAsyncOrNot(handler);
return _router;
}, {});
this.server.addService(proto[serviceName].service, router);
return this;
}
listen(address, creds=grpc.ServerCredentials.createInsecure()){
this.server.bind(address, creds);
this.server.start();
return this;
}
close(force=false, cb){
if(force){
this.server.forceShutdown();
}else{
this.server.tryShutdown(cb);
}
return this;
}
}
function handleWhetherAsyncOrNot(handler){
return (call, callback) => {
const mightBePromise = handler(call, callback);
if(mightBePromise && mightBePromise.then && mightBePromise.catch){
return mightBePromise
.then((result) => callback(null, result))
.catch((err) => callback(err));
}
}
}
exports.createClient = createClient;
exports.createServer = createServer;