@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.
@@ -37,4 +37,4 @@ const getAsyncProvider = (input) => (onMessage, _onHalt) => {
37
37
  };
38
38
 
39
39
  export { getAsyncProvider };
40
- //# sourceMappingURL=get-async-provider.mjs.map
40
+ //# sourceMappingURL=get-async-provider.js.map
@@ -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
- 'use strict';
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.mjs';
4
- import { withSocket } from './with-socket.mjs';
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.mjs.map
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":";;;;;;AAiBO,MAAM,aAAA,GAKT;AAAA,EACF,eAAA,EAAiB,IAAA;AAAA,EACjB,OAAA,EAAS,GAAA;AAAA,EACT,gBAAA,EAAkB,GAAA;AAAA,EAClB,UAAA,EAAY;AACd;AAEO,MAAM,aAAA,GAAgB,CAC3B,SAAA,EACA,MAAA,KAQsB;AACtB,EAAA,MAAM;AAAA,IACJ,eAAA,EAAiB,eAAA;AAAA,IACjB,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI;AAAA,IACF,GAAG,aAAA;AAAA,IACH,GAAG;AAAA,GACL;AACA,EAAA,MAAM,kBAAkB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AAEzE,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,UAAA,CAAW,SAAA;AAC5D,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAE9D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,YAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,SAAuB,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAO,OAAO,IAAA,EAAK;AAC9D,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAoB,eAAA,CAAiB,SAAS,CAAE,CAAA;AAEzE,EAAA,MAAM,cAAA,GAAiB,UAAA;AAAA,IACrB,UAAA;AAAA,MACE,MAAM;AACJ,QAAA,OAAA,GAAU,YAAA,EAAc,GAAA;AACxB,QAAA,MAAM,GAAA,GAAM,QAAA,IAAY,eAAA,CAAgB,GAAA,EAAA,GAAQ,gBAAgB,MAAM,CAAA;AACtE,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,eAAA,CAAgB;AAAA,UACd,MAAM,OAAA,CAAQ,UAAA;AAAA,UACd;AAAA,SACD,CAAA;AACD,QAAA,OAAO;AAAA,UACJ,YAAA,GAAe,IAAI,cAAA,CAAe,GAAG,CAAA;AAAA,UACtC,MAAM;AACJ,YAAA,eAAA,CAAgB;AAAA,cACd,MAAM,OAAA,CAAQ,SAAA;AAAA,cACd;AAAA,aACD,CAAA;AAAA,UACH;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,WAAiC,CAAC,KAAA,EAAO,WAC7C,cAAA,CAAe,KAAA,EAAO,CAAC,KAAA,KAAU;AAC/B,IAAA,eAAA,CAAgB;AAAA,MACd,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,KAAK,CAAA;AAAA,EACd,CAAC,CAAA;AAEH,EAAA,MAAM,MAAA,GAA0B,eAAA,CAAgB,CAAC,OAAA,KAAY;AAC3D,IAAA,IAAI,CAAC,OAAA,IAAW,YAAA,CAAc,GAAA,KAAQ,OAAA,EAAS;AAC7C,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC/C,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAwC,CAAC,GAAA,KAAiB;AAC9D,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,EAAO;AACnC,IAAA,QAAA,GAAW,GAAA;AACX,IAAA,IAAI,OAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,IAAS,YAAA,eAA2B,KAAA,EAAM;AAAA,EACxE,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,EAAE,QAAQ,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA;AAC5E;;;;"}
@@ -19,4 +19,4 @@ var SocketEvents = /* @__PURE__ */ ((SocketEvents2) => {
19
19
  })(SocketEvents || {});
20
20
 
21
21
  export { SocketEvents, WsEvent };
