@antseed/node 0.2.27 → 0.2.28

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 (234) hide show
  1. package/README.md +14 -13
  2. package/dist/buyer-request-handler.d.ts +41 -0
  3. package/dist/buyer-request-handler.d.ts.map +1 -0
  4. package/dist/buyer-request-handler.js +254 -0
  5. package/dist/buyer-request-handler.js.map +1 -0
  6. package/dist/discovery/announcer.d.ts +5 -4
  7. package/dist/discovery/announcer.d.ts.map +1 -1
  8. package/dist/discovery/announcer.js +11 -18
  9. package/dist/discovery/announcer.js.map +1 -1
  10. package/dist/discovery/index.d.ts +0 -1
  11. package/dist/discovery/index.d.ts.map +1 -1
  12. package/dist/discovery/index.js +0 -1
  13. package/dist/discovery/index.js.map +1 -1
  14. package/dist/discovery/metadata-codec.d.ts +2 -2
  15. package/dist/discovery/metadata-codec.d.ts.map +1 -1
  16. package/dist/discovery/metadata-codec.js +47 -72
  17. package/dist/discovery/metadata-codec.js.map +1 -1
  18. package/dist/discovery/metadata-validator.js +6 -6
  19. package/dist/discovery/metadata-validator.js.map +1 -1
  20. package/dist/discovery/peer-lookup.d.ts.map +1 -1
  21. package/dist/discovery/peer-lookup.js +1 -2
  22. package/dist/discovery/peer-lookup.js.map +1 -1
  23. package/dist/discovery/peer-metadata.d.ts +3 -5
  24. package/dist/discovery/peer-metadata.d.ts.map +1 -1
  25. package/dist/discovery/peer-metadata.js +1 -1
  26. package/dist/discovery/reputation-verifier.d.ts +2 -25
  27. package/dist/discovery/reputation-verifier.d.ts.map +1 -1
  28. package/dist/discovery/reputation-verifier.js +2 -48
  29. package/dist/discovery/reputation-verifier.js.map +1 -1
  30. package/dist/discovery/stats-verifier.d.ts +27 -0
  31. package/dist/discovery/stats-verifier.d.ts.map +1 -0
  32. package/dist/discovery/stats-verifier.js +38 -0
  33. package/dist/discovery/stats-verifier.js.map +1 -0
  34. package/dist/index.d.ts +10 -7
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/metering/index.d.ts +1 -0
  39. package/dist/metering/index.d.ts.map +1 -1
  40. package/dist/metering/index.js +1 -0
  41. package/dist/metering/index.js.map +1 -1
  42. package/dist/metering/receipt-generator.d.ts +4 -4
  43. package/dist/metering/receipt-generator.d.ts.map +1 -1
  44. package/dist/metering/receipt-verifier.d.ts +6 -6
  45. package/dist/metering/receipt-verifier.d.ts.map +1 -1
  46. package/dist/metering/receipt-verifier.js +1 -1
  47. package/dist/metering/seller-session-tracker.d.ts +91 -0
  48. package/dist/metering/seller-session-tracker.d.ts.map +1 -0
  49. package/dist/metering/seller-session-tracker.js +261 -0
  50. package/dist/metering/seller-session-tracker.js.map +1 -0
  51. package/dist/metering/storage.d.ts +11 -5
  52. package/dist/metering/storage.d.ts.map +1 -1
  53. package/dist/metering/storage.js +28 -80
  54. package/dist/metering/storage.js.map +1 -1
  55. package/dist/node.d.ts +69 -117
  56. package/dist/node.d.ts.map +1 -1
  57. package/dist/node.js +240 -1269
  58. package/dist/node.js.map +1 -1
  59. package/dist/p2p/connection-auth.d.ts +2 -1
  60. package/dist/p2p/connection-auth.d.ts.map +1 -1
  61. package/dist/p2p/connection-auth.js +6 -6
  62. package/dist/p2p/connection-auth.js.map +1 -1
  63. package/dist/p2p/connection-manager.d.ts +3 -2
  64. package/dist/p2p/connection-manager.d.ts.map +1 -1
  65. package/dist/p2p/connection-manager.js +6 -6
  66. package/dist/p2p/connection-manager.js.map +1 -1
  67. package/dist/p2p/identity.d.ts +22 -15
  68. package/dist/p2p/identity.d.ts.map +1 -1
  69. package/dist/p2p/identity.js +66 -51
  70. package/dist/p2p/identity.js.map +1 -1
  71. package/dist/p2p/index.d.ts +1 -1
  72. package/dist/p2p/index.d.ts.map +1 -1
  73. package/dist/p2p/index.js +1 -1
  74. package/dist/p2p/index.js.map +1 -1
  75. package/dist/p2p/payment-codec.d.ts +4 -8
  76. package/dist/p2p/payment-codec.d.ts.map +1 -1
  77. package/dist/p2p/payment-codec.js +27 -57
  78. package/dist/p2p/payment-codec.js.map +1 -1
  79. package/dist/p2p/payment-mux.d.ts +4 -10
  80. package/dist/p2p/payment-mux.d.ts.map +1 -1
  81. package/dist/p2p/payment-mux.js +11 -33
  82. package/dist/p2p/payment-mux.js.map +1 -1
  83. package/dist/payments/balance-manager.d.ts +2 -2
  84. package/dist/payments/balance-manager.d.ts.map +1 -1
  85. package/dist/payments/balance-manager.js +5 -5
  86. package/dist/payments/balance-manager.js.map +1 -1
  87. package/dist/payments/buyer-payment-manager.d.ts +154 -21
  88. package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
  89. package/dist/payments/buyer-payment-manager.js +540 -166
  90. package/dist/payments/buyer-payment-manager.js.map +1 -1
  91. package/dist/payments/buyer-payment-negotiator.d.ts +84 -0
  92. package/dist/payments/buyer-payment-negotiator.d.ts.map +1 -0
  93. package/dist/payments/buyer-payment-negotiator.js +624 -0
  94. package/dist/payments/buyer-payment-negotiator.js.map +1 -0
  95. package/dist/payments/chain-config.d.ts +10 -4
  96. package/dist/payments/chain-config.d.ts.map +1 -1
  97. package/dist/payments/chain-config.js +19 -9
  98. package/dist/payments/chain-config.js.map +1 -1
  99. package/dist/payments/channel-session-state.d.ts +13 -0
  100. package/dist/payments/channel-session-state.d.ts.map +1 -0
  101. package/dist/payments/channel-session-state.js +25 -0
  102. package/dist/payments/channel-session-state.js.map +1 -0
  103. package/dist/payments/channel-store.d.ts +87 -0
  104. package/dist/payments/channel-store.d.ts.map +1 -0
  105. package/dist/payments/channel-store.js +276 -0
  106. package/dist/payments/channel-store.js.map +1 -0
  107. package/dist/payments/evm/ants-token-client.d.ts +1 -1
  108. package/dist/payments/evm/ants-token-client.d.ts.map +1 -1
  109. package/dist/payments/evm/ants-token-client.js +3 -4
  110. package/dist/payments/evm/ants-token-client.js.map +1 -1
  111. package/dist/payments/evm/base-evm-client.d.ts +10 -1
  112. package/dist/payments/evm/base-evm-client.d.ts.map +1 -1
  113. package/dist/payments/evm/base-evm-client.js +34 -1
  114. package/dist/payments/evm/base-evm-client.js.map +1 -1
  115. package/dist/payments/evm/channels-client.d.ts +51 -0
  116. package/dist/payments/evm/channels-client.d.ts.map +1 -0
  117. package/dist/payments/evm/channels-client.js +101 -0
  118. package/dist/payments/evm/channels-client.js.map +1 -0
  119. package/dist/payments/evm/deposits-client.d.ts +30 -0
  120. package/dist/payments/evm/deposits-client.d.ts.map +1 -0
  121. package/dist/payments/evm/deposits-client.js +78 -0
  122. package/dist/payments/evm/deposits-client.js.map +1 -0
  123. package/dist/payments/evm/emissions-client.d.ts +3 -4
  124. package/dist/payments/evm/emissions-client.d.ts.map +1 -1
  125. package/dist/payments/evm/emissions-client.js +11 -30
  126. package/dist/payments/evm/emissions-client.js.map +1 -1
  127. package/dist/payments/evm/identity-client.d.ts +10 -23
  128. package/dist/payments/evm/identity-client.d.ts.map +1 -1
  129. package/dist/payments/evm/identity-client.js +43 -100
  130. package/dist/payments/evm/identity-client.js.map +1 -1
  131. package/dist/payments/evm/keypair.d.ts +3 -14
  132. package/dist/payments/evm/keypair.d.ts.map +1 -1
  133. package/dist/payments/evm/keypair.js +4 -20
  134. package/dist/payments/evm/keypair.js.map +1 -1
  135. package/dist/payments/evm/sessions-client.d.ts +30 -0
  136. package/dist/payments/evm/sessions-client.d.ts.map +1 -0
  137. package/dist/payments/evm/sessions-client.js +61 -0
  138. package/dist/payments/evm/sessions-client.js.map +1 -0
  139. package/dist/payments/evm/signatures.d.ts +43 -12
  140. package/dist/payments/evm/signatures.d.ts.map +1 -1
  141. package/dist/payments/evm/signatures.js +62 -45
  142. package/dist/payments/evm/signatures.js.map +1 -1
  143. package/dist/payments/evm/staking-client.d.ts +24 -0
  144. package/dist/payments/evm/staking-client.d.ts.map +1 -0
  145. package/dist/payments/evm/staking-client.js +54 -0
  146. package/dist/payments/evm/staking-client.js.map +1 -0
  147. package/dist/payments/evm/stats-client.d.ts +20 -0
  148. package/dist/payments/evm/stats-client.d.ts.map +1 -0
  149. package/dist/payments/evm/stats-client.js +25 -0
  150. package/dist/payments/evm/stats-client.js.map +1 -0
  151. package/dist/payments/index.d.ts +17 -10
  152. package/dist/payments/index.d.ts.map +1 -1
  153. package/dist/payments/index.js +15 -8
  154. package/dist/payments/index.js.map +1 -1
  155. package/dist/payments/pricing.d.ts +25 -0
  156. package/dist/payments/pricing.d.ts.map +1 -0
  157. package/dist/payments/pricing.js +33 -0
  158. package/dist/payments/pricing.js.map +1 -0
  159. package/dist/payments/readiness.d.ts +4 -3
  160. package/dist/payments/readiness.d.ts.map +1 -1
  161. package/dist/payments/readiness.js +11 -18
  162. package/dist/payments/readiness.js.map +1 -1
  163. package/dist/payments/seller-payment-manager.d.ts +72 -47
  164. package/dist/payments/seller-payment-manager.d.ts.map +1 -1
  165. package/dist/payments/seller-payment-manager.js +558 -275
  166. package/dist/payments/seller-payment-manager.js.map +1 -1
  167. package/dist/payments/session-store.d.ts +3 -0
  168. package/dist/payments/session-store.d.ts.map +1 -1
  169. package/dist/payments/session-store.js +31 -2
  170. package/dist/payments/session-store.js.map +1 -1
  171. package/dist/payments/types.d.ts +5 -3
  172. package/dist/payments/types.d.ts.map +1 -1
  173. package/dist/proxy/proxy-mux.d.ts.map +1 -1
  174. package/dist/proxy/proxy-mux.js +3 -2
  175. package/dist/proxy/proxy-mux.js.map +1 -1
  176. package/dist/proxy/request-codec.d.ts.map +1 -1
  177. package/dist/proxy/request-codec.js +3 -0
  178. package/dist/proxy/request-codec.js.map +1 -1
  179. package/dist/reputation/rating-manager.d.ts.map +1 -1
  180. package/dist/reputation/rating-manager.js +2 -4
  181. package/dist/reputation/rating-manager.js.map +1 -1
  182. package/dist/reputation/report-manager.d.ts.map +1 -1
  183. package/dist/reputation/report-manager.js +2 -4
  184. package/dist/reputation/report-manager.js.map +1 -1
  185. package/dist/routing/default-router.d.ts.map +1 -1
  186. package/dist/routing/default-router.js +4 -9
  187. package/dist/routing/default-router.js.map +1 -1
  188. package/dist/seller-request-handler.d.ts +54 -0
  189. package/dist/seller-request-handler.d.ts.map +1 -0
  190. package/dist/seller-request-handler.js +359 -0
  191. package/dist/seller-request-handler.js.map +1 -0
  192. package/dist/storage/migrate.d.ts +13 -0
  193. package/dist/storage/migrate.d.ts.map +1 -0
  194. package/dist/storage/migrate.js +28 -0
  195. package/dist/storage/migrate.js.map +1 -0
  196. package/dist/storage/migrations/channels/001_create_tables.d.ts +3 -0
  197. package/dist/storage/migrations/channels/001_create_tables.d.ts.map +1 -0
  198. package/dist/storage/migrations/channels/001_create_tables.js +45 -0
  199. package/dist/storage/migrations/channels/001_create_tables.js.map +1 -0
  200. package/dist/storage/migrations/channels/002_add_auth_sig_columns.d.ts +3 -0
  201. package/dist/storage/migrations/channels/002_add_auth_sig_columns.d.ts.map +1 -0
  202. package/dist/storage/migrations/channels/002_add_auth_sig_columns.js +19 -0
  203. package/dist/storage/migrations/channels/002_add_auth_sig_columns.js.map +1 -0
  204. package/dist/storage/migrations/channels/index.d.ts +3 -0
  205. package/dist/storage/migrations/channels/index.d.ts.map +1 -0
  206. package/dist/storage/migrations/channels/index.js +4 -0
  207. package/dist/storage/migrations/channels/index.js.map +1 -0
  208. package/dist/storage/migrations/metering/001_create_tables.d.ts +3 -0
  209. package/dist/storage/migrations/metering/001_create_tables.d.ts.map +1 -0
  210. package/dist/storage/migrations/metering/001_create_tables.js +80 -0
  211. package/dist/storage/migrations/metering/001_create_tables.js.map +1 -0
  212. package/dist/storage/migrations/metering/index.d.ts +3 -0
  213. package/dist/storage/migrations/metering/index.d.ts.map +1 -0
  214. package/dist/storage/migrations/metering/index.js +3 -0
  215. package/dist/storage/migrations/metering/index.js.map +1 -0
  216. package/dist/types/capability.d.ts +1 -1
  217. package/dist/types/metering.d.ts +1 -1
  218. package/dist/types/peer.d.ts +10 -11
  219. package/dist/types/peer.d.ts.map +1 -1
  220. package/dist/types/peer.js +7 -3
  221. package/dist/types/peer.js.map +1 -1
  222. package/dist/types/protocol.d.ts +22 -70
  223. package/dist/types/protocol.d.ts.map +1 -1
  224. package/dist/types/protocol.js +1 -3
  225. package/dist/types/protocol.js.map +1 -1
  226. package/dist/types/rating.d.ts +1 -1
  227. package/dist/types/rating.d.ts.map +1 -1
  228. package/dist/types/report.d.ts +1 -1
  229. package/dist/types/report.d.ts.map +1 -1
  230. package/dist/utils/response-usage.d.ts +10 -0
  231. package/dist/utils/response-usage.d.ts.map +1 -0
  232. package/dist/utils/response-usage.js +34 -0
  233. package/dist/utils/response-usage.js.map +1 -0
  234. package/package.json +3 -3
@@ -0,0 +1,54 @@
1
+ import type { PeerAnnouncer } from './discovery/announcer.js';
2
+ import type { Provider } from './interfaces/seller-provider.js';
3
+ import type { SellerSessionTracker } from './metering/seller-session-tracker.js';
4
+ import type { PaymentMux } from './p2p/payment-mux.js';
5
+ import type { ChannelsClient } from './payments/evm/channels-client.js';
6
+ import type { SellerPaymentManager } from './payments/seller-payment-manager.js';
7
+ import { ProxyMux } from './proxy/proxy-mux.js';
8
+ import type { PeerConnection } from './p2p/connection-manager.js';
9
+ import type { SerializedHttpRequest } from './types/http.js';
10
+ export interface SellerRequestHandlerDeps {
11
+ providers: Provider[];
12
+ sellerPaymentManager: SellerPaymentManager | null;
13
+ sessionTracker: SellerSessionTracker | null;
14
+ channelsClient: ChannelsClient | null;
15
+ announcer: PeerAnnouncer | null;
16
+ emit: (event: string, ...args: unknown[]) => boolean;
17
+ }
18
+ /**
19
+ * Handles all seller-side request processing: provider matching, execution,
20
+ * cost tracking, payment auth checks, and load management.
21
+ *
22
+ * Extracted from AntseedNode to isolate seller request handling from core
23
+ * node orchestration.
24
+ */
25
+ export declare class SellerRequestHandler {
26
+ private readonly _deps;
27
+ private readonly _providerLoadCounts;
28
+ private _metadataRefreshTimer;
29
+ constructor(deps: SellerRequestHandlerDeps);
30
+ /**
31
+ * Wire up the ProxyMux and PaymentMux for a new incoming connection.
32
+ * Registers the onProxyRequest handler that routes requests to providers.
33
+ */
34
+ handleConnection(conn: PeerConnection, buyerPeerId: string, paymentMux: PaymentMux): {
35
+ mux: ProxyMux;
36
+ };
37
+ matchProvider(request: SerializedHttpRequest): Provider | undefined;
38
+ resolveProviderPricing(provider: Provider, request: SerializedHttpRequest): {
39
+ inputUsdPerMillion: number;
40
+ outputUsdPerMillion: number;
41
+ };
42
+ adjustProviderLoad(providerName: string, delta: number): void;
43
+ clearMetadataRefreshTimer(): void;
44
+ private _parseJsonBody;
45
+ private _extractRequestedService;
46
+ private _extractRequestedProvider;
47
+ private _executeRequest;
48
+ /**
49
+ * Inject cost headers into a non-streamed response before sending to buyer.
50
+ */
51
+ private _injectCostHeaders;
52
+ private _scheduleMetadataRefresh;
53
+ }
54
+ //# sourceMappingURL=seller-request-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-request-handler.d.ts","sourceRoot":"","sources":["../src/seller-request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EACV,QAAQ,EAET,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AAKzB,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD,cAAc,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;CACtD;AAKD;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,qBAAqB,CAA8C;gBAE/D,IAAI,EAAE,wBAAwB;IAI1C;;;OAGG;IACH,gBAAgB,CACd,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,GACrB;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE;IA6NpB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,QAAQ,GAAG,SAAS;IAqBnE,sBAAsB,CACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,qBAAqB,GAC7B;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE;IAa9D,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAY7D,yBAAyB,IAAI,IAAI;IAUjC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,yBAAyB;YASnB,eAAe;IAW7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,wBAAwB;CAkBjC"}
@@ -0,0 +1,359 @@
1
+ import { ProxyMux } from './proxy/proxy-mux.js';
2
+ import { parseResponseUsage } from './utils/response-usage.js';
3
+ import { computeCostUsdc } from './payments/pricing.js';
4
+ import { debugLog, debugWarn } from './utils/debug.js';
5
+ /** Debounce interval for metadata refresh after load changes. */
6
+ const METADATA_REFRESH_DEBOUNCE_MS = 200;
7
+ /**
8
+ * Handles all seller-side request processing: provider matching, execution,
9
+ * cost tracking, payment auth checks, and load management.
10
+ *
11
+ * Extracted from AntseedNode to isolate seller request handling from core
12
+ * node orchestration.
13
+ */
14
+ export class SellerRequestHandler {
15
+ _deps;
16
+ _providerLoadCounts = new Map();
17
+ _metadataRefreshTimer = null;
18
+ constructor(deps) {
19
+ this._deps = deps;
20
+ }
21
+ /**
22
+ * Wire up the ProxyMux and PaymentMux for a new incoming connection.
23
+ * Registers the onProxyRequest handler that routes requests to providers.
24
+ */
25
+ handleConnection(conn, buyerPeerId, paymentMux) {
26
+ const mux = new ProxyMux(conn);
27
+ mux.onProxyRequest(async (request) => {
28
+ debugLog(`[SellerHandler] Received request: ${request.method} ${request.path} (reqId=${request.requestId.slice(0, 8)})`);
29
+ // Reject with 402 if no active payment session and channels client is configured.
30
+ const spm = this._deps.sellerPaymentManager;
31
+ const spmAuthorized = spm?.hasSession(buyerPeerId) ?? false;
32
+ if (this._deps.channelsClient && !spmAuthorized) {
33
+ const matchedProvider = this.matchProvider(request);
34
+ const providerPricing = matchedProvider
35
+ ? this.resolveProviderPricing(matchedProvider, request)
36
+ : undefined;
37
+ const requirements = spm?.getPaymentRequirements(request.requestId, buyerPeerId, providerPricing);
38
+ if (requirements) {
39
+ debugLog(`[SellerHandler] No payment session for ${buyerPeerId.slice(0, 12)}... — sending 402 + PaymentRequired`);
40
+ const paymentBody = JSON.stringify({
41
+ error: 'payment_required',
42
+ minBudgetPerRequest: requirements.minBudgetPerRequest,
43
+ suggestedAmount: requirements.suggestedAmount,
44
+ ...(requirements.inputUsdPerMillion != null ? { inputUsdPerMillion: requirements.inputUsdPerMillion } : {}),
45
+ ...(requirements.outputUsdPerMillion != null ? { outputUsdPerMillion: requirements.outputUsdPerMillion } : {}),
46
+ });
47
+ mux.sendProxyResponse({
48
+ requestId: request.requestId,
49
+ statusCode: 402,
50
+ headers: { "content-type": "application/json" },
51
+ body: new TextEncoder().encode(paymentBody),
52
+ });
53
+ paymentMux.sendPaymentRequired(requirements);
54
+ }
55
+ else {
56
+ debugWarn(`[SellerHandler] No payment session — returning 402`);
57
+ mux.sendProxyResponse({
58
+ requestId: request.requestId,
59
+ statusCode: 402,
60
+ headers: { "content-type": "application/json" },
61
+ body: new TextEncoder().encode(JSON.stringify({
62
+ error: 'payment_required',
63
+ message: 'Seller not ready, try again later',
64
+ })),
65
+ });
66
+ }
67
+ return;
68
+ }
69
+ // Check budget before routing — reject if buyer hasn't authorized enough
70
+ if (spm) {
71
+ const session = spm.getChannelByPeer(buyerPeerId);
72
+ if (session) {
73
+ const accepted = spm.getAcceptedCumulative(session.sessionId);
74
+ const spent = spm.getCumulativeSpend(session.sessionId);
75
+ if (accepted > 0n && spent >= accepted) {
76
+ const reserveMax = spm.getReserveMax(session.sessionId);
77
+ const matchedProvider = this.matchProvider(request);
78
+ const providerPricing = matchedProvider
79
+ ? this.resolveProviderPricing(matchedProvider, request)
80
+ : undefined;
81
+ const requirements = spm.getPaymentRequirements(request.requestId, buyerPeerId, providerPricing);
82
+ if (reserveMax > 0n && accepted >= reserveMax) {
83
+ debugLog(`[SellerHandler] Session fully exhausted for ${buyerPeerId.slice(0, 12)}... (spent=${spent} >= accepted=${accepted} >= reserveMax=${reserveMax}) — settling and returning 402`);
84
+ void spm.settleSession(buyerPeerId).catch((err) => {
85
+ debugWarn(`[SellerHandler] Failed to settle exhausted session: ${err instanceof Error ? err.message : err}`);
86
+ });
87
+ }
88
+ else {
89
+ debugLog(`[SellerHandler] Budget exhausted for ${buyerPeerId.slice(0, 12)}... (spent=${spent} >= accepted=${accepted}) — returning 402, awaiting NeedAuth response`);
90
+ }
91
+ mux.sendProxyResponse({
92
+ requestId: request.requestId,
93
+ statusCode: 402,
94
+ headers: { "content-type": "application/json" },
95
+ body: new TextEncoder().encode(JSON.stringify({
96
+ error: 'payment_required',
97
+ minBudgetPerRequest: requirements.minBudgetPerRequest,
98
+ suggestedAmount: requirements.suggestedAmount,
99
+ ...(requirements.inputUsdPerMillion != null ? { inputUsdPerMillion: requirements.inputUsdPerMillion } : {}),
100
+ ...(requirements.outputUsdPerMillion != null ? { outputUsdPerMillion: requirements.outputUsdPerMillion } : {}),
101
+ })),
102
+ });
103
+ paymentMux.sendPaymentRequired(requirements);
104
+ return;
105
+ }
106
+ }
107
+ }
108
+ const provider = this.matchProvider(request);
109
+ if (!provider) {
110
+ debugWarn(`[SellerHandler] No matching provider for ${request.path}`);
111
+ mux.sendProxyResponse({
112
+ requestId: request.requestId,
113
+ statusCode: 502,
114
+ headers: { "content-type": "text/plain" },
115
+ body: new TextEncoder().encode("No matching provider"),
116
+ });
117
+ return;
118
+ }
119
+ // Track active seller session at request start
120
+ this._deps.sessionTracker?.getOrCreateSession(buyerPeerId, provider.name);
121
+ request.headers['x-antseed-buyer-peer-id'] = buyerPeerId;
122
+ debugLog(`[SellerHandler] Routing to provider "${provider.name}"`);
123
+ const startTime = Date.now();
124
+ let statusCode = 500;
125
+ let responseBody = new Uint8Array(0);
126
+ let streamedResponseStarted = false;
127
+ let responseUsage = { inputTokens: 0, outputTokens: 0 };
128
+ this.adjustProviderLoad(provider.name, 1);
129
+ try {
130
+ try {
131
+ const response = await this._executeRequest(provider, request, {
132
+ onResponseStart: (streamResponseStart) => {
133
+ streamedResponseStarted = true;
134
+ statusCode = streamResponseStart.statusCode;
135
+ mux.sendProxyResponse(streamResponseStart);
136
+ },
137
+ onResponseChunk: (chunk) => {
138
+ if (!streamedResponseStarted)
139
+ return;
140
+ mux.sendProxyChunk(chunk);
141
+ },
142
+ });
143
+ statusCode = response.statusCode;
144
+ responseBody = response.body ?? new Uint8Array(0);
145
+ debugLog(`[SellerHandler] Provider responded: status=${statusCode} (${Date.now() - startTime}ms, ${responseBody.length}b) bodyType=${typeof response.body} hasBody=${!!response.body}`);
146
+ responseUsage = parseResponseUsage(responseBody);
147
+ if (!streamedResponseStarted) {
148
+ const responseToSend = this._injectCostHeaders(response, provider, request, buyerPeerId, responseUsage);
149
+ mux.sendProxyResponse(responseToSend);
150
+ }
151
+ }
152
+ catch (err) {
153
+ const message = err instanceof Error ? err.message : "Internal error";
154
+ debugWarn(`[SellerHandler] Provider error after ${Date.now() - startTime}ms: ${message}`);
155
+ responseBody = new TextEncoder().encode(message);
156
+ if (streamedResponseStarted) {
157
+ mux.sendProxyChunk({
158
+ requestId: request.requestId,
159
+ data: new TextEncoder().encode(`event: error\ndata: ${message}\n\n`),
160
+ done: false,
161
+ });
162
+ mux.sendProxyChunk({
163
+ requestId: request.requestId,
164
+ data: new Uint8Array(0),
165
+ done: true,
166
+ });
167
+ }
168
+ else {
169
+ statusCode = 500;
170
+ mux.sendProxyResponse({
171
+ requestId: request.requestId,
172
+ statusCode: 500,
173
+ headers: { "content-type": "text/plain" },
174
+ body: responseBody,
175
+ });
176
+ }
177
+ }
178
+ // Record metering
179
+ const latencyMs = Date.now() - startTime;
180
+ const requestPricing = this.resolveProviderPricing(provider, request);
181
+ if (this._deps.sessionTracker) {
182
+ await this._deps.sessionTracker.recordMetering({
183
+ buyerPeerId,
184
+ providerName: provider.name,
185
+ pricing: requestPricing,
186
+ request,
187
+ statusCode,
188
+ latencyMs,
189
+ inputBytes: request.body.length,
190
+ outputBytes: responseBody.length,
191
+ responseBody,
192
+ providerUsage: responseUsage,
193
+ });
194
+ }
195
+ // Record spend for cumulative voucher model
196
+ if (spm?.hasSession(buyerPeerId)) {
197
+ let usage = responseUsage;
198
+ if (usage.inputTokens === 0 && usage.outputTokens === 0) {
199
+ usage = {
200
+ inputTokens: Math.ceil(request.body.length / 4),
201
+ outputTokens: Math.ceil(responseBody.length / 4),
202
+ };
203
+ }
204
+ const costUsdc = computeCostUsdc(usage.inputTokens, usage.outputTokens, requestPricing);
205
+ const session = spm.getChannelByPeer(buyerPeerId);
206
+ if (session) {
207
+ spm.recordSpend(session.sessionId, costUsdc);
208
+ const cumulativeSpend = spm.getCumulativeSpend(session.sessionId);
209
+ debugLog(`[SellerHandler] Cost recorded: buyer=${buyerPeerId.slice(0, 12)}... cost=${costUsdc} cumulative=${cumulativeSpend} (in=${usage.inputTokens} out=${usage.outputTokens})`);
210
+ // Check if remaining budget is running low; proactively request more auth
211
+ const accepted = spm.getAcceptedCumulative(session.sessionId);
212
+ const remainingBudget = accepted - cumulativeSpend;
213
+ const estimatedNextRequestCost = costUsdc > 0n ? costUsdc : 1n;
214
+ if (remainingBudget < estimatedNextRequestCost) {
215
+ const requiredAmount = cumulativeSpend + estimatedNextRequestCost;
216
+ debugLog(`[SellerHandler] Budget low for ${buyerPeerId.slice(0, 12)}... remaining=${remainingBudget} estimated=${estimatedNextRequestCost} — sending NeedAuth (required=${requiredAmount})`);
217
+ paymentMux.sendNeedAuth({
218
+ channelId: session.sessionId,
219
+ requiredCumulativeAmount: requiredAmount.toString(),
220
+ currentAcceptedCumulative: accepted.toString(),
221
+ deposit: session.authMax ?? '0',
222
+ });
223
+ }
224
+ }
225
+ }
226
+ }
227
+ finally {
228
+ this.adjustProviderLoad(provider.name, -1);
229
+ }
230
+ });
231
+ return { mux };
232
+ }
233
+ // -- Provider matching (public for announcer pricing in _startSeller) --
234
+ matchProvider(request) {
235
+ const requestedService = this._extractRequestedService(request);
236
+ const requestedProvider = this._extractRequestedProvider(request);
237
+ const providers = this._deps.providers;
238
+ const matchesService = (provider) => provider.services.length === 0
239
+ || (requestedService !== null && provider.services.includes(requestedService))
240
+ || providers.length === 1;
241
+ let provider;
242
+ if (requestedProvider) {
243
+ provider = providers.find((candidate) => candidate.name.toLowerCase() === requestedProvider && matchesService(candidate));
244
+ }
245
+ if (!provider) {
246
+ provider = providers.find((candidate) => matchesService(candidate));
247
+ }
248
+ return provider;
249
+ }
250
+ resolveProviderPricing(provider, request) {
251
+ const requestedService = this._extractRequestedService(request);
252
+ if (requestedService) {
253
+ const servicePricing = provider.pricing.services?.[requestedService];
254
+ if (servicePricing) {
255
+ return servicePricing;
256
+ }
257
+ }
258
+ return provider.pricing.defaults;
259
+ }
260
+ // -- Load tracking --
261
+ adjustProviderLoad(providerName, delta) {
262
+ const nextLoad = Math.max(0, (this._providerLoadCounts.get(providerName) ?? 0) + delta);
263
+ this._providerLoadCounts.set(providerName, nextLoad);
264
+ const announcer = this._deps.announcer;
265
+ if (!announcer)
266
+ return;
267
+ announcer.updateLoad(providerName, nextLoad);
268
+ this._scheduleMetadataRefresh();
269
+ }
270
+ // -- Cleanup --
271
+ clearMetadataRefreshTimer() {
272
+ if (this._metadataRefreshTimer) {
273
+ clearTimeout(this._metadataRefreshTimer);
274
+ this._metadataRefreshTimer = null;
275
+ }
276
+ this._providerLoadCounts.clear();
277
+ }
278
+ // -- Private helpers --
279
+ _parseJsonBody(body) {
280
+ try {
281
+ return JSON.parse(new TextDecoder().decode(body));
282
+ }
283
+ catch {
284
+ return null;
285
+ }
286
+ }
287
+ _extractRequestedService(request) {
288
+ const contentType = request.headers["content-type"] ?? request.headers["Content-Type"] ?? "";
289
+ if (!contentType.toLowerCase().includes("application/json")) {
290
+ return null;
291
+ }
292
+ const parsed = this._parseJsonBody(request.body);
293
+ if (!parsed || typeof parsed !== "object") {
294
+ return null;
295
+ }
296
+ const service = parsed["model"];
297
+ if (typeof service !== "string" || service.trim().length === 0) {
298
+ return null;
299
+ }
300
+ return service.trim();
301
+ }
302
+ _extractRequestedProvider(request) {
303
+ const providers = Object.entries(request.headers)
304
+ .filter(([header]) => header.toLowerCase() === "x-antseed-provider")
305
+ .map(([, value]) => value.trim().toLowerCase())
306
+ .filter((value) => value.length > 0);
307
+ return providers[0] ?? null;
308
+ }
309
+ async _executeRequest(provider, request, streamCallbacks) {
310
+ if (streamCallbacks && provider.handleRequestStream) {
311
+ return provider.handleRequestStream(request, streamCallbacks);
312
+ }
313
+ return provider.handleRequest(request);
314
+ }
315
+ /**
316
+ * Inject cost headers into a non-streamed response before sending to buyer.
317
+ */
318
+ _injectCostHeaders(response, provider, request, buyerPeerId, usage) {
319
+ const spm = this._deps.sellerPaymentManager;
320
+ if (!spm || !spm.hasSession(buyerPeerId))
321
+ return response;
322
+ const resolvedUsage = usage ?? parseResponseUsage(response.body);
323
+ const pricing = this.resolveProviderPricing(provider, request);
324
+ const costUsdc = computeCostUsdc(resolvedUsage.inputTokens, resolvedUsage.outputTokens, pricing);
325
+ const session = spm.getChannelByPeer(buyerPeerId);
326
+ const cumulativeCost = session ? spm.getCumulativeSpend(session.sessionId) : 0n;
327
+ return {
328
+ requestId: response.requestId,
329
+ statusCode: response.statusCode,
330
+ body: response.body ?? new Uint8Array(0),
331
+ headers: {
332
+ ...response.headers,
333
+ 'x-antseed-input-tokens': String(resolvedUsage.inputTokens),
334
+ 'x-antseed-output-tokens': String(resolvedUsage.outputTokens),
335
+ 'x-antseed-cost': costUsdc.toString(),
336
+ 'x-antseed-cumulative-cost': cumulativeCost.toString(),
337
+ },
338
+ };
339
+ }
340
+ _scheduleMetadataRefresh() {
341
+ if (!this._deps.announcer || this._metadataRefreshTimer) {
342
+ return;
343
+ }
344
+ const timer = setTimeout(() => {
345
+ this._metadataRefreshTimer = null;
346
+ const announcer = this._deps.announcer;
347
+ if (!announcer)
348
+ return;
349
+ void announcer.refreshMetadata().catch((err) => {
350
+ debugWarn(`[SellerHandler] Failed to refresh metadata snapshot: ${err instanceof Error ? err.message : err}`);
351
+ });
352
+ }, METADATA_REFRESH_DEBOUNCE_MS);
353
+ this._metadataRefreshTimer = timer;
354
+ if (typeof timer.unref === "function") {
355
+ timer.unref();
356
+ }
357
+ }
358
+ }
359
+ //# sourceMappingURL=seller-request-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-request-handler.js","sourceRoot":"","sources":["../src/seller-request-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface Migration {
3
+ version: number;
4
+ name: string;
5
+ up: (db: Database.Database) => void;
6
+ }
7
+ /**
8
+ * Run migrations on a better-sqlite3 database.
9
+ * Tracks applied versions in a `schema_version` table.
10
+ * Each migration runs in a transaction.
11
+ */
12
+ export declare function runMigrations(db: Database.Database, migrations: Migration[]): void;
13
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/storage/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CA2BlF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Run migrations on a better-sqlite3 database.
3
+ * Tracks applied versions in a `schema_version` table.
4
+ * Each migration runs in a transaction.
5
+ */
6
+ export function runMigrations(db, migrations) {
7
+ db.exec(`
8
+ CREATE TABLE IF NOT EXISTS schema_version (
9
+ version INTEGER NOT NULL UNIQUE,
10
+ name TEXT NOT NULL,
11
+ applied_at INTEGER NOT NULL
12
+ )
13
+ `);
14
+ const applied = new Set(db.prepare('SELECT version FROM schema_version').all()
15
+ .map(r => r.version));
16
+ const sorted = [...migrations].sort((a, b) => a.version - b.version);
17
+ for (const migration of sorted) {
18
+ if (applied.has(migration.version))
19
+ continue;
20
+ db.transaction(() => {
21
+ migration.up(db);
22
+ db.prepare('INSERT INTO schema_version (version, name, applied_at) VALUES (?, ?, ?)')
23
+ .run(migration.version, migration.name, Date.now());
24
+ })();
25
+ applied.add(migration.version);
26
+ }
27
+ }
28
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/storage/migrate.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,UAAuB;IAC1E,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CACpB,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAA4B;SAC9E,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACvB,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAErE,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7C,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC;iBAClF,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from '../../migrate.js';
2
+ export declare const migration: Migration;
3
+ //# sourceMappingURL=001_create_tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001_create_tables.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/001_create_tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,SAAS,EAAE,SA2CvB,CAAC"}
@@ -0,0 +1,45 @@
1
+ export const migration = {
2
+ version: 1,
3
+ name: 'create_payment_channels_and_receipts',
4
+ up: (db) => {
5
+ db.exec(`
6
+ CREATE TABLE IF NOT EXISTS payment_channels (
7
+ session_id TEXT PRIMARY KEY,
8
+ peer_id TEXT NOT NULL,
9
+ role TEXT NOT NULL,
10
+ seller_evm_addr TEXT NOT NULL,
11
+ buyer_evm_addr TEXT NOT NULL,
12
+ nonce INTEGER NOT NULL,
13
+ auth_max TEXT NOT NULL,
14
+ deadline INTEGER NOT NULL,
15
+ previous_session_id TEXT NOT NULL,
16
+ previous_consumption TEXT NOT NULL,
17
+ tokens_delivered TEXT NOT NULL DEFAULT '0',
18
+ request_count INTEGER NOT NULL DEFAULT 0,
19
+ reserved_at INTEGER NOT NULL,
20
+ settled_at INTEGER,
21
+ settled_amount TEXT,
22
+ status TEXT NOT NULL DEFAULT 'active',
23
+ created_at INTEGER NOT NULL,
24
+ updated_at INTEGER NOT NULL
25
+ );
26
+
27
+ CREATE INDEX IF NOT EXISTS idx_channels_peer_role_status ON payment_channels(peer_id, role, status);
28
+
29
+ CREATE TABLE IF NOT EXISTS payment_receipts (
30
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ session_id TEXT NOT NULL,
32
+ running_total TEXT NOT NULL,
33
+ request_count INTEGER NOT NULL,
34
+ response_hash TEXT NOT NULL,
35
+ seller_sig TEXT NOT NULL,
36
+ buyer_ack_sig TEXT,
37
+ created_at INTEGER NOT NULL,
38
+ FOREIGN KEY (session_id) REFERENCES payment_channels(session_id)
39
+ );
40
+
41
+ CREATE INDEX IF NOT EXISTS idx_receipts_session ON payment_receipts(session_id);
42
+ `);
43
+ },
44
+ };
45
+ //# sourceMappingURL=001_create_tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001_create_tables.js","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/001_create_tables.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,sCAAsC;IAC5C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QACT,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqCP,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from '../../migrate.js';
2
+ export declare const migration: Migration;
3
+ //# sourceMappingURL=002_add_auth_sig_columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002_add_auth_sig_columns.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/002_add_auth_sig_columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,SAAS,EAAE,SAmBvB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export const migration = {
2
+ version: 2,
3
+ name: 'add_auth_sig_columns',
4
+ up: (db) => {
5
+ const cols = db.pragma('table_info(payment_channels)');
6
+ const existing = new Set(cols.map(c => c.name));
7
+ if (!existing.has('latest_buyer_sig')) {
8
+ db.exec('ALTER TABLE payment_channels ADD COLUMN latest_buyer_sig TEXT');
9
+ }
10
+ if (!existing.has('latest_metadata_auth_sig')) {
11
+ db.exec('ALTER TABLE payment_channels ADD COLUMN latest_metadata_auth_sig TEXT');
12
+ }
13
+ if (!existing.has('latest_metadata')) {
14
+ db.exec('ALTER TABLE payment_channels ADD COLUMN latest_metadata TEXT');
15
+ }
16
+ db.exec('CREATE INDEX IF NOT EXISTS idx_channels_status_updated ON payment_channels(status, updated_at)');
17
+ },
18
+ };
19
+ //# sourceMappingURL=002_add_auth_sig_columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002_add_auth_sig_columns.js","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/002_add_auth_sig_columns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,sBAAsB;IAC5B,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAA4B,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAC9C,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC1E,CAAC;QAED,EAAE,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IAC5G,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from '../../migrate.js';
2
+ export declare const channelMigrations: Migration[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,eAAO,MAAM,iBAAiB,EAAE,SAAS,EAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { migration as m001 } from './001_create_tables.js';
2
+ import { migration as m002 } from './002_add_auth_sig_columns.js';
3
+ export const channelMigrations = [m001, m002];
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/migrations/channels/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from '../../migrate.js';
2
+ export declare const migration: Migration;
3
+ //# sourceMappingURL=001_create_tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001_create_tables.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/metering/001_create_tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,SAAS,EAAE,SA8EvB,CAAC"}