diff --git a/packages/api/package.json b/packages/api/package.json index 8ec1c4f0476b..33e9755aaf6d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -35,7 +35,7 @@ "@polkadot/types-known": "10.5.2-4-x", "@polkadot/util": "^12.1.2", "@polkadot/util-crypto": "^12.1.2", - "eventemitter3": "^5.0.0", + "eventemitter3": "^5.0.1", "rxjs": "^7.8.1", "tslib": "^2.5.0" }, diff --git a/packages/rpc-provider/package.json b/packages/rpc-provider/package.json index 91b24c25108d..d2cd491a9e7f 100644 --- a/packages/rpc-provider/package.json +++ b/packages/rpc-provider/package.json @@ -29,15 +29,15 @@ "@polkadot/x-fetch": "^12.1.2", "@polkadot/x-global": "^12.1.2", "@polkadot/x-ws": "^12.1.2", - "eventemitter3": "^5.0.0", + "eventemitter3": "^5.0.1", "mock-socket": "^9.2.1", "nock": "^13.3.1", "tslib": "^2.5.0" }, "devDependencies": { - "@substrate/connect": "0.7.24" + "@substrate/connect": "0.7.25" }, "optionalDependencies": { - "@substrate/connect": "0.7.24" + "@substrate/connect": "0.7.25" } } diff --git a/packages/rpc-provider/src/coder/decodeResponse.spec.ts b/packages/rpc-provider/src/coder/decodeResponse.spec.ts index 9a6d84f5ad9b..7712bcf0fab2 100644 --- a/packages/rpc-provider/src/coder/decodeResponse.spec.ts +++ b/packages/rpc-provider/src/coder/decodeResponse.spec.ts @@ -16,55 +16,55 @@ describe('decodeResponse', (): void => { it('expects a non-empty input object', (): void => { expect( - () => coder.decodeResponse(undefined as unknown as JsonRpcResponse) + () => coder.decodeResponse(undefined as unknown as JsonRpcResponse) ).toThrow(/Invalid jsonrpc/); }); it('expects a valid jsonrpc field', (): void => { expect( - () => coder.decodeResponse({} as JsonRpcResponse) + () => coder.decodeResponse({} as JsonRpcResponse) ).toThrow(/Invalid jsonrpc/); }); it('expects a valid id field', (): void => { expect( - () => coder.decodeResponse({ jsonrpc: '2.0' } as JsonRpcResponse) + () => coder.decodeResponse({ jsonrpc: '2.0' } as JsonRpcResponse) ).toThrow(/Invalid id/); }); it('expects a valid result field', (): void => { expect( - () => coder.decodeResponse({ id: 1, jsonrpc: '2.0' } as JsonRpcResponse) + () => coder.decodeResponse({ id: 1, jsonrpc: '2.0' } as JsonRpcResponse) ).toThrow(/No result/); }); it('throws any error found', (): void => { expect( - () => coder.decodeResponse({ error: { code: 123, message: 'test error' }, id: 1, jsonrpc: '2.0' } as JsonRpcResponse) + () => coder.decodeResponse({ error: { code: 123, message: 'test error' }, id: 1, jsonrpc: '2.0' } as JsonRpcResponse) ).toThrow(/123: test error/); }); it('throws any error found, with data', (): void => { expect( - () => coder.decodeResponse({ error: { code: 123, data: 'Error("Some random error description")', message: 'test error' }, id: 1, jsonrpc: '2.0' } as JsonRpcResponse) + () => coder.decodeResponse({ error: { code: 123, data: 'Error("Some random error description")', message: 'test error' }, id: 1, jsonrpc: '2.0' } as JsonRpcResponse) ).toThrow(/123: test error: Some random error description/); }); it('allows for number subscription ids', (): void => { expect( - coder.decodeResponse({ id: 1, jsonrpc: '2.0', method: 'test', params: { result: 'test result', subscription: 1 } } as JsonRpcResponse) + coder.decodeResponse({ id: 1, jsonrpc: '2.0', method: 'test', params: { result: 'test result', subscription: 1 } } as JsonRpcResponse) ).toEqual('test result'); }); it('allows for string subscription ids', (): void => { expect( - coder.decodeResponse({ id: 1, jsonrpc: '2.0', method: 'test', params: { result: 'test result', subscription: 'abc' } } as JsonRpcResponse) + coder.decodeResponse({ id: 1, jsonrpc: '2.0', method: 'test', params: { result: 'test result', subscription: 'abc' } } as JsonRpcResponse) ).toEqual('test result'); }); it('returns the result', (): void => { expect( - coder.decodeResponse({ id: 1, jsonrpc: '2.0', result: 'some result' } as JsonRpcResponse) + coder.decodeResponse({ id: 1, jsonrpc: '2.0', result: 'some result' } as JsonRpcResponse) ).toEqual('some result'); }); }); diff --git a/packages/rpc-provider/src/coder/error.ts b/packages/rpc-provider/src/coder/error.ts index 3d80abdae0f3..51151e0ad0cd 100644 --- a/packages/rpc-provider/src/coder/error.ts +++ b/packages/rpc-provider/src/coder/error.ts @@ -29,10 +29,10 @@ function extend> (that: RpcError, nam * throw new RpcError('some message', RpcError.CODES.METHOD_NOT_FOUND); // => error.code = -32601 * ``` */ -export default class RpcError extends Error implements RpcErrorInterface { +export default class RpcError extends Error implements RpcErrorInterface { public code!: number; - public data?: Data; + public data?: T; public override message!: string; @@ -40,7 +40,7 @@ export default class RpcError extends Error implements RpcErrorInt public override stack!: string; - public constructor (message = '', code: number = UNKNOWN, data?: Data) { + public constructor (message = '', code: number = UNKNOWN, data?: T) { super(); extend(this, 'message', String(message)); diff --git a/packages/rpc-provider/src/coder/index.ts b/packages/rpc-provider/src/coder/index.ts index 88646a5ae73c..aebb5a65383c 100644 --- a/packages/rpc-provider/src/coder/index.ts +++ b/packages/rpc-provider/src/coder/index.ts @@ -35,7 +35,7 @@ function checkError (error?: JsonRpcResponseBaseError): void { export class RpcCoder { #id = 0; - public decodeResponse (response?: JsonRpcResponse): unknown { + public decodeResponse (response?: JsonRpcResponse): T { if (!response || response.jsonrpc !== '2.0') { throw new Error('Invalid jsonrpc field in decoded object'); } diff --git a/packages/rpc-provider/src/http/index.ts b/packages/rpc-provider/src/http/index.ts index 5f6f36baddec..e8ab326baf88 100644 --- a/packages/rpc-provider/src/http/index.ts +++ b/packages/rpc-provider/src/http/index.ts @@ -166,7 +166,7 @@ export class HttpProvider implements ProviderInterface { this.#stats.total.bytesRecv += result.length; - const decoded = this.#coder.decodeResponse(JSON.parse(result) as JsonRpcResponse) as T; + const decoded = this.#coder.decodeResponse(JSON.parse(result) as JsonRpcResponse); this.#stats.active.requests--; diff --git a/packages/rpc-provider/src/substrate-connect/index.ts b/packages/rpc-provider/src/substrate-connect/index.ts index f80fdc67a36a..945bec9b6ad3 100644 --- a/packages/rpc-provider/src/substrate-connect/index.ts +++ b/packages/rpc-provider/src/substrate-connect/index.ts @@ -132,11 +132,11 @@ export class ScProvider implements ProviderInterface { return; } - const response = JSON.parse(hcRes) as JsonRpcResponse; + const response = JSON.parse(hcRes) as JsonRpcResponse; let decodedResponse: string | Error; try { - decodedResponse = this.#coder.decodeResponse(response) as string; + decodedResponse = this.#coder.decodeResponse(response); } catch (e) { decodedResponse = e as Error; } diff --git a/packages/rpc-provider/src/types.ts b/packages/rpc-provider/src/types.ts index 2ab35b28f4f3..5d14636202fc 100644 --- a/packages/rpc-provider/src/types.ts +++ b/packages/rpc-provider/src/types.ts @@ -17,30 +17,30 @@ export interface JsonRpcResponseBaseError { message: string; } -export interface RpcErrorInterface { +export interface RpcErrorInterface { code: number; - data?: Data; + data?: T; message: string; stack: string; } -interface JsonRpcResponseSingle { +interface JsonRpcResponseSingle { error?: JsonRpcResponseBaseError; - result?: unknown; + result: T; } -interface JsonRpcResponseSubscription { +interface JsonRpcResponseSubscription { method?: string; params: { error?: JsonRpcResponseBaseError; - result: unknown; + result: T; subscription: number | string; }; } -export type JsonRpcResponseBase = JsonRpcResponseSingle & JsonRpcResponseSubscription; +export type JsonRpcResponseBase = JsonRpcResponseSingle & JsonRpcResponseSubscription; -export type JsonRpcResponse = JsonRpcObject & JsonRpcResponseBase; +export type JsonRpcResponse = JsonRpcObject & JsonRpcResponseBase; export type ProviderInterfaceCallback = (error: Error | null, result: any) => void; diff --git a/packages/rpc-provider/src/ws/index.ts b/packages/rpc-provider/src/ws/index.ts index 943871ae7ca4..19a1a8b31c1d 100644 --- a/packages/rpc-provider/src/ws/index.ts +++ b/packages/rpc-provider/src/ws/index.ts @@ -91,7 +91,7 @@ export class WsProvider implements ProviderInterface { readonly #handlers: Record = {}; readonly #isReadyPromise: Promise; readonly #stats: ProviderStats; - readonly #waitingForId: Record = {}; + readonly #waitingForId: Record> = {}; #autoConnectMs: number; #endpointIndex: number; @@ -489,14 +489,14 @@ export class WsProvider implements ProviderInterface { this.#endpointStats.bytesRecv += bytesRecv; this.#stats.total.bytesRecv += bytesRecv; - const response = JSON.parse(message.data) as JsonRpcResponse; + const response = JSON.parse(message.data) as JsonRpcResponse; return isUndefined(response.method) ? this.#onSocketMessageResult(response) : this.#onSocketMessageSubscribe(response); }; - #onSocketMessageResult = (response: JsonRpcResponse): void => { + #onSocketMessageResult = (response: JsonRpcResponse): void => { const handler = this.#handlers[response.id]; if (!handler) { @@ -507,7 +507,7 @@ export class WsProvider implements ProviderInterface { try { const { method, params, subscription } = handler; - const result = this.#coder.decodeResponse(response) as string; + const result = this.#coder.decodeResponse(response); // first send the result - in case of subs, we may have an update // immediately if we have some queued results already @@ -536,7 +536,7 @@ export class WsProvider implements ProviderInterface { delete this.#handlers[response.id]; }; - #onSocketMessageSubscribe = (response: JsonRpcResponse): void => { + #onSocketMessageSubscribe = (response: JsonRpcResponse): void => { const method = ALIASES[response.method as string] || response.method || 'invalid'; const subId = `${method}::${response.params.subscription}`; const handler = this.#subscriptions[subId]; diff --git a/yarn.lock b/yarn.lock index 14bc22262ef1..4163c0d8c673 100644 --- a/yarn.lock +++ b/yarn.lock @@ -448,7 +448,7 @@ __metadata: "@polkadot/types-support": 10.5.2-4-x "@polkadot/util": ^12.1.2 "@polkadot/util-crypto": ^12.1.2 - eventemitter3: ^5.0.0 + eventemitter3: ^5.0.1 rxjs: ^7.8.1 tslib: ^2.5.0 languageName: unknown @@ -610,8 +610,8 @@ __metadata: "@polkadot/x-fetch": ^12.1.2 "@polkadot/x-global": ^12.1.2 "@polkadot/x-ws": ^12.1.2 - "@substrate/connect": 0.7.24 - eventemitter3: ^5.0.0 + "@substrate/connect": 0.7.25 + eventemitter3: ^5.0.1 mock-socket: ^9.2.1 nock: ^13.3.1 tslib: ^2.5.0 @@ -1058,14 +1058,14 @@ __metadata: languageName: node linkType: hard -"@substrate/connect@npm:0.7.24": - version: 0.7.24 - resolution: "@substrate/connect@npm:0.7.24" +"@substrate/connect@npm:0.7.25": + version: 0.7.25 + resolution: "@substrate/connect@npm:0.7.25" dependencies: "@substrate/connect-extension-protocol": ^1.0.1 eventemitter3: ^4.0.7 - smoldot: 1.0.2 - checksum: ffede7dd5cdc7512f5a6f97d4ff2655dc294c78d21856aa9d215e39b84c623ebfda3557d970652eba7c4ac4e02eb765cf7140b17345aface1f700af200e0bf2d + smoldot: 1.0.3 + checksum: d480216988db28acdb2da9afa4c1fc568c780fc6953de68cb38bb9081fa994bad3756e26c854e5a4e7be4faaf59a134396fb710ebaa31b478d06503ded0117b8 languageName: node linkType: hard @@ -3848,10 +3848,10 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^5.0.0": - version: 5.0.0 - resolution: "eventemitter3@npm:5.0.0" - checksum: b974bafbab860e0a5bbb21add4c4e82f9d5691c583c03f2e4c5d44a2d6c4556d79223621bdcfc6c8e14366a4af9df6b5ea9d6caf65fbffc80b66f3e1dceacbc9 +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 languageName: node linkType: hard @@ -7717,13 +7717,13 @@ fsevents@~2.3.2: languageName: node linkType: hard -"smoldot@npm:1.0.2": - version: 1.0.2 - resolution: "smoldot@npm:1.0.2" +"smoldot@npm:1.0.3": + version: 1.0.3 + resolution: "smoldot@npm:1.0.3" dependencies: pako: ^2.0.4 ws: ^8.8.1 - checksum: 2e069c49e520e72c63d16d94c51a074a6f90ae598a2299afbf5b90c3a0ba607e1640bf51d8e2a3b06dc7843e571c96b5838209a1d9c9d0dae66c8693fa0369c9 + checksum: 70f12f23fac3d5eabd1300fccaa5e3a34e36fa8e40a21a138db63075fb881b3208f5d5d3fc1b59a082670b4d3036abc90c23858ed6457a59574b8fb7ef4987de languageName: node linkType: hard