@polkadot-api/ws-provider 0.3.1 → 0.3.3

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.
@@ -1,12 +1,15 @@
1
1
  import { WebSocket } from 'ws';
2
2
  import { getInternalWsProvider } from './ws-provider.mjs';
3
+ export { WsEvent } from './types.mjs';
3
4
 
4
5
  class WS extends WebSocket {
5
6
  close() {
6
7
  this.terminate();
7
8
  }
8
9
  }
9
- const getWsProvider = getInternalWsProvider(WS);
10
+ const getWsProvider = getInternalWsProvider(
11
+ WS
12
+ );
10
13
 
11
14
  export { getWsProvider };
12
15
  //# sourceMappingURL=node.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.mjs","sources":["../../../src/node.ts"],"sourcesContent":["// @ts-ignore\nimport { WebSocket } from \"ws\"\nimport { getInternalWsProvider } from \"./ws-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nclass WS extends WebSocket {\n close() {\n ;(this as any).terminate()\n }\n}\n\nexport const getWsProvider = getInternalWsProvider(WS as any)\n"],"names":[],"mappings":";;;AAKA,MAAM,WAAW,SAAU,CAAA;AAAA,EACzB,KAAQ,GAAA;AACL,IAAC,KAAa,SAAU,EAAA,CAAA;AAAA,GAC3B;AACF,CAAA;AAEa,MAAA,aAAA,GAAgB,sBAAsB,EAAS;;;;"}
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,SAAU,CAAA;AAAA,EACzB,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,SAAU,EAAA;AAAA;AAEnB;AAEO,MAAM,aAAgB,GAAA,qBAAA;AAAA,EAC3B;AACF;;;;"}
@@ -0,0 +1,10 @@
1
+ var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
2
+ WsEvent2[WsEvent2["CONNECTING"] = 0] = "CONNECTING";
3
+ WsEvent2[WsEvent2["CONNECTED"] = 1] = "CONNECTED";
4
+ WsEvent2[WsEvent2["ERROR"] = 2] = "ERROR";
5
+ WsEvent2[WsEvent2["CLOSE"] = 3] = "CLOSE";
6
+ return WsEvent2;
7
+ })(WsEvent || {});
8
+
9
+ export { WsEvent };
10
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","sources":["../../../src/types.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}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n"],"names":["WsEvent"],"mappings":"AAEY,IAAA,OAAA,qBAAAA,QAAL,KAAA;AACL,EAAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAJU,EAAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;;;"}
@@ -1,25 +1,33 @@
1
1
  import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy';
2
+ import { WsEvent } from './types.mjs';
2
3
 
3
4
  const timeoutError = {
4
- type: 2 /* ERROR */,
5
+ type: WsEvent.ERROR,
5
6
  event: { type: "timeout" }
6
7
  };
7
8
  const noop = () => {
8
9
  };
