@zofai/zo-sdk 0.2.17 → 0.2.18
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/dist/interfaces/base.d.cts +9 -0
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +9 -0
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/oracle.cjs +19 -0
- package/dist/oracle.cjs.map +1 -1
- package/dist/oracle.d.cts +14 -1
- package/dist/oracle.d.cts.map +1 -1
- package/dist/oracle.d.mts +14 -1
- package/dist/oracle.d.mts.map +1 -1
- package/dist/oracle.mjs +20 -1
- package/dist/oracle.mjs.map +1 -1
- package/dist/storkClient.cjs +230 -0
- package/dist/storkClient.cjs.map +1 -1
- package/dist/storkClient.d.cts +89 -0
- package/dist/storkClient.d.cts.map +1 -1
- package/dist/storkClient.d.mts +89 -0
- package/dist/storkClient.d.mts.map +1 -1
- package/dist/storkClient.mjs +227 -0
- package/dist/storkClient.mjs.map +1 -1
- package/package.json +1 -1
- package/src/interfaces/base.ts +17 -0
- package/src/oracle.ts +35 -2
- package/src/storkClient.ts +308 -0
- package/tests/storkClient.test.ts +88 -0
package/dist/storkClient.mjs
CHANGED
|
@@ -205,4 +205,231 @@ export async function fetchStorkUpdateDataFromKronos(baseUrl, assets, assetIdByA
|
|
|
205
205
|
}
|
|
206
206
|
return updates;
|
|
207
207
|
}
|
|
208
|
+
/** Derive ws(s):// stream URL from kronos http(s) base URL. */
|
|
209
|
+
export function apiBaseUrlToStorkWsUrl(baseUrl, signatureType = 'evm') {
|
|
210
|
+
const url = new URL(baseUrl);
|
|
211
|
+
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
212
|
+
url.pathname = `/stork/stream/${signatureType}`;
|
|
213
|
+
url.search = '';
|
|
214
|
+
url.hash = '';
|
|
215
|
+
return url.toString();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* WebSocket client for kronos `/stork/stream/{evm|stark}`.
|
|
219
|
+
* Multiplexes asset subscriptions and re-subscribes after reconnect.
|
|
220
|
+
*/
|
|
221
|
+
export class StorkStreamClient {
|
|
222
|
+
constructor(baseUrl, options) {
|
|
223
|
+
this.ws = null;
|
|
224
|
+
this.connectPromise = null;
|
|
225
|
+
this.reconnectTimer = null;
|
|
226
|
+
this.pingTimer = null;
|
|
227
|
+
this.closedByUser = false;
|
|
228
|
+
this.assetRefCount = new Map();
|
|
229
|
+
this.updateHandlers = new Set();
|
|
230
|
+
this.messageHandlers = new Set();
|
|
231
|
+
const signatureType = options?.signatureType ?? 'evm';
|
|
232
|
+
this.wsUrl = options?.wsUrl ?? apiBaseUrlToStorkWsUrl(baseUrl, signatureType);
|
|
233
|
+
this.autoReconnect = options?.autoReconnect ?? true;
|
|
234
|
+
this.reconnectDelayMs = options?.reconnectDelayMs ?? 1000;
|
|
235
|
+
this.pingIntervalMs = options?.pingIntervalMs ?? 30000;
|
|
236
|
+
this.WebSocketImpl = options?.WebSocketImpl ?? WebSocket;
|
|
237
|
+
}
|
|
238
|
+
/** Open the WebSocket and wait for socket open. */
|
|
239
|
+
connect() {
|
|
240
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
241
|
+
return Promise.resolve();
|
|
242
|
+
}
|
|
243
|
+
if (this.connectPromise) {
|
|
244
|
+
return this.connectPromise;
|
|
245
|
+
}
|
|
246
|
+
this.closedByUser = false;
|
|
247
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
248
|
+
const ws = new this.WebSocketImpl(this.wsUrl);
|
|
249
|
+
this.ws = ws;
|
|
250
|
+
const onOpen = () => {
|
|
251
|
+
this.startPing();
|
|
252
|
+
this.resubscribeAll();
|
|
253
|
+
resolve();
|
|
254
|
+
};
|
|
255
|
+
const onError = () => {
|
|
256
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
257
|
+
reject(new Error(`Stork WebSocket connection failed: ${this.wsUrl}`));
|
|
258
|
+
}
|
|
259
|
+
this.emitMessage({ type: 'error', message: `Stork WebSocket error: ${this.wsUrl}` });
|
|
260
|
+
};
|
|
261
|
+
ws.addEventListener('open', onOpen, { once: true });
|
|
262
|
+
ws.addEventListener('error', onError, { once: true });
|
|
263
|
+
ws.addEventListener('message', (event) => {
|
|
264
|
+
this.handleMessage(String(event.data));
|
|
265
|
+
});
|
|
266
|
+
ws.addEventListener('close', () => {
|
|
267
|
+
this.stopPing();
|
|
268
|
+
this.ws = null;
|
|
269
|
+
this.connectPromise = null;
|
|
270
|
+
if (!this.closedByUser && this.autoReconnect) {
|
|
271
|
+
this.scheduleReconnect();
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
return this.connectPromise;
|
|
276
|
+
}
|
|
277
|
+
disconnect() {
|
|
278
|
+
this.closedByUser = true;
|
|
279
|
+
this.clearReconnect();
|
|
280
|
+
this.stopPing();
|
|
281
|
+
if (this.ws) {
|
|
282
|
+
this.ws.close();
|
|
283
|
+
this.ws = null;
|
|
284
|
+
}
|
|
285
|
+
this.connectPromise = null;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Subscribe to live Stork price updates for asset symbols (e.g. `BTCUSD`).
|
|
289
|
+
* Returns an unsubscribe function.
|
|
290
|
+
*/
|
|
291
|
+
subscribe(assets, onUpdate) {
|
|
292
|
+
if (assets.length === 0) {
|
|
293
|
+
throw new Error('assets is required');
|
|
294
|
+
}
|
|
295
|
+
const newAssets = this.addAssetRefs(assets);
|
|
296
|
+
this.updateHandlers.add(onUpdate);
|
|
297
|
+
void this.connect().then(() => {
|
|
298
|
+
if (newAssets.length > 0) {
|
|
299
|
+
this.send({ type: 'subscribe', data: newAssets });
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
return () => {
|
|
303
|
+
this.unsubscribe(assets, onUpdate);
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/** Remove one handler; unsubscribe upstream assets when no handlers remain. */
|
|
307
|
+
unsubscribe(assets, onUpdate) {
|
|
308
|
+
if (onUpdate) {
|
|
309
|
+
this.updateHandlers.delete(onUpdate);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
this.updateHandlers.clear();
|
|
313
|
+
}
|
|
314
|
+
if (this.updateHandlers.size === 0) {
|
|
315
|
+
const removedAssets = this.clearAssetRefs();
|
|
316
|
+
if (removedAssets.length > 0 && this.ws?.readyState === WebSocket.OPEN) {
|
|
317
|
+
this.send({ type: 'unsubscribe', data: removedAssets });
|
|
318
|
+
}
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
const removedAssets = this.removeAssetRefs(assets);
|
|
322
|
+
if (removedAssets.length > 0 && this.ws?.readyState === WebSocket.OPEN) {
|
|
323
|
+
this.send({ type: 'unsubscribe', data: removedAssets });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
onMessage(handler) {
|
|
327
|
+
this.messageHandlers.add(handler);
|
|
328
|
+
return () => {
|
|
329
|
+
this.messageHandlers.delete(handler);
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
addAssetRefs(assets) {
|
|
333
|
+
const newAssets = [];
|
|
334
|
+
for (const asset of assets) {
|
|
335
|
+
const count = this.assetRefCount.get(asset) ?? 0;
|
|
336
|
+
this.assetRefCount.set(asset, count + 1);
|
|
337
|
+
if (count === 0) {
|
|
338
|
+
newAssets.push(asset);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return newAssets;
|
|
342
|
+
}
|
|
343
|
+
removeAssetRefs(assets) {
|
|
344
|
+
const removedAssets = [];
|
|
345
|
+
for (const asset of assets) {
|
|
346
|
+
const count = this.assetRefCount.get(asset);
|
|
347
|
+
if (count === undefined) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
if (count <= 1) {
|
|
351
|
+
this.assetRefCount.delete(asset);
|
|
352
|
+
removedAssets.push(asset);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
this.assetRefCount.set(asset, count - 1);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return removedAssets;
|
|
359
|
+
}
|
|
360
|
+
clearAssetRefs() {
|
|
361
|
+
const removedAssets = [...this.assetRefCount.keys()];
|
|
362
|
+
this.assetRefCount.clear();
|
|
363
|
+
return removedAssets;
|
|
364
|
+
}
|
|
365
|
+
send(message) {
|
|
366
|
+
if (this.ws?.readyState !== WebSocket.OPEN) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
this.ws.send(JSON.stringify(message));
|
|
370
|
+
}
|
|
371
|
+
resubscribeAll() {
|
|
372
|
+
const assets = [...this.assetRefCount.keys()];
|
|
373
|
+
if (assets.length > 0) {
|
|
374
|
+
this.send({ type: 'subscribe', data: assets });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
scheduleReconnect() {
|
|
378
|
+
if (this.reconnectTimer) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
this.reconnectTimer = setTimeout(() => {
|
|
382
|
+
this.reconnectTimer = null;
|
|
383
|
+
void this.connect().catch(() => {
|
|
384
|
+
this.scheduleReconnect();
|
|
385
|
+
});
|
|
386
|
+
}, this.reconnectDelayMs);
|
|
387
|
+
}
|
|
388
|
+
clearReconnect() {
|
|
389
|
+
if (this.reconnectTimer) {
|
|
390
|
+
clearTimeout(this.reconnectTimer);
|
|
391
|
+
this.reconnectTimer = null;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
startPing() {
|
|
395
|
+
if (this.pingIntervalMs <= 0) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
this.stopPing();
|
|
399
|
+
this.pingTimer = setInterval(() => {
|
|
400
|
+
this.send({ type: 'ping' });
|
|
401
|
+
}, this.pingIntervalMs);
|
|
402
|
+
}
|
|
403
|
+
stopPing() {
|
|
404
|
+
if (this.pingTimer) {
|
|
405
|
+
clearInterval(this.pingTimer);
|
|
406
|
+
this.pingTimer = null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
emitMessage(message) {
|
|
410
|
+
for (const handler of this.messageHandlers) {
|
|
411
|
+
handler(message);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
handleMessage(raw) {
|
|
415
|
+
let message;
|
|
416
|
+
try {
|
|
417
|
+
message = JSON.parse(raw);
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
this.emitMessage({ type: 'error', message: `Invalid JSON: ${raw}` });
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
this.emitMessage(message);
|
|
424
|
+
if (message.type === 'oracle_prices') {
|
|
425
|
+
const update = {
|
|
426
|
+
traceId: message.trace_id,
|
|
427
|
+
prices: message.data,
|
|
428
|
+
};
|
|
429
|
+
for (const handler of this.updateHandlers) {
|
|
430
|
+
handler(update);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
208
435
|
//# sourceMappingURL=storkClient.mjs.map
|
package/dist/storkClient.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storkClient.mjs","sourceRoot":"","sources":["../src/storkClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storkClient.mjs","sourceRoot":"","sources":["../src/storkClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/interfaces/base.ts
CHANGED
|
@@ -17,6 +17,11 @@ import type {
|
|
|
17
17
|
PythProStreamClient,
|
|
18
18
|
PythProStreamUpdate,
|
|
19
19
|
} from '../pythProClient'
|
|
20
|
+
import type {
|
|
21
|
+
IStorkStreamClientOptions,
|
|
22
|
+
StorkStreamClient,
|
|
23
|
+
StorkStreamUpdate,
|
|
24
|
+
} from '../storkClient'
|
|
20
25
|
import type { SuiClient } from '../suiClient'
|
|
21
26
|
|
|
22
27
|
// Common data interfaces
|
|
@@ -354,6 +359,18 @@ export interface IBaseDataAPI {
|
|
|
354
359
|
subscriptionId?: number,
|
|
355
360
|
) => Promise<() => void>
|
|
356
361
|
|
|
362
|
+
/** kronos WebSocket client for `/stork/stream/{evm|stark}`. Requires apiEndpoint. */
|
|
363
|
+
createStorkStreamClient: (
|
|
364
|
+
options?: IStorkStreamClientOptions & { kronosUrl?: string },
|
|
365
|
+
) => StorkStreamClient
|
|
366
|
+
|
|
367
|
+
/** Live Stork prices via kronos WebSocket. Requires apiEndpoint. */
|
|
368
|
+
subStorkPricesForTokens: (
|
|
369
|
+
tokens: string[],
|
|
370
|
+
onUpdate: (update: StorkStreamUpdate) => void,
|
|
371
|
+
options?: IStorkStreamClientOptions & { kronosUrl?: string },
|
|
372
|
+
) => Promise<() => void>
|
|
373
|
+
|
|
357
374
|
// Utility methods
|
|
358
375
|
validateCache: () => void
|
|
359
376
|
}
|
package/src/oracle.ts
CHANGED
|
@@ -40,8 +40,15 @@ import {
|
|
|
40
40
|
getLatestPythProPrices,
|
|
41
41
|
PythProStreamClient,
|
|
42
42
|
} from './pythProClient'
|
|
43
|
-
import type {
|
|
44
|
-
|
|
43
|
+
import type {
|
|
44
|
+
IStorkStreamClientOptions,
|
|
45
|
+
IStorkUpdateData,
|
|
46
|
+
StorkStreamUpdate,
|
|
47
|
+
} from './storkClient'
|
|
48
|
+
import {
|
|
49
|
+
fetchStorkUpdateDataFromKronos,
|
|
50
|
+
StorkStreamClient,
|
|
51
|
+
} from './storkClient'
|
|
45
52
|
import {
|
|
46
53
|
appendStorkUpdatesToTransaction,
|
|
47
54
|
estimateStorkUpdateFeeMist,
|
|
@@ -352,6 +359,12 @@ export class OracleAPI {
|
|
|
352
359
|
return new PythProStreamClient(this.resolveKronosUrl(kronosUrl))
|
|
353
360
|
}
|
|
354
361
|
|
|
362
|
+
/** WebSocket client for kronos `/stork/stream/{evm|stark}`. */
|
|
363
|
+
createStorkStreamClient(options?: IStorkStreamClientOptions & { kronosUrl?: string }): StorkStreamClient {
|
|
364
|
+
const { kronosUrl, ...clientOptions } = options ?? {}
|
|
365
|
+
return new StorkStreamClient(this.resolveKronosUrl(kronosUrl), clientOptions)
|
|
366
|
+
}
|
|
367
|
+
|
|
355
368
|
/**
|
|
356
369
|
* Subscribe to live Pyth Pro prices for SDK tokens via kronos WebSocket.
|
|
357
370
|
* Returns unsubscribe (closes subscription; disconnect the client separately if unused).
|
|
@@ -375,6 +388,26 @@ export class OracleAPI {
|
|
|
375
388
|
)
|
|
376
389
|
}
|
|
377
390
|
|
|
391
|
+
/**
|
|
392
|
+
* Subscribe to live Stork prices for SDK tokens via kronos WebSocket.
|
|
393
|
+
* Tokens without a Stork feeder in zo-oracle config are skipped.
|
|
394
|
+
* Returns unsubscribe (disconnect the client separately if unused).
|
|
395
|
+
*/
|
|
396
|
+
async subStorkPricesForTokens(
|
|
397
|
+
tokens: string[],
|
|
398
|
+
onUpdate: (update: StorkStreamUpdate) => void,
|
|
399
|
+
options?: IStorkStreamClientOptions & { kronosUrl?: string },
|
|
400
|
+
): Promise<() => void> {
|
|
401
|
+
const assets = this.resolveStorkAssetsForTokens(tokens)
|
|
402
|
+
if (assets.length === 0) {
|
|
403
|
+
throw new Error(`No Stork assets configured for tokens: ${tokens.join(', ')}`)
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const client = this.createStorkStreamClient(options)
|
|
407
|
+
await client.connect()
|
|
408
|
+
return client.subscribe(assets, onUpdate)
|
|
409
|
+
}
|
|
410
|
+
|
|
378
411
|
/**
|
|
379
412
|
* Fetch leEcdsa update bytes covering all tokens' Pyth Lazer feed ids via kronos REST.
|
|
380
413
|
*/
|
package/src/storkClient.ts
CHANGED
|
@@ -326,3 +326,311 @@ export async function fetchStorkUpdateDataFromKronos(
|
|
|
326
326
|
}
|
|
327
327
|
return updates
|
|
328
328
|
}
|
|
329
|
+
|
|
330
|
+
export type StorkSignatureType = 'evm' | 'stark'
|
|
331
|
+
|
|
332
|
+
export interface StorkStreamUpdate {
|
|
333
|
+
traceId?: string
|
|
334
|
+
/** Stork asset symbol (e.g. `BTCUSD`) → kronos price entry. */
|
|
335
|
+
prices: Record<string, IStorkKronosPriceEntry>
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export type StorkStreamServerMessage
|
|
339
|
+
= | { type: 'connected', message?: string }
|
|
340
|
+
| { type: 'oracle_prices', trace_id?: string, data: Record<string, IStorkKronosPriceEntry> }
|
|
341
|
+
| { type: 'error', message?: string }
|
|
342
|
+
| { type: 'pong' }
|
|
343
|
+
|
|
344
|
+
export type StorkStreamClientMessage
|
|
345
|
+
= | { type: 'subscribe', data: string[] }
|
|
346
|
+
| { type: 'unsubscribe', data: string[] }
|
|
347
|
+
| { type: 'ping' }
|
|
348
|
+
|
|
349
|
+
/** Derive ws(s):// stream URL from kronos http(s) base URL. */
|
|
350
|
+
export function apiBaseUrlToStorkWsUrl(
|
|
351
|
+
baseUrl: string,
|
|
352
|
+
signatureType: StorkSignatureType = 'evm',
|
|
353
|
+
): string {
|
|
354
|
+
const url = new URL(baseUrl)
|
|
355
|
+
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
356
|
+
url.pathname = `/stork/stream/${signatureType}`
|
|
357
|
+
url.search = ''
|
|
358
|
+
url.hash = ''
|
|
359
|
+
return url.toString()
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export interface IStorkStreamClientOptions {
|
|
363
|
+
/** Defaults to `evm` (`/stork/stream/evm`). Use `stark` for StarkEx-native signatures. */
|
|
364
|
+
signatureType?: StorkSignatureType
|
|
365
|
+
/** Defaults to apiBaseUrlToStorkWsUrl(baseUrl, signatureType). */
|
|
366
|
+
wsUrl?: string
|
|
367
|
+
/** Reconnect after disconnect. Default true. */
|
|
368
|
+
autoReconnect?: boolean
|
|
369
|
+
/** Initial reconnect delay in ms. Default 1000. */
|
|
370
|
+
reconnectDelayMs?: number
|
|
371
|
+
/** Ping interval in ms. Default 30000. Set 0 to disable. */
|
|
372
|
+
pingIntervalMs?: number
|
|
373
|
+
/** Custom WebSocket constructor (Node test mocks, etc.). */
|
|
374
|
+
WebSocketImpl?: typeof WebSocket
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
type StorkStreamUpdateHandler = (update: StorkStreamUpdate) => void
|
|
378
|
+
type StorkStreamMessageHandler = (message: StorkStreamServerMessage) => void
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* WebSocket client for kronos `/stork/stream/{evm|stark}`.
|
|
382
|
+
* Multiplexes asset subscriptions and re-subscribes after reconnect.
|
|
383
|
+
*/
|
|
384
|
+
export class StorkStreamClient {
|
|
385
|
+
private readonly wsUrl: string
|
|
386
|
+
private readonly autoReconnect: boolean
|
|
387
|
+
private readonly reconnectDelayMs: number
|
|
388
|
+
private readonly pingIntervalMs: number
|
|
389
|
+
private readonly WebSocketImpl: typeof WebSocket
|
|
390
|
+
|
|
391
|
+
private ws: WebSocket | null = null
|
|
392
|
+
private connectPromise: Promise<void> | null = null
|
|
393
|
+
private reconnectTimer: ReturnType<typeof setTimeout> | null = null
|
|
394
|
+
private pingTimer: ReturnType<typeof setInterval> | null = null
|
|
395
|
+
private closedByUser = false
|
|
396
|
+
|
|
397
|
+
private readonly assetRefCount = new Map<string, number>()
|
|
398
|
+
private readonly updateHandlers = new Set<StorkStreamUpdateHandler>()
|
|
399
|
+
private readonly messageHandlers = new Set<StorkStreamMessageHandler>()
|
|
400
|
+
|
|
401
|
+
constructor(baseUrl: string, options?: IStorkStreamClientOptions) {
|
|
402
|
+
const signatureType = options?.signatureType ?? 'evm'
|
|
403
|
+
this.wsUrl = options?.wsUrl ?? apiBaseUrlToStorkWsUrl(baseUrl, signatureType)
|
|
404
|
+
this.autoReconnect = options?.autoReconnect ?? true
|
|
405
|
+
this.reconnectDelayMs = options?.reconnectDelayMs ?? 1000
|
|
406
|
+
this.pingIntervalMs = options?.pingIntervalMs ?? 30_000
|
|
407
|
+
this.WebSocketImpl = options?.WebSocketImpl ?? WebSocket
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Open the WebSocket and wait for socket open. */
|
|
411
|
+
connect(): Promise<void> {
|
|
412
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
413
|
+
return Promise.resolve()
|
|
414
|
+
}
|
|
415
|
+
if (this.connectPromise) {
|
|
416
|
+
return this.connectPromise
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
this.closedByUser = false
|
|
420
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
421
|
+
const ws = new this.WebSocketImpl(this.wsUrl)
|
|
422
|
+
this.ws = ws
|
|
423
|
+
|
|
424
|
+
const onOpen = () => {
|
|
425
|
+
this.startPing()
|
|
426
|
+
this.resubscribeAll()
|
|
427
|
+
resolve()
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const onError = () => {
|
|
431
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
432
|
+
reject(new Error(`Stork WebSocket connection failed: ${this.wsUrl}`))
|
|
433
|
+
}
|
|
434
|
+
this.emitMessage({ type: 'error', message: `Stork WebSocket error: ${this.wsUrl}` })
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
ws.addEventListener('open', onOpen, { once: true })
|
|
438
|
+
ws.addEventListener('error', onError, { once: true })
|
|
439
|
+
ws.addEventListener('message', (event) => {
|
|
440
|
+
this.handleMessage(String(event.data))
|
|
441
|
+
})
|
|
442
|
+
ws.addEventListener('close', () => {
|
|
443
|
+
this.stopPing()
|
|
444
|
+
this.ws = null
|
|
445
|
+
this.connectPromise = null
|
|
446
|
+
if (!this.closedByUser && this.autoReconnect) {
|
|
447
|
+
this.scheduleReconnect()
|
|
448
|
+
}
|
|
449
|
+
})
|
|
450
|
+
})
|
|
451
|
+
|
|
452
|
+
return this.connectPromise
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
disconnect(): void {
|
|
456
|
+
this.closedByUser = true
|
|
457
|
+
this.clearReconnect()
|
|
458
|
+
this.stopPing()
|
|
459
|
+
if (this.ws) {
|
|
460
|
+
this.ws.close()
|
|
461
|
+
this.ws = null
|
|
462
|
+
}
|
|
463
|
+
this.connectPromise = null
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Subscribe to live Stork price updates for asset symbols (e.g. `BTCUSD`).
|
|
468
|
+
* Returns an unsubscribe function.
|
|
469
|
+
*/
|
|
470
|
+
subscribe(
|
|
471
|
+
assets: string[],
|
|
472
|
+
onUpdate: StorkStreamUpdateHandler,
|
|
473
|
+
): () => void {
|
|
474
|
+
if (assets.length === 0) {
|
|
475
|
+
throw new Error('assets is required')
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const newAssets = this.addAssetRefs(assets)
|
|
479
|
+
this.updateHandlers.add(onUpdate)
|
|
480
|
+
|
|
481
|
+
void this.connect().then(() => {
|
|
482
|
+
if (newAssets.length > 0) {
|
|
483
|
+
this.send({ type: 'subscribe', data: newAssets })
|
|
484
|
+
}
|
|
485
|
+
})
|
|
486
|
+
|
|
487
|
+
return () => {
|
|
488
|
+
this.unsubscribe(assets, onUpdate)
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** Remove one handler; unsubscribe upstream assets when no handlers remain. */
|
|
493
|
+
unsubscribe(assets: string[], onUpdate?: StorkStreamUpdateHandler): void {
|
|
494
|
+
if (onUpdate) {
|
|
495
|
+
this.updateHandlers.delete(onUpdate)
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
this.updateHandlers.clear()
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if (this.updateHandlers.size === 0) {
|
|
502
|
+
const removedAssets = this.clearAssetRefs()
|
|
503
|
+
if (removedAssets.length > 0 && this.ws?.readyState === WebSocket.OPEN) {
|
|
504
|
+
this.send({ type: 'unsubscribe', data: removedAssets })
|
|
505
|
+
}
|
|
506
|
+
return
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const removedAssets = this.removeAssetRefs(assets)
|
|
510
|
+
if (removedAssets.length > 0 && this.ws?.readyState === WebSocket.OPEN) {
|
|
511
|
+
this.send({ type: 'unsubscribe', data: removedAssets })
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
onMessage(handler: StorkStreamMessageHandler): () => void {
|
|
516
|
+
this.messageHandlers.add(handler)
|
|
517
|
+
return () => {
|
|
518
|
+
this.messageHandlers.delete(handler)
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
private addAssetRefs(assets: string[]): string[] {
|
|
523
|
+
const newAssets: string[] = []
|
|
524
|
+
for (const asset of assets) {
|
|
525
|
+
const count = this.assetRefCount.get(asset) ?? 0
|
|
526
|
+
this.assetRefCount.set(asset, count + 1)
|
|
527
|
+
if (count === 0) {
|
|
528
|
+
newAssets.push(asset)
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return newAssets
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
private removeAssetRefs(assets: string[]): string[] {
|
|
535
|
+
const removedAssets: string[] = []
|
|
536
|
+
for (const asset of assets) {
|
|
537
|
+
const count = this.assetRefCount.get(asset)
|
|
538
|
+
if (count === undefined) {
|
|
539
|
+
continue
|
|
540
|
+
}
|
|
541
|
+
if (count <= 1) {
|
|
542
|
+
this.assetRefCount.delete(asset)
|
|
543
|
+
removedAssets.push(asset)
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
this.assetRefCount.set(asset, count - 1)
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
return removedAssets
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
private clearAssetRefs(): string[] {
|
|
553
|
+
const removedAssets = [...this.assetRefCount.keys()]
|
|
554
|
+
this.assetRefCount.clear()
|
|
555
|
+
return removedAssets
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
private send(message: StorkStreamClientMessage): void {
|
|
559
|
+
if (this.ws?.readyState !== WebSocket.OPEN) {
|
|
560
|
+
return
|
|
561
|
+
}
|
|
562
|
+
this.ws.send(JSON.stringify(message))
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
private resubscribeAll(): void {
|
|
566
|
+
const assets = [...this.assetRefCount.keys()]
|
|
567
|
+
if (assets.length > 0) {
|
|
568
|
+
this.send({ type: 'subscribe', data: assets })
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
private scheduleReconnect(): void {
|
|
573
|
+
if (this.reconnectTimer) {
|
|
574
|
+
return
|
|
575
|
+
}
|
|
576
|
+
this.reconnectTimer = setTimeout(() => {
|
|
577
|
+
this.reconnectTimer = null
|
|
578
|
+
void this.connect().catch(() => {
|
|
579
|
+
this.scheduleReconnect()
|
|
580
|
+
})
|
|
581
|
+
}, this.reconnectDelayMs)
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
private clearReconnect(): void {
|
|
585
|
+
if (this.reconnectTimer) {
|
|
586
|
+
clearTimeout(this.reconnectTimer)
|
|
587
|
+
this.reconnectTimer = null
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
private startPing(): void {
|
|
592
|
+
if (this.pingIntervalMs <= 0) {
|
|
593
|
+
return
|
|
594
|
+
}
|
|
595
|
+
this.stopPing()
|
|
596
|
+
this.pingTimer = setInterval(() => {
|
|
597
|
+
this.send({ type: 'ping' })
|
|
598
|
+
}, this.pingIntervalMs)
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
private stopPing(): void {
|
|
602
|
+
if (this.pingTimer) {
|
|
603
|
+
clearInterval(this.pingTimer)
|
|
604
|
+
this.pingTimer = null
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
private emitMessage(message: StorkStreamServerMessage): void {
|
|
609
|
+
for (const handler of this.messageHandlers) {
|
|
610
|
+
handler(message)
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
private handleMessage(raw: string): void {
|
|
615
|
+
let message: StorkStreamServerMessage
|
|
616
|
+
try {
|
|
617
|
+
message = JSON.parse(raw) as StorkStreamServerMessage
|
|
618
|
+
}
|
|
619
|
+
catch {
|
|
620
|
+
this.emitMessage({ type: 'error', message: `Invalid JSON: ${raw}` })
|
|
621
|
+
return
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
this.emitMessage(message)
|
|
625
|
+
|
|
626
|
+
if (message.type === 'oracle_prices') {
|
|
627
|
+
const update: StorkStreamUpdate = {
|
|
628
|
+
traceId: message.trace_id,
|
|
629
|
+
prices: message.data,
|
|
630
|
+
}
|
|
631
|
+
for (const handler of this.updateHandlers) {
|
|
632
|
+
handler(update)
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|