@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,192 +1,175 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketAsyncRequest = void 0;
|
|
4
|
+
const websocket_transport_js_1 = require("./websocket_transport.js");
|
|
5
|
+
/**
|
|
6
|
+
* Manages WebSocket requests to the Hyperliquid API.
|
|
7
|
+
* Handles request creation, sending, and mapping responses to their corresponding requests.
|
|
8
|
+
*/
|
|
9
|
+
class WebSocketAsyncRequest {
|
|
10
|
+
socket;
|
|
11
|
+
lastId = 0;
|
|
12
|
+
queue = [];
|
|
13
|
+
lastRequestTime = 0;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* -
|
|
15
|
+
* Creates a new WebSocket async request handler.
|
|
16
|
+
* @param socket - WebSocket connection instance for sending requests to the Hyperliquid WebSocket API
|
|
17
|
+
* @param hlEvents - Used to recognize Hyperliquid responses and match them with sent requests
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
this.queue.findLast((item) => item.id === event.detail.id)?.resolve(data);
|
|
53
|
-
});
|
|
54
|
-
hlEvents.addEventListener("pong", () => {
|
|
55
|
-
this.queue.findLast((item) => item.id === "ping")?.resolve();
|
|
56
|
-
});
|
|
57
|
-
hlEvents.addEventListener("error", (event) => {
|
|
58
|
-
try {
|
|
59
|
-
// Error event doesn't have an id, use original request to match
|
|
60
|
-
const request = event.detail.match(/{.*}/)?.[0];
|
|
61
|
-
if (!request)
|
|
62
|
-
return;
|
|
63
|
-
const parsedRequest = JSON.parse(request);
|
|
64
|
-
// For `post` requests
|
|
65
|
-
if ("id" in parsedRequest && typeof parsedRequest.id === "number") {
|
|
66
|
-
this.queue.findLast((item) => item.id === parsedRequest.id)?.reject(new WebSocketRequestError(`Cannot complete WebSocket request: ${event.detail}`));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
// For `subscribe` and `unsubscribe` requests
|
|
70
|
-
if ("subscription" in parsedRequest &&
|
|
71
|
-
typeof parsedRequest.subscription === "object" && parsedRequest.subscription !== null) {
|
|
72
|
-
const id = WebSocketAsyncRequest.requestToId(parsedRequest);
|
|
73
|
-
this.queue.findLast((item) => item.id === id)?.reject(new WebSocketRequestError(`Cannot complete WebSocket request: ${event.detail}`));
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
// For already/invalid subscribed requests
|
|
77
|
-
if (event.detail.startsWith("Already subscribed") || event.detail.startsWith("Invalid subscription")) {
|
|
78
|
-
const id = WebSocketAsyncRequest.requestToId({
|
|
79
|
-
method: "subscribe",
|
|
80
|
-
subscription: parsedRequest,
|
|
81
|
-
});
|
|
82
|
-
this.queue.findLast((item) => item.id === id)?.reject(new WebSocketRequestError(`Cannot complete WebSocket request: ${event.detail}`));
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
// For already unsubscribed requests
|
|
86
|
-
if (event.detail.startsWith("Already unsubscribed")) {
|
|
87
|
-
const id = WebSocketAsyncRequest.requestToId({
|
|
88
|
-
method: "unsubscribe",
|
|
89
|
-
subscription: parsedRequest,
|
|
90
|
-
});
|
|
91
|
-
this.queue.findLast((item) => item.id === id)?.reject(new WebSocketRequestError(`Cannot complete WebSocket request: ${event.detail}`));
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
// For unknown requests
|
|
19
|
+
constructor(socket, hlEvents) {
|
|
20
|
+
this.socket = socket;
|
|
21
|
+
// Monitor responses and match the pending request
|
|
22
|
+
hlEvents.addEventListener("subscriptionResponse", (event) => {
|
|
23
|
+
// Use a stringified request as an id
|
|
24
|
+
const id = WebSocketAsyncRequest.requestToId(event.detail);
|
|
25
|
+
this.queue.findLast((item) => item.id === id)?.resolve(event.detail);
|
|
26
|
+
});
|
|
27
|
+
hlEvents.addEventListener("post", (event) => {
|
|
28
|
+
const data = event.detail.response.type === "info"
|
|
29
|
+
? event.detail.response.payload.data
|
|
30
|
+
: event.detail.response.payload;
|
|
31
|
+
this.queue.findLast((item) => item.id === event.detail.id)?.resolve(data);
|
|
32
|
+
});
|
|
33
|
+
hlEvents.addEventListener("pong", () => {
|
|
34
|
+
this.queue.findLast((item) => item.id === "ping")?.resolve();
|
|
35
|
+
});
|
|
36
|
+
hlEvents.addEventListener("error", (event) => {
|
|
37
|
+
try {
|
|
38
|
+
// Error event doesn't have an id, use original request to match
|
|
39
|
+
const request = event.detail.match(/{.*}/)?.[0];
|
|
40
|
+
if (!request)
|
|
41
|
+
return;
|
|
42
|
+
const parsedRequest = JSON.parse(request);
|
|
43
|
+
// For `post` requests
|
|
44
|
+
if ("id" in parsedRequest && typeof parsedRequest.id === "number") {
|
|
45
|
+
this.queue.findLast((item) => item.id === parsedRequest.id)
|
|
46
|
+
?.reject(new websocket_transport_js_1.WebSocketRequestError(`Server error: ${event.detail}`, { cause: event.detail }));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// For `subscribe` and `unsubscribe` requests
|
|
50
|
+
if ("subscription" in parsedRequest &&
|
|
51
|
+
typeof parsedRequest.subscription === "object" && parsedRequest.subscription !== null) {
|
|
95
52
|
const id = WebSocketAsyncRequest.requestToId(parsedRequest);
|
|
96
|
-
this.queue.findLast((item) => item.id === id)
|
|
53
|
+
this.queue.findLast((item) => item.id === id)
|
|
54
|
+
?.reject(new websocket_transport_js_1.WebSocketRequestError(`Server error: ${event.detail}`, { cause: event.detail }));
|
|
55
|
+
return;
|
|
97
56
|
}
|
|
98
|
-
|
|
99
|
-
|
|
57
|
+
// For `Already subscribed` and `Invalid subscription` requests
|
|
58
|
+
if (event.detail.startsWith("Already subscribed") || event.detail.startsWith("Invalid subscription")) {
|
|
59
|
+
const id = WebSocketAsyncRequest.requestToId({
|
|
60
|
+
method: "subscribe",
|
|
61
|
+
subscription: parsedRequest,
|
|
62
|
+
});
|
|
63
|
+
this.queue.findLast((item) => item.id === id)
|
|
64
|
+
?.reject(new websocket_transport_js_1.WebSocketRequestError(`Server error: ${event.detail}`, { cause: event.detail }));
|
|
65
|
+
return;
|
|
100
66
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return Promise.reject(signal.reason);
|
|
116
|
-
// Create a request
|
|
117
|
-
let id;
|
|
118
|
-
let request;
|
|
119
|
-
if (method === "post") {
|
|
120
|
-
id = ++this.lastId;
|
|
121
|
-
request = { method, id, request: payload };
|
|
122
|
-
}
|
|
123
|
-
else if (method === "ping") {
|
|
124
|
-
id = "ping";
|
|
125
|
-
request = { method };
|
|
67
|
+
// For `Already unsubscribed` requests
|
|
68
|
+
if (event.detail.startsWith("Already unsubscribed")) {
|
|
69
|
+
const id = WebSocketAsyncRequest.requestToId({
|
|
70
|
+
method: "unsubscribe",
|
|
71
|
+
subscription: parsedRequest,
|
|
72
|
+
});
|
|
73
|
+
this.queue.findLast((item) => item.id === id)
|
|
74
|
+
?.reject(new websocket_transport_js_1.WebSocketRequestError(`Server error: ${event.detail}`, { cause: event.detail }));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// For unknown requests
|
|
78
|
+
const id = WebSocketAsyncRequest.requestToId(parsedRequest);
|
|
79
|
+
this.queue.findLast((item) => item.id === id)
|
|
80
|
+
?.reject(new websocket_transport_js_1.WebSocketRequestError(`Server error: ${event.detail}`, { cause: event.detail }));
|
|
126
81
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
id = WebSocketAsyncRequest.requestToId(request);
|
|
82
|
+
catch {
|
|
83
|
+
// Ignore JSON parsing errors
|
|
130
84
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.queue.push({ id, resolve, reject });
|
|
137
|
-
const onAbort = () => reject(signal?.reason);
|
|
138
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
139
|
-
return await promise.finally(() => {
|
|
140
|
-
const index = this.queue.findLastIndex((item) => item.id === id);
|
|
141
|
-
if (index !== -1)
|
|
142
|
-
this.queue.splice(index, 1);
|
|
143
|
-
signal?.removeEventListener("abort", onAbort);
|
|
85
|
+
});
|
|
86
|
+
// Throws all pending requests if the connection is dropped
|
|
87
|
+
socket.addEventListener("close", () => {
|
|
88
|
+
this.queue.forEach(({ reject }) => {
|
|
89
|
+
reject(new websocket_transport_js_1.WebSocketRequestError("WebSocket connection closed."));
|
|
144
90
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
static requestToId(value) {
|
|
148
|
-
const lowerHex = containsUppercaseHex(value) ? deepLowerHex(value) : value;
|
|
149
|
-
const sorted = deepSortKeys(lowerHex);
|
|
150
|
-
return JSON.stringify(sorted); // Also removes undefined
|
|
151
|
-
}
|
|
91
|
+
this.queue = [];
|
|
92
|
+
});
|
|
152
93
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if
|
|
157
|
-
|
|
94
|
+
async request(method, payload_or_signal, maybeSignal) {
|
|
95
|
+
const payload = payload_or_signal instanceof AbortSignal ? undefined : payload_or_signal;
|
|
96
|
+
const signal = payload_or_signal instanceof AbortSignal ? payload_or_signal : maybeSignal;
|
|
97
|
+
// Reject the request if the signal is aborted
|
|
98
|
+
if (signal?.aborted)
|
|
99
|
+
return Promise.reject(signal.reason);
|
|
100
|
+
// Create a request
|
|
101
|
+
let id;
|
|
102
|
+
let request;
|
|
103
|
+
if (method === "post") {
|
|
104
|
+
id = ++this.lastId;
|
|
105
|
+
request = { method, id, request: payload };
|
|
158
106
|
}
|
|
159
|
-
if (
|
|
160
|
-
|
|
107
|
+
else if (method === "ping") {
|
|
108
|
+
id = "ping";
|
|
109
|
+
request = { method };
|
|
161
110
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
for (const [key, value] of entries) {
|
|
166
|
-
result[key] = deepLowerHex(value);
|
|
167
|
-
}
|
|
168
|
-
return result;
|
|
111
|
+
else {
|
|
112
|
+
request = { method, subscription: payload };
|
|
113
|
+
id = WebSocketAsyncRequest.requestToId(request);
|
|
169
114
|
}
|
|
170
|
-
|
|
115
|
+
// Send the request
|
|
116
|
+
this.socket.send(JSON.stringify(request), signal);
|
|
117
|
+
this.lastRequestTime = Date.now();
|
|
118
|
+
// Wait for a response
|
|
119
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
120
|
+
this.queue.push({ id, resolve, reject });
|
|
121
|
+
const onAbort = () => reject(signal?.reason);
|
|
122
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
123
|
+
return await promise.finally(() => {
|
|
124
|
+
const index = this.queue.findLastIndex((item) => item.id === id);
|
|
125
|
+
if (index !== -1)
|
|
126
|
+
this.queue.splice(index, 1);
|
|
127
|
+
signal?.removeEventListener("abort", onAbort);
|
|
128
|
+
});
|
|
171
129
|
}
|
|
172
|
-
/**
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
130
|
+
/** Normalizes an object and then converts it to a string. */
|
|
131
|
+
static requestToId(value) {
|
|
132
|
+
const lowerHex = containsUppercaseHex(value) ? deepLowerHex(value) : value;
|
|
133
|
+
const sorted = deepSortKeys(lowerHex);
|
|
134
|
+
return JSON.stringify(sorted); // Also removes undefined
|
|
176
135
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
136
|
+
}
|
|
137
|
+
exports.WebSocketAsyncRequest = WebSocketAsyncRequest;
|
|
138
|
+
/** Deeply converts hexadecimal strings in an object/array to lowercase. */
|
|
139
|
+
function deepLowerHex(obj) {
|
|
140
|
+
if (typeof obj === "string") {
|
|
141
|
+
return /^(0X[0-9a-fA-F]*|0x[0-9a-fA-F]*[A-F][0-9a-fA-F]*)$/.test(obj) ? obj.toLowerCase() : obj;
|
|
142
|
+
}
|
|
143
|
+
if (Array.isArray(obj)) {
|
|
144
|
+
return obj.map(deepLowerHex);
|
|
145
|
+
}
|
|
146
|
+
if (typeof obj === "object" && obj !== null) {
|
|
185
147
|
const result = {};
|
|
186
|
-
const
|
|
187
|
-
for (const key of
|
|
188
|
-
result[key] =
|
|
148
|
+
const entries = Object.entries(obj);
|
|
149
|
+
for (const [key, value] of entries) {
|
|
150
|
+
result[key] = deepLowerHex(value);
|
|
189
151
|
}
|
|
190
152
|
return result;
|
|
191
153
|
}
|
|
192
|
-
|
|
154
|
+
return obj;
|
|
155
|
+
}
|
|
156
|
+
/** Check if an object contains uppercase hexadecimal strings. */
|
|
157
|
+
function containsUppercaseHex(obj) {
|
|
158
|
+
const str = JSON.stringify(obj);
|
|
159
|
+
return /0X[0-9a-fA-F]*|0x[0-9a-fA-F]*[A-F][0-9a-fA-F]*/.test(str);
|
|
160
|
+
}
|
|
161
|
+
/** Deeply sort the keys of an object. */
|
|
162
|
+
function deepSortKeys(obj) {
|
|
163
|
+
if (typeof obj !== "object" || obj === null) {
|
|
164
|
+
return obj;
|
|
165
|
+
}
|
|
166
|
+
if (Array.isArray(obj)) {
|
|
167
|
+
return obj.map(deepSortKeys);
|
|
168
|
+
}
|
|
169
|
+
const result = {};
|
|
170
|
+
const keys = Object.keys(obj).sort();
|
|
171
|
+
for (const key of keys) {
|
|
172
|
+
result[key] = deepSortKeys(obj[key]);
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { type IRequestTransport, type ISubscriptionTransport, type Subscription, TransportError } from "../base.js";
|
|
1
2
|
import { type MessageBufferStrategy, ReconnectingWebSocket, ReconnectingWebSocketError, type ReconnectingWebSocketOptions } from "./_reconnecting_websocket.js";
|
|
2
3
|
import { HyperliquidEventTarget } from "./_hyperliquid_event_target.js";
|
|
3
|
-
import { WebSocketAsyncRequest
|
|
4
|
-
import type { IRequestTransport, ISubscriptionTransport, Subscription } from "../base.js";
|
|
5
|
-
export { WebSocketRequestError };
|
|
4
|
+
import { WebSocketAsyncRequest } from "./_websocket_async_request.js";
|
|
6
5
|
export { type MessageBufferStrategy, ReconnectingWebSocketError, type ReconnectingWebSocketOptions };
|
|
7
6
|
/** Configuration options for the WebSocket transport layer. */
|
|
8
7
|
export interface WebSocketTransportOptions {
|
|
@@ -46,6 +45,10 @@ export interface WebSocketTransportOptions {
|
|
|
46
45
|
*/
|
|
47
46
|
autoResubscribe?: boolean;
|
|
48
47
|
}
|
|
48
|
+
/** Error thrown when a WebSocket request fails. */
|
|
49
|
+
export declare class WebSocketRequestError extends TransportError {
|
|
50
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
51
|
+
}
|
|
49
52
|
/** WebSocket implementation of the REST and Subscription transport interfaces. */
|
|
50
53
|
export declare class WebSocketTransport implements IRequestTransport, ISubscriptionTransport, AsyncDisposable {
|
|
51
54
|
protected _wsRequester: WebSocketAsyncRequest;
|
|
@@ -95,18 +98,19 @@ export declare class WebSocketTransport implements IRequestTransport, ISubscript
|
|
|
95
98
|
* @param payload - The payload to send with the request.
|
|
96
99
|
* @param signal - An optional abort signal.
|
|
97
100
|
* @returns A promise that resolves with parsed JSON response body.
|
|
101
|
+
*
|
|
98
102
|
* @throws {WebSocketRequestError} - An error that occurs when a WebSocket request fails.
|
|
99
103
|
*/
|
|
100
104
|
request<T>(type: "info" | "exchange" | "explorer", payload: unknown, signal?: AbortSignal): Promise<T>;
|
|
101
105
|
/**
|
|
102
106
|
* Subscribes to a Hyperliquid event channel.
|
|
103
|
-
*
|
|
104
107
|
* Sends a subscription request to the server and listens for events.
|
|
105
108
|
*
|
|
106
109
|
* @param channel - The event channel to listen to.
|
|
107
110
|
* @param payload - A payload to send with the subscription request.
|
|
108
111
|
* @param listener - A function to call when the event is dispatched.
|
|
109
112
|
* @returns A promise that resolves with a {@link Subscription} object to manage the subscription lifecycle.
|
|
113
|
+
*
|
|
110
114
|
* @throws {WebSocketRequestError} - An error that occurs when a WebSocket request fails.
|
|
111
115
|
*/
|
|
112
116
|
subscribe<T>(channel: string, payload: unknown, listener: (data: CustomEvent<T>) => void): Promise<Subscription>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket_transport.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/websocket/websocket_transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,4BAA4B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"websocket_transport.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/websocket/websocket_transport.ts"],"names":[],"mappings":"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"}
|