@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
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy';
|
|
2
|
-
import { WsEvent } from './types.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 mapEndpoints = (endpoints) => endpoints.map((x) => typeof x === "string" ? [x] : [x.uri, x.protocol]);
|
|
12
|
-
const getInternalWsProvider = (WebsocketClass) => {
|
|
13
|
-
return (...args) => {
|
|
14
|
-
let endpoints = [];
|
|
15
|
-
let onStatusChanged = noop;
|
|
16
|
-
let timeout = 3500;
|
|
17
|
-
const [firstArg] = args;
|
|
18
|
-
if (args.length === 1 && typeof firstArg === "object" && !Array.isArray(firstArg)) {
|
|
19
|
-
endpoints = mapEndpoints(firstArg.endpoints);
|
|
20
|
-
onStatusChanged = firstArg.onStatusChanged ?? noop;
|
|
21
|
-
timeout = firstArg.timeout ?? timeout;
|
|
22
|
-
} else {
|
|
23
|
-
if (typeof args[1] === "function")
|
|
24
|
-
onStatusChanged = args[1];
|
|
25
|
-
if (Array.isArray(firstArg)) endpoints = mapEndpoints(firstArg);
|
|
26
|
-
else {
|
|
27
|
-
endpoints = [[firstArg]];
|
|
28
|
-
if (args[1] && args[1] !== onStatusChanged)
|
|
29
|
-
endpoints[0][1] = args[1];
|
|
30
|
-
if (args[2]) onStatusChanged = args[2];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
let idx = 0;
|
|
34
|
-
let status;
|
|
35
|
-
let switchTo = null;
|
|
36
|
-
let disconnect = noop;
|
|
37
|
-
let outerCleanup = noop;
|
|
38
|
-
const result = followEnhancer(
|
|
39
|
-
getSyncProvider(async () => {
|
|
40
|
-
const [uri, protocols] = switchTo || endpoints[idx++ % endpoints.length];
|
|
41
|
-
switchTo = null;
|
|
42
|
-
const socket = new WebsocketClass(uri, protocols);
|
|
43
|
-
const forceSocketClose = () => {
|
|
44
|
-
try {
|
|
45
|
-
socket.addEventListener("error", noop, { once: true });
|
|
46
|
-
socket.close();
|
|
47
|
-
} catch {
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
onStatusChanged(
|
|
51
|
-
status = {
|
|
52
|
-
type: WsEvent.CONNECTING,
|
|
53
|
-
uri,
|
|
54
|
-
protocols
|
|
55
|
-
}
|
|
56
|
-
);
|
|
57
|
-
await new Promise((resolve, reject) => {
|
|
58
|
-
const onOpen = () => {
|
|
59
|
-
initialCleanup();
|
|
60
|
-
resolve();
|
|
61
|
-
};
|
|
62
|
-
const onError = (e) => {
|
|
63
|
-
initialCleanup();
|
|
64
|
-
if (e == null) forceSocketClose();
|
|
65
|
-
console.error(
|
|
66
|
-
`Unable to connect to ${uri}${protocols ? ", protocols: " + protocols : ""}`
|
|
67
|
-
);
|
|
68
|
-
onStatusChanged(
|
|
69
|
-
status = {
|
|
70
|
-
type: e ? WsEvent.ERROR : WsEvent.CLOSE,
|
|
71
|
-
event: e
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
setTimeout(reject, e ? 300 : 0, e);
|
|
75
|
-
};
|
|
76
|
-
const timeoutToken = timeout !== Infinity ? setTimeout(() => {
|
|
77
|
-
initialCleanup();
|
|
78
|
-
forceSocketClose();
|
|
79
|
-
onStatusChanged(status = timeoutError);
|
|
80
|
-
reject(timeoutError.event);
|
|
81
|
-
}, timeout) : void 0;
|
|
82
|
-
const initialCleanup = () => {
|
|
83
|
-
clearTimeout(timeoutToken);
|
|
84
|
-
socket.removeEventListener("error", onError);
|
|
85
|
-
socket.removeEventListener("open", onOpen);
|
|
86
|
-
};
|
|
87
|
-
socket.addEventListener("open", onOpen);
|
|
88
|
-
socket.addEventListener("error", onError);
|
|
89
|
-
disconnect = () => {
|
|
90
|
-
onError(null);
|
|
91
|
-
};
|
|
92
|
-
});
|
|
93
|
-
onStatusChanged(
|
|
94
|
-
status = {
|
|
95
|
-
type: WsEvent.CONNECTED,
|
|
96
|
-
uri,
|
|
97
|
-
protocols
|
|
98
|
-
}
|
|
99
|
-
);
|
|
100
|
-
return (onMessage, onHalt) => {
|
|
101
|
-
const _onMessage = (e) => {
|
|
102
|
-
if (typeof e.data === "string") onMessage(e.data);
|
|
103
|
-
};
|
|
104
|
-
const innerHalt = (reason) => (e) => {
|
|
105
|
-
console.warn(`WS halt (${reason})`);
|
|
106
|
-
onStatusChanged(
|
|
107
|
-
status = {
|
|
108
|
-
type: reason,
|
|
109
|
-
event: e
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
onHalt();
|
|
113
|
-
};
|
|
114
|
-
const onError = innerHalt(WsEvent.ERROR);
|
|
115
|
-
const onClose = innerHalt(WsEvent.CLOSE);
|
|
116
|
-
socket.addEventListener("message", _onMessage);
|
|
117
|
-
socket.addEventListener("error", onError);
|
|
118
|
-
socket.addEventListener("close", onClose);
|
|
119
|
-
disconnect = (withHalt) => {
|
|
120
|
-
outerCleanup();
|
|
121
|
-
disconnect = noop;
|
|
122
|
-
socket.removeEventListener("message", _onMessage);
|
|
123
|
-
socket.removeEventListener("error", onError);
|
|
124
|
-
socket.removeEventListener("close", onClose);
|
|
125
|
-
forceSocketClose();
|
|
126
|
-
if (withHalt) onClose({});
|
|
127
|
-
};
|
|
128
|
-
return {
|
|
129
|
-
send: (msg) => {
|
|
130
|
-
socket.send(msg);
|
|
131
|
-
},
|
|
132
|
-
disconnect
|
|
133
|
-
};
|
|
134
|
-
};
|
|
135
|
-
}),
|
|
136
|
-
() => {
|
|
137
|
-
switchFn();
|
|
138
|
-
}
|
|
139
|
-
);
|
|
140
|
-
outerCleanup = result.cleanup;
|
|
141
|
-
delete result.cleanup;
|
|
142
|
-
const switchFn = (...args2) => {
|
|
143
|
-
if (status.type === WsEvent.CLOSE) return;
|
|
144
|
-
if (args2.length) switchTo = args2;
|
|
145
|
-
if (status.type !== WsEvent.ERROR) disconnect(true);
|
|
146
|
-
};
|
|
147
|
-
return Object.assign(result, { switch: switchFn, getStatus: () => status });
|
|
148
|
-
};
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
export { getInternalWsProvider };
|
|
152
|
-
//# sourceMappingURL=ws-provider.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|