@lightconexyz/lightcone-sdk 0.2.0 → 0.2.2
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 +263 -34
- package/dist/auth/client.js.map +1 -1
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -0
- package/dist/client.js.map +1 -1
- package/dist/domain/admin/client.d.ts +3 -1
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +8 -0
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/admin/wire.d.ts +53 -4
- package/dist/domain/admin/wire.d.ts.map +1 -1
- package/dist/domain/admin/wire.js.map +1 -1
- package/dist/domain/deposit_price/client.d.ts +13 -0
- package/dist/domain/deposit_price/client.d.ts.map +1 -0
- package/dist/domain/deposit_price/client.js +28 -0
- package/dist/domain/deposit_price/client.js.map +1 -0
- package/dist/domain/deposit_price/index.d.ts +9 -0
- package/dist/domain/deposit_price/index.d.ts.map +1 -0
- package/dist/domain/deposit_price/index.js +20 -0
- package/dist/domain/deposit_price/index.js.map +1 -0
- package/dist/domain/deposit_price/state.d.ts +17 -0
- package/dist/domain/deposit_price/state.d.ts.map +1 -0
- package/dist/domain/deposit_price/state.js +45 -0
- package/dist/domain/deposit_price/state.js.map +1 -0
- package/dist/domain/deposit_price/wire.d.ts +36 -0
- package/dist/domain/deposit_price/wire.d.ts.map +1 -0
- package/dist/domain/deposit_price/wire.js +3 -0
- package/dist/domain/deposit_price/wire.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -1
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/notification/client.d.ts +13 -0
- package/dist/domain/notification/client.d.ts.map +1 -0
- package/dist/domain/notification/client.js +21 -0
- package/dist/domain/notification/client.js.map +1 -0
- package/dist/domain/notification/index.d.ts +51 -0
- package/dist/domain/notification/index.d.ts.map +1 -0
- package/dist/domain/notification/index.js +29 -0
- package/dist/domain/notification/index.js.map +1 -0
- package/dist/domain/order/client.d.ts +2 -1
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +10 -2
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/convert.js +3 -3
- package/dist/domain/order/convert.js.map +1 -1
- package/dist/domain/order/wire.d.ts +31 -25
- package/dist/domain/order/wire.d.ts.map +1 -1
- package/dist/domain/order/wire.js.map +1 -1
- package/dist/domain/orderbook/state.js +2 -2
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/orderbook/wire.d.ts +2 -0
- package/dist/domain/orderbook/wire.d.ts.map +1 -1
- package/dist/domain/orderbook/wire.js.map +1 -1
- package/dist/domain/position/wire.d.ts +7 -0
- package/dist/domain/position/wire.d.ts.map +1 -1
- package/dist/domain/position/wire.js.map +1 -1
- package/dist/domain/price_history/client.d.ts +2 -1
- package/dist/domain/price_history/client.d.ts.map +1 -1
- package/dist/domain/price_history/client.js +13 -2
- package/dist/domain/price_history/client.js.map +1 -1
- package/dist/domain/price_history/wire.d.ts +30 -7
- package/dist/domain/price_history/wire.d.ts.map +1 -1
- package/dist/domain/price_history/wire.js.map +1 -1
- package/dist/domain/trade/client.d.ts +1 -1
- package/dist/domain/trade/client.js +3 -3
- package/dist/domain/trade/client.js.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +3 -0
- package/dist/error.js.map +1 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +5 -4
- 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 +12 -5
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +8 -1
- package/dist/prelude.js.map +1 -1
- package/dist/privy/client.d.ts +4 -5
- package/dist/privy/client.d.ts.map +1 -1
- package/dist/privy/client.js +2 -11
- package/dist/privy/client.js.map +1 -1
- package/dist/privy/index.d.ts +41 -1
- package/dist/privy/index.d.ts.map +1 -1
- package/dist/privy/index.js +2 -0
- package/dist/privy/index.js.map +1 -1
- package/dist/program/accounts.d.ts +2 -4
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +2 -5
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/builder.d.ts +5 -13
- package/dist/program/builder.d.ts.map +1 -1
- package/dist/program/builder.js +9 -13
- package/dist/program/builder.js.map +1 -1
- package/dist/program/client.d.ts +8 -7
- package/dist/program/client.d.ts.map +1 -1
- package/dist/program/client.js +11 -12
- package/dist/program/client.js.map +1 -1
- package/dist/program/constants.js +1 -1
- package/dist/program/constants.js.map +1 -1
- package/dist/program/envelope.d.ts +7 -2
- package/dist/program/envelope.d.ts.map +1 -1
- package/dist/program/envelope.js +29 -21
- package/dist/program/envelope.js.map +1 -1
- package/dist/program/index.d.ts +3 -3
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +5 -3
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +31 -53
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +155 -216
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.d.ts +20 -19
- package/dist/program/orders.d.ts.map +1 -1
- package/dist/program/orders.js +34 -22
- package/dist/program/orders.js.map +1 -1
- package/dist/program/types.d.ts +23 -24
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +2 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/types.d.ts +10 -3
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +6 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/client.browser.d.ts +46 -0
- package/dist/ws/client.browser.d.ts.map +1 -0
- package/dist/ws/client.browser.js +245 -0
- package/dist/ws/client.browser.js.map +1 -0
- package/dist/ws/{client.d.ts → client.node.d.ts} +3 -2
- package/dist/ws/client.node.d.ts.map +1 -0
- package/dist/ws/{client.js → client.node.js} +3 -3
- package/dist/ws/client.node.js.map +1 -0
- package/dist/ws/index.d.ts +10 -1
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js +50 -2
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/subscriptions.d.ts +8 -0
- package/dist/ws/subscriptions.d.ts.map +1 -1
- package/dist/ws/subscriptions.js +5 -0
- package/dist/ws/subscriptions.js.map +1 -1
- package/dist/ws/types.d.ts +23 -0
- package/dist/ws/types.d.ts.map +1 -0
- package/dist/ws/types.js +3 -0
- package/dist/ws/types.js.map +1 -0
- package/package.json +10 -4
- package/dist/ws/client.d.ts.map +0 -1
- package/dist/ws/client.js.map +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WsClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Browser WebSocket client using native `globalThis.WebSocket`.
|
|
6
|
+
*
|
|
7
|
+
* Selected at build time via the `"browser"` field in package.json.
|
|
8
|
+
*/
|
|
9
|
+
const index_1 = require("./index");
|
|
10
|
+
const subscriptions_1 = require("./subscriptions");
|
|
11
|
+
class WsClient {
|
|
12
|
+
config;
|
|
13
|
+
socket;
|
|
14
|
+
reconnectAttempts = 0;
|
|
15
|
+
userInitiatedClose = false;
|
|
16
|
+
pingTimer;
|
|
17
|
+
pongTimer;
|
|
18
|
+
callbacks = [];
|
|
19
|
+
activeSubscriptions = [];
|
|
20
|
+
pendingMessages = [];
|
|
21
|
+
/**
|
|
22
|
+
* @param config - WebSocket configuration (url, reconnect settings, etc.)
|
|
23
|
+
* @param _authTokenRef - Ignored in browser builds. The browser automatically
|
|
24
|
+
* sends HTTP-only cookies with same-origin WebSocket
|
|
25
|
+
* connections, so manual token injection is unnecessary.
|
|
26
|
+
*/
|
|
27
|
+
constructor(config, _authTokenRef) {
|
|
28
|
+
this.config = { ...index_1.WS_DEFAULT_CONFIG, ...config };
|
|
29
|
+
}
|
|
30
|
+
async connect() {
|
|
31
|
+
if (this.socket && this.readyState() === index_1.ReadyState.Open) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
await this.connectInternal();
|
|
35
|
+
}
|
|
36
|
+
async disconnect() {
|
|
37
|
+
if (!this.socket) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.stopHeartbeat();
|
|
41
|
+
const socket = this.socket;
|
|
42
|
+
this.socket = undefined;
|
|
43
|
+
this.userInitiatedClose = true;
|
|
44
|
+
await new Promise((resolve) => {
|
|
45
|
+
socket.addEventListener("close", () => resolve(), { once: true });
|
|
46
|
+
socket.close(1000, "Client disconnect");
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
send(message) {
|
|
50
|
+
this.trackMessage(message);
|
|
51
|
+
if (!this.socket || this.readyState() !== index_1.ReadyState.Open) {
|
|
52
|
+
this.pendingMessages.push(message);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.socket.send(JSON.stringify(message));
|
|
56
|
+
}
|
|
57
|
+
subscribe(params) {
|
|
58
|
+
this.send({ method: "subscribe", params });
|
|
59
|
+
}
|
|
60
|
+
unsubscribe(params) {
|
|
61
|
+
this.send({ method: "unsubscribe", params });
|
|
62
|
+
}
|
|
63
|
+
isConnected() {
|
|
64
|
+
return this.readyState() === index_1.ReadyState.Open;
|
|
65
|
+
}
|
|
66
|
+
readyState() {
|
|
67
|
+
if (!this.socket) {
|
|
68
|
+
return index_1.ReadyState.Closed;
|
|
69
|
+
}
|
|
70
|
+
switch (this.socket.readyState) {
|
|
71
|
+
case WebSocket.CONNECTING:
|
|
72
|
+
return index_1.ReadyState.Connecting;
|
|
73
|
+
case WebSocket.OPEN:
|
|
74
|
+
return index_1.ReadyState.Open;
|
|
75
|
+
case WebSocket.CLOSING:
|
|
76
|
+
return index_1.ReadyState.Closing;
|
|
77
|
+
case WebSocket.CLOSED:
|
|
78
|
+
default:
|
|
79
|
+
return index_1.ReadyState.Closed;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
on(callback) {
|
|
83
|
+
this.callbacks.push(callback);
|
|
84
|
+
return () => {
|
|
85
|
+
this.callbacks = this.callbacks.filter((cb) => cb !== callback);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ── Internal ────────────────────────────────────────────────────────────
|
|
89
|
+
emit(event) {
|
|
90
|
+
for (const callback of this.callbacks) {
|
|
91
|
+
try {
|
|
92
|
+
callback(event);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.warn("WsClient: listener threw", err instanceof Error ? err.message : String(err));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
connectInternal() {
|
|
100
|
+
// Browser WebSocket automatically includes cookies for same-origin connections.
|
|
101
|
+
const socket = new WebSocket(this.config.url);
|
|
102
|
+
this.socket = socket;
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const onOpen = () => {
|
|
105
|
+
cleanup();
|
|
106
|
+
this.reconnectAttempts = 0;
|
|
107
|
+
this.startHeartbeat();
|
|
108
|
+
this.flushPendingMessages();
|
|
109
|
+
this.resubscribeAll();
|
|
110
|
+
this.emit({ type: "Connected" });
|
|
111
|
+
resolve();
|
|
112
|
+
};
|
|
113
|
+
const onError = (event) => {
|
|
114
|
+
cleanup();
|
|
115
|
+
reject(new Error(`WebSocket connection error: ${event.message ?? "unknown"}`));
|
|
116
|
+
};
|
|
117
|
+
const cleanup = () => {
|
|
118
|
+
socket.removeEventListener("open", onOpen);
|
|
119
|
+
socket.removeEventListener("error", onError);
|
|
120
|
+
};
|
|
121
|
+
socket.addEventListener("open", onOpen);
|
|
122
|
+
socket.addEventListener("error", onError);
|
|
123
|
+
// Persistent listeners (survive initial connection)
|
|
124
|
+
socket.addEventListener("message", (event) => {
|
|
125
|
+
this.handleIncoming(event.data);
|
|
126
|
+
});
|
|
127
|
+
socket.addEventListener("close", (event) => {
|
|
128
|
+
const manualClose = this.userInitiatedClose;
|
|
129
|
+
this.userInitiatedClose = false;
|
|
130
|
+
this.stopHeartbeat();
|
|
131
|
+
this.emit({ type: "Disconnected", code: event.code, reason: event.reason });
|
|
132
|
+
if (!manualClose) {
|
|
133
|
+
this.handleClose(event.code);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
handleIncoming(raw) {
|
|
139
|
+
let message;
|
|
140
|
+
try {
|
|
141
|
+
message = (0, index_1.parseMessageIn)(raw);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
this.emit({
|
|
145
|
+
type: "Error",
|
|
146
|
+
error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (message.type === "pong") {
|
|
151
|
+
this.resetPongTimeout();
|
|
152
|
+
}
|
|
153
|
+
this.emit({ type: "Message", message });
|
|
154
|
+
}
|
|
155
|
+
handleClose(code) {
|
|
156
|
+
if (!this.config.reconnect) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
160
|
+
this.emit({ type: "MaxReconnectReached" });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.reconnectAttempts += 1;
|
|
164
|
+
const isRateLimited = code === 1008;
|
|
165
|
+
const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);
|
|
166
|
+
setTimeout(() => {
|
|
167
|
+
void this.connectInternal().catch((error) => {
|
|
168
|
+
this.emit({
|
|
169
|
+
type: "Error",
|
|
170
|
+
error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
171
|
+
});
|
|
172
|
+
this.handleClose(1011);
|
|
173
|
+
});
|
|
174
|
+
}, backoffMs);
|
|
175
|
+
}
|
|
176
|
+
backoffDelayMs(attempt, isRateLimited) {
|
|
177
|
+
const exponent = Math.max(0, attempt - 1);
|
|
178
|
+
const raw = this.config.baseReconnectDelayMs * 2 ** exponent;
|
|
179
|
+
const jitter = Math.random() * raw;
|
|
180
|
+
const rateLimitPenalty = isRateLimited ? this.config.baseReconnectDelayMs : 0;
|
|
181
|
+
return Math.floor(Math.min(raw + jitter + rateLimitPenalty, 60_000));
|
|
182
|
+
}
|
|
183
|
+
startHeartbeat() {
|
|
184
|
+
this.stopHeartbeat();
|
|
185
|
+
this.pingTimer = setInterval(() => {
|
|
186
|
+
this.send((0, index_1.ping)());
|
|
187
|
+
this.resetPongTimeout();
|
|
188
|
+
}, this.config.pingIntervalMs);
|
|
189
|
+
}
|
|
190
|
+
stopHeartbeat() {
|
|
191
|
+
if (this.pingTimer) {
|
|
192
|
+
clearInterval(this.pingTimer);
|
|
193
|
+
this.pingTimer = undefined;
|
|
194
|
+
}
|
|
195
|
+
if (this.pongTimer) {
|
|
196
|
+
clearTimeout(this.pongTimer);
|
|
197
|
+
this.pongTimer = undefined;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
resetPongTimeout() {
|
|
201
|
+
if (this.pongTimer) {
|
|
202
|
+
clearTimeout(this.pongTimer);
|
|
203
|
+
}
|
|
204
|
+
this.pongTimer = setTimeout(() => {
|
|
205
|
+
if (this.socket && this.readyState() === index_1.ReadyState.Open) {
|
|
206
|
+
this.socket.close(4000, "Pong timeout");
|
|
207
|
+
}
|
|
208
|
+
}, this.config.pongTimeoutMs);
|
|
209
|
+
}
|
|
210
|
+
trackMessage(message) {
|
|
211
|
+
if (message.method === "subscribe") {
|
|
212
|
+
const key = (0, subscriptions_1.subscriptionKey)(message.params);
|
|
213
|
+
const existing = this.activeSubscriptions.find((params) => (0, subscriptions_1.subscriptionKey)(params) === key);
|
|
214
|
+
if (!existing) {
|
|
215
|
+
this.activeSubscriptions.push(message.params);
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (message.method === "unsubscribe") {
|
|
220
|
+
const next = this.activeSubscriptions.filter((params) => !(0, subscriptions_1.unsubscribeMatches)(params, message.params));
|
|
221
|
+
this.activeSubscriptions.length = 0;
|
|
222
|
+
this.activeSubscriptions.push(...next);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
flushPendingMessages() {
|
|
226
|
+
if (!this.socket || this.readyState() !== index_1.ReadyState.Open) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
while (this.pendingMessages.length > 0) {
|
|
230
|
+
const message = this.pendingMessages.shift();
|
|
231
|
+
if (!message) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
this.socket.send(JSON.stringify(message));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
resubscribeAll() {
|
|
238
|
+
for (const params of this.activeSubscriptions) {
|
|
239
|
+
this.pendingMessages.push({ method: "subscribe", params });
|
|
240
|
+
}
|
|
241
|
+
this.flushPendingMessages();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.WsClient = WsClient;
|
|
245
|
+
//# sourceMappingURL=client.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.browser.js","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Browser WebSocket client using native `globalThis.WebSocket`.\n *\n * Selected at build time via the `\"browser\"` field in package.json.\n */\nimport {\n parseMessageIn,\n ping,\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 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 /**\n * @param config - WebSocket configuration (url, reconnect settings, etc.)\n * @param _authTokenRef - Ignored in browser builds. The browser automatically\n * sends HTTP-only cookies with same-origin WebSocket\n * connections, so manual token injection is unnecessary.\n */\n constructor(config?: Partial<WsConfig>, _authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\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.addEventListener(\"close\", () => resolve(), { once: true });\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 switch (this.socket.readyState) {\n case WebSocket.CONNECTING:\n return ReadyState.Connecting;\n case WebSocket.OPEN:\n return ReadyState.Open;\n case WebSocket.CLOSING:\n return ReadyState.Closing;\n case WebSocket.CLOSED:\n default:\n return ReadyState.Closed;\n }\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 // ── Internal ────────────────────────────────────────────────────────────\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 connectInternal(): Promise<void> {\n // Browser WebSocket automatically includes cookies for same-origin connections.\n const socket = new WebSocket(this.config.url);\n this.socket = socket;\n\n return new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n cleanup();\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n };\n\n const onError = (event: Event): void => {\n cleanup();\n reject(new Error(`WebSocket connection error: ${(event as ErrorEvent).message ?? \"unknown\"}`));\n };\n\n const cleanup = (): void => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n\n // Persistent listeners (survive initial connection)\n socket.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleIncoming(event.data as string);\n });\n\n socket.addEventListener(\"close\", (event: CloseEvent) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code: event.code, reason: event.reason });\n if (!manualClose) {\n this.handleClose(event.code);\n }\n });\n });\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.resetPongTimeout();\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 (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.max(0, attempt - 1);\n const raw = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitter = Math.random() * raw;\n const rateLimitPenalty = isRateLimited ? this.config.baseReconnectDelayMs : 0;\n return Math.floor(Math.min(raw + jitter + rateLimitPenalty, 60_000));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.resetPongTimeout();\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 resetPongTimeout(): 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 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,6 +1,7 @@
|
|
|
1
1
|
import { ReadyState, type MessageOut, type WsConfig, type WsEvent } from "./index";
|
|
2
2
|
import { type SubscribeParams, type UnsubscribeParams } from "./subscriptions";
|
|
3
|
-
|
|
3
|
+
import type { IWsClient } from "./types";
|
|
4
|
+
export declare class WsClient implements IWsClient {
|
|
4
5
|
private readonly config;
|
|
5
6
|
private readonly authTokenRef?;
|
|
6
7
|
private socket?;
|
|
@@ -32,4 +33,4 @@ export declare class WsClient {
|
|
|
32
33
|
private flushPendingMessages;
|
|
33
34
|
private resubscribeAll;
|
|
34
35
|
}
|
|
35
|
-
//# sourceMappingURL=client.d.ts.map
|
|
36
|
+
//# sourceMappingURL=client.node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.node.d.ts","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;IAClE,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAOxB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlD,OAAO,CAAC,IAAI;YAUE,eAAe;IAwC7B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -77,8 +77,8 @@ class WsClient {
|
|
|
77
77
|
try {
|
|
78
78
|
callback(event);
|
|
79
79
|
}
|
|
80
|
-
catch {
|
|
81
|
-
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.warn("WsClient: listener threw", err instanceof Error ? err.message : String(err));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -223,4 +223,4 @@ class WsClient {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
exports.WsClient = WsClient;
|
|
226
|
-
//# sourceMappingURL=client.js.map
|
|
226
|
+
//# sourceMappingURL=client.node.js.map
|
|
@@ -0,0 +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 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 await new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\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 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\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.resetPongTimeout();\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 (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.max(0, attempt - 1);\n const raw = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitter = Math.random() * raw;\n const rateLimitPenalty = isRateLimited ? this.config.baseReconnectDelayMs : 0;\n return Math.floor(Math.min(raw + jitter + rateLimitPenalty, 60_000));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.resetPongTimeout();\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 resetPongTimeout(): 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 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"]}
|
package/dist/ws/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import type { DepositPrice } from "../domain/deposit_price";
|
|
1
2
|
import type { MarketEvent } from "../domain/market";
|
|
2
3
|
import type { AuthUpdate, UserUpdate } from "../domain/order";
|
|
3
4
|
import type { OrderBook, WsTickerData } from "../domain/orderbook";
|
|
4
5
|
import type { PriceHistory } from "../domain/price_history";
|
|
5
6
|
import type { WsTrade } from "../domain/trade";
|
|
6
7
|
import type { OrderBookId, PubkeyStr, Resolution } from "../shared";
|
|
7
|
-
export * from "./client";
|
|
8
|
+
export * from "./client.node";
|
|
8
9
|
export * from "./subscriptions";
|
|
10
|
+
export type { IWsClient } from "./types";
|
|
9
11
|
export type MessageOut = {
|
|
10
12
|
method: "subscribe";
|
|
11
13
|
params: import("./subscriptions").SubscribeParams;
|
|
@@ -51,6 +53,10 @@ export type MessageIn = {
|
|
|
51
53
|
type: "market";
|
|
52
54
|
version: number;
|
|
53
55
|
data: MarketEvent;
|
|
56
|
+
} | {
|
|
57
|
+
type: "deposit_price";
|
|
58
|
+
version: number;
|
|
59
|
+
data: DepositPrice;
|
|
54
60
|
};
|
|
55
61
|
export type Kind = MessageIn;
|
|
56
62
|
export interface WsError {
|
|
@@ -58,6 +64,7 @@ export interface WsError {
|
|
|
58
64
|
code?: string;
|
|
59
65
|
orderbook_id?: string;
|
|
60
66
|
wallet_address?: string;
|
|
67
|
+
deposit_asset?: string;
|
|
61
68
|
hint?: string;
|
|
62
69
|
details?: string;
|
|
63
70
|
}
|
|
@@ -105,5 +112,7 @@ export declare function subscribeTicker(orderbookIds: OrderBookId[]): MessageOut
|
|
|
105
112
|
export declare function unsubscribeTicker(orderbookIds: OrderBookId[]): MessageOut;
|
|
106
113
|
export declare function subscribeMarket(marketPubkey: PubkeyStr): MessageOut;
|
|
107
114
|
export declare function unsubscribeMarket(marketPubkey: PubkeyStr): MessageOut;
|
|
115
|
+
export declare function subscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut;
|
|
116
|
+
export declare function unsubscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut;
|
|
108
117
|
export declare function parseMessageIn(input: string): MessageIn;
|
|
109
118
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ws/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpE,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpE,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,OAAO,iBAAiB,EAAE,eAAe,CAAA;CAAE,GAC1E;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,OAAO,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,GAC9E;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC;AAE7B,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEpC,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAO/B,CAAC;AAEF,oBAAY,UAAU;IACpB,UAAU,IAAI;IACd,IAAI,IAAI;IACR,OAAO,IAAI;IACX,MAAM,IAAI;CACX;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAYxD;AAED,wBAAgB,IAAI,IAAI,UAAU,CAEjC;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQtE;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQxE;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQvE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQzE;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,SAAS,GAAG,UAAU,CAQlE;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,SAAS,GAAG,UAAU,CAQpE;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CAUlG;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CASpG;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQvE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAQzE;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,SAAS,GAAG,UAAU,CAQnE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,SAAS,GAAG,UAAU,CAQrE;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CAS9F;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CAShG;AAeD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAgBvD"}
|
package/dist/ws/index.js
CHANGED
|
@@ -29,9 +29,11 @@ exports.subscribeTicker = subscribeTicker;
|
|
|
29
29
|
exports.unsubscribeTicker = unsubscribeTicker;
|
|
30
30
|
exports.subscribeMarket = subscribeMarket;
|
|
31
31
|
exports.unsubscribeMarket = unsubscribeMarket;
|
|
32
|
+
exports.subscribeDepositPrice = subscribeDepositPrice;
|
|
33
|
+
exports.unsubscribeDepositPrice = unsubscribeDepositPrice;
|
|
32
34
|
exports.parseMessageIn = parseMessageIn;
|
|
33
35
|
const network_1 = require("../network");
|
|
34
|
-
__exportStar(require("./client"), exports);
|
|
36
|
+
__exportStar(require("./client.node"), exports);
|
|
35
37
|
__exportStar(require("./subscriptions"), exports);
|
|
36
38
|
exports.WS_DEFAULT_CONFIG = {
|
|
37
39
|
url: network_1.DEFAULT_WS_URL,
|
|
@@ -175,7 +177,53 @@ function unsubscribeMarket(marketPubkey) {
|
|
|
175
177
|
},
|
|
176
178
|
};
|
|
177
179
|
}
|
|
180
|
+
function subscribeDepositPrice(depositAsset, resolution) {
|
|
181
|
+
return {
|
|
182
|
+
method: "subscribe",
|
|
183
|
+
params: {
|
|
184
|
+
type: "deposit_price",
|
|
185
|
+
deposit_asset: depositAsset,
|
|
186
|
+
resolution,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function unsubscribeDepositPrice(depositAsset, resolution) {
|
|
191
|
+
return {
|
|
192
|
+
method: "unsubscribe",
|
|
193
|
+
params: {
|
|
194
|
+
type: "deposit_price",
|
|
195
|
+
deposit_asset: depositAsset,
|
|
196
|
+
resolution,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const VALID_MESSAGE_TYPES = new Set([
|
|
201
|
+
"book_update",
|
|
202
|
+
"pong",
|
|
203
|
+
"user",
|
|
204
|
+
"error",
|
|
205
|
+
"price_history",
|
|
206
|
+
"trades",
|
|
207
|
+
"auth",
|
|
208
|
+
"ticker",
|
|
209
|
+
"market",
|
|
210
|
+
"deposit_price",
|
|
211
|
+
]);
|
|
178
212
|
function parseMessageIn(input) {
|
|
179
|
-
|
|
213
|
+
const parsed = JSON.parse(input);
|
|
214
|
+
if (typeof parsed !== "object" || parsed === null || !("type" in parsed)) {
|
|
215
|
+
throw new Error(`Invalid WS message: missing "type" field`);
|
|
216
|
+
}
|
|
217
|
+
const obj = parsed;
|
|
218
|
+
if (typeof obj.type !== "string" || !VALID_MESSAGE_TYPES.has(obj.type)) {
|
|
219
|
+
throw new Error(`Invalid WS message type: "${String(obj.type)}"`);
|
|
220
|
+
}
|
|
221
|
+
if (!("version" in obj) || typeof obj.version !== "number") {
|
|
222
|
+
throw new Error(`Invalid WS message: missing or invalid "version" field`);
|
|
223
|
+
}
|
|
224
|
+
if (!("data" in obj) || typeof obj.data !== "object" || obj.data === null) {
|
|
225
|
+
throw new Error(`Invalid WS message: missing or invalid "data" field`);
|
|
226
|
+
}
|
|
227
|
+
return parsed;
|
|
180
228
|
}
|
|
181
229
|
//# sourceMappingURL=index.js.map
|
package/dist/ws/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MarketEvent } from \"../domain/market\";\nimport type { AuthUpdate, UserUpdate } from \"../domain/order\";\nimport type { OrderBook, WsTickerData } from \"../domain/orderbook\";\nimport type { PriceHistory } from \"../domain/price_history\";\nimport type { WsTrade } from \"../domain/trade\";\nimport { DEFAULT_WS_URL } from \"../network\";\nimport type { OrderBookId, PubkeyStr, Resolution } from \"../shared\";\n\nexport * from \"./client\";\nexport * from \"./subscriptions\";\n\nexport type MessageOut =\n | { method: \"subscribe\"; params: import(\"./subscriptions\").SubscribeParams }\n | { method: \"unsubscribe\"; params: import(\"./subscriptions\").UnsubscribeParams }\n | { method: \"ping\" };\n\nexport type MessageIn =\n | { type: \"book_update\"; version: number; data: OrderBook }\n | { type: \"pong\"; version: number; data: Record<string, never> }\n | { type: \"user\"; version: number; data: UserUpdate }\n | { type: \"error\"; version: number; data: WsError }\n | { type: \"price_history\"; version: number; data: PriceHistory }\n | { type: \"trades\"; version: number; data: WsTrade }\n | { type: \"auth\"; version: number; data: AuthUpdate }\n | { type: \"ticker\"; version: number; data: WsTickerData }\n | { type: \"market\"; version: number; data: MarketEvent };\n\nexport type Kind = MessageIn;\n\nexport interface WsError {\n error: string;\n code?: string;\n orderbook_id?: string;\n wallet_address?: string;\n hint?: string;\n details?: string;\n}\n\nexport type WsEvent =\n | { type: \"Message\"; message: MessageIn }\n | { type: \"Connected\" }\n | { type: \"Disconnected\"; code?: number; reason: string }\n | { type: \"Error\"; error: string }\n | { type: \"MaxReconnectReached\" };\n\nexport interface WsConfig {\n url: string;\n reconnect: boolean;\n maxReconnectAttempts: number;\n baseReconnectDelayMs: number;\n pingIntervalMs: number;\n pongTimeoutMs: number;\n}\n\nexport const WS_DEFAULT_CONFIG: WsConfig = {\n url: DEFAULT_WS_URL,\n reconnect: true,\n maxReconnectAttempts: 10,\n baseReconnectDelayMs: 1_000,\n pingIntervalMs: 30_000,\n pongTimeoutMs: 1_000,\n};\n\nexport enum ReadyState {\n Connecting = 0,\n Open = 1,\n Closing = 2,\n Closed = 3,\n}\n\nexport function readyStateFrom(value: number): ReadyState {\n switch (value) {\n case 0:\n return ReadyState.Connecting;\n case 1:\n return ReadyState.Open;\n case 2:\n return ReadyState.Closing;\n case 3:\n default:\n return ReadyState.Closed;\n }\n}\n\nexport function ping(): MessageOut {\n return { method: \"ping\" };\n}\n\nexport function subscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function unsubscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function subscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n include_ohlcv: false,\n },\n };\n}\n\nexport function unsubscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n },\n };\n}\n\nexport function subscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function unsubscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function parseMessageIn(input: string): MessageIn {\n return JSON.parse(input) as MessageIn;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA0EA,wCAYC;AAED,oBAEC;AAED,wCAQC;AAED,4CAQC;AAED,0CAQC;AAED,8CAQC;AAED,sCAQC;AAED,0CAQC;AAED,sDAUC;AAED,0DASC;AAED,0CAQC;AAED,8CAQC;AAED,0CAQC;AAED,8CAQC;AAED,sDASC;AAED,0DASC;AAeD,wCAgBC;AApQD,wCAA4C;AAG5C,gDAA8B;AAC9B,kDAAgC;AAgDnB,QAAA,iBAAiB,GAAa;IACzC,GAAG,EAAE,wBAAc;IACnB,SAAS,EAAE,IAAI;IACf,oBAAoB,EAAE,EAAE;IACxB,oBAAoB,EAAE,KAAK;IAC3B,cAAc,EAAE,MAAM;IACtB,aAAa,EAAE,KAAK;CACrB,CAAC;AAEF,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,uDAAc,CAAA;IACd,2CAAQ,CAAA;IACR,iDAAW,CAAA;IACX,+CAAU,CAAA;AACZ,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC,UAAU,CAAC;QAC/B,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC,IAAI,CAAC;QACzB,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,CAAC;QACP;YACE,OAAO,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAgB,IAAI;IAClB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAgB,cAAc,CAAC,YAA2B;IACxD,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,YAA2B;IAC1D,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,YAA2B;IACzD,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,YAA2B;IAC3D,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,aAAwB;IACpD,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,cAAc,EAAE,aAAa;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,aAAwB;IACtD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,cAAc,EAAE,aAAa;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,WAAwB,EAAE,UAAsB;IACpF,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE,WAAW;YACzB,UAAU;YACV,aAAa,EAAE,KAAK;SACrB;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,uBAAuB,CAAC,WAAwB,EAAE,UAAsB;IACtF,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE,WAAW;YACzB,UAAU;SACX;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,YAA2B;IACzD,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,YAA2B;IAC3D,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,YAAuB;IACrD,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,YAAuB;IACvD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,YAAY;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,YAAoB,EAAE,UAAsB;IAChF,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,aAAa,EAAE,YAAY;YAC3B,UAAU;SACX;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,uBAAuB,CAAC,YAAoB,EAAE,UAAsB;IAClF,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,aAAa,EAAE,YAAY;YAC3B,UAAU;SACX;KACF,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,aAAa;IACb,MAAM;IACN,MAAM;IACN,OAAO;IACP,eAAe;IACf,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,eAAe;CAChB,CAAC,CAAC;AAEH,SAAgB,cAAc,CAAC,KAAa;IAC1C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAmB,CAAC;AAC7B,CAAC","sourcesContent":["import type { DepositPrice } from \"../domain/deposit_price\";\nimport type { MarketEvent } from \"../domain/market\";\nimport type { AuthUpdate, UserUpdate } from \"../domain/order\";\nimport type { OrderBook, WsTickerData } from \"../domain/orderbook\";\nimport type { PriceHistory } from \"../domain/price_history\";\nimport type { WsTrade } from \"../domain/trade\";\nimport { DEFAULT_WS_URL } from \"../network\";\nimport type { OrderBookId, PubkeyStr, Resolution } from \"../shared\";\n\nexport * from \"./client.node\";\nexport * from \"./subscriptions\";\nexport type { IWsClient } from \"./types\";\n\nexport type MessageOut =\n | { method: \"subscribe\"; params: import(\"./subscriptions\").SubscribeParams }\n | { method: \"unsubscribe\"; params: import(\"./subscriptions\").UnsubscribeParams }\n | { method: \"ping\" };\n\nexport type MessageIn =\n | { type: \"book_update\"; version: number; data: OrderBook }\n | { type: \"pong\"; version: number; data: Record<string, never> }\n | { type: \"user\"; version: number; data: UserUpdate }\n | { type: \"error\"; version: number; data: WsError }\n | { type: \"price_history\"; version: number; data: PriceHistory }\n | { type: \"trades\"; version: number; data: WsTrade }\n | { type: \"auth\"; version: number; data: AuthUpdate }\n | { type: \"ticker\"; version: number; data: WsTickerData }\n | { type: \"market\"; version: number; data: MarketEvent }\n | { type: \"deposit_price\"; version: number; data: DepositPrice };\n\nexport type Kind = MessageIn;\n\nexport interface WsError {\n error: string;\n code?: string;\n orderbook_id?: string;\n wallet_address?: string;\n deposit_asset?: string;\n hint?: string;\n details?: string;\n}\n\nexport type WsEvent =\n | { type: \"Message\"; message: MessageIn }\n | { type: \"Connected\" }\n | { type: \"Disconnected\"; code?: number; reason: string }\n | { type: \"Error\"; error: string }\n | { type: \"MaxReconnectReached\" };\n\nexport interface WsConfig {\n url: string;\n reconnect: boolean;\n maxReconnectAttempts: number;\n baseReconnectDelayMs: number;\n pingIntervalMs: number;\n pongTimeoutMs: number;\n}\n\nexport const WS_DEFAULT_CONFIG: WsConfig = {\n url: DEFAULT_WS_URL,\n reconnect: true,\n maxReconnectAttempts: 10,\n baseReconnectDelayMs: 1_000,\n pingIntervalMs: 30_000,\n pongTimeoutMs: 1_000,\n};\n\nexport enum ReadyState {\n Connecting = 0,\n Open = 1,\n Closing = 2,\n Closed = 3,\n}\n\nexport function readyStateFrom(value: number): ReadyState {\n switch (value) {\n case 0:\n return ReadyState.Connecting;\n case 1:\n return ReadyState.Open;\n case 2:\n return ReadyState.Closing;\n case 3:\n default:\n return ReadyState.Closed;\n }\n}\n\nexport function ping(): MessageOut {\n return { method: \"ping\" };\n}\n\nexport function subscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function unsubscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function subscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n include_ohlcv: false,\n },\n };\n}\n\nexport function unsubscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n },\n };\n}\n\nexport function subscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function unsubscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function subscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nexport function unsubscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nconst VALID_MESSAGE_TYPES = new Set([\n \"book_update\",\n \"pong\",\n \"user\",\n \"error\",\n \"price_history\",\n \"trades\",\n \"auth\",\n \"ticker\",\n \"market\",\n \"deposit_price\",\n]);\n\nexport function parseMessageIn(input: string): MessageIn {\n const parsed: unknown = JSON.parse(input);\n if (typeof parsed !== \"object\" || parsed === null || !(\"type\" in parsed)) {\n throw new Error(`Invalid WS message: missing \"type\" field`);\n }\n const obj = parsed as Record<string, unknown>;\n if (typeof obj.type !== \"string\" || !VALID_MESSAGE_TYPES.has(obj.type)) {\n throw new Error(`Invalid WS message type: \"${String(obj.type)}\"`);\n }\n if (!(\"version\" in obj) || typeof obj.version !== \"number\") {\n throw new Error(`Invalid WS message: missing or invalid \"version\" field`);\n }\n if (!(\"data\" in obj) || typeof obj.data !== \"object\" || obj.data === null) {\n throw new Error(`Invalid WS message: missing or invalid \"data\" field`);\n }\n return parsed as MessageIn;\n}\n"]}
|
|
@@ -19,6 +19,10 @@ export type SubscribeParams = {
|
|
|
19
19
|
} | {
|
|
20
20
|
type: "market";
|
|
21
21
|
market_pubkey: PubkeyStr;
|
|
22
|
+
} | {
|
|
23
|
+
type: "deposit_price";
|
|
24
|
+
deposit_asset: string;
|
|
25
|
+
resolution: Resolution;
|
|
22
26
|
};
|
|
23
27
|
export type UnsubscribeParams = {
|
|
24
28
|
type: "book_update";
|
|
@@ -39,6 +43,10 @@ export type UnsubscribeParams = {
|
|
|
39
43
|
} | {
|
|
40
44
|
type: "market";
|
|
41
45
|
market_pubkey: PubkeyStr;
|
|
46
|
+
} | {
|
|
47
|
+
type: "deposit_price";
|
|
48
|
+
deposit_asset: string;
|
|
49
|
+
resolution: Resolution;
|
|
42
50
|
};
|
|
43
51
|
export interface Subscription {
|
|
44
52
|
toSubscribeParams(): SubscribeParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../src/ws/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,SAAS,CAAA;CAAE,GAC3C;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,SAAS,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../src/ws/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,SAAS,CAAA;CAAE,GAC3C;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,SAAS,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,SAAS,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,SAAS,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,iBAAiB,IAAI,eAAe,CAAC;IACrC,mBAAmB,IAAI,iBAAiB,CAAC;IACzC,kBAAkB,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAC5D,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiB/D;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CA2BT"}
|
package/dist/ws/subscriptions.js
CHANGED
|
@@ -16,6 +16,8 @@ function subscriptionKey(params) {
|
|
|
16
16
|
return `ticker:${idsKey(params.orderbook_ids)}`;
|
|
17
17
|
case "market":
|
|
18
18
|
return `market:${params.market_pubkey}`;
|
|
19
|
+
case "deposit_price":
|
|
20
|
+
return `deposit_price:${params.deposit_asset}:${params.resolution}`;
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
function unsubscribeMatches(subscribe, unsubscribe) {
|
|
@@ -36,6 +38,9 @@ function unsubscribeMatches(subscribe, unsubscribe) {
|
|
|
36
38
|
subscribe.resolution === unsubscribe.resolution);
|
|
37
39
|
case "market":
|
|
38
40
|
return subscribe.market_pubkey === unsubscribe.market_pubkey;
|
|
41
|
+
case "deposit_price":
|
|
42
|
+
return (subscribe.deposit_asset === unsubscribe.deposit_asset &&
|
|
43
|
+
subscribe.resolution === unsubscribe.resolution);
|
|
39
44
|
}
|
|
40
45
|
}
|
|
41
46
|
function idsKey(ids) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/ws/subscriptions.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/ws/subscriptions.ts"],"names":[],"mappings":";;AAgCA,0CAiBC;AAED,gDA8BC;AAjDD,SAAgB,eAAe,CAAC,MAAuB;IACrD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,UAAU,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,CAAC,cAAc,EAAE,CAAC;QACzC,KAAK,eAAe;YAClB,OAAO,iBAAiB,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACrE,KAAK,QAAQ;YACX,OAAO,UAAU,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAClD,KAAK,QAAQ;YACX,OAAO,UAAU,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1C,KAAK,eAAe;YAClB,OAAO,iBAAiB,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAChC,SAA0B,EAC1B,WAA8B;IAE9B,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,MAAM,CAAE,WAAgD,CAAC,aAAa,CAAC,CAAC;QACrH,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,MAAM,CAAE,WAAgD,CAAC,aAAa,CAAC,CAAC;QACrH,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,MAAM,CAAE,WAAgD,CAAC,aAAa,CAAC,CAAC;QACrH,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,cAAc,KAAM,WAA6C,CAAC,cAAc,CAAC;QACpG,KAAK,eAAe;YAClB,OAAO,CACL,SAAS,CAAC,YAAY,KAAM,WAA6C,CAAC,YAAY;gBACtF,SAAS,CAAC,UAAU,KAAM,WAA0C,CAAC,UAAU,CAChF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,aAAa,KAAM,WAA4C,CAAC,aAAa,CAAC;QACjG,KAAK,eAAe;YAClB,OAAO,CACL,SAAS,CAAC,aAAa,KAAM,WAAyC,CAAC,aAAa;gBACpF,SAAS,CAAC,UAAU,KAAM,WAA0C,CAAC,UAAU,CAChF,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,GAAsB;IACpC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { OrderBookId, PubkeyStr, Resolution } from \"../shared\";\n\nexport type SubscribeParams =\n | { type: \"book_update\"; orderbook_ids: OrderBookId[] }\n | { type: \"trades\"; orderbook_ids: OrderBookId[] }\n | { type: \"user\"; wallet_address: PubkeyStr }\n | {\n type: \"price_history\";\n orderbook_id: OrderBookId;\n resolution: Resolution;\n include_ohlcv?: boolean;\n }\n | { type: \"ticker\"; orderbook_ids: OrderBookId[] }\n | { type: \"market\"; market_pubkey: PubkeyStr }\n | { type: \"deposit_price\"; deposit_asset: string; resolution: Resolution };\n\nexport type UnsubscribeParams =\n | { type: \"book_update\"; orderbook_ids: OrderBookId[] }\n | { type: \"trades\"; orderbook_ids: OrderBookId[] }\n | { type: \"user\"; wallet_address: PubkeyStr }\n | { type: \"price_history\"; orderbook_id: OrderBookId; resolution: Resolution }\n | { type: \"ticker\"; orderbook_ids: OrderBookId[] }\n | { type: \"market\"; market_pubkey: PubkeyStr }\n | { type: \"deposit_price\"; deposit_asset: string; resolution: Resolution };\n\nexport interface Subscription {\n toSubscribeParams(): SubscribeParams;\n toUnsubscribeParams(): UnsubscribeParams;\n matchesUnsubscribe(unsubscribe: UnsubscribeParams): boolean;\n subscriptionKey(): string;\n}\n\nexport function subscriptionKey(params: SubscribeParams): string {\n switch (params.type) {\n case \"book_update\":\n return `book:${idsKey(params.orderbook_ids)}`;\n case \"trades\":\n return `trades:${idsKey(params.orderbook_ids)}`;\n case \"user\":\n return `user:${params.wallet_address}`;\n case \"price_history\":\n return `price_history:${params.orderbook_id}:${params.resolution}`;\n case \"ticker\":\n return `ticker:${idsKey(params.orderbook_ids)}`;\n case \"market\":\n return `market:${params.market_pubkey}`;\n case \"deposit_price\":\n return `deposit_price:${params.deposit_asset}:${params.resolution}`;\n }\n}\n\nexport function unsubscribeMatches(\n subscribe: SubscribeParams,\n unsubscribe: UnsubscribeParams\n): boolean {\n if (subscribe.type !== unsubscribe.type) {\n return false;\n }\n\n switch (subscribe.type) {\n case \"book_update\":\n return idsKey(subscribe.orderbook_ids) === idsKey((unsubscribe as { orderbook_ids: OrderBookId[] }).orderbook_ids);\n case \"trades\":\n return idsKey(subscribe.orderbook_ids) === idsKey((unsubscribe as { orderbook_ids: OrderBookId[] }).orderbook_ids);\n case \"ticker\":\n return idsKey(subscribe.orderbook_ids) === idsKey((unsubscribe as { orderbook_ids: OrderBookId[] }).orderbook_ids);\n case \"user\":\n return subscribe.wallet_address === (unsubscribe as { wallet_address: PubkeyStr }).wallet_address;\n case \"price_history\":\n return (\n subscribe.orderbook_id === (unsubscribe as { orderbook_id: OrderBookId }).orderbook_id &&\n subscribe.resolution === (unsubscribe as { resolution: Resolution }).resolution\n );\n case \"market\":\n return subscribe.market_pubkey === (unsubscribe as { market_pubkey: PubkeyStr }).market_pubkey;\n case \"deposit_price\":\n return (\n subscribe.deposit_asset === (unsubscribe as { deposit_asset: string }).deposit_asset &&\n subscribe.resolution === (unsubscribe as { resolution: Resolution }).resolution\n );\n }\n}\n\nfunction idsKey(ids: readonly string[]): string {\n return [...ids].sort().join(\",\");\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MessageOut, ReadyState, WsEvent } from "./index";
|
|
2
|
+
import type { SubscribeParams, UnsubscribeParams } from "./subscriptions";
|
|
3
|
+
/**
|
|
4
|
+
* Shared interface for WebSocket clients.
|
|
5
|
+
*
|
|
6
|
+
* Two implementations exist:
|
|
7
|
+
* - `client.node.ts` — Node.js, backed by the `ws` npm module
|
|
8
|
+
* - `client.browser.ts` — Browser, backed by native `globalThis.WebSocket`
|
|
9
|
+
*
|
|
10
|
+
* The active implementation is selected at build time via the `"browser"`
|
|
11
|
+
* field in package.json.
|
|
12
|
+
*/
|
|
13
|
+
export interface IWsClient {
|
|
14
|
+
connect(): Promise<void>;
|
|
15
|
+
disconnect(): Promise<void>;
|
|
16
|
+
send(message: MessageOut): void;
|
|
17
|
+
subscribe(params: SubscribeParams): void;
|
|
18
|
+
unsubscribe(params: UnsubscribeParams): void;
|
|
19
|
+
isConnected(): boolean;
|
|
20
|
+
readyState(): ReadyState;
|
|
21
|
+
on(callback: (event: WsEvent) => void): () => void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|