@lightconexyz/lightcone-sdk 0.1.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/README.md +232 -0
- package/dist/api/client.d.ts +225 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +452 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/error.d.ts +58 -0
- package/dist/api/error.d.ts.map +1 -0
- package/dist/api/error.js +98 -0
- package/dist/api/error.js.map +1 -0
- package/dist/api/index.d.ts +23 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +51 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types/admin.d.ts +49 -0
- package/dist/api/types/admin.d.ts.map +1 -0
- package/dist/api/types/admin.js +13 -0
- package/dist/api/types/admin.js.map +1 -0
- package/dist/api/types/index.d.ts +14 -0
- package/dist/api/types/index.d.ts.map +1 -0
- package/dist/api/types/index.js +13 -0
- package/dist/api/types/index.js.map +1 -0
- package/dist/api/types/market.d.ts +186 -0
- package/dist/api/types/market.d.ts.map +1 -0
- package/dist/api/types/market.js +6 -0
- package/dist/api/types/market.js.map +1 -0
- package/dist/api/types/order.d.ts +190 -0
- package/dist/api/types/order.d.ts.map +1 -0
- package/dist/api/types/order.js +6 -0
- package/dist/api/types/order.js.map +1 -0
- package/dist/api/types/orderbook.d.ts +36 -0
- package/dist/api/types/orderbook.d.ts.map +1 -0
- package/dist/api/types/orderbook.js +6 -0
- package/dist/api/types/orderbook.js.map +1 -0
- package/dist/api/types/position.d.ts +60 -0
- package/dist/api/types/position.d.ts.map +1 -0
- package/dist/api/types/position.js +6 -0
- package/dist/api/types/position.js.map +1 -0
- package/dist/api/types/price_history.d.ts +68 -0
- package/dist/api/types/price_history.d.ts.map +1 -0
- package/dist/api/types/price_history.js +13 -0
- package/dist/api/types/price_history.js.map +1 -0
- package/dist/api/types/trade.d.ts +67 -0
- package/dist/api/types/trade.d.ts.map +1 -0
- package/dist/api/types/trade.js +13 -0
- package/dist/api/types/trade.js.map +1 -0
- package/dist/api/validation.d.ts +24 -0
- package/dist/api/validation.d.ts.map +1 -0
- package/dist/api/validation.js +53 -0
- package/dist/api/validation.js.map +1 -0
- package/dist/auth.d.ts +80 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +149 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/network.d.ts +5 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +8 -0
- package/dist/network.js.map +1 -0
- package/dist/program/accounts.d.ts +98 -0
- package/dist/program/accounts.d.ts.map +1 -0
- package/dist/program/accounts.js +319 -0
- package/dist/program/accounts.js.map +1 -0
- package/dist/program/builder.d.ts +94 -0
- package/dist/program/builder.d.ts.map +1 -0
- package/dist/program/builder.js +175 -0
- package/dist/program/builder.js.map +1 -0
- package/dist/program/client.d.ts +56 -0
- package/dist/program/client.d.ts.map +1 -0
- package/dist/program/client.js +288 -0
- package/dist/program/client.js.map +1 -0
- package/dist/program/constants.d.ts +108 -0
- package/dist/program/constants.d.ts.map +1 -0
- package/dist/program/constants.js +112 -0
- package/dist/program/constants.js.map +1 -0
- package/dist/program/index.d.ts +14 -0
- package/dist/program/index.d.ts.map +1 -0
- package/dist/program/index.js +149 -0
- package/dist/program/index.js.map +1 -0
- package/dist/program/instructions.d.ts +248 -0
- package/dist/program/instructions.d.ts.map +1 -0
- package/dist/program/instructions.js +692 -0
- package/dist/program/instructions.js.map +1 -0
- package/dist/program/orders.d.ts +151 -0
- package/dist/program/orders.d.ts.map +1 -0
- package/dist/program/orders.js +417 -0
- package/dist/program/orders.js.map +1 -0
- package/dist/program/pda.d.ts +73 -0
- package/dist/program/pda.d.ts.map +1 -0
- package/dist/program/pda.js +131 -0
- package/dist/program/pda.js.map +1 -0
- package/dist/program/types.d.ts +380 -0
- package/dist/program/types.d.ts.map +1 -0
- package/dist/program/types.js +27 -0
- package/dist/program/types.js.map +1 -0
- package/dist/program/utils.d.ts +91 -0
- package/dist/program/utils.d.ts.map +1 -0
- package/dist/program/utils.js +219 -0
- package/dist/program/utils.js.map +1 -0
- package/dist/shared/index.d.ts +8 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +18 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/price.d.ts +41 -0
- package/dist/shared/price.d.ts.map +1 -0
- package/dist/shared/price.js +57 -0
- package/dist/shared/price.js.map +1 -0
- package/dist/shared/scaling.d.ts +45 -0
- package/dist/shared/scaling.d.ts.map +1 -0
- package/dist/shared/scaling.js +84 -0
- package/dist/shared/scaling.js.map +1 -0
- package/dist/shared/types.d.ts +19 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +23 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/websocket/client.d.ts +238 -0
- package/dist/websocket/client.d.ts.map +1 -0
- package/dist/websocket/client.js +580 -0
- package/dist/websocket/client.js.map +1 -0
- package/dist/websocket/error.d.ts +47 -0
- package/dist/websocket/error.d.ts.map +1 -0
- package/dist/websocket/error.js +83 -0
- package/dist/websocket/error.js.map +1 -0
- package/dist/websocket/handlers.d.ts +97 -0
- package/dist/websocket/handlers.d.ts.map +1 -0
- package/dist/websocket/handlers.js +277 -0
- package/dist/websocket/handlers.js.map +1 -0
- package/dist/websocket/index.d.ts +38 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +75 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/state/index.d.ts +7 -0
- package/dist/websocket/state/index.d.ts.map +1 -0
- package/dist/websocket/state/index.js +14 -0
- package/dist/websocket/state/index.js.map +1 -0
- package/dist/websocket/state/orderbook.d.ts +107 -0
- package/dist/websocket/state/orderbook.d.ts.map +1 -0
- package/dist/websocket/state/orderbook.js +293 -0
- package/dist/websocket/state/orderbook.js.map +1 -0
- package/dist/websocket/state/price.d.ts +108 -0
- package/dist/websocket/state/price.d.ts.map +1 -0
- package/dist/websocket/state/price.js +243 -0
- package/dist/websocket/state/price.js.map +1 -0
- package/dist/websocket/state/user.d.ts +83 -0
- package/dist/websocket/state/user.d.ts.map +1 -0
- package/dist/websocket/state/user.js +228 -0
- package/dist/websocket/state/user.js.map +1 -0
- package/dist/websocket/subscriptions.d.ts +143 -0
- package/dist/websocket/subscriptions.d.ts.map +1 -0
- package/dist/websocket/subscriptions.js +244 -0
- package/dist/websocket/subscriptions.js.map +1 -0
- package/dist/websocket/types.d.ts +417 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/dist/websocket/types.js +195 -0
- package/dist/websocket/types.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket error types for the Lightcone WebSocket client.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* WebSocket error variants.
|
|
6
|
+
*/
|
|
7
|
+
export type WebSocketErrorVariant = "ConnectionFailed" | "ConnectionClosed" | "ConnectionTimeout" | "RateLimited" | "MessageParseError" | "SequenceGap" | "ResyncRequired" | "PingTimeout" | "ServerError" | "AuthenticationFailed" | "ChannelClosed" | "NotConnected" | "InvalidUrl" | "Protocol" | "HttpError";
|
|
8
|
+
/**
|
|
9
|
+
* WebSocket error class.
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebSocketError extends Error {
|
|
12
|
+
readonly variant: WebSocketErrorVariant;
|
|
13
|
+
readonly code?: string;
|
|
14
|
+
readonly details?: Record<string, unknown>;
|
|
15
|
+
constructor(variant: WebSocketErrorVariant, message: string, code?: string, details?: Record<string, unknown>);
|
|
16
|
+
/** Failed to establish connection */
|
|
17
|
+
static connectionFailed(message: string): WebSocketError;
|
|
18
|
+
/** Connection timeout */
|
|
19
|
+
static connectionTimeout(): WebSocketError;
|
|
20
|
+
/** Connection was closed */
|
|
21
|
+
static connectionClosed(code: number, reason: string): WebSocketError;
|
|
22
|
+
/** Rate limit exceeded */
|
|
23
|
+
static rateLimited(): WebSocketError;
|
|
24
|
+
/** Failed to parse message */
|
|
25
|
+
static messageParseError(message: string): WebSocketError;
|
|
26
|
+
/** Sequence gap detected in orderbook updates */
|
|
27
|
+
static sequenceGap(expected: number, received: number): WebSocketError;
|
|
28
|
+
/** Resync required for orderbook */
|
|
29
|
+
static resyncRequired(orderbookId: string): WebSocketError;
|
|
30
|
+
/** Ping timeout */
|
|
31
|
+
static pingTimeout(): WebSocketError;
|
|
32
|
+
/** Server error */
|
|
33
|
+
static serverError(code: string, message: string): WebSocketError;
|
|
34
|
+
/** Authentication failed */
|
|
35
|
+
static authenticationFailed(message: string): WebSocketError;
|
|
36
|
+
/** Channel closed */
|
|
37
|
+
static channelClosed(): WebSocketError;
|
|
38
|
+
/** Not connected */
|
|
39
|
+
static notConnected(): WebSocketError;
|
|
40
|
+
/** Invalid URL */
|
|
41
|
+
static invalidUrl(message: string): WebSocketError;
|
|
42
|
+
/** Protocol error */
|
|
43
|
+
static protocol(message: string): WebSocketError;
|
|
44
|
+
/** HTTP error during authentication */
|
|
45
|
+
static httpError(message: string): WebSocketError;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/websocket/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,aAAa,GACb,mBAAmB,GACnB,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,sBAAsB,GACtB,eAAe,GACf,cAAc,GACd,YAAY,GACZ,UAAU,GACV,WAAW,CAAC;AAEhB;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGzC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IASnC,qCAAqC;IACrC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAIxD,yBAAyB;IACzB,MAAM,CAAC,iBAAiB,IAAI,cAAc;IAO1C,4BAA4B;IAC5B,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAQrE,0BAA0B;IAC1B,MAAM,CAAC,WAAW,IAAI,cAAc;IAIpC,8BAA8B;IAC9B,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAIzD,iDAAiD;IACjD,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;IAStE,oCAAoC;IACpC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc;IAS1D,mBAAmB;IACnB,MAAM,CAAC,WAAW,IAAI,cAAc;IAIpC,mBAAmB;IACnB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc;IAIjE,4BAA4B;IAC5B,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAI5D,qBAAqB;IACrB,MAAM,CAAC,aAAa,IAAI,cAAc;IAItC,oBAAoB;IACpB,MAAM,CAAC,YAAY,IAAI,cAAc;IAIrC,kBAAkB;IAClB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAIlD,qBAAqB;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAIhD,uCAAuC;IACvC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;CAGlD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket error types for the Lightcone WebSocket client.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketError = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket error class.
|
|
9
|
+
*/
|
|
10
|
+
class WebSocketError extends Error {
|
|
11
|
+
variant;
|
|
12
|
+
code;
|
|
13
|
+
details;
|
|
14
|
+
constructor(variant, message, code, details) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "WebSocketError";
|
|
17
|
+
this.variant = variant;
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.details = details;
|
|
20
|
+
}
|
|
21
|
+
/** Failed to establish connection */
|
|
22
|
+
static connectionFailed(message) {
|
|
23
|
+
return new WebSocketError("ConnectionFailed", `Connection failed: ${message}`);
|
|
24
|
+
}
|
|
25
|
+
/** Connection timeout */
|
|
26
|
+
static connectionTimeout() {
|
|
27
|
+
return new WebSocketError("ConnectionTimeout", "Connection timeout - server did not respond");
|
|
28
|
+
}
|
|
29
|
+
/** Connection was closed */
|
|
30
|
+
static connectionClosed(code, reason) {
|
|
31
|
+
return new WebSocketError("ConnectionClosed", `Connection closed: code ${code}, reason: ${reason}`, String(code));
|
|
32
|
+
}
|
|
33
|
+
/** Rate limit exceeded */
|
|
34
|
+
static rateLimited() {
|
|
35
|
+
return new WebSocketError("RateLimited", "Rate limited by server");
|
|
36
|
+
}
|
|
37
|
+
/** Failed to parse message */
|
|
38
|
+
static messageParseError(message) {
|
|
39
|
+
return new WebSocketError("MessageParseError", `Failed to parse message: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
/** Sequence gap detected in orderbook updates */
|
|
42
|
+
static sequenceGap(expected, received) {
|
|
43
|
+
return new WebSocketError("SequenceGap", `Sequence gap: expected ${expected}, received ${received}`, undefined, { expected, received });
|
|
44
|
+
}
|
|
45
|
+
/** Resync required for orderbook */
|
|
46
|
+
static resyncRequired(orderbookId) {
|
|
47
|
+
return new WebSocketError("ResyncRequired", `Resync required for orderbook: ${orderbookId}`, undefined, { orderbookId });
|
|
48
|
+
}
|
|
49
|
+
/** Ping timeout */
|
|
50
|
+
static pingTimeout() {
|
|
51
|
+
return new WebSocketError("PingTimeout", "Ping timeout - no response from server");
|
|
52
|
+
}
|
|
53
|
+
/** Server error */
|
|
54
|
+
static serverError(code, message) {
|
|
55
|
+
return new WebSocketError("ServerError", `Server error: ${message}`, code);
|
|
56
|
+
}
|
|
57
|
+
/** Authentication failed */
|
|
58
|
+
static authenticationFailed(message) {
|
|
59
|
+
return new WebSocketError("AuthenticationFailed", `Authentication failed: ${message}`);
|
|
60
|
+
}
|
|
61
|
+
/** Channel closed */
|
|
62
|
+
static channelClosed() {
|
|
63
|
+
return new WebSocketError("ChannelClosed", "Internal channel closed");
|
|
64
|
+
}
|
|
65
|
+
/** Not connected */
|
|
66
|
+
static notConnected() {
|
|
67
|
+
return new WebSocketError("NotConnected", "Not connected to server");
|
|
68
|
+
}
|
|
69
|
+
/** Invalid URL */
|
|
70
|
+
static invalidUrl(message) {
|
|
71
|
+
return new WebSocketError("InvalidUrl", `Invalid URL: ${message}`);
|
|
72
|
+
}
|
|
73
|
+
/** Protocol error */
|
|
74
|
+
static protocol(message) {
|
|
75
|
+
return new WebSocketError("Protocol", `Protocol error: ${message}`);
|
|
76
|
+
}
|
|
77
|
+
/** HTTP error during authentication */
|
|
78
|
+
static httpError(message) {
|
|
79
|
+
return new WebSocketError("HttpError", `HTTP error: ${message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.WebSocketError = WebSocketError;
|
|
83
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/websocket/error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WebSocket error types for the Lightcone WebSocket client.\n */\n\n/**\n * WebSocket error variants.\n */\nexport type WebSocketErrorVariant =\n | \"ConnectionFailed\"\n | \"ConnectionClosed\"\n | \"ConnectionTimeout\"\n | \"RateLimited\"\n | \"MessageParseError\"\n | \"SequenceGap\"\n | \"ResyncRequired\"\n | \"PingTimeout\"\n | \"ServerError\"\n | \"AuthenticationFailed\"\n | \"ChannelClosed\"\n | \"NotConnected\"\n | \"InvalidUrl\"\n | \"Protocol\"\n | \"HttpError\";\n\n/**\n * WebSocket error class.\n */\nexport class WebSocketError extends Error {\n readonly variant: WebSocketErrorVariant;\n readonly code?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(\n variant: WebSocketErrorVariant,\n message: string,\n code?: string,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"WebSocketError\";\n this.variant = variant;\n this.code = code;\n this.details = details;\n }\n\n /** Failed to establish connection */\n static connectionFailed(message: string): WebSocketError {\n return new WebSocketError(\"ConnectionFailed\", `Connection failed: ${message}`);\n }\n\n /** Connection timeout */\n static connectionTimeout(): WebSocketError {\n return new WebSocketError(\n \"ConnectionTimeout\",\n \"Connection timeout - server did not respond\"\n );\n }\n\n /** Connection was closed */\n static connectionClosed(code: number, reason: string): WebSocketError {\n return new WebSocketError(\n \"ConnectionClosed\",\n `Connection closed: code ${code}, reason: ${reason}`,\n String(code)\n );\n }\n\n /** Rate limit exceeded */\n static rateLimited(): WebSocketError {\n return new WebSocketError(\"RateLimited\", \"Rate limited by server\");\n }\n\n /** Failed to parse message */\n static messageParseError(message: string): WebSocketError {\n return new WebSocketError(\"MessageParseError\", `Failed to parse message: ${message}`);\n }\n\n /** Sequence gap detected in orderbook updates */\n static sequenceGap(expected: number, received: number): WebSocketError {\n return new WebSocketError(\n \"SequenceGap\",\n `Sequence gap: expected ${expected}, received ${received}`,\n undefined,\n { expected, received }\n );\n }\n\n /** Resync required for orderbook */\n static resyncRequired(orderbookId: string): WebSocketError {\n return new WebSocketError(\n \"ResyncRequired\",\n `Resync required for orderbook: ${orderbookId}`,\n undefined,\n { orderbookId }\n );\n }\n\n /** Ping timeout */\n static pingTimeout(): WebSocketError {\n return new WebSocketError(\"PingTimeout\", \"Ping timeout - no response from server\");\n }\n\n /** Server error */\n static serverError(code: string, message: string): WebSocketError {\n return new WebSocketError(\"ServerError\", `Server error: ${message}`, code);\n }\n\n /** Authentication failed */\n static authenticationFailed(message: string): WebSocketError {\n return new WebSocketError(\"AuthenticationFailed\", `Authentication failed: ${message}`);\n }\n\n /** Channel closed */\n static channelClosed(): WebSocketError {\n return new WebSocketError(\"ChannelClosed\", \"Internal channel closed\");\n }\n\n /** Not connected */\n static notConnected(): WebSocketError {\n return new WebSocketError(\"NotConnected\", \"Not connected to server\");\n }\n\n /** Invalid URL */\n static invalidUrl(message: string): WebSocketError {\n return new WebSocketError(\"InvalidUrl\", `Invalid URL: ${message}`);\n }\n\n /** Protocol error */\n static protocol(message: string): WebSocketError {\n return new WebSocketError(\"Protocol\", `Protocol error: ${message}`);\n }\n\n /** HTTP error during authentication */\n static httpError(message: string): WebSocketError {\n return new WebSocketError(\"HttpError\", `HTTP error: ${message}`);\n }\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message handlers for WebSocket events.
|
|
3
|
+
*
|
|
4
|
+
* Routes incoming messages to appropriate handlers and emits events.
|
|
5
|
+
*/
|
|
6
|
+
import { LocalOrderbook, UserState, PriceHistory } from "./state";
|
|
7
|
+
import type { WsEvent } from "./types";
|
|
8
|
+
/**
|
|
9
|
+
* Handles incoming WebSocket messages.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MessageHandler {
|
|
12
|
+
/** Local orderbook state */
|
|
13
|
+
private orderbooks;
|
|
14
|
+
/** Local user state */
|
|
15
|
+
private userStates;
|
|
16
|
+
/** Price history state */
|
|
17
|
+
private priceHistories;
|
|
18
|
+
/** Currently subscribed user (single user per connection) */
|
|
19
|
+
private subscribedUser;
|
|
20
|
+
/**
|
|
21
|
+
* Handle an incoming message and return events.
|
|
22
|
+
*/
|
|
23
|
+
handleMessage(text: string): WsEvent[];
|
|
24
|
+
/**
|
|
25
|
+
* Handle book update message.
|
|
26
|
+
*/
|
|
27
|
+
private handleBookUpdate;
|
|
28
|
+
/**
|
|
29
|
+
* Handle trade message.
|
|
30
|
+
*/
|
|
31
|
+
private handleTrade;
|
|
32
|
+
/**
|
|
33
|
+
* Handle user event message.
|
|
34
|
+
*/
|
|
35
|
+
private handleUserEvent;
|
|
36
|
+
/**
|
|
37
|
+
* Handle price history message.
|
|
38
|
+
*/
|
|
39
|
+
private handlePriceHistory;
|
|
40
|
+
/**
|
|
41
|
+
* Handle market event message.
|
|
42
|
+
*/
|
|
43
|
+
private handleMarketEvent;
|
|
44
|
+
/**
|
|
45
|
+
* Handle error message from server.
|
|
46
|
+
*/
|
|
47
|
+
private handleError;
|
|
48
|
+
/**
|
|
49
|
+
* Handle auth message.
|
|
50
|
+
*/
|
|
51
|
+
private handleAuth;
|
|
52
|
+
/**
|
|
53
|
+
* Initialize orderbook state for a subscription.
|
|
54
|
+
*/
|
|
55
|
+
initOrderbook(orderbookId: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Initialize user state for a subscription.
|
|
58
|
+
*/
|
|
59
|
+
initUserState(user: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear the subscribed user.
|
|
62
|
+
*/
|
|
63
|
+
clearSubscribedUser(user: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* Initialize price history state for a subscription.
|
|
66
|
+
*/
|
|
67
|
+
initPriceHistory(orderbookId: string, resolution: string, includeOhlcv: boolean): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get orderbook state.
|
|
70
|
+
*/
|
|
71
|
+
getOrderbook(orderbookId: string): LocalOrderbook | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Get user state.
|
|
74
|
+
*/
|
|
75
|
+
getUserState(user: string): UserState | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Get price history state.
|
|
78
|
+
*/
|
|
79
|
+
getPriceHistory(orderbookId: string, resolution: string): PriceHistory | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Clear orderbook state.
|
|
82
|
+
*/
|
|
83
|
+
clearOrderbook(orderbookId: string): void;
|
|
84
|
+
/**
|
|
85
|
+
* Clear user state.
|
|
86
|
+
*/
|
|
87
|
+
clearUserState(user: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Clear price history state.
|
|
90
|
+
*/
|
|
91
|
+
clearPriceHistory(orderbookId: string, resolution: string): void;
|
|
92
|
+
/**
|
|
93
|
+
* Clear all state.
|
|
94
|
+
*/
|
|
95
|
+
clearAll(): void;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/websocket/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,qBAAa,cAAc;IACzB,4BAA4B;IAC5B,OAAO,CAAC,UAAU,CAA0C;IAC5D,uBAAuB;IACvB,OAAO,CAAC,UAAU,CAAqC;IACvD,0BAA0B;IAC1B,OAAO,CAAC,cAAc,CAAwC;IAC9D,6DAA6D;IAC7D,OAAO,CAAC,cAAc,CAAuB;IAE7C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAmCtC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMxC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMvC;;OAEG;IACH,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,OAAO,GACpB,IAAI;IAUP;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7D;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKlF;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAOzC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOlC;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQhE;;OAEG;IACH,QAAQ,IAAI,IAAI;CAKjB"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Message handlers for WebSocket events.
|
|
4
|
+
*
|
|
5
|
+
* Routes incoming messages to appropriate handlers and emits events.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MessageHandler = void 0;
|
|
9
|
+
const error_1 = require("./error");
|
|
10
|
+
const state_1 = require("./state");
|
|
11
|
+
const types_1 = require("./types");
|
|
12
|
+
/**
|
|
13
|
+
* Handles incoming WebSocket messages.
|
|
14
|
+
*/
|
|
15
|
+
class MessageHandler {
|
|
16
|
+
/** Local orderbook state */
|
|
17
|
+
orderbooks = new Map();
|
|
18
|
+
/** Local user state */
|
|
19
|
+
userStates = new Map();
|
|
20
|
+
/** Price history state */
|
|
21
|
+
priceHistories = new Map();
|
|
22
|
+
/** Currently subscribed user (single user per connection) */
|
|
23
|
+
subscribedUser = null;
|
|
24
|
+
/**
|
|
25
|
+
* Handle an incoming message and return events.
|
|
26
|
+
*/
|
|
27
|
+
handleMessage(text) {
|
|
28
|
+
const msg = (0, types_1.parseWsMessage)(text);
|
|
29
|
+
if (!msg) {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
type: "Error",
|
|
33
|
+
error: error_1.WebSocketError.messageParseError("Invalid message"),
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
// TypeScript narrows msg.data type automatically based on msg.type
|
|
38
|
+
switch (msg.type) {
|
|
39
|
+
case "book_update":
|
|
40
|
+
return this.handleBookUpdate(msg.data);
|
|
41
|
+
case "trades":
|
|
42
|
+
return this.handleTrade(msg.data);
|
|
43
|
+
case "user":
|
|
44
|
+
return this.handleUserEvent(msg.data);
|
|
45
|
+
case "price_history":
|
|
46
|
+
return this.handlePriceHistory(msg.data);
|
|
47
|
+
case "market":
|
|
48
|
+
return this.handleMarketEvent(msg.data);
|
|
49
|
+
case "error":
|
|
50
|
+
return this.handleError(msg.data);
|
|
51
|
+
case "pong":
|
|
52
|
+
return [{ type: "Pong" }];
|
|
53
|
+
case "auth":
|
|
54
|
+
return this.handleAuth(msg.data);
|
|
55
|
+
default:
|
|
56
|
+
console.warn("Unknown message type:", msg.type);
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle book update message.
|
|
62
|
+
*/
|
|
63
|
+
handleBookUpdate(data) {
|
|
64
|
+
// Check for resync signal
|
|
65
|
+
if (data.resync) {
|
|
66
|
+
console.info("Resync required for orderbook:", data.orderbook_id);
|
|
67
|
+
return [{ type: "ResyncRequired", orderbookId: data.orderbook_id }];
|
|
68
|
+
}
|
|
69
|
+
const orderbookId = data.orderbook_id;
|
|
70
|
+
const isSnapshot = data.is_snapshot;
|
|
71
|
+
// Update local state
|
|
72
|
+
let book = this.orderbooks.get(orderbookId);
|
|
73
|
+
if (!book) {
|
|
74
|
+
book = new state_1.LocalOrderbook(orderbookId);
|
|
75
|
+
this.orderbooks.set(orderbookId, book);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
book.applyUpdate(data);
|
|
79
|
+
return [{ type: "BookUpdate", orderbookId, isSnapshot }];
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
if (e instanceof error_1.WebSocketError && e.variant === "SequenceGap") {
|
|
83
|
+
console.warn(`Sequence gap in orderbook ${orderbookId}:`, e.message);
|
|
84
|
+
// Clear the orderbook state on sequence gap
|
|
85
|
+
book.clear();
|
|
86
|
+
return [{ type: "ResyncRequired", orderbookId }];
|
|
87
|
+
}
|
|
88
|
+
return [{ type: "Error", error: e }];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Handle trade message.
|
|
93
|
+
*/
|
|
94
|
+
handleTrade(data) {
|
|
95
|
+
return [{ type: "Trade", orderbookId: data.orderbook_id, trade: data }];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Handle user event message.
|
|
99
|
+
*/
|
|
100
|
+
handleUserEvent(data) {
|
|
101
|
+
const eventType = data.event_type;
|
|
102
|
+
// Use the tracked subscribed user (single user per connection)
|
|
103
|
+
const user = this.subscribedUser;
|
|
104
|
+
if (!user) {
|
|
105
|
+
console.warn(`Received user event '${eventType}' but no user subscription exists. ` +
|
|
106
|
+
`Call subscribeUser() before receiving events to avoid data loss.`);
|
|
107
|
+
return [{ type: "UserUpdate", eventType, user: "unknown" }];
|
|
108
|
+
}
|
|
109
|
+
// Update local state for the subscribed user
|
|
110
|
+
const state = this.userStates.get(user);
|
|
111
|
+
if (state) {
|
|
112
|
+
state.applyEvent(data);
|
|
113
|
+
}
|
|
114
|
+
return [{ type: "UserUpdate", eventType, user }];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Handle price history message.
|
|
118
|
+
*/
|
|
119
|
+
handlePriceHistory(data) {
|
|
120
|
+
// Heartbeats don't have orderbook_id
|
|
121
|
+
if (data.event_type === "heartbeat") {
|
|
122
|
+
// Update all price histories with heartbeat
|
|
123
|
+
for (const history of this.priceHistories.values()) {
|
|
124
|
+
history.applyHeartbeat(data);
|
|
125
|
+
}
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
const orderbookId = data.orderbook_id;
|
|
129
|
+
if (!orderbookId) {
|
|
130
|
+
console.warn("Price history message missing orderbook_id");
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const resolution = data.resolution || "1m";
|
|
134
|
+
const key = `${orderbookId}:${resolution}`;
|
|
135
|
+
let history = this.priceHistories.get(key);
|
|
136
|
+
if (history) {
|
|
137
|
+
history.applyEvent(data);
|
|
138
|
+
}
|
|
139
|
+
else if (data.event_type === "snapshot") {
|
|
140
|
+
// Create new history if this is a snapshot
|
|
141
|
+
history = new state_1.PriceHistory(orderbookId, resolution, data.include_ohlcv || false);
|
|
142
|
+
history.applyEvent(data);
|
|
143
|
+
this.priceHistories.set(key, history);
|
|
144
|
+
}
|
|
145
|
+
return [{ type: "PriceUpdate", orderbookId, resolution }];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Handle market event message.
|
|
149
|
+
*/
|
|
150
|
+
handleMarketEvent(data) {
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
type: "MarketEvent",
|
|
154
|
+
eventType: data.event_type,
|
|
155
|
+
marketPubkey: data.market_pubkey,
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Handle error message from server.
|
|
161
|
+
*/
|
|
162
|
+
handleError(data) {
|
|
163
|
+
console.error(`Server error: ${data.error} (code: ${data.code})`);
|
|
164
|
+
return [
|
|
165
|
+
{
|
|
166
|
+
type: "Error",
|
|
167
|
+
error: error_1.WebSocketError.serverError(data.code, data.error),
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Handle auth message.
|
|
173
|
+
*/
|
|
174
|
+
handleAuth(data) {
|
|
175
|
+
if (data.status === "error") {
|
|
176
|
+
return [
|
|
177
|
+
{
|
|
178
|
+
type: "Error",
|
|
179
|
+
error: error_1.WebSocketError.authenticationFailed(data.message || "Authentication failed"),
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
}
|
|
183
|
+
// For authenticated/anonymous, just log and continue
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Initialize orderbook state for a subscription.
|
|
188
|
+
*/
|
|
189
|
+
initOrderbook(orderbookId) {
|
|
190
|
+
if (!this.orderbooks.has(orderbookId)) {
|
|
191
|
+
this.orderbooks.set(orderbookId, new state_1.LocalOrderbook(orderbookId));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Initialize user state for a subscription.
|
|
196
|
+
*/
|
|
197
|
+
initUserState(user) {
|
|
198
|
+
this.subscribedUser = user;
|
|
199
|
+
if (!this.userStates.has(user)) {
|
|
200
|
+
this.userStates.set(user, new state_1.UserState(user));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Clear the subscribed user.
|
|
205
|
+
*/
|
|
206
|
+
clearSubscribedUser(user) {
|
|
207
|
+
if (this.subscribedUser === user) {
|
|
208
|
+
this.subscribedUser = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Initialize price history state for a subscription.
|
|
213
|
+
*/
|
|
214
|
+
initPriceHistory(orderbookId, resolution, includeOhlcv) {
|
|
215
|
+
const key = `${orderbookId}:${resolution}`;
|
|
216
|
+
if (!this.priceHistories.has(key)) {
|
|
217
|
+
this.priceHistories.set(key, new state_1.PriceHistory(orderbookId, resolution, includeOhlcv));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get orderbook state.
|
|
222
|
+
*/
|
|
223
|
+
getOrderbook(orderbookId) {
|
|
224
|
+
return this.orderbooks.get(orderbookId);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get user state.
|
|
228
|
+
*/
|
|
229
|
+
getUserState(user) {
|
|
230
|
+
return this.userStates.get(user);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get price history state.
|
|
234
|
+
*/
|
|
235
|
+
getPriceHistory(orderbookId, resolution) {
|
|
236
|
+
const key = `${orderbookId}:${resolution}`;
|
|
237
|
+
return this.priceHistories.get(key);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Clear orderbook state.
|
|
241
|
+
*/
|
|
242
|
+
clearOrderbook(orderbookId) {
|
|
243
|
+
const book = this.orderbooks.get(orderbookId);
|
|
244
|
+
if (book) {
|
|
245
|
+
book.clear();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Clear user state.
|
|
250
|
+
*/
|
|
251
|
+
clearUserState(user) {
|
|
252
|
+
const state = this.userStates.get(user);
|
|
253
|
+
if (state) {
|
|
254
|
+
state.clear();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Clear price history state.
|
|
259
|
+
*/
|
|
260
|
+
clearPriceHistory(orderbookId, resolution) {
|
|
261
|
+
const key = `${orderbookId}:${resolution}`;
|
|
262
|
+
const history = this.priceHistories.get(key);
|
|
263
|
+
if (history) {
|
|
264
|
+
history.clear();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Clear all state.
|
|
269
|
+
*/
|
|
270
|
+
clearAll() {
|
|
271
|
+
this.orderbooks.clear();
|
|
272
|
+
this.userStates.clear();
|
|
273
|
+
this.priceHistories.clear();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
exports.MessageHandler = MessageHandler;
|
|
277
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/websocket/handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Message handlers for WebSocket events.\n *\n * Routes incoming messages to appropriate handlers and emits events.\n */\n\nimport { WebSocketError } from \"./error\";\nimport { LocalOrderbook, UserState, PriceHistory } from \"./state\";\nimport type {\n WsEvent,\n BookUpdateData,\n TradeData,\n UserEventData,\n PriceHistoryData,\n MarketEventData,\n ErrorData,\n AuthData,\n} from \"./types\";\nimport { parseWsMessage } from \"./types\";\n\n/**\n * Handles incoming WebSocket messages.\n */\nexport class MessageHandler {\n /** Local orderbook state */\n private orderbooks: Map<string, LocalOrderbook> = new Map();\n /** Local user state */\n private userStates: Map<string, UserState> = new Map();\n /** Price history state */\n private priceHistories: Map<string, PriceHistory> = new Map();\n /** Currently subscribed user (single user per connection) */\n private subscribedUser: string | null = null;\n\n /**\n * Handle an incoming message and return events.\n */\n handleMessage(text: string): WsEvent[] {\n const msg = parseWsMessage(text);\n if (!msg) {\n return [\n {\n type: \"Error\",\n error: WebSocketError.messageParseError(\"Invalid message\"),\n },\n ];\n }\n\n // TypeScript narrows msg.data type automatically based on msg.type\n switch (msg.type) {\n case \"book_update\":\n return this.handleBookUpdate(msg.data);\n case \"trades\":\n return this.handleTrade(msg.data);\n case \"user\":\n return this.handleUserEvent(msg.data);\n case \"price_history\":\n return this.handlePriceHistory(msg.data);\n case \"market\":\n return this.handleMarketEvent(msg.data);\n case \"error\":\n return this.handleError(msg.data);\n case \"pong\":\n return [{ type: \"Pong\" }];\n case \"auth\":\n return this.handleAuth(msg.data);\n default:\n console.warn(\"Unknown message type:\", (msg as { type: string }).type);\n return [];\n }\n }\n\n /**\n * Handle book update message.\n */\n private handleBookUpdate(data: BookUpdateData): WsEvent[] {\n // Check for resync signal\n if (data.resync) {\n console.info(\"Resync required for orderbook:\", data.orderbook_id);\n return [{ type: \"ResyncRequired\", orderbookId: data.orderbook_id }];\n }\n\n const orderbookId = data.orderbook_id;\n const isSnapshot = data.is_snapshot;\n\n // Update local state\n let book = this.orderbooks.get(orderbookId);\n if (!book) {\n book = new LocalOrderbook(orderbookId);\n this.orderbooks.set(orderbookId, book);\n }\n\n try {\n book.applyUpdate(data);\n return [{ type: \"BookUpdate\", orderbookId, isSnapshot }];\n } catch (e) {\n if (e instanceof WebSocketError && e.variant === \"SequenceGap\") {\n console.warn(\n `Sequence gap in orderbook ${orderbookId}:`,\n e.message\n );\n // Clear the orderbook state on sequence gap\n book.clear();\n return [{ type: \"ResyncRequired\", orderbookId }];\n }\n return [{ type: \"Error\", error: e as WebSocketError }];\n }\n }\n\n /**\n * Handle trade message.\n */\n private handleTrade(data: TradeData): WsEvent[] {\n return [{ type: \"Trade\", orderbookId: data.orderbook_id, trade: data }];\n }\n\n /**\n * Handle user event message.\n */\n private handleUserEvent(data: UserEventData): WsEvent[] {\n const eventType = data.event_type;\n\n // Use the tracked subscribed user (single user per connection)\n const user = this.subscribedUser;\n if (!user) {\n console.warn(\n `Received user event '${eventType}' but no user subscription exists. ` +\n `Call subscribeUser() before receiving events to avoid data loss.`\n );\n return [{ type: \"UserUpdate\", eventType, user: \"unknown\" }];\n }\n\n // Update local state for the subscribed user\n const state = this.userStates.get(user);\n if (state) {\n state.applyEvent(data);\n }\n\n return [{ type: \"UserUpdate\", eventType, user }];\n }\n\n /**\n * Handle price history message.\n */\n private handlePriceHistory(data: PriceHistoryData): WsEvent[] {\n // Heartbeats don't have orderbook_id\n if (data.event_type === \"heartbeat\") {\n // Update all price histories with heartbeat\n for (const history of this.priceHistories.values()) {\n history.applyHeartbeat(data);\n }\n return [];\n }\n\n const orderbookId = data.orderbook_id;\n if (!orderbookId) {\n console.warn(\"Price history message missing orderbook_id\");\n return [];\n }\n\n const resolution = data.resolution || \"1m\";\n const key = `${orderbookId}:${resolution}`;\n\n let history = this.priceHistories.get(key);\n if (history) {\n history.applyEvent(data);\n } else if (data.event_type === \"snapshot\") {\n // Create new history if this is a snapshot\n history = new PriceHistory(\n orderbookId,\n resolution,\n data.include_ohlcv || false\n );\n history.applyEvent(data);\n this.priceHistories.set(key, history);\n }\n\n return [{ type: \"PriceUpdate\", orderbookId, resolution }];\n }\n\n /**\n * Handle market event message.\n */\n private handleMarketEvent(data: MarketEventData): WsEvent[] {\n return [\n {\n type: \"MarketEvent\",\n eventType: data.event_type,\n marketPubkey: data.market_pubkey,\n },\n ];\n }\n\n /**\n * Handle error message from server.\n */\n private handleError(data: ErrorData): WsEvent[] {\n console.error(`Server error: ${data.error} (code: ${data.code})`);\n return [\n {\n type: \"Error\",\n error: WebSocketError.serverError(data.code, data.error),\n },\n ];\n }\n\n /**\n * Handle auth message.\n */\n private handleAuth(data: AuthData): WsEvent[] {\n if (data.status === \"error\") {\n return [\n {\n type: \"Error\",\n error: WebSocketError.authenticationFailed(data.message || \"Authentication failed\"),\n },\n ];\n }\n // For authenticated/anonymous, just log and continue\n return [];\n }\n\n /**\n * Initialize orderbook state for a subscription.\n */\n initOrderbook(orderbookId: string): void {\n if (!this.orderbooks.has(orderbookId)) {\n this.orderbooks.set(orderbookId, new LocalOrderbook(orderbookId));\n }\n }\n\n /**\n * Initialize user state for a subscription.\n */\n initUserState(user: string): void {\n this.subscribedUser = user;\n if (!this.userStates.has(user)) {\n this.userStates.set(user, new UserState(user));\n }\n }\n\n /**\n * Clear the subscribed user.\n */\n clearSubscribedUser(user: string): void {\n if (this.subscribedUser === user) {\n this.subscribedUser = null;\n }\n }\n\n /**\n * Initialize price history state for a subscription.\n */\n initPriceHistory(\n orderbookId: string,\n resolution: string,\n includeOhlcv: boolean\n ): void {\n const key = `${orderbookId}:${resolution}`;\n if (!this.priceHistories.has(key)) {\n this.priceHistories.set(\n key,\n new PriceHistory(orderbookId, resolution, includeOhlcv)\n );\n }\n }\n\n /**\n * Get orderbook state.\n */\n getOrderbook(orderbookId: string): LocalOrderbook | undefined {\n return this.orderbooks.get(orderbookId);\n }\n\n /**\n * Get user state.\n */\n getUserState(user: string): UserState | undefined {\n return this.userStates.get(user);\n }\n\n /**\n * Get price history state.\n */\n getPriceHistory(orderbookId: string, resolution: string): PriceHistory | undefined {\n const key = `${orderbookId}:${resolution}`;\n return this.priceHistories.get(key);\n }\n\n /**\n * Clear orderbook state.\n */\n clearOrderbook(orderbookId: string): void {\n const book = this.orderbooks.get(orderbookId);\n if (book) {\n book.clear();\n }\n }\n\n /**\n * Clear user state.\n */\n clearUserState(user: string): void {\n const state = this.userStates.get(user);\n if (state) {\n state.clear();\n }\n }\n\n /**\n * Clear price history state.\n */\n clearPriceHistory(orderbookId: string, resolution: string): void {\n const key = `${orderbookId}:${resolution}`;\n const history = this.priceHistories.get(key);\n if (history) {\n history.clear();\n }\n }\n\n /**\n * Clear all state.\n */\n clearAll(): void {\n this.orderbooks.clear();\n this.userStates.clear();\n this.priceHistories.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket client module for Lightcone.
|
|
3
|
+
*
|
|
4
|
+
* This module provides real-time data streaming functionality for
|
|
5
|
+
* live orderbook updates, trade notifications, and market events.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { websocket } from "@lightcone/sdk";
|
|
10
|
+
*
|
|
11
|
+
* const client = await websocket.LightconeWebSocketClient.connectDefault();
|
|
12
|
+
*
|
|
13
|
+
* client.on((event) => {
|
|
14
|
+
* if (event.type === "BookUpdate") {
|
|
15
|
+
* const book = client.getOrderbook(event.orderbookId);
|
|
16
|
+
* console.log("Best bid:", book?.bestBid());
|
|
17
|
+
* }
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* await client.subscribeBookUpdates(["market1:ob1"]);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module websocket
|
|
24
|
+
*/
|
|
25
|
+
export { LightconeWebSocketClient, DEFAULT_WS_URL, } from "./client";
|
|
26
|
+
export type { WebSocketConfig, ConnectionState, EventCallback, } from "./client";
|
|
27
|
+
export { WebSocketError } from "./error";
|
|
28
|
+
export type { WebSocketErrorVariant } from "./error";
|
|
29
|
+
export type { WsRequest, SubscribeParams, BookUpdateParams, TradesParams, UserParams, PriceHistoryParams, MarketParams, WsServerMessage, AuthData, WsMessage, BookUpdateData, PriceLevel, TradeData, UserEventData, Order, OrderUpdate, Balance, OutcomeBalance, BalanceEntry, PriceHistoryData, Candle, MarketEventData, MarketEventType, ErrorData, ErrorCode, PongData, WsEvent, MessageType, Side, PriceLevelSide, } from "./types";
|
|
30
|
+
export { createSubscribeRequest, createUnsubscribeRequest, createPingRequest, bookUpdateParams, tradesParams, userParams, priceHistoryParams, marketParams, toCandle, parseMarketEventType, parseErrorCode, parseMessageType, parseWsMessage, parseSide, sideToNumber, parsePriceLevelSide, } from "./types";
|
|
31
|
+
export { LocalOrderbook, UserState, PriceHistory, PriceHistoryKey } from "./state";
|
|
32
|
+
export { SubscriptionManager, subscriptionToParams, subscriptionType } from "./subscriptions";
|
|
33
|
+
export type { Subscription } from "./subscriptions";
|
|
34
|
+
export { MessageHandler } from "./handlers";
|
|
35
|
+
export { authenticate, generateSigninMessage, generateSigninMessageWithTimestamp, signMessage, } from "../auth";
|
|
36
|
+
export type { AuthCredentials } from "../auth";
|
|
37
|
+
export { DEFAULT_API_URL } from "../network";
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websocket/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EACL,wBAAwB,EACxB,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGrD,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,WAAW,EACX,OAAO,EACP,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,eAAe,EACf,eAAe,EACf,SAAS,EACT,SAAS,EACT,QAAQ,EACR,OAAO,EACP,WAAW,EACX,IAAI,EACJ,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,YAAY,EACZ,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kCAAkC,EAClC,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|