@nktkas/hyperliquid 0.29.0 → 0.29.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/esm/src/transport/websocket/_subscriptionManager.d.ts +2 -2
- package/esm/src/transport/websocket/_subscriptionManager.d.ts.map +1 -1
- package/esm/src/transport/websocket/_subscriptionManager.js +13 -12
- package/esm/src/transport/websocket/_subscriptionManager.js.map +1 -1
- package/package.json +1 -1
- package/script/src/transport/websocket/_subscriptionManager.d.ts +2 -2
- package/script/src/transport/websocket/_subscriptionManager.d.ts.map +1 -1
- package/script/src/transport/websocket/_subscriptionManager.js +13 -12
- package/script/src/transport/websocket/_subscriptionManager.js.map +1 -1
- package/src/src/transport/websocket/_subscriptionManager.ts +13 -11
|
@@ -50,8 +50,8 @@ export declare class WebSocketSubscriptionManager {
|
|
|
50
50
|
protected _handleClose(): void;
|
|
51
51
|
/** Checks if a payload contains a user parameter. */
|
|
52
52
|
protected _hasUserParam(payload: unknown): boolean;
|
|
53
|
-
/** Counts the number of
|
|
54
|
-
protected
|
|
53
|
+
/** Counts the number of unique users across all active subscriptions. */
|
|
54
|
+
protected _countUniqueUserSubscriptions(): number;
|
|
55
55
|
}
|
|
56
56
|
export {};
|
|
57
57
|
//# sourceMappingURL=_subscriptionManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscriptionManager.d.ts","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAyB,MAAM,mBAAmB,CAAC;AAQjF,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,2JAA2J;IAC3J,aAAa,EAAE,WAAW,CAAC;CAC5B;AAED,kDAAkD;AAClD,UAAU,iBAAiB;IACzB,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,iBAAiB,EAAE,eAAe,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IAErB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACzC,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC9C,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC5C,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;gBAGnE,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,OAAO;IAiBtB;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,CAAC,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GACvC,OAAO,CAAC,qBAAqB,CAAC;IAuEjC,gFAAgF;IAChF,SAAS,CAAC,WAAW,IAAI,IAAI;IAc7B,gFAAgF;IAChF,SAAS,CAAC,YAAY,IAAI,IAAI;IAc9B,qDAAqD;IACrD,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIlD,
|
|
1
|
+
{"version":3,"file":"_subscriptionManager.d.ts","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAyB,MAAM,mBAAmB,CAAC;AAQjF,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,2JAA2J;IAC3J,aAAa,EAAE,WAAW,CAAC;CAC5B;AAED,kDAAkD;AAClD,UAAU,iBAAiB;IACzB,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,iBAAiB,EAAE,eAAe,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IAErB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACzC,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC9C,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC5C,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;gBAGnE,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,OAAO;IAiBtB;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,CAAC,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GACvC,OAAO,CAAC,qBAAqB,CAAC;IAuEjC,gFAAgF;IAChF,SAAS,CAAC,WAAW,IAAI,IAAI;IAc7B,gFAAgF;IAChF,SAAS,CAAC,YAAY,IAAI,IAAI;IAc9B,qDAAqD;IACrD,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIlD,yEAAyE;IACzE,SAAS,CAAC,6BAA6B,IAAI,MAAM;CAclD"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { WebSocketAsyncRequest, WebSocketRequestError } from "./_postRequest.js";
|
|
2
2
|
/** Maximum number of subscriptions allowed by Hyperliquid. */
|
|
3
3
|
const MAX_SUBSCRIPTIONS = 1000;
|
|
4
|
-
/** Maximum number of
|
|
5
|
-
const
|
|
4
|
+
/** Maximum number of unique user subscriptions allowed by Hyperliquid. */
|
|
5
|
+
const MAX_UNIQUE_USER_SUBSCRIPTIONS = 10;
|
|
6
6
|
/**
|
|
7
7
|
* Manages WebSocket subscriptions to Hyperliquid event channels.
|
|
8
8
|
* Handles subscription lifecycle, resubscription on reconnect, and cleanup.
|
|
@@ -45,13 +45,13 @@ export class WebSocketSubscriptionManager {
|
|
|
45
45
|
// Initialize new subscription, if it doesn't exist
|
|
46
46
|
let subscription = this._subscriptions.get(id);
|
|
47
47
|
if (!subscription) {
|
|
48
|
-
// Check
|
|
48
|
+
// Check unique subscription limits
|
|
49
49
|
if (this._subscriptions.size >= MAX_SUBSCRIPTIONS) {
|
|
50
50
|
throw new WebSocketRequestError("Cannot subscribe to more than 1000 channels.");
|
|
51
51
|
}
|
|
52
|
-
// Check user subscription limits
|
|
53
|
-
if (this._hasUserParam(payload) && this.
|
|
54
|
-
throw new WebSocketRequestError("Cannot track more than 10
|
|
52
|
+
// Check unique user subscription limits
|
|
53
|
+
if (this._hasUserParam(payload) && this._countUniqueUserSubscriptions() >= MAX_UNIQUE_USER_SUBSCRIPTIONS) {
|
|
54
|
+
throw new WebSocketRequestError("Cannot track more than 10 unique users.");
|
|
55
55
|
}
|
|
56
56
|
// Send subscription request
|
|
57
57
|
const promise = this._wsRequester.request("subscribe", payload)
|
|
@@ -130,20 +130,21 @@ export class WebSocketSubscriptionManager {
|
|
|
130
130
|
_hasUserParam(payload) {
|
|
131
131
|
return typeof payload === "object" && payload !== null && "user" in payload;
|
|
132
132
|
}
|
|
133
|
-
/** Counts the number of
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
/** Counts the number of unique users across all active subscriptions. */
|
|
134
|
+
_countUniqueUserSubscriptions() {
|
|
135
|
+
const users = new Set();
|
|
136
136
|
for (const id of this._subscriptions.keys()) {
|
|
137
137
|
try {
|
|
138
138
|
const payload = JSON.parse(id);
|
|
139
|
-
if (this._hasUserParam(payload))
|
|
140
|
-
|
|
139
|
+
if (this._hasUserParam(payload)) {
|
|
140
|
+
users.add(payload.user);
|
|
141
|
+
}
|
|
141
142
|
}
|
|
142
143
|
catch {
|
|
143
144
|
// Ignore parsing errors
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
|
-
return
|
|
147
|
+
return users.size;
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
//# sourceMappingURL=_subscriptionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscriptionManager.js","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,
|
|
1
|
+
{"version":3,"file":"_subscriptionManager.js","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -50,8 +50,8 @@ export declare class WebSocketSubscriptionManager {
|
|
|
50
50
|
protected _handleClose(): void;
|
|
51
51
|
/** Checks if a payload contains a user parameter. */
|
|
52
52
|
protected _hasUserParam(payload: unknown): boolean;
|
|
53
|
-
/** Counts the number of
|
|
54
|
-
protected
|
|
53
|
+
/** Counts the number of unique users across all active subscriptions. */
|
|
54
|
+
protected _countUniqueUserSubscriptions(): number;
|
|
55
55
|
}
|
|
56
56
|
export {};
|
|
57
57
|
//# sourceMappingURL=_subscriptionManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscriptionManager.d.ts","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAyB,MAAM,mBAAmB,CAAC;AAQjF,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,2JAA2J;IAC3J,aAAa,EAAE,WAAW,CAAC;CAC5B;AAED,kDAAkD;AAClD,UAAU,iBAAiB;IACzB,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,iBAAiB,EAAE,eAAe,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IAErB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACzC,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC9C,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC5C,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;gBAGnE,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,OAAO;IAiBtB;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,CAAC,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GACvC,OAAO,CAAC,qBAAqB,CAAC;IAuEjC,gFAAgF;IAChF,SAAS,CAAC,WAAW,IAAI,IAAI;IAc7B,gFAAgF;IAChF,SAAS,CAAC,YAAY,IAAI,IAAI;IAc9B,qDAAqD;IACrD,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIlD,
|
|
1
|
+
{"version":3,"file":"_subscriptionManager.d.ts","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAyB,MAAM,mBAAmB,CAAC;AAQjF,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,2JAA2J;IAC3J,aAAa,EAAE,WAAW,CAAC;CAC5B;AAED,kDAAkD;AAClD,UAAU,iBAAiB;IACzB,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,iBAAiB,EAAE,eAAe,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IAErB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACzC,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC9C,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC5C,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;gBAGnE,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,OAAO;IAiBtB;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,CAAC,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GACvC,OAAO,CAAC,qBAAqB,CAAC;IAuEjC,gFAAgF;IAChF,SAAS,CAAC,WAAW,IAAI,IAAI;IAc7B,gFAAgF;IAChF,SAAS,CAAC,YAAY,IAAI,IAAI;IAc9B,qDAAqD;IACrD,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIlD,yEAAyE;IACzE,SAAS,CAAC,6BAA6B,IAAI,MAAM;CAclD"}
|
|
@@ -4,8 +4,8 @@ exports.WebSocketSubscriptionManager = void 0;
|
|
|
4
4
|
const _postRequest_js_1 = require("./_postRequest.js");
|
|
5
5
|
/** Maximum number of subscriptions allowed by Hyperliquid. */
|
|
6
6
|
const MAX_SUBSCRIPTIONS = 1000;
|
|
7
|
-
/** Maximum number of
|
|
8
|
-
const
|
|
7
|
+
/** Maximum number of unique user subscriptions allowed by Hyperliquid. */
|
|
8
|
+
const MAX_UNIQUE_USER_SUBSCRIPTIONS = 10;
|
|
9
9
|
/**
|
|
10
10
|
* Manages WebSocket subscriptions to Hyperliquid event channels.
|
|
11
11
|
* Handles subscription lifecycle, resubscription on reconnect, and cleanup.
|
|
@@ -48,13 +48,13 @@ class WebSocketSubscriptionManager {
|
|
|
48
48
|
// Initialize new subscription, if it doesn't exist
|
|
49
49
|
let subscription = this._subscriptions.get(id);
|
|
50
50
|
if (!subscription) {
|
|
51
|
-
// Check
|
|
51
|
+
// Check unique subscription limits
|
|
52
52
|
if (this._subscriptions.size >= MAX_SUBSCRIPTIONS) {
|
|
53
53
|
throw new _postRequest_js_1.WebSocketRequestError("Cannot subscribe to more than 1000 channels.");
|
|
54
54
|
}
|
|
55
|
-
// Check user subscription limits
|
|
56
|
-
if (this._hasUserParam(payload) && this.
|
|
57
|
-
throw new _postRequest_js_1.WebSocketRequestError("Cannot track more than 10
|
|
55
|
+
// Check unique user subscription limits
|
|
56
|
+
if (this._hasUserParam(payload) && this._countUniqueUserSubscriptions() >= MAX_UNIQUE_USER_SUBSCRIPTIONS) {
|
|
57
|
+
throw new _postRequest_js_1.WebSocketRequestError("Cannot track more than 10 unique users.");
|
|
58
58
|
}
|
|
59
59
|
// Send subscription request
|
|
60
60
|
const promise = this._wsRequester.request("subscribe", payload)
|
|
@@ -133,20 +133,21 @@ class WebSocketSubscriptionManager {
|
|
|
133
133
|
_hasUserParam(payload) {
|
|
134
134
|
return typeof payload === "object" && payload !== null && "user" in payload;
|
|
135
135
|
}
|
|
136
|
-
/** Counts the number of
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
/** Counts the number of unique users across all active subscriptions. */
|
|
137
|
+
_countUniqueUserSubscriptions() {
|
|
138
|
+
const users = new Set();
|
|
139
139
|
for (const id of this._subscriptions.keys()) {
|
|
140
140
|
try {
|
|
141
141
|
const payload = JSON.parse(id);
|
|
142
|
-
if (this._hasUserParam(payload))
|
|
143
|
-
|
|
142
|
+
if (this._hasUserParam(payload)) {
|
|
143
|
+
users.add(payload.user);
|
|
144
|
+
}
|
|
144
145
|
}
|
|
145
146
|
catch {
|
|
146
147
|
// Ignore parsing errors
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
|
-
return
|
|
150
|
+
return users.size;
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
exports.WebSocketSubscriptionManager = WebSocketSubscriptionManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscriptionManager.js","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":";;;AAEA,uDAAiF;AAEjF,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,
|
|
1
|
+
{"version":3,"file":"_subscriptionManager.js","sourceRoot":"","sources":["../../../../src/src/transport/websocket/_subscriptionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ import { WebSocketAsyncRequest, WebSocketRequestError } from "./_postRequest.js"
|
|
|
5
5
|
/** Maximum number of subscriptions allowed by Hyperliquid. */
|
|
6
6
|
const MAX_SUBSCRIPTIONS = 1000;
|
|
7
7
|
|
|
8
|
-
/** Maximum number of
|
|
9
|
-
const
|
|
8
|
+
/** Maximum number of unique user subscriptions allowed by Hyperliquid. */
|
|
9
|
+
const MAX_UNIQUE_USER_SUBSCRIPTIONS = 10;
|
|
10
10
|
|
|
11
11
|
/** WebSocket subscription with failure signal. */
|
|
12
12
|
export interface WebSocketSubscription {
|
|
@@ -86,13 +86,13 @@ export class WebSocketSubscriptionManager {
|
|
|
86
86
|
// Initialize new subscription, if it doesn't exist
|
|
87
87
|
let subscription = this._subscriptions.get(id);
|
|
88
88
|
if (!subscription) {
|
|
89
|
-
// Check
|
|
89
|
+
// Check unique subscription limits
|
|
90
90
|
if (this._subscriptions.size >= MAX_SUBSCRIPTIONS) {
|
|
91
91
|
throw new WebSocketRequestError("Cannot subscribe to more than 1000 channels.");
|
|
92
92
|
}
|
|
93
|
-
// Check user subscription limits
|
|
94
|
-
if (this._hasUserParam(payload) && this.
|
|
95
|
-
throw new WebSocketRequestError("Cannot track more than 10
|
|
93
|
+
// Check unique user subscription limits
|
|
94
|
+
if (this._hasUserParam(payload) && this._countUniqueUserSubscriptions() >= MAX_UNIQUE_USER_SUBSCRIPTIONS) {
|
|
95
|
+
throw new WebSocketRequestError("Cannot track more than 10 unique users.");
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
// Send subscription request
|
|
@@ -185,17 +185,19 @@ export class WebSocketSubscriptionManager {
|
|
|
185
185
|
return typeof payload === "object" && payload !== null && "user" in payload;
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
/** Counts the number of
|
|
189
|
-
protected
|
|
190
|
-
|
|
188
|
+
/** Counts the number of unique users across all active subscriptions. */
|
|
189
|
+
protected _countUniqueUserSubscriptions(): number {
|
|
190
|
+
const users = new Set<string>();
|
|
191
191
|
for (const id of this._subscriptions.keys()) {
|
|
192
192
|
try {
|
|
193
193
|
const payload = JSON.parse(id);
|
|
194
|
-
if (this._hasUserParam(payload))
|
|
194
|
+
if (this._hasUserParam(payload)) {
|
|
195
|
+
users.add(payload.user);
|
|
196
|
+
}
|
|
195
197
|
} catch {
|
|
196
198
|
// Ignore parsing errors
|
|
197
199
|
}
|
|
198
200
|
}
|
|
199
|
-
return
|
|
201
|
+
return users.size;
|
|
200
202
|
}
|
|
201
203
|
}
|