@ckb-ccc/core 1.4.0 → 1.5.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/client/clientPublicMainnet.d.ts.map +1 -1
  3. package/dist/client/clientPublicMainnet.js +18 -2
  4. package/dist/client/clientPublicTestnet.d.ts.map +1 -1
  5. package/dist/client/clientPublicTestnet.js +13 -2
  6. package/dist/jsonRpc/requestor.d.ts +1 -0
  7. package/dist/jsonRpc/requestor.d.ts.map +1 -1
  8. package/dist/jsonRpc/requestor.js +4 -2
  9. package/dist/jsonRpc/transports/advanced.d.ts +1 -0
  10. package/dist/jsonRpc/transports/advanced.d.ts.map +1 -1
  11. package/dist/jsonRpc/transports/advanced.js +1 -0
  12. package/dist/jsonRpc/transports/fallback.d.ts +8 -0
  13. package/dist/jsonRpc/transports/fallback.d.ts.map +1 -0
  14. package/dist/jsonRpc/transports/fallback.js +22 -0
  15. package/dist.commonjs/client/clientPublicMainnet.d.ts.map +1 -1
  16. package/dist.commonjs/client/clientPublicMainnet.js +18 -2
  17. package/dist.commonjs/client/clientPublicTestnet.d.ts.map +1 -1
  18. package/dist.commonjs/client/clientPublicTestnet.js +13 -2
  19. package/dist.commonjs/jsonRpc/requestor.d.ts +1 -0
  20. package/dist.commonjs/jsonRpc/requestor.d.ts.map +1 -1
  21. package/dist.commonjs/jsonRpc/requestor.js +3 -1
  22. package/dist.commonjs/jsonRpc/transports/advanced.d.ts +1 -0
  23. package/dist.commonjs/jsonRpc/transports/advanced.d.ts.map +1 -1
  24. package/dist.commonjs/jsonRpc/transports/advanced.js +1 -0
  25. package/dist.commonjs/jsonRpc/transports/fallback.d.ts +8 -0
  26. package/dist.commonjs/jsonRpc/transports/fallback.d.ts.map +1 -0
  27. package/dist.commonjs/jsonRpc/transports/fallback.js +26 -0
  28. package/package.json +2 -2
  29. package/src/client/clientPublicMainnet.ts +19 -2
  30. package/src/client/clientPublicTestnet.ts +14 -2
  31. package/src/jsonRpc/requestor.ts +10 -1
  32. package/src/jsonRpc/transports/advanced.ts +1 -0
  33. package/src/jsonRpc/transports/fallback.ts +27 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ckb-ccc/core
2
2
 
3
+ ## 1.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`9924f10`](https://github.com/ckb-devrel/ccc/commit/9924f10ad9a8adc13129a16230cb695e6afb7a09) Thanks [@Hanssen0](https://github.com/Hanssen0)! - chore: bump @joyid/ckb version
8
+
9
+ ## 1.5.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#141](https://github.com/ckb-devrel/ccc/pull/141) [`28c211d`](https://github.com/ckb-devrel/ccc/commit/28c211d839a2d2305eca56e82ba7da144aa3df4a) Thanks [@Hanssen0](https://github.com/Hanssen0)! - feat(core): TransportFallback
14
+
3
15
  ## 1.4.0
4
16
 
