gRPC Pack

Simpler use of grpc in Node.js.
Install
$ npm install grpc-pack or yarn add grpc-pack
Usage
Single Proto
Server
const { createServer } = require('grpc-pack');
const server = createServer();
server.use({
protoPath: 'path/to/directory_proto',
protoName: 'greeter.proto',
serviceName: 'Greeter',
routes: {
hello: (call, callback) => {
callback(null, { message: `Hello, ${call.request.name}` });
},
},
});
server.listen('0.0.0.0:6969');
Client
const { createClient } = require('grpc-pack');
const client = createClient(
{
protoPath: 'path/to/directory_proto',
protoName: 'greeter.proto',
serviceName: 'Greeter',
},
'0.0.0.0:6969'
);
client.hello({ name: 'Seorang Eksa' }, (err, { message }) => {
if(err) throw err;
console.log(message);
});
Separate Proto Model and Service
-
Service
syntax="proto3";
package service;
option go_package = "github.com/zoobc/zoobc-core/common/service";
import "model/block.proto";
import "google/api/annotations.proto";
// BlockService represent request on Blockchain's Block
service BlockService {
rpc GetBlocks(model.GetBlocksRequest) returns (model.GetBlocksResponse) {
option (google.api.http) = {
get: "/v1/block/GetBlocks"
};
}
}
-
Model
// Block represent the block data structure stored in the database
message Block {
int64 ID = 1 [ jstype = JS_STRING ];
uint32 Height = 2;
string CumulativeDifficulty = 3;
int64 TotalCoinBase = 4 [ jstype = JS_STRING ];
uint32 Version = 5;
}
// BlockExtendedInfo represent the Block data plus part of block data not to be persisted to database
message BlockExtendedInfo {
Block Block = 1;
}
// GetBlocksRequest create request to get a list block
message GetBlocksRequest {
// Fetch block from `n` height
uint32 Height = 1;
}
message GetBlocksResponse {
// Number of block returned
uint32 Count = 1;
// Blocks height returned from
uint32 Height = 2;
// Blocks returned
repeated Block Blocks = 3;
}
Server
const { createServer } = require('grpc-pack');
const server = createServer();
const mockup = [
{
ID: '1',
Height: 1,
CumulativeDifficulty: 'Test 1',
TotalCoinBase: 10000,
Version: 1,
},
{
ID: '2',
Height: 2,
CumulativeDifficulty: 'Test 2',
TotalCoinBase: 20000,
Version: 1,
},
{
ID: '3',
Height: 2,
CumulativeDifficulty: 'Test 3',
TotalCoinBase: 30000,
Version: 1,
},
];
server.use({
protoPath: 'path/to/directory_proto',
protoName: 'block.proto',
servicePath: 'service',
serviceName: 'BlockService',
routes: {
GetBlocks: (call, callback) => {
const Height = call.request.Height;
const Blocks = Height > 0 ? mockup.filter(f => f.Height === Height) : mockup;
const Count = Blocks.length;
const GetBlocksResponse = {
Count,
Height,
Blocks,
};
callback(null, GetBlocksResponse);
},
},
});
server.listen('0.0.0.0:6969');
Client
const { createClient } = require('grpc-pack');
const client = createClient(
{
protoPath: 'path/to/directory_proto',
protoName: 'block.proto',
servicePath: 'service',
serviceName: 'BlockService',
},
'0.0.0.0:6969'
);
const params = { Height: 1 };
client.GetBlocks(params, (err, res) => {
if(err) throw err;
console.log(res);
});
License
This project is licensed under the MIT License - see the LICENSE file for details