@nktkas/hyperliquid 0.22.2 → 0.23.1
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/README.md +79 -67
- package/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/src/base.d.ts +4 -1
- package/esm/src/base.d.ts.map +1 -1
- package/esm/src/base.js +2 -2
- package/esm/src/clients/exchange.d.ts +289 -207
- package/esm/src/clients/exchange.d.ts.map +1 -1
- package/esm/src/clients/exchange.js +605 -410
- package/esm/src/clients/info.d.ts +264 -48
- package/esm/src/clients/info.d.ts.map +1 -1
- package/esm/src/clients/info.js +273 -31
- package/esm/src/clients/multiSign.d.ts +285 -204
- package/esm/src/clients/multiSign.d.ts.map +1 -1
- package/esm/src/clients/multiSign.js +521 -493
- package/esm/src/clients/subscription.d.ts +38 -3
- package/esm/src/clients/subscription.d.ts.map +1 -1
- package/esm/src/clients/subscription.js +36 -3
- package/esm/src/signing/{_ethers.d.ts → _signTypedData/ethers.d.ts} +1 -1
- package/esm/src/signing/_signTypedData/ethers.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/mod.d.ts +35 -0
- package/esm/src/signing/_signTypedData/mod.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/mod.js +59 -0
- package/esm/src/signing/_signTypedData/private_key.d.ts +26 -0
- package/esm/src/signing/_signTypedData/private_key.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/private_key.js +144 -0
- package/esm/src/signing/{_viem.d.ts → _signTypedData/viem.d.ts} +2 -2
- package/esm/src/signing/_signTypedData/viem.d.ts.map +1 -0
- package/{script/src/signing/_window.d.ts → esm/src/signing/_signTypedData/window.d.ts} +18 -12
- package/esm/src/signing/_signTypedData/window.d.ts.map +1 -0
- package/esm/src/signing/{_window.js → _signTypedData/window.js} +3 -2
- package/esm/src/signing/_sorter.d.ts +56 -82
- package/esm/src/signing/_sorter.d.ts.map +1 -1
- package/esm/src/signing/_sorter.js +36 -49
- package/esm/src/signing/mod.d.ts +151 -130
- package/esm/src/signing/mod.d.ts.map +1 -1
- package/esm/src/signing/mod.js +182 -228
- package/esm/src/transports/base.d.ts +1 -1
- package/esm/src/transports/base.d.ts.map +1 -1
- package/esm/src/transports/base.js +2 -2
- package/esm/src/transports/http/http_transport.d.ts +9 -15
- package/esm/src/transports/http/http_transport.d.ts.map +1 -1
- package/esm/src/transports/http/http_transport.js +64 -59
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
- package/esm/src/transports/websocket/_hyperliquid_event_target.js +1 -1
- package/esm/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -1
- package/esm/src/transports/websocket/_reconnecting_websocket.js +17 -4
- package/esm/src/transports/websocket/_websocket_async_request.d.ts +0 -9
- package/esm/src/transports/websocket/_websocket_async_request.d.ts.map +1 -1
- package/esm/src/transports/websocket/_websocket_async_request.js +14 -20
- package/esm/src/transports/websocket/websocket_transport.d.ts +8 -4
- package/esm/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/esm/src/transports/websocket/websocket_transport.js +83 -54
- package/esm/src/types/exchange/requests.d.ts +27 -51
- package/esm/src/types/exchange/requests.d.ts.map +1 -1
- package/esm/src/types/explorer/requests.d.ts +5 -8
- package/esm/src/types/explorer/requests.d.ts.map +1 -1
- package/esm/src/types/info/accounts.d.ts +5 -5
- package/esm/src/types/info/accounts.d.ts.map +1 -1
- package/esm/src/types/info/markets.d.ts +6 -0
- package/esm/src/types/info/markets.d.ts.map +1 -1
- package/esm/src/types/info/orders.d.ts +1 -1
- package/esm/src/types/info/orders.d.ts.map +1 -1
- package/esm/src/types/info/requests.d.ts +129 -124
- package/esm/src/types/info/requests.d.ts.map +1 -1
- package/{script/src/types/info/delegations.d.ts → esm/src/types/info/validators.d.ts} +2 -2
- package/esm/src/types/info/validators.d.ts.map +1 -0
- package/esm/src/types/info/vaults.d.ts +7 -0
- package/esm/src/types/info/vaults.d.ts.map +1 -1
- package/esm/src/types/mod.d.ts +1 -1
- package/esm/src/types/mod.d.ts.map +1 -1
- package/esm/src/types/subscriptions/requests.d.ts +72 -18
- package/esm/src/types/subscriptions/requests.d.ts.map +1 -1
- package/esm/src/types/subscriptions/responses.d.ts +2 -0
- package/esm/src/types/subscriptions/responses.d.ts.map +1 -1
- package/package.json +8 -5
- package/script/mod.d.ts +1 -1
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +13 -23
- package/script/src/base.d.ts +4 -1
- package/script/src/base.d.ts.map +1 -1
- package/script/src/base.js +10 -20
- package/script/src/clients/exchange.d.ts +289 -207
- package/script/src/clients/exchange.d.ts.map +1 -1
- package/script/src/clients/exchange.js +2000 -1815
- package/script/src/clients/info.d.ts +264 -48
- package/script/src/clients/info.d.ts.map +1 -1
- package/script/src/clients/info.js +1442 -1210
- package/script/src/clients/multiSign.d.ts +285 -204
- package/script/src/clients/multiSign.d.ts.map +1 -1
- package/script/src/clients/multiSign.js +2043 -2025
- package/script/src/clients/subscription.d.ts +38 -3
- package/script/src/clients/subscription.d.ts.map +1 -1
- package/script/src/clients/subscription.js +568 -545
- package/script/src/signing/{_ethers.d.ts → _signTypedData/ethers.d.ts} +1 -1
- package/script/src/signing/_signTypedData/ethers.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/ethers.js +16 -0
- package/script/src/signing/_signTypedData/mod.d.ts +35 -0
- package/script/src/signing/_signTypedData/mod.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/mod.js +67 -0
- package/script/src/signing/_signTypedData/private_key.d.ts +26 -0
- package/script/src/signing/_signTypedData/private_key.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/private_key.js +148 -0
- package/script/src/signing/{_viem.d.ts → _signTypedData/viem.d.ts} +2 -2
- package/script/src/signing/_signTypedData/viem.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/viem.js +9 -0
- package/{esm/src/signing/_window.d.ts → script/src/signing/_signTypedData/window.d.ts} +18 -12
- package/script/src/signing/_signTypedData/window.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/window.js +34 -0
- package/script/src/signing/_sorter.d.ts +56 -82
- package/script/src/signing/_sorter.d.ts.map +1 -1
- package/script/src/signing/_sorter.js +655 -678
- package/script/src/signing/mod.d.ts +151 -130
- package/script/src/signing/mod.d.ts.map +1 -1
- package/script/src/signing/mod.js +286 -342
- package/script/src/transports/base.d.ts +1 -1
- package/script/src/transports/base.d.ts.map +1 -1
- package/script/src/transports/base.js +11 -21
- package/script/src/transports/http/http_transport.d.ts +9 -15
- package/script/src/transports/http/http_transport.d.ts.map +1 -1
- package/script/src/transports/http/http_transport.js +97 -102
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
- package/script/src/transports/websocket/_hyperliquid_event_target.js +51 -61
- package/script/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -1
- package/script/src/transports/websocket/_reconnecting_websocket.js +271 -268
- package/script/src/transports/websocket/_websocket_async_request.d.ts +0 -9
- package/script/src/transports/websocket/_websocket_async_request.d.ts.map +1 -1
- package/script/src/transports/websocket/_websocket_async_request.js +157 -174
- package/script/src/transports/websocket/websocket_transport.d.ts +8 -4
- package/script/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/script/src/transports/websocket/websocket_transport.js +209 -189
- package/script/src/types/exchange/requests.d.ts +27 -51
- package/script/src/types/exchange/requests.d.ts.map +1 -1
- package/script/src/types/exchange/requests.js +2 -12
- package/script/src/types/exchange/responses.js +2 -12
- package/script/src/types/explorer/requests.d.ts +5 -8
- package/script/src/types/explorer/requests.d.ts.map +1 -1
- package/script/src/types/explorer/requests.js +2 -12
- package/script/src/types/explorer/responses.js +2 -12
- package/script/src/types/info/accounts.d.ts +5 -5
- package/script/src/types/info/accounts.d.ts.map +1 -1
- package/script/src/types/info/accounts.js +2 -12
- package/script/src/types/info/assets.js +2 -12
- package/script/src/types/info/markets.d.ts +6 -0
- package/script/src/types/info/markets.d.ts.map +1 -1
- package/script/src/types/info/markets.js +2 -12
- package/script/src/types/info/orders.d.ts +1 -1
- package/script/src/types/info/orders.d.ts.map +1 -1
- package/script/src/types/info/orders.js +2 -12
- package/script/src/types/info/requests.d.ts +129 -124
- package/script/src/types/info/requests.d.ts.map +1 -1
- package/script/src/types/info/requests.js +2 -12
- package/{esm/src/types/info/delegations.d.ts → script/src/types/info/validators.d.ts} +2 -2
- package/script/src/types/info/validators.d.ts.map +1 -0
- package/script/src/types/info/validators.js +2 -0
- package/script/src/types/info/vaults.d.ts +7 -0
- package/script/src/types/info/vaults.d.ts.map +1 -1
- package/script/src/types/info/vaults.js +2 -12
- package/script/src/types/mod.d.ts +1 -1
- package/script/src/types/mod.d.ts.map +1 -1
- package/script/src/types/mod.js +2 -12
- package/script/src/types/subscriptions/requests.d.ts +72 -18
- package/script/src/types/subscriptions/requests.d.ts.map +1 -1
- package/script/src/types/subscriptions/requests.js +2 -12
- package/script/src/types/subscriptions/responses.d.ts +2 -0
- package/script/src/types/subscriptions/responses.d.ts.map +1 -1
- package/script/src/types/subscriptions/responses.js +2 -12
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts +0 -2
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts.map +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.js +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts +0 -95
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts.map +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.js +0 -10
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.d.ts +0 -43
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.js +0 -63
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.js +0 -2
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts +0 -21
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.js +0 -32
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.js +0 -2
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts +0 -39
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.js +0 -237
- package/esm/src/signing/_ethers.d.ts.map +0 -1
- package/esm/src/signing/_private_key.d.ts +0 -22
- package/esm/src/signing/_private_key.d.ts.map +0 -1
- package/esm/src/signing/_private_key.js +0 -124
- package/esm/src/signing/_viem.d.ts.map +0 -1
- package/esm/src/signing/_window.d.ts.map +0 -1
- package/esm/src/types/info/delegations.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts +0 -2
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.js +0 -27
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts +0 -95
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.js +0 -24
- package/script/deps/jsr.io/@std/async/1.0.13/delay.d.ts +0 -43
- package/script/deps/jsr.io/@std/async/1.0.13/delay.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/async/1.0.13/delay.js +0 -76
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.js +0 -13
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts +0 -21
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.js +0 -45
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -67
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -26
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -13
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -101
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.js +0 -13
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts +0 -39
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.js +0 -250
- package/script/src/signing/_ethers.d.ts.map +0 -1
- package/script/src/signing/_ethers.js +0 -26
- package/script/src/signing/_private_key.d.ts +0 -22
- package/script/src/signing/_private_key.d.ts.map +0 -1
- package/script/src/signing/_private_key.js +0 -138
- package/script/src/signing/_viem.d.ts.map +0 -1
- package/script/src/signing/_viem.js +0 -19
- package/script/src/signing/_window.d.ts.map +0 -1
- package/script/src/signing/_window.js +0 -43
- package/script/src/types/info/delegations.d.ts.map +0 -1
- package/script/src/types/info/delegations.js +0 -12
- /package/esm/src/signing/{_ethers.js → _signTypedData/ethers.js} +0 -0
- /package/esm/src/signing/{_viem.js → _signTypedData/viem.js} +0 -0
- /package/esm/src/types/info/{delegations.js → validators.js} +0 -0
|
@@ -1,292 +1,295 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReconnectingWebSocket = exports.ReconnectingWebSocketError = void 0;
|
|
4
|
+
const base_js_1 = require("../base.js");
|
|
5
|
+
/** Simple FIFO (First In, First Out) buffer implementation. */
|
|
6
|
+
class FIFOMessageBuffer {
|
|
7
|
+
queue = [];
|
|
8
|
+
push(data, signal) {
|
|
9
|
+
this.queue.push({ data, signal });
|
|
5
10
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exports.ReconnectingWebSocket = exports.ReconnectingWebSocketError = void 0;
|
|
13
|
-
// deno-lint-ignore-file no-explicit-any
|
|
14
|
-
const delay_js_1 = require("../../../deps/jsr.io/@std/async/1.0.13/delay.js");
|
|
15
|
-
const base_js_1 = require("../base.js");
|
|
16
|
-
/** Simple FIFO (First In, First Out) buffer implementation. */
|
|
17
|
-
class FIFOMessageBuffer {
|
|
18
|
-
queue = [];
|
|
19
|
-
push(data, signal) {
|
|
20
|
-
this.queue.push({ data, signal });
|
|
21
|
-
}
|
|
22
|
-
*[Symbol.iterator]() {
|
|
23
|
-
while (this.queue.length > 0) {
|
|
24
|
-
const { data, signal } = this.queue.shift();
|
|
25
|
-
if (signal?.aborted)
|
|
26
|
-
continue;
|
|
27
|
-
yield data;
|
|
28
|
-
}
|
|
11
|
+
*[Symbol.iterator]() {
|
|
12
|
+
while (this.queue.length > 0) {
|
|
13
|
+
const { data, signal } = this.queue.shift();
|
|
14
|
+
if (signal?.aborted)
|
|
15
|
+
continue;
|
|
16
|
+
yield data;
|
|
29
17
|
}
|
|
30
18
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
19
|
+
}
|
|
20
|
+
/** Error thrown when reconnection problems occur. */
|
|
21
|
+
class ReconnectingWebSocketError extends base_js_1.TransportError {
|
|
22
|
+
code;
|
|
23
|
+
constructor(code, cause) {
|
|
24
|
+
super(`Error when reconnecting WebSocket: ${code}`);
|
|
25
|
+
this.code = code;
|
|
26
|
+
this.name = "ReconnectingWebSocketError";
|
|
27
|
+
this.cause = cause;
|
|
40
28
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const timeoutId = setTimeout(() => {
|
|
70
|
-
socket.removeEventListener("open", openHandler);
|
|
71
|
-
socket.removeEventListener("close", closeHandler);
|
|
72
|
-
socket.close(3008, "Timeout"); // https://www.iana.org/assignments/websocket/websocket.xml#close-code-number
|
|
73
|
-
}, this.reconnectOptions.connectionTimeout);
|
|
74
|
-
const openHandler = () => {
|
|
75
|
-
socket.removeEventListener("close", closeHandler);
|
|
76
|
-
clearTimeout(timeoutId);
|
|
77
|
-
};
|
|
78
|
-
const closeHandler = () => {
|
|
79
|
-
socket.removeEventListener("open", openHandler);
|
|
80
|
-
clearTimeout(timeoutId);
|
|
81
|
-
};
|
|
82
|
-
socket.addEventListener("open", openHandler, { once: true });
|
|
83
|
-
socket.addEventListener("close", closeHandler, { once: true });
|
|
29
|
+
}
|
|
30
|
+
exports.ReconnectingWebSocketError = ReconnectingWebSocketError;
|
|
31
|
+
/**
|
|
32
|
+
* A WebSocket that automatically reconnects when disconnected.
|
|
33
|
+
* Fully compatible with standard WebSocket API.
|
|
34
|
+
*/
|
|
35
|
+
class ReconnectingWebSocket {
|
|
36
|
+
_socket;
|
|
37
|
+
_protocols;
|
|
38
|
+
_listeners = [];
|
|
39
|
+
_attempt = 0;
|
|
40
|
+
reconnectOptions;
|
|
41
|
+
reconnectAbortController = new AbortController();
|
|
42
|
+
constructor(url, protocols, options) {
|
|
43
|
+
this.reconnectOptions = {
|
|
44
|
+
maxRetries: options?.maxRetries ?? 3,
|
|
45
|
+
connectionTimeout: options?.connectionTimeout === undefined ? 10_000 : options.connectionTimeout,
|
|
46
|
+
connectionDelay: options?.connectionDelay ?? ((n) => Math.min(~~(1 << n) * 150, 10_000)),
|
|
47
|
+
shouldReconnect: options?.shouldReconnect ?? (() => true),
|
|
48
|
+
messageBuffer: options?.messageBuffer ?? new FIFOMessageBuffer(),
|
|
49
|
+
};
|
|
50
|
+
this._socket = this._createSocket(url, protocols);
|
|
51
|
+
this._protocols = protocols;
|
|
52
|
+
this._setupEventListeners();
|
|
53
|
+
}
|
|
54
|
+
_createSocket(url, protocols) {
|
|
55
|
+
const socket = new WebSocket(url, protocols);
|
|
56
|
+
if (this.reconnectOptions.connectionTimeout === null)
|
|
84
57
|
return socket;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
this._attempt = 0;
|
|
94
|
-
// Send all buffered messages
|
|
95
|
-
for (const message of this.reconnectOptions.messageBuffer) {
|
|
96
|
-
this._socket.send(message);
|
|
97
|
-
}
|
|
58
|
+
const timeoutId = setTimeout(() => {
|
|
59
|
+
socket.removeEventListener("open", openHandler);
|
|
60
|
+
socket.removeEventListener("close", closeHandler);
|
|
61
|
+
socket.close(3008, "Timeout"); // https://www.iana.org/assignments/websocket/websocket.xml#close-code-number
|
|
62
|
+
}, this.reconnectOptions.connectionTimeout);
|
|
63
|
+
const openHandler = () => {
|
|
64
|
+
socket.removeEventListener("close", closeHandler);
|
|
65
|
+
clearTimeout(timeoutId);
|
|
98
66
|
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (this._socket.readyState !== ReconnectingWebSocket.CLOSING &&
|
|
103
|
-
this._socket.readyState !== ReconnectingWebSocket.CLOSED)
|
|
104
|
-
return;
|
|
105
|
-
// If the instance is terminated, do not attempt to reconnect
|
|
106
|
-
if (this.reconnectAbortController.signal.aborted)
|
|
107
|
-
return;
|
|
108
|
-
// Check if reconnection should be attempted
|
|
109
|
-
if (++this._attempt > this.reconnectOptions.maxRetries) {
|
|
110
|
-
this._cleanup("RECONNECTION_LIMIT_REACHED");
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
const userDecision = await this.reconnectOptions.shouldReconnect(event, this.reconnectAbortController.signal);
|
|
114
|
-
if (this.reconnectAbortController.signal.aborted)
|
|
115
|
-
return;
|
|
116
|
-
if (!userDecision) {
|
|
117
|
-
this._cleanup("RECONNECTION_STOPPED_BY_USER");
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
// Delay before reconnecting
|
|
121
|
-
const reconnectDelay = typeof this.reconnectOptions.connectionDelay === "number"
|
|
122
|
-
? this.reconnectOptions.connectionDelay
|
|
123
|
-
: await this.reconnectOptions.connectionDelay(this._attempt, this.reconnectAbortController.signal);
|
|
124
|
-
if (this.reconnectAbortController.signal.aborted)
|
|
125
|
-
return;
|
|
126
|
-
await (0, delay_js_1.delay)(reconnectDelay, { signal: this.reconnectAbortController.signal });
|
|
127
|
-
// Create a new WebSocket instance
|
|
128
|
-
const { onclose, onerror, onmessage, onopen } = this._socket;
|
|
129
|
-
this._socket = this._createSocket(this._socket.url, this._protocols);
|
|
130
|
-
// Reconnect all listeners
|
|
131
|
-
this._setupEventListeners();
|
|
132
|
-
this._listeners.forEach(({ type, listenerProxy, options }) => {
|
|
133
|
-
this._socket.addEventListener(type, listenerProxy, options);
|
|
134
|
-
});
|
|
135
|
-
this._socket.onclose = onclose;
|
|
136
|
-
this._socket.onerror = onerror;
|
|
137
|
-
this._socket.onmessage = onmessage;
|
|
138
|
-
this._socket.onopen = onopen;
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
this._cleanup("UNKNOWN_ERROR", error);
|
|
142
|
-
}
|
|
67
|
+
const closeHandler = () => {
|
|
68
|
+
socket.removeEventListener("open", openHandler);
|
|
69
|
+
clearTimeout(timeoutId);
|
|
143
70
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
get extensions() {
|
|
161
|
-
return this._socket.extensions;
|
|
162
|
-
}
|
|
163
|
-
get protocol() {
|
|
164
|
-
return this._socket.protocol;
|
|
165
|
-
}
|
|
166
|
-
get binaryType() {
|
|
167
|
-
return this._socket.binaryType;
|
|
168
|
-
}
|
|
169
|
-
set binaryType(value) {
|
|
170
|
-
this._socket.binaryType = value;
|
|
171
|
-
}
|
|
172
|
-
CONNECTING = 0;
|
|
173
|
-
OPEN = 1;
|
|
174
|
-
CLOSING = 2;
|
|
175
|
-
CLOSED = 3;
|
|
176
|
-
static CONNECTING = 0;
|
|
177
|
-
static OPEN = 1;
|
|
178
|
-
static CLOSING = 2;
|
|
179
|
-
static CLOSED = 3;
|
|
180
|
-
get onclose() {
|
|
181
|
-
return this._socket.onclose;
|
|
182
|
-
}
|
|
183
|
-
set onclose(value) {
|
|
184
|
-
this._socket.onclose = value;
|
|
185
|
-
}
|
|
186
|
-
get onerror() {
|
|
187
|
-
return this._socket.onerror;
|
|
188
|
-
}
|
|
189
|
-
set onerror(value) {
|
|
190
|
-
this._socket.onerror = value;
|
|
191
|
-
}
|
|
192
|
-
get onmessage() {
|
|
193
|
-
return this._socket.onmessage;
|
|
71
|
+
socket.addEventListener("open", openHandler, { once: true });
|
|
72
|
+
socket.addEventListener("close", closeHandler, { once: true });
|
|
73
|
+
return socket;
|
|
74
|
+
}
|
|
75
|
+
/** Initializes the internal event listeners for the socket. */
|
|
76
|
+
_setupEventListeners() {
|
|
77
|
+
this._socket.addEventListener("open", this._open, { once: true });
|
|
78
|
+
this._socket.addEventListener("close", this._close, { once: true });
|
|
79
|
+
}
|
|
80
|
+
_open = () => {
|
|
81
|
+
// Reset the attempt counter
|
|
82
|
+
this._attempt = 0;
|
|
83
|
+
// Send all buffered messages
|
|
84
|
+
for (const message of this.reconnectOptions.messageBuffer) {
|
|
85
|
+
this._socket.send(message);
|
|
194
86
|
}
|
|
195
|
-
|
|
196
|
-
|
|
87
|
+
};
|
|
88
|
+
_close = async (event) => {
|
|
89
|
+
try {
|
|
90
|
+
// If the event was triggered but the socket is not closing, ignore it
|
|
91
|
+
if (this._socket.readyState !== ReconnectingWebSocket.CLOSING &&
|
|
92
|
+
this._socket.readyState !== ReconnectingWebSocket.CLOSED)
|
|
93
|
+
return;
|
|
94
|
+
// If the instance is terminated, do not attempt to reconnect
|
|
95
|
+
if (this.reconnectAbortController.signal.aborted)
|
|
96
|
+
return;
|
|
97
|
+
// Check if reconnection should be attempted
|
|
98
|
+
if (++this._attempt > this.reconnectOptions.maxRetries) {
|
|
99
|
+
this._cleanup("RECONNECTION_LIMIT_REACHED");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const userDecision = await this.reconnectOptions.shouldReconnect(event, this.reconnectAbortController.signal);
|
|
103
|
+
if (this.reconnectAbortController.signal.aborted)
|
|
104
|
+
return;
|
|
105
|
+
if (!userDecision) {
|
|
106
|
+
this._cleanup("RECONNECTION_STOPPED_BY_USER");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Delay before reconnecting
|
|
110
|
+
const reconnectDelay = typeof this.reconnectOptions.connectionDelay === "number"
|
|
111
|
+
? this.reconnectOptions.connectionDelay
|
|
112
|
+
: await this.reconnectOptions.connectionDelay(this._attempt, this.reconnectAbortController.signal);
|
|
113
|
+
if (this.reconnectAbortController.signal.aborted)
|
|
114
|
+
return;
|
|
115
|
+
await delay(reconnectDelay, this.reconnectAbortController.signal);
|
|
116
|
+
// Create a new WebSocket instance
|
|
117
|
+
const { onclose, onerror, onmessage, onopen } = this._socket;
|
|
118
|
+
this._socket = this._createSocket(this._socket.url, this._protocols);
|
|
119
|
+
// Reconnect all listeners
|
|
120
|
+
this._setupEventListeners();
|
|
121
|
+
this._listeners.forEach(({ type, listenerProxy, options }) => {
|
|
122
|
+
this._socket.addEventListener(type, listenerProxy, options);
|
|
123
|
+
});
|
|
124
|
+
this._socket.onclose = onclose;
|
|
125
|
+
this._socket.onerror = onerror;
|
|
126
|
+
this._socket.onmessage = onmessage;
|
|
127
|
+
this._socket.onopen = onopen;
|
|
197
128
|
}
|
|
198
|
-
|
|
199
|
-
|
|
129
|
+
catch (error) {
|
|
130
|
+
this._cleanup("UNKNOWN_ERROR", error);
|
|
200
131
|
}
|
|
201
|
-
|
|
202
|
-
|
|
132
|
+
};
|
|
133
|
+
/** Clean up internal resources. */
|
|
134
|
+
_cleanup(code, cause) {
|
|
135
|
+
this.reconnectAbortController.abort(new ReconnectingWebSocketError(code, cause));
|
|
136
|
+
this._listeners = [];
|
|
137
|
+
this._socket.close();
|
|
138
|
+
}
|
|
139
|
+
// WebSocket property implementations
|
|
140
|
+
get url() {
|
|
141
|
+
return this._socket.url;
|
|
142
|
+
}
|
|
143
|
+
get readyState() {
|
|
144
|
+
return this._socket.readyState;
|
|
145
|
+
}
|
|
146
|
+
get bufferedAmount() {
|
|
147
|
+
return this._socket.bufferedAmount;
|
|
148
|
+
}
|
|
149
|
+
get extensions() {
|
|
150
|
+
return this._socket.extensions;
|
|
151
|
+
}
|
|
152
|
+
get protocol() {
|
|
153
|
+
return this._socket.protocol;
|
|
154
|
+
}
|
|
155
|
+
get binaryType() {
|
|
156
|
+
return this._socket.binaryType;
|
|
157
|
+
}
|
|
158
|
+
set binaryType(value) {
|
|
159
|
+
this._socket.binaryType = value;
|
|
160
|
+
}
|
|
161
|
+
CONNECTING = 0;
|
|
162
|
+
OPEN = 1;
|
|
163
|
+
CLOSING = 2;
|
|
164
|
+
CLOSED = 3;
|
|
165
|
+
static CONNECTING = 0;
|
|
166
|
+
static OPEN = 1;
|
|
167
|
+
static CLOSING = 2;
|
|
168
|
+
static CLOSED = 3;
|
|
169
|
+
get onclose() {
|
|
170
|
+
return this._socket.onclose;
|
|
171
|
+
}
|
|
172
|
+
set onclose(value) {
|
|
173
|
+
this._socket.onclose = value;
|
|
174
|
+
}
|
|
175
|
+
get onerror() {
|
|
176
|
+
return this._socket.onerror;
|
|
177
|
+
}
|
|
178
|
+
set onerror(value) {
|
|
179
|
+
this._socket.onerror = value;
|
|
180
|
+
}
|
|
181
|
+
get onmessage() {
|
|
182
|
+
return this._socket.onmessage;
|
|
183
|
+
}
|
|
184
|
+
set onmessage(value) {
|
|
185
|
+
this._socket.onmessage = value;
|
|
186
|
+
}
|
|
187
|
+
get onopen() {
|
|
188
|
+
return this._socket.onopen;
|
|
189
|
+
}
|
|
190
|
+
set onopen(value) {
|
|
191
|
+
this._socket.onopen = value;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @param permanently - If `true`, the connection will be permanently closed. Default is `true`.
|
|
195
|
+
*/
|
|
196
|
+
close(code, reason, permanently = true) {
|
|
197
|
+
this._socket.close(code, reason);
|
|
198
|
+
if (permanently)
|
|
199
|
+
this._cleanup("USER_INITIATED_CLOSE");
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* @param signal - `AbortSignal` to cancel sending a message if it was in the buffer.
|
|
203
|
+
* @note If the connection is not open, the data will be buffered and sent when the connection is established.
|
|
204
|
+
*/
|
|
205
|
+
send(data, signal) {
|
|
206
|
+
if (signal?.aborted)
|
|
207
|
+
return;
|
|
208
|
+
if (this._socket.readyState !== ReconnectingWebSocket.OPEN && !this.reconnectAbortController.signal.aborted) {
|
|
209
|
+
this.reconnectOptions.messageBuffer.push(data, signal);
|
|
203
210
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
*/
|
|
207
|
-
close(code, reason, permanently = true) {
|
|
208
|
-
this._socket.close(code, reason);
|
|
209
|
-
if (permanently)
|
|
210
|
-
this._cleanup("USER_INITIATED_CLOSE");
|
|
211
|
+
else {
|
|
212
|
+
this._socket.send(data);
|
|
211
213
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if (this._socket.readyState !== ReconnectingWebSocket.OPEN && !this.reconnectAbortController.signal.aborted) {
|
|
220
|
-
this.reconnectOptions.messageBuffer.push(data, signal);
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
this._socket.send(data);
|
|
224
|
-
}
|
|
214
|
+
}
|
|
215
|
+
addEventListener(type, listener, options) {
|
|
216
|
+
// Wrap the listener to handle reconnection
|
|
217
|
+
let listenerProxy;
|
|
218
|
+
if (this.reconnectAbortController.signal.aborted) {
|
|
219
|
+
// If the instance is terminated, use the original listener
|
|
220
|
+
listenerProxy = listener;
|
|
225
221
|
}
|
|
226
|
-
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
if (
|
|
230
|
-
//
|
|
231
|
-
listenerProxy =
|
|
222
|
+
else {
|
|
223
|
+
// Check if the listener is already registered
|
|
224
|
+
const index = this._listeners.findIndex((e) => listenersMatch(e, { type, listener, options }));
|
|
225
|
+
if (index !== -1) {
|
|
226
|
+
// Use the existing listener proxy
|
|
227
|
+
listenerProxy = this._listeners[index].listenerProxy;
|
|
232
228
|
}
|
|
233
229
|
else {
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
// Wrap the original listener to follow the once option when reconnecting
|
|
242
|
-
listenerProxy = (event) => {
|
|
243
|
-
try {
|
|
244
|
-
if (typeof listener === "function") {
|
|
245
|
-
listener.call(this, event);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
listener.handleEvent(event);
|
|
249
|
-
}
|
|
230
|
+
// Wrap the original listener to follow the once option when reconnecting
|
|
231
|
+
listenerProxy = (event) => {
|
|
232
|
+
try {
|
|
233
|
+
if (typeof listener === "function") {
|
|
234
|
+
listener.call(this, event);
|
|
250
235
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
236
|
+
else {
|
|
237
|
+
listener.handleEvent(event);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
// If the listener is marked as once, remove it after the first invocation
|
|
242
|
+
if (typeof options === "object" && options.once === true) {
|
|
243
|
+
const index = this._listeners.findIndex((e) => listenersMatch(e, { type, listener, options }));
|
|
244
|
+
if (index !== -1) {
|
|
245
|
+
this._listeners.splice(index, 1);
|
|
258
246
|
}
|
|
259
247
|
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
this._listeners.push({ type, listener, options, listenerProxy });
|
|
263
251
|
}
|
|
264
|
-
// Add the wrapped (or original) listener
|
|
265
|
-
this._socket.addEventListener(type, listenerProxy, options);
|
|
266
252
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
this._socket.removeEventListener(type, listener, options);
|
|
278
|
-
}
|
|
253
|
+
// Add the wrapped (or original) listener
|
|
254
|
+
this._socket.addEventListener(type, listenerProxy, options);
|
|
255
|
+
}
|
|
256
|
+
removeEventListener(type, listener, options) {
|
|
257
|
+
// Remove a wrapped listener, not an original listener
|
|
258
|
+
const index = this._listeners.findIndex((e) => listenersMatch(e, { type, listener, options }));
|
|
259
|
+
if (index !== -1) {
|
|
260
|
+
const { listenerProxy } = this._listeners[index];
|
|
261
|
+
this._socket.removeEventListener(type, listenerProxy, options);
|
|
262
|
+
this._listeners.splice(index, 1);
|
|
279
263
|
}
|
|
280
|
-
|
|
281
|
-
|
|
264
|
+
else {
|
|
265
|
+
// If the wrapped listener is not found, remove the original listener
|
|
266
|
+
this._socket.removeEventListener(type, listener, options);
|
|
282
267
|
}
|
|
283
268
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
function listenersMatch(a, b) {
|
|
287
|
-
// EventTarget only compares capture in options, even if one is an object and the other is boolean
|
|
288
|
-
const aCapture = Boolean(typeof a.options === "object" ? a.options.capture : a.options);
|
|
289
|
-
const bCapture = Boolean(typeof b.options === "object" ? b.options.capture : b.options);
|
|
290
|
-
return a.type === b.type && a.listener === b.listener && aCapture === bCapture;
|
|
269
|
+
dispatchEvent(event) {
|
|
270
|
+
return this._socket.dispatchEvent(event);
|
|
291
271
|
}
|
|
292
|
-
}
|
|
272
|
+
}
|
|
273
|
+
exports.ReconnectingWebSocket = ReconnectingWebSocket;
|
|
274
|
+
function listenersMatch(a, b) {
|
|
275
|
+
// EventTarget only compares capture in options, even if one is an object and the other is boolean
|
|
276
|
+
const aCapture = Boolean(typeof a.options === "object" ? a.options.capture : a.options);
|
|
277
|
+
const bCapture = Boolean(typeof b.options === "object" ? b.options.capture : b.options);
|
|
278
|
+
return a.type === b.type && a.listener === b.listener && aCapture === bCapture;
|
|
279
|
+
}
|
|
280
|
+
function delay(ms, signal) {
|
|
281
|
+
if (signal?.aborted)
|
|
282
|
+
return Promise.reject(signal.reason);
|
|
283
|
+
return new Promise((resolve, reject) => {
|
|
284
|
+
const onAbort = () => {
|
|
285
|
+
clearTimeout(timer);
|
|
286
|
+
reject(signal?.reason);
|
|
287
|
+
};
|
|
288
|
+
const onTimeout = () => {
|
|
289
|
+
signal?.removeEventListener("abort", onAbort);
|
|
290
|
+
resolve();
|
|
291
|
+
};
|
|
292
|
+
const timer = setTimeout(onTimeout, ms);
|
|
293
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
294
|
+
});
|
|
295
|
+
}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
import { TransportError } from "../base.js";
|
|
2
1
|
import type { ReconnectingWebSocket } from "./_reconnecting_websocket.js";
|
|
3
2
|
import type { HyperliquidEventTarget } from "./_hyperliquid_event_target.js";
|
|
4
|
-
/**
|
|
5
|
-
* Error thrown when a WebSocket request fails:
|
|
6
|
-
* - When the WebSocket connection is closed
|
|
7
|
-
* - When the server responds with an error message
|
|
8
|
-
*/
|
|
9
|
-
export declare class WebSocketRequestError extends TransportError {
|
|
10
|
-
constructor(message: string);
|
|
11
|
-
}
|
|
12
3
|
/**
|
|
13
4
|
* Manages WebSocket requests to the Hyperliquid API.
|
|
14
5
|
* Handles request creation, sending, and mapping responses to their corresponding requests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_websocket_async_request.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/websocket/_websocket_async_request.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"_websocket_async_request.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/websocket/_websocket_async_request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAkB7E;;;GAGG;AACH,qBAAa,qBAAqB;IAgBlB,SAAS,CAAC,MAAM,EAAE,qBAAqB;IAfnD,SAAS,CAAC,MAAM,EAAE,MAAM,CAAK;IAC7B,SAAS,CAAC,KAAK,EAAE;QACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAEpB,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;QAE/B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;KAClC,EAAE,CAAM;IACT,eAAe,EAAE,MAAM,CAAK;IAE5B;;;;OAIG;gBACmB,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,sBAAsB;IAiFrF;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5D,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IA6ClH,6DAA6D;IAC7D,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;CAK7C"}
|