@polkadot-api/ws-provider 0.4.1 → 0.6.0

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 (40) hide show
  1. package/dist/index/esm/default-provider.mjs +153 -0
  2. package/dist/index/esm/default-provider.mjs.map +1 -0
  3. package/dist/index/esm/follow-enhancer.mjs +82 -0
  4. package/dist/index/esm/follow-enhancer.mjs.map +1 -0
  5. package/dist/index/esm/index.mjs +3 -0
  6. package/dist/index/esm/index.mjs.map +1 -0
  7. package/dist/{node/esm/types.mjs → index/esm/types-common.mjs} +1 -1
  8. package/dist/index/esm/types-common.mjs.map +1 -0
  9. package/dist/index/index.d.ts +47 -0
  10. package/dist/index/index.js +242 -0
  11. package/dist/index/index.js.map +1 -0
  12. package/dist/node/esm/default-provider.mjs +153 -0
  13. package/dist/node/esm/default-provider.mjs.map +1 -0
  14. package/dist/node/esm/legacy-provider.mjs +42 -0
  15. package/dist/node/esm/legacy-provider.mjs.map +1 -0
  16. package/dist/node/esm/node.mjs +3 -3
  17. package/dist/node/esm/node.mjs.map +1 -1
  18. package/dist/{web/esm/types.mjs → node/esm/types-common.mjs} +1 -1
  19. package/dist/node/esm/types-common.mjs.map +1 -0
  20. package/dist/node/node.d.ts +6 -0
  21. package/dist/node/node.js +156 -117
  22. package/dist/node/node.js.map +1 -1
  23. package/dist/web/esm/default-provider.mjs +153 -0
  24. package/dist/web/esm/default-provider.mjs.map +1 -0
  25. package/dist/web/esm/legacy-provider.mjs +42 -0
  26. package/dist/web/esm/legacy-provider.mjs.map +1 -0
  27. package/dist/web/esm/types-common.mjs +10 -0
  28. package/dist/web/esm/types-common.mjs.map +1 -0
  29. package/dist/web/esm/web.mjs +3 -3
  30. package/dist/web/esm/web.mjs.map +1 -1
  31. package/dist/web/web.d.ts +6 -0
  32. package/dist/web/web.js +156 -117
  33. package/dist/web/web.js.map +1 -1
  34. package/package.json +13 -4
  35. package/dist/node/esm/types.mjs.map +0 -1
  36. package/dist/node/esm/ws-provider.mjs +0 -152
  37. package/dist/node/esm/ws-provider.mjs.map +0 -1
  38. package/dist/web/esm/types.mjs.map +0 -1
  39. package/dist/web/esm/ws-provider.mjs +0 -152
  40. package/dist/web/esm/ws-provider.mjs.map +0 -1
