@antseed/node 0.1.1 → 0.1.3

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.
Files changed (45) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +7 -5
  3. package/dist/discovery/announcer.d.ts +11 -0
  4. package/dist/discovery/announcer.d.ts.map +1 -1
  5. package/dist/discovery/announcer.js +103 -70
  6. package/dist/discovery/announcer.js.map +1 -1
  7. package/dist/discovery/http-metadata-resolver.d.ts +6 -0
  8. package/dist/discovery/http-metadata-resolver.d.ts.map +1 -1
  9. package/dist/discovery/http-metadata-resolver.js +32 -4
  10. package/dist/discovery/http-metadata-resolver.js.map +1 -1
  11. package/dist/discovery/index.d.ts +1 -1
  12. package/dist/discovery/index.d.ts.map +1 -1
  13. package/dist/discovery/index.js +1 -1
  14. package/dist/discovery/index.js.map +1 -1
  15. package/dist/discovery/metadata-codec.d.ts +4 -0
  16. package/dist/discovery/metadata-codec.d.ts.map +1 -1
  17. package/dist/discovery/metadata-codec.js +89 -0
  18. package/dist/discovery/metadata-codec.js.map +1 -1
  19. package/dist/discovery/metadata-validator.d.ts +3 -0
  20. package/dist/discovery/metadata-validator.d.ts.map +1 -1
  21. package/dist/discovery/metadata-validator.js +72 -0
  22. package/dist/discovery/metadata-validator.js.map +1 -1
  23. package/dist/discovery/peer-lookup.d.ts +1 -0
  24. package/dist/discovery/peer-lookup.d.ts.map +1 -1
  25. package/dist/discovery/peer-lookup.js +10 -25
  26. package/dist/discovery/peer-lookup.js.map +1 -1
  27. package/dist/discovery/peer-metadata.d.ts +4 -1
  28. package/dist/discovery/peer-metadata.d.ts.map +1 -1
  29. package/dist/discovery/peer-metadata.js +9 -1
  30. package/dist/discovery/peer-metadata.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/interfaces/seller-provider.d.ts +2 -0
  36. package/dist/interfaces/seller-provider.d.ts.map +1 -1
  37. package/dist/node.d.ts +11 -0
  38. package/dist/node.d.ts.map +1 -1
  39. package/dist/node.js +177 -69
  40. package/dist/node.js.map +1 -1
  41. package/dist/p2p/message-protocol.js +3 -3
  42. package/dist/p2p/message-protocol.js.map +1 -1
  43. package/dist/types/peer.d.ts +5 -0
  44. package/dist/types/peer.d.ts.map +1 -1
  45. package/package.json +1 -1
package/dist/node.d.ts CHANGED
@@ -33,6 +33,7 @@ export interface NodePaymentsConfig {
33
33
  }
