Skip to content

Commit 263bc2c

Browse files
committed
rename MethodSet to Methods & 100% cov
1 parent 6d498ee commit 263bc2c

9 files changed

+250
-175
lines changed

README.md

+29-66
Original file line numberDiff line numberDiff line change
@@ -8,92 +8,55 @@ A strictly typed json-rpc(2.0) implementation, zero dependency, minimal abstract
88

99
> Specification <https://www.jsonrpc.org/specification>
1010
11-
```ts
12-
const methodSet = {
13-
upper: (str: string) => str.toUpperCase(),
14-
lower: (str: string) => str.toLowerCase(),
15-
plus: ([a, b]: [number, number]) => a + b,
16-
minus: ([a, b]: [number, number]) => a - b,
17-
}
18-
19-
// initialize all methods with the constructor
20-
const server = new JSONRPCServer(methodSet)
21-
22-
// or add methods manually
23-
const server = new JSONRPCServer<typeof methodSet>()
24-
server.setMethod('upper', methodSet.upper)
25-
server.setMethod('lower', methodSet.lower)
26-
server.setMethod('plus', methodSet.plus)
27-
server.setMethod('minus', methodSet.minus)
28-
29-
// (optional) provide a generic parameter to enable ts check
30-
const client = new JSONRPCClient<typeof methodSet>((json) =>
31-
server.process(json)
32-
)
33-
34-
// request, Notification and batch are always async
35-
assertEquals(await client.request('upper', 'hello'), 'HELLO')
36-
37-
assertEquals(
38-
await client.batch(
39-
client.createRequest('upper', 'nihao'),
40-
// Notification does not have response, even when response errors
41-
client.createNotification('upper'),
42-
client.createRequest('upper', 'shijie'),
43-
client.createRequest('plus', [1, 1]),
44-
),
45-
[
46-
{
47-
status: 'fulfilled',
48-
value: 'NIHAO',
49-
},
50-
{
51-
status: 'fulfilled',
52-
value: 'SHIJIE',
53-
},
54-
{
55-
status: 'fulfilled',
56-
value: 2,
57-
},
58-
],
59-
)
60-
```
61-
6211
Example to use the client
6312

6413
```ts
65-
const client = new JSONRPCClient((json) =>
14+
const requestForResponse = (json: string) =>
6615
fetch('http://localhost:6800/jsonrpc', {
6716
method: 'POST',
6817
body: json,
6918
}).then((res) => res.text())
70-
)
7119

72-
const aria2cMethods = await client.request('system.listMethods')
20+
const client = new JSONRPCClient<{
21+
'aria2.addUri': (
22+
urls: string[],
23+
options?: object,
24+
position?: number,
25+
) => string
26+
'aria2.remove': (gid: string) => string
27+
'system.listMethods': () => string[]
28+
}>(requestForResponse)
29+
30+
const resultGid: string = await client.request('aria2.addUri', [
31+
['https://example.net/index.html'],
32+
{},
33+
0,
34+
])
7335
```
7436

7537
Example to use the server
7638

7739
```ts
78-
const server = new JSONRPCServer()
40+
const server = new JSONRPCServer({
41+
upper: (str: string) => str.toUpperCase(),
42+
lower: (str: string) => str.toLowerCase(),
43+
plus: ([a, b]: [number, number]) => a + b,
44+
minus: ([a, b]: [number, number]) => a - b,
45+
})
7946

47+
// or:
8048
server.setMethod('trim', (str: string) => str.trim())
8149
server.setMethod('trimStart', (str: string) => str.trimStart())
8250
server.setMethod('trimEnd', (str: string) => str.trimEnd())
8351

8452
const httpServer = Deno.serve(
8553
async (request) => {
86-
const url = new URL(request.url)
87-
if (url.pathname === '/jsonrpc') {
88-
return new Response(
89-
// server.process() accept string and returns Promise<string>
90-
await server.process(await request.text()),
91-
{
92-
headers: { 'content-type': 'application/json' },
93-
},
94-
)
95-
}
96-
return new Response('404', { status: 404 })
54+
// server.handleRequest() accept string and returns Promise<string>
55+
const jsonString = await server.handleRequest(await request.text())
56+
57+
return new Response(jsonString, {
58+
headers: { 'content-type': 'application/json' },
59+
})
9760
},
9861
)
9962
```

deno.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"noImplicitOverride": true
66
},
77
"imports": {
8-
"std/": "https://deno.land/std@0.209.0/"
8+
"std/": "https://deno.land/std@0.213.0/"
99
},
1010
"tasks": {
1111
"lint": "deno lint",

deno.lock

+33-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/client.test.ts

+41
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,47 @@ Deno.test('client/JSONRPCClientParseError', async () => {
223223
).catch((e) => e),
224224
JSONRPCClientParseError,
225225
)
226+
227+
client = new JSONRPCClient(() =>
228+
JSON.stringify(
229+
{
230+
jsonrpc: '2.0',
231+
id: null,
232+
error: {
233+
code: 0,
234+
message: 'ERR_MSG',
235+
},
236+
},
237+
)
238+
)
239+
240+
assertEquals(
241+
await client.batch(
242+
client.createRequest('foo1'),
243+
client.createRequest('foo2'),
244+
client.createRequest('foo3'),
245+
).catch((e) => e.message),
246+
'ERR_MSG',
247+
)
248+
249+
client = new JSONRPCClient(() =>
250+
JSON.stringify(
251+
{
252+
jsonrpc: '2.0',
253+
id: null,
254+
result: 'wrong server',
255+
},
256+
)
257+
)
258+
259+
assertInstanceOf(
260+
await client.batch(
261+
client.createRequest('foo1'),
262+
client.createRequest('foo2'),
263+
client.createRequest('foo3'),
264+
).catch((e) => e),
265+
JSONRPCClientParseError,
266+
)
226267
})
227268

228269
Deno.test({

0 commit comments

Comments
 (0)