@nktkas/hyperliquid 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +334 -107
- package/esm/deps/jsr.io/@std/bytes/1.0.5/_types.d.ts +9 -0
- package/esm/deps/jsr.io/@std/bytes/1.0.5/_types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/bytes/1.0.5/_types.js +2 -0
- package/esm/deps/jsr.io/@std/bytes/{1.0.4 → 1.0.5}/concat.d.ts +3 -1
- package/esm/deps/jsr.io/@std/bytes/1.0.5/concat.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/bytes/{1.0.4 → 1.0.5}/concat.js +1 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.7/_types.d.ts +9 -0
- package/esm/deps/jsr.io/@std/encoding/1.0.7/_types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/encoding/1.0.7/_types.js +2 -0
- package/esm/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/_validate_binary_like.d.ts.map +1 -1
- package/esm/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/_validate_binary_like.js +1 -1
- package/{script/deps/jsr.io/@std/encoding/1.0.6 → esm/deps/jsr.io/@std/encoding/1.0.7}/hex.d.ts +3 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.7/hex.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/hex.js +1 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +9 -0
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.js +2 -0
- package/esm/deps/jsr.io/@std/msgpack/{1.0.2 → 1.0.3}/encode.d.ts +3 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/msgpack/{1.0.2 → 1.0.3}/encode.js +2 -2
- package/esm/mod.d.ts +4 -12
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +2 -2
- package/{script/src/transports → esm/src}/base.d.ts +10 -13
- package/esm/src/base.d.ts.map +1 -0
- package/esm/src/base.js +14 -0
- package/esm/src/clients/event.d.ts +59 -18
- package/esm/src/clients/event.d.ts.map +1 -1
- package/esm/src/clients/event.js +74 -18
- package/esm/src/clients/public.d.ts +348 -53
- package/esm/src/clients/public.d.ts.map +1 -1
- package/esm/src/clients/public.js +349 -50
- package/esm/src/clients/wallet.d.ts +345 -73
- package/esm/src/clients/wallet.d.ts.map +1 -1
- package/esm/src/clients/wallet.js +979 -229
- package/esm/src/signing.d.ts +135 -0
- package/esm/src/signing.d.ts.map +1 -0
- package/esm/src/signing.js +188 -0
- package/esm/src/transports/http/http_transport.d.ts +1 -1
- package/esm/src/transports/http/http_transport.d.ts.map +1 -1
- package/esm/src/transports/http/http_transport.js +1 -1
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts +64 -0
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -0
- package/esm/src/transports/websocket/_hyperliquid_event_target.js +52 -0
- package/esm/src/transports/websocket/{reconnecting_websocket.d.ts → _reconnecting_websocket.d.ts} +26 -26
- package/esm/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -0
- package/esm/src/transports/websocket/{reconnecting_websocket.js → _reconnecting_websocket.js} +91 -76
- package/{script/src/transports/websocket/websocket_request_dispatcher.d.ts → esm/src/transports/websocket/_websocket_request_dispatcher.d.ts} +3 -7
- package/esm/src/transports/websocket/_websocket_request_dispatcher.d.ts.map +1 -0
- package/esm/src/transports/websocket/{websocket_request_dispatcher.js → _websocket_request_dispatcher.js} +6 -10
- package/esm/src/transports/websocket/websocket_transport.d.ts +15 -21
- package/esm/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/esm/src/transports/websocket/websocket_transport.js +55 -52
- package/esm/src/types/exchange/requests.d.ts +298 -79
- package/esm/src/types/exchange/requests.d.ts.map +1 -1
- package/esm/src/types/exchange/responses.d.ts +38 -38
- package/esm/src/types/exchange/responses.d.ts.map +1 -1
- package/esm/src/types/explorer/requests.d.ts +23 -10
- package/esm/src/types/explorer/requests.d.ts.map +1 -1
- package/esm/src/types/explorer/responses.d.ts +45 -3
- package/esm/src/types/explorer/responses.d.ts.map +1 -1
- package/esm/src/types/info/accounts.d.ts +279 -189
- package/esm/src/types/info/accounts.d.ts.map +1 -1
- package/esm/src/types/info/assets.d.ts +191 -185
- package/esm/src/types/info/assets.d.ts.map +1 -1
- package/esm/src/types/info/delegations.d.ts +117 -0
- package/esm/src/types/info/delegations.d.ts.map +1 -0
- package/esm/src/types/info/orders.d.ts +94 -94
- package/esm/src/types/info/orders.d.ts.map +1 -1
- package/esm/src/types/info/requests.d.ts +192 -64
- package/esm/src/types/info/requests.d.ts.map +1 -1
- package/esm/src/types/info/vaults.d.ts +42 -85
- package/esm/src/types/info/vaults.d.ts.map +1 -1
- package/esm/src/types/mod.d.ts +14 -0
- package/esm/src/types/mod.d.ts.map +1 -0
- package/esm/src/types/subscriptions/requests.d.ts +11 -1
- package/esm/src/types/subscriptions/requests.d.ts.map +1 -1
- package/{script/src/types/subscriptions/common.d.ts → esm/src/types/subscriptions/responses.d.ts} +18 -3
- package/esm/src/types/subscriptions/responses.d.ts.map +1 -0
- package/package.json +20 -4
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.js +13 -3
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.js +23 -13
- package/script/deps/jsr.io/@noble/hashes/1.7.1/src/_assert.js +55 -45
- package/script/deps/jsr.io/@noble/hashes/1.7.1/src/_u64.js +97 -87
- package/script/deps/jsr.io/@noble/hashes/1.7.1/src/crypto.js +14 -4
- package/script/deps/jsr.io/@noble/hashes/1.7.1/src/sha3.js +288 -278
- package/script/deps/jsr.io/@noble/hashes/1.7.1/src/utils.js +238 -228
- package/script/deps/jsr.io/@std/bytes/1.0.5/_types.d.ts +9 -0
- package/script/deps/jsr.io/@std/bytes/1.0.5/_types.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/bytes/1.0.5/_types.js +13 -0
- package/script/deps/jsr.io/@std/bytes/{1.0.4 → 1.0.5}/concat.d.ts +3 -1
- package/script/deps/jsr.io/@std/bytes/1.0.5/concat.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/bytes/1.0.5/concat.js +45 -0
- package/script/deps/jsr.io/@std/encoding/1.0.7/_types.d.ts +9 -0
- package/script/deps/jsr.io/@std/encoding/1.0.7/_types.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/encoding/1.0.7/_types.js +13 -0
- package/script/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/_validate_binary_like.d.ts.map +1 -1
- package/script/deps/jsr.io/@std/encoding/1.0.7/_validate_binary_like.js +39 -0
- package/{esm/deps/jsr.io/@std/encoding/1.0.6 → script/deps/jsr.io/@std/encoding/1.0.7}/hex.d.ts +3 -1
- package/script/deps/jsr.io/@std/encoding/1.0.7/hex.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/encoding/1.0.7/hex.js +123 -0
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +9 -0
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.js +13 -0
- package/script/deps/jsr.io/@std/msgpack/{1.0.2 → 1.0.3}/encode.d.ts +3 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.js +250 -0
- package/script/mod.d.ts +4 -12
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +21 -13
- package/{esm/src/transports → script/src}/base.d.ts +10 -13
- package/script/src/base.d.ts.map +1 -0
- package/script/src/base.js +29 -0
- package/script/src/clients/event.d.ts +59 -18
- package/script/src/clients/event.d.ts.map +1 -1
- package/script/src/clients/event.js +551 -485
- package/script/src/clients/public.d.ts +348 -53
- package/script/src/clients/public.d.ts.map +1 -1
- package/script/src/clients/public.js +1017 -708
- package/script/src/clients/wallet.d.ts +345 -73
- package/script/src/clients/wallet.d.ts.map +1 -1
- package/script/src/clients/wallet.js +1737 -977
- package/script/src/signing.d.ts +135 -0
- package/script/src/signing.d.ts.map +1 -0
- package/script/src/signing.js +203 -0
- package/script/src/transports/http/http_transport.d.ts +1 -1
- package/script/src/transports/http/http_transport.d.ts.map +1 -1
- package/script/src/transports/http/http_transport.js +174 -164
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts +64 -0
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -0
- package/script/src/transports/websocket/_hyperliquid_event_target.js +66 -0
- package/script/src/transports/websocket/{reconnecting_websocket.d.ts → _reconnecting_websocket.d.ts} +26 -26
- package/script/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -0
- package/script/src/transports/websocket/_reconnecting_websocket.js +400 -0
- package/{esm/src/transports/websocket/websocket_request_dispatcher.d.ts → script/src/transports/websocket/_websocket_request_dispatcher.d.ts} +3 -7
- package/script/src/transports/websocket/_websocket_request_dispatcher.d.ts.map +1 -0
- package/script/src/transports/websocket/_websocket_request_dispatcher.js +212 -0
- package/script/src/transports/websocket/websocket_transport.d.ts +15 -21
- package/script/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/script/src/transports/websocket/websocket_transport.js +235 -222
- package/script/src/types/exchange/requests.d.ts +298 -79
- package/script/src/types/exchange/requests.d.ts.map +1 -1
- package/script/src/types/exchange/requests.js +12 -2
- package/script/src/types/exchange/responses.d.ts +38 -38
- package/script/src/types/exchange/responses.d.ts.map +1 -1
- package/script/src/types/exchange/responses.js +12 -2
- package/script/src/types/explorer/requests.d.ts +23 -10
- package/script/src/types/explorer/requests.d.ts.map +1 -1
- package/script/src/types/explorer/requests.js +12 -2
- package/script/src/types/explorer/responses.d.ts +45 -3
- package/script/src/types/explorer/responses.d.ts.map +1 -1
- package/script/src/types/explorer/responses.js +12 -2
- package/script/src/types/info/accounts.d.ts +279 -189
- package/script/src/types/info/accounts.d.ts.map +1 -1
- package/script/src/types/info/accounts.js +12 -2
- package/script/src/types/info/assets.d.ts +191 -185
- package/script/src/types/info/assets.d.ts.map +1 -1
- package/script/src/types/info/assets.js +12 -2
- package/script/src/types/info/delegations.d.ts +117 -0
- package/script/src/types/info/delegations.d.ts.map +1 -0
- package/script/src/types/info/delegations.js +12 -0
- package/script/src/types/info/orders.d.ts +94 -94
- package/script/src/types/info/orders.d.ts.map +1 -1
- package/script/src/types/info/orders.js +12 -2
- package/script/src/types/info/requests.d.ts +192 -64
- package/script/src/types/info/requests.d.ts.map +1 -1
- package/script/src/types/info/requests.js +12 -2
- package/script/src/types/info/vaults.d.ts +42 -85
- package/script/src/types/info/vaults.d.ts.map +1 -1
- package/script/src/types/info/vaults.js +12 -2
- package/script/src/types/mod.d.ts +14 -0
- package/script/src/types/mod.d.ts.map +1 -0
- package/script/src/types/mod.js +12 -0
- package/script/src/types/subscriptions/requests.d.ts +11 -1
- package/script/src/types/subscriptions/requests.d.ts.map +1 -1
- package/script/src/types/subscriptions/requests.js +12 -2
- package/{esm/src/types/subscriptions/common.d.ts → script/src/types/subscriptions/responses.d.ts} +18 -3
- package/script/src/types/subscriptions/responses.d.ts.map +1 -0
- package/script/src/types/subscriptions/responses.js +12 -0
- package/esm/deps/jsr.io/@std/bytes/1.0.4/concat.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.6/hex.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.2/encode.d.ts.map +0 -1
- package/esm/src/transports/base.d.ts.map +0 -1
- package/esm/src/transports/base.js +0 -14
- package/esm/src/transports/websocket/hyperliquid_event_target.d.ts +0 -66
- package/esm/src/transports/websocket/hyperliquid_event_target.d.ts.map +0 -1
- package/esm/src/transports/websocket/hyperliquid_event_target.js +0 -33
- package/esm/src/transports/websocket/reconnecting_websocket.d.ts.map +0 -1
- package/esm/src/transports/websocket/websocket_request_dispatcher.d.ts.map +0 -1
- package/esm/src/types/common.d.ts +0 -3
- package/esm/src/types/common.d.ts.map +0 -1
- package/esm/src/types/exchange/common.d.ts +0 -36
- package/esm/src/types/exchange/common.d.ts.map +0 -1
- package/esm/src/types/explorer/common.d.ts +0 -37
- package/esm/src/types/explorer/common.d.ts.map +0 -1
- package/esm/src/types/subscriptions/common.d.ts.map +0 -1
- package/esm/src/types/subscriptions/common.js +0 -1
- package/esm/src/utils/key_sort.d.ts +0 -21
- package/esm/src/utils/key_sort.d.ts.map +0 -1
- package/esm/src/utils/key_sort.js +0 -124
- package/esm/src/utils/signing.d.ts +0 -109
- package/esm/src/utils/signing.d.ts.map +0 -1
- package/esm/src/utils/signing.js +0 -164
- package/script/deps/jsr.io/@std/bytes/1.0.4/concat.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/bytes/1.0.4/concat.js +0 -35
- package/script/deps/jsr.io/@std/encoding/1.0.6/_validate_binary_like.js +0 -29
- package/script/deps/jsr.io/@std/encoding/1.0.6/hex.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.6/hex.js +0 -113
- package/script/deps/jsr.io/@std/msgpack/1.0.2/encode.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.2/encode.js +0 -240
- package/script/src/transports/base.d.ts.map +0 -1
- package/script/src/transports/base.js +0 -18
- package/script/src/transports/websocket/hyperliquid_event_target.d.ts +0 -66
- package/script/src/transports/websocket/hyperliquid_event_target.d.ts.map +0 -1
- package/script/src/transports/websocket/hyperliquid_event_target.js +0 -37
- package/script/src/transports/websocket/reconnecting_websocket.d.ts.map +0 -1
- package/script/src/transports/websocket/reconnecting_websocket.js +0 -374
- package/script/src/transports/websocket/websocket_request_dispatcher.d.ts.map +0 -1
- package/script/src/transports/websocket/websocket_request_dispatcher.js +0 -206
- package/script/src/types/common.d.ts +0 -3
- package/script/src/types/common.d.ts.map +0 -1
- package/script/src/types/common.js +0 -2
- package/script/src/types/exchange/common.d.ts +0 -36
- package/script/src/types/exchange/common.d.ts.map +0 -1
- package/script/src/types/exchange/common.js +0 -2
- package/script/src/types/explorer/common.d.ts +0 -37
- package/script/src/types/explorer/common.d.ts.map +0 -1
- package/script/src/types/explorer/common.js +0 -2
- package/script/src/types/subscriptions/common.d.ts.map +0 -1
- package/script/src/types/subscriptions/common.js +0 -2
- package/script/src/utils/key_sort.d.ts +0 -21
- package/script/src/utils/key_sort.d.ts.map +0 -1
- package/script/src/utils/key_sort.js +0 -127
- package/script/src/utils/signing.d.ts +0 -109
- package/script/src/utils/signing.d.ts.map +0 -1
- package/script/src/utils/signing.js +0 -172
- /package/esm/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/_validate_binary_like.d.ts +0 -0
- /package/esm/src/types/{common.js → info/delegations.js} +0 -0
- /package/esm/src/types/{exchange/common.js → mod.js} +0 -0
- /package/esm/src/types/{explorer/common.js → subscriptions/responses.js} +0 -0
- /package/script/deps/jsr.io/@std/encoding/{1.0.6 → 1.0.7}/_validate_binary_like.d.ts +0 -0
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { ReconnectingWebSocket } from "./
|
|
2
|
-
import { HyperliquidEventTarget } from "./
|
|
3
|
-
import { WebSocketRequestDispatcher } from "./
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
1
|
+
import { ReconnectingWebSocket } from "./_reconnecting_websocket.js";
|
|
2
|
+
import { HyperliquidEventTarget } from "./_hyperliquid_event_target.js";
|
|
3
|
+
import { WebSocketRequestDispatcher, WebSocketRequestError } from "./_websocket_request_dispatcher.js";
|
|
4
|
+
export { WebSocketRequestError };
|
|
5
|
+
/** WebSocket implementation of the REST and Subscription transport interfaces. */
|
|
7
6
|
export class WebSocketTransport {
|
|
8
7
|
/**
|
|
9
8
|
* Creates a new WebSocket transport instance.
|
|
@@ -15,7 +14,7 @@ export class WebSocketTransport {
|
|
|
15
14
|
enumerable: true,
|
|
16
15
|
configurable: true,
|
|
17
16
|
writable: true,
|
|
18
|
-
value:
|
|
17
|
+
value: null
|
|
19
18
|
});
|
|
20
19
|
/** The WebSocket request dispatcher instance. */
|
|
21
20
|
Object.defineProperty(this, "_wsRequester", {
|
|
@@ -33,8 +32,9 @@ export class WebSocketTransport {
|
|
|
33
32
|
});
|
|
34
33
|
/**
|
|
35
34
|
* Map of active subscriptions.
|
|
36
|
-
* - Key: Unique subscription identifier
|
|
37
|
-
* - Value: Subscription info containing
|
|
35
|
+
* - Key: Unique subscription identifier based on payload
|
|
36
|
+
* - Value: Subscription info containing the subscription request promise
|
|
37
|
+
* and a map of listeners to their metadata (channel + unsubscribe function).
|
|
38
38
|
*/
|
|
39
39
|
Object.defineProperty(this, "_subscriptions", {
|
|
40
40
|
enumerable: true,
|
|
@@ -76,7 +76,7 @@ export class WebSocketTransport {
|
|
|
76
76
|
// Initialize listeners
|
|
77
77
|
this.socket.addEventListener("open", () => {
|
|
78
78
|
// Start keep-alive timer
|
|
79
|
-
if (this.keepAlive.interval &&
|
|
79
|
+
if (this.keepAlive.interval && this._keepAliveTimer === null) {
|
|
80
80
|
this._keepAliveTimer = setInterval(() => {
|
|
81
81
|
this.socket.send(JSON.stringify({ method: "ping" }));
|
|
82
82
|
}, this.keepAlive.interval);
|
|
@@ -84,17 +84,16 @@ export class WebSocketTransport {
|
|
|
84
84
|
});
|
|
85
85
|
this.socket.addEventListener("close", () => {
|
|
86
86
|
// Clear keep-alive timer
|
|
87
|
-
if (this._keepAliveTimer) {
|
|
87
|
+
if (this._keepAliveTimer !== null) {
|
|
88
88
|
clearInterval(this._keepAliveTimer);
|
|
89
|
-
this._keepAliveTimer =
|
|
89
|
+
this._keepAliveTimer = null;
|
|
90
90
|
}
|
|
91
91
|
// Clear all subscriptions
|
|
92
|
-
for (const
|
|
93
|
-
for (const [
|
|
94
|
-
|
|
92
|
+
for (const subscriptionInfo of this._subscriptions.values()) {
|
|
93
|
+
for (const [_, unsubscribe] of subscriptionInfo.listeners) {
|
|
94
|
+
unsubscribe();
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
this._subscriptions.clear();
|
|
98
97
|
});
|
|
99
98
|
}
|
|
100
99
|
/**
|
|
@@ -109,10 +108,11 @@ export class WebSocketTransport {
|
|
|
109
108
|
request(type, payload, signal) {
|
|
110
109
|
// Reject explorer requests because they are not supported by the Hyperliquid WebSocket API
|
|
111
110
|
if (type === "explorer") {
|
|
112
|
-
|
|
111
|
+
return Promise.reject(new WebSocketRequestError("Explorer requests are not supported in the Hyperliquid WebSocket API."));
|
|
113
112
|
}
|
|
114
113
|
// Send the request and wait for a response
|
|
115
|
-
|
|
114
|
+
const combinedSignal = this._combineTimeoutWithSignal(this.timeout, signal);
|
|
115
|
+
return this._wsRequester.request("post", { type, payload }, combinedSignal);
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* Subscribes to a Hyperliquid event channel.
|
|
@@ -124,44 +124,52 @@ export class WebSocketTransport {
|
|
|
124
124
|
*/
|
|
125
125
|
async subscribe(channel, payload, listener, signal) {
|
|
126
126
|
// Create a unique identifier for the subscription
|
|
127
|
-
const id =
|
|
127
|
+
const id = WebSocketRequestDispatcher.requestToId(payload);
|
|
128
128
|
// Initialize new subscription, if it doesn't exist
|
|
129
|
-
let
|
|
130
|
-
if (!
|
|
129
|
+
let subscription = this._subscriptions.get(id);
|
|
130
|
+
if (!subscription) {
|
|
131
131
|
// Send subscription request
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
this._subscriptions.delete(id);
|
|
135
|
-
throw error;
|
|
136
|
-
});
|
|
132
|
+
const combinedSignal = this._combineTimeoutWithSignal(this.timeout, signal);
|
|
133
|
+
const requestPromise = this._wsRequester.request("subscribe", payload, combinedSignal);
|
|
137
134
|
// Cache subscription info
|
|
138
|
-
|
|
139
|
-
this._subscriptions.set(id,
|
|
135
|
+
subscription = { listeners: new Map(), requestPromise };
|
|
136
|
+
this._subscriptions.set(id, subscription);
|
|
140
137
|
}
|
|
141
|
-
//
|
|
142
|
-
let unsubscribe =
|
|
138
|
+
// Initialize new listener, if it doesn't exist
|
|
139
|
+
let unsubscribe = subscription.listeners.get(listener);
|
|
143
140
|
if (!unsubscribe) {
|
|
144
|
-
// Create new unsubscribe function
|
|
141
|
+
// Create new unsubscribe function
|
|
145
142
|
unsubscribe = async (signal) => {
|
|
146
143
|
// Remove listener and cleanup
|
|
147
144
|
this._hlEvents.removeEventListener(channel, listener);
|
|
148
|
-
const
|
|
145
|
+
const subscription = this._subscriptions.get(id);
|
|
146
|
+
subscription?.listeners.delete(listener);
|
|
149
147
|
// If no listeners remain, remove subscription entirely
|
|
150
|
-
|
|
151
|
-
|
|
148
|
+
if (subscription?.listeners.size === 0) {
|
|
149
|
+
// Cleanup subscription
|
|
152
150
|
this._subscriptions.delete(id);
|
|
153
|
-
|
|
151
|
+
// If the socket is open, send unsubscription request
|
|
152
|
+
if (this.socket.readyState === WebSocket.OPEN) {
|
|
153
|
+
const combinedSignal = this._combineTimeoutWithSignal(this.timeout, signal);
|
|
154
|
+
await this._wsRequester.request("unsubscribe", payload, combinedSignal);
|
|
155
|
+
}
|
|
154
156
|
}
|
|
155
157
|
};
|
|
156
|
-
// Add
|
|
158
|
+
// Add listener and cache unsubscribe function
|
|
157
159
|
this._hlEvents.addEventListener(channel, listener);
|
|
158
|
-
|
|
160
|
+
subscription.listeners.set(listener, unsubscribe);
|
|
159
161
|
}
|
|
160
162
|
// Wait for the initial subscription request to complete
|
|
161
|
-
await
|
|
162
|
-
//
|
|
163
|
+
await subscription.requestPromise.catch((error) => {
|
|
164
|
+
// Remove listener and cleanup
|
|
163
165
|
this._hlEvents.removeEventListener(channel, listener);
|
|
164
|
-
|
|
166
|
+
const subscription = this._subscriptions.get(id);
|
|
167
|
+
subscription?.listeners.delete(listener);
|
|
168
|
+
// If no listeners remain, remove subscription entirely
|
|
169
|
+
if (subscription?.listeners.size === 0) {
|
|
170
|
+
this._subscriptions.delete(id);
|
|
171
|
+
}
|
|
172
|
+
// Rethrow the error
|
|
165
173
|
throw error;
|
|
166
174
|
});
|
|
167
175
|
// Return subscription control object
|
|
@@ -217,17 +225,12 @@ export class WebSocketTransport {
|
|
|
217
225
|
this.socket.close();
|
|
218
226
|
});
|
|
219
227
|
}
|
|
220
|
-
/**
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
if (this.timeout)
|
|
228
|
-
signals.push(AbortSignal.timeout(this.timeout));
|
|
229
|
-
if (signal)
|
|
230
|
-
signals.push(signal);
|
|
231
|
-
return signals.length > 1 ? AbortSignal.any(signals) : signals[0];
|
|
228
|
+
/** Combines a timeout with an optional abort signal. */
|
|
229
|
+
_combineTimeoutWithSignal(timeout, signal) {
|
|
230
|
+
if (typeof timeout !== "number")
|
|
231
|
+
return signal;
|
|
232
|
+
if (!(signal instanceof AbortSignal))
|
|
233
|
+
return AbortSignal.timeout(timeout);
|
|
234
|
+
return AbortSignal.any([AbortSignal.timeout(timeout), signal]);
|
|
232
235
|
}
|
|
233
236
|
}
|