Simpler use of grpc in Node.js
npm install grpc-pack




Simpler use of grpc in Node.js.
``bash`
$ npm install grpc-pack or yarn add grpc-pack
- Model and Service
`bash
syntax = "proto3";
package service;
service Greeter {
rpc Hello (Name) returns (Message) {}
}
message Name {
string name = 1;
}
message Message {
string message = 1;
}
`
`bash
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');
`
`bash
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);
});
`
- Service
`bash
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
`bash
// 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;
}
`
`bash
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');
`
`bash
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);
});
``
This project is licensed under the MIT License - see the LICENSE file for details