JSON-RPC server for NestJs
npm install @klerick/nestjs-json-rpcThis plugin allow to create RPC server using JSON-RPC 2.0 Specification.
Now, You can use HTTP or WebSocket as transport protocol.
``bash `
$ npm install @klerick/nestjs-json-rpc Example
Once the installation process is complete, we can import the NestjsJsonRpcModule into the root AppModule.
`typescript
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
`typescript
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
`typescript
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.
`typescript
import {Module} from '@nestjs/common';
import {
NestjsJsonRpcModule,
TransportType,
RpcHandler,
RpcParamsPipe,
createErrorCustomError,
} from '@klerick/nestjs-json-rpc';
@RpcHandler()
export class RpcService {
methodeWithObjectParams(a: InputType): Promise
return Promise.resolve({
d: ${a.a},${a.b}
c: ,
});
}
someMethode(@RpcParamsPipe(ParseIntPipe) firstArg: number): Promise
if (firstArg === 5) throw createErrorCustomError(-32099, 'Custom Error');
return Promise.resolve(firstArg);
}
someOtherMethode(firstArg: number, secondArgument: number): Promise
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
`json`
{"jsonrpc": "2.0", "method": "RpcService.methodeWithObjectParams", "params": {"a": 23}, "id": 1}
or RPC call Batch
`json``
[
{"jsonrpc": "2.0", "method": "RpcService.methodeWithObjectParams", "params": {"a": 23}, "id": 1},
{"jsonrpc": "2.0", "method": "RpcService.someOtherMethode", "params": [1, 2], "id": 2}
]