10
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
9
11
  const getInternalWsProvider = (WebsocketClass) => {
10
12
  return (...args) => {
11
13
  let endpoints = [];
12
14
  let onStatusChanged = noop;
13
- if (typeof args[1] === "function") onStatusChanged = args[1];
14
- if (Array.isArray(args[0]))
15
- endpoints = args[0].map(
16
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
17
- );
18
- else {
19
- endpoints = [[args[0]]];
20
- if (args[1] && args[1] !== onStatusChanged)
21
- endpoints[0][1] = args[1];
22
- if (args[2]) onStatusChanged = args[2];
15
+ let timeout = 3500;
16
+ const [firstArg] = args;
17
+ if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
18
+ endpoints = mapEndpoints(firstArg.endpoints);
19
+ onStatusChanged = firstArg.onStatusChanged ?? noop;
20
+ timeout = firstArg.timeout ?? timeout;
21
+ } else {
22
+ if (typeof args[1] === "function")
23
+ onStatusChanged = args[1];
24
+ if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
25
+ else {
26
+ endpoints = [[firstArg]];
27
+ if (args[1] && args[1] !== onStatusChanged)
28
+ endpoints[0][1] = args[1];
29
+ if (args[2]) onStatusChanged = args[2];
30
+ }
23
31
  }
24
32
  let idx = 0;
25
33
  let status;
@@ -29,37 +37,45 @@ const getInternalWsProvider = (WebsocketClass) => {
29
37
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
30
38
  switchTo = null;
31
39
  const socket = new WebsocketClass(uri, protocols);
40
+ const forceSocketClose = () => {
41
+ try {
42
+ socket.close();
43
+ } catch {
44
+ }
45
+ };
32
46
  onStatusChanged(
33
47
  status = {
34
- type: 0 /* CONNECTING */,
48
+ type: WsEvent.CONNECTING,
35
49
  uri,
36
50
  protocols
37
51
  }
38
52
  );
39
53
  await new Promise((resolve, reject) => {
40
54
  const onOpen = () => {
41
- cleanup();
55
+ initialCleanup();
42
56
  resolve();
43
57
  };
44
58
  const onError = (e) => {
45
- cleanup();
59
+ initialCleanup();
60
+ if (e == null) forceSocketClose();
46
61
  console.error(
47
62
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
48
63
  );
49
64
  onStatusChanged(
50
65
  status = {
51
- type: e ? 2 /* ERROR */ : 3 /* CLOSE */,
66
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
52
67
  event: e
53
68
  }
54
69
  );
55
70
  setTimeout(reject, e ? 300 : 0, e);
56
71
  };
57
- const timeoutToken = setTimeout(() => {
58
- cleanup();
72
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
73
+ initialCleanup();
74
+ forceSocketClose();
59
75
  onStatusChanged(status = timeoutError);
60
76
  reject(timeoutError.event);
61
- }, 3500);
62
- const cleanup = () => {
77
+ }, timeout) : void 0;
78
+ const initialCleanup = () => {
63
79
  clearTimeout(timeoutToken);
64
80
  socket.removeEventListener("error", onError);
65
81
  socket.removeEventListener("open", onOpen);
@@ -72,7 +88,7 @@ const getInternalWsProvider = (WebsocketClass) => {
72
88
  });
73
89
  onStatusChanged(
74
90
  status = {
75
- type: 1 /* CONNECTED */,
91
+ type: WsEvent.CONNECTED,
76
92
  uri,
77
93
  protocols
78
94
  }
@@ -91,8 +107,8 @@ const getInternalWsProvider = (WebsocketClass) => {
91
107
  );
92
108
  onHalt();
93
109
  };
94
- const onError = innerHalt(2 /* ERROR */);
95
- const onClose = innerHalt(3 /* CLOSE */);
110
+ const onError = innerHalt(WsEvent.ERROR);
111
+ const onClose = innerHalt(WsEvent.CLOSE);
96
112
  socket.addEventListener("message", _onMessage);
97
113
  socket.addEventListener("error", onError);
98
114
  socket.addEventListener("close", onClose);
@@ -101,7 +117,7 @@ const getInternalWsProvider = (WebsocketClass) => {
101
117
  socket.removeEventListener("message", _onMessage);
102
118
  socket.removeEventListener("error", onError);
103
119
  socket.removeEventListener("close", onClose);
104
- socket.close();
120
+ forceSocketClose();
105
121
  if (withHalt) onClose({});
106
122
  };
107
123
  return {
@@ -114,9 +130,9 @@ const getInternalWsProvider = (WebsocketClass) => {
114
130
  });
115
131
  result.getStatus = () => status;
116
132
  result.switch = (...args2) => {
117
- if (status.type === 3 /* CLOSE */) return;
133
+ if (status.type === WsEvent.CLOSE) return;
118
134
  if (args2.length) switchTo = args2;
119
- if (status.type !== 2 /* ERROR */) disconnect(true);
135
+ if (status.type !== WsEvent.ERROR) disconnect(true);
120
136
  };
121
137
  return result;
122
138
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\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}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n}\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n\n if (typeof args[1] === \"function\") onStatusChanged = args[1]\n if (Array.isArray(args[0]))\n endpoints = args[0].map((x) =>\n typeof x === \"string\" ? [x] : [x.uri, x.protocol],\n )\n else {\n endpoints = [[args[0]]]\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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\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 cleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n cleanup()\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 = setTimeout(() => {\n cleanup()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, 3_500)\n const cleanup = () => {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.close()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n"],"names":["args"],"mappings":";;AAiDA,MAAM,YAA6B,GAAA;AAAA,EACjC,IAAM,EAAA,CAAA;AAAA,EACN,KAAA,EAAO,EAAE,IAAA,EAAM,SAAU,EAAA;AAC3B,CAAA,CAAA;AAEA,MAAM,OAAO,MAAM;AAAC,CAAA,CAAA;AACP,MAAA,qBAAA,GAAwB,CACnC,cACuB,KAAA;AACvB,EAAA,OAAO,IAAI,IAA4B,KAAA;AACrC,IAAA,IAAI,YAA2D,EAAC,CAAA;AAChE,IAAA,IAAI,eAAkD,GAAA,IAAA,CAAA;AAEtD,IAAA,IAAI,OAAO,IAAK,CAAA,CAAC,MAAM,UAAY,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA,CAAA;AAC3D,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAC,CAAA;AACvB,MAAY,SAAA,GAAA,IAAA,CAAK,CAAC,CAAE,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,QAAW,GAAA,CAAC,CAAC,CAAA,GAAI,CAAC,CAAA,CAAE,GAAK,EAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,OAClD,CAAA;AAAA,SACG;AACH,MAAA,SAAA,GAAY,CAAC,CAAC,IAAK,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACtB,MAAA,IAAI,IAAK,CAAA,CAAC,CAAK,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,eAAA;AACzB,QAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAC1B,MAAA,IAAI,IAAK,CAAA,CAAC,CAAG,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA,CAAA;AAAA,KACvC;AACA,IAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,IAAI,IAAA,MAAA,CAAA;AACJ,IAAA,IAAI,QAA0D,GAAA,IAAA,CAAA;AAC9D,IAAA,IAAI,UAA2C,GAAA,IAAA,CAAA;AAE/C,IAAM,MAAA,MAAA,GAAS,gBAAgB,YAAY;AACzC,MAAM,MAAA,CAAC,KAAK,SAAS,CAAA,GAAI,YAAY,SAAU,CAAA,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA,CAAA;AACvE,MAAW,QAAA,GAAA,IAAA,CAAA;AACX,MAAA,MAAM,MAAS,GAAA,IAAI,cAAe,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAChD,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,IAAM,EAAA,CAAA;AAAA,UACN,GAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,OACF,CAAA;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,QAAA,MAAM,SAAS,MAAM;AACnB,UAAQ,OAAA,EAAA,CAAA;AACR,UAAQ,OAAA,EAAA,CAAA;AAAA,SACV,CAAA;AAEA,QAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,UAAQ,OAAA,EAAA,CAAA;AACR,UAAQ,OAAA,CAAA,KAAA;AAAA,YACN,wBAAwB,GAAG,CAAA,EACzB,SAAY,GAAA,eAAA,GAAkB,YAAY,EAC5C,CAAA,CAAA;AAAA,WACF,CAAA;AACA,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAA,EAAM,IAAI,CAAgB,eAAA,CAAA;AAAA,cAC1B,KAAO,EAAA,CAAA;AAAA,aACT;AAAA,WACF,CAAA;AACA,UAAA,UAAA,CAAW,MAAQ,EAAA,CAAA,GAAI,GAAM,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,SACnC,CAAA;AAEA,QAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,UAAQ,OAAA,EAAA,CAAA;AACR,UAAA,eAAA,CAAiB,SAAS,YAAa,CAAA,CAAA;AACvC,UAAA,MAAA,CAAO,aAAa,KAAK,CAAA,CAAA;AAAA,WACxB,IAAK,CAAA,CAAA;AACR,QAAA,MAAM,UAAU,MAAM;AACpB,UAAA,YAAA,CAAa,YAAY,CAAA,CAAA;AACzB,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA,CAAA;AAAA,SAC3C,CAAA;AACA,QAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA,CAAA;AACtC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAA,UAAA,GAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,SACd,CAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,IAAM,EAAA,CAAA;AAAA,UACN,GAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,OACF,CAAA;AAEA,MAAO,OAAA,CAAC,WAAW,MAAW,KAAA;AAC5B,QAAM,MAAA,UAAA,GAAa,CAAC,CAAoB,KAAA;AACtC,UAAA,IAAI,OAAO,CAAE,CAAA,IAAA,KAAS,QAAU,EAAA,SAAA,CAAU,EAAE,IAAI,CAAA,CAAA;AAAA,SAClD,CAAA;AACA,QAAA,MAAM,SACJ,GAAA,CAAC,MAA0C,KAAA,CAAC,CAAW,KAAA;AACrD,UAAQ,OAAA,CAAA,IAAA,CAAK,CAAY,SAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAClC,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAM,EAAA,MAAA;AAAA,cACN,KAAO,EAAA,CAAA;AAAA,aACT;AAAA,WACF,CAAA;AACA,UAAO,MAAA,EAAA,CAAA;AAAA,SACT,CAAA;AACF,QAAM,MAAA,OAAA,GAAU,UAAU,CAAa,aAAA,CAAA;AACvC,QAAM,MAAA,OAAA,GAAU,UAAU,CAAa,aAAA,CAAA;AAEvC,QAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,UAAU,CAAA,CAAA;AAC7C,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAA,UAAA,GAAa,CAAC,QAAa,KAAA;AACzB,UAAa,UAAA,GAAA,IAAA,CAAA;AACb,UAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,UAAU,CAAA,CAAA;AAChD,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAA,MAAA,CAAO,KAAM,EAAA,CAAA;AACb,UAAI,IAAA,QAAA,EAAkB,OAAA,CAAA,EAAE,CAAA,CAAA;AAAA,SAC1B,CAAA;AAEA,QAAO,OAAA;AAAA,UACL,IAAA,EAAM,CAAC,GAAQ,KAAA;AACb,YAAA,MAAA,CAAO,KAAK,GAAG,CAAA,CAAA;AAAA,WACjB;AAAA,UACA,UAAA;AAAA,SACF,CAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,MAAA,CAAO,YAAY,MAAM,MAAA,CAAA;AACzB,IAAO,MAAA,CAAA,MAAA,GAAS,IAAIA,KAAS,KAAA;AAC3B,MAAI,IAAA,MAAA,CAAO,SAAS,CAAe,cAAA,OAAA;AACnC,MAAIA,IAAAA,KAAAA,CAAK,QAAmBA,QAAAA,GAAAA,KAAAA,CAAAA;AAC5B,MAAA,IAAI,MAAO,CAAA,IAAA,KAAS,CAAe,cAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,KACpD,CAAA;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\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 } 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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 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 {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n"],"names":["args"],"mappings":"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"}
@@ -30,6 +30,14 @@ type WsJsonRpcProvider = JsonRpcProvider & {
30
30
  switch: (uri?: string, protocol?: string[]) => void;
31
31
  getStatus: () => StatusChange;
32
32
  };
