viem 2.18.0 → 2.18.2
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +18 -0
- package/_cjs/accounts/index.js +3 -1
- package/_cjs/accounts/index.js.map +1 -1
- package/_cjs/actions/public/getLogs.js +2 -1
- package/_cjs/actions/public/getLogs.js.map +1 -1
- package/_cjs/chains/definitions/bobaSepolia.js +1 -0
- package/_cjs/chains/definitions/bobaSepolia.js.map +1 -1
- package/_cjs/chains/definitions/cronoszkEVMTestnet.js +24 -0
- package/_cjs/chains/definitions/cronoszkEVMTestnet.js.map +1 -0
- package/_cjs/chains/index.js +8 -6
- package/_cjs/chains/index.js.map +1 -1
- package/_cjs/clients/transports/webSocket.js +5 -2
- package/_cjs/clients/transports/webSocket.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/utils/abi/parseEventLogs.js +70 -2
- package/_cjs/utils/abi/parseEventLogs.js.map +1 -1
- package/_cjs/utils/rpc/socket.js +27 -6
- package/_cjs/utils/rpc/socket.js.map +1 -1
- package/_cjs/utils/rpc/webSocket.js +22 -5
- package/_cjs/utils/rpc/webSocket.js.map +1 -1
- package/_esm/accounts/index.js +1 -0
- package/_esm/accounts/index.js.map +1 -1
- package/_esm/actions/public/getLogs.js +2 -1
- package/_esm/actions/public/getLogs.js.map +1 -1
- package/_esm/chains/definitions/bobaSepolia.js +1 -0
- package/_esm/chains/definitions/bobaSepolia.js.map +1 -1
- package/_esm/chains/definitions/cronoszkEVMTestnet.js +21 -0
- package/_esm/chains/definitions/cronoszkEVMTestnet.js.map +1 -0
- package/_esm/chains/index.js +1 -0
- package/_esm/chains/index.js.map +1 -1
- package/_esm/clients/transports/webSocket.js +5 -2
- package/_esm/clients/transports/webSocket.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/utils/abi/parseEventLogs.js +72 -2
- package/_esm/utils/abi/parseEventLogs.js.map +1 -1
- package/_esm/utils/rpc/socket.js +29 -6
- package/_esm/utils/rpc/socket.js.map +1 -1
- package/_esm/utils/rpc/webSocket.js +22 -5
- package/_esm/utils/rpc/webSocket.js.map +1 -1
- package/_types/accounts/index.d.ts +1 -0
- package/_types/accounts/index.d.ts.map +1 -1
- package/_types/actions/public/getLogs.d.ts.map +1 -1
- package/_types/chains/definitions/bobaSepolia.d.ts +1 -1
- package/_types/chains/definitions/bobaSepolia.d.ts.map +1 -1
- package/_types/chains/definitions/cronoszkEVMTestnet.d.ts +35 -0
- package/_types/chains/definitions/cronoszkEVMTestnet.d.ts.map +1 -0
- package/_types/chains/index.d.ts +1 -0
- package/_types/chains/index.d.ts.map +1 -1
- package/_types/clients/transports/webSocket.d.ts +5 -0
- package/_types/clients/transports/webSocket.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/utils/abi/parseEventLogs.d.ts +9 -3
- package/_types/utils/abi/parseEventLogs.d.ts.map +1 -1
- package/_types/utils/rpc/compat.d.ts +1 -0
- package/_types/utils/rpc/compat.d.ts.map +1 -1
- package/_types/utils/rpc/socket.d.ts +16 -2
- package/_types/utils/rpc/socket.d.ts.map +1 -1
- package/_types/utils/rpc/webSocket.d.ts +1 -1
- package/_types/utils/rpc/webSocket.d.ts.map +1 -1
- package/accounts/index.ts +1 -0
- package/actions/public/getLogs.ts +2 -1
- package/chains/definitions/bobaSepolia.ts +1 -0
- package/chains/definitions/cronoszkEVMTestnet.ts +21 -0
- package/chains/index.ts +1 -0
- package/clients/transports/webSocket.ts +10 -1
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- package/utils/abi/parseEventLogs.ts +103 -14
- package/utils/rpc/socket.ts +59 -11
- package/utils/rpc/webSocket.ts +25 -6
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,
|
1
|
+
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,CA0FpB"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "2.18.
|
1
|
+
export declare const version = "2.18.2";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
@@ -1,12 +1,18 @@
|
|
1
1
|
import type { Abi } from 'abitype';
|
2
2
|
import type { ErrorType } from '../../errors/utils.js';
|
3
|
-
import type { ContractEventName } from '../../types/contract.js';
|
3
|
+
import type { ContractEventName, GetEventArgs } from '../../types/contract.js';
|
4
4
|
import type { Log } from '../../types/log.js';
|
5
5
|
import type { RpcLog } from '../../types/rpc.js';
|
6
6
|
import { type DecodeEventLogErrorType } from './decodeEventLog.js';
|
7
|
-
export type ParseEventLogsParameters<abi extends Abi | readonly unknown[] = Abi, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = ContractEventName<abi>, strict extends boolean | undefined = boolean | undefined
|
7
|
+
export type ParseEventLogsParameters<abi extends Abi | readonly unknown[] = Abi, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = ContractEventName<abi>, strict extends boolean | undefined = boolean | undefined, allArgs = GetEventArgs<abi, eventName extends ContractEventName<abi> ? eventName : ContractEventName<abi>, {
|
8
|
+
EnableUnion: true;
|
9
|
+
IndexedOnly: false;
|
10
|
+
Required: false;
|
11
|
+
}>> = {
|
8
12
|
/** Contract ABI. */
|
9
13
|
abi: abi;
|
14
|
+
/** Arguments for the event. */
|
15
|
+
args?: allArgs | undefined;
|
10
16
|
/** Contract event. */
|
11
17
|
eventName?: eventName | ContractEventName<abi> | ContractEventName<abi>[] | undefined;
|
12
18
|
/** List of logs. */
|
@@ -39,5 +45,5 @@ export type ParseEventLogsErrorType = DecodeEventLogErrorType | ErrorType;
|
|
39
45
|
* const logs = parseEventLogs({ logs: receipt.logs })
|
40
46
|
* // [{ args: { ... }, eventName: 'TransactionDeposited', ... }, ...]
|
41
47
|
*/
|
42
|
-
export declare function parseEventLogs<abi extends Abi | readonly unknown[], strict extends boolean | undefined = true, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = undefined>(
|
48
|
+
export declare function parseEventLogs<abi extends Abi | readonly unknown[], strict extends boolean | undefined = true, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = undefined>(parameters: ParseEventLogsParameters<abi, eventName, strict>): ParseEventLogsReturnType<abi, eventName, strict>;
|
43
49
|
//# sourceMappingURL=parseEventLogs.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"parseEventLogs.d.ts","sourceRoot":"","sources":["../../../utils/abi/parseEventLogs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,
|
1
|
+
{"version":3,"file":"parseEventLogs.d.ts","sourceRoot":"","sources":["../../../utils/abi/parseEventLogs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAwC,MAAM,SAAS,CAAA;AAMxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAIhD,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAA;AAG5B,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAExD,OAAO,GAAG,YAAY,CACpB,GAAG,EACH,SAAS,SAAS,iBAAiB,CAAC,GAAG,CAAC,GACpC,SAAS,GACT,iBAAiB,CAAC,GAAG,CAAC,EAC1B;IACE,WAAW,EAAE,IAAI,CAAA;IACjB,WAAW,EAAE,KAAK,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAA;CAChB,CACF,IACC;IACF,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAA;IACR,+BAA+B;IAC/B,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,sBAAsB;IACtB,SAAS,CAAC,EACN,SAAS,GACT,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,CAAA;IACb,oBAAoB;IACpB,IAAI,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAExD,gBAAgB,SACZ,iBAAiB,CAAC,GAAG,CAAC,GACtB,SAAS,GAAG,SAAS,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACtD,SAAS,CAAC,MAAM,CAAC,GACjB,SAAS,IACX,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAA;AAE1E,MAAM,MAAM,uBAAuB,GAAG,uBAAuB,GAAG,SAAS,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EACpC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,IAAI,EACzC,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,SAAS,EAEzB,UAAU,EAAE,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,GAC3D,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CA8DlD"}
|
@@ -26,6 +26,7 @@ declare function webSocketAsync(socketClient: SocketRpcClient<WebSocket>, { body
|
|
26
26
|
*/
|
27
27
|
export declare function getSocket(url: string): Promise<WebSocket & {
|
28
28
|
close(): void;
|
29
|
+
ping?: (() => void) | undefined;
|
29
30
|
request(params: {
|
30
31
|
body: import("../../types/rpc.js").RpcRequest;
|
31
32
|
}): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM
|
1
|
+
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM;;;;;;;;;yBAtDkB,CAAA;;;;yBAAA,CAAA;;GA4D5D;AAED,eAAO,MAAM,GAAG;IACd;;;;;;;;;;;OAWG;cACO,MAAM,UAAU,qBAAqB;IAG/C;;;;;;;;;;;OAWG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAA"}
|
@@ -8,12 +8,14 @@ type CallbackFn = {
|
|
8
8
|
};
|
9
9
|
type CallbackMap = Map<Id, CallbackFn>;
|
10
10
|
export type GetSocketParameters = {
|
11
|
+
onClose: () => void;
|
11
12
|
onError: (error?: Error | Event | undefined) => void;
|
12
13
|
onOpen: () => void;
|
13
14
|
onResponse: (data: RpcResponse) => void;
|
14
15
|
};
|
15
16
|
export type Socket<socket extends {}> = socket & {
|
16
17
|
close(): void;
|
18
|
+
ping?: (() => void) | undefined;
|
17
19
|
request(params: {
|
18
20
|
body: RpcRequest;
|
19
21
|
}): void;
|
@@ -36,9 +38,20 @@ export type SocketRpcClient<socket extends {}> = {
|
|
36
38
|
};
|
37
39
|
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
38
40
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>;
|
41
|
+
/**
|
42
|
+
* Whether or not to send keep-alive messages.
|
43
|
+
* @default true
|
44
|
+
*/
|
45
|
+
keepAlive?: boolean | {
|
46
|
+
/**
|
47
|
+
* The interval (in ms) to send keep-alive messages.
|
48
|
+
* @default 30_000
|
49
|
+
*/
|
50
|
+
interval?: number | undefined;
|
51
|
+
} | undefined;
|
39
52
|
key?: string;
|
40
53
|
/**
|
41
|
-
* Whether or not to attempt to reconnect on socket failure.
|
54
|
+
* Whether or not to attempt to reconnect on socket failure or closure.
|
42
55
|
* @default true
|
43
56
|
*/
|
44
57
|
reconnect?: boolean | {
|
@@ -58,10 +71,11 @@ export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
|
58
71
|
export type GetSocketRpcClientErrorType = CreateBatchSchedulerErrorType | ErrorType;
|
59
72
|
export declare const socketClientCache: Map<string, SocketRpcClient<{
|
60
73
|
close(): void;
|
74
|
+
ping?: (() => void) | undefined;
|
61
75
|
request(params: {
|
62
76
|
body: RpcRequest;
|
63
77
|
}): void;
|
64
78
|
}>>;
|
65
|
-
export declare function getSocketRpcClient<socket extends {}>(
|
79
|
+
export declare function getSocketRpcClient<socket extends {}>(parameters: GetSocketRpcClientParameters<socket>): Promise<SocketRpcClient<socket>>;
|
66
80
|
export {};
|
67
81
|
//# sourceMappingURL=socket.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EACL,KAAK,6BAA6B,EAEnC,MAAM,oCAAoC,CAAA;AAI3C,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAA;AACzB,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CACpE,CAAA;AACD,KAAK,WAAW,GAAG,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;AAEtC,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAA;IACpD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,MAAM,SAAS,EAAE,IAAI,MAAM,GAAG;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,CAAC,MAAM,EAAE;
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import { type GetSocketRpcClientParameters, type SocketRpcClient } from './socket.js';
|
2
|
-
export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'reconnect'>;
|
2
|
+
export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'keepAlive' | 'reconnect'>;
|
3
3
|
export declare function getWebSocketRpcClient(url: string, options?: GetWebSocketRpcClientOptions | undefined): Promise<SocketRpcClient<WebSocket>>;
|
4
4
|
//# sourceMappingURL=webSocket.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,
|
1
|
+
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,GAAG,WAAW,CAC1B,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAA4B,GAAG,SAAc,GACrD,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA6ErC"}
|
package/accounts/index.ts
CHANGED
@@ -165,7 +165,7 @@ export async function getLogs<
|
|
165
165
|
encodeEventTopics({
|
166
166
|
abi: [event],
|
167
167
|
eventName: (event as AbiEvent).name,
|
168
|
-
args,
|
168
|
+
args: events_ ? undefined : args,
|
169
169
|
} as EncodeEventTopicsParameters),
|
170
170
|
)
|
171
171
|
// TODO: Clean up type casting
|
@@ -205,6 +205,7 @@ export async function getLogs<
|
|
205
205
|
>
|
206
206
|
return parseEventLogs({
|
207
207
|
abi: events,
|
208
|
+
args: args as any,
|
208
209
|
logs: formattedLogs,
|
209
210
|
strict,
|
210
211
|
}) as unknown as GetLogsReturnType<
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { defineChain } from '../../utils/chain/defineChain.js'
|
2
|
+
|
3
|
+
export const cronoszkEVMTestnet = /*#__PURE__*/ defineChain({
|
4
|
+
id: 282,
|
5
|
+
name: 'Cronos zkEVM Testnet',
|
6
|
+
nativeCurrency: {
|
7
|
+
decimals: 18,
|
8
|
+
name: 'Cronos zkEVM Test Coin',
|
9
|
+
symbol: 'zkTCRO',
|
10
|
+
},
|
11
|
+
rpcUrls: {
|
12
|
+
default: { http: ['https://testnet.zkevm.cronos.org'] },
|
13
|
+
},
|
14
|
+
blockExplorers: {
|
15
|
+
default: {
|
16
|
+
name: 'Cronos zkEVM Testnet Explorer',
|
17
|
+
url: 'https://explorer.zkevm.cronos.org/testnet',
|
18
|
+
},
|
19
|
+
},
|
20
|
+
testnet: true,
|
21
|
+
})
|
package/chains/index.ts
CHANGED
@@ -60,6 +60,7 @@ export { confluxESpaceTestnet } from './definitions/confluxESpaceTestnet.js'
|
|
60
60
|
export { coreDao } from './definitions/coreDao.js'
|
61
61
|
export { crab } from './definitions/crab.js'
|
62
62
|
export { cronos } from './definitions/cronos.js'
|
63
|
+
export { cronoszkEVMTestnet } from './definitions/cronoszkEVMTestnet.js'
|
63
64
|
export { cronosTestnet } from './definitions/cronosTestnet.js'
|
64
65
|
export { crossbell } from './definitions/crossbell.js'
|
65
66
|
export { cyber } from './definitions/cyber.js'
|
@@ -42,6 +42,11 @@ type WebSocketTransportSubscribe = {
|
|
42
42
|
}
|
43
43
|
|
44
44
|
export type WebSocketTransportConfig = {
|
45
|
+
/**
|
46
|
+
* Whether or not to send keep-alive ping messages.
|
47
|
+
* @default true
|
48
|
+
*/
|
49
|
+
keepAlive?: GetWebSocketRpcClientOptions['keepAlive'] | undefined
|
45
50
|
/** The key of the WebSocket transport. */
|
46
51
|
key?: TransportConfig['key'] | undefined
|
47
52
|
/** The name of the WebSocket transport. */
|
@@ -85,6 +90,7 @@ export function webSocket(
|
|
85
90
|
config: WebSocketTransportConfig = {},
|
86
91
|
): WebSocketTransport {
|
87
92
|
const {
|
93
|
+
keepAlive,
|
88
94
|
key = 'webSocket',
|
89
95
|
name = 'WebSocket JSON-RPC',
|
90
96
|
reconnect,
|
@@ -101,7 +107,10 @@ export function webSocket(
|
|
101
107
|
name,
|
102
108
|
async request({ method, params }) {
|
103
109
|
const body = { method, params }
|
104
|
-
const rpcClient = await getWebSocketRpcClient(url_, {
|
110
|
+
const rpcClient = await getWebSocketRpcClient(url_, {
|
111
|
+
keepAlive,
|
112
|
+
reconnect,
|
113
|
+
})
|
105
114
|
const { error, result } = await rpcClient.requestAsync({
|
106
115
|
body,
|
107
116
|
timeout,
|
package/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '2.18.
|
1
|
+
export const version = '2.18.2'
|
package/package.json
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
// TODO(v3): checksum address.
|
2
2
|
|
3
|
-
import type { Abi } from 'abitype'
|
3
|
+
import type { Abi, AbiEvent, AbiEventParameter, Address } from 'abitype'
|
4
4
|
import {
|
5
5
|
AbiEventSignatureNotFoundError,
|
6
6
|
DecodeLogDataMismatch,
|
7
7
|
DecodeLogTopicsMismatch,
|
8
8
|
} from '../../errors/abi.js'
|
9
9
|
import type { ErrorType } from '../../errors/utils.js'
|
10
|
-
import type { ContractEventName } from '../../types/contract.js'
|
10
|
+
import type { ContractEventName, GetEventArgs } from '../../types/contract.js'
|
11
11
|
import type { Log } from '../../types/log.js'
|
12
12
|
import type { RpcLog } from '../../types/rpc.js'
|
13
|
+
import { isAddressEqual } from '../address/isAddressEqual.js'
|
14
|
+
import { toBytes } from '../encoding/toBytes.js'
|
15
|
+
import { keccak256 } from '../hash/keccak256.js'
|
13
16
|
import {
|
14
17
|
type DecodeEventLogErrorType,
|
15
18
|
decodeEventLog,
|
16
19
|
} from './decodeEventLog.js'
|
20
|
+
import { getAbiItem } from './getAbiItem.js'
|
17
21
|
|
18
22
|
export type ParseEventLogsParameters<
|
19
23
|
abi extends Abi | readonly unknown[] = Abi,
|
@@ -22,9 +26,23 @@ export type ParseEventLogsParameters<
|
|
22
26
|
| ContractEventName<abi>[]
|
23
27
|
| undefined = ContractEventName<abi>,
|
24
28
|
strict extends boolean | undefined = boolean | undefined,
|
29
|
+
///
|
30
|
+
allArgs = GetEventArgs<
|
31
|
+
abi,
|
32
|
+
eventName extends ContractEventName<abi>
|
33
|
+
? eventName
|
34
|
+
: ContractEventName<abi>,
|
35
|
+
{
|
36
|
+
EnableUnion: true
|
37
|
+
IndexedOnly: false
|
38
|
+
Required: false
|
39
|
+
}
|
40
|
+
>,
|
25
41
|
> = {
|
26
42
|
/** Contract ABI. */
|
27
43
|
abi: abi
|
44
|
+
/** Arguments for the event. */
|
45
|
+
args?: allArgs | undefined
|
28
46
|
/** Contract event. */
|
29
47
|
eventName?:
|
30
48
|
| eventName
|
@@ -84,25 +102,45 @@ export function parseEventLogs<
|
|
84
102
|
| ContractEventName<abi>
|
85
103
|
| ContractEventName<abi>[]
|
86
104
|
| undefined = undefined,
|
87
|
-
>(
|
88
|
-
abi,
|
89
|
-
|
90
|
-
logs,
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
105
|
+
>(
|
106
|
+
parameters: ParseEventLogsParameters<abi, eventName, strict>,
|
107
|
+
): ParseEventLogsReturnType<abi, eventName, strict> {
|
108
|
+
const { abi, args, logs, strict = true } = parameters
|
109
|
+
|
110
|
+
const eventName = (() => {
|
111
|
+
if (!parameters.eventName) return undefined
|
112
|
+
if (Array.isArray(parameters.eventName)) return parameters.eventName
|
113
|
+
return [parameters.eventName as string]
|
114
|
+
})()
|
115
|
+
|
97
116
|
return logs
|
98
117
|
.map((log) => {
|
99
118
|
try {
|
119
|
+
const abiItem = getAbiItem({
|
120
|
+
abi: abi as Abi,
|
121
|
+
name: log.topics[0] as string,
|
122
|
+
}) as AbiEvent
|
123
|
+
if (!abiItem) return null
|
124
|
+
|
100
125
|
const event = decodeEventLog({
|
101
126
|
...log,
|
102
|
-
abi,
|
127
|
+
abi: [abiItem],
|
103
128
|
strict,
|
104
129
|
})
|
105
|
-
|
130
|
+
|
131
|
+
// Check that the decoded event name matches the provided event name.
|
132
|
+
if (eventName && !eventName.includes(event.eventName)) return null
|
133
|
+
|
134
|
+
// Check that the decoded event args match the provided args.
|
135
|
+
if (
|
136
|
+
!includesArgs({
|
137
|
+
args: event.args,
|
138
|
+
inputs: abiItem.inputs,
|
139
|
+
matchArgs: args,
|
140
|
+
})
|
141
|
+
)
|
142
|
+
return null
|
143
|
+
|
106
144
|
return { ...event, ...log }
|
107
145
|
} catch (err) {
|
108
146
|
let eventName: string | undefined
|
@@ -129,3 +167,54 @@ export function parseEventLogs<
|
|
129
167
|
strict
|
130
168
|
>
|
131
169
|
}
|
170
|
+
|
171
|
+
function includesArgs(parameters: {
|
172
|
+
args: unknown
|
173
|
+
inputs: AbiEvent['inputs']
|
174
|
+
matchArgs: unknown
|
175
|
+
}) {
|
176
|
+
const { args, inputs, matchArgs } = parameters
|
177
|
+
|
178
|
+
if (!matchArgs) return true
|
179
|
+
if (!args) return false
|
180
|
+
|
181
|
+
function isEqual(input: AbiEventParameter, value: unknown, arg: unknown) {
|
182
|
+
try {
|
183
|
+
if (input.type === 'address')
|
184
|
+
return isAddressEqual(value as Address, arg as Address)
|
185
|
+
if (input.type === 'string' || input.type === 'bytes')
|
186
|
+
return keccak256(toBytes(value as string)) === arg
|
187
|
+
return value === arg
|
188
|
+
} catch {
|
189
|
+
return false
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
if (Array.isArray(args) && Array.isArray(matchArgs)) {
|
194
|
+
return matchArgs.every((value, index) => {
|
195
|
+
if (!value) return true
|
196
|
+
const input = inputs[index]
|
197
|
+
if (!input) return false
|
198
|
+
const value_ = Array.isArray(value) ? value : [value]
|
199
|
+
return value_.some((value) => isEqual(input, value, args[index]))
|
200
|
+
})
|
201
|
+
}
|
202
|
+
|
203
|
+
if (
|
204
|
+
typeof args === 'object' &&
|
205
|
+
!Array.isArray(args) &&
|
206
|
+
typeof matchArgs === 'object' &&
|
207
|
+
!Array.isArray(matchArgs)
|
208
|
+
)
|
209
|
+
return Object.entries(matchArgs).every(([key, value]) => {
|
210
|
+
if (!value) return true
|
211
|
+
const input = inputs.find((input) => input.name === key)
|
212
|
+
if (!input) return false
|
213
|
+
const value_ = Array.isArray(value) ? value : [value]
|
214
|
+
return value_.some((value) =>
|
215
|
+
isEqual(input, value, (args as Record<string, unknown>)[key]),
|
216
|
+
)
|
217
|
+
})
|
218
|
+
|
219
|
+
return false
|
220
|
+
}
|
package/utils/rpc/socket.ts
CHANGED
@@ -16,6 +16,7 @@ type CallbackFn = {
|
|
16
16
|
type CallbackMap = Map<Id, CallbackFn>
|
17
17
|
|
18
18
|
export type GetSocketParameters = {
|
19
|
+
onClose: () => void
|
19
20
|
onError: (error?: Error | Event | undefined) => void
|
20
21
|
onOpen: () => void
|
21
22
|
onResponse: (data: RpcResponse) => void
|
@@ -23,9 +24,8 @@ export type GetSocketParameters = {
|
|
23
24
|
|
24
25
|
export type Socket<socket extends {}> = socket & {
|
25
26
|
close(): void
|
26
|
-
|
27
|
-
|
28
|
-
}): void
|
27
|
+
ping?: (() => void) | undefined
|
28
|
+
request(params: { body: RpcRequest }): void
|
29
29
|
}
|
30
30
|
|
31
31
|
export type SocketRpcClient<socket extends {}> = {
|
@@ -47,9 +47,23 @@ export type SocketRpcClient<socket extends {}> = {
|
|
47
47
|
|
48
48
|
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
49
49
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>
|
50
|
+
/**
|
51
|
+
* Whether or not to send keep-alive messages.
|
52
|
+
* @default true
|
53
|
+
*/
|
54
|
+
keepAlive?:
|
55
|
+
| boolean
|
56
|
+
| {
|
57
|
+
/**
|
58
|
+
* The interval (in ms) to send keep-alive messages.
|
59
|
+
* @default 30_000
|
60
|
+
*/
|
61
|
+
interval?: number | undefined
|
62
|
+
}
|
63
|
+
| undefined
|
50
64
|
key?: string
|
51
65
|
/**
|
52
|
-
* Whether or not to attempt to reconnect on socket failure.
|
66
|
+
* Whether or not to attempt to reconnect on socket failure or closure.
|
53
67
|
* @default true
|
54
68
|
*/
|
55
69
|
reconnect?:
|
@@ -80,9 +94,17 @@ export const socketClientCache = /*#__PURE__*/ new Map<
|
|
80
94
|
>()
|
81
95
|
|
82
96
|
export async function getSocketRpcClient<socket extends {}>(
|
83
|
-
|
97
|
+
parameters: GetSocketRpcClientParameters<socket>,
|
84
98
|
): Promise<SocketRpcClient<socket>> {
|
85
|
-
const {
|
99
|
+
const {
|
100
|
+
getSocket,
|
101
|
+
keepAlive = true,
|
102
|
+
key = 'socket',
|
103
|
+
reconnect = true,
|
104
|
+
url,
|
105
|
+
} = parameters
|
106
|
+
const { interval: keepAliveInterval = 30_000 } =
|
107
|
+
typeof keepAlive === 'object' ? keepAlive : {}
|
86
108
|
const { attempts = 5, delay = 2_000 } =
|
87
109
|
typeof reconnect === 'object' ? reconnect : {}
|
88
110
|
|
@@ -105,10 +127,24 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
105
127
|
const subscriptions = new Map<Id, CallbackFn>()
|
106
128
|
|
107
129
|
let error: Error | Event | undefined
|
108
|
-
let socket: Socket<
|
130
|
+
let socket: Socket<{}>
|
131
|
+
let keepAliveTimer: Timer | undefined
|
132
|
+
|
109
133
|
// Set up socket implementation.
|
110
134
|
async function setup() {
|
111
|
-
|
135
|
+
const result = await getSocket({
|
136
|
+
onClose() {
|
137
|
+
// Clear all requests and subscriptions.
|
138
|
+
requests.clear()
|
139
|
+
subscriptions.clear()
|
140
|
+
|
141
|
+
// Attempt to reconnect.
|
142
|
+
if (reconnect && reconnectCount < attempts)
|
143
|
+
setTimeout(async () => {
|
144
|
+
reconnectCount++
|
145
|
+
await setup().catch(console.error)
|
146
|
+
}, delay)
|
147
|
+
},
|
112
148
|
onError(error_) {
|
113
149
|
error = error_
|
114
150
|
|
@@ -125,7 +161,7 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
125
161
|
if (reconnect && reconnectCount < attempts)
|
126
162
|
setTimeout(async () => {
|
127
163
|
reconnectCount++
|
128
|
-
|
164
|
+
await setup().catch(console.error)
|
129
165
|
}, delay)
|
130
166
|
},
|
131
167
|
onOpen() {
|
@@ -141,17 +177,29 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
141
177
|
if (!isSubscription) cache.delete(id)
|
142
178
|
},
|
143
179
|
})
|
180
|
+
|
181
|
+
socket = result
|
182
|
+
|
183
|
+
if (keepAlive) {
|
184
|
+
if (keepAliveTimer) clearInterval(keepAliveTimer)
|
185
|
+
keepAliveTimer = setInterval(() => socket.ping?.(), keepAliveInterval)
|
186
|
+
}
|
187
|
+
|
188
|
+
return result
|
144
189
|
}
|
145
|
-
|
190
|
+
await setup()
|
146
191
|
error = undefined
|
147
192
|
|
148
193
|
// Create a new socket instance.
|
149
194
|
socketClient = {
|
150
195
|
close() {
|
196
|
+
keepAliveTimer && clearInterval(keepAliveTimer)
|
151
197
|
socket.close()
|
152
198
|
socketClientCache.delete(`${key}:${url}`)
|
153
199
|
},
|
154
|
-
socket
|
200
|
+
get socket() {
|
201
|
+
return socket
|
202
|
+
},
|
155
203
|
request({ body, onError, onResponse }) {
|
156
204
|
if (error && onError) onError(error)
|
157
205
|
|
package/utils/rpc/webSocket.ts
CHANGED
@@ -10,22 +10,23 @@ import {
|
|
10
10
|
|
11
11
|
export type GetWebSocketRpcClientOptions = Pick<
|
12
12
|
GetSocketRpcClientParameters,
|
13
|
-
'reconnect'
|
13
|
+
'keepAlive' | 'reconnect'
|
14
14
|
>
|
15
15
|
|
16
16
|
export async function getWebSocketRpcClient(
|
17
17
|
url: string,
|
18
18
|
options: GetWebSocketRpcClientOptions | undefined = {},
|
19
19
|
): Promise<SocketRpcClient<WebSocket>> {
|
20
|
-
const { reconnect } = options
|
20
|
+
const { keepAlive, reconnect } = options
|
21
21
|
|
22
22
|
return getSocketRpcClient({
|
23
|
-
async getSocket({ onError, onOpen, onResponse }) {
|
23
|
+
async getSocket({ onClose, onError, onOpen, onResponse }) {
|
24
24
|
const WebSocket = await import('isows').then((module) => module.WebSocket)
|
25
25
|
const socket = new WebSocket(url)
|
26
26
|
|
27
|
-
function
|
28
|
-
|
27
|
+
function onClose_() {
|
28
|
+
onClose()
|
29
|
+
socket.removeEventListener('close', onClose_)
|
29
30
|
socket.removeEventListener('message', onMessage)
|
30
31
|
socket.removeEventListener('error', onError)
|
31
32
|
socket.removeEventListener('open', onOpen)
|
@@ -35,7 +36,7 @@ export async function getWebSocketRpcClient(
|
|
35
36
|
}
|
36
37
|
|
37
38
|
// Setup event listeners for RPC & subscription responses.
|
38
|
-
socket.addEventListener('close',
|
39
|
+
socket.addEventListener('close', onClose_)
|
39
40
|
socket.addEventListener('message', onMessage)
|
40
41
|
socket.addEventListener('error', onError)
|
41
42
|
socket.addEventListener('open', onOpen)
|
@@ -56,6 +57,23 @@ export async function getWebSocketRpcClient(
|
|
56
57
|
close_.bind(socket)()
|
57
58
|
onClose()
|
58
59
|
},
|
60
|
+
ping() {
|
61
|
+
try {
|
62
|
+
if (
|
63
|
+
socket.readyState === socket.CLOSED ||
|
64
|
+
socket.readyState === socket.CLOSING
|
65
|
+
)
|
66
|
+
throw new WebSocketRequestError({
|
67
|
+
body: {},
|
68
|
+
url: socket.url,
|
69
|
+
details: 'Socket is closed.',
|
70
|
+
})
|
71
|
+
|
72
|
+
socket.send('ping')
|
73
|
+
} catch (error) {
|
74
|
+
onError(error as Error)
|
75
|
+
}
|
76
|
+
},
|
59
77
|
request({ body }) {
|
60
78
|
if (
|
61
79
|
socket.readyState === socket.CLOSED ||
|
@@ -71,6 +89,7 @@ export async function getWebSocketRpcClient(
|
|
71
89
|
},
|
72
90
|
} as Socket<WebSocket>)
|
73
91
|
},
|
92
|
+
keepAlive,
|
74
93
|
reconnect,
|
75
94
|
url,
|
76
95
|
})
|