22
- //# sourceMappingURL=types.mjs.map
22
+ //# sourceMappingURL=types.js.map
@@ -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.mjs';
2
- import { SocketEvents, WsEvent } from './types.mjs';
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.mjs.map
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.8.2-canary.d6be873",
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
- "node": {
14
- "production": {
15
- "import": "./dist/esm/index.mjs",
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/esm/index.mjs",
32
- "browser": "./dist/esm/index.mjs",
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.1.1-canary.d6be873",
42
- "@polkadot-api/json-rpc-provider-proxy": "0.3.2-canary.d6be873",
43
- "@polkadot-api/utils": "0.3.1-canary.d6be873"
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;;;;"}
@@ -1,3 +0,0 @@
1
- export { SocketEvents, WsEvent } from './types.mjs';
2
- export { getWsProvider } from './provider.mjs';
3
- //# sourceMappingURL=index.mjs.map
@@ -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":";;;;;;AAiBO,MAAM,aAAA,GAKT;AAAA,EACF,eAAA,EAAiB,IAAA;AAAA,EACjB,OAAA,EAAS,GAAA;AAAA,EACT,gBAAA,EAAkB,GAAA;AAAA,EAClB,UAAA,EAAY;AACd;AAEO,MAAM,aAAA,GAAgB,CAC3B,SAAA,EACA,MAAA,KAQsB;AACtB,EAAA,MAAM;AAAA,IACJ,eAAA,EAAiB,eAAA;AAAA,IACjB,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI;AAAA,IACF,GAAG,aAAA;AAAA,IACH,GAAG;AAAA,GACL;AACA,EAAA,MAAM,kBAAkB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AAEzE,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,UAAA,CAAW,SAAA;AAC5D,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAE9D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,YAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,SAAuB,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAO,OAAO,IAAA,EAAK;AAC9D,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAoB,eAAA,CAAiB,SAAS,CAAE,CAAA;AAEzE,EAAA,MAAM,cAAA,GAAiB,UAAA;AAAA,IACrB,UAAA;AAAA,MACE,MAAM;AACJ,QAAA,OAAA,GAAU,YAAA,EAAc,GAAA;AACxB,QAAA,MAAM,GAAA,GAAM,QAAA,IAAY,eAAA,CAAgB,GAAA,EAAA,GAAQ,gBAAgB,MAAM,CAAA;AACtE,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,eAAA,CAAgB;AAAA,UACd,MAAM,OAAA,CAAQ,UAAA;AAAA,UACd;AAAA,SACD,CAAA;AACD,QAAA,OAAO;AAAA,UACJ,YAAA,GAAe,IAAI,cAAA,CAAe,GAAG,CAAA;AAAA,UACtC,MAAM;AACJ,YAAA,eAAA,CAAgB;AAAA,cACd,MAAM,OAAA,CAAQ,SAAA;AAAA,cACd;AAAA,aACD,CAAA;AAAA,UACH;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,WAAiC,CAAC,KAAA,EAAO,WAC7C,cAAA,CAAe,KAAA,EAAO,CAAC,KAAA,KAAU;AAC/B,IAAA,eAAA,CAAgB;AAAA,MACd,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,KAAK,CAAA;AAAA,EACd,CAAC,CAAA;AAEH,EAAA,MAAM,MAAA,GAA0B,eAAA,CAAgB,CAAC,OAAA,KAAY;AAC3D,IAAA,IAAI,CAAC,OAAA,IAAW,YAAA,CAAc,GAAA,KAAQ,OAAA,EAAS;AAC7C,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC/C,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAwC,CAAC,GAAA,KAAiB;AAC9D,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,EAAO;AACnC,IAAA,QAAA,GAAW,GAAA;AACX,IAAA,IAAI,OAAO,IAAA,KAAS,OAAA,CAAQ,KAAA,IAAS,YAAA,eAA2B,KAAA,EAAM;AAAA,EACxE,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,EAAE,QAAQ,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA;AAC5E;;;;"}
@@ -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":";;;;AAIO,MAAM,UAAA,GAAa,CACxB,YAAA,EACA,gBAAA,EACA,mBACA,MAAA,KACG;AACH,EAAA,MAAM,OAAA,GAOM,SAAS,CAAC,IAAA,KAAS,OAAO,EAAE,IAAA,EAAM,CAAA,GAAI,IAAA;AAClD,EAAA,MAAM,MAAA,GAGM,MAAA,GAAS,CAAC,IAAA,EAAM,GAAA,KAAQ,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,GAAI,IAAA;AAE5D,EAAA,OAAO,gBAAA,CAAiB,CAAC,OAAA,KAAY;AACnC,IAAA,MAAM,CAAC,MAAA,EAAQ,WAAW,CAAA,GAAI,YAAA,EAAa;AAC3C,IAAA,MAAA,GAAS,EAAE,IAAA,EAAM,YAAA,CAAa,YAAY,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA;AAE3D,IAAA,IAAI,UAA6B,MAAM;AACrC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI,cAAA;AACJ,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,OAAA,GACjB,CAAC,iBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,GACxC,CAAC,gBAAA,EAAkB,aAAa,KAAK,CAAA;AAC1C,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,cAAA,GAAiB,WAAW,MAAM;AAChC,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,OAAA,CAAQ;AAAA,UACN,MAAM,OAAA,CAAQ,KAAA;AAAA,UACd,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AAAU,SAC1B,CAAA;AAAA,MACH,GAAG,IAAI,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,YAAA,CAAa,cAAc,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,SAAA,EAAU;AAEV,IAAA,IAAI,UAAU,MAAM;AAClB,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAe;AAC9B,MAAA,MAAA,GAAS,EAAE,IAAA,EAAM,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AACnD,MAAA,OAAA,CAAQ;AAAA,QACN,MAAM,OAAA,CAAQ,KAAA;AAAA,QACd;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAe;AAC9B,MAAA,OAAA,CAAQ,aAAa,KAAK,CAAA;AAC1B,MAAA,OAAA,CAAQ;AAAA,QACN,MAAM,OAAA,CAAQ,KAAA;AAAA,QACd;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,OAAA,CAAQ,aAAa,UAAU,CAAA;AAC/B,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AACrD,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA;AAEA,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAC9B,MAAA,WAAA,EAAY;AACZ,MAAA,SAAA,EAAU;AACV,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACzC,MAAA,OAAA,CAAQ,CAAC,OAAO,MAAA,KAAW;AACzB,QAAA,OAAA,GAAU,MAAM;AACd,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,WAAA,EAAY;AACZ,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,UAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,SAAS,CAAA;AAC5C,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAChD,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,QAC7C,CAAA;AAEA,QAAA,OAAA,GAAU,CAAC,CAAA,KAAY;AACrB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,OAAA,EAAQ;AACR,UAAA,MAAA,CAAO,CAAC,CAAA;AAAA,QACV,CAAA;AAEA,QAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAoB;AACtC,UAAA,SAAA,EAAU;AACV,UAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,YAAA,MAAA,CAAO,YAAA,CAAa,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AAC9B,YAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,UAC1B;AAAA,QACF,CAAA;AAEA,QAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,SAAS,CAAA;AACzC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAC7C,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,KAAK,CAAA,EAAG;AACN,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAC5B,YAAA,MAAA,CAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAC5B,YAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,UACjB,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAA,GAAU,MAAM;AACd,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,WAAA,EAAY;AACZ,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,IAC3C,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAExC,IAAA,OAAO,UAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;"}