@asyncswap/jsonrpc 0.4.3 → 0.4.4
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/CHANGELOG.md +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -14
- package/dist/client.js.map +1 -1
- package/dist/error.d.ts +10 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +11 -0
- package/dist/error.js.map +1 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -4
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +2 -14
- package/src/error.ts +9 -0
- package/src/server.ts +10 -9
- package/src/types/error.d.ts +0 -13
package/CHANGELOG.md
CHANGED
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,qBAAa,aAAa;IAGb,OAAO,CAAC,GAAG;IAFvB,OAAO,CAAC,EAAE,CAAK;gBAEK,GAAG,EAAE,MAAM;IAEzB,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACxD,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,EAC1D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IAgBjC,YAAY,CAAC,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,OAAO,EAAO,GACpB,cAAc,CAAC,MAAM,CAAC;YASX,OAAO;IAkCf,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;CAYhE"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JsonRpcErrorCode } from "./error";
|
|
1
2
|
export class JsonRpcClient {
|
|
2
3
|
url;
|
|
3
4
|
id = 0;
|
|
@@ -28,9 +29,8 @@ export class JsonRpcClient {
|
|
|
28
29
|
id: ++this.id,
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
|
-
async request(req, customHeaders
|
|
32
|
+
async request(req, customHeaders) {
|
|
32
33
|
const controller = new AbortController();
|
|
33
|
-
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
34
34
|
try {
|
|
35
35
|
const headers = {
|
|
36
36
|
"Content-Type": "application/json",
|
|
@@ -45,21 +45,10 @@ export class JsonRpcClient {
|
|
|
45
45
|
return (await res.json());
|
|
46
46
|
}
|
|
47
47
|
catch (err) {
|
|
48
|
-
if (err instanceof Error && err.name === "AbortError") {
|
|
49
|
-
return {
|
|
50
|
-
jsonrpc: "2.0",
|
|
51
|
-
error: {
|
|
52
|
-
code: JsonRpcErrorCodes.REQUEST_ABORTED,
|
|
53
|
-
message: `Request Aborted. Timeout after ${timeout}ms.`,
|
|
54
|
-
},
|
|
55
|
-
id: null,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
clearTimeout(timeoutId);
|
|
59
48
|
return {
|
|
60
49
|
jsonrpc: "2.0",
|
|
61
50
|
error: {
|
|
62
|
-
code:
|
|
51
|
+
code: JsonRpcErrorCode.REQUEST_FAILED,
|
|
63
52
|
message: `Request failed: ${err}`,
|
|
64
53
|
},
|
|
65
54
|
id: null,
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAa;IAGL;IAFZ,EAAE,GAAG,CAAC,CAAC;IAEf,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAI,CAAC;IAEpC,KAAK,CAAC,IAAI,CACT,OAA0D,EAC1D,OAAgC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAU,CAAC;QAC5B,CAAC;QACD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,MAAgB,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,QAAoB,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,2CAA2C;YAC3C,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IAED,YAAY,CACX,MAAc,EACd,SAAoB,EAAE;QAEtB,OAAO;YACN,OAAO,EAAE,KAAc;YACvB,MAAM;YACN,MAAM;YACN,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE;SACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACpB,GAAwD,EACxD,aAAsC
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,MAAM,OAAO,aAAa;IAGL;IAFZ,EAAE,GAAG,CAAC,CAAC;IAEf,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAI,CAAC;IAEpC,KAAK,CAAC,IAAI,CACT,OAA0D,EAC1D,OAAgC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAU,CAAC;QAC5B,CAAC;QACD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,MAAgB,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,QAAoB,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,2CAA2C;YAC3C,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IAED,YAAY,CACX,MAAc,EACd,SAAoB,EAAE;QAEtB,OAAO;YACN,OAAO,EAAE,KAAc;YACvB,MAAM;YACN,MAAM;YACN,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE;SACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACpB,GAAwD,EACxD,aAAsC;QAItC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,MAAM,OAAO,GAA2B;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;aACxB,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBACzB,MAAM,EAAE,UAAU,CAAC,MAAM;aACzB,CAAC,CAAC;YAEH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAEa,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACN,IAAI,EAAE,gBAAgB,CAAC,cAAc;oBACrC,OAAO,EAAE,mBAAmB,GAAG,EAAE;iBACjC;gBACD,EAAE,EAAE,IAAI;aACR,CAAC;QACH,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAkB,MAAc,EAAE,MAAkB;QAC/D,MAAM,OAAO,GAA2B;YACvC,OAAO,EAAE,KAAK;YACd,MAAM;YACN,MAAM;SACN,CAAC;QACF,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC;IACJ,CAAC;CACD"}
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare enum JsonRpcErrorCode {
|
|
2
|
+
INVALID_REQUEST = -32600,
|
|
3
|
+
METHOD_NOT_FOUND = -32601,
|
|
4
|
+
INVALID_PARAMS = -32602,
|
|
5
|
+
INTERNAL_ERROR = -32603,
|
|
6
|
+
PARSE_ERROR = -32700,
|
|
7
|
+
REQUEST_ABORTED = -32800,
|
|
8
|
+
REQUEST_FAILED = -32801
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC3B,eAAe,SAAS;IACxB,gBAAgB,SAAS;IACzB,cAAc,SAAS;IACvB,cAAc,SAAS;IACvB,WAAW,SAAS;IACpB,eAAe,SAAS;IACxB,cAAc,SAAS;CACvB"}
|
package/dist/error.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export var JsonRpcErrorCode;
|
|
2
|
+
(function (JsonRpcErrorCode) {
|
|
3
|
+
JsonRpcErrorCode[JsonRpcErrorCode["INVALID_REQUEST"] = -32600] = "INVALID_REQUEST";
|
|
4
|
+
JsonRpcErrorCode[JsonRpcErrorCode["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
|
|
5
|
+
JsonRpcErrorCode[JsonRpcErrorCode["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
|
|
6
|
+
JsonRpcErrorCode[JsonRpcErrorCode["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
|
|
7
|
+
JsonRpcErrorCode[JsonRpcErrorCode["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
|
|
8
|
+
JsonRpcErrorCode[JsonRpcErrorCode["REQUEST_ABORTED"] = -32800] = "REQUEST_ABORTED";
|
|
9
|
+
JsonRpcErrorCode[JsonRpcErrorCode["REQUEST_FAILED"] = -32801] = "REQUEST_FAILED";
|
|
10
|
+
})(JsonRpcErrorCode || (JsonRpcErrorCode = {}));
|
|
11
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC3B,kFAAwB,CAAA;IACxB,oFAAyB,CAAA;IACzB,gFAAuB,CAAA;IACvB,gFAAuB,CAAA;IACvB,0EAAoB,CAAA;IACpB,kFAAwB,CAAA;IACxB,gFAAuB,CAAA;AACxB,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { JsonRpcErrorCode } from "./error";
|
|
1
2
|
export type Handler<Result> = (params: any) => any | Promise<Result>;
|
|
2
3
|
export declare class JsonRpcServer {
|
|
3
4
|
private methods;
|
|
4
5
|
register(method: string, handler: Handler<any>): void;
|
|
5
|
-
handle<Result, Method = string>(raw: unknown): Promise<JsonRpcResponse<Result,
|
|
6
|
+
handle<Result, Method = string>(raw: unknown): Promise<JsonRpcResponse<Result, JsonRpcErrorCode | number> | JsonRpcResponse<Result, JsonRpcErrorCode | number>[] | null>;
|
|
6
7
|
private error;
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAErE,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAmC;IAElD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAIxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EACnC,GAAG,EAAE,OAAO,GACV,OAAO,CACP,eAAe,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,MAAM,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAErE,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAmC;IAElD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAIxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EACnC,GAAG,EAAE,OAAO,GACV,OAAO,CACP,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,GAClD,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,EAAE,GACpD,IAAI,CACN;IAsED,OAAO,CAAC,KAAK;CAYb"}
|
package/dist/server.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JsonRpcErrorCode } from "./error";
|
|
1
2
|
export class JsonRpcServer {
|
|
2
3
|
methods = new Map();
|
|
3
4
|
register(method, handler) {
|
|
@@ -7,7 +8,7 @@ export class JsonRpcServer {
|
|
|
7
8
|
// handle batch
|
|
8
9
|
if (Array.isArray(raw)) {
|
|
9
10
|
if (raw.length === 0) {
|
|
10
|
-
return this.error(null,
|
|
11
|
+
return this.error(null, JsonRpcErrorCode.INVALID_REQUEST, "Invalid request");
|
|
11
12
|
}
|
|
12
13
|
const responses = await Promise.all(raw.map((item) => this.handle(item)));
|
|
13
14
|
const filtered = responses.filter((r) => r !== null);
|
|
@@ -19,7 +20,7 @@ export class JsonRpcServer {
|
|
|
19
20
|
req === null ||
|
|
20
21
|
req.jsonrpc !== "2.0" ||
|
|
21
22
|
typeof req.method !== "string") {
|
|
22
|
-
return this.error(null,
|
|
23
|
+
return this.error(null, JsonRpcErrorCode.INVALID_REQUEST, "Invalid request");
|
|
23
24
|
}
|
|
24
25
|
const id = typeof req?.id === "string" ||
|
|
25
26
|
typeof req?.id === "number" ||
|
|
@@ -30,7 +31,7 @@ export class JsonRpcServer {
|
|
|
30
31
|
if (!handler) {
|
|
31
32
|
return id === null
|
|
32
33
|
? null
|
|
33
|
-
: this.error(req.id,
|
|
34
|
+
: this.error(req.id, JsonRpcErrorCode.METHOD_NOT_FOUND, "Method not found");
|
|
34
35
|
}
|
|
35
36
|
try {
|
|
36
37
|
const result = await handler(req.params);
|
|
@@ -43,7 +44,7 @@ export class JsonRpcServer {
|
|
|
43
44
|
};
|
|
44
45
|
}
|
|
45
46
|
catch (err) {
|
|
46
|
-
return this.error(req.id ?? null,
|
|
47
|
+
return this.error(req.id ?? null, JsonRpcErrorCode.INTERNAL_ERROR, "Internal error", err instanceof Error ? err.message : err);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
error(id, code, message, data) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JsonRpcErrorCode } from "./error";
|
|
1
2
|
export class JsonRpcClient {
|
|
2
3
|
private id = 0;
|
|
3
4
|
|
|
@@ -37,12 +38,10 @@ export class JsonRpcClient {
|
|
|
37
38
|
private async request(
|
|
38
39
|
req: JsonRpcRequest<unknown> | JsonRpcRequest<unknown>[],
|
|
39
40
|
customHeaders?: Record<string, string>,
|
|
40
|
-
timeout: number = 5000,
|
|
41
41
|
): Promise<
|
|
42
42
|
JsonRpcResponse<unknown, number> | JsonRpcResponse<unknown, number>[]
|
|
43
43
|
> {
|
|
44
44
|
const controller = new AbortController();
|
|
45
|
-
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
46
45
|
try {
|
|
47
46
|
const headers: Record<string, string> = {
|
|
48
47
|
"Content-Type": "application/json",
|
|
@@ -59,21 +58,10 @@ export class JsonRpcClient {
|
|
|
59
58
|
| JsonRpcResponse<unknown, number>
|
|
60
59
|
| JsonRpcResponse<unknown, number>[];
|
|
61
60
|
} catch (err) {
|
|
62
|
-
if (err instanceof Error && err.name === "AbortError") {
|
|
63
|
-
return {
|
|
64
|
-
jsonrpc: "2.0",
|
|
65
|
-
error: {
|
|
66
|
-
code: JsonRpcErrorCodes.REQUEST_ABORTED,
|
|
67
|
-
message: `Request Aborted. Timeout after ${timeout}ms.`,
|
|
68
|
-
},
|
|
69
|
-
id: null,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
clearTimeout(timeoutId);
|
|
73
61
|
return {
|
|
74
62
|
jsonrpc: "2.0",
|
|
75
63
|
error: {
|
|
76
|
-
code:
|
|
64
|
+
code: JsonRpcErrorCode.REQUEST_FAILED,
|
|
77
65
|
message: `Request failed: ${err}`,
|
|
78
66
|
},
|
|
79
67
|
id: null,
|
package/src/error.ts
ADDED
package/src/server.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JsonRpcErrorCode } from "./error";
|
|
1
2
|
export type Handler<Result> = (params: any) => any | Promise<Result>;
|
|
2
3
|
|
|
3
4
|
export class JsonRpcServer {
|
|
@@ -10,8 +11,8 @@ export class JsonRpcServer {
|
|
|
10
11
|
async handle<Result, Method = string>(
|
|
11
12
|
raw: unknown,
|
|
12
13
|
): Promise<
|
|
13
|
-
| JsonRpcResponse<Result,
|
|
14
|
-
| JsonRpcResponse<Result,
|
|
14
|
+
| JsonRpcResponse<Result, JsonRpcErrorCode | number>
|
|
15
|
+
| JsonRpcResponse<Result, JsonRpcErrorCode | number>[]
|
|
15
16
|
| null
|
|
16
17
|
> {
|
|
17
18
|
// handle batch
|
|
@@ -19,13 +20,13 @@ export class JsonRpcServer {
|
|
|
19
20
|
if (raw.length === 0) {
|
|
20
21
|
return this.error(
|
|
21
22
|
null,
|
|
22
|
-
|
|
23
|
+
JsonRpcErrorCode.INVALID_REQUEST,
|
|
23
24
|
"Invalid request",
|
|
24
25
|
);
|
|
25
26
|
}
|
|
26
27
|
const responses = await Promise.all(raw.map((item) => this.handle(item)));
|
|
27
28
|
const filtered = responses.filter(
|
|
28
|
-
(r): r is JsonRpcResponse<Result,
|
|
29
|
+
(r): r is JsonRpcResponse<Result, JsonRpcErrorCode | number> =>
|
|
29
30
|
r !== null,
|
|
30
31
|
);
|
|
31
32
|
return filtered.length > 0 ? filtered : null;
|
|
@@ -42,7 +43,7 @@ export class JsonRpcServer {
|
|
|
42
43
|
) {
|
|
43
44
|
return this.error(
|
|
44
45
|
null,
|
|
45
|
-
|
|
46
|
+
JsonRpcErrorCode.INVALID_REQUEST,
|
|
46
47
|
"Invalid request",
|
|
47
48
|
);
|
|
48
49
|
}
|
|
@@ -60,7 +61,7 @@ export class JsonRpcServer {
|
|
|
60
61
|
? null
|
|
61
62
|
: this.error(
|
|
62
63
|
req.id,
|
|
63
|
-
|
|
64
|
+
JsonRpcErrorCode.METHOD_NOT_FOUND,
|
|
64
65
|
"Method not found",
|
|
65
66
|
);
|
|
66
67
|
}
|
|
@@ -76,7 +77,7 @@ export class JsonRpcServer {
|
|
|
76
77
|
} catch (err) {
|
|
77
78
|
return this.error(
|
|
78
79
|
req.id ?? null,
|
|
79
|
-
|
|
80
|
+
JsonRpcErrorCode.INTERNAL_ERROR,
|
|
80
81
|
"Internal error",
|
|
81
82
|
err instanceof Error ? err.message : err,
|
|
82
83
|
);
|
|
@@ -85,10 +86,10 @@ export class JsonRpcServer {
|
|
|
85
86
|
|
|
86
87
|
private error<Result, Method = string>(
|
|
87
88
|
id: JsonRpcRequest<Method>["id"],
|
|
88
|
-
code:
|
|
89
|
+
code: JsonRpcErrorCode | number,
|
|
89
90
|
message: string,
|
|
90
91
|
data?: unknown,
|
|
91
|
-
): JsonRpcResponse<Result,
|
|
92
|
+
): JsonRpcResponse<Result, JsonRpcErrorCode | number> {
|
|
92
93
|
return {
|
|
93
94
|
jsonrpc: "2.0",
|
|
94
95
|
error: { code, message, data },
|
package/src/types/error.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
declare global {
|
|
2
|
-
export enum JsonRpcErrorCodes {
|
|
3
|
-
INVALID_REQUEST = -32600,
|
|
4
|
-
METHOD_NOT_FOUND = -32601,
|
|
5
|
-
INVALID_PARAMS = -32602,
|
|
6
|
-
INTERNAL_ERROR = -32603,
|
|
7
|
-
PARSE_ERROR = -32700,
|
|
8
|
-
REQUEST_ABORTED = -32800,
|
|
9
|
-
REQUEST_FAILED = -32801,
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { };
|