@polkadot-api/ws-provider 0.8.2-canary.d6be873 → 0.9.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/{esm/get-async-provider.mjs → get-async-provider.js} +1 -1
- package/dist/get-async-provider.js.map +1 -0
- package/dist/index.js +2 -249
- package/dist/index.js.map +1 -1
- package/dist/{esm/provider.mjs → provider.js} +3 -3
- package/dist/provider.js.map +1 -0
- package/dist/{esm/types.mjs → types.js} +1 -1
- package/dist/types.js.map +1 -0
- package/dist/{esm/with-socket.mjs → with-socket.js} +3 -3
- package/dist/with-socket.js.map +1 -0
- package/package.json +11 -21
- package/dist/esm/get-async-provider.mjs.map +0 -1
- package/dist/esm/index.mjs +0 -3
- package/dist/esm/index.mjs.map +0 -1
- package/dist/esm/provider.mjs.map +0 -1
- package/dist/esm/types.mjs.map +0 -1
- package/dist/esm/with-socket.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-async-provider.js","sources":["../src/get-async-provider.ts"],"sourcesContent":["import {\n JsonRpcConnection,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const getAsyncProvider =\n <T = string>(\n input: (\n onResult: (x: InnerJsonRpcProvider<T> | null) => void,\n ) => () => void,\n ): InnerJsonRpcProvider<T> =>\n (onMessage, _onHalt) => {\n // null -> loading\n // undefined -> destroyed\n let connection: JsonRpcConnection<T> | null | undefined = null\n\n let pending: Array<JsonRpcRequest> = []\n const done = () => {\n stop()\n onHalt = stop = noop\n connection = undefined\n pending = []\n }\n let onHalt = (e?: any) => {\n done()\n _onHalt(e)\n }\n\n let stop = input((cb) => {\n stop = noop\n if (!cb) {\n onHalt()\n } else {\n connection = cb(onMessage, onHalt)\n pending.forEach((x) => connection?.send(x))\n pending = []\n }\n })\n\n return {\n send: (msg) => {\n if (connection) connection.send(msg)\n else if (connection === null) pending.push(msg)\n },\n disconnect: () => {\n const x = connection\n done()\n x?.disconnect()\n },\n }\n }\n"],"names":[],"mappings":";;AAOO,MAAM,gBAAA,GACX,CACE,KAAA,KAIF,CAAC,WAAW,OAAA,KAAY;AAGtB,EAAA,IAAI,UAAA,GAAsD,IAAA;AAE1D,EAAA,IAAI,UAAiC,EAAC;AACtC,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAA,EAAK;AACL,IAAA,MAAA,GAAS,IAAA,GAAO,IAAA;AAChB,IAAA,UAAA,GAAa,MAAA;AACb,IAAA,OAAA,GAAU,EAAC;AAAA,EACb,CAAA;AACA,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,KAAY;AACxB,IAAA,IAAA,EAAK;AACL,IAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,CAAC,EAAA,KAAO;AACvB,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,EAAO;AAAA,IACT,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,EAAA,CAAG,WAAW,MAAM,CAAA;AACjC,MAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA;AAC1C,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,WAAA,IAC1B,UAAA,KAAe,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,YAAY,MAAM;AAChB,MAAA,MAAM,CAAA,GAAI,UAAA;AACV,MAAA,IAAA,EAAK;AACL,MAAA,CAAA,EAAG,UAAA,EAAW;AAAA,IAChB;AAAA,GACF;AACF;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -1,250 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var jsonRpcProviderProxy = require('@polkadot-api/json-rpc-provider-proxy');
|
|
4
|
-
var utils = require('@polkadot-api/utils');
|
|
5
|
-
var rxjs = require('rxjs');
|
|
6
|
-
|
|
7
|
-
var WsEvent = /* @__PURE__ */ ((WsEvent2) => {
|
|
8
|
-
WsEvent2["CONNECTING"] = "CONNECTING";
|
|
9
|
-
WsEvent2["CONNECTED"] = "CONNECTED";
|
|
10
|
-
WsEvent2["ERROR"] = "ERROR";
|
|
11
|
-
WsEvent2["CLOSE"] = "CLOSE";
|
|
12
|
-
return WsEvent2;
|
|
13
|
-
})(WsEvent || {});
|
|
14
|
-
var SocketEvents = /* @__PURE__ */ ((SocketEvents2) => {
|
|
15
|
-
SocketEvents2["CONNECTING"] = "CONNECTING";
|
|
16
|
-
SocketEvents2["CONNECTED"] = "CONNECTED";
|
|
17
|
-
SocketEvents2["TIMEOUT"] = "TIMEOUT";
|
|
18
|
-
SocketEvents2["STALE"] = "STALE";
|
|
19
|
-
SocketEvents2["ERROR"] = "ERROR";
|
|
20
|
-
SocketEvents2["CLOSE"] = "CLOSE";
|
|
21
|
-
SocketEvents2["DISCONNECT"] = "DISCONNECT";
|
|
22
|
-
SocketEvents2["IN"] = "IN";
|
|
23
|
-
SocketEvents2["OUT"] = "OUT";
|
|
24
|
-
return SocketEvents2;
|
|
25
|
-
})(SocketEvents || {});
|
|
26
|
-
|
|
27
|
-
const getAsyncProvider = (input) => (onMessage, _onHalt) => {
|
|
28
|
-
let connection = null;
|
|
29
|
-
let pending = [];
|
|
30
|
-
const done = () => {
|
|
31
|
-
stop();
|
|
32
|
-
onHalt = stop = utils.noop;
|
|
33
|
-
connection = void 0;
|
|
34
|
-
pending = [];
|
|
35
|
-
};
|
|
36
|
-
let onHalt = (e) => {
|
|
37
|
-
done();
|
|
38
|
-
_onHalt(e);
|
|
39
|
-
};
|
|
40
|
-
let stop = input((cb) => {
|
|
41
|
-
stop = utils.noop;
|
|
42
|
-
if (!cb) {
|
|
43
|
-
onHalt();
|
|
44
|
-
} else {
|
|
45
|
-
connection = cb(onMessage, onHalt);
|
|
46
|
-
pending.forEach((x) => connection?.send(x));
|
|
47
|
-
pending = [];
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
return {
|
|
51
|
-
send: (msg) => {
|
|
52
|
-
if (connection) connection.send(msg);
|
|
53
|
-
else if (connection === null) pending.push(msg);
|
|
54
|
-
},
|
|
55
|
-
disconnect: () => {
|
|
56
|
-
const x = connection;
|
|
57
|
-
done();
|
|
58
|
-
x?.disconnect();
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const withSocket = (getWebsocket, heartbeatTimeout, connectionTimeout, logger) => {
|
|
64
|
-
const logType = logger ? (type) => logger({ type }) : utils.noop;
|
|
65
|
-
const logMsg = logger ? (type, msg) => logger({ type, msg }) : utils.noop;
|
|
66
|
-
return getAsyncProvider((onReady) => {
|
|
67
|
-
const [socket, onConnected] = getWebsocket();
|
|
68
|
-
logger?.({ type: SocketEvents.CONNECTING, url: socket.url });
|
|
69
|
-
let suicide = () => {
|
|
70
|
-
suicide = utils.noop;
|
|
71
|
-
cleanup();
|
|
72
|
-
onReady(null);
|
|
73
|
-
};
|
|
74
|
-
let isFirst = true;
|
|
75
|
-
let heartbeatToken;
|
|
76
|
-
const heartbeat = () => {
|
|
77
|
-
clearTimeout(heartbeatToken);
|
|
78
|
-
const [time, event] = isFirst ? [connectionTimeout, SocketEvents.TIMEOUT] : [heartbeatTimeout, SocketEvents.STALE];
|
|
79
|
-
isFirst = false;
|
|
80
|
-
heartbeatToken = setTimeout(() => {
|
|
81
|
-
logType(event);
|
|
82
|
-
suicide({
|
|
83
|
-
type: WsEvent.ERROR,
|
|
84
|
-
event: { type: "timeout" }
|
|
85
|
-
});
|
|
86
|
-
}, time);
|
|
87
|
-
};
|
|
88
|
-
const stopTimeout = () => {
|
|
89
|
-
clearTimeout(heartbeatToken);
|
|
90
|
-
};
|
|
91
|
-
heartbeat();
|
|
92
|
-
let cleanup = () => {
|
|
93
|
-
stopTimeout();
|
|
94
|
-
};
|
|
95
|
-
const onError = (event) => {
|
|
96
|
-
logger?.({ type: SocketEvents.ERROR, error: event });
|
|
97
|
-
suicide({
|
|
98
|
-
type: WsEvent.ERROR,
|
|
99
|
-
event
|
|
100
|
-
});
|
|
101
|
-
};
|
|
102
|
-
const onClose = (event) => {
|
|
103
|
-
logType(SocketEvents.CLOSE);
|
|
104
|
-
suicide({
|
|
105
|
-
type: WsEvent.CLOSE,
|
|
106
|
-
event
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
const disconnect = () => {
|
|
110
|
-
logType(SocketEvents.DISCONNECT);
|
|
111
|
-
cleanup();
|
|
112
|
-
try {
|
|
113
|
-
socket.addEventListener("error", utils.noop, { once: true });
|
|
114
|
-
socket.close();
|
|
115
|
-
} catch {
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
const onOpen = () => {
|
|
119
|
-
logType(SocketEvents.CONNECTED);
|
|
120
|
-
onConnected();
|
|
121
|
-
heartbeat();
|
|
122
|
-
socket.removeEventListener("open", onOpen);
|
|
123
|
-
onReady((onMsg, onHalt) => {
|
|
124
|
-
cleanup = () => {
|
|
125
|
-
cleanup = utils.noop;
|
|
126
|
-
stopTimeout();
|
|
127
|
-
socket.removeEventListener("error", onError);
|
|
128
|
-
socket.removeEventListener("ping", heartbeat);
|
|
129
|
-
socket.removeEventListener("message", _onMessage);
|
|
130
|
-
socket.removeEventListener("close", onClose);
|
|
131
|
-
};
|
|
132
|
-
suicide = (e) => {
|
|
133
|
-
suicide = utils.noop;
|
|
134
|
-
cleanup();
|
|
135
|
-
onHalt(e);
|
|
136
|
-
};
|
|
137
|
-
const _onMessage = (e) => {
|
|
138
|
-
heartbeat();
|
|
139
|
-
if (typeof e.data === "string") {
|
|
140
|
-
logMsg(SocketEvents.IN, e.data);
|
|
141
|
-
onMsg(JSON.parse(e.data));
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
socket.addEventListener("ping", heartbeat);
|
|
145
|
-
socket.addEventListener("message", _onMessage);
|
|
146
|
-
socket.addEventListener("error", onError);
|
|
147
|
-
socket.addEventListener("close", onClose);
|
|
148
|
-
return {
|
|
149
|
-
send(m) {
|
|
150
|
-
const msg = JSON.stringify(m);
|
|
151
|
-
logMsg(SocketEvents.OUT, msg);
|
|
152
|
-
socket.send(msg);
|
|
153
|
-
},
|
|
154
|
-
disconnect
|
|
155
|
-
};
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
cleanup = () => {
|
|
159
|
-
cleanup = utils.noop;
|
|
160
|
-
stopTimeout();
|
|
161
|
-
socket.removeEventListener("error", onError);
|
|
162
|
-
socket.removeEventListener("close", onClose);
|
|
163
|
-
socket.removeEventListener("open", onOpen);
|
|
164
|
-
};
|
|
165
|
-
socket.addEventListener("open", onOpen);
|
|
166
|
-
socket.addEventListener("error", onError);
|
|
167
|
-
return disconnect;
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const defaultConfig = {
|
|
172
|
-
onStatusChanged: utils.noop,
|
|
173
|
-
timeout: 5e3,
|
|
174
|
-
heartbeatTimeout: 4e4,
|
|
175
|
-
middleware: rxjs.identity
|
|
176
|
-
};
|
|
177
|
-
const getWsProvider = (endpoints, config) => {
|
|
178
|
-
const {
|
|
179
|
-
onStatusChanged: _onStatuChanged,
|
|
180
|
-
timeout,
|
|
181
|
-
heartbeatTimeout,
|
|
182
|
-
middleware,
|
|
183
|
-
logger
|
|
184
|
-
} = {
|
|
185
|
-
...defaultConfig,
|
|
186
|
-
...config
|
|
187
|
-
};
|
|
188
|
-
const actualEndpoints = Array.isArray(endpoints) ? endpoints : [endpoints];
|
|
189
|
-
const WebsocketClass = config?.websocketClass ?? globalThis.WebSocket;
|
|
190
|
-
if (!WebsocketClass) throw new Error("Missing WebSocket class");
|
|
191
|
-
let idx = 0;
|
|
192
|
-
let switchTo;
|
|
193
|
-
let latestSocket = null;
|
|
194
|
-
let status = { type: WsEvent.CLOSE, event: null };
|
|
195
|
-
let prevUri;
|
|
196
|
-
const onStatusChanged = (x) => _onStatuChanged(status = x);
|
|
197
|
-
const socketProvider = middleware(
|
|
198
|
-
withSocket(
|
|
199
|
-
() => {
|
|
200
|
-
prevUri = latestSocket?.url;
|
|
201
|
-
const uri = switchTo ?? actualEndpoints[idx++ % actualEndpoints.length];
|
|
202
|
-
switchTo = void 0;
|
|
203
|
-
onStatusChanged({
|
|
204
|
-
type: WsEvent.CONNECTING,
|
|
205
|
-
uri
|
|
206
|
-
});
|
|
207
|
-
return [
|
|
208
|
-
latestSocket = new WebsocketClass(uri),
|
|
209
|
-
() => {
|
|
210
|
-
onStatusChanged({
|
|
211
|
-
type: WsEvent.CONNECTED,
|
|
212
|
-
uri
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
];
|
|
216
|
-
},
|
|
217
|
-
heartbeatTimeout,
|
|
218
|
-
timeout,
|
|
219
|
-
logger
|
|
220
|
-
)
|
|
221
|
-
);
|
|
222
|
-
const provider = (onMsg, onHalt) => socketProvider(onMsg, (event) => {
|
|
223
|
-
onStatusChanged({
|
|
224
|
-
type: WsEvent.ERROR,
|
|
225
|
-
event
|
|
226
|
-
});
|
|
227
|
-
onHalt(event);
|
|
228
|
-
});
|
|
229
|
-
const result = jsonRpcProviderProxy.getSyncProvider((onReady) => {
|
|
230
|
-
if (!prevUri || latestSocket.url !== prevUri) {
|
|
231
|
-
onReady(provider);
|
|
232
|
-
return utils.noop;
|
|
233
|
-
}
|
|
234
|
-
const token = setTimeout(onReady, 250, provider);
|
|
235
|
-
return () => {
|
|
236
|
-
clearTimeout(token);
|
|
237
|
-
};
|
|
238
|
-
});
|
|
239
|
-
const switchFn = (uri) => {
|
|
240
|
-
if (status.type === WsEvent.CLOSE) return;
|
|
241
|
-
switchTo = uri;
|
|
242
|
-
if (status.type !== WsEvent.ERROR && latestSocket) latestSocket.close();
|
|
243
|
-
};
|
|
244
|
-
return Object.assign(result, { switch: switchFn, getStatus: () => status });
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
exports.SocketEvents = SocketEvents;
|
|
248
|
-
exports.WsEvent = WsEvent;
|
|
249
|
-
exports.getWsProvider = getWsProvider;
|
|
1
|
+
export { SocketEvents, WsEvent } from './types.js';
|
|
2
|
+
export { getWsProvider } from './provider.js';
|
|
250
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/types.ts","../src/get-async-provider.ts","../src/with-socket.ts","../src/provider.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: 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) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n\nexport enum SocketEvents {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n TIMEOUT = \"TIMEOUT\",\n STALE = \"STALE\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n DISCONNECT = \"DISCONNECT\",\n IN = \"IN\",\n OUT = \"OUT\",\n}\n\ntype SocketLoggerEvent =\n | { type: SocketEvents.CONNECTING; url: string }\n | { type: SocketEvents.CONNECTED }\n | { type: SocketEvents.DISCONNECT }\n | { type: SocketEvents.ERROR; error: any }\n | { type: SocketEvents.CLOSE }\n | { type: SocketEvents.STALE }\n | { type: SocketEvents.TIMEOUT }\n | { type: SocketEvents.IN; msg: string }\n | { type: SocketEvents.OUT; msg: string }\n\nexport type SocketLoggerFn = (event: SocketLoggerEvent) => void\n\nexport type WebSocketClass = typeof WebSocket\n\nexport type { InnerJsonRpcProvider }\nexport type Middleware = (base: InnerJsonRpcProvider) => InnerJsonRpcProvider\n","import {\n JsonRpcConnection,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const getAsyncProvider =\n <T = string>(\n input: (\n onResult: (x: InnerJsonRpcProvider<T> | null) => void,\n ) => () => void,\n ): InnerJsonRpcProvider<T> =>\n (onMessage, _onHalt) => {\n // null -> loading\n // undefined -> destroyed\n let connection: JsonRpcConnection<T> | null | undefined = null\n\n let pending: Array<JsonRpcRequest> = []\n const done = () => {\n stop()\n onHalt = stop = noop\n connection = undefined\n pending = []\n }\n let onHalt = (e?: any) => {\n done()\n _onHalt(e)\n }\n\n let stop = input((cb) => {\n stop = noop\n if (!cb) {\n onHalt()\n } else {\n connection = cb(onMessage, onHalt)\n pending.forEach((x) => connection?.send(x))\n pending = []\n }\n })\n\n return {\n send: (msg) => {\n if (connection) connection.send(msg)\n else if (connection === null) pending.push(msg)\n },\n disconnect: () => {\n const x = connection\n done()\n x?.disconnect()\n },\n }\n }\n","import { getAsyncProvider } from \"./get-async-provider\"\nimport { SocketEvents, SocketLoggerFn, WsEvent } from \"./types\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const withSocket = (\n getWebsocket: () => [WebSocket, () => void],\n heartbeatTimeout: number,\n connectionTimeout: number,\n logger?: SocketLoggerFn,\n) => {\n const logType: (\n type:\n | SocketEvents.TIMEOUT\n | SocketEvents.STALE\n | SocketEvents.CONNECTED\n | SocketEvents.DISCONNECT\n | SocketEvents.CLOSE,\n ) => void = logger ? (type) => logger({ type }) : noop\n const logMsg: (\n type: SocketEvents.IN | SocketEvents.OUT,\n msg: string,\n ) => void = logger ? (type, msg) => logger({ type, msg }) : noop\n\n return getAsyncProvider((onReady) => {\n const [socket, onConnected] = getWebsocket()\n logger?.({ type: SocketEvents.CONNECTING, url: socket.url })\n\n let suicide: (e?: any) => void = () => {\n suicide = noop\n cleanup()\n onReady(null)\n }\n\n let isFirst = true\n let heartbeatToken: number\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n const [time, event] = isFirst\n ? ([connectionTimeout, SocketEvents.TIMEOUT] as const)\n : ([heartbeatTimeout, SocketEvents.STALE] as const)\n isFirst = false\n heartbeatToken = setTimeout(() => {\n logType(event)\n suicide({\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n })\n }, time)\n }\n const stopTimeout = () => {\n clearTimeout(heartbeatToken)\n }\n\n heartbeat()\n\n let cleanup = () => {\n stopTimeout()\n }\n\n const onError = (event: any) => {\n logger?.({ type: SocketEvents.ERROR, error: event })\n suicide({\n type: WsEvent.ERROR,\n event,\n })\n }\n const onClose = (event: any) => {\n logType(SocketEvents.CLOSE)\n suicide({\n type: WsEvent.CLOSE,\n event,\n })\n }\n\n const disconnect = () => {\n logType(SocketEvents.DISCONNECT)\n cleanup()\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n\n const onOpen = () => {\n logType(SocketEvents.CONNECTED)\n onConnected()\n heartbeat()\n socket.removeEventListener(\"open\", onOpen)\n onReady((onMsg, onHalt) => {\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"close\", onClose)\n }\n\n suicide = (e?: any) => {\n suicide = noop\n cleanup()\n onHalt(e)\n }\n\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") {\n logMsg(SocketEvents.IN, e.data)\n onMsg(JSON.parse(e.data))\n }\n }\n\n socket.addEventListener(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n return {\n send(m) {\n const msg = JSON.stringify(m)\n logMsg(SocketEvents.OUT, msg)\n socket.send(msg)\n },\n disconnect,\n }\n })\n }\n\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.removeEventListener(\"open\", onOpen)\n }\n\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n\n return disconnect\n })\n}\n","import {\n getSyncProvider,\n InnerJsonRpcProvider,\n} from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { noop } from \"@polkadot-api/utils\"\nimport {\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n SocketLoggerFn,\n WebSocketClass,\n Middleware,\n} from \"./types\"\nimport { withSocket } from \"./with-socket\"\nimport { identity } from \"rxjs\"\n\nexport const defaultConfig: {\n timeout: number\n heartbeatTimeout: number\n middleware: Middleware\n onStatusChanged: (status: StatusChange) => void\n} = {\n onStatusChanged: noop,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n middleware: identity,\n}\n\nexport const getWsProvider = (\n endpoints: string | Array<string>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n middleware: Middleware\n logger: SocketLoggerFn\n }>,\n): WsJsonRpcProvider => {\n const {\n onStatusChanged: _onStatuChanged,\n timeout,\n heartbeatTimeout,\n middleware,\n logger,\n } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = 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 switchTo: string | undefined\n let latestSocket: WebSocket | null = null\n let status: StatusChange = { type: WsEvent.CLOSE, event: null }\n let prevUri: string | undefined\n const onStatusChanged = (x: StatusChange) => _onStatuChanged((status = x))\n\n const socketProvider = middleware(\n withSocket(\n () => {\n prevUri = latestSocket?.url\n const uri = switchTo ?? actualEndpoints[idx++ % actualEndpoints.length]\n switchTo = undefined\n onStatusChanged({\n type: WsEvent.CONNECTING,\n uri,\n })\n return [\n (latestSocket = new WebsocketClass(uri)),\n () => {\n onStatusChanged({\n type: WsEvent.CONNECTED,\n uri,\n })\n },\n ]\n },\n heartbeatTimeout,\n timeout,\n logger,\n ),\n )\n\n const provider: InnerJsonRpcProvider = (onMsg, onHalt) =>\n socketProvider(onMsg, (event) => {\n onStatusChanged({\n type: WsEvent.ERROR,\n event,\n })\n onHalt(event)\n })\n\n const result: JsonRpcProvider = getSyncProvider((onReady) => {\n if (!prevUri || latestSocket!.url !== prevUri) {\n onReady(provider)\n return noop\n }\n\n const token = setTimeout(onReady, 250, provider)\n return () => {\n clearTimeout(token)\n }\n })\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (uri?: string) => {\n if (status.type === WsEvent.CLOSE) return\n switchTo = uri\n if (status.type !== WsEvent.ERROR && latestSocket) latestSocket.close()\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":["WsEvent","SocketEvents","noop","identity","getSyncProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy';
|
|
2
2
|
import { noop } from '@polkadot-api/utils';
|
|
3
|
-
import { WsEvent } from './types.
|
|
4
|
-
import { withSocket } from './with-socket.
|
|
3
|
+
import { WsEvent } from './types.js';
|
|
4
|
+
import { withSocket } from './with-socket.js';
|
|
5
5
|
import { identity } from 'rxjs';
|
|
6
6
|
|
|
7
7
|
const defaultConfig = {
|
|
@@ -81,4 +81,4 @@ const getWsProvider = (endpoints, config) => {
|
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
export { defaultConfig, getWsProvider };
|
|
84
|
-
//# sourceMappingURL=provider.
|
|
84
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../src/provider.ts"],"sourcesContent":["import {\n getSyncProvider,\n InnerJsonRpcProvider,\n} from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { noop } from \"@polkadot-api/utils\"\nimport {\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n SocketLoggerFn,\n WebSocketClass,\n Middleware,\n} from \"./types\"\nimport { withSocket } from \"./with-socket\"\nimport { identity } from \"rxjs\"\n\nexport const defaultConfig: {\n timeout: number\n heartbeatTimeout: number\n middleware: Middleware\n onStatusChanged: (status: StatusChange) => void\n} = {\n onStatusChanged: noop,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n middleware: identity,\n}\n\nexport const getWsProvider = (\n endpoints: string | Array<string>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n middleware: Middleware\n logger: SocketLoggerFn\n }>,\n): WsJsonRpcProvider => {\n const {\n onStatusChanged: _onStatuChanged,\n timeout,\n heartbeatTimeout,\n middleware,\n logger,\n } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = 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 switchTo: string | undefined\n let latestSocket: WebSocket | null = null\n let status: StatusChange = { type: WsEvent.CLOSE, event: null }\n let prevUri: string | undefined\n const onStatusChanged = (x: StatusChange) => _onStatuChanged((status = x))\n\n const socketProvider = middleware(\n withSocket(\n () => {\n prevUri = latestSocket?.url\n const uri = switchTo ?? actualEndpoints[idx++ % actualEndpoints.length]\n switchTo = undefined\n onStatusChanged({\n type: WsEvent.CONNECTING,\n uri,\n })\n return [\n (latestSocket = new WebsocketClass(uri)),\n () => {\n onStatusChanged({\n type: WsEvent.CONNECTED,\n uri,\n })\n },\n ]\n },\n heartbeatTimeout,\n timeout,\n logger,\n ),\n )\n\n const provider: InnerJsonRpcProvider = (onMsg, onHalt) =>\n socketProvider(onMsg, (event) => {\n onStatusChanged({\n type: WsEvent.ERROR,\n event,\n })\n onHalt(event)\n })\n\n const result: JsonRpcProvider = getSyncProvider((onReady) => {\n if (!prevUri || latestSocket!.url !== prevUri) {\n onReady(provider)\n return noop\n }\n\n const token = setTimeout(onReady, 250, provider)\n return () => {\n clearTimeout(token)\n }\n })\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (uri?: string) => {\n if (status.type === WsEvent.CLOSE) return\n switchTo = uri\n if (status.type !== WsEvent.ERROR && latestSocket) latestSocket.close()\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: 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) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n\nexport enum SocketEvents {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n TIMEOUT = \"TIMEOUT\",\n STALE = \"STALE\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n DISCONNECT = \"DISCONNECT\",\n IN = \"IN\",\n OUT = \"OUT\",\n}\n\ntype SocketLoggerEvent =\n | { type: SocketEvents.CONNECTING; url: string }\n | { type: SocketEvents.CONNECTED }\n | { type: SocketEvents.DISCONNECT }\n | { type: SocketEvents.ERROR; error: any }\n | { type: SocketEvents.CLOSE }\n | { type: SocketEvents.STALE }\n | { type: SocketEvents.TIMEOUT }\n | { type: SocketEvents.IN; msg: string }\n | { type: SocketEvents.OUT; msg: string }\n\nexport type SocketLoggerFn = (event: SocketLoggerEvent) => void\n\nexport type WebSocketClass = typeof WebSocket\n\nexport type { InnerJsonRpcProvider }\nexport type Middleware = (base: InnerJsonRpcProvider) => InnerJsonRpcProvider\n"],"names":["WsEvent","SocketEvents"],"mappings":"AAGO,IAAK,OAAA,qBAAAA,QAAAA,KAAL;AACL,EAAAA,SAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,SAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,SAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,SAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;AA8BL,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AACL,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,cAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,cAAA,KAAA,CAAA,GAAM,KAAA;AATI,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getAsyncProvider } from './get-async-provider.
|
|
2
|
-
import { SocketEvents, WsEvent } from './types.
|
|
1
|
+
import { getAsyncProvider } from './get-async-provider.js';
|
|
2
|
+
import { SocketEvents, WsEvent } from './types.js';
|
|
3
3
|
import { noop } from '@polkadot-api/utils';
|
|
4
4
|
|
|
5
5
|
const withSocket = (getWebsocket, heartbeatTimeout, connectionTimeout, logger) => {
|
|
@@ -111,4 +111,4 @@ const withSocket = (getWebsocket, heartbeatTimeout, connectionTimeout, logger) =
|
|
|
111
111
|
};
|
|
112
112
|
|
|
113
113
|
export { withSocket };
|
|
114
|
-
//# sourceMappingURL=with-socket.
|
|
114
|
+
//# sourceMappingURL=with-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-socket.js","sources":["../src/with-socket.ts"],"sourcesContent":["import { getAsyncProvider } from \"./get-async-provider\"\nimport { SocketEvents, SocketLoggerFn, WsEvent } from \"./types\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const withSocket = (\n getWebsocket: () => [WebSocket, () => void],\n heartbeatTimeout: number,\n connectionTimeout: number,\n logger?: SocketLoggerFn,\n) => {\n const logType: (\n type:\n | SocketEvents.TIMEOUT\n | SocketEvents.STALE\n | SocketEvents.CONNECTED\n | SocketEvents.DISCONNECT\n | SocketEvents.CLOSE,\n ) => void = logger ? (type) => logger({ type }) : noop\n const logMsg: (\n type: SocketEvents.IN | SocketEvents.OUT,\n msg: string,\n ) => void = logger ? (type, msg) => logger({ type, msg }) : noop\n\n return getAsyncProvider((onReady) => {\n const [socket, onConnected] = getWebsocket()\n logger?.({ type: SocketEvents.CONNECTING, url: socket.url })\n\n let suicide: (e?: any) => void = () => {\n suicide = noop\n cleanup()\n onReady(null)\n }\n\n let isFirst = true\n let heartbeatToken: number\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n const [time, event] = isFirst\n ? ([connectionTimeout, SocketEvents.TIMEOUT] as const)\n : ([heartbeatTimeout, SocketEvents.STALE] as const)\n isFirst = false\n heartbeatToken = setTimeout(() => {\n logType(event)\n suicide({\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n })\n }, time)\n }\n const stopTimeout = () => {\n clearTimeout(heartbeatToken)\n }\n\n heartbeat()\n\n let cleanup = () => {\n stopTimeout()\n }\n\n const onError = (event: any) => {\n logger?.({ type: SocketEvents.ERROR, error: event })\n suicide({\n type: WsEvent.ERROR,\n event,\n })\n }\n const onClose = (event: any) => {\n logType(SocketEvents.CLOSE)\n suicide({\n type: WsEvent.CLOSE,\n event,\n })\n }\n\n const disconnect = () => {\n logType(SocketEvents.DISCONNECT)\n cleanup()\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n\n const onOpen = () => {\n logType(SocketEvents.CONNECTED)\n onConnected()\n heartbeat()\n socket.removeEventListener(\"open\", onOpen)\n onReady((onMsg, onHalt) => {\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"close\", onClose)\n }\n\n suicide = (e?: any) => {\n suicide = noop\n cleanup()\n onHalt(e)\n }\n\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") {\n logMsg(SocketEvents.IN, e.data)\n onMsg(JSON.parse(e.data))\n }\n }\n\n socket.addEventListener(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n return {\n send(m) {\n const msg = JSON.stringify(m)\n logMsg(SocketEvents.OUT, msg)\n socket.send(msg)\n },\n disconnect,\n }\n })\n }\n\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.removeEventListener(\"open\", onOpen)\n }\n\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n\n return disconnect\n })\n}\n"],"names":[],"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.9.0",
|
|
4
4
|
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,28 +8,18 @@
|
|
|
8
8
|
},
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"sideEffects": false,
|
|
11
|
+
"type": "module",
|
|
11
12
|
"exports": {
|
|
12
13
|
".": {
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"require": "./dist/min/index.js",
|
|
17
|
-
"default": "./dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"import": "./dist/esm/index.mjs",
|
|
20
|
-
"require": "./dist/index.js",
|
|
21
|
-
"default": "./dist/index.js"
|
|
22
|
-
},
|
|
23
|
-
"module": "./dist/esm/index.mjs",
|
|
24
|
-
"import": "./dist/esm/index.mjs",
|
|
25
|
-
"require": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"import": "./dist/index.js",
|
|
26
17
|
"default": "./dist/index.js"
|
|
27
|
-
}
|
|
28
|
-
"./package.json": "./package.json"
|
|
18
|
+
}
|
|
29
19
|
},
|
|
30
20
|
"main": "./dist/index.js",
|
|
31
|
-
"module": "./dist/
|
|
32
|
-
"browser": "./dist/
|
|
21
|
+
"module": "./dist/index.js",
|
|
22
|
+
"browser": "./dist/index.js",
|
|
33
23
|
"types": "./dist/index.d.ts",
|
|
34
24
|
"files": [
|
|
35
25
|
"dist"
|
|
@@ -38,9 +28,9 @@
|
|
|
38
28
|
"rxjs": ">=7.8.0"
|
|
39
29
|
},
|
|
40
30
|
"dependencies": {
|
|
41
|
-
"@polkadot-api/json-rpc-provider": "0.
|
|
42
|
-
"@polkadot-api/json-rpc-provider-proxy": "0.
|
|
43
|
-
"@polkadot-api/utils": "0.
|
|
31
|
+
"@polkadot-api/json-rpc-provider": "0.2.0",
|
|
32
|
+
"@polkadot-api/json-rpc-provider-proxy": "0.4.0",
|
|
33
|
+
"@polkadot-api/utils": "0.4.0"
|
|
44
34
|
},
|
|
45
35
|
"devDependencies": {
|
|
46
36
|
"rxjs": "^7.8.2"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-async-provider.mjs","sources":["../../src/get-async-provider.ts"],"sourcesContent":["import {\n JsonRpcConnection,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const getAsyncProvider =\n <T = string>(\n input: (\n onResult: (x: InnerJsonRpcProvider<T> | null) => void,\n ) => () => void,\n ): InnerJsonRpcProvider<T> =>\n (onMessage, _onHalt) => {\n // null -> loading\n // undefined -> destroyed\n let connection: JsonRpcConnection<T> | null | undefined = null\n\n let pending: Array<JsonRpcRequest> = []\n const done = () => {\n stop()\n onHalt = stop = noop\n connection = undefined\n pending = []\n }\n let onHalt = (e?: any) => {\n done()\n _onHalt(e)\n }\n\n let stop = input((cb) => {\n stop = noop\n if (!cb) {\n onHalt()\n } else {\n connection = cb(onMessage, onHalt)\n pending.forEach((x) => connection?.send(x))\n pending = []\n }\n })\n\n return {\n send: (msg) => {\n if (connection) connection.send(msg)\n else if (connection === null) pending.push(msg)\n },\n disconnect: () => {\n const x = connection\n done()\n x?.disconnect()\n },\n }\n }\n"],"names":[],"mappings":";;AAOO,MAAM,gBAAA,GACX,CACE,KAAA,KAIF,CAAC,WAAW,OAAA,KAAY;AAGtB,EAAA,IAAI,UAAA,GAAsD,IAAA;AAE1D,EAAA,IAAI,UAAiC,EAAC;AACtC,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAA,EAAK;AACL,IAAA,MAAA,GAAS,IAAA,GAAO,IAAA;AAChB,IAAA,UAAA,GAAa,MAAA;AACb,IAAA,OAAA,GAAU,EAAC;AAAA,EACb,CAAA;AACA,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,KAAY;AACxB,IAAA,IAAA,EAAK;AACL,IAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,CAAC,EAAA,KAAO;AACvB,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,EAAO;AAAA,IACT,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,EAAA,CAAG,WAAW,MAAM,CAAA;AACjC,MAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA;AAC1C,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,WAAA,IAC1B,UAAA,KAAe,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,YAAY,MAAM;AAChB,MAAA,MAAM,CAAA,GAAI,UAAA;AACV,MAAA,IAAA,EAAK;AACL,MAAA,CAAA,EAAG,UAAA,EAAW;AAAA,IAChB;AAAA,GACF;AACF;;;;"}
|
package/dist/esm/index.mjs
DELETED
package/dist/esm/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","sources":["../../src/provider.ts"],"sourcesContent":["import {\n getSyncProvider,\n InnerJsonRpcProvider,\n} from \"@polkadot-api/json-rpc-provider-proxy\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { noop } from \"@polkadot-api/utils\"\nimport {\n StatusChange,\n WsJsonRpcProvider,\n WsEvent,\n SocketLoggerFn,\n WebSocketClass,\n Middleware,\n} from \"./types\"\nimport { withSocket } from \"./with-socket\"\nimport { identity } from \"rxjs\"\n\nexport const defaultConfig: {\n timeout: number\n heartbeatTimeout: number\n middleware: Middleware\n onStatusChanged: (status: StatusChange) => void\n} = {\n onStatusChanged: noop,\n timeout: 5_000,\n heartbeatTimeout: 40_000,\n middleware: identity,\n}\n\nexport const getWsProvider = (\n endpoints: string | Array<string>,\n config?: Partial<{\n onStatusChanged: (status: StatusChange) => void\n timeout: number\n heartbeatTimeout: number\n websocketClass: WebSocketClass\n middleware: Middleware\n logger: SocketLoggerFn\n }>,\n): WsJsonRpcProvider => {\n const {\n onStatusChanged: _onStatuChanged,\n timeout,\n heartbeatTimeout,\n middleware,\n logger,\n } = {\n ...defaultConfig,\n ...config,\n }\n const actualEndpoints = 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 switchTo: string | undefined\n let latestSocket: WebSocket | null = null\n let status: StatusChange = { type: WsEvent.CLOSE, event: null }\n let prevUri: string | undefined\n const onStatusChanged = (x: StatusChange) => _onStatuChanged((status = x))\n\n const socketProvider = middleware(\n withSocket(\n () => {\n prevUri = latestSocket?.url\n const uri = switchTo ?? actualEndpoints[idx++ % actualEndpoints.length]\n switchTo = undefined\n onStatusChanged({\n type: WsEvent.CONNECTING,\n uri,\n })\n return [\n (latestSocket = new WebsocketClass(uri)),\n () => {\n onStatusChanged({\n type: WsEvent.CONNECTED,\n uri,\n })\n },\n ]\n },\n heartbeatTimeout,\n timeout,\n logger,\n ),\n )\n\n const provider: InnerJsonRpcProvider = (onMsg, onHalt) =>\n socketProvider(onMsg, (event) => {\n onStatusChanged({\n type: WsEvent.ERROR,\n event,\n })\n onHalt(event)\n })\n\n const result: JsonRpcProvider = getSyncProvider((onReady) => {\n if (!prevUri || latestSocket!.url !== prevUri) {\n onReady(provider)\n return noop\n }\n\n const token = setTimeout(onReady, 250, provider)\n return () => {\n clearTimeout(token)\n }\n })\n\n const switchFn: WsJsonRpcProvider[\"switch\"] = (uri?: string) => {\n if (status.type === WsEvent.CLOSE) return\n switchTo = uri\n if (status.type !== WsEvent.ERROR && latestSocket) latestSocket.close()\n }\n\n return Object.assign(result, { switch: switchFn, getStatus: () => status })\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/types.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sources":["../../src/types.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { InnerJsonRpcProvider } from \"@polkadot-api/json-rpc-provider-proxy\"\n\nexport enum WsEvent {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n}\n\nexport type WsConnecting = {\n type: WsEvent.CONNECTING\n uri: string\n}\nexport type WsConnected = {\n type: WsEvent.CONNECTED\n uri: 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) => void\n getStatus: () => StatusChange\n}\nexport { type JsonRpcProvider }\n\nexport enum SocketEvents {\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n TIMEOUT = \"TIMEOUT\",\n STALE = \"STALE\",\n ERROR = \"ERROR\",\n CLOSE = \"CLOSE\",\n DISCONNECT = \"DISCONNECT\",\n IN = \"IN\",\n OUT = \"OUT\",\n}\n\ntype SocketLoggerEvent =\n | { type: SocketEvents.CONNECTING; url: string }\n | { type: SocketEvents.CONNECTED }\n | { type: SocketEvents.DISCONNECT }\n | { type: SocketEvents.ERROR; error: any }\n | { type: SocketEvents.CLOSE }\n | { type: SocketEvents.STALE }\n | { type: SocketEvents.TIMEOUT }\n | { type: SocketEvents.IN; msg: string }\n | { type: SocketEvents.OUT; msg: string }\n\nexport type SocketLoggerFn = (event: SocketLoggerEvent) => void\n\nexport type WebSocketClass = typeof WebSocket\n\nexport type { InnerJsonRpcProvider }\nexport type Middleware = (base: InnerJsonRpcProvider) => InnerJsonRpcProvider\n"],"names":["WsEvent","SocketEvents"],"mappings":"AAGO,IAAK,OAAA,qBAAAA,QAAAA,KAAL;AACL,EAAAA,SAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,SAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,SAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,SAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;AA8BL,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AACL,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,cAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,cAAA,KAAA,CAAA,GAAM,KAAA;AATI,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"with-socket.mjs","sources":["../../src/with-socket.ts"],"sourcesContent":["import { getAsyncProvider } from \"./get-async-provider\"\nimport { SocketEvents, SocketLoggerFn, WsEvent } from \"./types\"\nimport { noop } from \"@polkadot-api/utils\"\n\nexport const withSocket = (\n getWebsocket: () => [WebSocket, () => void],\n heartbeatTimeout: number,\n connectionTimeout: number,\n logger?: SocketLoggerFn,\n) => {\n const logType: (\n type:\n | SocketEvents.TIMEOUT\n | SocketEvents.STALE\n | SocketEvents.CONNECTED\n | SocketEvents.DISCONNECT\n | SocketEvents.CLOSE,\n ) => void = logger ? (type) => logger({ type }) : noop\n const logMsg: (\n type: SocketEvents.IN | SocketEvents.OUT,\n msg: string,\n ) => void = logger ? (type, msg) => logger({ type, msg }) : noop\n\n return getAsyncProvider((onReady) => {\n const [socket, onConnected] = getWebsocket()\n logger?.({ type: SocketEvents.CONNECTING, url: socket.url })\n\n let suicide: (e?: any) => void = () => {\n suicide = noop\n cleanup()\n onReady(null)\n }\n\n let isFirst = true\n let heartbeatToken: number\n const heartbeat = () => {\n clearTimeout(heartbeatToken)\n const [time, event] = isFirst\n ? ([connectionTimeout, SocketEvents.TIMEOUT] as const)\n : ([heartbeatTimeout, SocketEvents.STALE] as const)\n isFirst = false\n heartbeatToken = setTimeout(() => {\n logType(event)\n suicide({\n type: WsEvent.ERROR,\n event: { type: \"timeout\" },\n })\n }, time)\n }\n const stopTimeout = () => {\n clearTimeout(heartbeatToken)\n }\n\n heartbeat()\n\n let cleanup = () => {\n stopTimeout()\n }\n\n const onError = (event: any) => {\n logger?.({ type: SocketEvents.ERROR, error: event })\n suicide({\n type: WsEvent.ERROR,\n event,\n })\n }\n const onClose = (event: any) => {\n logType(SocketEvents.CLOSE)\n suicide({\n type: WsEvent.CLOSE,\n event,\n })\n }\n\n const disconnect = () => {\n logType(SocketEvents.DISCONNECT)\n cleanup()\n try {\n socket.addEventListener(\"error\", noop, { once: true })\n socket.close()\n } catch {}\n }\n\n const onOpen = () => {\n logType(SocketEvents.CONNECTED)\n onConnected()\n heartbeat()\n socket.removeEventListener(\"open\", onOpen)\n onReady((onMsg, onHalt) => {\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"ping\", heartbeat)\n socket.removeEventListener(\"message\", _onMessage)\n socket.removeEventListener(\"close\", onClose)\n }\n\n suicide = (e?: any) => {\n suicide = noop\n cleanup()\n onHalt(e)\n }\n\n const _onMessage = (e: MessageEvent) => {\n heartbeat()\n if (typeof e.data === \"string\") {\n logMsg(SocketEvents.IN, e.data)\n onMsg(JSON.parse(e.data))\n }\n }\n\n socket.addEventListener(\"ping\", heartbeat)\n socket.addEventListener(\"message\", _onMessage)\n socket.addEventListener(\"error\", onError)\n socket.addEventListener(\"close\", onClose)\n return {\n send(m) {\n const msg = JSON.stringify(m)\n logMsg(SocketEvents.OUT, msg)\n socket.send(msg)\n },\n disconnect,\n }\n })\n }\n\n cleanup = () => {\n cleanup = noop\n stopTimeout()\n socket.removeEventListener(\"error\", onError)\n socket.removeEventListener(\"close\", onClose)\n socket.removeEventListener(\"open\", onOpen)\n }\n\n socket.addEventListener(\"open\", onOpen)\n socket.addEventListener(\"error\", onError)\n\n return disconnect\n })\n}\n"],"names":[],"mappings":"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"}
|