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