1.0.0 • Published 3 years ago

jsn6-grpc v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

jsn6-grpc

gRPC server

Example

import { Startup } from 'jsn6-core/dist/core/Startup'
import { GRPCServer } from 'jsn6-grpc'

@Startup('gRPCServer.start')
export class MyGRPCServer extends GRPCServer {
  constructor() {
    super(config.grpcPort, config.host, {
      proto: __dirname + '/proto/user.proto',
      package: 'user',
    })
  }

  async onInit() {
    await this.loadFunctions()

    await Promise.all([
      redis.connect(),
      mongo.connect(),
      rabbit.connect(),
    ])

    rabbit.publish('test-exchange', 'test', 'Hello world')

    return super.onInit()
  }

  async isAvailable() {
    await Promise.all([
      redis.check(),
      mongo.check(),
      rabbit.check(),
    ])
  }

  async onDispose() {
    await Promise.all([
      redis.disconnect(),
      mongo.disconnect(),
      rabbit.disconnect(),
    ])
  }

  private async loadFunctions() {
    console.log('Loading functions...')
    await Promise.all([
      import('@/controllers/grpc/UserController')
    ])
  }
}
  • @/controllers/grpc/UserController.ts file
import { Context, GRPCUnary } from 'jsn6-grpc'

export class UserController {
    @GRPCUnary(
        'User.getInfo',
        (ctx, next) => {
            const inputData = ctx.request
            // Check something here
            return next()
        }
    )
    static getInfo(ctx: Context) {
        ctx.body = {
            data: 'Hello you'
        }
    }
}
  • /proto/user.proto file
syntax = "proto3";

package user;

message RequestGetUserDetails {
  int32 userID = 1;
}

message UserInfo {
  optional int32 id = 1;
  optional string name = 2;
}

message Links {
  optional string next = 1;
  optional string prev = 2;
}

message ResponseGetUserDetails {
  optional int32 code = 1;
  optional Links links = 2;
  optional UserInfo data = 3;
}

service User {
  rpc getInfo(RequestGetUserDetails) returns (ResponseGetUserDetails) {}
}