@polkadot-api/ws-provider 0.3.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/esm/follow-enhancer.mjs +20 -4
- package/dist/node/esm/follow-enhancer.mjs.map +1 -1
- package/dist/node/esm/ws-provider.mjs.map +1 -1
- package/dist/node/node.js +20 -4
- package/dist/node/node.js.map +1 -1
- package/dist/web/esm/follow-enhancer.mjs +20 -4
- package/dist/web/esm/follow-enhancer.mjs.map +1 -1
- package/dist/web/esm/ws-provider.mjs.map +1 -1
- package/dist/web/web.js +20 -4
- package/dist/web/web.js.map +1 -1
- package/package.json +4 -4
|
@@ -5,14 +5,27 @@ const methods = {};
|
|
|
5
5
|
});
|
|
6
6
|
const followEnhancer = (base, forceDisconnect) => {
|
|
7
7
|
const prematureStops = /* @__PURE__ */ new Set();
|
|
8
|
-
const preOpId = /* @__PURE__ */ new
|
|
8
|
+
const preOpId = /* @__PURE__ */ new Map();
|
|
9
9
|
const onGoing = /* @__PURE__ */ new Set();
|
|
10
|
+
let methodsRequestId;
|
|
10
11
|
const result = (onMsg) => {
|
|
11
12
|
const { send, disconnect } = base((fromProvider) => {
|
|
12
13
|
const parsed = JSON.parse(fromProvider);
|
|
13
14
|
if ("id" in parsed) {
|
|
14
15
|
const { id, result: result2 } = parsed;
|
|
15
|
-
if (
|
|
16
|
+
if (id === methodsRequestId) {
|
|
17
|
+
methodsRequestId = void 0;
|
|
18
|
+
if (result2 && !result2.methods.some((x) => {
|
|
19
|
+
const [group, , name] = x.split("_");
|
|
20
|
+
return group === "chainHead" && name === "follow";
|
|
21
|
+
})) {
|
|
22
|
+
onMsg(fromProvider);
|
|
23
|
+
forceDisconnect();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const msg = preOpId.get(id);
|
|
28
|
+
if (msg) {
|
|
16
29
|
preOpId.delete(id);
|
|
17
30
|
if (prematureStops.has(result2)) {
|
|
18
31
|
prematureStops.delete(result2);
|
|
@@ -26,7 +39,9 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
26
39
|
);
|
|
27
40
|
else if (parsed.error) {
|
|
28
41
|
console.warn(`chainHead follow failed on the ${currentSize} sub`);
|
|
29
|
-
|
|
42
|
+
forceDisconnect();
|
|
43
|
+
preOpId.set(id, msg);
|
|
44
|
+
send(msg);
|
|
30
45
|
return;
|
|
31
46
|
}
|
|
32
47
|
}
|
|
@@ -42,9 +57,10 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
42
57
|
return {
|
|
43
58
|
send(toProvider) {
|
|
44
59
|
const parsed = JSON.parse(toProvider);
|
|
60
|
+
if (parsed.method === "rpc_methods") methodsRequestId = parsed.id;
|
|
45
61
|
const method = methods[parsed.method];
|
|
46
62
|
if (method === "follow") {
|
|
47
|
-
preOpId.
|
|
63
|
+
preOpId.set(parsed.id, toProvider);
|
|
48
64
|
} else if (method === "unfollow") {
|
|
49
65
|
onGoing.delete(parsed.params[0]);
|
|
50
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow-enhancer.mjs","sources":["../../../src/follow-enhancer.ts"],"sourcesContent":["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\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
|
|
1
|
+
{"version":3,"file":"follow-enhancer.mjs","sources":["../../../src/follow-enhancer.ts"],"sourcesContent":["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\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\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\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"],"names":["result"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n"],"names":["args"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n"],"names":["args"],"mappings":"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"}
|
package/dist/node/node.js
CHANGED
|
@@ -18,14 +18,27 @@ const methods = {};
|
|
|
18
18
|
});
|
|
19
19
|
const followEnhancer = (base, forceDisconnect) => {
|
|
20
20
|
const prematureStops = /* @__PURE__ */ new Set();
|
|
21
|
-
const preOpId = /* @__PURE__ */ new
|
|
21
|
+
const preOpId = /* @__PURE__ */ new Map();
|
|
22
22
|
const onGoing = /* @__PURE__ */ new Set();
|
|
23
|
+
let methodsRequestId;
|
|
23
24
|
const result = (onMsg) => {
|
|
24
25
|
const { send, disconnect } = base((fromProvider) => {
|
|
25
26
|
const parsed = JSON.parse(fromProvider);
|
|
26
27
|
if ("id" in parsed) {
|
|
27
28
|
const { id, result: result2 } = parsed;
|
|
28
|
-
if (
|
|
29
|
+
if (id === methodsRequestId) {
|
|
30
|
+
methodsRequestId = void 0;
|
|
31
|
+
if (result2 && !result2.methods.some((x) => {
|
|
32
|
+
const [group, , name] = x.split("_");
|
|
33
|
+
return group === "chainHead" && name === "follow";
|
|
34
|
+
})) {
|
|
35
|
+
onMsg(fromProvider);
|
|
36
|
+
forceDisconnect();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const msg = preOpId.get(id);
|
|
41
|
+
if (msg) {
|
|
29
42
|
preOpId.delete(id);
|
|
30
43
|
if (prematureStops.has(result2)) {
|
|
31
44
|
prematureStops.delete(result2);
|
|
@@ -39,7 +52,9 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
39
52
|
);
|
|
40
53
|
else if (parsed.error) {
|
|
41
54
|
console.warn(`chainHead follow failed on the ${currentSize} sub`);
|
|
42
|
-
|
|
55
|
+
forceDisconnect();
|
|
56
|
+
preOpId.set(id, msg);
|
|
57
|
+
send(msg);
|
|
43
58
|
return;
|
|
44
59
|
}
|
|
45
60
|
}
|
|
@@ -55,9 +70,10 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
55
70
|
return {
|
|
56
71
|
send(toProvider) {
|
|
57
72
|
const parsed = JSON.parse(toProvider);
|
|
73
|
+
if (parsed.method === "rpc_methods") methodsRequestId = parsed.id;
|
|
58
74
|
const method = methods[parsed.method];
|
|
59
75
|
if (method === "follow") {
|
|
60
|
-
preOpId.
|
|
76
|
+
preOpId.set(parsed.id, toProvider);
|
|
61
77
|
} else if (method === "unfollow") {
|
|
62
78
|
onGoing.delete(parsed.params[0]);
|
|
63
79
|
}
|
package/dist/node/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sources":["../../src/types.ts","../../src/follow-enhancer.ts","../../src/ws-provider.ts","../../src/node.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { 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\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 Set<string>()\n const onGoing = new Set<string>()\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 (preOpId.has(id)) {\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 Promise.resolve().then(forceDisconnect)\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.add(parsed.id)\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 {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n","import { WebSocket } from \"ws\"\nimport { getInternalWsProvider } from \"./ws-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\nexport const getWsProvider = getInternalWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":["WsEvent","result","getSyncProvider","args","WebSocket"],"mappings":";;;;;AAEY,IAAA,OAAA,qBAAAA,QAAL,KAAA;AACL,EAAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAJU,EAAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;;ACAZ,MAAM,UAAiD,EAAC;AACvD,CAAC,IAAM,EAAA,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACvC,EAAQ,OAAA,CAAA,CAAA,UAAA,EAAa,OAAO,CAAA,OAAA,CAAS,CAAI,GAAA,QAAA;AACzC,EAAQ,OAAA,CAAA,CAAA,UAAA,EAAa,OAAO,CAAA,SAAA,CAAW,CAAI,GAAA,UAAA;AAC7C,CAAC,CAAA;AAEY,MAAA,cAAA,GAKT,CAAC,IAAA,EAAM,eAAoB,KAAA;AAC7B,EAAM,MAAA,cAAA,uBAAqB,GAAY,EAAA;AACvC,EAAM,MAAA,OAAA,uBAAc,GAAY,EAAA;AAChC,EAAM,MAAA,OAAA,uBAAc,GAAY,EAAA;AAEhC,EAAM,MAAA,MAAA,GAA0B,CAAC,KAAU,KAAA;AACzC,IAAA,MAAM,EAAE,IAAM,EAAA,UAAA,EAAe,GAAA,IAAA,CAAK,CAAC,YAAiB,KAAA;AAClD,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,YAAY,CAAA;AAEtC,MAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,QAAA,MAAM,EAAE,EAAA,EAAI,MAAAC,EAAAA,OAAAA,EAAW,GAAA,MAAA;AACvB,QAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,EAAE,CAAG,EAAA;AACnB,UAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,UAAI,IAAA,cAAA,CAAe,GAAIA,CAAAA,OAAM,CAAG,EAAA;AAC9B,YAAA,cAAA,CAAe,OAAOA,OAAM,CAAA;AAC5B,YAAA;AAAA;AAGF,UAAA,OAAA,CAAQ,IAAIA,OAAM,CAAA;AAClB,UAAM,MAAA,WAAA,GAAc,OAAQ,CAAA,IAAA,GAAO,OAAQ,CAAA,IAAA;AAC3C,UAAA,IAAI,WAAc,GAAA,CAAA;AAChB,YAAQ,OAAA,CAAA,IAAA;AAAA,cACN,4CAA4C,WAAW,CAAA,CAAA;AAAA,aACzD;AAAA,eAAA,IACO,OAAO,KAAO,EAAA;AACrB,YAAQ,OAAA,CAAA,IAAA,CAAK,CAAkC,+BAAA,EAAA,WAAW,CAAM,IAAA,CAAA,CAAA;AAChE,YAAQ,OAAA,CAAA,OAAA,EAAU,CAAA,IAAA,CAAK,eAAe,CAAA;AACtC,YAAA;AAAA;AACF;AACF,OACK,MAAA;AAEL,QAAA,MAAM,EAAE,YAAA,EAAc,MAAAA,EAAAA,OAAAA,KAAY,MAAe,CAAA,MAAA;AACjD,QAAIA,IAAAA,OAAAA,EAAQ,UAAU,MAAQ,EAAA;AAC5B,UAAA,IAAI,QAAQ,GAAI,CAAA,YAAY,CAAG,EAAA,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,eACrD,cAAA,CAAe,IAAI,YAAY,CAAA;AAAA;AACtC;AAEF,MAAA,KAAA,CAAM,YAAY,CAAA;AAAA,KACnB,CAAA;AAED,IAAO,OAAA;AAAA,MACL,KAAK,UAAY,EAAA;AACf,QAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACpC,QAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAA;AACpC,QAAA,IAAI,WAAW,QAAU,EAAA;AACvB,UAAQ,OAAA,CAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,SACvB,MAAA,IAAW,WAAW,UAAY,EAAA;AAChC,UAAA,OAAA,CAAQ,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,CAAC,CAAC,CAAA;AAAA;AAEjC,QAAA,IAAA,CAAK,UAAU,CAAA;AAAA,OACjB;AAAA,MACA;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAO,OAAO,MAAQ,EAAA;AAAA,IAC3B,SAAS,MAAM;AACb,MAAA,cAAA,CAAe,KAAM,EAAA;AACrB,MAAA,OAAA,CAAQ,KAAM,EAAA;AACd,MAAA,OAAA,CAAQ,KAAM,EAAA;AAAA;AAChB,GACD,CAAA;AACH,CAAA;;AClEA,MAAM,YAA6B,GAAA;AAAA,EACjC,MAAM,OAAQ,CAAA,KAAA;AAAA,EACd,KAAA,EAAO,EAAE,IAAA,EAAM,SAAU;AAC3B,CAAA;AAEA,MAAM,OAAO,MAAM;AAAC,CAAA;AAEpB,MAAM,eAAe,CACnB,SAAA,KAEA,UAAU,GAAI,CAAA,CAAC,MAAO,OAAO,CAAA,KAAM,QAAW,GAAA,CAAC,CAAC,CAAI,GAAA,CAAC,EAAE,GAAK,EAAA,CAAA,CAAE,QAAQ,CAAE,CAAA;AAE7D,MAAA,qBAAA,GAAwB,CACnC,cACuB,KAAA;AACvB,EAAA,OAAO,IAAI,IAA4B,KAAA;AACrC,IAAA,IAAI,YAA2D,EAAC;AAChE,IAAA,IAAI,eAAkD,GAAA,IAAA;AACtD,IAAA,IAAI,OAAU,GAAA,IAAA;AAEd,IAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA;AACnB,IACE,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,IAChB,OAAO,QAAA,KAAa,YACpB,CAAC,KAAA,CAAM,OAAQ,CAAA,QAAQ,CACvB,EAAA;AACA,MAAY,SAAA,GAAA,YAAA,CAAa,SAAS,SAAS,CAAA;AAC3C,MAAA,eAAA,GAAkB,SAAS,eAAmB,IAAA,IAAA;AAC9C,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,OAAA;AAAA,KACzB,MAAA;AACL,MAAI,IAAA,OAAO,IAAK,CAAA,CAAC,CAAM,KAAA,UAAA;AACrB,QAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,OAAQ,CAAA,QAAQ,CAAG,EAAA,SAAA,GAAY,aAAa,QAAQ,CAAA;AAAA,WACzD;AACH,QAAY,SAAA,GAAA,CAAC,CAAC,QAAkB,CAAC,CAAA;AACjC,QAAA,IAAI,IAAK,CAAA,CAAC,CAAK,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,eAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAK,CAAA,CAAC,CAAG,EAAA,eAAA,GAAkB,KAAK,CAAC,CAAA;AAAA;AACvC;AAGF,IAAA,IAAI,GAAM,GAAA,CAAA;AACV,IAAI,IAAA,MAAA;AACJ,IAAA,IAAI,QAA0D,GAAA,IAAA;AAC9D,IAAA,IAAI,UAA2C,GAAA,IAAA;AAE/C,IAAA,IAAI,YAA2B,GAAA,IAAA;AAC/B,IAAA,MAAM,MAAS,GAAA,cAAA;AAAA,MACbC,qCAAgB,YAAY;AAC1B,QAAM,MAAA,CAAC,KAAK,SAAS,CAAA,GAAI,YAAY,SAAU,CAAA,GAAA,EAAA,GAAQ,UAAU,MAAM,CAAA;AACvE,QAAW,QAAA,GAAA,IAAA;AACX,QAAA,MAAM,MAAS,GAAA,IAAI,cAAe,CAAA,GAAA,EAAK,SAAS,CAAA;AAChD,QAAA,MAAM,mBAAmB,MAAM;AAC7B,UAAI,IAAA;AACF,YAAA,MAAA,CAAO,iBAAiB,OAAS,EAAA,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AACrD,YAAA,MAAA,CAAO,KAAM,EAAA;AAAA,WACP,CAAA,MAAA;AAAA;AAAC,SACX;AACA,QAAA,eAAA;AAAA,UACG,MAAS,GAAA;AAAA,YACR,MAAM,OAAQ,CAAA,UAAA;AAAA,YACd,GAAA;AAAA,YACA;AAAA;AACF,SACF;AAEA,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,UAAA,MAAM,SAAS,MAAM;AACnB,YAAe,cAAA,EAAA;AACf,YAAQ,OAAA,EAAA;AAAA,WACV;AAEA,UAAM,MAAA,OAAA,GAAU,CAAC,CAAoB,KAAA;AACnC,YAAe,cAAA,EAAA;AACf,YAAI,IAAA,CAAA,IAAK,MAAuB,gBAAA,EAAA;AAChC,YAAQ,OAAA,CAAA,KAAA;AAAA,cACN,wBAAwB,GAAG,CAAA,EACzB,SAAY,GAAA,eAAA,GAAkB,YAAY,EAC5C,CAAA;AAAA,aACF;AACA,YAAA,eAAA;AAAA,cACG,MAAS,GAAA;AAAA,gBACR,IAAM,EAAA,CAAA,GAAI,OAAQ,CAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA;AAAA,gBAClC,KAAO,EAAA;AAAA;AACT,aACF;AACA,YAAA,UAAA,CAAW,MAAQ,EAAA,CAAA,GAAI,GAAM,GAAA,CAAA,EAAG,CAAC,CAAA;AAAA,WACnC;AAEA,UAAA,MAAM,YACJ,GAAA,OAAA,KAAY,QACR,GAAA,UAAA,CAAW,MAAM;AACf,YAAe,cAAA,EAAA;AACf,YAAiB,gBAAA,EAAA;AACjB,YAAA,eAAA,CAAiB,SAAS,YAAa,CAAA;AACvC,YAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,WAC3B,EAAG,OAAO,CACV,GAAA,KAAA,CAAA;AAEN,UAAA,MAAM,iBAAiB,MAAM;AAC3B,YAAA,YAAA,CAAa,YAAY,CAAA;AACzB,YAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,YAAO,MAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,WAC3C;AACA,UAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,UAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,UAAA,UAAA,GAAa,MAAM;AACjB,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,WACd;AAAA,SACD,CAAA;AAED,QAAA,eAAA;AAAA,UACG,MAAS,GAAA;AAAA,YACR,MAAM,OAAQ,CAAA,SAAA;AAAA,YACd,GAAA;AAAA,YACA;AAAA;AACF,SACF;AAEA,QAAO,OAAA,CAAC,WAAW,MAAW,KAAA;AAC5B,UAAM,MAAA,UAAA,GAAa,CAAC,CAAoB,KAAA;AACtC,YAAA,IAAI,OAAO,CAAE,CAAA,IAAA,KAAS,QAAU,EAAA,SAAA,CAAU,EAAE,IAAI,CAAA;AAAA,WAClD;AACA,UAAA,MAAM,SACJ,GAAA,CAAC,MAA0C,KAAA,CAAC,CAAW,KAAA;AACrD,YAAQ,OAAA,CAAA,IAAA,CAAK,CAAY,SAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAAA;AAClC,YAAA,eAAA;AAAA,cACG,MAAS,GAAA;AAAA,gBACR,IAAM,EAAA,MAAA;AAAA,gBACN,KAAO,EAAA;AAAA;AACT,aACF;AACA,YAAO,MAAA,EAAA;AAAA,WACT;AACF,UAAM,MAAA,OAAA,GAAU,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAA;AACvC,UAAM,MAAA,OAAA,GAAU,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAA;AAEvC,UAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAC7C,UAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,UAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,UAAA,UAAA,GAAa,CAAC,QAAa,KAAA;AACzB,YAAa,YAAA,EAAA;AACb,YAAa,UAAA,GAAA,IAAA;AACb,YAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAChD,YAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,YAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,YAAiB,gBAAA,EAAA;AACjB,YAAI,IAAA,QAAA,EAAkB,OAAA,CAAA,EAAE,CAAA;AAAA,WAC1B;AAEA,UAAO,OAAA;AAAA,YACL,IAAA,EAAM,CAAC,GAAQ,KAAA;AACb,cAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,aACjB;AAAA,YACA;AAAA,WACF;AAAA,SACF;AAAA,OACD,CAAA;AAAA,MACD,MAAM;AACJ,QAAS,QAAA,EAAA;AAAA;AACX,KACF;AACA,IAAA,YAAA,GAAe,MAAO,CAAA,OAAA;AACtB,IAAA,OAAQ,MAAe,CAAA,OAAA;AAEvB,IAAM,MAAA,QAAA,GAAwC,IAAIC,KAAS,KAAA;AACzD,MAAI,IAAA,MAAA,CAAO,IAAS,KAAA,OAAA,CAAQ,KAAO,EAAA;AACnC,MAAIA,IAAAA,KAAAA,CAAK,QAAmBA,QAAAA,GAAAA,KAAAA;AAC5B,MAAA,IAAI,MAAO,CAAA,IAAA,KAAS,OAAQ,CAAA,KAAA,aAAkB,IAAI,CAAA;AAAA,KACpD;AAEA,IAAO,OAAA,MAAA,CAAO,OAAO,MAAQ,EAAA,EAAE,QAAQ,QAAU,EAAA,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA;AAAA,GAC5E;AACF,CAAA;;ACjLA,MAAM,WAAWC,YAAU,CAAA;AAAA,EACzB,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,SAAU,EAAA;AAAA;AAEnB;AAEO,MAAM,aAAgB,GAAA,qBAAA;AAAA,EAC3B;AACF;;;;;"}
|
|
1
|
+
{"version":3,"file":"node.js","sources":["../../src/types.ts","../../src/follow-enhancer.ts","../../src/ws-provider.ts","../../src/node.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { 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\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\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\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 {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n","import { WebSocket } from \"ws\"\nimport { getInternalWsProvider } from \"./ws-provider\"\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport * from \"./types\"\n\nclass WS extends WebSocket {\n close() {\n this.terminate()\n }\n}\n\nexport const getWsProvider = getInternalWsProvider(\n WS as unknown as typeof globalThis.WebSocket,\n)\n"],"names":["WsEvent","result","getSyncProvider","args","WebSocket"],"mappings":"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"}
|
|
@@ -5,14 +5,27 @@ const methods = {};
|
|
|
5
5
|
});
|
|
6
6
|
const followEnhancer = (base, forceDisconnect) => {
|
|
7
7
|
const prematureStops = /* @__PURE__ */ new Set();
|
|
8
|
-
const preOpId = /* @__PURE__ */ new
|
|
8
|
+
const preOpId = /* @__PURE__ */ new Map();
|
|
9
9
|
const onGoing = /* @__PURE__ */ new Set();
|
|
10
|
+
let methodsRequestId;
|
|
10
11
|
const result = (onMsg) => {
|
|
11
12
|
const { send, disconnect } = base((fromProvider) => {
|
|
12
13
|
const parsed = JSON.parse(fromProvider);
|
|
13
14
|
if ("id" in parsed) {
|
|
14
15
|
const { id, result: result2 } = parsed;
|
|
15
|
-
if (
|
|
16
|
+
if (id === methodsRequestId) {
|
|
17
|
+
methodsRequestId = void 0;
|
|
18
|
+
if (result2 && !result2.methods.some((x) => {
|
|
19
|
+
const [group, , name] = x.split("_");
|
|
20
|
+
return group === "chainHead" && name === "follow";
|
|
21
|
+
})) {
|
|
22
|
+
onMsg(fromProvider);
|
|
23
|
+
forceDisconnect();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const msg = preOpId.get(id);
|
|
28
|
+
if (msg) {
|
|
16
29
|
preOpId.delete(id);
|
|
17
30
|
if (prematureStops.has(result2)) {
|
|
18
31
|
prematureStops.delete(result2);
|
|
@@ -26,7 +39,9 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
26
39
|
);
|
|
27
40
|
else if (parsed.error) {
|
|
28
41
|
console.warn(`chainHead follow failed on the ${currentSize} sub`);
|
|
29
|
-
|
|
42
|
+
forceDisconnect();
|
|
43
|
+
preOpId.set(id, msg);
|
|
44
|
+
send(msg);
|
|
30
45
|
return;
|
|
31
46
|
}
|
|
32
47
|
}
|
|
@@ -42,9 +57,10 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
42
57
|
return {
|
|
43
58
|
send(toProvider) {
|
|
44
59
|
const parsed = JSON.parse(toProvider);
|
|
60
|
+
if (parsed.method === "rpc_methods") methodsRequestId = parsed.id;
|
|
45
61
|
const method = methods[parsed.method];
|
|
46
62
|
if (method === "follow") {
|
|
47
|
-
preOpId.
|
|
63
|
+
preOpId.set(parsed.id, toProvider);
|
|
48
64
|
} else if (method === "unfollow") {
|
|
49
65
|
onGoing.delete(parsed.params[0]);
|
|
50
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow-enhancer.mjs","sources":["../../../src/follow-enhancer.ts"],"sourcesContent":["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\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
|
|
1
|
+
{"version":3,"file":"follow-enhancer.mjs","sources":["../../../src/follow-enhancer.ts"],"sourcesContent":["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\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\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\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"],"names":["result"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n"],"names":["args"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ws-provider.mjs","sources":["../../../src/ws-provider.ts"],"sourcesContent":["import { getSyncProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n"],"names":["args"],"mappings":"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"}
|
package/dist/web/web.js
CHANGED
|
@@ -17,14 +17,27 @@ const methods = {};
|
|
|
17
17
|
});
|
|
18
18
|
const followEnhancer = (base, forceDisconnect) => {
|
|
19
19
|
const prematureStops = /* @__PURE__ */ new Set();
|
|
20
|
-
const preOpId = /* @__PURE__ */ new
|
|
20
|
+
const preOpId = /* @__PURE__ */ new Map();
|
|
21
21
|
const onGoing = /* @__PURE__ */ new Set();
|
|
22
|
+
let methodsRequestId;
|
|
22
23
|
const result = (onMsg) => {
|
|
23
24
|
const { send, disconnect } = base((fromProvider) => {
|
|
24
25
|
const parsed = JSON.parse(fromProvider);
|
|
25
26
|
if ("id" in parsed) {
|
|
26
27
|
const { id, result: result2 } = parsed;
|
|
27
|
-
if (
|
|
28
|
+
if (id === methodsRequestId) {
|
|
29
|
+
methodsRequestId = void 0;
|
|
30
|
+
if (result2 && !result2.methods.some((x) => {
|
|
31
|
+
const [group, , name] = x.split("_");
|
|
32
|
+
return group === "chainHead" && name === "follow";
|
|
33
|
+
})) {
|
|
34
|
+
onMsg(fromProvider);
|
|
35
|
+
forceDisconnect();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const msg = preOpId.get(id);
|
|
40
|
+
if (msg) {
|
|
28
41
|
preOpId.delete(id);
|
|
29
42
|
if (prematureStops.has(result2)) {
|
|
30
43
|
prematureStops.delete(result2);
|
|
@@ -38,7 +51,9 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
38
51
|
);
|
|
39
52
|
else if (parsed.error) {
|
|
40
53
|
console.warn(`chainHead follow failed on the ${currentSize} sub`);
|
|
41
|
-
|
|
54
|
+
forceDisconnect();
|
|
55
|
+
preOpId.set(id, msg);
|
|
56
|
+
send(msg);
|
|
42
57
|
return;
|
|
43
58
|
}
|
|
44
59
|
}
|
|
@@ -54,9 +69,10 @@ const followEnhancer = (base, forceDisconnect) => {
|
|
|
54
69
|
return {
|
|
55
70
|
send(toProvider) {
|
|
56
71
|
const parsed = JSON.parse(toProvider);
|
|
72
|
+
if (parsed.method === "rpc_methods") methodsRequestId = parsed.id;
|
|
57
73
|
const method = methods[parsed.method];
|
|
58
74
|
if (method === "follow") {
|
|
59
|
-
preOpId.
|
|
75
|
+
preOpId.set(parsed.id, toProvider);
|
|
60
76
|
} else if (method === "unfollow") {
|
|
61
77
|
onGoing.delete(parsed.params[0]);
|
|
62
78
|
}
|
package/dist/web/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sources":["../../src/types.ts","../../src/follow-enhancer.ts","../../src/ws-provider.ts","../../src/web.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { 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\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 Set<string>()\n const onGoing = new Set<string>()\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 (preOpId.has(id)) {\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 Promise.resolve().then(forceDisconnect)\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\n })\n\n return {\n send(toProvider) {\n const parsed = JSON.parse(toProvider)\n const method = methods[parsed.method]\n if (method === \"follow\") {\n preOpId.add(parsed.id)\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 {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n","import { getInternalWsProvider } from \"./ws-provider\"\n\nexport * from \"./types\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":["WsEvent","result","getSyncProvider","args"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web.js","sources":["../../src/types.ts","../../src/follow-enhancer.ts","../../src/ws-provider.ts","../../src/web.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\n\nexport enum WsEvent {\n CONNECTING,\n CONNECTED,\n ERROR,\n CLOSE,\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n protocols?: string | string[]\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: string\n protocols?: string | string[]\n}\nexport type WsError = {\n type: WsEvent.ERROR\n event: any\n}\nexport type WsClose = {\n type: WsEvent.CLOSE\n event: any\n}\nexport type StatusChange = WsConnecting | WsConnected | WsError | WsClose\nexport type WsJsonRpcProvider = JsonRpcProvider & {\n switch: (uri?: string, protocol?: string[]) => void\n getStatus: () => StatusChange\n}\n\nexport interface WsProviderConfig {\n endpoints: Array<string | { uri: string; protocol: string[] }>\n onStatusChanged?: (status: StatusChange) => void\n timeout?: number\n}\n\nexport interface GetWsProviderInput {\n (\n uri: string,\n protocols?: string | string[],\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n uri: string,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (\n endpoints: Array<string | { uri: string; protocol: string[] }>,\n onStatusChanged?: (status: StatusChange) => void,\n ): WsJsonRpcProvider\n (wsProviderConfig: WsProviderConfig): WsJsonRpcProvider\n}\n","import { 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\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\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 if (onGoing.has(subscription)) onGoing.delete(subscription)\n else prematureStops.add(subscription)\n }\n }\n onMsg(fromProvider)\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 {\n GetWsProviderInput,\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n WsProviderConfig,\n} from \"./types\"\nimport { followEnhancer } from \"./follow-enhancer\"\n\nconst timeoutError: StatusChange = {\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n}\n\nconst noop = () => {}\n\nconst mapEndpoints = (\n endpoints: WsProviderConfig[\"endpoints\"],\n): Array<[string, string | string[]] | [string]> =>\n endpoints.map((x) => (typeof x === \"string\" ? [x] : [x.uri, x.protocol]))\n\nexport const getInternalWsProvider = (\n WebsocketClass: typeof WebSocket,\n): GetWsProviderInput => {\n return (...args): WsJsonRpcProvider => {\n let endpoints: Array<[string, string | string[]] | [string]> = []\n let onStatusChanged: (status: StatusChange) => void = noop\n let timeout = 3_500\n\n const [firstArg] = args\n if (\n args.length === 1 &&\n typeof firstArg === \"object\" &&\n !Array.isArray(firstArg)\n ) {\n endpoints = mapEndpoints(firstArg.endpoints)\n onStatusChanged = firstArg.onStatusChanged ?? noop\n timeout = firstArg.timeout ?? timeout\n } else {\n if (typeof args[1] === \"function\")\n onStatusChanged = args[1] as (status: StatusChange) => void\n if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg)\n else {\n endpoints = [[firstArg as string]]\n if (args[1] && args[1] !== onStatusChanged)\n endpoints[0][1] = args[1] as any\n if (args[2]) onStatusChanged = args[2] as any\n }\n }\n\n let idx = 0\n let status: StatusChange\n let switchTo: [string] | [string, string | string[]] | null = null\n let disconnect: (withHalt?: boolean) => void = noop\n\n let outerCleanup: () => void = noop\n const result = followEnhancer(\n getSyncProvider(async () => {\n const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length]\n switchTo = null\n const socket = new WebsocketClass(uri, protocols)\n const forceSocketClose = () => {\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTING,\n uri,\n protocols,\n }),\n )\n\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n initialCleanup()\n resolve()\n }\n\n const onError = (e: Event | null) => {\n initialCleanup()\n if (e == null) forceSocketClose()\n console.error(\n `Unable to connect to ${uri}${\n protocols ? \", protocols: \" + protocols : \"\"\n }`,\n )\n onStatusChanged(\n (status = {\n type: e ? WsEvent.ERROR : WsEvent.CLOSE,\n event: e,\n }),\n )\n setTimeout(reject, e ? 300 : 0, e)\n }\n\n const timeoutToken =\n timeout !== Infinity\n ? setTimeout(() => {\n initialCleanup()\n forceSocketClose()\n onStatusChanged((status = timeoutError))\n reject(timeoutError.event)\n }, timeout)\n : undefined\n\n const initialCleanup = () => {\n clearTimeout(timeoutToken)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"open\", onOpen)\n }\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n disconnect = () => {\n onError(null)\n }\n })\n\n onStatusChanged(\n (status = {\n type: WsEvent.CONNECTED,\n uri,\n protocols,\n }),\n )\n\n return (onMessage, onHalt) => {\n const _onMessage = (e: MessageEvent) => {\n if (typeof e.data === \"string\") onMessage(e.data)\n }\n const innerHalt =\n (reason: WsEvent.CLOSE | WsEvent.ERROR) => (e: any) => {\n console.warn(`WS halt (${reason})`)\n onStatusChanged(\n (status = {\n type: reason,\n event: e,\n }),\n )\n onHalt()\n }\n const onError = innerHalt(WsEvent.ERROR)\n const onClose = innerHalt(WsEvent.CLOSE)\n\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n disconnect = (withHalt) => {\n outerCleanup()\n disconnect = noop\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n forceSocketClose()\n if (withHalt) onClose({})\n }\n\n return {\n send: (msg) => {\n socket.send(msg)\n },\n disconnect,\n }\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}\n","import { getInternalWsProvider } from \"./ws-provider\"\n\nexport * from \"./types\"\n\nexport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nexport const getWsProvider = getInternalWsProvider(WebSocket)\n"],"names":["WsEvent","result","getSyncProvider","args"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/ws-provider",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"node"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"ws": "^8.18.
|
|
34
|
+
"ws": "^8.18.1",
|
|
35
35
|
"@polkadot-api/json-rpc-provider": "0.0.4",
|
|
36
|
-
"@polkadot-api/json-rpc-provider-proxy": "0.2.
|
|
36
|
+
"@polkadot-api/json-rpc-provider-proxy": "0.2.4"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/ws": "^8.5.
|
|
39
|
+
"@types/ws": "^8.5.14"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build-core": "tsc --noEmit && rollup -c",
|