A strictly typed json-rpc(2.0) implementation, zero dependency, minimal abstraction, with simple api.
Specification https://www.jsonrpc.org/specification
For Node.js
npx jsr add @yieldray/json-rpc-ts # recommended
# or
npm install @yieldray/json-rpc-ts
For Deno
deno add @yieldray/json-rpc-ts
Example to use the client
const requestForResponse = (json: string) =>
fetch('http://localhost:6800/jsonrpc', {
method: 'POST',
body: json,
}).then((res) => res.text())
const client = new JSONRPCClient<{
'aria2.addUri': (
urls: string[],
options?: object,
position?: number,
) => string
'aria2.remove': (gid: string) => string
'system.listMethods': () => string[]
}>(requestForResponse)
const resultGid: string = await client.request('aria2.addUri', [
['https://example.net/index.html'],
{},
0,
])
Example to use the server
const server = new JSONRPCServer({
upper: (str: string) => str.toUpperCase(),
lower: (str: string) => str.toLowerCase(),
plus: ([a, b]: [number, number]) => a + b,
minus: ([a, b]: [number, number]) => a - b,
})
// or:
server.setMethod('trim', (str: string) => str.trim())
server.setMethod('trimStart', (str: string) => str.trimStart())
server.setMethod('trimEnd', (str: string) => str.trimEnd())
const httpServer = Deno.serve(
async (request) => {
// server.handleRequest() accept string and returns Promise<string>
const jsonString = await server.handleRequest(await request.text())
return new Response(jsonString, {
headers: { 'content-type': 'application/json' },
})
},
)