项目作者: eddran

项目描述 :
Batteries included grpc server for NodeJS. Supports middleware, interceptor and error handling.
高级语言: TypeScript
项目地址: git://github.com/eddran/sipahi.git
创建时间: 2020-08-30T13:45:07Z
项目社区:https://github.com/eddran/sipahi

开源协议:MIT License

下载


What is Sipahi

Batteries included grpc server for NodeJS. Supports middleware, error handling and logging.

All codebase is 200 lines of code. Simple & flexible best for microservices.

Updates:

  • Added grpc client
  • Removed onResponse middleware
  • Pretty log format for development

Features

  • Promise Based Server & Client
  • Request Middleware
  • Error handling
  • Built in logging (pino)
  • Multiple proto files
  • Pure javascript using @grpc/grpc-js">grpc-js as server
  • Built with Typescript

Installation

  1. npm install sipahi
  2. or
  3. yarn add sipahi

Quickstart

  1. /**
  2. * Create Grpc Server
  3. */
  4. import { Sipahi, Client } from "sipahi";
  5. const server = new Sipahi();
  6. // Add proto file
  7. server.addProto(__dirname + "/proto/hello.proto", "hello");
  8. // Add method
  9. server.use("Hello", async ({ request, logger }) => {
  10. logger.info('Log in here')
  11. return { message: 'Hello you bro! ' + request.name };
  12. });
  13. // Listen errors
  14. server.addHook("onError", async ({ error, logger }) => {
  15. logger.error(error.message);
  16. });
  17. // Start server
  18. await server.listen({ host: "0.0.0.0", port: 3012 });
  19. /**
  20. * Create Grpc Client
  21. */
  22. const client = new Client({ proto: __dirname + "/proto/hello.proto", package: "hello", service: "HelloService", host: "0.0.0.0", port: 3012 });
  23. // Make unary call to server
  24. await client.unary("Hello", { name: 'Hello there!' });

Add service

You can add multiple proto files by calling addProto multiple times.

Example:

  1. // server.addProto('proto path', 'package name');
  2. server.addProto(__dirname + "/proto/product.service.proto", "catalog_product");
  3. server.addProto(__dirname + "/proto/order.service.proto", "catalog_order");

Add Methods

You need to define your methods in async function.

Example:

  1. server.use("GetProducts", async ({ request, logger, metadata }) => {
  2. return { products: [{ id: 1, title: "Sample product name" }] };
  3. });
  4. or
  5. import { UnaryCall } from 'sipahi'
  6. async function getProducts({ request, logger, metadata }: UnaryCall) {
  7. return { products: [{ id: 1, title: "Sample product name" }] };
  8. }
  9. server.use("GetProducts", getProducts);

Middleware

You can modify requests by using middleware. To add middleware use addHook method.

There are 2 types of middeware.

  1. -> onRequest
  2. -> onError

Example 1: Change request data before execution method

  1. server.addHook("onRequest", async ({ metadata, request, logger }) => {
  2. request.user_id = 12;
  3. });

Example 2: Catch errors

  1. server.addHook("onError", async ({ method, error, logger }) => {
  2. logger.error("Method: ", method);
  3. logger.error("Error Message: ", error.message);
  4. logger.error("Error Stack: ", error.stack);
  5. });

Return Error

Sipahi includes error helper to throw error inside methods.

  1. import { error, status } from 'sipahi'
  2. // Define sample method
  3. server.use("GetProducts", async () => {
  4. return Promise.reject(error('something gonna wrong', status.ALREADY_EXISTS))
  5. });

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT