@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.
@@ -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
@@ -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":"AAAA,+DAA+D;AAmF/D,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,IAA+B;IAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,mCAAmC,CAAC,CAAA;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC5D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,OAAO,CAAC,KAAiD,EAAE,KAAa;IAC/E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAkD;IAClE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IACD,+EAA+E;IAC/E,+EAA+E;IAC/E,+EAA+E;IAC/E,sBAAsB;IACtB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,CAAC,CAAE,CAAA;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAwB;IAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAChC,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yCAAyC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,OAAO;QACL,EAAE;QACF,+BAA+B,EAAE,QAAQ,CAAC,GAAG,CAAC,mCAAmC,CAAC;QAClF,6BAA6B,EAAE,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAC7E,4BAA4B,EAAE,GAAG,CAAC,+BAA+B,IAAI,KAAK;QAC1E,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;QAChF,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;QAClF,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACtB,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACtB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;KACtB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,MAAM,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAA;IAC3B,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG,CAAC,KAAK,CAAA;IAChB,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AACvC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mCAAmC,CACjD,KAA6B;AAC7B,oEAAoE;AACpE,QAAqB;IAErB,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,CAAA;IACvC,IAAI,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAA;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAA;QAC5E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAA;QACvC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;QAE3E,qFAAqF;QACrF,sFAAsF;QACtF,uFAAuF;QACvF,4DAA4D;QAC5D,sFAAsF;QACtF,sFAAsF;QACtF,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,cAAc;eAC7D,MAAM,CAAC,qBAAqB,CAAC,SAAS;eACtC,KAAK,CAAC,SAAS,CAAA;QACpB,MAAM,WAAW,GAAG,CAClB,OAAO,cAAc,KAAK,QAAQ;eAC/B,OAAO,KAAK,CAAC,WAAW,EAAE,mCAAmC,KAAK,QAAQ,CAC9E;YACC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,mCAAmC;YACvD,CAAC,CAAC,cAAc,CAAA;QAElB,MAAM,EAAE,GAAG,OAAO;YAChB,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC;YACtC,CAAC,CAAC,QAAS,CAAA;QAEb,OAAO;YACL,EAAE;YACF,+BAA+B,EAAE,QAAQ,CAAC,WAAW,CAAC;YACtD,6BAA6B,EAAE,SAAS;YACxC,4BAA4B,EAAE,QAAQ;YACtC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;YACnF,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;YAChE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACzD,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACzD,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;SACpD,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAA2B;AAC3B,6EAA6E;AAC7E,cAAwC;IAExC,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,mCAAmC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACnE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACb,eAAe,KAAK,CAAC,QAAQ,8BAA8B,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK;sBAC9E,iDAAiD,CACpD,CAAA;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,OAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,uBAAuB,MAAM,EAAE,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA+B,CAAA;QAC1D,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,qBAAqB,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA+B,CAAA;IAC1D,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAAe,EACf,MAAgB,EAChB,cAAwC;IAExC,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAqBD,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,gBAAoC,KAAK;IAEzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IACzD,GAAG,CAAC,QAAQ,GAAG,iBAAiB,aAAa,EAAE,CAAA;IAC/C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAA;IACf,GAAG,CAAC,IAAI,GAAG,EAAE,CAAA;IACb,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;AACvB,CAAC;AAoBD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAiB5B,YAAY,OAAe,EAAE,OAAmC;QAVxD,OAAE,GAAqB,IAAI,CAAA;QAC3B,mBAAc,GAAyB,IAAI,CAAA;QAC3C,mBAAc,GAAyC,IAAI,CAAA;QAC3D,cAAS,GAA0C,IAAI,CAAA;QACvD,iBAAY,GAAG,KAAK,CAAA;QAEX,kBAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;QACzC,mBAAc,GAAG,IAAI,GAAG,EAA4B,CAAA;QACpD,oBAAe,GAAG,IAAI,GAAG,EAA6B,CAAA;QAGrE,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,KAAK,CAAA;QACrD,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,sBAAsB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;QAC7E,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAA;QACnD,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAA;QACzD,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAM,CAAA;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IAC1D,CAAC;IAED,mDAAmD;IACnD,OAAO;QACL,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;YAEZ,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,CAAC,SAAS,EAAE,CAAA;gBAChB,IAAI,CAAC,cAAc,EAAE,CAAA;gBACrB,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YAED,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;gBACvE,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACtF,CAAC,CAAA;YAED,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACnD,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACrD,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACxC,CAAC,CAAC,CAAA;YACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChC,IAAI,CAAC,QAAQ,EAAE,CAAA;gBACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;gBACd,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;gBAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,cAAc,EAAE,CAAA;QACrB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;IAC5B,CAAC;IAED;;;OAGG;IACH,SAAS,CACP,MAAgB,EAChB,QAAkC;QAElC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEjC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;YACnD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACpC,CAAC,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,WAAW,CAAC,MAAgB,EAAE,QAAmC;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;YAC3C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;YACzD,CAAC;YACD,OAAM;QACR,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAkC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC,CAAA;IACH,CAAC;IAEO,YAAY,CAAC,MAAgB;QACnC,MAAM,SAAS,GAAa,EAAE,CAAA;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YACxC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,eAAe,CAAC,MAAgB;QACtC,MAAM,aAAa,GAAa,EAAE,CAAA;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAChC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC;iBACI,CAAC;gBACJ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC;IAEO,cAAc;QACpB,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1B,OAAO,aAAa,CAAA;IACtB,CAAC;IAEO,IAAI,CAAC,OAAiC;QAC5C,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAM;QACR,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACvC,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC3B,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC5B,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7B,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACzB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACvB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAiC;QACnD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,GAAW;QAC/B,IAAI,OAAiC,CAAA;QACrC,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAA;QACvD,CAAC;QACD,MAAM,CAAC;YACL,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,EAAE,EAAE,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAEzB,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACrC,MAAM,MAAM,GAAsB;gBAChC,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,MAAM,EAAE,OAAO,CAAC,IAAI;aACrB,CAAA;YACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zofai/zo-sdk",
3
3
  "type": "module",
4
- "version": "0.2.17",
4
+ "version": "0.2.18",
5
5
  "author": "zo",
6
6
  "exports": {
7
7
  ".": {
@@ -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 { IStorkUpdateData } from './storkClient'
44
- import { fetchStorkUpdateDataFromKronos } from './storkClient'
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
  */
@@ -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
+ }