@@ -0,0 +1,153 @@
1
+ import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy';
2
+ import { WsEvent } from './types-common.mjs';
3
+ import { followEnhancer } from './follow-enhancer.mjs';
4
+
5
+ const timeoutError = {
6
+ type: WsEvent.ERROR,
7
+ event: { type: "timeout" }
8
+ };
9
+ const noop = () => {
10
+ };
11
+ const defaultConfig = {
12
+ onStatusChanged: noop,
13
+ innerEnhancer: (x) => x,
14
+ timeout: 5e3
15
+ };
16
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
17
+ const getWsProvider = (endpoints, config) => {
18
+ const { onStatusChanged, innerEnhancer, timeout } = {
19
+ ...defaultConfig,
20
+ ...config
21
+ };
22
+ const actualEndpoints = mapEndpoints(
23
+ Array.isArray(endpoints) ? endpoints : [endpoints]
24
+ );
25
+ const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket;
26
+ if (!WebsocketClass) throw new Error("Missing WebSocket class");
27
+ let idx = 0;
28
+ let status;
29
+ let switchTo = null;
30
+ let disconnect = noop;
31
+ let outerCleanup = noop;
32
+ const result = followEnhancer(
33
+ getSyncProvider(async () => {
34
+ const [uri, protocols] = switchTo || actualEndpoints[idx++ % endpoints.length];
35
+ switchTo = null;
36
+ const socket = new WebsocketClass(uri, protocols);
37
+ const forceSocketClose = () => {
38
+ try {
39
+ socket.addEventListener("error", noop, { once: true });
40
+ socket.close();
41
+ } catch {
42
+ }
43
+ };
44
+ onStatusChanged(
45
+ status = {
46
+ type: WsEvent.CONNECTING,
47
+ uri,
48
+ protocols
49
+ }
50
+ );
51
+ await new Promise((resolve, reject) => {
52
+ const onOpen = () => {
53
+ initialCleanup();
54
+ resolve();
55
+ };
56
+ const onError = (e) => {
57
+ initialCleanup();
58
+ if (e == null) forceSocketClose();
59
+ console.error(
60
+ `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
61
+ );
62
+ onStatusChanged(
63
+ status = {
64
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
65
+ event: e
66
+ }
67
+ );
68
+ setTimeout(reject, e ? 300 : 0, e);
69
+ };
70
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
71
+ initialCleanup();
72
+ forceSocketClose();
73
+ onStatusChanged(status = timeoutError);
74
+ reject(timeoutError.event);
75
+ }, timeout) : void 0;
76
+ const initialCleanup = () => {
77
+ clearTimeout(timeoutToken);
78
+ socket.removeEventListener("error", onError);
79
+ socket.removeEventListener("open", onOpen);
80
+ };
81
+ socket.addEventListener("open", onOpen);
82
+ socket.addEventListener("error", onError);
83
+ disconnect = () => {
84
+ onError(null);
85
+ };
86
+ });
87
+ onStatusChanged(
88
+ status = {
89
+ type: WsEvent.CONNECTED,
90
+ uri,
91
+ protocols
92
+ }
93
+ );
94
+ let _onInnerMessage;
95
+ const inner = innerEnhancer((onInnerMessage) => {
96
+ _onInnerMessage = onInnerMessage;
97
+ return {
98
+ send: (m) => {
99
+ socket.send(m);
100
+ },
101
+ disconnect: () => {
102
+ disconnect();
103
+ }
104
+ };
105
+ });
106
+ return (onMessage, onHalt) => {
107
+ const connection = inner(onMessage);
108
+ const _onMessage = (e) => {
109
+ if (typeof e.data === "string") _onInnerMessage(e.data);
110
+ };
111
+ const innerHalt = (reason) => (e) => {
112
+ console.warn(`WS halt (${reason})`);
113
+ onStatusChanged(
114
+ status = {
115
+ type: reason,
116
+ event: e
117
+ }
118
+ );
119
+ onHalt();
120
+ };
121
+ const onError = innerHalt(WsEvent.ERROR);
122
+ const onClose = innerHalt(WsEvent.CLOSE);
123
+ socket.addEventListener("message", _onMessage);
124
+ socket.addEventListener("error", onError);
125
+ socket.addEventListener("close", onClose);
126
+ disconnect = (withHalt) => {
127
+ outerCleanup();
128
+ disconnect = noop;
129
+ socket.removeEventListener("message", _onMessage);
130
+ socket.removeEventListener("error", onError);
131
+ socket.removeEventListener("close", onClose);
132
+ forceSocketClose();
133
+ if (withHalt) onClose({});
134
+ };
135
+ return connection;
136
+ };
137
+ }),
138
+ () => {
139
+ switchFn();
140
+ }
141
+ );
142
+ outerCleanup = result.cleanup;
143
+ delete result.cleanup;
144
+ const switchFn = (...args) => {
145
+ if (status.type === WsEvent.CLOSE) return;
146
+ if (args.length) switchTo = args;
147
+ if (status.type !== WsEvent.ERROR) disconnect(true);
148
+ };
149
+ return Object.assign(result, { switch: switchFn, getStatus: () => status });
150
+ };
151
+
152
+ export { defaultConfig, getWsProvider, mapEndpoints, noop };
153
+ //# sourceMappingURL=default-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { mapEndpoints, noop, defaultConfig, getWsProvider } from './default-provider.mjs';
2
+
3
+ const getLegacyWsProvider = (websocketClass) => {
4
+ return (...args) => {
5
+ let endpoints = [];
6
+ let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
7
+ const [firstArg] = args;
8
+ if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
9
+ endpoints = mapEndpoints(firstArg.endpoints);
10
+ onStatusChanged = firstArg.onStatusChanged ?? noop;
11
+ timeout = firstArg.timeout ?? timeout;
12
+ innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
13
+ } else {
14
+ if (typeof args[1] === "function")
15
+ onStatusChanged = args[1];
16
+ if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
17
+ else {
18
+ endpoints = [[firstArg]];
19
+ if (args[1] && args[1] !== onStatusChanged)
20
+ endpoints[0][1] = args[1];
21
+ if (args[2]) onStatusChanged = args[2];
22
+ }
23
+ }
24
+ return getWsProvider(
25
+ endpoints.map(
26
+ (x) => x.length === 1 ? x[0] : {
27
+ uri: x[0],
28
+ protocol: x[1]
29
+ }
30
+ ),
31
+ {
32
+ websocketClass,
33
+ onStatusChanged,
34
+ timeout,
35
+ innerEnhancer
36
+ }
37
+ );
38
+ };
39
+ };
40
+
41
+ export { getLegacyWsProvider };
42
+ //# sourceMappingURL=legacy-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-provider.mjs","sources":["../../../src/legacy-provider.ts"],"sourcesContent":["import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { timeout, innerEnhancer, onStatusChanged } = defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n },\n )\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAA,GAAsB,CACjC,cAAA,KACuB;AACvB,EAAA,OAAO,IAAI,IAAA,KAA4B;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,EAAE,OAAA,EAAS,aAAA,EAAe,eAAA,EAAgB,GAAI,aAAA;AAElD,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAA;AACnB,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,SAAA,GAAY,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAA,IAAW,OAAA;AAC9B,MAAA,aAAA,GAAgB,QAAA,CAAS,aAAA,KAAkB,CAAC,CAAA,KAAM,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAA,SAAA,GAAY,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACb,CAAA,CAAE,WAAW,CAAA,GACT,CAAA,CAAE,CAAC,CAAA,GACH;AAAA,UACE,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,UACR,QAAA,EAAU,EAAE,CAAC;AAAA;AACf,OACN;AAAA,MACA;AAAA,QACE,cAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;;;;"}
@@ -1,13 +1,13 @@
1
1
  import { WebSocket } from 'ws';
2
- import { getInternalWsProvider } from './ws-provider.mjs';
3
- export { WsEvent } from './types.mjs';
2
+ import { getLegacyWsProvider } from './legacy-provider.mjs';
3
+ export { WsEvent } from './types-common.mjs';
4
4
 
5
5
  class WS extends WebSocket {
6
6
  close() {
7
7
  this.terminate();
8
8
  }
9
9
  }
10
- const getWsProvider = getInternalWsProvider(
10
+ const getWsProvider = getLegacyWsProvider(
11
11
  WS
12
12
  );
13
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"node.mjs","sources":["../../../src/node.ts"],"sourcesContent":["import { WebSocket } from \"ws\"\nimport { getInternalWsProvider } from \"./ws-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\nexport const getWsProvider = getInternalWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":[],"mappings":";;;;AAMA,MAAM,WAAW,SAAA,CAAU;AAAA,EACzB,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AACF;AAEO,MAAM,aAAA,GAAgB,qBAAA;AAAA,EAC3B;AACF;;;;"}
1
+ {"version":3,"file":"node.mjs","sources":["../../../src/node.ts"],"sourcesContent":["import { WebSocket } from \"ws\"\nimport { getLegacyWsProvider } from \"./legacy-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types-common\"\nexport * from \"./types-legacy\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\n/**\n * @deprecated This export will be removed in PAPI v2. Migrate as follows:\n * `import { getWsProvider } from \"polkadot-api/ws-provider\"\n */\nexport const getWsProvider = getLegacyWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":[],"mappings":";;;;AAOA,MAAM,WAAW,SAAA,CAAU;AAAA,EACzB,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AACF;AAMO,MAAM,aAAA,GAAgB,mBAAA;AAAA,EAC3B;AACF;;;;"}
@@ -7,4 +7,4 @@ var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
7
7
  })(WsEvent || {});
8
8
 
9
9
  export { WsEvent };
10
- //# sourceMappingURL=types.mjs.map
10
+ //# sourceMappingURL=types-common.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-common.mjs","sources":["../../../src/types-common.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n"],"names":["WsEvent"],"mappings":"AAEO,IAAK,OAAA,qBAAAA,QAAAA,KAAL;AACL,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAJU,EAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;;;"}
@@ -30,6 +30,7 @@ type WsJsonRpcProvider = JsonRpcProvider & {
30
30
  switch: (uri?: string, protocol?: string[]) => void;
31
31
  getStatus: () => StatusChange;
32
32
  };
33
+
33
34
  interface WsProviderConfig {
34
35
  endpoints: Array<string | {
35
36
  uri: string;
@@ -37,6 +38,7 @@ interface WsProviderConfig {
37
38
  }>;
38
39
  onStatusChanged?: (status: StatusChange) => void;
39
40
  timeout?: number;
41
+ innerEnhancer?: (input: JsonRpcProvider) => JsonRpcProvider;
40
42
  }
41
43
  interface GetWsProviderInput {
42
44
  (uri: string, protocols?: string | string[], onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
@@ -48,6 +50,10 @@ interface GetWsProviderInput {
48
50
  (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider;
49
51
  }
50
52
 
53
+ /**
54
+ * @deprecated This export will be removed in PAPI v2. Migrate as follows:
55
+ * `import { getWsProvider } from "polkadot-api/ws-provider"
56
+ */
51
57
  declare const getWsProvider: GetWsProviderInput;
52
58
 
53
59
  export { WsEvent, getWsProvider };
package/dist/node/node.js CHANGED
@@ -97,17 +97,157 @@ const timeoutError = {
97
97
  };
98
98
  const noop = () => {
99
99
  };
100
+ const defaultConfig = {
101
+ onStatusChanged: noop,
102
+ innerEnhancer: (x) => x,
103
+ timeout: 5e3
104
+ };
100
105
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
101
- const getInternalWsProvider = (WebsocketClass) => {
106
+ const getWsProvider$1 = (endpoints, config) => {
107
+ const { onStatusChanged, innerEnhancer, timeout } = {
108
+ ...defaultConfig,
109
+ ...config
110
+ };
111
+ const actualEndpoints = mapEndpoints(
112
+ Array.isArray(endpoints) ? endpoints : [endpoints]
113
+ );
114
+ const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket;
115
+ if (!WebsocketClass) throw new Error("Missing WebSocket class");
116
+ let idx = 0;
117
+ let status;
118
+ let switchTo = null;
119
+ let disconnect = noop;
120
+ let outerCleanup = noop;
121
+ const result = followEnhancer(
122
+ jsonRpcProviderProxy.getSyncProvider(async () => {
123
+ const [uri, protocols] = switchTo || actualEndpoints[idx++ % endpoints.length];
124
+ switchTo = null;
125
+ const socket = new WebsocketClass(uri, protocols);
126
+ const forceSocketClose = () => {
127
+ try {
128
+ socket.addEventListener("error", noop, { once: true });
129
+ socket.close();
130
+ } catch {
131
+ }
132
+ };
133
+ onStatusChanged(
134
+ status = {
135
+ type: WsEvent.CONNECTING,
136
+ uri,
137
+ protocols
138
+ }
139
+ );
140
+ await new Promise((resolve, reject) => {
141
+ const onOpen = () => {
142
+ initialCleanup();
143
+ resolve();
144
+ };
145
+ const onError = (e) => {
146
+ initialCleanup();
147
+ if (e == null) forceSocketClose();
148
+ console.error(
149
+ `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
150
+ );
151
+ onStatusChanged(
152
+ status = {
153
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
154
+ event: e
155
+ }
156
+ );
157
+ setTimeout(reject, e ? 300 : 0, e);
158
+ };
159
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
160
+ initialCleanup();
161
+ forceSocketClose();
162
+ onStatusChanged(status = timeoutError);
163
+ reject(timeoutError.event);
164
+ }, timeout) : void 0;
165
+ const initialCleanup = () => {
166
+ clearTimeout(timeoutToken);
167
+ socket.removeEventListener("error", onError);
168
+ socket.removeEventListener("open", onOpen);
169
+ };
170
+ socket.addEventListener("open", onOpen);
171
+ socket.addEventListener("error", onError);
172
+ disconnect = () => {
173
+ onError(null);
174
+ };
175
+ });
176
+ onStatusChanged(
177
+ status = {
178
+ type: WsEvent.CONNECTED,
179
+ uri,
180
+ protocols
181
+ }
182
+ );
183
+ let _onInnerMessage;
184
+ const inner = innerEnhancer((onInnerMessage) => {
185
+ _onInnerMessage = onInnerMessage;
186
+ return {
187
+ send: (m) => {
188
+ socket.send(m);
189
+ },
190
+ disconnect: () => {
191
+ disconnect();
192
+ }
193
+ };
194
+ });
195
+ return (onMessage, onHalt) => {
196
+ const connection = inner(onMessage);
197
+ const _onMessage = (e) => {
198
+ if (typeof e.data === "string") _onInnerMessage(e.data);
199
+ };
200
+ const innerHalt = (reason) => (e) => {
201
+ console.warn(`WS halt (${reason})`);
202
+ onStatusChanged(
203
+ status = {
204
+ type: reason,
205
+ event: e
206
+ }
207
+ );
208
+ onHalt();
209
+ };
210
+ const onError = innerHalt(WsEvent.ERROR);
211
+ const onClose = innerHalt(WsEvent.CLOSE);
212
+ socket.addEventListener("message", _onMessage);
213
+ socket.addEventListener("error", onError);
214
+ socket.addEventListener("close", onClose);
215
+ disconnect = (withHalt) => {
216
+ outerCleanup();
217
+ disconnect = noop;
218
+ socket.removeEventListener("message", _onMessage);
219
+ socket.removeEventListener("error", onError);
220
+ socket.removeEventListener("close", onClose);
221
+ forceSocketClose();
222
+ if (withHalt) onClose({});
223
+ };
224
+ return connection;
225
+ };
226
+ }),
227
+ () => {
228
+ switchFn();
229
+ }
230
+ );
231
+ outerCleanup = result.cleanup;
232
+ delete result.cleanup;
233
+ const switchFn = (...args) => {
234
+ if (status.type === WsEvent.CLOSE) return;
235
+ if (args.length) switchTo = args;
236
+ if (status.type !== WsEvent.ERROR) disconnect(true);
237
+ };
238
+ return Object.assign(result, { switch: switchFn, getStatus: () => status });
239
+ };
240
+
241
+ const getLegacyWsProvider = (websocketClass) => {
102
242
  return (...args) => {
103
243
  let endpoints = [];
104
- let onStatusChanged = noop;
105
- let timeout = 3500;
244
+ let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
106
245
  const [firstArg] = args;
107
246
  if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
108
247
  endpoints = mapEndpoints(firstArg.endpoints);
109
248
  onStatusChanged = firstArg.onStatusChanged ?? noop;
110
249
  timeout = firstArg.timeout ?? timeout;
250
+ innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
111
251
  } else {
112
252
  if (typeof args[1] === "function")
113
253
  onStatusChanged = args[1];
@@ -119,121 +259,20 @@ const getInternalWsProvider = (WebsocketClass) => {
119
259
  if (args[2]) onStatusChanged = args[2];
120
260
  }
121
261
  }
122
- let idx = 0;
123
- let status;
124
- let switchTo = null;
125
- let disconnect = noop;
126
- let outerCleanup = noop;
127
- const result = followEnhancer(
128
- jsonRpcProviderProxy.getSyncProvider(async () => {
129
- const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
130
- switchTo = null;
131
- const socket = new WebsocketClass(uri, protocols);
132
- const forceSocketClose = () => {
133
- try {
134
- socket.addEventListener("error", noop, { once: true });
135
- socket.close();
136
- } catch {
137
- }
138
- };
139
- onStatusChanged(
140
- status = {
141
- type: WsEvent.CONNECTING,
142
- uri,
143
- protocols
144
- }
145
- );
146
- await new Promise((resolve, reject) => {
147
- const onOpen = () => {
148
- initialCleanup();
149
- resolve();
150
- };
151
- const onError = (e) => {
152
- initialCleanup();
153
- if (e == null) forceSocketClose();
154
- console.error(
155
- `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
156
- );
157
- onStatusChanged(
158
- status = {
159
- type: e ? WsEvent.ERROR : WsEvent.CLOSE,
160
- event: e
161
- }
162
- );
163
- setTimeout(reject, e ? 300 : 0, e);
164
- };
165
- const timeoutToken = timeout !== Infinity ? setTimeout(() => {
166
- initialCleanup();
167
- forceSocketClose();
168
- onStatusChanged(status = timeoutError);
169
- reject(timeoutError.event);
170
- }, timeout) : void 0;
171
- const initialCleanup = () => {
172
- clearTimeout(timeoutToken);
173
- socket.removeEventListener("error", onError);
174
- socket.removeEventListener("open", onOpen);
175
- };
176
- socket.addEventListener("open", onOpen);
177
- socket.addEventListener("error", onError);
178
- disconnect = () => {
179
- onError(null);
180
- };
181
- });
182
- onStatusChanged(
183
- status = {
184
- type: WsEvent.CONNECTED,
185
- uri,
186
- protocols
187
- }
188
- );
189
- return (onMessage, onHalt) => {
190
- const _onMessage = (e) => {
191
- if (typeof e.data === "string") onMessage(e.data);
192
- };
193
- const innerHalt = (reason) => (e) => {
194
- console.warn(`WS halt (${reason})`);
195
- onStatusChanged(
196
- status = {
197
- type: reason,
198
- event: e
199
- }
200
- );
201
- onHalt();
202
- };
203
- const onError = innerHalt(WsEvent.ERROR);
204
- const onClose = innerHalt(WsEvent.CLOSE);
205
- socket.addEventListener("message", _onMessage);
206
- socket.addEventListener("error", onError);
207
- socket.addEventListener("close", onClose);
208
- disconnect = (withHalt) => {
209
- outerCleanup();
210
- disconnect = noop;
211
- socket.removeEventListener("message", _onMessage);
212
- socket.removeEventListener("error", onError);
213
- socket.removeEventListener("close", onClose);
214
- forceSocketClose();
215
- if (withHalt) onClose({});
216
- };
217
- return {
218
- send: (msg) => {
219
- socket.send(msg);
220
- },
221
- disconnect
222
- };
223
- };
224
- }),
225
- () => {
226
- switchFn();
262
+ return getWsProvider$1(
263
+ endpoints.map(
264
+ (x) => x.length === 1 ? x[0] : {
265
+ uri: x[0],
266
+ protocol: x[1]
267
+ }
268
+ ),
269
+ {
270
+ websocketClass,
271
+ onStatusChanged,
272
+ timeout,
273
+ innerEnhancer
227
274
  }
228
275
  );
229
- outerCleanup = result.cleanup;
230
- delete result.cleanup;
231
- const switchFn = (...args2) => {
232
- if (status.type === WsEvent.CLOSE) return;
233
- if (args2.length) switchTo = args2;
234
- if (status.type !== WsEvent.ERROR) disconnect(true);
235
- };
236
- return Object.assign(result, { switch: switchFn, getStatus: () => status });
237
276
  };
238
277
  };
239
278
 
@@ -242,7 +281,7 @@ class WS extends ws.WebSocket {
242
281
  this.terminate();
243
282
  }
244
283
  }
245
- const getWsProvider = getInternalWsProvider(
284
+ const getWsProvider = getLegacyWsProvider(
246
285
  WS
247
286
  );
248
287