@antseed/node 0.2.25 → 0.2.27
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 +74 -1
- package/dist/discovery/announcer.d.ts +2 -0
- package/dist/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +10 -6
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/discovery/index.d.ts +0 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +0 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/reputation-verifier.d.ts +7 -4
- package/dist/discovery/reputation-verifier.d.ts.map +1 -1
- package/dist/discovery/reputation-verifier.js +33 -9
- package/dist/discovery/reputation-verifier.js.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +60 -33
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +640 -324
- package/dist/node.js.map +1 -1
- package/dist/p2p/connection-manager.d.ts.map +1 -1
- package/dist/p2p/connection-manager.js +6 -0
- package/dist/p2p/connection-manager.js.map +1 -1
- package/dist/p2p/identity.d.ts +27 -3
- package/dist/p2p/identity.d.ts.map +1 -1
- package/dist/p2p/identity.js +52 -13
- package/dist/p2p/identity.js.map +1 -1
- package/dist/p2p/index.d.ts +0 -2
- package/dist/p2p/index.d.ts.map +1 -1
- package/dist/p2p/index.js +0 -2
- package/dist/p2p/index.js.map +1 -1
- package/dist/p2p/payment-codec.d.ts +7 -13
- package/dist/p2p/payment-codec.d.ts.map +1 -1
- package/dist/p2p/payment-codec.js +32 -50
- package/dist/p2p/payment-codec.js.map +1 -1
- package/dist/p2p/payment-mux.d.ts +11 -20
- package/dist/p2p/payment-mux.d.ts.map +1 -1
- package/dist/p2p/payment-mux.js +36 -52
- package/dist/p2p/payment-mux.js.map +1 -1
- package/dist/payments/buyer-payment-manager.d.ts +34 -93
- package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
- package/dist/payments/buyer-payment-manager.js +184 -189
- package/dist/payments/buyer-payment-manager.js.map +1 -1
- package/dist/payments/chain-config.d.ts +38 -0
- package/dist/payments/chain-config.d.ts.map +1 -0
- package/dist/payments/chain-config.js +60 -0
- package/dist/payments/chain-config.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 +66 -0
- package/dist/payments/evm/ants-token-client.js.map +1 -0
- package/dist/payments/evm/base-evm-client.d.ts +13 -0
- package/dist/payments/evm/base-evm-client.d.ts.map +1 -0
- package/dist/payments/evm/base-evm-client.js +38 -0
- package/dist/payments/evm/base-evm-client.js.map +1 -0
- package/dist/payments/evm/emissions-client.d.ts +23 -0
- package/dist/payments/evm/emissions-client.d.ts.map +1 -0
- package/dist/payments/evm/emissions-client.js +84 -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 +34 -0
- package/dist/payments/evm/identity-client.d.ts.map +1 -0
- package/dist/payments/evm/identity-client.js +125 -0
- package/dist/payments/evm/identity-client.js.map +1 -0
- package/dist/payments/evm/signatures.d.ts +18 -5
- package/dist/payments/evm/signatures.d.ts.map +1 -1
- package/dist/payments/evm/signatures.js +21 -12
- package/dist/payments/evm/signatures.js.map +1 -1
- 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 +20 -7
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +17 -6
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/readiness.d.ts +12 -0
- package/dist/payments/readiness.d.ts.map +1 -0
- package/dist/payments/readiness.js +64 -0
- package/dist/payments/readiness.js.map +1 -0
- package/dist/payments/seller-payment-manager.d.ts +74 -34
- package/dist/payments/seller-payment-manager.d.ts.map +1 -1
- package/dist/payments/seller-payment-manager.js +327 -118
- package/dist/payments/seller-payment-manager.js.map +1 -1
- package/dist/payments/session-store.d.ts +65 -0
- package/dist/payments/session-store.d.ts.map +1 -0
- package/dist/payments/session-store.js +243 -0
- package/dist/payments/session-store.js.map +1 -0
- 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/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 +1 -1
- package/dist/types/metering.d.ts.map +1 -1
- package/dist/types/protocol.d.ts +43 -60
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/protocol.js +5 -8
- package/dist/types/protocol.js.map +1 -1
- package/package.json +3 -2
package/dist/p2p/identity.js
CHANGED
|
@@ -12,28 +12,67 @@ const PRIVATE_KEY_FILE = "identity.key";
|
|
|
12
12
|
const ED25519_PKCS8_SEED_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
|
|
13
13
|
const ED25519_SPKI_PUBLIC_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
* The private key is stored as hex in ~/.antseed/identity.key.
|
|
15
|
+
* Stores identity private key as a hex file on disk (default behavior).
|
|
17
16
|
*/
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
export class FileIdentityStore {
|
|
18
|
+
keyPath;
|
|
19
|
+
dir;
|
|
20
|
+
constructor(configDir) {
|
|
21
|
+
this.dir = configDir ?? CONFIG_DIR;
|
|
22
|
+
this.keyPath = join(this.dir, PRIVATE_KEY_FILE);
|
|
23
|
+
}
|
|
24
|
+
async load() {
|
|
25
|
+
try {
|
|
26
|
+
const hexKey = (await readFile(this.keyPath, "utf-8")).trim();
|
|
27
|
+
return hexKey.length > 0 ? hexKey : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async save(hexKey) {
|
|
34
|
+
await mkdir(this.dir, { recursive: true });
|
|
35
|
+
await writeFile(this.keyPath, hexKey, { mode: 0o600 });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Environment variable for passing identity hex from a parent process (e.g. desktop → CLI). */
|
|
39
|
+
const IDENTITY_HEX_ENV = 'ANTSEED_IDENTITY_HEX';
|
|
40
|
+
/**
|
|
41
|
+
* Load an existing identity or create and persist a new one.
|
|
42
|
+
*
|
|
43
|
+
* Accepts either a config directory path (legacy file-based storage)
|
|
44
|
+
* or an IdentityStore instance for pluggable backends (e.g. keytar).
|
|
45
|
+
*
|
|
46
|
+
* If the ANTSEED_IDENTITY_HEX env var is set, it is used directly
|
|
47
|
+
* (e.g. when the desktop app injects identity from the keychain).
|
|
48
|
+
*/
|
|
49
|
+
export async function loadOrCreateIdentity(configDirOrStore) {
|
|
50
|
+
// Check for identity injected via environment (desktop → CLI child process).
|
|
51
|
+
// The CLI clears the variable after reading to limit exposure in /proc/<pid>/environ.
|
|
52
|
+
const envHex = process.env[IDENTITY_HEX_ENV]?.trim();
|
|
53
|
+
if (envHex && envHex.length === 64) {
|
|
54
|
+
delete process.env[IDENTITY_HEX_ENV];
|
|
55
|
+
const privateKey = hexToBytes(envHex);
|
|
24
56
|
const publicKey = await ed.getPublicKeyAsync(privateKey);
|
|
25
57
|
const peerId = toPeerId(bytesToHex(publicKey));
|
|
26
58
|
return { peerId, privateKey, publicKey };
|
|
27
59
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
60
|
+
const store = configDirOrStore === undefined || typeof configDirOrStore === 'string'
|
|
61
|
+
? new FileIdentityStore(configDirOrStore)
|
|
62
|
+
: configDirOrStore;
|
|
63
|
+
const existingHex = await store.load();
|
|
64
|
+
if (existingHex) {
|
|
65
|
+
const privateKey = hexToBytes(existingHex);
|
|
31
66
|
const publicKey = await ed.getPublicKeyAsync(privateKey);
|
|
32
67
|
const peerId = toPeerId(bytesToHex(publicKey));
|
|
33
|
-
await mkdir(dir, { recursive: true });
|
|
34
|
-
await writeFile(keyPath, bytesToHex(privateKey), { mode: 0o600 });
|
|
35
68
|
return { peerId, privateKey, publicKey };
|
|
36
69
|
}
|
|
70
|
+
// Key doesn't exist — generate a new one.
|
|
71
|
+
const privateKey = ed.utils.randomPrivateKey();
|
|
72
|
+
const publicKey = await ed.getPublicKeyAsync(privateKey);
|
|
73
|
+
const peerId = toPeerId(bytesToHex(publicKey));
|
|
74
|
+
await store.save(bytesToHex(privateKey));
|
|
75
|
+
return { peerId, privateKey, publicKey };
|
|
37
76
|
}
|
|
38
77
|
/** Sign arbitrary data with the local identity's private key. */
|
|
39
78
|
export async function signData(privateKey, data) {
|
package/dist/p2p/identity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/p2p/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,IAAI,IAAI,QAAQ,EAChB,MAAM,IAAI,UAAU,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAe,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAElC,gDAAgD;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,gBAAgB,GAAG,cAAc,CAAC;AACxC,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;AACzF,MAAM,0BAA0B,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/p2p/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/p2p/index.d.ts
CHANGED
|
@@ -3,8 +3,6 @@ export { encodeFrame, decodeFrame, FrameDecoder, MessageMux, type MessageHandler
|
|
|
3
3
|
export { ConnectionManager, PeerConnection, type PeerEndpoint } from './connection-manager.js';
|
|
4
4
|
export { type IceServer, type IceConfig, getDefaultIceConfig, buildIceConfig, needsTurnFallback, extractCandidateType } from './ice-config.js';
|
|
5
5
|
export { KeepaliveManager, buildPongPayload, type KeepaliveConfig, type KeepaliveCallbacks, DEFAULT_PING_INTERVAL_MS, DEFAULT_PONG_TIMEOUT_MS, MAX_MISSED_PONGS } from './keepalive.js';
|
|
6
|
-
export { ReconnectManager, type ReconnectConfig, type ReconnectCallbacks } from './reconnect.js';
|
|
7
|
-
export { performHandshake, respondToHandshake, buildHandshakeInit, verifyHandshakeInit, buildHandshakeAck, verifyHandshakeAck, type HandshakeResult } from './handshake.js';
|
|
8
6
|
export { NatTraversal, type NatMapping, type NatTraversalResult } from './nat-traversal.js';
|
|
9
7
|
export { PaymentMux } from './payment-mux.js';
|
|
10
8
|
export type { PaymentMessageHandler } from './payment-mux.js';
|
package/dist/p2p/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3J,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC/I,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxL,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3J,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC/I,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxL,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,cAAc,oBAAoB,CAAC"}
|
package/dist/p2p/index.js
CHANGED
|
@@ -3,8 +3,6 @@ export { encodeFrame, decodeFrame, FrameDecoder, MessageMux } from './message-pr
|
|
|
3
3
|
export { ConnectionManager, PeerConnection } from './connection-manager.js';
|
|
4
4
|
export { getDefaultIceConfig, buildIceConfig, needsTurnFallback, extractCandidateType } from './ice-config.js';
|
|
5
5
|
export { KeepaliveManager, buildPongPayload, DEFAULT_PING_INTERVAL_MS, DEFAULT_PONG_TIMEOUT_MS, MAX_MISSED_PONGS } from './keepalive.js';
|
|
6
|
-
export { ReconnectManager } from './reconnect.js';
|
|
7
|
-
export { performHandshake, respondToHandshake, buildHandshakeInit, verifyHandshakeInit, buildHandshakeAck, verifyHandshakeAck } from './handshake.js';
|
|
8
6
|
export { NatTraversal } from './nat-traversal.js';
|
|
9
7
|
export { PaymentMux } from './payment-mux.js';
|
|
10
8
|
export * from './payment-codec.js';
|
package/dist/p2p/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3J,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAuB,MAAM,uBAAuB,CAAC;AAChH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAkC,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC/I,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAiD,wBAAwB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxL,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3J,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAuB,MAAM,uBAAuB,CAAC;AAChH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAkC,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC/I,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAiD,wBAAwB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxL,OAAO,EAAE,YAAY,EAA4C,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function encodeSessionLockReject(payload: SessionLockRejectPayload): Uint8Array;
|
|
1
|
+
import type { SpendingAuthPayload, AuthAckPayload, SellerReceiptPayload, BuyerAckPayload, TopUpRequestPayload, PaymentRequiredPayload } from '../types/protocol.js';
|
|
2
|
+
export declare function encodeSpendingAuth(payload: SpendingAuthPayload): Uint8Array;
|
|
3
|
+
export declare function encodeAuthAck(payload: AuthAckPayload): Uint8Array;
|
|
5
4
|
export declare function encodeSellerReceipt(payload: SellerReceiptPayload): Uint8Array;
|
|
6
5
|
export declare function encodeBuyerAck(payload: BuyerAckPayload): Uint8Array;
|
|
7
|
-
export declare function encodeSessionEnd(payload: SessionEndPayload): Uint8Array;
|
|
8
6
|
export declare function encodeTopUpRequest(payload: TopUpRequestPayload): Uint8Array;
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function
|
|
11
|
-
export declare function decodeSessionLockAuth(data: Uint8Array): SessionLockAuthPayload;
|
|
12
|
-
export declare function decodeSessionLockConfirm(data: Uint8Array): SessionLockConfirmPayload;
|
|
13
|
-
export declare function decodeSessionLockReject(data: Uint8Array): SessionLockRejectPayload;
|
|
7
|
+
export declare function decodeSpendingAuth(data: Uint8Array): SpendingAuthPayload;
|
|
8
|
+
export declare function decodeAuthAck(data: Uint8Array): AuthAckPayload;
|
|
14
9
|
export declare function decodeSellerReceipt(data: Uint8Array): SellerReceiptPayload;
|
|
15
10
|
export declare function decodeBuyerAck(data: Uint8Array): BuyerAckPayload;
|
|
16
|
-
export declare function decodeSessionEnd(data: Uint8Array): SessionEndPayload;
|
|
17
11
|
export declare function decodeTopUpRequest(data: Uint8Array): TopUpRequestPayload;
|
|
18
|
-
export declare function
|
|
19
|
-
export declare function
|
|
12
|
+
export declare function encodePaymentRequired(payload: PaymentRequiredPayload): Uint8Array;
|
|
13
|
+
export declare function decodePaymentRequired(data: Uint8Array): PaymentRequiredPayload;
|
|
20
14
|
//# sourceMappingURL=payment-codec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-codec.d.ts","sourceRoot":"","sources":["../../src/p2p/payment-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"payment-codec.d.ts","sourceRoot":"","sources":["../../src/p2p/payment-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAsC9B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAE3E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAE7E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAEnE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAE3E;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAYxE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAM9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,oBAAoB,CAS1E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAQhE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAQxE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,UAAU,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,sBAAsB,CAY9E"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
const encoder = new TextEncoder();
|
|
2
2
|
const decoder = new TextDecoder();
|
|
3
3
|
// --- Validation helpers ---
|
|
4
|
+
const MAX_PAYLOAD_SIZE = 65536; // 64KB
|
|
4
5
|
function parseJson(data) {
|
|
6
|
+
if (data.byteLength > MAX_PAYLOAD_SIZE) {
|
|
7
|
+
throw new Error(`Payment payload too large: ${data.byteLength} bytes (max ${MAX_PAYLOAD_SIZE})`);
|
|
8
|
+
}
|
|
5
9
|
const raw = JSON.parse(decoder.decode(data));
|
|
6
10
|
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
7
11
|
throw new Error('Expected JSON object');
|
|
@@ -23,13 +27,10 @@ function requireNumber(obj, field) {
|
|
|
23
27
|
return val;
|
|
24
28
|
}
|
|
25
29
|
// --- Encoders ---
|
|
26
|
-
export function
|
|
27
|
-
return encoder.encode(JSON.stringify(payload));
|
|
28
|
-
}
|
|
29
|
-
export function encodeSessionLockConfirm(payload) {
|
|
30
|
+
export function encodeSpendingAuth(payload) {
|
|
30
31
|
return encoder.encode(JSON.stringify(payload));
|
|
31
32
|
}
|
|
32
|
-
export function
|
|
33
|
+
export function encodeAuthAck(payload) {
|
|
33
34
|
return encoder.encode(JSON.stringify(payload));
|
|
34
35
|
}
|
|
35
36
|
export function encodeSellerReceipt(payload) {
|
|
@@ -38,39 +39,28 @@ export function encodeSellerReceipt(payload) {
|
|
|
38
39
|
export function encodeBuyerAck(payload) {
|
|
39
40
|
return encoder.encode(JSON.stringify(payload));
|
|
40
41
|
}
|
|
41
|
-
export function encodeSessionEnd(payload) {
|
|
42
|
-
return encoder.encode(JSON.stringify(payload));
|
|
43
|
-
}
|
|
44
42
|
export function encodeTopUpRequest(payload) {
|
|
45
43
|
return encoder.encode(JSON.stringify(payload));
|
|
46
44
|
}
|
|
47
|
-
export function encodeTopUpAuth(payload) {
|
|
48
|
-
return encoder.encode(JSON.stringify(payload));
|
|
49
|
-
}
|
|
50
|
-
export function encodeDisputeNotify(payload) {
|
|
51
|
-
return encoder.encode(JSON.stringify(payload));
|
|
52
|
-
}
|
|
53
45
|
// --- Decoders (with runtime validation) ---
|
|
54
|
-
export function
|
|
46
|
+
export function decodeSpendingAuth(data) {
|
|
55
47
|
const obj = parseJson(data);
|
|
56
48
|
return {
|
|
57
49
|
sessionId: requireString(obj, 'sessionId'),
|
|
58
|
-
|
|
50
|
+
maxAmountUsdc: requireString(obj, 'maxAmountUsdc'),
|
|
51
|
+
nonce: requireNumber(obj, 'nonce'),
|
|
52
|
+
deadline: requireNumber(obj, 'deadline'),
|
|
59
53
|
buyerSig: requireString(obj, 'buyerSig'),
|
|
54
|
+
buyerEvmAddr: requireString(obj, 'buyerEvmAddr'),
|
|
55
|
+
previousConsumption: requireString(obj, 'previousConsumption'),
|
|
56
|
+
previousSessionId: requireString(obj, 'previousSessionId'),
|
|
60
57
|
};
|
|
61
58
|
}
|
|
62
|
-
export function
|
|
59
|
+
export function decodeAuthAck(data) {
|
|
63
60
|
const obj = parseJson(data);
|
|
64
61
|
return {
|
|
65
62
|
sessionId: requireString(obj, 'sessionId'),
|
|
66
|
-
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
export function decodeSessionLockReject(data) {
|
|
70
|
-
const obj = parseJson(data);
|
|
71
|
-
return {
|
|
72
|
-
sessionId: requireString(obj, 'sessionId'),
|
|
73
|
-
reason: requireString(obj, 'reason'),
|
|
63
|
+
nonce: requireNumber(obj, 'nonce'),
|
|
74
64
|
};
|
|
75
65
|
}
|
|
76
66
|
export function decodeSellerReceipt(data) {
|
|
@@ -92,39 +82,31 @@ export function decodeBuyerAck(data) {
|
|
|
92
82
|
buyerSig: requireString(obj, 'buyerSig'),
|
|
93
83
|
};
|
|
94
84
|
}
|
|
95
|
-
export function decodeSessionEnd(data) {
|
|
96
|
-
const obj = parseJson(data);
|
|
97
|
-
return {
|
|
98
|
-
sessionId: requireString(obj, 'sessionId'),
|
|
99
|
-
runningTotal: requireString(obj, 'runningTotal'),
|
|
100
|
-
requestCount: requireNumber(obj, 'requestCount'),
|
|
101
|
-
score: requireNumber(obj, 'score'),
|
|
102
|
-
buyerSig: requireString(obj, 'buyerSig'),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
85
|
export function decodeTopUpRequest(data) {
|
|
106
86
|
const obj = parseJson(data);
|
|
107
87
|
return {
|
|
108
88
|
sessionId: requireString(obj, 'sessionId'),
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
89
|
+
currentUsed: requireString(obj, 'currentUsed'),
|
|
90
|
+
currentMax: requireString(obj, 'currentMax'),
|
|
91
|
+
requestedAdditional: requireString(obj, 'requestedAdditional'),
|
|
112
92
|
};
|
|
113
93
|
}
|
|
114
|
-
export function
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
sessionId: requireString(obj, 'sessionId'),
|
|
118
|
-
additionalAmount: requireString(obj, 'additionalAmount'),
|
|
119
|
-
buyerSig: requireString(obj, 'buyerSig'),
|
|
120
|
-
};
|
|
94
|
+
export function encodePaymentRequired(payload) {
|
|
95
|
+
return encoder.encode(JSON.stringify(payload));
|
|
121
96
|
}
|
|
122
|
-
export function
|
|
97
|
+
export function decodePaymentRequired(data) {
|
|
123
98
|
const obj = parseJson(data);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
99
|
+
const result = {
|
|
100
|
+
sellerEvmAddr: requireString(obj, 'sellerEvmAddr'),
|
|
101
|
+
tokenRate: requireString(obj, 'tokenRate'),
|
|
102
|
+
firstSignCap: requireString(obj, 'firstSignCap'),
|
|
103
|
+
suggestedAmount: requireString(obj, 'suggestedAmount'),
|
|
104
|
+
requestId: requireString(obj, 'requestId'),
|
|
128
105
|
};
|
|
106
|
+
if (typeof obj.inputUsdPerMillion === 'number')
|
|
107
|
+
result.inputUsdPerMillion = obj.inputUsdPerMillion;
|
|
108
|
+
if (typeof obj.outputUsdPerMillion === 'number')
|
|
109
|
+
result.outputUsdPerMillion = obj.outputUsdPerMillion;
|
|
110
|
+
return result;
|
|
129
111
|
}
|
|
130
112
|
//# sourceMappingURL=payment-codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-codec.js","sourceRoot":"","sources":["../../src/p2p/payment-codec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment-codec.js","sourceRoot":"","sources":["../../src/p2p/payment-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +1,34 @@
|
|
|
1
1
|
import type { PeerConnection } from './connection-manager.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { SpendingAuthPayload, AuthAckPayload, SellerReceiptPayload, BuyerAckPayload, TopUpRequestPayload, PaymentRequiredPayload } 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 _onSessionLockReject?;
|
|
13
|
+
private _onSpendingAuth?;
|
|
14
|
+
private _onAuthAck?;
|
|
16
15
|
private _onSellerReceipt?;
|
|
17
16
|
private _onBuyerAck?;
|
|
18
|
-
private _onSessionEnd?;
|
|
19
17
|
private _onTopUpRequest?;
|
|
20
|
-
private
|
|
21
|
-
private _onDisputeNotify?;
|
|
18
|
+
private _onPaymentRequired?;
|
|
22
19
|
constructor(connection: PeerConnection);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
onSessionLockReject(handler: PaymentMessageHandler<SessionLockRejectPayload>): void;
|
|
20
|
+
onSpendingAuth(handler: PaymentMessageHandler<SpendingAuthPayload>): void;
|
|
21
|
+
onAuthAck(handler: PaymentMessageHandler<AuthAckPayload>): void;
|
|
26
22
|
onSellerReceipt(handler: PaymentMessageHandler<SellerReceiptPayload>): void;
|
|
27
23
|
onBuyerAck(handler: PaymentMessageHandler<BuyerAckPayload>): void;
|
|
28
|
-
onSessionEnd(handler: PaymentMessageHandler<SessionEndPayload>): void;
|
|
29
24
|
onTopUpRequest(handler: PaymentMessageHandler<TopUpRequestPayload>): void;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
sendSessionLockConfirm(payload: SessionLockConfirmPayload): void;
|
|
34
|
-
sendSessionLockReject(payload: SessionLockRejectPayload): void;
|
|
25
|
+
onPaymentRequired(handler: PaymentMessageHandler<PaymentRequiredPayload>): void;
|
|
26
|
+
sendSpendingAuth(payload: SpendingAuthPayload): void;
|
|
27
|
+
sendAuthAck(payload: AuthAckPayload): void;
|
|
35
28
|
sendSellerReceipt(payload: SellerReceiptPayload): void;
|
|
36
29
|
sendBuyerAck(payload: BuyerAckPayload): void;
|
|
37
|
-
sendSessionEnd(payload: SessionEndPayload): void;
|
|
38
30
|
sendTopUpRequest(payload: TopUpRequestPayload): void;
|
|
39
|
-
|
|
40
|
-
sendDisputeNotify(payload: DisputeNotifyPayload): void;
|
|
31
|
+
sendPaymentRequired(payload: PaymentRequiredPayload): void;
|
|
41
32
|
/**
|
|
42
33
|
* Returns true if this frame is a payment message and was handled.
|
|
43
34
|
*/
|
|
@@ -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,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D,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,gBAAgB,CAAC,CAA8C;IACvE,OAAO,CAAC,WAAW,CAAC,CAAyC;IAC7D,OAAO,CAAC,eAAe,CAAC,CAA6C;IACrE,OAAO,CAAC,kBAAkB,CAAC,CAAgD;gBAE/D,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,eAAe,CAAC,OAAO,EAAE,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAG3E,UAAU,CAAC,OAAO,EAAE,qBAAqB,CAAC,eAAe,CAAC,GAAG,IAAI;IAGjE,cAAc,CAAC,OAAO,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAGzE,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,IAAI;IAK/E,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAGpD,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAG1C,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAGtD,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAG5C,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAGpD,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAK1D;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BzD,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,17 @@
|
|
|
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.SellerReceipt]: 'SellerReceipt',
|
|
9
|
+
[MessageType.BuyerAck]: 'BuyerAck',
|
|
10
|
+
[MessageType.TopUpRequest]: 'TopUpRequest',
|
|
11
|
+
[MessageType.PaymentRequired]: 'PaymentRequired',
|
|
12
|
+
};
|
|
4
13
|
/**
|
|
5
|
-
* Multiplexes
|
|
14
|
+
* Multiplexes payment messages over a PeerConnection.
|
|
6
15
|
* Register handlers for each message type, then call handleFrame()
|
|
7
16
|
* when a payment-range frame arrives.
|
|
8
17
|
*/
|
|
@@ -10,27 +19,21 @@ export class PaymentMux {
|
|
|
10
19
|
_connection;
|
|
11
20
|
_messageIdCounter = 0;
|
|
12
21
|
// Handler registrations
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
_onSessionLockReject;
|
|
22
|
+
_onSpendingAuth;
|
|
23
|
+
_onAuthAck;
|
|
16
24
|
_onSellerReceipt;
|
|
17
25
|
_onBuyerAck;
|
|
18
|
-
_onSessionEnd;
|
|
19
26
|
_onTopUpRequest;
|
|
20
|
-
|
|
21
|
-
_onDisputeNotify;
|
|
27
|
+
_onPaymentRequired;
|
|
22
28
|
constructor(connection) {
|
|
23
29
|
this._connection = connection;
|
|
24
30
|
}
|
|
25
31
|
// --- Handler registration ---
|
|
26
|
-
|
|
27
|
-
this.
|
|
32
|
+
onSpendingAuth(handler) {
|
|
33
|
+
this._onSpendingAuth = handler;
|
|
28
34
|
}
|
|
29
|
-
|
|
30
|
-
this.
|
|
31
|
-
}
|
|
32
|
-
onSessionLockReject(handler) {
|
|
33
|
-
this._onSessionLockReject = handler;
|
|
35
|
+
onAuthAck(handler) {
|
|
36
|
+
this._onAuthAck = handler;
|
|
34
37
|
}
|
|
35
38
|
onSellerReceipt(handler) {
|
|
36
39
|
this._onSellerReceipt = handler;
|
|
@@ -38,27 +41,18 @@ export class PaymentMux {
|
|
|
38
41
|
onBuyerAck(handler) {
|
|
39
42
|
this._onBuyerAck = handler;
|
|
40
43
|
}
|
|
41
|
-
onSessionEnd(handler) {
|
|
42
|
-
this._onSessionEnd = handler;
|
|
43
|
-
}
|
|
44
44
|
onTopUpRequest(handler) {
|
|
45
45
|
this._onTopUpRequest = handler;
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
}
|
|
50
|
-
onDisputeNotify(handler) {
|
|
51
|
-
this._onDisputeNotify = handler;
|
|
47
|
+
onPaymentRequired(handler) {
|
|
48
|
+
this._onPaymentRequired = handler;
|
|
52
49
|
}
|
|
53
50
|
// --- Sending ---
|
|
54
|
-
|
|
55
|
-
this._send(MessageType.
|
|
51
|
+
sendSpendingAuth(payload) {
|
|
52
|
+
this._send(MessageType.SpendingAuth, codec.encodeSpendingAuth(payload));
|
|
56
53
|
}
|
|
57
|
-
|
|
58
|
-
this._send(MessageType.
|
|
59
|
-
}
|
|
60
|
-
sendSessionLockReject(payload) {
|
|
61
|
-
this._send(MessageType.SessionLockReject, codec.encodeSessionLockReject(payload));
|
|
54
|
+
sendAuthAck(payload) {
|
|
55
|
+
this._send(MessageType.AuthAck, codec.encodeAuthAck(payload));
|
|
62
56
|
}
|
|
63
57
|
sendSellerReceipt(payload) {
|
|
64
58
|
this._send(MessageType.SellerReceipt, codec.encodeSellerReceipt(payload));
|
|
@@ -66,32 +60,27 @@ export class PaymentMux {
|
|
|
66
60
|
sendBuyerAck(payload) {
|
|
67
61
|
this._send(MessageType.BuyerAck, codec.encodeBuyerAck(payload));
|
|
68
62
|
}
|
|
69
|
-
sendSessionEnd(payload) {
|
|
70
|
-
this._send(MessageType.SessionEnd, codec.encodeSessionEnd(payload));
|
|
71
|
-
}
|
|
72
63
|
sendTopUpRequest(payload) {
|
|
73
64
|
this._send(MessageType.TopUpRequest, codec.encodeTopUpRequest(payload));
|
|
74
65
|
}
|
|
75
|
-
|
|
76
|
-
this._send(MessageType.
|
|
77
|
-
}
|
|
78
|
-
sendDisputeNotify(payload) {
|
|
79
|
-
this._send(MessageType.DisputeNotify, codec.encodeDisputeNotify(payload));
|
|
66
|
+
sendPaymentRequired(payload) {
|
|
67
|
+
this._send(MessageType.PaymentRequired, codec.encodePaymentRequired(payload));
|
|
80
68
|
}
|
|
81
69
|
// --- Receiving ---
|
|
82
70
|
/**
|
|
83
71
|
* Returns true if this frame is a payment message and was handled.
|
|
84
72
|
*/
|
|
85
73
|
async handleFrame(frame) {
|
|
74
|
+
const name = MESSAGE_TYPE_NAME[frame.type];
|
|
75
|
+
if (!name)
|
|
76
|
+
return false;
|
|
77
|
+
debugLog(`[PaymentMux] ← recv ${name} (${frame.payload.length}b)`);
|
|
86
78
|
switch (frame.type) {
|
|
87
|
-
case MessageType.
|
|
88
|
-
await this.
|
|
89
|
-
return true;
|
|
90
|
-
case MessageType.SessionLockConfirm:
|
|
91
|
-
await this._onSessionLockConfirm?.(codec.decodeSessionLockConfirm(frame.payload));
|
|
79
|
+
case MessageType.SpendingAuth:
|
|
80
|
+
await this._onSpendingAuth?.(codec.decodeSpendingAuth(frame.payload));
|
|
92
81
|
return true;
|
|
93
|
-
case MessageType.
|
|
94
|
-
await this.
|
|
82
|
+
case MessageType.AuthAck:
|
|
83
|
+
await this._onAuthAck?.(codec.decodeAuthAck(frame.payload));
|
|
95
84
|
return true;
|
|
96
85
|
case MessageType.SellerReceipt:
|
|
97
86
|
await this._onSellerReceipt?.(codec.decodeSellerReceipt(frame.payload));
|
|
@@ -99,17 +88,11 @@ export class PaymentMux {
|
|
|
99
88
|
case MessageType.BuyerAck:
|
|
100
89
|
await this._onBuyerAck?.(codec.decodeBuyerAck(frame.payload));
|
|
101
90
|
return true;
|
|
102
|
-
case MessageType.SessionEnd:
|
|
103
|
-
await this._onSessionEnd?.(codec.decodeSessionEnd(frame.payload));
|
|
104
|
-
return true;
|
|
105
91
|
case MessageType.TopUpRequest:
|
|
106
92
|
await this._onTopUpRequest?.(codec.decodeTopUpRequest(frame.payload));
|
|
107
93
|
return true;
|
|
108
|
-
case MessageType.
|
|
109
|
-
await this.
|
|
110
|
-
return true;
|
|
111
|
-
case MessageType.DisputeNotify:
|
|
112
|
-
await this._onDisputeNotify?.(codec.decodeDisputeNotify(frame.payload));
|
|
94
|
+
case MessageType.PaymentRequired:
|
|
95
|
+
await this._onPaymentRequired?.(codec.decodePaymentRequired(frame.payload));
|
|
113
96
|
return true;
|
|
114
97
|
default:
|
|
115
98
|
return false;
|
|
@@ -120,6 +103,7 @@ export class PaymentMux {
|
|
|
120
103
|
return type >= 0x50 && type <= 0x5f;
|
|
121
104
|
}
|
|
122
105
|
_send(type, payload) {
|
|
106
|
+
debugLog(`[PaymentMux] → send ${MESSAGE_TYPE_NAME[type] ?? `0x${type.toString(16)}`} (${payload.length}b)`);
|
|
123
107
|
const frame = encodeFrame({
|
|
124
108
|
type,
|
|
125
109
|
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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"}
|