JSON-RPC 2.0 协议的JavaScript实现
- 弱化client/server,任何一端都可以主动发出
request
和notification
- 报文运输层(Transport)可插拔
浏览器 <- WebSocket -> 服务端
Renderer Progress <- WebSocket/IPC -> Main Progress
npm i jsonrpcv2
import { WebSocketServer } from 'ws';
import { RPC } from 'jsonrpcv2';
const serverRPC = new RPC();
// 注册同步方法
serverRPC.expose('syncMethod', () => {
return 'syncMethod.result';
});
// 注册异步方法
serverRPC.expose('asyncMethod', () => {
return Promise.resolve('asyncMethod.result');
});
const wss = new WebSocketServer({
port: 2188
});
wss.on('connection', (websocket) => {
// rpc通过websocket发送消息
serverRPC.setTransmitter((message) => {
websocket.send(message);
});
// websocket接受到消息转发给rpc
websocket.on('message', (message) => {
serverRPC.receive(Buffer.from(message).toString());
});
});
import { RPC } from 'jsonrpcv2';
const clientRPC = new RPC();
const ws = new WebSocket('localhost:2188');
ws.onopen = function () {
// 调用服务端syncMethod方法
clientRPC.invoke('syncMethod')
.then((result) => {
console.log(result); // syncMethod.result
})
.catch((error) => {
// error
});
// 调用服务端 asyncMethod 方法
clientRPC.invoke('asyncMethod')
.then((result) => {
console.log(result); // asyncMethod.result
})
.catch((error) => {
// error
})
}
import { RPC } from 'jsonrpcv2'
const rpc = new RPC();
接收的对端RPC报文,具体如何来,取决于你的transmitter
message
{string
} JSON RPC报文
发送到RPC报文到对端,报文如何发送到对端,取决于你的transmitter
transmitter
{(message:string)=>Promise
} 发送通道
暴露方法,供对端调用
methodName
{string
} 暴露的方法名称method
{Function
} 方法实例
取消已暴露的方法
methodName
{string
} 已暴露的方法名称
调用对端方法
methodName
{string
} 方法名称args
{Array
} 参数return
{Promise<Result>
}
添加通知监听
name
{string
} 通知名称callback
{Function
} 通知回调
通知对端
name
{string
} 通知名称args
{Array
} 参数
删除通知监听
name
{string
} 通知名称callback
{Function
} 通知回调