@polkadot-api/ws-provider 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,11 +11,12 @@ const noop = () => {
11
11
  const defaultConfig = {
12
12
  onStatusChanged: noop,
13
13
  innerEnhancer: (x) => x,
14
- timeout: 5e3
14
+ timeout: 5e3,
15
+ heartbeatTimeout: 4e4
15
16
  };
16
17
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
17
18
  const getWsProvider = (endpoints, config) => {
18
- const { onStatusChanged, innerEnhancer, timeout } = {
19
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
19
20
  ...defaultConfig,
20
21
  ...config
21
22
  };
@@ -104,11 +105,22 @@ const getWsProvider = (endpoints, config) => {
104
105
  };
105
106
  });
106
107
  return (onMessage, onHalt) => {
108
+ let heartbeatToken;
109
+ const heartbeat = () => {
110
+ clearTimeout(heartbeatToken);
111
+ heartbeatToken = setTimeout(() => {
112
+ console.warn(`Terminate: heartbeat timeout`);
113
+ disconnect(true);
114
+ }, heartbeatTimeout);
115
+ };
116
+ heartbeat();
107
117
  const connection = inner(onMessage);
108
118
  const _onMessage = (e) => {
119
+ heartbeat();
109
120
  if (typeof e.data === "string") _onInnerMessage(e.data);
110
121
  };
111
122
  const innerHalt = (reason) => (e) => {
123
+ clearTimeout(heartbeatToken);
112
124
  console.warn(`WS halt (${reason})`);
113
125
  onStatusChanged(
114
126
  status = {
@@ -120,12 +132,15 @@ const getWsProvider = (endpoints, config) => {
120
132
  };
121
133
  const onError = innerHalt(WsEvent.ERROR);
122
134
  const onClose = innerHalt(WsEvent.CLOSE);
135
+ socket.addEventListener("ping", heartbeat);
123
136
  socket.addEventListener("message", _onMessage);
124
137
  socket.addEventListener("error", onError);
125
138
  socket.addEventListener("close", onClose);
126
139
  disconnect = (withHalt) => {
140
+ clearTimeout(heartbeatToken);
127
141
  outerCleanup();
128
142
  disconnect = noop;
143
+ socket.removeEventListener("ping", heartbeat);
129
144
  socket.removeEventListener("message", _onMessage);
130
145
  socket.removeEventListener("error", onError);
131
146
  socket.removeEventListener("close", onClose);
@@ -1 +1 @@
1
- {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
@@ -40,6 +40,7 @@ declare const getWsProvider: (endpoints: string | Array<string | {
40
40
  onStatusChanged: (status: StatusChange) => void;
41
41
  innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider;
42
42
  timeout: number;
43
+ heartbeatTimeout: number;
43
44
  websocketClass: WebSocketClass;
44
45
  }>) => WsJsonRpcProvider;
45
46
 
@@ -108,11 +108,12 @@ const noop = () => {
108
108
  const defaultConfig = {
109
109
  onStatusChanged: noop,
110
110
  innerEnhancer: (x) => x,
111
- timeout: 5e3
111
+ timeout: 5e3,
112
+ heartbeatTimeout: 4e4
112
113
  };
113
114
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
114
115
  const getWsProvider = (endpoints, config) => {
115
- const { onStatusChanged, innerEnhancer, timeout } = {
116
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
116
117
  ...defaultConfig,
117
118
  ...config
118
119
  };
@@ -201,11 +202,22 @@ const getWsProvider = (endpoints, config) => {
201
202
  };
202
203
  });
203
204
  return (onMessage, onHalt) => {
205
+ let heartbeatToken;
206
+ const heartbeat = () => {
207
+ clearTimeout(heartbeatToken);
208
+ heartbeatToken = setTimeout(() => {
209
+ console.warn(`Terminate: heartbeat timeout`);
210
+ disconnect(true);
211
+ }, heartbeatTimeout);
212
+ };
213
+ heartbeat();
204
214
  const connection = inner(onMessage);
205
215
  const _onMessage = (e) => {
216
+ heartbeat();
206
217
  if (typeof e.data === "string") _onInnerMessage(e.data);
207
218
  };
208
219
  const innerHalt = (reason) => (e) => {
220
+ clearTimeout(heartbeatToken);
209
221
  console.warn(`WS halt (${reason})`);
210
222
  onStatusChanged(
211
223
  status = {
@@ -217,12 +229,15 @@ const getWsProvider = (endpoints, config) => {
217
229
  };
218
230
  const onError = innerHalt(WsEvent.ERROR);
219
231
  const onClose = innerHalt(WsEvent.CLOSE);
232
+ socket.addEventListener("ping", heartbeat);
220
233
  socket.addEventListener("message", _onMessage);
221
234
  socket.addEventListener("error", onError);
222
235
  socket.addEventListener("close", onClose);
223
236
  disconnect = (withHalt) => {
237
+ clearTimeout(heartbeatToken);
224
238
  outerCleanup();
225
239
  disconnect = noop;
240
+ socket.removeEventListener("ping", heartbeat);
226
241
  socket.removeEventListener("message", _onMessage);
227
242
  socket.removeEventListener("error", onError);
228
243
  socket.removeEventListener("close", onClose);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":["WsEvent","result","getSyncProvider"],"mappings":";;;;AAEO,IAAK,OAAA,qBAAAA,QAAAA,KAAL;AACL,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAJU,EAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;ACAZ,MAAM,UAAiD,EAAC;AACvD,CAAC,IAAA,EAAM,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY;AACvC,EAAA,OAAA,CAAQ,CAAA,UAAA,EAAa,OAAO,CAAA,OAAA,CAAS,CAAA,GAAI,QAAA;AACzC,EAAA,OAAA,CAAQ,CAAA,UAAA,EAAa,OAAO,CAAA,SAAA,CAAW,CAAA,GAAI,UAAA;AAC7C,CAAC,CAAA;AAED,MAAM,UAAA,GAAa,OAAO,EAAE,MAAA,EAAQ,KAAK,GAAA,EAAI,EAAG,OAAO,CAAA,EAAE,CAAA;AAElD,MAAM,cAAA,GAKT,CAAC,IAAA,EAAM,eAAA,KAAoB;AAC7B,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,SAA4C,UAAA,EAAW;AAE3D,EAAA,MAAM,MAAA,GAA0B,CAAC,KAAA,KAAU;AACzC,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,IAAA,CAAK,CAAC,YAAA,KAAiB;AAClD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAEtC,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAAC,OAAAA,EAAO,GAAI,MAAA;AACvB,QAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,UAAA,gBAAA,GAAmB,MAAA;AACnB,UAAA,IACEA,WACA,CAAEA,OAAAA,CAAO,OAAA,CAAqB,IAAA,CAAK,CAAC,CAAA,KAAM;AACxC,YAAA,MAAM,CAAC,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AACnC,YAAA,OAAO,KAAA,KAAU,eAAe,IAAA,KAAS,QAAA;AAAA,UAC3C,CAAC,CAAA,EACD;AACA,YAAA,KAAA,CAAM,YAAY,CAAA;AAClB,YAAA,eAAA,EAAgB;AAChB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC1B,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,UAAA,IAAI,cAAA,CAAe,GAAA,CAAIA,OAAM,CAAA,EAAG;AAC9B,YAAA,cAAA,CAAe,OAAOA,OAAM,CAAA;AAC5B,YAAA;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,IAAIA,OAAM,CAAA;AAClB,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA;AAC3C,UAAA,IAAI,WAAA,GAAc,CAAA;AAChB,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,4CAA4C,WAAW,CAAA,CAAA;AAAA,aACzD;AAAA,eAAA,IACO,OAAO,KAAA,EAAO;AACrB,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,WAAW,CAAA,IAAA,CAAM,CAAA;AAChE,YAAA,eAAA,EAAgB;AAChB,YAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,CAAA;AACnB,YAAA,IAAA,CAAK,GAAG,CAAA;AACR,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,EAAE,YAAA,EAAc,MAAA,EAAAA,OAAAA,KAAY,MAAA,CAAe,MAAA;AACjD,QAAA,IAAIA,OAAAA,EAAQ,UAAU,MAAA,EAAQ;AAC5B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,MAAA;AACjC,UAAA,MAAA,CAAO,MAAA,IAAU,IAAA;AACjB,UAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,GAAO,GAAA,GAAO,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA;AAEhD,UAAA,IAAI,QAAQ,GAAA,CAAI,YAAY,CAAA,EAAG,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,eACrD,cAAA,CAAe,IAAI,YAAY,CAAA;AAAA,QACtC;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,YAAY,CAAA;AAClB,MAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,QAAA,MAAA,GAAS,UAAA,EAAW;AACpB,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpC,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,aAAA,EAAe,gBAAA,GAAmB,MAAA,CAAO,EAAA;AAE/D,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AACpC,QAAA,IAAI,WAAW,QAAA,EAAU;AACvB,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,UAAU,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY;AAChC,UAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACjC;AACA,QAAA,IAAA,CAAK,UAAU,CAAA;AAAA,MACjB,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAA,EAAQ;AAAA,IAC3B,SAAS,MAAM;AACb,MAAA,cAAA,CAAe,KAAA,EAAM;AACrB,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,GACD,CAAA;AACH,CAAA;;ACvGA,MAAM,YAAA,GAA6B;AAAA,EACjC,MAAM,OAAA,CAAQ,KAAA;AAAA,EACd,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AACjB,CAAA;AAEO,MAAM,OAAO,MAAM;AAAC,CAAA;AAEpB,MAAM,aAAA,GAIT;AAAA,EACF,eAAA,EAAiB,IAAA;AAAA,EACjB,aAAA,EAAe,CAAC,CAAA,KAAuB,CAAA;AAAA,EACvC,OAAA,EAAS;AACX,CAAA;AAEO,MAAM,eAAe,CAC1B,SAAA,KAEA,UAAU,GAAA,CAAI,CAAC,MAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAC,CAAC,CAAA,GAAI,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAE,CAAA;AAEnE,MAAM,aAAA,GAAgB,CAC3B,SAAA,EAGA,MAAA,KAMsB;AACtB,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAe,OAAA,EAAQ,GAAI;AAAA,IAClD,GAAG,aAAA;AAAA,IACH,GAAG;AAAA,GACL;AACA,EAAA,MAAM,eAAA,GAAkB,YAAA;AAAA,IACtB,MAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS;AAAA,GACnD;AACA,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,UAAA,CAAW,SAAA;AAC5D,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAE9D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,QAAA,GAA0D,IAAA;AAC9D,EAAA,IAAI,UAAA,GAA2C,IAAA;AAE/C,EAAA,IAAI,YAAA,GAA2B,IAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,cAAA;AAAA,IACbC,qCAAgB,YAAY;AAC1B,MAAA,MAAM,CAAC,KAAK,SAAS,CAAA,GACnB,YAAY,eAAA,CAAgB,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA;AACtD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AAChD,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AACrD,UAAA,MAAA,CAAO,KAAA,EAAM;AAAA,QACf,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX,CAAA;AACA,MAAA,eAAA;AAAA,QACG,MAAA,GAAS;AAAA,UACR,MAAM,OAAA,CAAQ,UAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,QAAA,MAAM,SAAS,MAAM;AACnB,UAAA,cAAA,EAAe;AACf,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAEA,QAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAoB;AACnC,UAAA,cAAA,EAAe;AACf,UAAA,IAAI,CAAA,IAAK,MAAM,gBAAA,EAAiB;AAChC,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,wBAAwB,GAAG,CAAA,EACzB,SAAA,GAAY,eAAA,GAAkB,YAAY,EAC5C,CAAA;AAAA,WACF;AACA,UAAA,eAAA;AAAA,YACG,MAAA,GAAS;AAAA,cACR,IAAA,EAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,cAClC,KAAA,EAAO;AAAA;AACT,WACF;AACA,UAAA,UAAA,CAAW,MAAA,EAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA;AAAA,QACnC,CAAA;AAEA,QAAA,MAAM,YAAA,GACJ,OAAA,KAAY,QAAA,GACR,UAAA,CAAW,MAAM;AACf,UAAA,cAAA,EAAe;AACf,UAAA,gBAAA,EAAiB;AACjB,UAAA,eAAA,CAAiB,SAAS,YAAa,CAAA;AACvC,UAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,QAC3B,CAAA,EAAG,OAAO,CAAA,GACV,MAAA;AAEN,QAAA,MAAM,iBAAiB,MAAM;AAC3B,UAAA,YAAA,CAAa,YAAY,CAAA;AACzB,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,QAC3C,CAAA;AACA,QAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,CAAA;AAAA,MACF,CAAC,CAAA;AAED,MAAA,eAAA;AAAA,QACG,MAAA,GAAS;AAAA,UACR,MAAM,OAAA,CAAQ,SAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,IAAI,eAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAC,cAAA,KAAmB;AAC9C,QAAA,eAAA,GAAkB,cAAA;AAClB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,CAAC,CAAA,KAAM;AACX,YAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACf,CAAA;AAAA,UACA,YAAY,MAAM;AAChB,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAO,CAAC,WAAW,MAAA,KAAW;AAC5B,QAAA,MAAM,UAAA,GAAa,MAAM,SAAS,CAAA;AAClC,QAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAoB;AACtC,UAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,eAAA,CAAgB,EAAE,IAAI,CAAA;AAAA,QACxD,CAAA;AACA,QAAA,MAAM,SAAA,GACJ,CAAC,MAAA,KAA0C,CAAC,CAAA,KAAW;AACrD,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAG,CAAA;AAClC,UAAA,eAAA;AAAA,YACG,MAAA,GAAS;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,KAAA,EAAO;AAAA;AACT,WACF;AACA,UAAA,MAAA,EAAO;AAAA,QACT,CAAA;AACF,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AAEvC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAC7C,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,CAAC,QAAA,KAAa;AACzB,UAAA,YAAA,EAAa;AACb,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAChD,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,gBAAA,EAAiB;AACjB,UAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAA;AACxB,UAAA,UAAA,CAAW,UAAA,EAAW;AAAA,QACxB,CAAA;AAEA,QAAA,OAAO,UAAA;AAAA,MACT,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,IACD,MAAM;AACJ,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,GACF;AACA,EAAA,YAAA,GAAe,MAAA,CAAO,OAAA;AACtB,EAAA,OAAQ,MAAA,CAAe,OAAA;AAEvB,EAAA,MAAM,QAAA,GAAwC,IAAI,IAAA,KAAS;AACzD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,EAAO;AACnC,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,GAAW,IAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,aAAkB,IAAI,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,EAAE,QAAQ,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA;AAC5E;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":["WsEvent","result","getSyncProvider"],"mappings":"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"}
@@ -11,11 +11,12 @@ const noop = () => {
11
11
  const defaultConfig = {
12
12
  onStatusChanged: noop,
13
13
  innerEnhancer: (x) => x,
14
- timeout: 5e3
14
+ timeout: 5e3,
15
+ heartbeatTimeout: 4e4
15
16
  };
16
17
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
17
18
  const getWsProvider = (endpoints, config) => {
18
- const { onStatusChanged, innerEnhancer, timeout } = {
19
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
19
20
  ...defaultConfig,
20
21
  ...config
21
22
  };
@@ -104,11 +105,22 @@ const getWsProvider = (endpoints, config) => {
104
105
  };
105
106
  });
106
107
  return (onMessage, onHalt) => {
108
+ let heartbeatToken;
109
+ const heartbeat = () => {
110
+ clearTimeout(heartbeatToken);
111
+ heartbeatToken = setTimeout(() => {
112
+ console.warn(`Terminate: heartbeat timeout`);
113
+ disconnect(true);
114
+ }, heartbeatTimeout);
115
+ };
116
+ heartbeat();
107
117
  const connection = inner(onMessage);
108
118
  const _onMessage = (e) => {
119
+ heartbeat();
109
120
  if (typeof e.data === "string") _onInnerMessage(e.data);
110
121
  };
111
122
  const innerHalt = (reason) => (e) => {
123
+ clearTimeout(heartbeatToken);
112
124
  console.warn(`WS halt (${reason})`);
113
125
  onStatusChanged(
114
126
  status = {
@@ -120,12 +132,15 @@ const getWsProvider = (endpoints, config) => {
120
132
  };
121
133
  const onError = innerHalt(WsEvent.ERROR);
122
134
  const onClose = innerHalt(WsEvent.CLOSE);
135
+ socket.addEventListener("ping", heartbeat);
123
136
  socket.addEventListener("message", _onMessage);
124
137
  socket.addEventListener("error", onError);
125
138
  socket.addEventListener("close", onClose);
126
139
  disconnect = (withHalt) => {
140
+ clearTimeout(heartbeatToken);
127
141
  outerCleanup();
128
142
  disconnect = noop;
143
+ socket.removeEventListener("ping", heartbeat);
129
144
  socket.removeEventListener("message", _onMessage);
130
145
  socket.removeEventListener("error", onError);
131
146
  socket.removeEventListener("close", onClose);
@@ -1 +1 @@
1
- {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":";;;;AAMA,MAAM,YAAA,GAA6B;AAAA,EACjC,MAAM,OAAA,CAAQ,KAAA;AAAA,EACd,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AACjB,CAAA;AAEO,MAAM,OAAO,MAAM;AAAC;AAEpB,MAAM,aAAA,GAKT;AAAA,EACF,eAAA,EAAiB,IAAA;AAAA,EACjB,aAAA,EAAe,CAAC,CAAA,KAAuB,CAAA;AAAA,EACvC,OAAA,EAAS,GAAA;AAAA,EACT,gBAAA,EAAkB;AACpB;AAEO,MAAM,eAAe,CAC1B,SAAA,KAEA,UAAU,GAAA,CAAI,CAAC,MAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAC,CAAC,CAAA,GAAI,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAE;AAEnE,MAAM,aAAA,GAAgB,CAC3B,SAAA,EAGA,MAAA,KAOsB;AACtB,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAe,OAAA,EAAS,kBAAiB,GAAI;AAAA,IACpE,GAAG,aAAA;AAAA,IACH,GAAG;AAAA,GACL;AACA,EAAA,MAAM,eAAA,GAAkB,YAAA;AAAA,IACtB,MAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS;AAAA,GACnD;AACA,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,UAAA,CAAW,SAAA;AAC5D,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAE9D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,QAAA,GAA0D,IAAA;AAC9D,EAAA,IAAI,UAAA,GAA2C,IAAA;AAE/C,EAAA,IAAI,YAAA,GAA2B,IAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,cAAA;AAAA,IACb,gBAAgB,YAAY;AAC1B,MAAA,MAAM,CAAC,KAAK,SAAS,CAAA,GACnB,YAAY,eAAA,CAAgB,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA;AACtD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AAChD,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AACrD,UAAA,MAAA,CAAO,KAAA,EAAM;AAAA,QACf,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX,CAAA;AACA,MAAA,eAAA;AAAA,QACG,MAAA,GAAS;AAAA,UACR,MAAM,OAAA,CAAQ,UAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,QAAA,MAAM,SAAS,MAAM;AACnB,UAAA,cAAA,EAAe;AACf,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAEA,QAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAoB;AACnC,UAAA,cAAA,EAAe;AACf,UAAA,IAAI,CAAA,IAAK,MAAM,gBAAA,EAAiB;AAChC,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,wBAAwB,GAAG,CAAA,EACzB,SAAA,GAAY,eAAA,GAAkB,YAAY,EAC5C,CAAA;AAAA,WACF;AACA,UAAA,eAAA;AAAA,YACG,MAAA,GAAS;AAAA,cACR,IAAA,EAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,cAClC,KAAA,EAAO;AAAA;AACT,WACF;AACA,UAAA,UAAA,CAAW,MAAA,EAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA;AAAA,QACnC,CAAA;AAEA,QAAA,MAAM,YAAA,GACJ,OAAA,KAAY,QAAA,GACR,UAAA,CAAW,MAAM;AACf,UAAA,cAAA,EAAe;AACf,UAAA,gBAAA,EAAiB;AACjB,UAAA,eAAA,CAAiB,SAAS,YAAa,CAAA;AACvC,UAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,QAC3B,CAAA,EAAG,OAAO,CAAA,GACV,MAAA;AAEN,QAAA,MAAM,iBAAiB,MAAM;AAC3B,UAAA,YAAA,CAAa,YAAY,CAAA;AACzB,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,QAC3C,CAAA;AACA,QAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,CAAA;AAAA,MACF,CAAC,CAAA;AAED,MAAA,eAAA;AAAA,QACG,MAAA,GAAS;AAAA,UACR,MAAM,OAAA,CAAQ,SAAA;AAAA,UACd,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,IAAI,eAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAC,cAAA,KAAmB;AAC9C,QAAA,eAAA,GAAkB,cAAA;AAClB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,CAAC,CAAA,KAAM;AACX,YAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACf,CAAA;AAAA,UACA,YAAY,MAAM;AAChB,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAO,CAAC,WAAW,MAAA,KAAW;AAC5B,QAAA,IAAI,cAAA;AACJ,QAAA,MAAM,YAAY,MAAM;AACtB,UAAA,YAAA,CAAa,cAAc,CAAA;AAE3B,UAAA,cAAA,GAAiB,WAAW,MAAM;AAChC,YAAA,OAAA,CAAQ,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC3C,YAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UACjB,GAAG,gBAAgB,CAAA;AAAA,QACrB,CAAA;AACA,QAAA,SAAA,EAAU;AAEV,QAAA,MAAM,UAAA,GAAa,MAAM,SAAS,CAAA;AAClC,QAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAoB;AACtC,UAAA,SAAA,EAAU;AACV,UAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,eAAA,CAAgB,EAAE,IAAI,CAAA;AAAA,QACxD,CAAA;AACA,QAAA,MAAM,SAAA,GACJ,CAAC,MAAA,KAA0C,CAAC,CAAA,KAAW;AACrD,UAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAG,CAAA;AAClC,UAAA,eAAA;AAAA,YACG,MAAA,GAAS;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,KAAA,EAAO;AAAA;AACT,WACF;AACA,UAAA,MAAA,EAAO;AAAA,QACT,CAAA;AACF,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AAEvC,QAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,SAAS,CAAA;AACzC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAC7C,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,UAAA,GAAa,CAAC,QAAA,KAAa;AACzB,UAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,UAAA,YAAA,EAAa;AACb,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,SAAS,CAAA;AAC5C,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAChD,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,gBAAA,EAAiB;AACjB,UAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAA;AACxB,UAAA,UAAA,CAAW,UAAA,EAAW;AAAA,QACxB,CAAA;AAEA,QAAA,OAAO,UAAA;AAAA,MACT,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,IACD,MAAM;AACJ,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,GACF;AACA,EAAA,YAAA,GAAe,MAAA,CAAO,OAAA;AACtB,EAAA,OAAQ,MAAA,CAAe,OAAA;AAEvB,EAAA,MAAM,QAAA,GAAwC,IAAI,IAAA,KAAS;AACzD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,EAAO;AACnC,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,GAAW,IAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,aAAkB,IAAI,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,EAAE,QAAQ,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA;AAC5E;;;;"}
@@ -3,12 +3,13 @@ import { mapEndpoints, noop, defaultConfig, getWsProvider } from './default-prov
3
3
  const getLegacyWsProvider = (websocketClass) => {
4
4
  return (...args) => {
5
5
  let endpoints = [];
6
- let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
6
+ let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } = defaultConfig;
7
7
  const [firstArg] = args;
8
8
  if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
9
9
  endpoints = mapEndpoints(firstArg.endpoints);
10
10
  onStatusChanged = firstArg.onStatusChanged ?? noop;
11
11
  timeout = firstArg.timeout ?? timeout;
12
+ heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout;
12
13
  innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
13
14
  } else {
14
15
  if (typeof args[1] === "function")
@@ -32,7 +33,8 @@ const getLegacyWsProvider = (websocketClass) => {
32
33
  websocketClass,
33
34
  onStatusChanged,
34
35
  timeout,
35
- innerEnhancer
36
+ innerEnhancer,
37
+ heartbeatTimeout
36
38
  }
37
39
  );
38
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-provider.mjs","sources":["../../../src/legacy-provider.ts"],"sourcesContent":["import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { timeout, innerEnhancer, onStatusChanged } = defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n },\n )\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAA,GAAsB,CACjC,cAAA,KACuB;AACvB,EAAA,OAAO,IAAI,IAAA,KAA4B;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,EAAE,OAAA,EAAS,aAAA,EAAe,eAAA,EAAgB,GAAI,aAAA;AAElD,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAA;AACnB,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,SAAA,GAAY,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAA,IAAW,OAAA;AAC9B,MAAA,aAAA,GAAgB,QAAA,CAAS,aAAA,KAAkB,CAAC,CAAA,KAAM,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAA,SAAA,GAAY,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACb,CAAA,CAAE,WAAW,CAAA,GACT,CAAA,CAAE,CAAC,CAAA,GACH;AAAA,UACE,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,UACR,QAAA,EAAU,EAAE,CAAC;AAAA;AACf,OACN;AAAA,MACA;AAAA,QACE,cAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"legacy-provider.mjs","sources":["../../../src/legacy-provider.ts"],"sourcesContent":["import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } =\n defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n heartbeatTimeout,\n },\n )\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAA,GAAsB,CACjC,cAAA,KACuB;AACvB,EAAA,OAAO,IAAI,IAAA,KAA4B;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,EAAE,gBAAA,EAAkB,OAAA,EAAS,aAAA,EAAe,iBAAgB,GAC9D,aAAA;AAEF,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAA;AACnB,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,SAAA,GAAY,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAA,IAAW,OAAA;AAC9B,MAAA,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,gBAAA;AAChD,MAAA,aAAA,GAAgB,QAAA,CAAS,aAAA,KAAkB,CAAC,CAAA,KAAM,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAA,SAAA,GAAY,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACb,CAAA,CAAE,WAAW,CAAA,GACT,CAAA,CAAE,CAAC,CAAA,GACH;AAAA,UACE,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,UACR,QAAA,EAAU,EAAE,CAAC;AAAA;AACf,OACN;AAAA,MACA;AAAA,QACE,cAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;;;;"}
@@ -38,6 +38,7 @@ interface WsProviderConfig {
38
38
  }>;
39
39
  onStatusChanged?: (status: StatusChange) => void;
40
40
  timeout?: number;
41
+ heartbeatTimeout?: number;
41
42
  innerEnhancer?: (input: JsonRpcProvider) => JsonRpcProvider;
42
43
  }
43
44
  interface GetWsProviderInput {
package/dist/node/node.js CHANGED
@@ -109,11 +109,12 @@ const noop = () => {
109
109
  const defaultConfig = {
110
110
  onStatusChanged: noop,
111
111
  innerEnhancer: (x) => x,
112
- timeout: 5e3
112
+ timeout: 5e3,
113
+ heartbeatTimeout: 4e4
113
114
  };
114
115
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
115
116
  const getWsProvider$1 = (endpoints, config) => {
116
- const { onStatusChanged, innerEnhancer, timeout } = {
117
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
117
118
  ...defaultConfig,
118
119
  ...config
119
120
  };
@@ -202,11 +203,22 @@ const getWsProvider$1 = (endpoints, config) => {
202
203
  };
203
204
  });
204
205
  return (onMessage, onHalt) => {
206
+ let heartbeatToken;
207
+ const heartbeat = () => {
208
+ clearTimeout(heartbeatToken);
209
+ heartbeatToken = setTimeout(() => {
210
+ console.warn(`Terminate: heartbeat timeout`);
211
+ disconnect(true);
212
+ }, heartbeatTimeout);
213
+ };
214
+ heartbeat();
205
215
  const connection = inner(onMessage);
206
216
  const _onMessage = (e) => {
217
+ heartbeat();
207
218
  if (typeof e.data === "string") _onInnerMessage(e.data);
208
219
  };
209
220
  const innerHalt = (reason) => (e) => {
221
+ clearTimeout(heartbeatToken);
210
222
  console.warn(`WS halt (${reason})`);
211
223
  onStatusChanged(
212
224
  status = {
@@ -218,12 +230,15 @@ const getWsProvider$1 = (endpoints, config) => {
218
230
  };
219
231
  const onError = innerHalt(WsEvent.ERROR);
220
232
  const onClose = innerHalt(WsEvent.CLOSE);
233
+ socket.addEventListener("ping", heartbeat);
221
234
  socket.addEventListener("message", _onMessage);
222
235
  socket.addEventListener("error", onError);
223
236
  socket.addEventListener("close", onClose);
224
237
  disconnect = (withHalt) => {
238
+ clearTimeout(heartbeatToken);
225
239
  outerCleanup();
226
240
  disconnect = noop;
241
+ socket.removeEventListener("ping", heartbeat);
227
242
  socket.removeEventListener("message", _onMessage);
228
243
  socket.removeEventListener("error", onError);
229
244
  socket.removeEventListener("close", onClose);
@@ -251,12 +266,13 @@ const getWsProvider$1 = (endpoints, config) => {
251
266
  const getLegacyWsProvider = (websocketClass) => {
252
267
  return (...args) => {
253
268
  let endpoints = [];
254
- let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
269
+ let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } = defaultConfig;
255
270
  const [firstArg] = args;
256
271
  if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
257
272
  endpoints = mapEndpoints(firstArg.endpoints);
258
273
  onStatusChanged = firstArg.onStatusChanged ?? noop;
259
274
  timeout = firstArg.timeout ?? timeout;
275
+ heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout;
260
276
  innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
261
277
  } else {
262
278
  if (typeof args[1] === "function")
@@ -280,7 +296,8 @@ const getLegacyWsProvider = (websocketClass) => {
280
296
  websocketClass,
281
297
  onStatusChanged,
282
298
  timeout,
283
- innerEnhancer
299
+ innerEnhancer,
300
+ heartbeatTimeout
284
301
  }
285
302
  );
286
303
  };
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts","../../src/legacy-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}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n","import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { timeout, innerEnhancer, onStatusChanged } = defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n },\n )\n }\n}\n","import { WebSocket } from \"ws\"\nimport { getLegacyWsProvider } from \"./legacy-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types-common\"\nexport * from \"./types-legacy\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\n/**\n * @deprecated This export will be removed in PAPI v2. Migrate as follows:\n * `import { getWsProvider } from \"polkadot-api/ws-provider\"\n */\nexport const getWsProvider = getLegacyWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":["WsEvent","result","getWsProvider","getSyncProvider","WebSocket"],"mappings":"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"}
1
+ {"version":3,"file":"node.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts","../../src/legacy-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}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n","import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } =\n defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n heartbeatTimeout,\n },\n )\n }\n}\n","import { WebSocket } from \"ws\"\nimport { getLegacyWsProvider } from \"./legacy-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types-common\"\nexport * from \"./types-legacy\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\n/**\n * @deprecated This export will be removed in PAPI v2. Migrate as follows:\n * `import { getWsProvider } from \"polkadot-api/ws-provider\"\n */\nexport const getWsProvider = getLegacyWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":["WsEvent","result","getWsProvider","getSyncProvider","WebSocket"],"mappings":"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"}
@@ -11,11 +11,12 @@ const noop = () => {
11
11
  const defaultConfig = {
12
12
  onStatusChanged: noop,
13
13
  innerEnhancer: (x) => x,
14
- timeout: 5e3
14
+ timeout: 5e3,
15
+ heartbeatTimeout: 4e4
15
16
  };
16
17
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
17
18
  const getWsProvider = (endpoints, config) => {
18
- const { onStatusChanged, innerEnhancer, timeout } = {
19
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
19
20
  ...defaultConfig,
20
21
  ...config
21
22
  };
@@ -104,11 +105,22 @@ const getWsProvider = (endpoints, config) => {
104
105
  };
105
106
  });
106
107
  return (onMessage, onHalt) => {
108
+ let heartbeatToken;
109
+ const heartbeat = () => {
110
+ clearTimeout(heartbeatToken);
111
+ heartbeatToken = setTimeout(() => {
112
+ console.warn(`Terminate: heartbeat timeout`);
113
+ disconnect(true);
114
+ }, heartbeatTimeout);
115
+ };
116
+ heartbeat();
107
117
  const connection = inner(onMessage);
108
118
  const _onMessage = (e) => {
119
+ heartbeat();
109
120
  if (typeof e.data === "string") _onInnerMessage(e.data);
110
121
  };
111
122
  const innerHalt = (reason) => (e) => {
123
+ clearTimeout(heartbeatToken);
112
124
  console.warn(`WS halt (${reason})`);
113
125
  onStatusChanged(
114
126
  status = {
@@ -120,12 +132,15 @@ const getWsProvider = (endpoints, config) => {
120
132
  };
121
133
  const onError = innerHalt(WsEvent.ERROR);
122
134
  const onClose = innerHalt(WsEvent.CLOSE);
135
+ socket.addEventListener("ping", heartbeat);
123
136
  socket.addEventListener("message", _onMessage);
124
137
  socket.addEventListener("error", onError);
125
138
  socket.addEventListener("close", onClose);
126
139
  disconnect = (withHalt) => {
140
+ clearTimeout(heartbeatToken);
127
141
  outerCleanup();
128
142
  disconnect = noop;
143
+ socket.removeEventListener("ping", heartbeat);
129
144
  socket.removeEventListener("message", _onMessage);
130
145
  socket.removeEventListener("error", onError);
131
146
  socket.removeEventListener("close", onClose);
@@ -1 +1 @@
1
- {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-provider.mjs","sources":["../../../src/default-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@ import { mapEndpoints, noop, defaultConfig, getWsProvider } from './default-prov
3
3
  const getLegacyWsProvider = (websocketClass) => {
4
4
  return (...args) => {
5
5
  let endpoints = [];
6
- let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
6
+ let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } = defaultConfig;
7
7
  const [firstArg] = args;
8
8
  if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
9
9
  endpoints = mapEndpoints(firstArg.endpoints);
10
10
  onStatusChanged = firstArg.onStatusChanged ?? noop;
11
11
  timeout = firstArg.timeout ?? timeout;
12
+ heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout;
12
13
  innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
13
14
  } else {
14
15
  if (typeof args[1] === "function")
@@ -32,7 +33,8 @@ const getLegacyWsProvider = (websocketClass) => {
32
33
  websocketClass,
33
34
  onStatusChanged,
34
35
  timeout,
35
- innerEnhancer
36
+ innerEnhancer,
37
+ heartbeatTimeout
36
38
  }
37
39
  );
38
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-provider.mjs","sources":["../../../src/legacy-provider.ts"],"sourcesContent":["import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { timeout, innerEnhancer, onStatusChanged } = defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n },\n )\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAA,GAAsB,CACjC,cAAA,KACuB;AACvB,EAAA,OAAO,IAAI,IAAA,KAA4B;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,EAAE,OAAA,EAAS,aAAA,EAAe,eAAA,EAAgB,GAAI,aAAA;AAElD,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAA;AACnB,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,SAAA,GAAY,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAA,IAAW,OAAA;AAC9B,MAAA,aAAA,GAAgB,QAAA,CAAS,aAAA,KAAkB,CAAC,CAAA,KAAM,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAA,SAAA,GAAY,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACb,CAAA,CAAE,WAAW,CAAA,GACT,CAAA,CAAE,CAAC,CAAA,GACH;AAAA,UACE,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,UACR,QAAA,EAAU,EAAE,CAAC;AAAA;AACf,OACN;AAAA,MACA;AAAA,QACE,cAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"legacy-provider.mjs","sources":["../../../src/legacy-provider.ts"],"sourcesContent":["import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } =\n defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n heartbeatTimeout,\n },\n )\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAA,GAAsB,CACjC,cAAA,KACuB;AACvB,EAAA,OAAO,IAAI,IAAA,KAA4B;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,EAAE,gBAAA,EAAkB,OAAA,EAAS,aAAA,EAAe,iBAAgB,GAC9D,aAAA;AAEF,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAA;AACnB,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,SAAA,GAAY,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAA,IAAW,OAAA;AAC9B,MAAA,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,gBAAA;AAChD,MAAA,aAAA,GAAgB,QAAA,CAAS,aAAA,KAAkB,CAAC,CAAA,KAAM,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAA,SAAA,GAAY,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACb,CAAA,CAAE,WAAW,CAAA,GACT,CAAA,CAAE,CAAC,CAAA,GACH;AAAA,UACE,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,UACR,QAAA,EAAU,EAAE,CAAC;AAAA;AACf,OACN;AAAA,MACA;AAAA,QACE,cAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;;;;"}
package/dist/web/web.d.ts CHANGED
@@ -38,6 +38,7 @@ interface WsProviderConfig {
38
38
  }>;
39
39
  onStatusChanged?: (status: StatusChange) => void;
40
40
  timeout?: number;
41
+ heartbeatTimeout?: number;
41
42
  innerEnhancer?: (input: JsonRpcProvider) => JsonRpcProvider;
42
43
  }
43
44
  interface GetWsProviderInput {
package/dist/web/web.js CHANGED
@@ -108,11 +108,12 @@ const noop = () => {
108
108
  const defaultConfig = {
109
109
  onStatusChanged: noop,
110
110
  innerEnhancer: (x) => x,
111
- timeout: 5e3
111
+ timeout: 5e3,
112
+ heartbeatTimeout: 4e4
112
113
  };
113
114
  const mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
114
115
  const getWsProvider$1 = (endpoints, config) => {
115
- const { onStatusChanged, innerEnhancer, timeout } = {
116
+ const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {
116
117
  ...defaultConfig,
117
118
  ...config
118
119
  };
@@ -201,11 +202,22 @@ const getWsProvider$1 = (endpoints, config) => {
201
202
  };
202
203
  });
203
204
  return (onMessage, onHalt) => {
205
+ let heartbeatToken;
206
+ const heartbeat = () => {
207
+ clearTimeout(heartbeatToken);
208
+ heartbeatToken = setTimeout(() => {
209
+ console.warn(`Terminate: heartbeat timeout`);
210
+ disconnect(true);
211
+ }, heartbeatTimeout);
212
+ };
213
+ heartbeat();
204
214
  const connection = inner(onMessage);
205
215
  const _onMessage = (e) => {
216
+ heartbeat();
206
217
  if (typeof e.data === "string") _onInnerMessage(e.data);
207
218
  };
208
219
  const innerHalt = (reason) => (e) => {
220
+ clearTimeout(heartbeatToken);
209
221
  console.warn(`WS halt (${reason})`);
210
222
  onStatusChanged(
211
223
  status = {
@@ -217,12 +229,15 @@ const getWsProvider$1 = (endpoints, config) => {
217
229
  };
218
230
  const onError = innerHalt(WsEvent.ERROR);
219
231
  const onClose = innerHalt(WsEvent.CLOSE);
232
+ socket.addEventListener("ping", heartbeat);
220
233
  socket.addEventListener("message", _onMessage);
221
234
  socket.addEventListener("error", onError);
222
235
  socket.addEventListener("close", onClose);
223
236
  disconnect = (withHalt) => {
237
+ clearTimeout(heartbeatToken);
224
238
  outerCleanup();
225
239
  disconnect = noop;
240
+ socket.removeEventListener("ping", heartbeat);
226
241
  socket.removeEventListener("message", _onMessage);
227
242
  socket.removeEventListener("error", onError);
228
243
  socket.removeEventListener("close", onClose);
@@ -250,12 +265,13 @@ const getWsProvider$1 = (endpoints, config) => {
250
265
  const getLegacyWsProvider = (websocketClass) => {
251
266
  return (...args) => {
252
267
  let endpoints = [];
253
- let { timeout, innerEnhancer, onStatusChanged } = defaultConfig;
268
+ let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } = defaultConfig;
254
269
  const [firstArg] = args;
255
270
  if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
256
271
  endpoints = mapEndpoints(firstArg.endpoints);
257
272
  onStatusChanged = firstArg.onStatusChanged ?? noop;
258
273
  timeout = firstArg.timeout ?? timeout;
274
+ heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout;
259
275
  innerEnhancer = firstArg.innerEnhancer ?? ((x) => x);
260
276
  } else {
261
277
  if (typeof args[1] === "function")
@@ -279,7 +295,8 @@ const getLegacyWsProvider = (websocketClass) => {
279
295
  websocketClass,
280
296
  onStatusChanged,
281
297
  timeout,
282
- innerEnhancer
298
+ innerEnhancer,
299
+ heartbeatTimeout
283
300
  }
284
301
  );
285
302
  };
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts","../../src/legacy-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}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n","import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { timeout, innerEnhancer, onStatusChanged } = defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n },\n )\n }\n}\n","import { getLegacyWsProvider } from \"./legacy-provider\"\n\nexport * from \"./types-common\"\nexport * from \"./types-legacy\"\n\n/**\n * @deprecated This export will be removed in PAPI v2. Migrate as follows:\n * `import { getWsProvider } from \"polkadot-api/ws-provider\"\n */\nexport const getWsProvider = getLegacyWsProvider(WebSocket)\n"],"names":["WsEvent","result","getWsProvider","getSyncProvider"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sources":["../../src/types-common.ts","../../src/follow-enhancer.ts","../../src/default-provider.ts","../../src/legacy-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}\nexport { type JsonRpcProvider }\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nconst methods: Record<string, \"follow\" | \"unfollow\"> = {}\n;[\"v1\", \"unstable\"].forEach((version) => {\n methods[`chainHead_${version}_follow`] = \"follow\"\n methods[`chainHead_${version}_unfollow`] = \"unfollow\"\n})\n\nconst resetStops = () => ({ latest: Date.now(), count: 0 })\n\nexport const followEnhancer: (\n input: JsonRpcProvider,\n forceDisconnect: () => void,\n) => JsonRpcProvider & {\n cleanup: () => void\n} = (base, forceDisconnect) => {\n const prematureStops = new Set<string>()\n const preOpId = new Map<string, string>()\n const onGoing = new Set<string>()\n let methodsRequestId: string | undefined\n let nStops: { latest: number; count: number } = resetStops()\n\n const result: JsonRpcProvider = (onMsg) => {\n const { send, disconnect } = base((fromProvider) => {\n const parsed = JSON.parse(fromProvider)\n // it's a response\n if (\"id\" in parsed) {\n const { id, result } = parsed\n if (id === methodsRequestId) {\n methodsRequestId = undefined\n if (\n result &&\n !(result.methods as string[]).some((x) => {\n const [group, , name] = x.split(\"_\")\n return group === \"chainHead\" && name === \"follow\"\n })\n ) {\n onMsg(fromProvider)\n forceDisconnect()\n return\n }\n }\n\n const msg = preOpId.get(id)\n if (msg) {\n preOpId.delete(id)\n if (prematureStops.has(result)) {\n prematureStops.delete(result)\n return\n }\n\n onGoing.add(result)\n const currentSize = onGoing.size + preOpId.size\n if (currentSize > 2)\n console.warn(\n `Too many chainHead follow subscriptions (${currentSize})`,\n )\n else if (parsed.error) {\n console.warn(`chainHead follow failed on the ${currentSize} sub`)\n forceDisconnect()\n preOpId.set(id, msg)\n send(msg)\n return\n }\n }\n } else {\n // it's a notifiaction\n const { subscription, result } = (parsed as any).params\n if (result?.event === \"stop\") {\n const diff = Date.now() - nStops.latest\n nStops.latest += diff\n nStops.count = diff < 1000 ? nStops.count + 1 : 1\n\n if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n\n onMsg(fromProvider)\n if (nStops.count > 2) {\n nStops = resetStops()\n forceDisconnect()\n }\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n if (parsed.method === \"rpc_methods\") methodsRequestId = parsed.id\n\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.set(parsed.id, toProvider)\n } else if (method === \"unfollow\") {\n onGoing.delete(parsed.params[0])\n }\n send(toProvider)\n },\n disconnect,\n }\n }\n\n return Object.assign(result, {\n cleanup: () => {\n prematureStops.clear()\n preOpId.clear()\n onGoing.clear()\n },\n })\n}\n","import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { StatusChange, WsJsonRpcProvider, WsEvent } from \"./types-common\"\nimport { followEnhancer } from \"./follow-enhancer\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { WebSocketClass } from \"./types-new\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nexport const noop = () => {}\n\nexport const defaultConfig: {\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n} = {\n onStatusChanged: noop,\n innerEnhancer: (x: JsonRpcProvider) => x,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n}\n\nexport const mapEndpoints = (\n endpoints: Array<string | { uri: string; protocol: string | string[] }>,\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getWsProvider = (\n endpoints:\n | string\n | Array<string | { uri: string; protocol: string | string[] }>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n innerEnhancer: (input: JsonRpcProvider) => JsonRpcProvider\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n }>,\n): WsJsonRpcProvider => {\n const { onStatusChanged, innerEnhancer, timeout, heartbeatTimeout } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = mapEndpoints(\n Array.isArray(endpoints) ? endpoints : [endpoints],\n )\n const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket\n if (!WebsocketClass) throw new Error(\"Missing WebSocket class\")\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] =\n switchTo || actualEndpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n let _onInnerMessage: (msg: string) => void\n const inner = innerEnhancer((onInnerMessage) => {\n _onInnerMessage = onInnerMessage\n return {\n send: (m) => {\n socket.send(m)\n },\n disconnect: () => {\n disconnect()\n },\n }\n })\n\n return (onMessage, onHalt) => {\n let heartbeatToken: NodeJS.Timeout\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n\n heartbeatToken = setTimeout(() => {\n console.warn(`Terminate: heartbeat timeout`)\n disconnect(true)\n }, heartbeatTimeout)\n }\n heartbeat()\n\n const connection = inner(onMessage)\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") _onInnerMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n clearTimeout(heartbeatToken)\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(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n clearTimeout(heartbeatToken)\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n connection.disconnect()\n }\n\n return connection\n }\n }),\n () => {\n switchFn()\n },\n )\n outerCleanup = result.cleanup\n delete (result as any).cleanup\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (...args) => {\n if (status.type === WsEvent.CLOSE) return\n if (args.length) switchTo = args as any\n if (status.type !== WsEvent.ERROR) disconnect(true)\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n","import type { StatusChange, WsJsonRpcProvider } from \"./types-common\"\nimport type { GetWsProviderInput } from \"./types-legacy\"\nimport {\n getWsProvider,\n mapEndpoints,\n defaultConfig,\n noop,\n} from \"./default-provider\"\nimport { type WebSocketClass } from \"./types-new\"\n\nexport const getLegacyWsProvider = (\n websocketClass: WebSocketClass,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let { heartbeatTimeout, timeout, innerEnhancer, onStatusChanged } =\n defaultConfig\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n heartbeatTimeout = firstArg.heartbeatTimeout ?? heartbeatTimeout\n innerEnhancer = firstArg.innerEnhancer ?? ((x) => x)\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n return getWsProvider(\n endpoints.map((x) =>\n x.length === 1\n ? x[0]\n : {\n uri: x[0],\n protocol: x[1],\n },\n ),\n {\n websocketClass,\n onStatusChanged,\n timeout,\n innerEnhancer,\n heartbeatTimeout,\n },\n )\n }\n}\n","import { getLegacyWsProvider } from \"./legacy-provider\"\n\nexport * from \"./types-common\"\nexport * from \"./types-legacy\"\n\n/**\n * @deprecated This export will be removed in PAPI v2. Migrate as follows:\n * `import { getWsProvider } from \"polkadot-api/ws-provider\"\n */\nexport const getWsProvider = getLegacyWsProvider(WebSocket)\n"],"names":["WsEvent","result","getWsProvider","getSyncProvider"],"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.6.2",
3
+ "version": "0.7.1",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -47,7 +47,7 @@
47
47
  "@types/ws": "^8.18.1",
48
48
  "ws": "^8.18.3",
49
49
  "@polkadot-api/json-rpc-provider": "0.0.4",
50
- "@polkadot-api/json-rpc-provider-proxy": "0.2.4"
50
+ "@polkadot-api/json-rpc-provider-proxy": "0.2.5"
51
51
  },
52
52
  "scripts": {
53
53
  "build-core": "tsc --noEmit && rollup -c",