@hazae41/jsonrpc 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -15,4 +15,66 @@ npm i @hazae41/jsonrpc
|
|
|
15
15
|
- No external dependencies
|
|
16
16
|
- Rust-like patterns
|
|
17
17
|
- Uses `@hazae41/result`
|
|
18
|
-
- Specification compliant
|
|
18
|
+
- Specification compliant
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
### Request over HTTP
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { RpcCounter } from "@hazae41/jsonrpc"
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Assign an incremental id to a request
|
|
29
|
+
*/
|
|
30
|
+
const counter = new RpcCounter()
|
|
31
|
+
const request = counter.prepare({ method: "hello_world", params: ["hello"] })
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* JSON-stringify and send the request using your preferred transport
|
|
35
|
+
*/
|
|
36
|
+
const body = JSON.stringify(request)
|
|
37
|
+
const headers = { "Content-Type": "application/json" }
|
|
38
|
+
const res = await fetch("https://example.com", { body })
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* JSON-parse the response and unwrap it
|
|
42
|
+
*/
|
|
43
|
+
const response = RpcResponse.from<string>(await res.json()) // RpcOk<string> | RpcErr
|
|
44
|
+
const data = response.unwrap() // string
|
|
45
|
+
console.log(data) // "world"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Handle requests
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
/**
|
|
52
|
+
* Handle JSON requests and returns a JSON response
|
|
53
|
+
*/
|
|
54
|
+
function onMessage(message: string): string {
|
|
55
|
+
const request = JSON.parse(message) as RpcRequestInit<unknown>
|
|
56
|
+
const result = onRequest(request)
|
|
57
|
+
const response = RpcResponse.rewrap(request.id, result)
|
|
58
|
+
return JSON.stringify(response)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Route requests and returns a result
|
|
63
|
+
*/
|
|
64
|
+
function onRequest(request: RpcRequestPreinit<unknown>): Result<unknown, Error> {
|
|
65
|
+
if (request.method === "hello_world")
|
|
66
|
+
return onHelloWorld(request)
|
|
67
|
+
return new Err(new RpcMethodNotFoundError())
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Handle "hello_world" requests
|
|
72
|
+
*/
|
|
73
|
+
function onHelloWorld(request: RpcRequestPreinit<unknown>): Result<string, RpcInvalidParamsError> {
|
|
74
|
+
const [hello] = (request as RpcRequestInit<[string]>).params
|
|
75
|
+
|
|
76
|
+
if (hello === "hello")
|
|
77
|
+
return new Ok("world")
|
|
78
|
+
return new Err(new RpcInvalidParamsError())
|
|
79
|
+
}
|
|
80
|
+
```
|
|
@@ -15,6 +15,8 @@ exports.RpcResponse = void 0;
|
|
|
15
15
|
result.ignore();
|
|
16
16
|
if (result.isOk())
|
|
17
17
|
return new ok.RpcOk(id, result.inner);
|
|
18
|
+
if (result.inner instanceof err.RpcError)
|
|
19
|
+
return new err.RpcErr(id, result.inner);
|
|
18
20
|
if (result.inner instanceof Error)
|
|
19
21
|
return new err.RpcErr(id, new err.RpcError(-32603, result.inner.message));
|
|
20
22
|
return new err.RpcErr(id, new err.RpcError(-32603, "An unknown error occured"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.cjs","sources":["../../../../src/mods/rpc/response.ts"],"sourcesContent":["import { RpcErr, RpcError } from \"./err.js\";\nimport { RpcOk } from \"./ok.js\";\nexport var RpcResponse;\n(function (RpcResponse) {\n function from(init) {\n if (\"error\" in init)\n return RpcErr.from(init);\n return RpcOk.from(init);\n }\n RpcResponse.from = from;\n function rewrap(id, result) {\n result.ignore();\n if (result.isOk())\n return new RpcOk(id, result.inner);\n if (result.inner instanceof Error)\n return new RpcErr(id, new RpcError(-32603, result.inner.message));\n return new RpcErr(id, new RpcError(-32603, \"An unknown error occured\"));\n }\n RpcResponse.rewrap = rewrap;\n})(RpcResponse || (RpcResponse = {}));\n//# sourceMappingURL=response.js.map"],"names":["RpcResponse","RpcErr","RpcOk","RpcError"],"mappings":";;;;;AAEWA,6BAAY;AACvB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE;AACxB,QAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,YAAY,OAAOC,UAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,QAAQ,OAAOC,QAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;AAC5B,IAAI,SAAS,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE;AAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;AACxB,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;AACzB,YAAY,OAAO,IAAIA,QAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAY,KAAK;AACzC,YAAY,OAAO,
|
|
1
|
+
{"version":3,"file":"response.cjs","sources":["../../../../src/mods/rpc/response.ts"],"sourcesContent":["import { RpcErr, RpcError } from \"./err.js\";\nimport { RpcOk } from \"./ok.js\";\nexport var RpcResponse;\n(function (RpcResponse) {\n function from(init) {\n if (\"error\" in init)\n return RpcErr.from(init);\n return RpcOk.from(init);\n }\n RpcResponse.from = from;\n function rewrap(id, result) {\n result.ignore();\n if (result.isOk())\n return new RpcOk(id, result.inner);\n if (result.inner instanceof RpcError)\n return new RpcErr(id, result.inner);\n if (result.inner instanceof Error)\n return new RpcErr(id, new RpcError(-32603, result.inner.message));\n return new RpcErr(id, new RpcError(-32603, \"An unknown error occured\"));\n }\n RpcResponse.rewrap = rewrap;\n})(RpcResponse || (RpcResponse = {}));\n//# sourceMappingURL=response.js.map"],"names":["RpcResponse","RpcErr","RpcOk","RpcError"],"mappings":";;;;;AAEWA,6BAAY;AACvB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE;AACxB,QAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,YAAY,OAAOC,UAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,QAAQ,OAAOC,QAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;AAC5B,IAAI,SAAS,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE;AAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;AACxB,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;AACzB,YAAY,OAAO,IAAIA,QAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAYC,YAAQ;AAC5C,YAAY,OAAO,IAAIF,UAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAY,KAAK;AACzC,YAAY,OAAO,IAAIA,UAAM,CAAC,EAAE,EAAE,IAAIE,YAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,QAAQ,OAAO,IAAIF,UAAM,CAAC,EAAE,EAAE,IAAIE,YAAQ,CAAC,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAChF,KAAK;AACL,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;AAChC,CAAC,EAAEH,mBAAW,KAAKA,mBAAW,GAAG,EAAE,CAAC,CAAC;;"}
|
|
@@ -13,6 +13,8 @@ var RpcResponse;
|
|
|
13
13
|
result.ignore();
|
|
14
14
|
if (result.isOk())
|
|
15
15
|
return new RpcOk(id, result.inner);
|
|
16
|
+
if (result.inner instanceof RpcError)
|
|
17
|
+
return new RpcErr(id, result.inner);
|
|
16
18
|
if (result.inner instanceof Error)
|
|
17
19
|
return new RpcErr(id, new RpcError(-32603, result.inner.message));
|
|
18
20
|
return new RpcErr(id, new RpcError(-32603, "An unknown error occured"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.mjs","sources":["../../../../src/mods/rpc/response.ts"],"sourcesContent":["import { RpcErr, RpcError } from \"./err.js\";\nimport { RpcOk } from \"./ok.js\";\nexport var RpcResponse;\n(function (RpcResponse) {\n function from(init) {\n if (\"error\" in init)\n return RpcErr.from(init);\n return RpcOk.from(init);\n }\n RpcResponse.from = from;\n function rewrap(id, result) {\n result.ignore();\n if (result.isOk())\n return new RpcOk(id, result.inner);\n if (result.inner instanceof Error)\n return new RpcErr(id, new RpcError(-32603, result.inner.message));\n return new RpcErr(id, new RpcError(-32603, \"An unknown error occured\"));\n }\n RpcResponse.rewrap = rewrap;\n})(RpcResponse || (RpcResponse = {}));\n//# sourceMappingURL=response.js.map"],"names":[],"mappings":";;;AAEU,IAAC,YAAY;AACvB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE;AACxB,QAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,YAAY,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,QAAQ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;AAC5B,IAAI,SAAS,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE;AAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;AACxB,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;AACzB,YAAY,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAY,KAAK;AACzC,YAAY,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,QAAQ,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAChF,KAAK;AACL,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;AAChC,CAAC,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"response.mjs","sources":["../../../../src/mods/rpc/response.ts"],"sourcesContent":["import { RpcErr, RpcError } from \"./err.js\";\nimport { RpcOk } from \"./ok.js\";\nexport var RpcResponse;\n(function (RpcResponse) {\n function from(init) {\n if (\"error\" in init)\n return RpcErr.from(init);\n return RpcOk.from(init);\n }\n RpcResponse.from = from;\n function rewrap(id, result) {\n result.ignore();\n if (result.isOk())\n return new RpcOk(id, result.inner);\n if (result.inner instanceof RpcError)\n return new RpcErr(id, result.inner);\n if (result.inner instanceof Error)\n return new RpcErr(id, new RpcError(-32603, result.inner.message));\n return new RpcErr(id, new RpcError(-32603, \"An unknown error occured\"));\n }\n RpcResponse.rewrap = rewrap;\n})(RpcResponse || (RpcResponse = {}));\n//# sourceMappingURL=response.js.map"],"names":[],"mappings":";;;AAEU,IAAC,YAAY;AACvB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE;AACxB,QAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,YAAY,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,QAAQ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;AAC5B,IAAI,SAAS,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE;AAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;AACxB,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;AACzB,YAAY,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAY,QAAQ;AAC5C,YAAY,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,QAAQ,IAAI,MAAM,CAAC,KAAK,YAAY,KAAK;AACzC,YAAY,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,QAAQ,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAChF,KAAK;AACL,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;AAChC,CAAC,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;;;;"}
|
package/package.json
CHANGED