@lightconexyz/lightcone-sdk 0.6.1 → 0.7.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 +6 -2
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +2 -0
- package/dist/auth/client.js.map +1 -1
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +10 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +17 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -13
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +7 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +60 -6
- package/dist/context.js.map +1 -1
- package/dist/domain/admin/client.d.ts +11 -1
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +39 -4
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/admin/wire.d.ts +37 -12
- package/dist/domain/admin/wire.d.ts.map +1 -1
- package/dist/domain/admin/wire.js.map +1 -1
- package/dist/domain/market/client.js +1 -1
- package/dist/domain/market/client.js.map +1 -1
- package/dist/domain/market/convert.js +1 -1
- package/dist/domain/market/convert.js.map +1 -1
- package/dist/domain/market/index.d.ts +8 -1
- package/dist/domain/market/index.d.ts.map +1 -1
- package/dist/domain/market/index.js +12 -0
- package/dist/domain/market/index.js.map +1 -1
- package/dist/domain/market/outcome.d.ts +1 -0
- package/dist/domain/market/outcome.d.ts.map +1 -1
- package/dist/domain/market/outcome.js +1 -0
- package/dist/domain/market/outcome.js.map +1 -1
- package/dist/domain/market/tokens.d.ts +2 -0
- package/dist/domain/market/tokens.d.ts.map +1 -1
- package/dist/domain/market/tokens.js +6 -1
- package/dist/domain/market/tokens.js.map +1 -1
- package/dist/domain/market/wire.d.ts +23 -2
- package/dist/domain/market/wire.d.ts.map +1 -1
- package/dist/domain/market/wire.js +5 -0
- package/dist/domain/market/wire.js.map +1 -1
- package/dist/domain/metrics/client.d.ts +3 -3
- package/dist/domain/metrics/client.d.ts.map +1 -1
- package/dist/domain/metrics/client.js +4 -4
- package/dist/domain/metrics/client.js.map +1 -1
- package/dist/domain/metrics/wire.d.ts +5 -1
- package/dist/domain/metrics/wire.d.ts.map +1 -1
- package/dist/domain/metrics/wire.js.map +1 -1
- package/dist/domain/notification/client.d.ts +2 -2
- package/dist/domain/notification/client.d.ts.map +1 -1
- package/dist/domain/notification/client.js +3 -3
- package/dist/domain/notification/client.js.map +1 -1
- package/dist/domain/notification/index.d.ts +3 -1
- package/dist/domain/notification/index.d.ts.map +1 -1
- package/dist/domain/notification/index.js.map +1 -1
- package/dist/domain/order/client.d.ts +12 -10
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +20 -13
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/convert.d.ts +1 -1
- package/dist/domain/order/convert.d.ts.map +1 -1
- package/dist/domain/order/convert.js +2 -2
- package/dist/domain/order/convert.js.map +1 -1
- package/dist/domain/order/index.d.ts +2 -1
- package/dist/domain/order/index.d.ts.map +1 -1
- package/dist/domain/order/index.js +11 -3
- package/dist/domain/order/index.js.map +1 -1
- package/dist/domain/orderbook/client.d.ts +6 -2
- package/dist/domain/orderbook/client.d.ts.map +1 -1
- package/dist/domain/orderbook/client.js +17 -0
- package/dist/domain/orderbook/client.js.map +1 -1
- package/dist/domain/position/builders.d.ts +11 -8
- package/dist/domain/position/builders.d.ts.map +1 -1
- package/dist/domain/position/builders.js +31 -25
- package/dist/domain/position/builders.js.map +1 -1
- package/dist/domain/position/client.d.ts +21 -15
- package/dist/domain/position/client.d.ts.map +1 -1
- package/dist/domain/position/client.js +43 -22
- package/dist/domain/position/client.js.map +1 -1
- package/dist/domain/referral/client.d.ts +2 -2
- package/dist/domain/referral/client.d.ts.map +1 -1
- package/dist/domain/referral/client.js +3 -3
- package/dist/domain/referral/client.js.map +1 -1
- package/dist/domain/trade/client.d.ts +1 -0
- package/dist/domain/trade/client.d.ts.map +1 -1
- package/dist/domain/trade/client.js +14 -0
- package/dist/domain/trade/client.js.map +1 -1
- package/dist/domain/trade/wire.d.ts +6 -0
- package/dist/domain/trade/wire.d.ts.map +1 -1
- package/dist/domain/trade/wire.js.map +1 -1
- package/dist/env.d.ts +6 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +19 -9
- package/dist/env.js.map +1 -1
- package/dist/http/client.d.ts +7 -7
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +15 -12
- package/dist/http/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prelude.d.ts +8 -7
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +7 -6
- package/dist/prelude.js.map +1 -1
- package/dist/privy/index.d.ts +1 -1
- package/dist/privy/index.js.map +1 -1
- package/dist/program/accounts.d.ts +12 -7
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +38 -16
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/builder.d.ts +0 -4
- package/dist/program/builder.d.ts.map +1 -1
- package/dist/program/builder.js +0 -8
- package/dist/program/builder.js.map +1 -1
- package/dist/program/constants.d.ts +20 -7
- package/dist/program/constants.d.ts.map +1 -1
- package/dist/program/constants.js +21 -8
- package/dist/program/constants.js.map +1 -1
- package/dist/program/error.d.ts +25 -1
- package/dist/program/error.d.ts.map +1 -1
- package/dist/program/error.js +72 -0
- package/dist/program/error.js.map +1 -1
- package/dist/program/index.d.ts +7 -7
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +36 -9
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +184 -71
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +573 -140
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.js +2 -2
- package/dist/program/orders.js.map +1 -1
- package/dist/program/pda.d.ts +21 -3
- package/dist/program/pda.d.ts.map +1 -1
- package/dist/program/pda.js +43 -6
- package/dist/program/pda.js.map +1 -1
- package/dist/program/types.d.ts +139 -21
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js.map +1 -1
- package/dist/program/utils.d.ts +31 -2
- package/dist/program/utils.d.ts.map +1 -1
- package/dist/program/utils.js +132 -5
- package/dist/program/utils.js.map +1 -1
- package/dist/rpc.d.ts +6 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +9 -7
- package/dist/rpc.js.map +1 -1
- package/dist/rpcFailover.d.ts +22 -0
- package/dist/rpcFailover.d.ts.map +1 -0
- package/dist/rpcFailover.js +71 -0
- package/dist/rpcFailover.js.map +1 -0
- package/dist/shared/fmt/constants.d.ts +5 -0
- package/dist/shared/fmt/constants.d.ts.map +1 -0
- package/dist/shared/fmt/constants.js +25 -0
- package/dist/shared/fmt/constants.js.map +1 -0
- package/dist/shared/fmt/decimal.d.ts +7 -0
- package/dist/shared/fmt/decimal.d.ts.map +1 -1
- package/dist/shared/fmt/decimal.js +28 -20
- package/dist/shared/fmt/decimal.js.map +1 -1
- package/dist/shared/fmt/num.d.ts +7 -0
- package/dist/shared/fmt/num.d.ts.map +1 -1
- package/dist/shared/fmt/num.js +27 -15
- package/dist/shared/fmt/num.js.map +1 -1
- package/dist/ws/client.node.js +1 -1
- package/dist/ws/client.node.js.map +1 -1
- package/package.json +1 -1
package/dist/shared/fmt/num.d.ts
CHANGED
|
@@ -2,5 +2,12 @@ export declare function displayFormattedString(input: string): string;
|
|
|
2
2
|
export declare function displayWithDecimals(value: number, decimals: number): string;
|
|
3
3
|
export declare function display(value: number): string;
|
|
4
4
|
export declare function toDecimalValue(value: bigint, decimals: number): number;
|
|
5
|
+
/**
|
|
6
|
+
* Format a number as a percentage with exactly 2 decimal places (truncated).
|
|
7
|
+
*
|
|
8
|
+
* When padding is true (default), always shows 2 decimal places (e.g. "12.30").
|
|
9
|
+
* When false, trailing zeros are trimmed (e.g. "12.3").
|
|
10
|
+
*/
|
|
11
|
+
export declare function displayPct(value: number, padding?: boolean): string;
|
|
5
12
|
export declare function fromDecimalValue(value: number, decimals: number): bigint;
|
|
6
13
|
//# sourceMappingURL=num.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"num.d.ts","sourceRoot":"","sources":["../../../src/shared/fmt/num.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"num.d.ts","sourceRoot":"","sources":["../../../src/shared/fmt/num.ts"],"names":[],"mappings":"AAEA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAWnE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE"}
|
package/dist/shared/fmt/num.js
CHANGED
|
@@ -4,15 +4,17 @@ exports.displayFormattedString = displayFormattedString;
|
|
|
4
4
|
exports.displayWithDecimals = displayWithDecimals;
|
|
5
5
|
exports.display = display;
|
|
6
6
|
exports.toDecimalValue = toDecimalValue;
|
|
7
|
+
exports.displayPct = displayPct;
|
|
7
8
|
exports.fromDecimalValue = fromDecimalValue;
|
|
9
|
+
const constants_1 = require("./constants");
|
|
8
10
|
function displayFormattedString(input) {
|
|
9
11
|
const [rawInteger, rawFraction] = input.split(".");
|
|
10
12
|
const negative = rawInteger.startsWith("-");
|
|
11
13
|
const integer = negative ? rawInteger.slice(1) : rawInteger;
|
|
12
14
|
const withCommas = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
13
|
-
const fraction = rawFraction
|
|
15
|
+
const fraction = rawFraction;
|
|
14
16
|
const prefix = negative ? "-" : "";
|
|
15
|
-
if (
|
|
17
|
+
if (fraction === undefined) {
|
|
16
18
|
return `${prefix}${withCommas}`;
|
|
17
19
|
}
|
|
18
20
|
return `${prefix}${withCommas}.${fraction}`;
|
|
@@ -20,24 +22,34 @@ function displayFormattedString(input) {
|
|
|
20
22
|
function displayWithDecimals(value, decimals) {
|
|
21
23
|
return displayFormattedString(value.toFixed(decimals));
|
|
22
24
|
}
|
|
25
|
+
function displayDecimals(absValue) {
|
|
26
|
+
return (0, constants_1.displayDecimalsBy)((threshold) => absValue >= Number(threshold));
|
|
27
|
+
}
|
|
23
28
|
function display(value) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
if (Math.abs(value) >= 1) {
|
|
28
|
-
return displayWithDecimals(value, 2);
|
|
29
|
-
}
|
|
30
|
-
if (value === 0) {
|
|
31
|
-
return "0";
|
|
32
|
-
}
|
|
33
|
-
const abs = Math.abs(value);
|
|
34
|
-
const exponent = Math.floor(Math.log10(abs));
|
|
35
|
-
const decimals = Math.min(Math.max(Math.abs(exponent) + 2, 2), 8);
|
|
36
|
-
return displayWithDecimals(value, decimals);
|
|
29
|
+
const formatted = value.toFixed(displayDecimals(Math.abs(value)));
|
|
30
|
+
return (0, constants_1.isFormattedZero)(formatted) ? "0" : displayFormattedString(formatted);
|
|
37
31
|
}
|
|
38
32
|
function toDecimalValue(value, decimals) {
|
|
39
33
|
return Number(value) / 10 ** decimals;
|
|
40
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Format a number as a percentage with exactly 2 decimal places (truncated).
|
|
37
|
+
*
|
|
38
|
+
* When padding is true (default), always shows 2 decimal places (e.g. "12.30").
|
|
39
|
+
* When false, trailing zeros are trimmed (e.g. "12.3").
|
|
40
|
+
*/
|
|
41
|
+
function displayPct(value, padding) {
|
|
42
|
+
const pad = padding ?? true;
|
|
43
|
+
const truncated = Math.trunc(value * 100) / 100;
|
|
44
|
+
if (pad) {
|
|
45
|
+
return displayFormattedString(truncated.toFixed(2));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const formatted = truncated.toFixed(2);
|
|
49
|
+
const trimmed = formatted.replace(/\.?0+$/, "");
|
|
50
|
+
return displayFormattedString(trimmed);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
41
53
|
function fromDecimalValue(value, decimals) {
|
|
42
54
|
return BigInt(Math.trunc(value * 10 ** decimals));
|
|
43
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"num.js","sourceRoot":"","sources":["../../../src/shared/fmt/num.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"num.js","sourceRoot":"","sources":["../../../src/shared/fmt/num.ts"],"names":[],"mappings":";;AAEA,wDAaC;AAED,kDAEC;AAMD,0BAGC;AAED,wCAEC;AAQD,gCAWC;AAED,4CAEC;AAvDD,2CAAiE;AAEjE,SAAgB,sBAAsB,CAAC,KAAa;IAClD,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,WAAW,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,GAAG,MAAM,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAa,EAAE,QAAgB;IACjE,OAAO,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,IAAA,6BAAiB,EAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,OAAO,CAAC,KAAa;IACnC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,IAAA,2BAAe,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa,EAAE,QAAgB;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,KAAa,EAAE,OAAiB;IACzD,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAEhD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAa,EAAE,QAAgB;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC","sourcesContent":["import { displayDecimalsBy, isFormattedZero } from \"./constants\";\n\nexport function displayFormattedString(input: string): string {\n const [rawInteger, rawFraction] = input.split(\".\");\n const negative = rawInteger.startsWith(\"-\");\n const integer = negative ? rawInteger.slice(1) : rawInteger;\n const withCommas = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const fraction = rawFraction;\n const prefix = negative ? \"-\" : \"\";\n\n if (fraction === undefined) {\n return `${prefix}${withCommas}`;\n }\n\n return `${prefix}${withCommas}.${fraction}`;\n}\n\nexport function displayWithDecimals(value: number, decimals: number): string {\n return displayFormattedString(value.toFixed(decimals));\n}\n\nfunction displayDecimals(absValue: number): number {\n return displayDecimalsBy((threshold) => absValue >= Number(threshold));\n}\n\nexport function display(value: number): string {\n const formatted = value.toFixed(displayDecimals(Math.abs(value)));\n return isFormattedZero(formatted) ? \"0\" : displayFormattedString(formatted);\n}\n\nexport function toDecimalValue(value: bigint, decimals: number): number {\n return Number(value) / 10 ** decimals;\n}\n\n/**\n * Format a number as a percentage with exactly 2 decimal places (truncated).\n *\n * When padding is true (default), always shows 2 decimal places (e.g. \"12.30\").\n * When false, trailing zeros are trimmed (e.g. \"12.3\").\n */\nexport function displayPct(value: number, padding?: boolean): string {\n const pad = padding ?? true;\n const truncated = Math.trunc(value * 100) / 100;\n\n if (pad) {\n return displayFormattedString(truncated.toFixed(2));\n } else {\n const formatted = truncated.toFixed(2);\n const trimmed = formatted.replace(/\\.?0+$/, \"\");\n return displayFormattedString(trimmed);\n }\n}\n\nexport function fromDecimalValue(value: number, decimals: number): bigint {\n return BigInt(Math.trunc(value * 10 ** decimals));\n}\n"]}
|
package/dist/ws/client.node.js
CHANGED
|
@@ -108,7 +108,7 @@ class WsClient {
|
|
|
108
108
|
const headers = {};
|
|
109
109
|
const token = this.authTokenRef ? await this.authTokenRef() : undefined;
|
|
110
110
|
if (token) {
|
|
111
|
-
headers.Cookie = `
|
|
111
|
+
headers.Cookie = `lightcone-token=${token}`;
|
|
112
112
|
}
|
|
113
113
|
const socket = new ws_1.default(this.config.url, { headers });
|
|
114
114
|
this.socket = socket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.node.js","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket from \"ws\";\nimport {\n parseMessageIn,\n ping,\n readyStateFrom,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private readonly authTokenRef?: () => Promise<string | undefined>;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n constructor(config?: Partial<WsConfig>, authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n this.authTokenRef = authTokenRef;\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => {\n resolve();\n });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n return readyStateFrom(this.socket.readyState);\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private async connectInternal(): Promise<void> {\n const headers: Record<string, string> = {};\n const token = this.authTokenRef ? await this.authTokenRef() : undefined;\n if (token) {\n headers.Cookie = `auth_token=${token}`;\n }\n\n const socket = new WebSocket(this.config.url, { headers });\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n });\n\n socket.once(\"error\", (error) => {\n clearTimeout(timeoutId);\n reject(error);\n });\n\n socket.on(\"message\", (raw) => {\n this.handleIncoming(raw.toString());\n });\n\n socket.on(\"close\", (code, reason) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code, reason: reason.toString() });\n if (!manualClose) {\n this.handleClose(code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n await Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.clearPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.armPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private armPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.node.js","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket from \"ws\";\nimport {\n parseMessageIn,\n ping,\n readyStateFrom,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private readonly authTokenRef?: () => Promise<string | undefined>;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n constructor(config?: Partial<WsConfig>, authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n this.authTokenRef = authTokenRef;\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => {\n resolve();\n });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n return readyStateFrom(this.socket.readyState);\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private async connectInternal(): Promise<void> {\n const headers: Record<string, string> = {};\n const token = this.authTokenRef ? await this.authTokenRef() : undefined;\n if (token) {\n headers.Cookie = `lightcone-token=${token}`;\n }\n\n const socket = new WebSocket(this.config.url, { headers });\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n });\n\n socket.once(\"error\", (error) => {\n clearTimeout(timeoutId);\n reject(error);\n });\n\n socket.on(\"message\", (raw) => {\n this.handleIncoming(raw.toString());\n });\n\n socket.on(\"close\", (code, reason) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code, reason: reason.toString() });\n if (!manualClose) {\n this.handleClose(code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n await Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.clearPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.armPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private armPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|