5
17
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAWH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
1
+ {"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IA4BH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
@@ -7,10 +7,26 @@ import { ClientJsonRpc } from "./jsonRpc/index.js";
7
7
  */
8
8
  export class ClientPublicMainnet extends ClientJsonRpc {
9
9
  constructor(config) {
10
+ const hasWebSocket = typeof WebSocket !== "undefined";
10
11
  super(config?.url ??
11
- (typeof WebSocket !== "undefined"
12
+ (hasWebSocket
12
13
  ? "wss://mainnet.ckb.dev/ws"
13
- : "https://mainnet.ckb.dev/"), config);
14
+ : "https://mainnet.ckb.dev/"), {
15
+ ...config,
16
+ fallbacks: config?.fallbacks ??
17
+ (hasWebSocket
18
+ ? [
19
+ "wss://mainnet.ckb.dev/ws",
20
+ "https://mainnet.ckb.dev/",
21
+ "https://mainnet.ckbapp.dev/",
22
+ "https://rpc.ankr.com/nervos_ckb",
23
+ ]
24
+ : [
25
+ "https://mainnet.ckb.dev/",
26
+ "https://mainnet.ckbapp.dev/",
27
+ "https://rpc.ankr.com/nervos_ckb",
28
+ ]),
29
+ });
14
30
  this.config = config;
15
31
  }
16
32
  get scripts() {
@@ -1 +1 @@
1
- {"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAWH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
1
+ {"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAuBH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
@@ -7,10 +7,21 @@ import { ClientJsonRpc } from "./jsonRpc/index.js";
7
7
  */
8
8
  export class ClientPublicTestnet extends ClientJsonRpc {
9
9
  constructor(config) {
10
+ const hasWebSocket = typeof WebSocket !== "undefined";
10
11
  super(config?.url ??
11
- (typeof WebSocket !== "undefined"
12
+ (hasWebSocket
12
13
  ? "wss://testnet.ckb.dev/ws"
13
- : "https://testnet.ckb.dev/"), config);
14
+ : "https://testnet.ckb.dev/"), {
15
+ ...config,
16
+ fallbacks: config?.fallbacks ??
17
+ (hasWebSocket
18
+ ? [
19
+ "wss://testnet.ckb.dev/ws",
20
+ "https://testnet.ckb.dev/",
21
+ "https://testnet.ckbapp.dev/",
22
+ ]
23
+ : ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
24
+ });
14
25
  this.config = config;
15
26
  }
16
27
  get scripts() {
@@ -1,5 +1,6 @@
1
1
  import { JsonRpcPayload, Transport } from "./transports/advanced.js";
2
2
  export type RequestorJsonRpcConfig = {
3
+ fallbacks?: string[];
3
4
  timeout?: number;
4
5
  maxConcurrent?: number;
5
6
  transport?: Transport;
@@ -1 +1 @@
1
- {"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAMnE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
1
+ {"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAanE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
@@ -1,4 +1,4 @@
1
- import { transportFromUri, } from "./transports/advanced.js";
1
+ import { TransportFallback, transportFromUri, } from "./transports/advanced.js";
2
2
  /**
3
3
  * Applies a transformation function to a value if the transformer is provided.
4
4
  *
@@ -32,7 +32,9 @@ export class RequestorJsonRpc {
32
32
  this.pending = [];
33
33
  this.id = 0;
34
34
  this.maxConcurrent = config?.maxConcurrent;
35
- this.transport = config?.transport ?? transportFromUri(url_, config);
35
+ this.transport =
36
+ config?.transport ??
37
+ new TransportFallback(Array.from(new Set([url_, ...(config?.fallbacks ?? [])]).values(), (url) => transportFromUri(url, config)));
36
38
  }
37
39
  /**
38
40
  * Returns the URL of the JSON-RPC server.
@@ -1,4 +1,5 @@
1
1
  export * from "./factory.js";
2
+ export * from "./fallback.js";
2
3
  export * from "./http.js";
3
4
  export * from "./transport.js";
4
5
  export * from "./webSocket.js";
@@ -1 +1 @@
1
- {"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./factory.js";
2
+ export * from "./fallback.js";
2
3
  export * from "./http.js";
3
4
  export * from "./transport.js";
4
5
  export * from "./webSocket.js";
@@ -0,0 +1,8 @@
1
+ import { JsonRpcPayload, Transport } from "./transport.js";
2
+ export declare class TransportFallback implements Transport {
3
+ private readonly transports;
4
+ private i;
5
+ constructor(transports: Transport[]);
6
+ request(data: JsonRpcPayload): Promise<unknown>;
7
+ }
8
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,qBAAa,iBAAkB,YAAW,SAAS;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,CAAC,CAAK;gBAEe,UAAU,EAAE,SAAS,EAAE;IAE9C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAkBtD"}
@@ -0,0 +1,22 @@
1
+ export class TransportFallback {
2
+ constructor(transports) {
3
+ this.transports = transports;
4
+ // Current transport index
5
+ this.i = 0;
6
+ }
7
+ async request(data) {
8
+ let triedCount = 0;
9
+ while (true) {
10
+ try {
11
+ return await this.transports[this.i % this.transports.length].request(data);
12
+ }
13
+ catch (err) {
14
+ triedCount += 1;
15
+ this.i += 1;
16
+ if (triedCount >= this.transports.length) {
17
+ throw err;
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAWH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
1
+ {"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IA4BH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
@@ -13,10 +13,26 @@ const index_js_1 = require("./jsonRpc/index.js");
13
13
  */
14
14
  class ClientPublicMainnet extends index_js_1.ClientJsonRpc {
15
15
  constructor(config) {
16
+ const hasWebSocket = typeof isomorphic_ws_1.default !== "undefined";
16
17
  super(config?.url ??
17
- (typeof isomorphic_ws_1.default !== "undefined"
18
+ (hasWebSocket
18
19
  ? "wss://mainnet.ckb.dev/ws"
19
- : "https://mainnet.ckb.dev/"), config);
20
+ : "https://mainnet.ckb.dev/"), {
21
+ ...config,
22
+ fallbacks: config?.fallbacks ??
23
+ (hasWebSocket
24
+ ? [
25
+ "wss://mainnet.ckb.dev/ws",
26
+ "https://mainnet.ckb.dev/",
27
+ "https://mainnet.ckbapp.dev/",
28
+ "https://rpc.ankr.com/nervos_ckb",
29
+ ]
30
+ : [
31
+ "https://mainnet.ckb.dev/",
32
+ "https://mainnet.ckbapp.dev/",
33
+ "https://rpc.ankr.com/nervos_ckb",
34
+ ]),
35
+ });
20
36
  this.config = config;
21
37
  }
22
38
  get scripts() {
@@ -1 +1 @@
1
- {"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAWH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
1
+ {"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAuBH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
@@ -13,10 +13,21 @@ const index_js_1 = require("./jsonRpc/index.js");
13
13
  */
14
14
  class ClientPublicTestnet extends index_js_1.ClientJsonRpc {
15
15
  constructor(config) {
16
+ const hasWebSocket = typeof isomorphic_ws_1.default !== "undefined";
16
17
  super(config?.url ??
17
- (typeof isomorphic_ws_1.default !== "undefined"
18
+ (hasWebSocket
18
19
  ? "wss://testnet.ckb.dev/ws"
19
- : "https://testnet.ckb.dev/"), config);
20
+ : "https://testnet.ckb.dev/"), {
21
+ ...config,
22
+ fallbacks: config?.fallbacks ??
23
+ (hasWebSocket
24
+ ? [
25
+ "wss://testnet.ckb.dev/ws",
26
+ "https://testnet.ckb.dev/",
27
+ "https://testnet.ckbapp.dev/",
28
+ ]
29
+ : ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
30
+ });
20
31
  this.config = config;
21
32
  }
22
33
  get scripts() {
@@ -1,5 +1,6 @@
1
1
  import { JsonRpcPayload, Transport } from "./transports/advanced.js";
2
2
  export type RequestorJsonRpcConfig = {
3
+ fallbacks?: string[];
3
4
  timeout?: number;
4
5
  maxConcurrent?: number;
5
6
  transport?: Transport;
@@ -1 +1 @@
1
- {"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAMnE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
1
+ {"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAanE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
@@ -35,7 +35,9 @@ class RequestorJsonRpc {
35
35
  this.pending = [];
36
36
  this.id = 0;
37
37
  this.maxConcurrent = config?.maxConcurrent;
38
- this.transport = config?.transport ?? (0, advanced_js_1.transportFromUri)(url_, config);
38
+ this.transport =
39
+ config?.transport ??
40
+ new advanced_js_1.TransportFallback(Array.from(new Set([url_, ...(config?.fallbacks ?? [])]).values(), (url) => (0, advanced_js_1.transportFromUri)(url, config)));
39
41
  }
40
42
  /**
41
43
  * Returns the URL of the JSON-RPC server.
@@ -1,4 +1,5 @@
1
1
  export * from "./factory.js";
2
+ export * from "./fallback.js";
2
3
  export * from "./http.js";
3
4
  export * from "./transport.js";
4
5
  export * from "./webSocket.js";
@@ -1 +1 @@
1
- {"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./factory.js"), exports);
18
+ __exportStar(require("./fallback.js"), exports);
18
19
  __exportStar(require("./http.js"), exports);
19
20
  __exportStar(require("./transport.js"), exports);
20
21
  __exportStar(require("./webSocket.js"), exports);
@@ -0,0 +1,8 @@
1
+ import { JsonRpcPayload, Transport } from "./transport.js";
2
+ export declare class TransportFallback implements Transport {
3
+ private readonly transports;
4
+ private i;
5
+ constructor(transports: Transport[]);
6
+ request(data: JsonRpcPayload): Promise<unknown>;
7
+ }
8
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,qBAAa,iBAAkB,YAAW,SAAS;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,CAAC,CAAK;gBAEe,UAAU,EAAE,SAAS,EAAE;IAE9C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAkBtD"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransportFallback = void 0;
4
+ class TransportFallback {
5
+ constructor(transports) {
6
+ this.transports = transports;
7
+ // Current transport index
8
+ this.i = 0;
9
+ }
10
+ async request(data) {
11
+ let triedCount = 0;
12
+ while (true) {
13
+ try {
14
+ return await this.transports[this.i % this.transports.length].request(data);
15
+ }
16
+ catch (err) {
17
+ triedCount += 1;
18
+ this.i += 1;
19
+ if (triedCount >= this.transports.length) {
20
+ throw err;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
26
+ exports.TransportFallback = TransportFallback;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckb-ccc/core",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Core of CCC - CKBer's Codebase",
5
5
  "author": "Hanssen0 <hanssen0@hanssen0.com>",
6
6
  "license": "MIT",
@@ -57,7 +57,7 @@
57
57
  "access": "public"
58
58
  },
59
59
  "dependencies": {
60
- "@joyid/ckb": "^1.0.1",
60
+ "@joyid/ckb": "^1.1.0",
61
61
  "@noble/ciphers": "^0.5.3",
62
62
  "@noble/curves": "^1.4.2",
63
63
  "@noble/hashes": "^1.4.0",
@@ -13,12 +13,29 @@ export class ClientPublicMainnet extends ClientJsonRpc {
13
13
  scripts?: Record<KnownScript, ScriptInfoLike | undefined>;
14
14
  },
15
15
  ) {
16
+ const hasWebSocket = typeof WebSocket !== "undefined";
16
17
  super(
17
18
  config?.url ??
18
- (typeof WebSocket !== "undefined"
19
+ (hasWebSocket
19
20
  ? "wss://mainnet.ckb.dev/ws"
20
21
  : "https://mainnet.ckb.dev/"),
21
- config,
22
+ {
23
+ ...config,
24
+ fallbacks:
25
+ config?.fallbacks ??
26
+ (hasWebSocket
27
+ ? [
28
+ "wss://mainnet.ckb.dev/ws",
29
+ "https://mainnet.ckb.dev/",
30
+ "https://mainnet.ckbapp.dev/",
31
+ "https://rpc.ankr.com/nervos_ckb",
32
+ ]
33
+ : [
34
+ "https://mainnet.ckb.dev/",
35
+ "https://mainnet.ckbapp.dev/",
36
+ "https://rpc.ankr.com/nervos_ckb",
37
+ ]),
38
+ },
22
39
  );
23
40
  }
24
41
 
@@ -13,12 +13,24 @@ export class ClientPublicTestnet extends ClientJsonRpc {
13
13
  scripts?: Record<KnownScript, ScriptInfoLike | undefined>;
14
14
  },
15
15
  ) {
16
+ const hasWebSocket = typeof WebSocket !== "undefined";
16
17
  super(
17
18
  config?.url ??
18
- (typeof WebSocket !== "undefined"
19
+ (hasWebSocket
19
20
  ? "wss://testnet.ckb.dev/ws"
20
21
  : "https://testnet.ckb.dev/"),
21
- config,
22
+ {
23
+ ...config,
24
+ fallbacks:
25
+ config?.fallbacks ??
26
+ (hasWebSocket
27
+ ? [
28
+ "wss://testnet.ckb.dev/ws",
29
+ "https://testnet.ckb.dev/",
30
+ "https://testnet.ckbapp.dev/",
31
+ ]
32
+ : ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
33
+ },
22
34
  );
23
35
  }
24
36
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  JsonRpcPayload,
3
3
  Transport,
4
+ TransportFallback,
4
5
  transportFromUri,
5
6
  } from "./transports/advanced.js";
6
7
 
@@ -25,6 +26,7 @@ function transform(value: unknown, transformer?: (i: unknown) => unknown) {
25
26
  }
26
27
 
27
28
  export type RequestorJsonRpcConfig = {
29
+ fallbacks?: string[];
28
30
  timeout?: number;
29
31
  maxConcurrent?: number;
30
32
  transport?: Transport;
@@ -51,7 +53,14 @@ export class RequestorJsonRpc {
51
53
  private readonly onError?: (err: unknown) => Promise<void> | void,
52
54
  ) {
53
55
  this.maxConcurrent = config?.maxConcurrent;
54
- this.transport = config?.transport ?? transportFromUri(url_, config);
56
+ this.transport =
57
+ config?.transport ??
58
+ new TransportFallback(
59
+ Array.from(
60
+ new Set([url_, ...(config?.fallbacks ?? [])]).values(),
61
+ (url) => transportFromUri(url, config),
62
+ ),
63
+ );
55
64
  }
56
65
 
57
66
  /**
@@ -1,4 +1,5 @@
1
1
  export * from "./factory.js";
2
+ export * from "./fallback.js";
2
3
  export * from "./http.js";
3
4
  export * from "./transport.js";
4
5
  export * from "./webSocket.js";
@@ -0,0 +1,27 @@
1
+ import { JsonRpcPayload, Transport } from "./transport.js";
2
+
3
+ export class TransportFallback implements Transport {
4
+ // Current transport index
5
+ private i = 0;
6
+
7
+ constructor(private readonly transports: Transport[]) {}
8
+
9
+ async request(data: JsonRpcPayload): Promise<unknown> {
10
+ let triedCount = 0;
11
+
12
+ while (true) {
13
+ try {
14
+ return await this.transports[this.i % this.transports.length].request(
15
+ data,
16
+ );
17
+ } catch (err) {
18
+ triedCount += 1;
19
+ this.i += 1;
20
+
21
+ if (triedCount >= this.transports.length) {
22
+ throw err;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }