@klerick/nestjs-json-rpc
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

NPM Version Package License NPM Downloads Commitizen friendly Coverage Badge

nestjs-json-rpc

This plugin allow to create RPC server using JSON-RPC 2.0 Specification. Now, You can use HTTP or WebSocket as transport protocol.

Installation

$ npm install @klerick/nestjs-json-rpc

Example

Once the installation process is complete, we can import the NestjsJsonRpcModule into the root AppModule.

import {Module} from '@nestjs/common';
import { NestjsJsonRpcModule, TransportType } from '@klerick/nestjs-json-rpc';

@Module({
  imports: [
    NestjsJsonRpcModule.forRoot({
      path: 'rpc',
      transport: TransportType.HTTP,
    }),
  ],
})
export class AppModule {
}

so, now you have rpc server which allow:

  • POST /rpc

If you want to use Websocket:

import {Module} from '@nestjs/common';
import { NestjsJsonRpcModule, TransportType } from '@klerick/nestjs-json-rpc';

@Module({
  imports: [
    NestjsJsonRpcModule.forRoot({
      path: 'rpc',
      wsConfig: {
        path: '/rpc',
      },
    }),
  ],
})
export class AppModule {
}

wsConfig - is GatewayMetadata from @nestjs/websockets/interfaces;

!!!!: - NestJs by default using socket.io adapter, if you want to use native WebSocket, you should use WsAdapter

import { WsAdapter } from '@nestjs/platform-ws';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app/app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useWebSocketAdapter(new WsAdapter(app));
  app.init()
  await app.listen(3000);
}

To allow service to your RPC server, you should create class and add to providers the root AppModule.

import {Module} from '@nestjs/common';
import { 
  NestjsJsonRpcModule, 
  TransportType,
  RpcHandler,
  RpcParamsPipe,
  createErrorCustomError,
} from '@klerick/nestjs-json-rpc';

@RpcHandler()
export class RpcService {
  methodeWithObjectParams(a: InputType): Promise<OutputType> {
    return Promise.resolve({
      d: `${a.a}`,
      c: `${a.b}`,
    });
  }

  someMethode(@RpcParamsPipe(ParseIntPipe) firstArg: number): Promise<number> {
    if (firstArg === 5) throw createErrorCustomError(-32099, 'Custom Error');
    return Promise.resolve(firstArg);
  }

  someOtherMethode(firstArg: number, secondArgument: number): Promise<string> {
    return Promise.resolve('');
  }
}

@Module({
  imports: [
    NestjsJsonRpcModule.forRoot({
      path: 'rpc',
      transport: TransportType.HTTP,
    }),
  ],
  providers: [RpcService],
})
export class AppModule {
}

@RpcHandler - decorator which mark class as RPC service

@RpcParamsPipe - decorator for validate input data,

After it, you can call you RPC service:

 POST /rpc
  • body - for http request
{"jsonrpc": "2.0", "method": "RpcService.methodeWithObjectParams", "params": {"a": 23}, "id": 1}

or RPC call Batch

[
  {"jsonrpc": "2.0", "method": "RpcService.methodeWithObjectParams", "params": {"a": 23}, "id": 1},
  {"jsonrpc": "2.0", "method": "RpcService.someOtherMethode", "params": [1, 2], "id": 2}
]

Readme

Keywords

Package Sidebar

Install

npm i @klerick/nestjs-json-rpc

Weekly Downloads

1

Version

1.0.0

License

MIT

Unpacked Size

79.2 kB

Total Files

98

Last publish

Collaborators

  • klerick