65 lines
1.6 KiB
JavaScript
65 lines
1.6 KiB
JavaScript
const grpc = require('grpc');
|
|
const protoLoader = require('@grpc/proto-loader');
|
|
|
|
const charge = require('./charge');
|
|
|
|
class HipsterShopServer {
|
|
constructor(protoFile, port = HipsterShopServer.DEFAULT_PORT) {
|
|
this.port = port;
|
|
|
|
this.server = new grpc.Server();
|
|
this.loadProto(protoFile);
|
|
}
|
|
|
|
/**
|
|
* Handler for PaymentService.Charge.
|
|
* @param {*} call { ChargeRequest }
|
|
* @param {*} callback fn(err, ChargeResponse)
|
|
*/
|
|
static ChargeServiceHandler(call, callback) {
|
|
try {
|
|
console.log(`PaymentService#Charge invoked with request ${JSON.stringify(call.request)}`)
|
|
const response = charge(call.request)
|
|
callback(null, response);
|
|
} catch (err) {
|
|
console.warn(err);
|
|
callback(err);
|
|
}
|
|
}
|
|
|
|
listen() {
|
|
this.server.bind(`0.0.0.0:${this.port}`, grpc.ServerCredentials.createInsecure());
|
|
console.log(`PaymentService grpc server listening on ${this.port}`);
|
|
this.server.start();
|
|
}
|
|
|
|
loadProto(path) {
|
|
const packageDefinition = protoLoader.loadSync(
|
|
path,
|
|
{
|
|
keepCase: true,
|
|
longs: String,
|
|
enums: String,
|
|
defaults: true,
|
|
oneofs: true,
|
|
},
|
|
);
|
|
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
|
|
const hipsterShopPackage = protoDescriptor.hipstershop;
|
|
|
|
this.addProtoService(hipsterShopPackage.PaymentService.service);
|
|
}
|
|
|
|
addProtoService(service) {
|
|
this.server.addService(
|
|
service,
|
|
{
|
|
charge: HipsterShopServer.ChargeServiceHandler.bind(this),
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
HipsterShopServer.DEFAULT_PORT = 50051;
|
|
|
|
module.exports = HipsterShopServer;
|