@polkadot-api/ws-provider 0.3.2 → 0.3.4

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 +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,SAAU,CAAA;AAAA,EACzB,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,SAAU,EAAA,CAAA;AAAA,GACjB;AACF,CAAA;AAEO,MAAM,aAAgB,GAAA,qBAAA;AAAA,EAC3B,EAAA;AACF;;;;"}
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;;;;"}
@@ -1 +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}\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"],"names":["WsEvent"],"mappings":"AAEY,IAAA,OAAA,qBAAAA,QAAL,KAAA;AACL,EAAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA,CAAA;AAJU,EAAAA,OAAAA,QAAAA,CAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;;;"}
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;;;;"}
@@ -7,20 +7,27 @@ const timeoutError = {
7
7
  };
8
8
  const noop = () => {
9
9
  };
10
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
10
11
  const getInternalWsProvider = (WebsocketClass) => {
11
12
  return (...args) => {
12
13
  let endpoints = [];
13
14
  let onStatusChanged = noop;
14
- if (typeof args[1] === "function") onStatusChanged = args[1];
15
- if (Array.isArray(args[0]))
16
- endpoints = args[0].map(
17
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
18
- );
19
- else {
20
- endpoints = [[args[0]]];
21
- if (args[1] && args[1] !== onStatusChanged)
22
- endpoints[0][1] = args[1];
23
- 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
+ }
24
31
  }
25
32
  let idx = 0;
26
33
  let status;
@@ -30,6 +37,13 @@ const getInternalWsProvider = (WebsocketClass) => {
30
37
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
31
38
  switchTo = null;
32
39
  const socket = new WebsocketClass(uri, protocols);
40
+ const forceSocketClose = () => {
41
+ try {
42
+ socket.addEventListener("error", noop, { once: true });
43
+ socket.close();
44
+ } catch {
45
+ }
46
+ };
33
47
  onStatusChanged(
34
48
  status = {
35
49
  type: WsEvent.CONNECTING,
@@ -39,11 +53,12 @@ const getInternalWsProvider = (WebsocketClass) => {
39
53
  );
40
54
  await new Promise((resolve, reject) => {
41
55
  const onOpen = () => {
42
- cleanup();
56
+ initialCleanup();
43
57
  resolve();
44
58
  };
45
59
  const onError = (e) => {
46
- cleanup();
60
+ initialCleanup();
61
+ if (e == null) forceSocketClose();
47
62
  console.error(
48
63
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
49
64
  );
@@ -55,12 +70,13 @@ const getInternalWsProvider = (WebsocketClass) => {
55
70
  );
56
71
  setTimeout(reject, e ? 300 : 0, e);
57
72
  };
58
- const timeoutToken = setTimeout(() => {
59
- cleanup();
73
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
74
+ initialCleanup();
75
+ forceSocketClose();
60
76
  onStatusChanged(status = timeoutError);
61
77
  reject(timeoutError.event);
62
- }, 3500);
63
- const cleanup = () => {
78
+ }, timeout) : void 0;
79
+ const initialCleanup = () => {
64
80
  clearTimeout(timeoutToken);
65
81
  socket.removeEventListener("error", onError);
66
82
  socket.removeEventListener("open", onOpen);
@@ -102,7 +118,7 @@ const getInternalWsProvider = (WebsocketClass) => {
102
118
  socket.removeEventListener("message", _onMessage);
103
119
  socket.removeEventListener("error", onError);
104
120
  socket.removeEventListener("close", onClose);
105
- socket.close();
121
+ forceSocketClose();
106
122
  if (withHalt) onClose({});
107
123
  };
108
124
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types\"\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 = () => {}\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\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":"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"}
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.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 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,7 +30,14 @@ type WsJsonRpcProvider = JsonRpcProvider & {
30
30
  switch: (uri?: string, protocol?: string[]) => void;
31
31
  getStatus: () => StatusChange;
32
32
  };
33
-
33
+ interface WsProviderConfig {
34
+ endpoints: Array<string | {
35
+ uri: string;
36
+ protocol: string[];
37
+ }>;
38
+ onStatusChanged?: (status: StatusChange) => void;
39
+ timeout?: number;
40
+ }
34
41
  interface GetWsProviderInput {
35
42
  (uri: string, protocols?: string | string[], onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
36
43
  (uri: string, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
@@ -38,8 +45,9 @@ interface GetWsProviderInput {
38
45
  uri: string;
39
46
  protocol: string[];
40
47
  }>, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
48
+ (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider;
41
49
  }
42
50
 
43
51
  declare const getWsProvider: GetWsProviderInput;
44
52
 
45
- export { type StatusChange, type WsClose, type WsConnected, type WsConnecting, type WsError, WsEvent, type WsJsonRpcProvider, 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
@@ -17,20 +17,27 @@ const timeoutError = {
17
17
  };
18
18
  const noop = () => {
19
19
  };
20
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
20
21
  const getInternalWsProvider = (WebsocketClass) => {
21
22
  return (...args) => {
22
23
  let endpoints = [];
23
24
  let onStatusChanged = noop;
24
- if (typeof args[1] === "function") onStatusChanged = args[1];
25
- if (Array.isArray(args[0]))
26
- endpoints = args[0].map(
27
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
28
- );
29
- else {
30
- endpoints = [[args[0]]];
31
- if (args[1] && args[1] !== onStatusChanged)
32
- endpoints[0][1] = args[1];
33
- 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
+ }
34
41
  }
35
42
  let idx = 0;
36
43
  let status;
@@ -40,6 +47,13 @@ const getInternalWsProvider = (WebsocketClass) => {
40
47
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
41
48
  switchTo = null;
42
49
  const socket = new WebsocketClass(uri, protocols);
50
+ const forceSocketClose = () => {
51
+ try {
52
+ socket.addEventListener("error", noop, { once: true });
53
+ socket.close();
54
+ } catch {
55
+ }
56
+ };
43
57
  onStatusChanged(
44
58
  status = {
45
59
  type: WsEvent.CONNECTING,
@@ -49,11 +63,12 @@ const getInternalWsProvider = (WebsocketClass) => {
49
63
  );
50
64
  await new Promise((resolve, reject) => {
51
65
  const onOpen = () => {
52
- cleanup();
66
+ initialCleanup();
53
67
  resolve();
54
68
  };
55
69
  const onError = (e) => {
56
- cleanup();
70
+ initialCleanup();
71
+ if (e == null) forceSocketClose();
57
72
  console.error(
58
73
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
59
74
  );
@@ -65,12 +80,13 @@ const getInternalWsProvider = (WebsocketClass) => {
65
80
  );
66
81
  setTimeout(reject, e ? 300 : 0, e);
67
82
  };
68
- const timeoutToken = setTimeout(() => {
69
- cleanup();
83
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
84
+ initialCleanup();
85
+ forceSocketClose();
70
86
  onStatusChanged(status = timeoutError);
71
87
  reject(timeoutError.event);
72
- }, 3500);
73
- const cleanup = () => {
88
+ }, timeout) : void 0;
89
+ const initialCleanup = () => {
74
90
  clearTimeout(timeoutToken);
75
91
  socket.removeEventListener("error", onError);
76
92
  socket.removeEventListener("open", onOpen);
@@ -112,7 +128,7 @@ const getInternalWsProvider = (WebsocketClass) => {
112
128
  socket.removeEventListener("message", _onMessage);
113
129
  socket.removeEventListener("error", onError);
114
130
  socket.removeEventListener("close", onClose);
115
- socket.close();
131
+ forceSocketClose();
116
132
  if (withHalt) onClose({});
117
133
  };
118
134
  return {
@@ -1 +1 @@
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}\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","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types\"\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 = () => {}\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\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 { 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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"}
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.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 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":";;;;;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;;ACOZ,MAAM,YAA6B,GAAA;AAAA,EACjC,MAAM,OAAQ,CAAA,KAAA;AAAA,EACd,KAAA,EAAO,EAAE,IAAA,EAAM,SAAU;AAC3B,CAAA;AAEA,MAAM,OAAO,MAAM;AAAC,CAAA;AAEpB,MAAM,eAAe,CACnB,SAAA,KAEA,UAAU,GAAI,CAAA,CAAC,MAAO,OAAO,CAAA,KAAM,QAAW,GAAA,CAAC,CAAC,CAAI,GAAA,CAAC,EAAE,GAAK,EAAA,CAAA,CAAE,QAAQ,CAAE,CAAA;AAE7D,MAAA,qBAAA,GAAwB,CACnC,cACuB,KAAA;AACvB,EAAA,OAAO,IAAI,IAA4B,KAAA;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,eAAkD,GAAA,IAAA;AACtD,IAAA,IAAI,OAAU,GAAA,IAAA;AAEd,IAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA;AACnB,IACE,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAQ,CAAA,QAAQ,CACvB,EAAA;AACA,MAAY,SAAA,GAAA,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAmB,IAAA,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,OAAA;AAAA,KACzB,MAAA;AACL,MAAI,IAAA,OAAO,IAAK,CAAA,CAAC,CAAM,KAAA,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAQ,CAAA,QAAQ,CAAG,EAAA,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAY,SAAA,GAAA,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAK,CAAA,CAAC,CAAK,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAK,CAAA,CAAC,CAAG,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA;AACvC;AAGF,IAAA,IAAI,GAAM,GAAA,CAAA;AACV,IAAI,IAAA,MAAA;AACJ,IAAA,IAAI,QAA0D,GAAA,IAAA;AAC9D,IAAA,IAAI,UAA2C,GAAA,IAAA;AAE/C,IAAM,MAAA,MAAA,GAASC,qCAAgB,YAAY;AACzC,MAAM,MAAA,CAAC,KAAK,SAAS,CAAA,GAAI,YAAY,SAAU,CAAA,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA;AACvE,MAAW,QAAA,GAAA,IAAA;AACX,MAAA,MAAM,MAAS,GAAA,IAAI,cAAe,CAAA,GAAA,EAAK,SAAS,CAAA;AAChD,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAI,IAAA;AACF,UAAA,MAAA,CAAO,iBAAiB,OAAS,EAAA,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AACrD,UAAA,MAAA,CAAO,KAAM,EAAA;AAAA,SACP,CAAA,MAAA;AAAA;AAAC,OACX;AACA,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,MAAM,OAAQ,CAAA,UAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,QAAA,MAAM,SAAS,MAAM;AACnB,UAAe,cAAA,EAAA;AACf,UAAQ,OAAA,EAAA;AAAA,SACV;AAEA,QAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,UAAe,cAAA,EAAA;AACf,UAAI,IAAA,CAAA,IAAK,MAAuB,gBAAA,EAAA;AAChC,UAAQ,OAAA,CAAA,KAAA;AAAA,YACN,wBAAwB,GAAG,CAAA,EACzB,SAAY,GAAA,eAAA,GAAkB,YAAY,EAC5C,CAAA;AAAA,WACF;AACA,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAM,EAAA,CAAA,GAAI,OAAQ,CAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA;AAAA,cAClC,KAAO,EAAA;AAAA;AACT,WACF;AACA,UAAA,UAAA,CAAW,MAAQ,EAAA,CAAA,GAAI,GAAM,GAAA,CAAA,EAAG,CAAC,CAAA;AAAA,SACnC;AAEA,QAAA,MAAM,YACJ,GAAA,OAAA,KAAY,QACR,GAAA,UAAA,CAAW,MAAM;AACf,UAAe,cAAA,EAAA;AACf,UAAiB,gBAAA,EAAA;AACjB,UAAA,eAAA,CAAiB,SAAS,YAAa,CAAA;AACvC,UAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,SAC3B,EAAG,OAAO,CACV,GAAA,KAAA,CAAA;AAEN,QAAA,MAAM,iBAAiB,MAAM;AAC3B,UAAA,YAAA,CAAa,YAAY,CAAA;AACzB,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,SAC3C;AACA,QAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,SACd;AAAA,OACD,CAAA;AAED,MAAA,eAAA;AAAA,QACG,MAAS,GAAA;AAAA,UACR,MAAM,OAAQ,CAAA,SAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;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;AAAA,SAClD;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;AAClC,UAAA,eAAA;AAAA,YACG,MAAS,GAAA;AAAA,cACR,IAAM,EAAA,MAAA;AAAA,cACN,KAAO,EAAA;AAAA;AACT,WACF;AACA,UAAO,MAAA,EAAA;AAAA,SACT;AACF,QAAM,MAAA,OAAA,GAAU,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAA;AACvC,QAAM,MAAA,OAAA,GAAU,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAA;AAEvC,QAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAC7C,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,CAAC,QAAa,KAAA;AACzB,UAAa,UAAA,GAAA,IAAA;AACb,UAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAChD,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAiB,gBAAA,EAAA;AACjB,UAAI,IAAA,QAAA,EAAkB,OAAA,CAAA,EAAE,CAAA;AAAA,SAC1B;AAEA,QAAO,OAAA;AAAA,UACL,IAAA,EAAM,CAAC,GAAQ,KAAA;AACb,YAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,WACjB;AAAA,UACA;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA;AAED,IAAA,MAAA,CAAO,YAAY,MAAM,MAAA;AACzB,IAAO,MAAA,CAAA,MAAA,GAAS,IAAIC,KAAS,KAAA;AAC3B,MAAI,IAAA,MAAA,CAAO,IAAS,KAAA,OAAA,CAAQ,KAAO,EAAA;AACnC,MAAIA,IAAAA,KAAAA,CAAK,QAAmBA,QAAAA,GAAAA,KAAAA;AAC5B,MAAA,IAAI,MAAO,CAAA,IAAA,KAAS,OAAQ,CAAA,KAAA,aAAkB,IAAI,CAAA;AAAA,KACpD;AACA,IAAO,OAAA,MAAA;AAAA,GACT;AACF,CAAA;;ACvKA,MAAM,WAAWC,YAAU,CAAA;AAAA,EACzB,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,SAAU,EAAA;AAAA;AAEnB;AAEO,MAAM,aAAgB,GAAA,qBAAA;AAAA,EAC3B;AACF;;;;;"}
@@ -1 +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}\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"],"names":["WsEvent"],"mappings":"AAEY,IAAA,OAAA,qBAAAA,QAAL,KAAA;AACL,EAAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA,CAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA,CAAA;AAJU,EAAAA,OAAAA,QAAAA,CAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;;;"}
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;;;;"}
@@ -7,20 +7,27 @@ const timeoutError = {
7
7
  };
8
8
  const noop = () => {
9
9
  };
10
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
10
11
  const getInternalWsProvider = (WebsocketClass) => {
11
12
  return (...args) => {
12
13
  let endpoints = [];
13
14
  let onStatusChanged = noop;
14
- if (typeof args[1] === "function") onStatusChanged = args[1];
15
- if (Array.isArray(args[0]))
16
- endpoints = args[0].map(
17
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
18
- );
19
- else {
20
- endpoints = [[args[0]]];
21
- if (args[1] && args[1] !== onStatusChanged)
22
- endpoints[0][1] = args[1];
23
- 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
+ }
24
31
  }
25
32
  let idx = 0;
26
33
  let status;
@@ -30,6 +37,13 @@ const getInternalWsProvider = (WebsocketClass) => {
30
37
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
31
38
  switchTo = null;
32
39
  const socket = new WebsocketClass(uri, protocols);
40
+ const forceSocketClose = () => {
41
+ try {
42
+ socket.addEventListener("error", noop, { once: true });
43
+ socket.close();
44
+ } catch {
45
+ }
46
+ };
33
47
  onStatusChanged(
34
48
  status = {
35
49
  type: WsEvent.CONNECTING,
@@ -39,11 +53,12 @@ const getInternalWsProvider = (WebsocketClass) => {
39
53
  );
40
54
  await new Promise((resolve, reject) => {
41
55
  const onOpen = () => {
42
- cleanup();
56
+ initialCleanup();
43
57
  resolve();
44
58
  };
45
59
  const onError = (e) => {
46
- cleanup();
60
+ initialCleanup();
61
+ if (e == null) forceSocketClose();
47
62
  console.error(
48
63
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
49
64
  );
@@ -55,12 +70,13 @@ const getInternalWsProvider = (WebsocketClass) => {
55
70
  );
56
71
  setTimeout(reject, e ? 300 : 0, e);
57
72
  };
58
- const timeoutToken = setTimeout(() => {
59
- cleanup();
73
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
74
+ initialCleanup();
75
+ forceSocketClose();
60
76
  onStatusChanged(status = timeoutError);
61
77
  reject(timeoutError.event);
62
- }, 3500);
63
- const cleanup = () => {
78
+ }, timeout) : void 0;
79
+ const initialCleanup = () => {
64
80
  clearTimeout(timeoutToken);
65
81
  socket.removeEventListener("error", onError);
66
82
  socket.removeEventListener("open", onOpen);
@@ -102,7 +118,7 @@ const getInternalWsProvider = (WebsocketClass) => {
102
118
  socket.removeEventListener("message", _onMessage);
103
119
  socket.removeEventListener("error", onError);
104
120
  socket.removeEventListener("close", onClose);
105
- socket.close();
121
+ forceSocketClose();
106
122
  if (withHalt) onClose({});
107
123
  };
108
124
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types\"\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 = () => {}\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\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":"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"}
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.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 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,7 +30,14 @@ type WsJsonRpcProvider = JsonRpcProvider & {
30
30
  switch: (uri?: string, protocol?: string[]) => void;
31
31
  getStatus: () => StatusChange;
32
32
  };
33
-
33
+ interface WsProviderConfig {
34
+ endpoints: Array<string | {
35
+ uri: string;
36
+ protocol: string[];
37
+ }>;
38
+ onStatusChanged?: (status: StatusChange) => void;
39
+ timeout?: number;
40
+ }
34
41
  interface GetWsProviderInput {
35
42
  (uri: string, protocols?: string | string[], onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
36
43
  (uri: string, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
@@ -38,8 +45,9 @@ interface GetWsProviderInput {
38
45
  uri: string;
39
46
  protocol: string[];
40
47
  }>, onStatusChanged?: (status: StatusChange) => void): WsJsonRpcProvider;
48
+ (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider;
41
49
  }
42
50
 
43
51
  declare const getWsProvider: GetWsProviderInput;
44
52
 
45
- export { type StatusChange, type WsClose, type WsConnected, type WsConnecting, type WsError, WsEvent, type WsJsonRpcProvider, 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
@@ -16,20 +16,27 @@ const timeoutError = {
16
16
  };
17
17
  const noop = () => {
18
18
  };
19
+ const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
19
20
  const getInternalWsProvider = (WebsocketClass) => {
20
21
  return (...args) => {
21
22
  let endpoints = [];
22
23
  let onStatusChanged = noop;
23
- if (typeof args[1] === "function") onStatusChanged = args[1];
24
- if (Array.isArray(args[0]))
25
- endpoints = args[0].map(
26
- (x) => typeof x === "string" ? [x] : [x.uri, x.protocol]
27
- );
28
- else {
29
- endpoints = [[args[0]]];
30
- if (args[1] && args[1] !== onStatusChanged)
31
- endpoints[0][1] = args[1];
32
- 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
+ }
33
40
  }
34
41
  let idx = 0;
35
42
  let status;
@@ -39,6 +46,13 @@ const getInternalWsProvider = (WebsocketClass) => {
39
46
  const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
40
47
  switchTo = null;
41
48
  const socket = new WebsocketClass(uri, protocols);
49
+ const forceSocketClose = () => {
50
+ try {
51
+ socket.addEventListener("error", noop, { once: true });
52
+ socket.close();
53
+ } catch {
54
+ }
55
+ };
42
56
  onStatusChanged(
43
57
  status = {
44
58
  type: WsEvent.CONNECTING,
@@ -48,11 +62,12 @@ const getInternalWsProvider = (WebsocketClass) => {
48
62
  );
49
63
  await new Promise((resolve, reject) => {
50
64
  const onOpen = () => {
51
- cleanup();
65
+ initialCleanup();
52
66
  resolve();
53
67
  };
54
68
  const onError = (e) => {
55
- cleanup();
69
+ initialCleanup();
70
+ if (e == null) forceSocketClose();
56
71
  console.error(
57
72
  `Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
58
73
  );
@@ -64,12 +79,13 @@ const getInternalWsProvider = (WebsocketClass) => {
64
79
  );
65
80
  setTimeout(reject, e ? 300 : 0, e);
66
81
  };
67
- const timeoutToken = setTimeout(() => {
68
- cleanup();
82
+ const timeoutToken = timeout !== Infinity ? setTimeout(() => {
83
+ initialCleanup();
84
+ forceSocketClose();
69
85
  onStatusChanged(status = timeoutError);
70
86
  reject(timeoutError.event);
71
- }, 3500);
72
- const cleanup = () => {
87
+ }, timeout) : void 0;
88
+ const initialCleanup = () => {
73
89
  clearTimeout(timeoutToken);
74
90
  socket.removeEventListener("error", onError);
75
91
  socket.removeEventListener("open", onOpen);
@@ -111,7 +127,7 @@ const getInternalWsProvider = (WebsocketClass) => {
111
127
  socket.removeEventListener("message", _onMessage);
112
128
  socket.removeEventListener("error", onError);
113
129
  socket.removeEventListener("close", onClose);
114
- socket.close();
130
+ forceSocketClose();
115
131
  if (withHalt) onClose({});
116
132
  };
117
133
  return {
@@ -1 +1 @@
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}\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","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types\"\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 = () => {}\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\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 * 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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"}
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.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 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.2",
3
+ "version": "0.3.4",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,8 +32,8 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "ws": "^8.18.0",
35
- "@polkadot-api/json-rpc-provider-proxy": "0.2.3",
36
- "@polkadot-api/json-rpc-provider": "0.0.4"
35
+ "@polkadot-api/json-rpc-provider": "0.0.4",
36
+ "@polkadot-api/json-rpc-provider-proxy": "0.2.3"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/ws": "^8.5.12"