@antseed/node 0.2.26 → 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.
- package/README.md +85 -11
- package/dist/buyer-request-handler.d.ts +41 -0
- package/dist/buyer-request-handler.d.ts.map +1 -0
- package/dist/buyer-request-handler.js +254 -0
- package/dist/buyer-request-handler.js.map +1 -0
- package/dist/discovery/announcer.d.ts +5 -2
- package/dist/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +11 -14
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/discovery/index.d.ts +0 -2
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +0 -2
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/metadata-codec.d.ts +2 -2
- package/dist/discovery/metadata-codec.d.ts.map +1 -1
- package/dist/discovery/metadata-codec.js +47 -72
- package/dist/discovery/metadata-codec.js.map +1 -1
- package/dist/discovery/metadata-validator.js +6 -6
- package/dist/discovery/metadata-validator.js.map +1 -1
- package/dist/discovery/peer-lookup.d.ts.map +1 -1
- package/dist/discovery/peer-lookup.js +1 -2
- package/dist/discovery/peer-lookup.js.map +1 -1
- package/dist/discovery/peer-metadata.d.ts +3 -5
- package/dist/discovery/peer-metadata.d.ts.map +1 -1
- package/dist/discovery/peer-metadata.js +1 -1
- package/dist/discovery/reputation-verifier.d.ts +2 -22
- package/dist/discovery/reputation-verifier.d.ts.map +1 -1
- package/dist/discovery/reputation-verifier.js +2 -24
- package/dist/discovery/reputation-verifier.js.map +1 -1
- package/dist/discovery/stats-verifier.d.ts +27 -0
- package/dist/discovery/stats-verifier.d.ts.map +1 -0
- package/dist/discovery/stats-verifier.js +38 -0
- package/dist/discovery/stats-verifier.js.map +1 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/metering/index.d.ts +1 -0
- package/dist/metering/index.d.ts.map +1 -1
- package/dist/metering/index.js +1 -0
- package/dist/metering/index.js.map +1 -1
- package/dist/metering/receipt-generator.d.ts +4 -4
- package/dist/metering/receipt-generator.d.ts.map +1 -1
- package/dist/metering/receipt-verifier.d.ts +6 -6
- package/dist/metering/receipt-verifier.d.ts.map +1 -1
- package/dist/metering/receipt-verifier.js +1 -1
- package/dist/metering/seller-session-tracker.d.ts +91 -0
- package/dist/metering/seller-session-tracker.d.ts.map +1 -0
- package/dist/metering/seller-session-tracker.js +261 -0
- package/dist/metering/seller-session-tracker.js.map +1 -0
- package/dist/metering/storage.d.ts +11 -5
- package/dist/metering/storage.d.ts.map +1 -1
- package/dist/metering/storage.js +28 -80
- package/dist/metering/storage.js.map +1 -1
- package/dist/node.d.ts +83 -104
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +313 -1026
- package/dist/node.js.map +1 -1
- package/dist/p2p/connection-auth.d.ts +2 -1
- package/dist/p2p/connection-auth.d.ts.map +1 -1
- package/dist/p2p/connection-auth.js +6 -6
- package/dist/p2p/connection-auth.js.map +1 -1
- package/dist/p2p/connection-manager.d.ts +3 -2
- package/dist/p2p/connection-manager.d.ts.map +1 -1
- package/dist/p2p/connection-manager.js +12 -6
- package/dist/p2p/connection-manager.js.map +1 -1
- package/dist/p2p/identity.d.ts +44 -13
- package/dist/p2p/identity.d.ts.map +1 -1
- package/dist/p2p/identity.js +103 -49
- package/dist/p2p/identity.js.map +1 -1
- package/dist/p2p/index.d.ts +1 -3
- package/dist/p2p/index.d.ts.map +1 -1
- package/dist/p2p/index.js +1 -3
- package/dist/p2p/index.js.map +1 -1
- package/dist/p2p/payment-codec.d.ts +9 -19
- package/dist/p2p/payment-codec.d.ts.map +1 -1
- package/dist/p2p/payment-codec.js +41 -89
- package/dist/p2p/payment-codec.js.map +1 -1
- package/dist/p2p/payment-mux.d.ts +14 -29
- package/dist/p2p/payment-mux.d.ts.map +1 -1
- package/dist/p2p/payment-mux.js +41 -79
- package/dist/p2p/payment-mux.js.map +1 -1
- package/dist/payments/balance-manager.d.ts +2 -2
- package/dist/payments/balance-manager.d.ts.map +1 -1
- package/dist/payments/balance-manager.js +5 -5
- package/dist/payments/balance-manager.js.map +1 -1
- package/dist/payments/buyer-payment-manager.d.ts +157 -83
- package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
- package/dist/payments/buyer-payment-manager.js +573 -204
- package/dist/payments/buyer-payment-manager.js.map +1 -1
- package/dist/payments/buyer-payment-negotiator.d.ts +84 -0
- package/dist/payments/buyer-payment-negotiator.d.ts.map +1 -0
- package/dist/payments/buyer-payment-negotiator.js +624 -0
- package/dist/payments/buyer-payment-negotiator.js.map +1 -0
- package/dist/payments/chain-config.d.ts +44 -0
- package/dist/payments/chain-config.d.ts.map +1 -0
- package/dist/payments/chain-config.js +70 -0
- package/dist/payments/chain-config.js.map +1 -0
- package/dist/payments/channel-session-state.d.ts +13 -0
- package/dist/payments/channel-session-state.d.ts.map +1 -0
- package/dist/payments/channel-session-state.js +25 -0
- package/dist/payments/channel-session-state.js.map +1 -0
- package/dist/payments/channel-store.d.ts +87 -0
- package/dist/payments/channel-store.d.ts.map +1 -0
- package/dist/payments/channel-store.js +276 -0
- package/dist/payments/channel-store.js.map +1 -0
- package/dist/payments/evm/ants-token-client.d.ts +16 -0
- package/dist/payments/evm/ants-token-client.d.ts.map +1 -0
- package/dist/payments/evm/ants-token-client.js +65 -0
- package/dist/payments/evm/ants-token-client.js.map +1 -0
- package/dist/payments/evm/base-evm-client.d.ts +22 -0
- package/dist/payments/evm/base-evm-client.d.ts.map +1 -0
- package/dist/payments/evm/base-evm-client.js +71 -0
- package/dist/payments/evm/base-evm-client.js.map +1 -0
- package/dist/payments/evm/channels-client.d.ts +51 -0
- package/dist/payments/evm/channels-client.d.ts.map +1 -0
- package/dist/payments/evm/channels-client.js +101 -0
- package/dist/payments/evm/channels-client.js.map +1 -0
- package/dist/payments/evm/deposits-client.d.ts +30 -0
- package/dist/payments/evm/deposits-client.d.ts.map +1 -0
- package/dist/payments/evm/deposits-client.js +78 -0
- package/dist/payments/evm/deposits-client.js.map +1 -0
- package/dist/payments/evm/emissions-client.d.ts +22 -0
- package/dist/payments/evm/emissions-client.d.ts.map +1 -0
- package/dist/payments/evm/emissions-client.js +65 -0
- package/dist/payments/evm/emissions-client.js.map +1 -0
- package/dist/payments/evm/escrow-client.d.ts +57 -36
- package/dist/payments/evm/escrow-client.d.ts.map +1 -1
- package/dist/payments/evm/escrow-client.js +200 -93
- package/dist/payments/evm/escrow-client.js.map +1 -1
- package/dist/payments/evm/identity-client.d.ts +21 -0
- package/dist/payments/evm/identity-client.d.ts.map +1 -0
- package/dist/payments/evm/identity-client.js +68 -0
- package/dist/payments/evm/identity-client.js.map +1 -0
- package/dist/payments/evm/keypair.d.ts +3 -14
- package/dist/payments/evm/keypair.d.ts.map +1 -1
- package/dist/payments/evm/keypair.js +4 -20
- package/dist/payments/evm/keypair.js.map +1 -1
- package/dist/payments/evm/sessions-client.d.ts +30 -0
- package/dist/payments/evm/sessions-client.d.ts.map +1 -0
- package/dist/payments/evm/sessions-client.js +61 -0
- package/dist/payments/evm/sessions-client.js.map +1 -0
- package/dist/payments/evm/signatures.d.ts +54 -10
- package/dist/payments/evm/signatures.d.ts.map +1 -1
- package/dist/payments/evm/signatures.js +80 -54
- package/dist/payments/evm/signatures.js.map +1 -1
- package/dist/payments/evm/staking-client.d.ts +24 -0
- package/dist/payments/evm/staking-client.d.ts.map +1 -0
- package/dist/payments/evm/staking-client.js +54 -0
- package/dist/payments/evm/staking-client.js.map +1 -0
- package/dist/payments/evm/stats-client.d.ts +20 -0
- package/dist/payments/evm/stats-client.d.ts.map +1 -0
- package/dist/payments/evm/stats-client.js +25 -0
- package/dist/payments/evm/stats-client.js.map +1 -0
- package/dist/payments/evm/subpool-client.d.ts +30 -0
- package/dist/payments/evm/subpool-client.d.ts.map +1 -0
- package/dist/payments/evm/subpool-client.js +158 -0
- package/dist/payments/evm/subpool-client.js.map +1 -0
- package/dist/payments/index.d.ts +29 -9
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +27 -9
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/pricing.d.ts +25 -0
- package/dist/payments/pricing.d.ts.map +1 -0
- package/dist/payments/pricing.js +33 -0
- package/dist/payments/pricing.js.map +1 -0
- package/dist/payments/readiness.d.ts +13 -0
- package/dist/payments/readiness.d.ts.map +1 -0
- package/dist/payments/readiness.js +57 -0
- package/dist/payments/readiness.js.map +1 -0
- package/dist/payments/seller-payment-manager.d.ts +101 -36
- package/dist/payments/seller-payment-manager.d.ts.map +1 -1
- package/dist/payments/seller-payment-manager.js +612 -120
- package/dist/payments/seller-payment-manager.js.map +1 -1
- package/dist/payments/session-store.d.ts +68 -0
- package/dist/payments/session-store.d.ts.map +1 -0
- package/dist/payments/session-store.js +272 -0
- package/dist/payments/session-store.js.map +1 -0
- package/dist/payments/types.d.ts +5 -3
- package/dist/payments/types.d.ts.map +1 -1
- package/dist/payments/usdc-utils.d.ts +9 -0
- package/dist/payments/usdc-utils.d.ts.map +1 -0
- package/dist/payments/usdc-utils.js +17 -0
- package/dist/payments/usdc-utils.js.map +1 -0
- package/dist/proxy/proxy-mux.d.ts.map +1 -1
- package/dist/proxy/proxy-mux.js +3 -2
- package/dist/proxy/proxy-mux.js.map +1 -1
- package/dist/proxy/request-codec.d.ts.map +1 -1
- package/dist/proxy/request-codec.js +3 -0
- package/dist/proxy/request-codec.js.map +1 -1
- package/dist/reputation/rating-manager.d.ts.map +1 -1
- package/dist/reputation/rating-manager.js +2 -4
- package/dist/reputation/rating-manager.js.map +1 -1
- package/dist/reputation/report-manager.d.ts.map +1 -1
- package/dist/reputation/report-manager.js +2 -4
- package/dist/reputation/report-manager.js.map +1 -1
- package/dist/routing/default-router.d.ts.map +1 -1
- package/dist/routing/default-router.js +4 -9
- package/dist/routing/default-router.js.map +1 -1
- package/dist/seller-request-handler.d.ts +54 -0
- package/dist/seller-request-handler.d.ts.map +1 -0
- package/dist/seller-request-handler.js +359 -0
- package/dist/seller-request-handler.js.map +1 -0
- package/dist/storage/migrate.d.ts +13 -0
- package/dist/storage/migrate.d.ts.map +1 -0
- package/dist/storage/migrate.js +28 -0
- package/dist/storage/migrate.js.map +1 -0
- package/dist/storage/migrations/channels/001_create_tables.d.ts +3 -0
- package/dist/storage/migrations/channels/001_create_tables.d.ts.map +1 -0
- package/dist/storage/migrations/channels/001_create_tables.js +45 -0
- package/dist/storage/migrations/channels/001_create_tables.js.map +1 -0
- package/dist/storage/migrations/channels/002_add_auth_sig_columns.d.ts +3 -0
- package/dist/storage/migrations/channels/002_add_auth_sig_columns.d.ts.map +1 -0
- package/dist/storage/migrations/channels/002_add_auth_sig_columns.js +19 -0
- package/dist/storage/migrations/channels/002_add_auth_sig_columns.js.map +1 -0
- package/dist/storage/migrations/channels/index.d.ts +3 -0
- package/dist/storage/migrations/channels/index.d.ts.map +1 -0
- package/dist/storage/migrations/channels/index.js +4 -0
- package/dist/storage/migrations/channels/index.js.map +1 -0
- package/dist/storage/migrations/metering/001_create_tables.d.ts +3 -0
- package/dist/storage/migrations/metering/001_create_tables.d.ts.map +1 -0
- package/dist/storage/migrations/metering/001_create_tables.js +80 -0
- package/dist/storage/migrations/metering/001_create_tables.js.map +1 -0
- package/dist/storage/migrations/metering/index.d.ts +3 -0
- package/dist/storage/migrations/metering/index.d.ts.map +1 -0
- package/dist/storage/migrations/metering/index.js +3 -0
- package/dist/storage/migrations/metering/index.js.map +1 -0
- package/dist/types/capability.d.ts +1 -1
- package/dist/types/http.d.ts +2 -0
- package/dist/types/http.d.ts.map +1 -1
- package/dist/types/http.js +2 -0
- package/dist/types/http.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/metering.d.ts +2 -2
- package/dist/types/metering.d.ts.map +1 -1
- package/dist/types/peer.d.ts +10 -11
- package/dist/types/peer.d.ts.map +1 -1
- package/dist/types/peer.js +7 -3
- package/dist/types/peer.js.map +1 -1
- package/dist/types/protocol.d.ts +32 -97
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/protocol.js +5 -10
- package/dist/types/protocol.js.map +1 -1
- package/dist/types/rating.d.ts +1 -1
- package/dist/types/rating.d.ts.map +1 -1
- package/dist/types/report.d.ts +1 -1
- package/dist/types/report.d.ts.map +1 -1
- package/dist/utils/response-usage.d.ts +10 -0
- package/dist/utils/response-usage.d.ts.map +1 -0
- package/dist/utils/response-usage.js +34 -0
- package/dist/utils/response-usage.js.map +1 -0
- package/package.json +4 -3
|
@@ -1,43 +1,28 @@
|
|
|
1
1
|
import type { PeerConnection } from './connection-manager.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { SpendingAuthPayload, AuthAckPayload, PaymentRequiredPayload, NeedAuthPayload } from '../types/protocol.js';
|
|
3
3
|
import type { FramedMessage } from '../types/protocol.js';
|
|
4
4
|
export type PaymentMessageHandler<T> = (payload: T) => void | Promise<void>;
|
|
5
5
|
/**
|
|
6
|
-
* Multiplexes
|
|
6
|
+
* Multiplexes payment messages over a PeerConnection.
|
|
7
7
|
* Register handlers for each message type, then call handleFrame()
|
|
8
8
|
* when a payment-range frame arrives.
|
|
9
9
|
*/
|
|
10
10
|
export declare class PaymentMux {
|
|
11
11
|
private _connection;
|
|
12
12
|
private _messageIdCounter;
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
private
|
|
16
|
-
private
|
|
17
|
-
private _onBuyerAck?;
|
|
18
|
-
private _onSessionEnd?;
|
|
19
|
-
private _onTopUpRequest?;
|
|
20
|
-
private _onTopUpAuth?;
|
|
21
|
-
private _onDisputeNotify?;
|
|
13
|
+
private _onSpendingAuth?;
|
|
14
|
+
private _onAuthAck?;
|
|
15
|
+
private _onPaymentRequired?;
|
|
16
|
+
private _onNeedAuth?;
|
|
22
17
|
constructor(connection: PeerConnection);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
onDisputeNotify(handler: PaymentMessageHandler<DisputeNotifyPayload>): void;
|
|
32
|
-
sendSessionLockAuth(payload: SessionLockAuthPayload): void;
|
|
33
|
-
sendSessionLockConfirm(payload: SessionLockConfirmPayload): void;
|
|
34
|
-
sendSessionLockReject(payload: SessionLockRejectPayload): void;
|
|
35
|
-
sendSellerReceipt(payload: SellerReceiptPayload): void;
|
|
36
|
-
sendBuyerAck(payload: BuyerAckPayload): void;
|
|
37
|
-
sendSessionEnd(payload: SessionEndPayload): void;
|
|
38
|
-
sendTopUpRequest(payload: TopUpRequestPayload): void;
|
|
39
|
-
sendTopUpAuth(payload: TopUpAuthPayload): void;
|
|
40
|
-
sendDisputeNotify(payload: DisputeNotifyPayload): void;
|
|
18
|
+
onSpendingAuth(handler: PaymentMessageHandler<SpendingAuthPayload>): void;
|
|
19
|
+
onAuthAck(handler: PaymentMessageHandler<AuthAckPayload>): void;
|
|
20
|
+
onPaymentRequired(handler: PaymentMessageHandler<PaymentRequiredPayload>): void;
|
|
21
|
+
onNeedAuth(handler: PaymentMessageHandler<NeedAuthPayload>): void;
|
|
22
|
+
sendSpendingAuth(payload: SpendingAuthPayload): void;
|
|
23
|
+
sendAuthAck(payload: AuthAckPayload): void;
|
|
24
|
+
sendPaymentRequired(payload: PaymentRequiredPayload): void;
|
|
25
|
+
sendNeedAuth(payload: NeedAuthPayload): void;
|
|
41
26
|
/**
|
|
42
27
|
* Returns true if this frame is a payment message and was handled.
|
|
43
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-mux.d.ts","sourceRoot":"","sources":["../../src/p2p/payment-mux.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"payment-mux.d.ts","sourceRoot":"","sources":["../../src/p2p/payment-mux.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5E;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAG9B,OAAO,CAAC,eAAe,CAAC,CAA6C;IACrE,OAAO,CAAC,UAAU,CAAC,CAAwC;IAC3D,OAAO,CAAC,kBAAkB,CAAC,CAAgD;IAC3E,OAAO,CAAC,WAAW,CAAC,CAAyC;gBAEjD,UAAU,EAAE,cAAc;IAKtC,cAAc,CAAC,OAAO,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAGzE,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,cAAc,CAAC,GAAG,IAAI;IAG/D,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,IAAI;IAG/E,UAAU,CAAC,OAAO,EAAE,qBAAqB,CAAC,eAAe,CAAC,GAAG,IAAI;IAKjE,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAGpD,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAG1C,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAG1D,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAK5C;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBzD,mEAAmE;IACnE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9C,OAAO,CAAC,KAAK;CASd"}
|
package/dist/p2p/payment-mux.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { MessageType } from '../types/protocol.js';
|
|
2
2
|
import { encodeFrame } from './message-protocol.js';
|
|
3
3
|
import * as codec from './payment-codec.js';
|
|
4
|
+
import { debugLog } from '../utils/debug.js';
|
|
5
|
+
const MESSAGE_TYPE_NAME = {
|
|
6
|
+
[MessageType.SpendingAuth]: 'SpendingAuth',
|
|
7
|
+
[MessageType.AuthAck]: 'AuthAck',
|
|
8
|
+
[MessageType.PaymentRequired]: 'PaymentRequired',
|
|
9
|
+
[MessageType.NeedAuth]: 'NeedAuth',
|
|
10
|
+
};
|
|
4
11
|
/**
|
|
5
|
-
* Multiplexes
|
|
12
|
+
* Multiplexes payment messages over a PeerConnection.
|
|
6
13
|
* Register handlers for each message type, then call handleFrame()
|
|
7
14
|
* when a payment-range frame arrives.
|
|
8
15
|
*/
|
|
@@ -10,106 +17,60 @@ export class PaymentMux {
|
|
|
10
17
|
_connection;
|
|
11
18
|
_messageIdCounter = 0;
|
|
12
19
|
// Handler registrations
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
_onBuyerAck;
|
|
18
|
-
_onSessionEnd;
|
|
19
|
-
_onTopUpRequest;
|
|
20
|
-
_onTopUpAuth;
|
|
21
|
-
_onDisputeNotify;
|
|
20
|
+
_onSpendingAuth;
|
|
21
|
+
_onAuthAck;
|
|
22
|
+
_onPaymentRequired;
|
|
23
|
+
_onNeedAuth;
|
|
22
24
|
constructor(connection) {
|
|
23
25
|
this._connection = connection;
|
|
24
26
|
}
|
|
25
27
|
// --- Handler registration ---
|
|
26
|
-
|
|
27
|
-
this.
|
|
28
|
+
onSpendingAuth(handler) {
|
|
29
|
+
this._onSpendingAuth = handler;
|
|
28
30
|
}
|
|
29
|
-
|
|
30
|
-
this.
|
|
31
|
+
onAuthAck(handler) {
|
|
32
|
+
this._onAuthAck = handler;
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
+
onPaymentRequired(handler) {
|
|
35
|
+
this._onPaymentRequired = handler;
|
|
34
36
|
}
|
|
35
|
-
|
|
36
|
-
this.
|
|
37
|
-
}
|
|
38
|
-
onBuyerAck(handler) {
|
|
39
|
-
this._onBuyerAck = handler;
|
|
40
|
-
}
|
|
41
|
-
onSessionEnd(handler) {
|
|
42
|
-
this._onSessionEnd = handler;
|
|
43
|
-
}
|
|
44
|
-
onTopUpRequest(handler) {
|
|
45
|
-
this._onTopUpRequest = handler;
|
|
46
|
-
}
|
|
47
|
-
onTopUpAuth(handler) {
|
|
48
|
-
this._onTopUpAuth = handler;
|
|
49
|
-
}
|
|
50
|
-
onDisputeNotify(handler) {
|
|
51
|
-
this._onDisputeNotify = handler;
|
|
37
|
+
onNeedAuth(handler) {
|
|
38
|
+
this._onNeedAuth = handler;
|
|
52
39
|
}
|
|
53
40
|
// --- Sending ---
|
|
54
|
-
|
|
55
|
-
this._send(MessageType.
|
|
56
|
-
}
|
|
57
|
-
sendSessionLockConfirm(payload) {
|
|
58
|
-
this._send(MessageType.SessionLockConfirm, codec.encodeSessionLockConfirm(payload));
|
|
59
|
-
}
|
|
60
|
-
sendSessionLockReject(payload) {
|
|
61
|
-
this._send(MessageType.SessionLockReject, codec.encodeSessionLockReject(payload));
|
|
62
|
-
}
|
|
63
|
-
sendSellerReceipt(payload) {
|
|
64
|
-
this._send(MessageType.SellerReceipt, codec.encodeSellerReceipt(payload));
|
|
41
|
+
sendSpendingAuth(payload) {
|
|
42
|
+
this._send(MessageType.SpendingAuth, codec.encodeSpendingAuth(payload));
|
|
65
43
|
}
|
|
66
|
-
|
|
67
|
-
this._send(MessageType.
|
|
44
|
+
sendAuthAck(payload) {
|
|
45
|
+
this._send(MessageType.AuthAck, codec.encodeAuthAck(payload));
|
|
68
46
|
}
|
|
69
|
-
|
|
70
|
-
this._send(MessageType.
|
|
47
|
+
sendPaymentRequired(payload) {
|
|
48
|
+
this._send(MessageType.PaymentRequired, codec.encodePaymentRequired(payload));
|
|
71
49
|
}
|
|
72
|
-
|
|
73
|
-
this._send(MessageType.
|
|
74
|
-
}
|
|
75
|
-
sendTopUpAuth(payload) {
|
|
76
|
-
this._send(MessageType.TopUpAuth, codec.encodeTopUpAuth(payload));
|
|
77
|
-
}
|
|
78
|
-
sendDisputeNotify(payload) {
|
|
79
|
-
this._send(MessageType.DisputeNotify, codec.encodeDisputeNotify(payload));
|
|
50
|
+
sendNeedAuth(payload) {
|
|
51
|
+
this._send(MessageType.NeedAuth, codec.encodeNeedAuth(payload));
|
|
80
52
|
}
|
|
81
53
|
// --- Receiving ---
|
|
82
54
|
/**
|
|
83
55
|
* Returns true if this frame is a payment message and was handled.
|
|
84
56
|
*/
|
|
85
57
|
async handleFrame(frame) {
|
|
58
|
+
const name = MESSAGE_TYPE_NAME[frame.type];
|
|
59
|
+
if (!name)
|
|
60
|
+
return false;
|
|
61
|
+
debugLog(`[PaymentMux] ← recv ${name} (${frame.payload.length}b)`);
|
|
86
62
|
switch (frame.type) {
|
|
87
|
-
case MessageType.
|
|
88
|
-
await this.
|
|
89
|
-
return true;
|
|
90
|
-
case MessageType.SessionLockConfirm:
|
|
91
|
-
await this._onSessionLockConfirm?.(codec.decodeSessionLockConfirm(frame.payload));
|
|
92
|
-
return true;
|
|
93
|
-
case MessageType.SessionLockReject:
|
|
94
|
-
await this._onSessionLockReject?.(codec.decodeSessionLockReject(frame.payload));
|
|
95
|
-
return true;
|
|
96
|
-
case MessageType.SellerReceipt:
|
|
97
|
-
await this._onSellerReceipt?.(codec.decodeSellerReceipt(frame.payload));
|
|
98
|
-
return true;
|
|
99
|
-
case MessageType.BuyerAck:
|
|
100
|
-
await this._onBuyerAck?.(codec.decodeBuyerAck(frame.payload));
|
|
101
|
-
return true;
|
|
102
|
-
case MessageType.SessionEnd:
|
|
103
|
-
await this._onSessionEnd?.(codec.decodeSessionEnd(frame.payload));
|
|
63
|
+
case MessageType.SpendingAuth:
|
|
64
|
+
await this._onSpendingAuth?.(codec.decodeSpendingAuth(frame.payload));
|
|
104
65
|
return true;
|
|
105
|
-
case MessageType.
|
|
106
|
-
await this.
|
|
66
|
+
case MessageType.AuthAck:
|
|
67
|
+
await this._onAuthAck?.(codec.decodeAuthAck(frame.payload));
|
|
107
68
|
return true;
|
|
108
|
-
case MessageType.
|
|
109
|
-
await this.
|
|
69
|
+
case MessageType.PaymentRequired:
|
|
70
|
+
await this._onPaymentRequired?.(codec.decodePaymentRequired(frame.payload));
|
|
110
71
|
return true;
|
|
111
|
-
case MessageType.
|
|
112
|
-
await this.
|
|
72
|
+
case MessageType.NeedAuth:
|
|
73
|
+
await this._onNeedAuth?.(codec.decodeNeedAuth(frame.payload));
|
|
113
74
|
return true;
|
|
114
75
|
default:
|
|
115
76
|
return false;
|
|
@@ -120,6 +81,7 @@ export class PaymentMux {
|
|
|
120
81
|
return type >= 0x50 && type <= 0x5f;
|
|
121
82
|
}
|
|
122
83
|
_send(type, payload) {
|
|
84
|
+
debugLog(`[PaymentMux] → send ${MESSAGE_TYPE_NAME[type] ?? `0x${type.toString(16)}`} (${payload.length}b)`);
|
|
123
85
|
const frame = encodeFrame({
|
|
124
86
|
type,
|
|
125
87
|
messageId: this._messageIdCounter++ & 0xffffffff,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-mux.js","sourceRoot":"","sources":["../../src/p2p/payment-mux.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"payment-mux.js","sourceRoot":"","sources":["../../src/p2p/payment-mux.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { WalletInfo, Transaction, TransactionType } from './types.js';
|
|
2
2
|
export interface UnifiedBalance {
|
|
3
3
|
cryptoUSDC: number;
|
|
4
|
-
|
|
4
|
+
inDepositsUSDC: number;
|
|
5
5
|
totalUSD: number;
|
|
6
6
|
}
|
|
7
7
|
export declare class BalanceManager {
|
|
8
8
|
private transactions;
|
|
9
|
-
getBalance(walletInfo: WalletInfo | null,
|
|
9
|
+
getBalance(walletInfo: WalletInfo | null, inDepositsUSDC: number): UnifiedBalance;
|
|
10
10
|
recordTransaction(tx: Transaction): void;
|
|
11
11
|
getTransactionHistory(filter?: TransactionType, limit?: number, offset?: number): Transaction[];
|
|
12
12
|
getTotalEarnings(since?: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance-manager.d.ts","sourceRoot":"","sources":["../../src/payments/balance-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"balance-manager.d.ts","sourceRoot":"","sources":["../../src/payments/balance-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,CACR,UAAU,EAAE,UAAU,GAAG,IAAI,EAC7B,cAAc,EAAE,MAAM,GACrB,cAAc;IAWjB,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAIxC,qBAAqB,CACnB,MAAM,CAAC,EAAE,eAAe,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,EAAE;IAYhB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOxC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOlC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS7C"}
|
|
@@ -2,12 +2,12 @@ import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
export class BalanceManager {
|
|
4
4
|
transactions = [];
|
|
5
|
-
getBalance(walletInfo,
|
|
5
|
+
getBalance(walletInfo, inDepositsUSDC) {
|
|
6
6
|
const cryptoUSDC = walletInfo ? parseFloat(walletInfo.balanceUSDC) : 0;
|
|
7
|
-
const totalUSD = cryptoUSDC +
|
|
7
|
+
const totalUSD = cryptoUSDC + inDepositsUSDC;
|
|
8
8
|
return {
|
|
9
9
|
cryptoUSDC,
|
|
10
|
-
|
|
10
|
+
inDepositsUSDC,
|
|
11
11
|
totalUSD,
|
|
12
12
|
};
|
|
13
13
|
}
|
|
@@ -25,13 +25,13 @@ export class BalanceManager {
|
|
|
25
25
|
}
|
|
26
26
|
getTotalEarnings(since) {
|
|
27
27
|
return this.transactions
|
|
28
|
-
.filter((tx) => tx.type === '
|
|
28
|
+
.filter((tx) => tx.type === 'deposit_release')
|
|
29
29
|
.filter((tx) => (since !== undefined ? tx.timestamp >= since : true))
|
|
30
30
|
.reduce((sum, tx) => sum + tx.amountUSD, 0);
|
|
31
31
|
}
|
|
32
32
|
getTotalSpending(since) {
|
|
33
33
|
return this.transactions
|
|
34
|
-
.filter((tx) => tx.type === '
|
|
34
|
+
.filter((tx) => tx.type === 'deposit_lock')
|
|
35
35
|
.filter((tx) => (since !== undefined ? tx.timestamp >= since : true))
|
|
36
36
|
.reduce((sum, tx) => sum + tx.amountUSD, 0);
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance-manager.js","sourceRoot":"","sources":["../../src/payments/balance-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,OAAO,cAAc;IACjB,YAAY,GAAkB,EAAE,CAAC;IAEzC,UAAU,CACR,UAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"balance-manager.js","sourceRoot":"","sources":["../../src/payments/balance-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,122 +1,196 @@
|
|
|
1
|
-
import { type AbstractSigner
|
|
1
|
+
import { type AbstractSigner } from 'ethers';
|
|
2
2
|
import type { Identity } from '../p2p/identity.js';
|
|
3
3
|
import type { PaymentMux } from '../p2p/payment-mux.js';
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
4
|
+
import type { SpendingAuthPayload, AuthAckPayload, NeedAuthPayload } from '../types/protocol.js';
|
|
5
|
+
import { DepositsClient } from './evm/deposits-client.js';
|
|
6
|
+
import { ChannelStore, type StoredChannel } from './channel-store.js';
|
|
7
|
+
import { type ServicePricing } from './pricing.js';
|
|
6
8
|
export interface BuyerPaymentConfig {
|
|
7
|
-
/** Default lock amount in USDC base units (6 decimals). e.g. "1000000" = 1 USDC */
|
|
8
|
-
defaultLockAmountUSDC: string;
|
|
9
|
-
/** Base JSON-RPC endpoint */
|
|
10
9
|
rpcUrl: string;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/** USDC token contract address */
|
|
10
|
+
depositsContractAddress: string;
|
|
11
|
+
channelsContractAddress: string;
|
|
14
12
|
usdcAddress: string;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
identityRegistryAddress: string;
|
|
14
|
+
chainId: number;
|
|
15
|
+
defaultAuthDurationSecs: number;
|
|
16
|
+
/**
|
|
17
|
+
* Max unverified exposure (overdraft limit) in USDC base units.
|
|
18
|
+
* The buyer will never sign more than verifiedCost + maxPerRequestUsdc.
|
|
19
|
+
* Default: 500000 ($0.50).
|
|
20
|
+
*/
|
|
21
|
+
maxPerRequestUsdc: bigint;
|
|
22
|
+
/** Max USDC to reserve per ReserveAuth signature (base units). Default: 1000000 ($1.00). */
|
|
23
|
+
maxReserveAmountUsdc: bigint;
|
|
24
|
+
/** Max ratio of seller-claimed cost to buyer's bytes/4 estimate. Default: 1.4. */
|
|
25
|
+
costToleranceMultiplier?: number;
|
|
26
|
+
dataDir: string;
|
|
21
27
|
}
|
|
22
|
-
|
|
23
|
-
export interface
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
sellerEvmAddress: string;
|
|
27
|
-
lockedAmount: bigint;
|
|
28
|
-
status: BuyerSessionStatus;
|
|
29
|
-
txSignature: string | null;
|
|
30
|
-
lastRunningTotal: bigint;
|
|
31
|
-
lastRequestCount: number;
|
|
32
|
-
createdAt: number;
|
|
33
|
-
updatedAt: number;
|
|
28
|
+
/** Result of signPerRequestAuth — includes the payload and whether a reserve top-up is needed. */
|
|
29
|
+
export interface PerRequestAuthResult {
|
|
30
|
+
payload: SpendingAuthPayload;
|
|
31
|
+
topUpNeeded: boolean;
|
|
34
32
|
}
|
|
35
33
|
/**
|
|
36
|
-
* Manages buyer-side
|
|
37
|
-
*
|
|
38
|
-
* Handles the full lifecycle: lock initiation, receipt acknowledgement,
|
|
39
|
-
* top-up approval, and session settlement.
|
|
34
|
+
* Manages buyer-side payment sessions using EIP-712 SpendingAuth
|
|
35
|
+
* with cumulative authorization, bytes/4 cost verification, and overdraft control.
|
|
40
36
|
*/
|
|
41
37
|
export declare class BuyerPaymentManager {
|
|
42
38
|
private readonly _identity;
|
|
43
39
|
private _signer;
|
|
44
|
-
private readonly
|
|
40
|
+
private readonly _depositsClient;
|
|
45
41
|
private readonly _config;
|
|
46
|
-
private readonly
|
|
47
|
-
|
|
42
|
+
private readonly _channelStore;
|
|
43
|
+
/** In-memory map of active confirmed sessions by seller peerId for fast lookups. */
|
|
44
|
+
private readonly _confirmedPeers;
|
|
45
|
+
/** Peers that explicitly rejected our spending auth. */
|
|
46
|
+
private readonly _rejectedPeers;
|
|
47
|
+
/** sellerPeerId -> cumulative USDC amount in the latest SpendingAuth */
|
|
48
|
+
private readonly _cumulativeAmount;
|
|
49
|
+
/** sellerPeerId -> cumulative metadata for SpendingAuth */
|
|
50
|
+
private readonly _metadata;
|
|
51
|
+
/** sellerPeerId -> buyer-verified cumulative cost from bytes/4 */
|
|
52
|
+
private readonly _verifiedCost;
|
|
53
|
+
/** sellerPeerId -> pricing learned from 402 / peer metadata at session start */
|
|
54
|
+
private readonly _sessionPricing;
|
|
55
|
+
/** Cumulative response token totals per seller, tracked independently of signing metadata. */
|
|
56
|
+
private readonly _responseTokenTotals;
|
|
57
|
+
/** sellerPeerId -> current on-chain reserve ceiling (can grow with top-ups) */
|
|
58
|
+
private readonly _currentReserveCeiling;
|
|
59
|
+
/** sellerPeerId -> salt used in the current reserve */
|
|
60
|
+
private readonly _reserveSalt;
|
|
61
|
+
/** Cached EIP-712 domain — static for the lifetime of this manager. */
|
|
62
|
+
private readonly _channelsDomain;
|
|
63
|
+
constructor(identity: Identity, config: BuyerPaymentConfig, channelStore: ChannelStore);
|
|
64
|
+
/** Hydrate cumulative tracking maps from persisted active buyer sessions. */
|
|
65
|
+
private _hydrateFromStore;
|
|
48
66
|
get signer(): AbstractSigner;
|
|
49
|
-
/** @deprecated Use .signer instead */
|
|
50
|
-
get wallet(): Wallet;
|
|
51
|
-
/** Replace the signer at runtime (e.g. with a WalletConnect signer). */
|
|
52
67
|
setSigner(signer: AbstractSigner): void;
|
|
53
|
-
get
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
|
|
68
|
+
get depositsClient(): DepositsClient;
|
|
69
|
+
private get _costTolerance();
|
|
70
|
+
private _getCeiling;
|
|
71
|
+
/** Clean up all in-memory state for a seller when the session ends. */
|
|
72
|
+
cleanupSession(sellerPeerId: string): void;
|
|
73
|
+
getActiveSession(sellerPeerId: string): StoredChannel | null;
|
|
74
|
+
retireSession(sellerPeerId: string, status: Extract<StoredChannel['status'], 'settled' | 'timeout' | 'ghost'>, settledAmount?: bigint): void;
|
|
75
|
+
canReplayReserveAuth(sellerPeerId: string): boolean;
|
|
76
|
+
resendCurrentSpendingAuth(sellerPeerId: string, paymentMux: PaymentMux): Promise<string>;
|
|
77
|
+
resendReserveAuth(sellerPeerId: string, paymentMux: PaymentMux): Promise<string>;
|
|
58
78
|
/**
|
|
59
|
-
*
|
|
60
|
-
* to the seller
|
|
79
|
+
* Sign and send an initial EIP-712 SpendingAuth to a seller.
|
|
80
|
+
* The initial cumulativeAmount is set to the seller's minBudgetPerRequest.
|
|
81
|
+
*
|
|
82
|
+
* @param pricing Token pricing from the seller's 402 / peer metadata.
|
|
61
83
|
*/
|
|
62
|
-
|
|
84
|
+
authorizeSpending(sellerPeerId: string, paymentMux: PaymentMux, minBudgetPerRequest: bigint, reserveAmountOrPricing?: bigint | ServicePricing, pricingArg?: ServicePricing): Promise<string>;
|
|
85
|
+
handleAuthAck(sellerPeerId: string, payload: AuthAckPayload): void;
|
|
63
86
|
/**
|
|
64
|
-
*
|
|
87
|
+
* Estimate tokens and cost from response content without updating state.
|
|
65
88
|
*/
|
|
66
|
-
|
|
89
|
+
private _estimateResponseCost;
|
|
67
90
|
/**
|
|
68
|
-
*
|
|
91
|
+
* Accumulate a cost estimate into verifiedCost.
|
|
69
92
|
*/
|
|
70
|
-
|
|
93
|
+
private _accumulateVerifiedCost;
|
|
71
94
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
95
|
+
* Record response content and update the buyer's verified cost.
|
|
96
|
+
* Call this after receiving each response from the seller.
|
|
97
|
+
*
|
|
98
|
+
* NOTE: Do not call this AND signPerRequestAuth for the same response —
|
|
99
|
+
* signPerRequestAuth already updates verifiedCost internally.
|
|
100
|
+
*
|
|
101
|
+
* @returns The updated verified cost and estimated tokens, or null if no pricing is available.
|
|
74
102
|
*/
|
|
75
|
-
|
|
103
|
+
recordResponseBytes(sellerPeerId: string, inputBytes: Uint8Array, outputBytes: Uint8Array): {
|
|
104
|
+
verifiedCost: bigint;
|
|
105
|
+
inputTokens: number;
|
|
106
|
+
outputTokens: number;
|
|
107
|
+
} | null;
|
|
76
108
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* Otherwise, end the session.
|
|
109
|
+
* Compute the max signable cumulative amount based on the overdraft model:
|
|
110
|
+
* maxSignable = verifiedCost + maxPerRequestUsdc, capped at reserve ceiling.
|
|
80
111
|
*/
|
|
81
|
-
|
|
112
|
+
private _maxSignable;
|
|
82
113
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
114
|
+
* Check whether the current cumulative amount is approaching the reserve ceiling
|
|
115
|
+
* and a top-up should be triggered.
|
|
85
116
|
*/
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Deposit USDC into the escrow contract.
|
|
89
|
-
* @param amount Amount in USDC base units (6 decimals).
|
|
90
|
-
*/
|
|
91
|
-
deposit(amount: bigint): Promise<string>;
|
|
117
|
+
private _needsTopUp;
|
|
92
118
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
119
|
+
* Sign an updated SpendingAuth after receiving a response.
|
|
120
|
+
*
|
|
121
|
+
* The buyer uses the seller's claimed cost to advance the cumulative amount,
|
|
122
|
+
* but validates it against the buyer's bytes/4 estimate. If the seller's claim
|
|
123
|
+
* exceeds the buyer's estimate by more than the configured tolerance, the buyer
|
|
124
|
+
* caps at tolerance * buyerEstimate. The cumulative is also capped at the
|
|
125
|
+
* overdraft limit (verifiedCost + maxPerRequestUsdc) and the reserve ceiling.
|
|
126
|
+
*
|
|
127
|
+
* @param sellerPeerId Seller peer ID.
|
|
128
|
+
* @param responseStats Byte counts from the last response and seller's claimed cost.
|
|
129
|
+
* @param addedLatencyMs Optional latency for metadata.
|
|
130
|
+
* @returns The signed payload and whether a reserve top-up is needed.
|
|
95
131
|
*/
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
deposited: bigint;
|
|
102
|
-
committed: bigint;
|
|
103
|
-
available: bigint;
|
|
104
|
-
}>;
|
|
132
|
+
signPerRequestAuth(sellerPeerId: string, responseStats: {
|
|
133
|
+
inputBytes: Uint8Array;
|
|
134
|
+
outputBytes: Uint8Array;
|
|
135
|
+
sellerClaimedCost?: bigint;
|
|
136
|
+
}, addedLatencyMs?: bigint): Promise<PerRequestAuthResult>;
|
|
105
137
|
/**
|
|
106
|
-
*
|
|
138
|
+
* Handle seller-initiated NeedAuth messages when the seller's budget runs out mid-session.
|
|
139
|
+
* Caps the signed amount at verifiedCost + maxPerRequestUsdc (overdraft model).
|
|
107
140
|
*/
|
|
108
|
-
|
|
141
|
+
handleNeedAuth(sellerPeerId: string, payload: NeedAuthPayload, paymentMux: PaymentMux): Promise<void>;
|
|
109
142
|
/**
|
|
110
|
-
*
|
|
143
|
+
* Sign a new ReserveAuth with a higher maxAmount to extend the session's reserve ceiling.
|
|
144
|
+
* The seller must call reserve() on-chain again with the new signature.
|
|
145
|
+
* Note: requires contract support for top-up (increaseDeposit on existing channelId).
|
|
111
146
|
*/
|
|
112
|
-
|
|
147
|
+
topUpReserve(sellerPeerId: string, paymentMux: PaymentMux): Promise<void>;
|
|
148
|
+
/** Max USDC overdraft (unverified exposure) from buyer config. */
|
|
149
|
+
get maxPerRequestUsdc(): bigint;
|
|
150
|
+
/** Max USDC per ReserveAuth signature from buyer config. */
|
|
151
|
+
get maxReserveAmountUsdc(): bigint;
|
|
152
|
+
/** Current buyer-verified cost for a seller. */
|
|
153
|
+
getVerifiedCost(sellerPeerId: string): bigint;
|
|
154
|
+
/** Current reserve ceiling for a seller (may be higher than initial after top-ups). */
|
|
155
|
+
getReserveCeiling(sellerPeerId: string): bigint;
|
|
156
|
+
/** Current cumulative signed amount for a seller. */
|
|
157
|
+
getCumulativeAmount(sellerPeerId: string): bigint;
|
|
158
|
+
/** Live cumulative token counts for a seller (in-memory, always up-to-date). */
|
|
159
|
+
getCumulativeTokens(sellerPeerId: string): {
|
|
160
|
+
inputTokens: bigint;
|
|
161
|
+
outputTokens: bigint;
|
|
162
|
+
};
|
|
113
163
|
/**
|
|
114
|
-
*
|
|
164
|
+
* Accumulate response token counts and persist to the channel store.
|
|
165
|
+
* Tracks its own running totals independently of signPerRequestAuth metadata,
|
|
166
|
+
* so the persisted data is always up-to-date after each response.
|
|
115
167
|
*/
|
|
168
|
+
recordAndPersistTokens(sellerPeerId: string, inputTokens: number, outputTokens: number): void;
|
|
169
|
+
/** Get the live response token totals for a seller, or null if none recorded this session. */
|
|
170
|
+
getResponseTokenTotals(sellerPeerId: string): {
|
|
171
|
+
input: number;
|
|
172
|
+
output: number;
|
|
173
|
+
requests: number;
|
|
174
|
+
} | null;
|
|
175
|
+
/** Check if a session has been confirmed via AuthAck. */
|
|
176
|
+
isAuthorized(sellerPeerId: string): boolean;
|
|
177
|
+
/** Alias for isAuthorized (used by polling loop). */
|
|
116
178
|
isLockConfirmed(sellerPeerId: string): boolean;
|
|
117
|
-
/**
|
|
118
|
-
* Check if a session lock has been rejected (for polling).
|
|
119
|
-
*/
|
|
179
|
+
/** Check if the lock was explicitly rejected (not just never-contacted). */
|
|
120
180
|
isLockRejected(sellerPeerId: string): boolean;
|
|
181
|
+
/** Mark a peer as having rejected our spending auth. */
|
|
182
|
+
markRejected(sellerPeerId: string): void;
|
|
183
|
+
getSessionHistory(sellerPeerId: string): StoredChannel[];
|
|
184
|
+
deposit(amount: bigint): Promise<string>;
|
|
185
|
+
withdraw(amount: bigint): Promise<string>;
|
|
186
|
+
getBalance(): Promise<{
|
|
187
|
+
available: bigint;
|
|
188
|
+
reserved: bigint;
|
|
189
|
+
}>;
|
|
190
|
+
static parseResponseCost(headers: Record<string, string>): {
|
|
191
|
+
cost: bigint;
|
|
192
|
+
inputTokens: bigint;
|
|
193
|
+
outputTokens: bigint;
|
|
194
|
+
} | null;
|
|
121
195
|
}
|
|
122
196
|
//# sourceMappingURL=buyer-payment-manager.d.ts.map
|