33
+ interface WsProviderConfig {
34
+ endpoints: Array<string | {
35
+ uri: string;
36
+ protocol: string[];
37
+ }>;
38
+ onStatusChanged?: (status: StatusChange) => void;
39
+ timeout?: number;
40
+ }
33
41
  interface GetWsProviderInput {
34
42
  (uri: string, protocols?: string | string[], onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
35
43
  (uri: string, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
@@ -37,8 +45,9 @@ interface GetWsProviderInput {
37
45
  uri: string;
38
46
  protocol: string[];
39
47
  }>, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
48
+ (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider;
40
49
  }
41
50
 
42
51
  declare const getWsProvider: GetWsProviderInput;
43
52
 
44
- export { getWsProvider };
53
+ export { type GetWsProviderInput, type StatusChange, type WsClose, type WsConnected, type WsConnecting, type WsError, WsEvent, type WsJsonRpcProvider, type WsProviderConfig, getWsProvider };
package/dist/node/node.js CHANGED
@@ -3,26 +3,41 @@
3
3
  var ws = require('ws');
4
4
  var jsonRpcProviderProxy = require('@polkadot-api/json-rpc-provider-proxy');
5
5
 
6
+ var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
7
+ WsEvent2[WsEvent2["CONNECTING"] = 0] = "CONNECTING";
8
+ WsEvent2[WsEvent2["CONNECTED"] = 1] = "CONNECTED";
9
+ WsEvent2[WsEvent2["ERROR"] = 2] = "ERROR";
10
+ WsEvent2[WsEvent2["CLOSE"] = 3] = "CLOSE";
11
+ return WsEvent2;
12
+ })(WsEvent || {});
13
+
6
14
  const timeoutError = {
7
- type: 2 /* ERROR */,
15
+ type: WsEvent.ERROR,
8
16
  event: { type: "timeout" }
9
17
  };
10
18
  const noop = () => {
11
19
  };
20
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
12
21
  const getInternalWsProvider = (WebsocketClass) => {
13
22
  return (...args) => {
14
23
  let endpoints = [];
15
24
  let onStatusChanged = noop;
16
- if (typeof args[1] === "function") onStatusChanged = args[1];
17
- if (Array.isArray(args[0]))
18
- endpoints = args[0].map(
19
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
20
- );
21
- else {
22
- endpoints = [[args[0]]];
23
- if (args[1] && args[1] !== onStatusChanged)
24
- endpoints[0][1] = args[1];
25
- if (args[2]) onStatusChanged = args[2];
25
+ let timeout = 3500;
26
+ const [firstArg] = args;
27
+ if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
28
+ endpoints = mapEndpoints(firstArg.endpoints);
29
+ onStatusChanged = firstArg.onStatusChanged ?? noop;
30
+ timeout = firstArg.timeout ?? timeout;
31
+ } else {
32
+ if (typeof args[1] === "function")
33
+ onStatusChanged = args[1];
34
+ if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
35
+ else {
36
+ endpoints = [[firstArg]];
37
+ if (args[1] && args[1] !== onStatusChanged)
38
+ endpoints[0][1] = args[1];
39
+ if (args[2]) onStatusChanged = args[2];
40
+ }
26
41
  }
27
42
  let idx = 0;
28
43
  let status;
@@ -32,37 +47,45 @@ const getInternalWsProvider = (WebsocketClass) => {
32
47
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
33
48
  switchTo = null;
34
49
  const socket = new WebsocketClass(uri, protocols);
50
+ const forceSocketClose = () => {
51
+ try {
52
+ socket.close();
53
+ } catch {
54
+ }
55
+ };
35
56
  onStatusChanged(
36
57
  status = {
37
- type: 0 /* CONNECTING */,
58
+ type: WsEvent.CONNECTING,
38
59
  uri,
39
60
  protocols
40
61
  }
41
62
  );
42
63
  await new Promise((resolve, reject) => {
43
64
  const onOpen = () => {
44
- cleanup();
65
+ initialCleanup();
45
66
  resolve();
46
67
  };
47
68
  const onError = (e) => {
48
- cleanup();
69
+ initialCleanup();
70
+ if (e == null) forceSocketClose();
49
71
  console.error(
50
72
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
51
73
  );
52
74
  onStatusChanged(
53
75
  status = {
54
- type: e ? 2 /* ERROR */ : 3 /* CLOSE */,
76
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
55
77
  event: e
56
78
  }
57
79
  );
58
80
  setTimeout(reject, e ? 300 : 0, e);
59
81
  };
60
- const timeoutToken = setTimeout(() => {
61
- cleanup();
82
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
83
+ initialCleanup();
84
+ forceSocketClose();
62
85
  onStatusChanged(status = timeoutError);
63
86
  reject(timeoutError.event);
64
- }, 3500);
65
- const cleanup = () => {
87
+ }, timeout) : void 0;
88
+ const initialCleanup = () => {
66
89
  clearTimeout(timeoutToken);
67
90
  socket.removeEventListener("error", onError);
68
91
  socket.removeEventListener("open", onOpen);
@@ -75,7 +98,7 @@ const getInternalWsProvider = (WebsocketClass) => {
75
98
  });
76
99
  onStatusChanged(
77
100
  status = {
78
- type: 1 /* CONNECTED */,
101
+ type: WsEvent.CONNECTED,
79
102
  uri,
80
103
  protocols
81
104
  }
@@ -94,8 +117,8 @@ const getInternalWsProvider = (WebsocketClass) => {
94
117
  );
95
118
  onHalt();
96
119
  };
97
- const onError = innerHalt(2 /* ERROR */);
98
- const onClose = innerHalt(3 /* CLOSE */);
120
+ const onError = innerHalt(WsEvent.ERROR);
121
+ const onClose = innerHalt(WsEvent.CLOSE);
99
122
  socket.addEventListener("message", _onMessage);
100
123
  socket.addEventListener("error", onError);
101
124
  socket.addEventListener("close", onClose);
@@ -104,7 +127,7 @@ const getInternalWsProvider = (WebsocketClass) => {
104
127
  socket.removeEventListener("message", _onMessage);
105
128
  socket.removeEventListener("error", onError);
106
129
  socket.removeEventListener("close", onClose);
107
- socket.close();
130
+ forceSocketClose();
108
131
  if (withHalt) onClose({});
109
132
  };
110
133
  return {
@@ -117,9 +140,9 @@ const getInternalWsProvider = (WebsocketClass) => {
117
140
  });
118
141
  result.getStatus = () => status;
119
142
  result.switch = (...args2) => {
120
- if (status.type === 3 /* CLOSE */) return;
143
+ if (status.type === WsEvent.CLOSE) return;
121
144
  if (args2.length) switchTo = args2;
122
- if (status.type !== 2 /* ERROR */) disconnect(true);
145
+ if (status.type !== WsEvent.ERROR) disconnect(true);
123
146
  };
124
147
  return result;
125
148
  };
@@ -130,7 +153,10 @@ class WS extends ws.WebSocket {
130
153
  this.terminate();
131
154
  }
132
155
  }
133
- const getWsProvider = getInternalWsProvider(WS);
156
+ const getWsProvider = getInternalWsProvider(
157
+ WS
158
+ );
134
159
 
160
+ exports.WsEvent = WsEvent;
135
161
  exports.getWsProvider = getWsProvider;
136
162
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sources":["../../src/ws-provider.ts","../../src/node.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\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}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n}\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n\n if (typeof args[1] === \"function\") onStatusChanged = args[1]\n if (Array.isArray(args[0]))\n endpoints = args[0].map((x) =>\n typeof x === \"string\" ? [x] : [x.uri, x.protocol],\n )\n else {\n endpoints = [[args[0]]]\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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\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 cleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n cleanup()\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 = setTimeout(() => {\n cleanup()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, 3_500)\n const cleanup = () => {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.close()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n","// @ts-ignore\nimport { WebSocket } from \"ws\"\nimport { getInternalWsProvider } from \"./ws-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nclass WS extends WebSocket {\n close() {\n ;(this as any).terminate()\n }\n}\n\nexport const getWsProvider = getInternalWsProvider(WS as any)\n"],"names":["getSyncProvider","args","WebSocket"],"mappings":"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"}
1
+ {"version":3,"file":"node.js","sources":["../../src/types.ts","../../src/ws-provider.ts","../../src/node.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}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\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 } 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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 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 {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n","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":["WsEvent","getSyncProvider","args","WebSocket"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
2
+ WsEvent2[WsEvent2["CONNECTING"] = 0] = "CONNECTING";
3
+ WsEvent2[WsEvent2["CONNECTED"] = 1] = "CONNECTED";
4
+ WsEvent2[WsEvent2["ERROR"] = 2] = "ERROR";
5
+ WsEvent2[WsEvent2["CLOSE"] = 3] = "CLOSE";
6
+ return WsEvent2;
7
+ })(WsEvent || {});
8
+
9
+ export { WsEvent };
10
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","sources":["../../../src/types.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}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n"],"names":["WsEvent"],"mappings":"AAEY,IAAA,OAAA,qBAAAA,QAAL,KAAA;AACL,EAAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAJU,EAAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;;;"}
@@ -1,4 +1,5 @@
1
1
  import { getInternalWsProvider } from './ws-provider.mjs';