34
34
  export interface NodeConfig {
35
35
  role: 'seller' | 'buyer';
36
+ displayName?: string;
36
37
  dataDir?: string;
37
38
  dhtPort?: number;
38
39
  signalingPort?: number;
@@ -41,6 +42,10 @@ export interface NodeConfig {
41
42
  port: number;
42
43
  }>;
43
44
  requestTimeoutMs?: number;
45
+ /** Maximum buffered body size (bytes) while reconstructing streaming responses. Default: 16 MiB. */
46
+ maxStreamBufferBytes?: number;
47
+ /** Maximum wall time allowed for a streaming response. Default: 5 minutes. */
48
+ maxStreamDurationMs?: number;
44
49
  /** Allow private/loopback IPs in DHT lookups. Default: false. Set true for local testing. */
45
50
  allowPrivateIPs?: boolean;
46
51
  /** Optional seller-side payment runtime wiring. */
@@ -69,6 +74,7 @@ export interface RequestStreamCallbacks {
69
74
  onResponseChunk?: (chunk: SerializedHttpResponseChunk) => void;
70
75
  }
71
76
  export declare class AntseedNode extends EventEmitter {
77
+ private static readonly _METADATA_REFRESH_DEBOUNCE_MS;
72
78
  private _config;
73
79
  private _identity;
74
80
  private _dht;
@@ -86,6 +92,8 @@ export declare class AntseedNode extends EventEmitter {
86
92
  private _balanceManager;
87
93
  private _escrowClient;
88
94
  private _paymentMuxes;
95
+ private _providerLoadCounts;
96
+ private _metadataRefreshTimer;
89
97
  /** Per-buyer session tracking: buyerPeerId → seller session state */
90
98
  private _sessions;
91
99
  private _settlementTimers;
@@ -185,5 +193,8 @@ export declare class AntseedNode extends EventEmitter {
185
193
  */
186
194
  private _endAllBuyerSessions;
187
195
  private _lookupResultToPeerInfo;
196
+ private _adjustProviderLoad;
197
+ private _scheduleMetadataRefresh;
198
+ private _unrefTimer;
188
199
  }
189
200
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
package/dist/node.js CHANGED
@@ -25,6 +25,7 @@ import { debugLog, debugWarn } from "./utils/debug.js";
25
25
  import { BuyerPaymentManager } from "./payments/buyer-payment-manager.js";
26
26
  import { identityToEvmAddress } from "./payments/evm/keypair.js";
27
27
  export class AntseedNode extends EventEmitter {
28
+ static _METADATA_REFRESH_DEBOUNCE_MS = 200;
28
29
  _config;
29
30
  _identity = null;
30
31
  _dht = null;
@@ -42,6 +43,8 @@ export class AntseedNode extends EventEmitter {
42
43
  _balanceManager = null;
43
44
  _escrowClient = null;
44
45
  _paymentMuxes = new Map();
46
+ _providerLoadCounts = new Map();
47
+ _metadataRefreshTimer = null;
45
48
  /** Per-buyer session tracking: buyerPeerId → seller session state */
46
49
  _sessions = new Map();
47
50
  _settlementTimers = new Map();
@@ -147,6 +150,11 @@ export class AntseedNode extends EventEmitter {
147
150
  clearTimeout(timer);
148
151
  }
149
152
  this._settlementTimers.clear();
153
+ if (this._metadataRefreshTimer) {
154
+ clearTimeout(this._metadataRefreshTimer);
155
+ this._metadataRefreshTimer = null;
156
+ }
157
+ this._providerLoadCounts.clear();
150
158
  // Remove NAT port mappings
151
159
  if (this._nat) {
152
160
  await this._nat.cleanup();
@@ -266,23 +274,39 @@ export class AntseedNode extends EventEmitter {
266
274
  const startTime = Date.now();
267
275
  return new Promise((resolve, reject) => {
268
276
  const timeoutMs = this._config.requestTimeoutMs ?? 30_000;
277
+ const maxStreamBufferBytes = Math.max(1, this._config.maxStreamBufferBytes ?? 16 * 1024 * 1024);
278
+ const maxStreamDurationMs = Math.max(1, this._config.maxStreamDurationMs ?? 5 * 60_000);
279
+ // Idle timeout for streaming: resets on each chunk so long-running
280
+ // streams (thinking models, large outputs) stay alive as long as
281
+ // data keeps flowing.
282
+ const streamIdleTimeoutMs = Math.max(timeoutMs, 60_000);
269
283
  let settled = false;
270
284
  let streamStarted = false;
285
+ let streamStartedAtMs = 0;
286
+ let streamBufferedBytes = 0;
271
287
  let streamStartResponse = null;
272
288
  const streamChunks = [];
273
- const timeout = setTimeout(() => {
274
- if (settled)
275
- return;
276
- settled = true;
277
- debugWarn(`[Node] Request ${req.requestId.slice(0, 8)} timed out after ${timeoutMs}ms`);
278
- mux.cancelProxyRequest(req.requestId);
279
- reject(new Error(`Request ${req.requestId} timed out`));
280
- }, timeoutMs);
289
+ let activeTimeout = null;
290
+ const resetTimeout = (ms) => {
291
+ if (activeTimeout)
292
+ clearTimeout(activeTimeout);
293
+ activeTimeout = setTimeout(() => {
294
+ if (settled)
295
+ return;
296
+ settled = true;
297
+ debugWarn(`[Node] Request ${req.requestId.slice(0, 8)} timed out after ${Date.now() - startTime}ms`);
298
+ mux.cancelProxyRequest(req.requestId);
299
+ reject(new Error(`Request ${req.requestId} timed out`));
300
+ }, ms);
301
+ };
302
+ // Initial timeout: wait for the first response frame.
303
+ resetTimeout(timeoutMs);
281
304
  const finish = (response) => {
282
305
  if (settled)
283
306
  return;
284
307
  settled = true;
285
- clearTimeout(timeout);
308
+ if (activeTimeout)
309
+ clearTimeout(activeTimeout);
286
310
  const cleaned = this._stripStreamingHeader(response);
287
311
  debugLog(`[Node] Response for ${req.requestId.slice(0, 8)}: status=${cleaned.statusCode} (${Date.now() - startTime}ms, ${cleaned.body.length}b)`);
288
312
  resolve(cleaned);
@@ -291,21 +315,46 @@ export class AntseedNode extends EventEmitter {
291
315
  if (settled)
292
316
  return;
293
317
  settled = true;
294
- clearTimeout(timeout);
318
+ if (activeTimeout)
319
+ clearTimeout(activeTimeout);
295
320
  reject(error);
296
321
  };
297
322
  mux.sendProxyRequest(req, (response, metadata) => {
323
+ if (settled)
324
+ return;
298
325
  if (metadata.streamingStart) {
299
326
  streamStarted = true;
327
+ streamStartedAtMs = Date.now();
328
+ streamBufferedBytes = 0;
300
329
  streamStartResponse = this._stripStreamingHeader(response);
330
+ // Switch to streaming idle timeout: resets on each chunk.
331
+ resetTimeout(streamIdleTimeoutMs);
301
332
  callbacks?.onResponseStart?.(streamStartResponse, { streaming: true });
302
333
  return;
303
334
  }
304
335
  callbacks?.onResponseStart?.(this._stripStreamingHeader(response), { streaming: false });
305
336
  finish(response);
306
337
  }, (chunk) => {
338
+ if (settled)
339
+ return;
307
340
  if (!streamStarted)
308
341
  return;
342
+ // Reset idle timeout on each chunk so streaming stays alive.
343
+ resetTimeout(streamIdleTimeoutMs);
344
+ if (Date.now() - streamStartedAtMs > maxStreamDurationMs) {
345
+ mux.cancelProxyRequest(req.requestId);
346
+ fail(new Error(`Stream ${req.requestId} exceeded max duration (${maxStreamDurationMs}ms)`));
347
+ return;
348
+ }
349
+ if (chunk.data.length > 0) {
350
+ const nextBufferedBytes = streamBufferedBytes + chunk.data.length;
351
+ if (nextBufferedBytes > maxStreamBufferBytes) {
352
+ mux.cancelProxyRequest(req.requestId);
353
+ fail(new Error(`Stream ${req.requestId} exceeded max buffered size (${maxStreamBufferBytes} bytes)`));
354
+ return;
355
+ }
356
+ streamBufferedBytes = nextBufferedBytes;
357
+ }
309
358
  callbacks?.onResponseChunk?.(chunk);
310
359
  if (chunk.data.length > 0) {
311
360
  streamChunks.push(chunk.data);
@@ -374,7 +423,16 @@ export class AntseedNode extends EventEmitter {
374
423
  _wireConnection(conn, peerId) {
375
424
  const decoder = new FrameDecoder();
376
425
  conn.on("message", (data) => {
377
- const frames = decoder.feed(data);
426
+ let frames;
427
+ try {
428
+ frames = decoder.feed(data);
429
+ }
430
+ catch (err) {
431
+ const message = err instanceof Error ? err.message : String(err);
432
+ debugWarn(`[Node] Failed to decode frame from ${peerId.slice(0, 12)}...: ${message}`);
433
+ conn.fail(err instanceof Error ? err : new Error(message));
434
+ return;
435
+ }
378
436
  const proxyMux = this._muxes.get(peerId);
379
437
  const paymentMux = this._paymentMuxes.get(peerId);
380
438
  for (const frame of frames) {
@@ -461,8 +519,10 @@ export class AntseedNode extends EventEmitter {
461
519
  providers: this._providers.map((p) => ({
462
520
  provider: p.name,
463
521
  models: p.models,
522
+ ...(p.modelCategories ? { modelCategories: { ...p.modelCategories } } : {}),
464
523
  maxConcurrency: p.maxConcurrency,
465
524
  })),
525
+ ...(this._config.displayName ? { displayName: this._config.displayName } : {}),
466
526
  region: "unknown",
467
527
  pricing: new Map(this._providers.map((p) => [
468
528
  p.name,
@@ -557,7 +617,10 @@ export class AntseedNode extends EventEmitter {
557
617
  });
558
618
  return;
559
619
  }
560
- const provider = this._providers.find((p) => p.models.some((m) => request.path.includes(m)) || this._providers.length === 1);
620
+ const requestedModel = this._extractRequestedModel(request);
621
+ const provider = this._providers.find((p) => p.models.length === 0
622
+ || (requestedModel && p.models.includes(requestedModel))
623
+ || this._providers.length === 1);
561
624
  if (!provider) {
562
625
  debugWarn(`[Node] No matching provider for ${request.path}`);
563
626
  mux.sendProxyResponse({
@@ -576,60 +639,66 @@ export class AntseedNode extends EventEmitter {
576
639
  let statusCode = 500;
577
640
  let responseBody = new Uint8Array(0);
578
641
  let streamedResponseStarted = false;
642
+ this._adjustProviderLoad(provider.name, 1);
579
643
  try {
580
- const response = await this._executeProviderRequest(provider, request, {
581
- onResponseStart: (streamResponseStart) => {
582
- streamedResponseStarted = true;
583
- statusCode = streamResponseStart.statusCode;
584
- mux.sendProxyResponse(streamResponseStart);
585
- },
586
- onResponseChunk: (chunk) => {
587
- if (!streamedResponseStarted)
588
- return;
589
- mux.sendProxyChunk(chunk);
590
- },
591
- });
592
- statusCode = response.statusCode;
593
- responseBody = response.body;
594
- debugLog(`[Node] Provider responded: status=${statusCode} (${Date.now() - startTime}ms, ${responseBody.length}b)`);
595
- if (!streamedResponseStarted) {
596
- mux.sendProxyResponse(response);
597
- }
598
- }
599
- catch (err) {
600
- const message = err instanceof Error ? err.message : "Internal error";
601
- debugWarn(`[Node] Provider error after ${Date.now() - startTime}ms: ${message}`);
602
- responseBody = new TextEncoder().encode(message);
603
- if (streamedResponseStarted) {
604
- mux.sendProxyChunk({
605
- requestId: request.requestId,
606
- data: new TextEncoder().encode(`event: error\ndata: ${message}\n\n`),
607
- done: false,
608
- });
609
- mux.sendProxyChunk({
610
- requestId: request.requestId,
611
- data: new Uint8Array(0),
612
- done: true,
644
+ try {
645
+ const response = await this._executeProviderRequest(provider, request, {
646
+ onResponseStart: (streamResponseStart) => {
647
+ streamedResponseStarted = true;
648
+ statusCode = streamResponseStart.statusCode;
649
+ mux.sendProxyResponse(streamResponseStart);
650
+ },
651
+ onResponseChunk: (chunk) => {
652
+ if (!streamedResponseStarted)
653
+ return;
654
+ mux.sendProxyChunk(chunk);
655
+ },
613
656
  });
657
+ statusCode = response.statusCode;
658
+ responseBody = response.body;
659
+ debugLog(`[Node] Provider responded: status=${statusCode} (${Date.now() - startTime}ms, ${responseBody.length}b)`);
660
+ if (!streamedResponseStarted) {
661
+ mux.sendProxyResponse(response);
662
+ }
614
663
  }
615
- else {
616
- statusCode = 500;
617
- mux.sendProxyResponse({
618
- requestId: request.requestId,
619
- statusCode: 500,
620
- headers: { "content-type": "text/plain" },
621
- body: responseBody,
622
- });
664
+ catch (err) {
665
+ const message = err instanceof Error ? err.message : "Internal error";
666
+ debugWarn(`[Node] Provider error after ${Date.now() - startTime}ms: ${message}`);
667
+ responseBody = new TextEncoder().encode(message);
668
+ if (streamedResponseStarted) {
669
+ mux.sendProxyChunk({
670
+ requestId: request.requestId,
671
+ data: new TextEncoder().encode(`event: error\ndata: ${message}\n\n`),
672
+ done: false,
673
+ });
674
+ mux.sendProxyChunk({
675
+ requestId: request.requestId,
676
+ data: new Uint8Array(0),
677
+ done: true,
678
+ });
679
+ }
680
+ else {
681
+ statusCode = 500;
682
+ mux.sendProxyResponse({
683
+ requestId: request.requestId,
684
+ statusCode: 500,
685
+ headers: { "content-type": "text/plain" },
686
+ body: responseBody,
687
+ });
688
+ }
689
+ }
690
+ // Record metering
691
+ const latencyMs = Date.now() - startTime;
692
+ const requestPricing = this._resolveProviderPricing(provider, request);
693
+ await this._recordMetering(buyerPeerId, provider.name, requestPricing, request, statusCode, latencyMs, request.body.length, responseBody.length);
694
+ // Generate bilateral receipt after each request if lock committed (Task 3)
695
+ const currentSession = this._sessions.get(buyerPeerId);
696
+ if (currentSession?.lockCommitted) {
697
+ await this._sendBilateralReceipt(buyerPeerId, currentSession, requestPricing, responseBody, paymentMux);
623
698
  }
624
699
  }
625
- // Record metering
626
- const latencyMs = Date.now() - startTime;
627
- const requestPricing = this._resolveProviderPricing(provider, request);
628
- await this._recordMetering(buyerPeerId, provider.name, requestPricing, request, statusCode, latencyMs, request.body.length, responseBody.length);
629
- // Generate bilateral receipt after each request if lock committed (Task 3)
630
- const currentSession = this._sessions.get(buyerPeerId);
631
- if (currentSession?.lockCommitted) {
632
- await this._sendBilateralReceipt(buyerPeerId, currentSession, requestPricing, responseBody, paymentMux);
700
+ finally {
701
+ this._adjustProviderLoad(provider.name, -1);
633
702
  }
634
703
  });
635
704
  this._muxes.set(buyerPeerId, mux);
@@ -1390,23 +1459,33 @@ export class AntseedNode extends EventEmitter {
1390
1459
  _lookupResultToPeerInfo(result) {
1391
1460
  const providers = result.metadata.providers.map((p) => p.provider);
1392
1461
  const firstProvider = result.metadata.providers[0];
1393
- const providerPricingEntries = Object.fromEntries(result.metadata.providers.map((p) => [
1394
- p.provider,
1395
- {
1462
+ const providerPricingEntries = {};
1463
+ const providerModelCategoryEntries = {};
1464
+ for (const providerAnnouncement of result.metadata.providers) {
1465
+ providerPricingEntries[providerAnnouncement.provider] = {
1396
1466
  defaults: {
1397
- inputUsdPerMillion: p.defaultPricing.inputUsdPerMillion,
1398
- outputUsdPerMillion: p.defaultPricing.outputUsdPerMillion,
1467
+ inputUsdPerMillion: providerAnnouncement.defaultPricing.inputUsdPerMillion,
1468
+ outputUsdPerMillion: providerAnnouncement.defaultPricing.outputUsdPerMillion,
1399
1469
  },
1400
- ...(p.modelPricing ? { models: { ...p.modelPricing } } : {}),
1401
- },
1402
- ]));
1470
+ ...(providerAnnouncement.modelPricing ? { models: { ...providerAnnouncement.modelPricing } } : {}),
1471
+ };
1472
+ if (providerAnnouncement.modelCategories && Object.keys(providerAnnouncement.modelCategories).length > 0) {
1473
+ providerModelCategoryEntries[providerAnnouncement.provider] = {
1474
+ models: Object.fromEntries(Object.entries(providerAnnouncement.modelCategories)
1475
+ .map(([model, categories]) => [model, [...categories]])),
1476
+ };
1477
+ }
1478
+ }
1403
1479
  const hasProviderPricing = Object.keys(providerPricingEntries).length > 0;
1480
+ const hasProviderModelCategories = Object.keys(providerModelCategoryEntries).length > 0;
1404
1481
  return {
1405
1482
  peerId: result.metadata.peerId,
1483
+ displayName: result.metadata.displayName,
1406
1484
  lastSeen: result.metadata.timestamp,
1407
1485
  providers,
1408
1486
  publicAddress: `${result.host}:${result.port}`,
1409
1487
  ...(hasProviderPricing ? { providerPricing: providerPricingEntries } : {}),
1488
+ ...(hasProviderModelCategories ? { providerModelCategories: providerModelCategoryEntries } : {}),
1410
1489
  defaultInputUsdPerMillion: firstProvider?.defaultPricing.inputUsdPerMillion,
1411
1490
  defaultOutputUsdPerMillion: firstProvider?.defaultPricing.outputUsdPerMillion,
1412
1491
  maxConcurrency: firstProvider?.maxConcurrency,
@@ -1418,6 +1497,35 @@ export class AntseedNode extends EventEmitter {
1418
1497
  trustScore: result.metadata.onChainReputation,
1419
1498
  };
1420
1499
  }
1500
+ _adjustProviderLoad(providerName, delta) {
1501
+ const nextLoad = Math.max(0, (this._providerLoadCounts.get(providerName) ?? 0) + delta);
1502
+ this._providerLoadCounts.set(providerName, nextLoad);
1503
+ if (!this._announcer)
1504
+ return;
1505
+ this._announcer.updateLoad(providerName, nextLoad);
1506
+ this._scheduleMetadataRefresh();
1507
+ }
1508
+ _scheduleMetadataRefresh() {
1509
+ if (!this._announcer || this._metadataRefreshTimer) {
1510
+ return;
1511
+ }
1512
+ const timer = setTimeout(() => {
1513
+ this._metadataRefreshTimer = null;
1514
+ const announcer = this._announcer;
1515
+ if (!announcer)
1516
+ return;
1517
+ void announcer.refreshMetadata().catch((err) => {
1518
+ debugWarn(`[Node] Failed to refresh metadata snapshot: ${err instanceof Error ? err.message : err}`);
1519
+ });
1520
+ }, AntseedNode._METADATA_REFRESH_DEBOUNCE_MS);
1521
+ this._metadataRefreshTimer = timer;
1522
+ this._unrefTimer(timer);
1523
+ }
1524
+ _unrefTimer(timer) {
1525
+ if (typeof timer.unref === "function") {
1526
+ timer.unref();
1527
+ }
1528
+ }
1421
1529
  }
1422
1530
  function concatChunks(chunks) {
1423
1531
  if (chunks.length === 0)