2
+ export { WsEvent } from './types.mjs';
2
3
 
3
4
  const getWsProvider = getInternalWsProvider(WebSocket);
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","sources":["../../../src/web.ts"],"sourcesContent":["import { getInternalWsProvider } from \"./ws-provider\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":[],"mappings":";;AAGa,MAAA,aAAA,GAAgB,sBAAsB,SAAS;;;;"}
1
+ {"version":3,"file":"web.mjs","sources":["../../../src/web.ts"],"sourcesContent":["import { getInternalWsProvider } from \"./ws-provider\"\n\nexport * from \"./types\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":[],"mappings":";;;AAKa,MAAA,aAAA,GAAgB,sBAAsB,SAAS;;;;"}
@@ -1,25 +1,33 @@
1
1
  import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy';
2
+ import { WsEvent } from './types.mjs';
2
3
 
3
4
  const timeoutError = {
4
- type: 2 /* ERROR */,
5
+ type: WsEvent.ERROR,
5
6
  event: { type: "timeout" }
6
7
  };
7
8
  const noop = () => {
8
9
  };
10
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
9
11
  const getInternalWsProvider = (WebsocketClass) => {
10
12
  return (...args) => {
11
13
  let endpoints = [];
12
14
  let onStatusChanged = noop;
13
- if (typeof args[1] === "function") onStatusChanged = args[1];
14
- if (Array.isArray(args[0]))
15
- endpoints = args[0].map(
16
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
17
- );
18
- else {
19
- endpoints = [[args[0]]];
20
- if (args[1] && args[1] !== onStatusChanged)
21
- endpoints[0][1] = args[1];
22
- if (args[2]) onStatusChanged = args[2];
15
+ let timeout = 3500;
16
+ const [firstArg] = args;
17
+ if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
18
+ endpoints = mapEndpoints(firstArg.endpoints);
19
+ onStatusChanged = firstArg.onStatusChanged ?? noop;
20
+ timeout = firstArg.timeout ?? timeout;
21
+ } else {
22
+ if (typeof args[1] === "function")
23
+ onStatusChanged = args[1];
24
+ if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
25
+ else {
26
+ endpoints = [[firstArg]];
27
+ if (args[1] && args[1] !== onStatusChanged)
28
+ endpoints[0][1] = args[1];
29
+ if (args[2]) onStatusChanged = args[2];
30
+ }
23
31
  }
24
32
  let idx = 0;
25
33
  let status;
@@ -29,37 +37,45 @@ const getInternalWsProvider = (WebsocketClass) => {
29
37
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
30
38
  switchTo = null;
31
39
  const socket = new WebsocketClass(uri, protocols);
40
+ const forceSocketClose = () => {
41
+ try {
42
+ socket.close();
43
+ } catch {
44
+ }
45
+ };
32
46
  onStatusChanged(
33
47
  status = {
34
- type: 0 /* CONNECTING */,
48
+ type: WsEvent.CONNECTING,
35
49
  uri,
36
50
  protocols
37
51
  }
38
52
  );
39
53
  await new Promise((resolve, reject) => {
40
54
  const onOpen = () => {
41
- cleanup();
55
+ initialCleanup();
42
56
  resolve();
43
57
  };
44
58
  const onError = (e) => {
45
- cleanup();
59
+ initialCleanup();
60
+ if (e == null) forceSocketClose();
46
61
  console.error(
47
62
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
48
63
  );
49
64
  onStatusChanged(
50
65
  status = {
51
- type: e ? 2 /* ERROR */ : 3 /* CLOSE */,
66
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
52
67
  event: e
53
68
  }
54
69
  );
55
70
  setTimeout(reject, e ? 300 : 0, e);
56
71
  };
57
- const timeoutToken = setTimeout(() => {
58
- cleanup();
72
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
73
+ initialCleanup();
74
+ forceSocketClose();
59
75
  onStatusChanged(status = timeoutError);
60
76
  reject(timeoutError.event);
61
- }, 3500);
62
- const cleanup = () => {
77
+ }, timeout) : void 0;
78
+ const initialCleanup = () => {
63
79
  clearTimeout(timeoutToken);
64
80
  socket.removeEventListener("error", onError);
65
81
  socket.removeEventListener("open", onOpen);
@@ -72,7 +88,7 @@ const getInternalWsProvider = (WebsocketClass) => {
72
88
  });
73
89
  onStatusChanged(
74
90
  status = {
75
- type: 1 /* CONNECTED */,
91
+ type: WsEvent.CONNECTED,
76
92
  uri,
77
93
  protocols
78
94
  }
@@ -91,8 +107,8 @@ const getInternalWsProvider = (WebsocketClass) => {
91
107
  );
92
108
  onHalt();
93
109
  };
94
- const onError = innerHalt(2 /* ERROR */);
95
- const onClose = innerHalt(3 /* CLOSE */);
110
+ const onError = innerHalt(WsEvent.ERROR);
111
+ const onClose = innerHalt(WsEvent.CLOSE);
96
112
  socket.addEventListener("message", _onMessage);
97
113
  socket.addEventListener("error", onError);
98
114
  socket.addEventListener("close", onClose);
@@ -101,7 +117,7 @@ const getInternalWsProvider = (WebsocketClass) => {
101
117
  socket.removeEventListener("message", _onMessage);
102
118
  socket.removeEventListener("error", onError);
103
119
  socket.removeEventListener("close", onClose);
104
- socket.close();
120
+ forceSocketClose();
105
121
  if (withHalt) onClose({});
106
122
  };
107
123
  return {
@@ -114,9 +130,9 @@ const getInternalWsProvider = (WebsocketClass) => {
114
130
  });
115
131
  result.getStatus = () => status;
116
132
  result.switch = (...args2) => {
117
- if (status.type === 3 /* CLOSE */) return;
133
+ if (status.type === WsEvent.CLOSE) return;
118
134
  if (args2.length) switchTo = args2;
119
- if (status.type !== 2 /* ERROR */) disconnect(true);
135
+ if (status.type !== WsEvent.ERROR) disconnect(true);
120
136
  };
121
137
  return result;
122
138
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\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}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n}\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n\n if (typeof args[1] === \"function\") onStatusChanged = args[1]\n if (Array.isArray(args[0]))\n endpoints = args[0].map((x) =>\n typeof x === \"string\" ? [x] : [x.uri, x.protocol],\n )\n else {\n endpoints = [[args[0]]]\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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\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 cleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n cleanup()\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 = setTimeout(() => {\n cleanup()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, 3_500)\n const cleanup = () => {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.close()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n"],"names":["args"],"mappings":";;AAiDA,MAAM,YAA6B,GAAA;AAAA,EACjC,IAAM,EAAA,CAAA;AAAA,EACN,KAAA,EAAO,EAAE,IAAA,EAAM,SAAU,EAAA;AAC3B,CAAA,CAAA;AAEA,MAAM,OAAO,MAAM;AAAC,CAAA,CAAA;AACP,MAAA,qBAAA,GAAwB,CACnC,cACuB,KAAA;AACvB,EAAA,OAAO,IAAI,IAA4B,KAAA;AACrC,IAAA,IAAI,YAA2D,EAAC,CAAA;AAChE,IAAA,IAAI,eAAkD,GAAA,IAAA,CAAA;AAEtD,IAAA,IAAI,OAAO,IAAK,CAAA,CAAC,MAAM,UAAY,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA,CAAA;AAC3D,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAC,CAAA;AACvB,MAAY,SAAA,GAAA,IAAA,CAAK,CAAC,CAAE,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,QAAW,GAAA,CAAC,CAAC,CAAA,GAAI,CAAC,CAAA,CAAE,GAAK,EAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,OAClD,CAAA;AAAA,SACG;AACH,MAAA,SAAA,GAAY,CAAC,CAAC,IAAK,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACtB,MAAA,IAAI,IAAK,CAAA,CAAC,CAAK,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,eAAA;AACzB,QAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAC1B,MAAA,IAAI,IAAK,CAAA,CAAC,CAAG,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA,CAAA;AAAA,KACvC;AACA,IAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,IAAI,IAAA,MAAA,CAAA;AACJ,IAAA,IAAI,QAA0D,GAAA,IAAA,CAAA;AAC9D,IAAA,IAAI,UAA2C,GAAA,IAAA,CAAA;AAE/C,IAAM,MAAA,MAAA,GAAS,gBAAgB,YAAY;AACzC,MAAM,MAAA,CAAC,KAAK,SAAS,CAAA,GAAI,YAAY,SAAU,CAAA,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA,CAAA;AACvE,MAAW,QAAA,GAAA,IAAA,CAAA;AACX,MAAA,MAAM,MAAS,GAAA,IAAI,cAAe,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAChD,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,IAAM,EAAA,CAAA;AAAA,UACN,GAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,OACF,CAAA;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,QAAA,MAAM,SAAS,MAAM;AACnB,UAAQ,OAAA,EAAA,CAAA;AACR,UAAQ,OAAA,EAAA,CAAA;AAAA,SACV,CAAA;AAEA,QAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,UAAQ,OAAA,EAAA,CAAA;AACR,UAAQ,OAAA,CAAA,KAAA;AAAA,YACN,wBAAwB,GAAG,CAAA,EACzB,SAAY,GAAA,eAAA,GAAkB,YAAY,EAC5C,CAAA,CAAA;AAAA,WACF,CAAA;AACA,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAA,EAAM,IAAI,CAAgB,eAAA,CAAA;AAAA,cAC1B,KAAO,EAAA,CAAA;AAAA,aACT;AAAA,WACF,CAAA;AACA,UAAA,UAAA,CAAW,MAAQ,EAAA,CAAA,GAAI,GAAM,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,SACnC,CAAA;AAEA,QAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,UAAQ,OAAA,EAAA,CAAA;AACR,UAAA,eAAA,CAAiB,SAAS,YAAa,CAAA,CAAA;AACvC,UAAA,MAAA,CAAO,aAAa,KAAK,CAAA,CAAA;AAAA,WACxB,IAAK,CAAA,CAAA;AACR,QAAA,MAAM,UAAU,MAAM;AACpB,UAAA,YAAA,CAAa,YAAY,CAAA,CAAA;AACzB,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA,CAAA;AAAA,SAC3C,CAAA;AACA,QAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA,CAAA;AACtC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAA,UAAA,GAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,SACd,CAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,IAAM,EAAA,CAAA;AAAA,UACN,GAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,OACF,CAAA;AAEA,MAAO,OAAA,CAAC,WAAW,MAAW,KAAA;AAC5B,QAAM,MAAA,UAAA,GAAa,CAAC,CAAoB,KAAA;AACtC,UAAA,IAAI,OAAO,CAAE,CAAA,IAAA,KAAS,QAAU,EAAA,SAAA,CAAU,EAAE,IAAI,CAAA,CAAA;AAAA,SAClD,CAAA;AACA,QAAA,MAAM,SACJ,GAAA,CAAC,MAA0C,KAAA,CAAC,CAAW,KAAA;AACrD,UAAQ,OAAA,CAAA,IAAA,CAAK,CAAY,SAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAClC,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAM,EAAA,MAAA;AAAA,cACN,KAAO,EAAA,CAAA;AAAA,aACT;AAAA,WACF,CAAA;AACA,UAAO,MAAA,EAAA,CAAA;AAAA,SACT,CAAA;AACF,QAAM,MAAA,OAAA,GAAU,UAAU,CAAa,aAAA,CAAA;AACvC,QAAM,MAAA,OAAA,GAAU,UAAU,CAAa,aAAA,CAAA;AAEvC,QAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,UAAU,CAAA,CAAA;AAC7C,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,QAAA,UAAA,GAAa,CAAC,QAAa,KAAA;AACzB,UAAa,UAAA,GAAA,IAAA,CAAA;AACb,UAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,UAAU,CAAA,CAAA;AAChD,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAC3C,UAAA,MAAA,CAAO,KAAM,EAAA,CAAA;AACb,UAAI,IAAA,QAAA,EAAkB,OAAA,CAAA,EAAE,CAAA,CAAA;AAAA,SAC1B,CAAA;AAEA,QAAO,OAAA;AAAA,UACL,IAAA,EAAM,CAAC,GAAQ,KAAA;AACb,YAAA,MAAA,CAAO,KAAK,GAAG,CAAA,CAAA;AAAA,WACjB;AAAA,UACA,UAAA;AAAA,SACF,CAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,MAAA,CAAO,YAAY,MAAM,MAAA,CAAA;AACzB,IAAO,MAAA,CAAA,MAAA,GAAS,IAAIA,KAAS,KAAA;AAC3B,MAAI,IAAA,MAAA,CAAO,SAAS,CAAe,cAAA,OAAA;AACnC,MAAIA,IAAAA,KAAAA,CAAK,QAAmBA,QAAAA,GAAAA,KAAAA,CAAAA;AAC5B,MAAA,IAAI,MAAO,CAAA,IAAA,KAAS,CAAe,cAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,KACpD,CAAA;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\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 } 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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 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 {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n"],"names":["args"],"mappings":"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"}
package/dist/web/web.d.ts CHANGED
@@ -30,6 +30,14 @@ type WsJsonRpcProvider = JsonRpcProvider & {
30
30
  switch: (uri?: string, protocol?: string[]) => void;
31
31
  getStatus: () => StatusChange;
32
32
  };
33
+ interface WsProviderConfig {
34
+ endpoints: Array<string | {
35
+ uri: string;
36
+ protocol: string[];
37
+ }>;
38
+ onStatusChanged?: (status: StatusChange) => void;
39
+ timeout?: number;
40
+ }
33
41
  interface GetWsProviderInput {
34
42
  (uri: string, protocols?: string | string[], onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
35
43
  (uri: string, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
@@ -37,8 +45,9 @@ interface GetWsProviderInput {
37
45
  uri: string;
38
46
  protocol: string[];
39
47
  }>, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
48
+ (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider;
40
49
  }
41
50
 
42
51
  declare const getWsProvider: GetWsProviderInput;
43
52
 
44
- export { getWsProvider };
53
+ export { type GetWsProviderInput, type StatusChange, type WsClose, type WsConnected, type WsConnecting, type WsError, WsEvent, type WsJsonRpcProvider, type WsProviderConfig, getWsProvider };
package/dist/web/web.js CHANGED
@@ -2,26 +2,41 @@
2
2
 
3
3
  var jsonRpcProviderProxy = require('@polkadot-api/json-rpc-provider-proxy');
4
4
 
5
+ var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
6
+ WsEvent2[WsEvent2["CONNECTING"] = 0] = "CONNECTING";
7
+ WsEvent2[WsEvent2["CONNECTED"] = 1] = "CONNECTED";
8
+ WsEvent2[WsEvent2["ERROR"] = 2] = "ERROR";
9
+ WsEvent2[WsEvent2["CLOSE"] = 3] = "CLOSE";
10
+ return WsEvent2;
11
+ })(WsEvent || {});
12
+
5
13
  const timeoutError = {
6
- type: 2 /* ERROR */,
14
+ type: WsEvent.ERROR,
7
15
  event: { type: "timeout" }
8
16
  };
9
17
  const noop = () => {
10
18
  };
19
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
11
20
  const getInternalWsProvider = (WebsocketClass) => {
12
21
  return (...args) => {
13
22
  let endpoints = [];
14
23
  let onStatusChanged = noop;
15
- if (typeof args[1] === "function") onStatusChanged = args[1];
16
- if (Array.isArray(args[0]))
17
- endpoints = args[0].map(
18
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
19
- );
20
- else {
21
- endpoints = [[args[0]]];
22
- if (args[1] && args[1] !== onStatusChanged)
23
- endpoints[0][1] = args[1];
24
- if (args[2]) onStatusChanged = args[2];
24
+ let timeout = 3500;
25
+ const [firstArg] = args;
26
+ if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
27
+ endpoints = mapEndpoints(firstArg.endpoints);
28
+ onStatusChanged = firstArg.onStatusChanged ?? noop;
29
+ timeout = firstArg.timeout ?? timeout;
30
+ } else {
31
+ if (typeof args[1] === "function")
32
+ onStatusChanged = args[1];
33
+ if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
34
+ else {
35
+ endpoints = [[firstArg]];
36
+ if (args[1] && args[1] !== onStatusChanged)
37
+ endpoints[0][1] = args[1];
38
+ if (args[2]) onStatusChanged = args[2];
39
+ }
25
40
  }
26
41
  let idx = 0;
27
42
  let status;
@@ -31,37 +46,45 @@ const getInternalWsProvider = (WebsocketClass) => {
31
46
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
32
47
  switchTo = null;
33
48
  const socket = new WebsocketClass(uri, protocols);
49
+ const forceSocketClose = () => {
50
+ try {
51
+ socket.close();
52
+ } catch {
53
+ }
54
+ };
34
55
  onStatusChanged(
35
56
  status = {
36
- type: 0 /* CONNECTING */,
57
+ type: WsEvent.CONNECTING,
37
58
  uri,
38
59
  protocols
39
60
  }
40
61
  );
41
62
  await new Promise((resolve, reject) => {
42
63
  const onOpen = () => {
43
- cleanup();
64
+ initialCleanup();
44
65
  resolve();
45
66
  };
46
67
  const onError = (e) => {
47
- cleanup();
68
+ initialCleanup();
69
+ if (e == null) forceSocketClose();
48
70
  console.error(
49
71
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
50
72
  );
51
73
  onStatusChanged(
52
74
  status = {
53
- type: e ? 2 /* ERROR */ : 3 /* CLOSE */,
75
+ type: e ? WsEvent.ERROR : WsEvent.CLOSE,
54
76
  event: e
55
77
  }
56
78
  );
57
79
  setTimeout(reject, e ? 300 : 0, e);
58
80
  };
59
- const timeoutToken = setTimeout(() => {
60
- cleanup();
81
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
82
+ initialCleanup();
83
+ forceSocketClose();
61
84
  onStatusChanged(status = timeoutError);
62
85
  reject(timeoutError.event);
63
- }, 3500);
64
- const cleanup = () => {
86
+ }, timeout) : void 0;
87
+ const initialCleanup = () => {
65
88
  clearTimeout(timeoutToken);
66
89
  socket.removeEventListener("error", onError);
67
90
  socket.removeEventListener("open", onOpen);
@@ -74,7 +97,7 @@ const getInternalWsProvider = (WebsocketClass) => {
74
97
  });
75
98
  onStatusChanged(
76
99
  status = {
77
- type: 1 /* CONNECTED */,
100
+ type: WsEvent.CONNECTED,
78
101
  uri,
79
102
  protocols
80
103
  }
@@ -93,8 +116,8 @@ const getInternalWsProvider = (WebsocketClass) => {
93
116
  );
94
117
  onHalt();
95
118
  };
96
- const onError = innerHalt(2 /* ERROR */);
97
- const onClose = innerHalt(3 /* CLOSE */);
119
+ const onError = innerHalt(WsEvent.ERROR);
120
+ const onClose = innerHalt(WsEvent.CLOSE);
98
121
  socket.addEventListener("message", _onMessage);
99
122
  socket.addEventListener("error", onError);
100
123
  socket.addEventListener("close", onClose);
@@ -103,7 +126,7 @@ const getInternalWsProvider = (WebsocketClass) => {
103
126
  socket.removeEventListener("message", _onMessage);
104
127
  socket.removeEventListener("error", onError);
105
128
  socket.removeEventListener("close", onClose);
106
- socket.close();
129
+ forceSocketClose();
107
130
  if (withHalt) onClose({});
108
131
  };
109
132
  return {
@@ -116,9 +139,9 @@ const getInternalWsProvider = (WebsocketClass) => {
116
139
  });
117
140
  result.getStatus = () => status;
118
141
  result.switch = (...args2) => {
119
- if (status.type === 3 /* CLOSE */) return;
142
+ if (status.type === WsEvent.CLOSE) return;
120
143
  if (args2.length) switchTo = args2;
121
- if (status.type !== 2 /* ERROR */) disconnect(true);
144
+ if (status.type !== WsEvent.ERROR) disconnect(true);
122
145
  };
123
146
  return result;
124
147
  };
@@ -126,5 +149,6 @@ const getInternalWsProvider = (WebsocketClass) => {
126
149
 
127
150
  const getWsProvider = getInternalWsProvider(WebSocket);
128
151
 
152
+ exports.WsEvent = WsEvent;
129
153
  exports.getWsProvider = getWsProvider;
130
154
  //# sourceMappingURL=web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sources":["../../src/ws-provider.ts","../../src/web.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\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}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n}\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n\n if (typeof args[1] === \"function\") onStatusChanged = args[1]\n if (Array.isArray(args[0]))\n endpoints = args[0].map((x) =>\n typeof x === \"string\" ? [x] : [x.uri, x.protocol],\n )\n else {\n endpoints = [[args[0]]]\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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\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 cleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n cleanup()\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 = setTimeout(() => {\n cleanup()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, 3_500)\n const cleanup = () => {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.close()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n","import { getInternalWsProvider } from \"./ws-provider\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":["getSyncProvider","args"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sources":["../../src/types.ts","../../src/ws-provider.ts","../../src/web.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}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\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 } 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 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 const result = getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\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 return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(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 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 {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\n }\n }) as WsJsonRpcProvider\n\n result.getStatus = () => status\n result.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 return result\n }\n}\n","import { getInternalWsProvider } from \"./ws-provider\"\n\nexport * from \"./types\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":["WsEvent","getSyncProvider","args"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/ws-provider",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,6 +35,9 @@
35
35
  "@polkadot-api/json-rpc-provider": "0.0.4",
36
36
  "@polkadot-api/json-rpc-provider-proxy": "0.2.3"
37
37
  },
38
+ "devDependencies": {
39
+ "@types/ws": "^8.5.12"
40
+ },
38
41
  "scripts": {
39
42
  "build-core": "tsc --noEmit && rollup -c",
40
43
  "build": "pnpm build-core",