agentspay 0.1.0 → 0.2.0

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 (126) hide show
  1. package/.env.example +40 -0
  2. package/README.md +35 -4
  3. package/VERIFICATION_SUMMARY.txt +151 -0
  4. package/dist/api/server.d.ts.map +1 -1
  5. package/dist/api/server.js +530 -74
  6. package/dist/api/server.js.map +1 -1
  7. package/dist/bsv/crypto.d.ts +65 -0
  8. package/dist/bsv/crypto.d.ts.map +1 -0
  9. package/dist/bsv/crypto.js +158 -0
  10. package/dist/bsv/crypto.js.map +1 -0
  11. package/dist/bsv/mnee.d.ts +88 -0
  12. package/dist/bsv/mnee.d.ts.map +1 -0
  13. package/dist/bsv/mnee.js +173 -0
  14. package/dist/bsv/mnee.js.map +1 -0
  15. package/dist/bsv/opreturn.d.ts +22 -0
  16. package/dist/bsv/opreturn.d.ts.map +1 -0
  17. package/dist/bsv/opreturn.js +117 -0
  18. package/dist/bsv/opreturn.js.map +1 -0
  19. package/dist/bsv/whatsonchain.d.ts +46 -0
  20. package/dist/bsv/whatsonchain.d.ts.map +1 -0
  21. package/dist/bsv/whatsonchain.js +98 -0
  22. package/dist/bsv/whatsonchain.js.map +1 -0
  23. package/dist/config.d.ts +38 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +85 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/currency/currency.d.ts +70 -0
  28. package/dist/currency/currency.d.ts.map +1 -0
  29. package/dist/currency/currency.js +137 -0
  30. package/dist/currency/currency.js.map +1 -0
  31. package/dist/disputes/dispute.d.ts +50 -0
  32. package/dist/disputes/dispute.d.ts.map +1 -0
  33. package/dist/disputes/dispute.js +162 -0
  34. package/dist/disputes/dispute.js.map +1 -0
  35. package/dist/docs/openapi.yaml +1079 -0
  36. package/dist/docs/swagger.d.ts +12 -0
  37. package/dist/docs/swagger.d.ts.map +1 -0
  38. package/dist/docs/swagger.js +104 -0
  39. package/dist/docs/swagger.js.map +1 -0
  40. package/dist/middleware/auth.d.ts +20 -0
  41. package/dist/middleware/auth.d.ts.map +1 -0
  42. package/dist/middleware/auth.js +32 -0
  43. package/dist/middleware/auth.js.map +1 -0
  44. package/dist/middleware/rateLimit.d.ts +25 -0
  45. package/dist/middleware/rateLimit.d.ts.map +1 -0
  46. package/dist/middleware/rateLimit.js +61 -0
  47. package/dist/middleware/rateLimit.js.map +1 -0
  48. package/dist/payment/payment.d.ts +79 -9
  49. package/dist/payment/payment.d.ts.map +1 -1
  50. package/dist/payment/payment.js +387 -47
  51. package/dist/payment/payment.js.map +1 -1
  52. package/dist/registry/db.d.ts.map +1 -1
  53. package/dist/registry/db.js +110 -3
  54. package/dist/registry/db.js.map +1 -1
  55. package/dist/registry/registry.d.ts +1 -1
  56. package/dist/registry/registry.d.ts.map +1 -1
  57. package/dist/registry/registry.js +12 -4
  58. package/dist/registry/registry.js.map +1 -1
  59. package/dist/types/index.d.ts +34 -0
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/dist/types/index.js.map +1 -1
  62. package/dist/utils/validation.d.ts +27 -0
  63. package/dist/utils/validation.d.ts.map +1 -0
  64. package/dist/utils/validation.js +164 -0
  65. package/dist/utils/validation.js.map +1 -0
  66. package/dist/verification/receipt.d.ts +42 -0
  67. package/dist/verification/receipt.d.ts.map +1 -0
  68. package/dist/verification/receipt.js +10 -0
  69. package/dist/verification/receipt.js.map +1 -0
  70. package/dist/verification/verification.d.ts +41 -0
  71. package/dist/verification/verification.d.ts.map +1 -0
  72. package/dist/verification/verification.js +217 -0
  73. package/dist/verification/verification.js.map +1 -0
  74. package/dist/wallet/providerManager.d.ts +32 -0
  75. package/dist/wallet/providerManager.d.ts.map +1 -0
  76. package/dist/wallet/providerManager.js +118 -0
  77. package/dist/wallet/providerManager.js.map +1 -0
  78. package/dist/wallet/providers/handcash.d.ts +22 -0
  79. package/dist/wallet/providers/handcash.d.ts.map +1 -0
  80. package/dist/wallet/providers/handcash.js +214 -0
  81. package/dist/wallet/providers/handcash.js.map +1 -0
  82. package/dist/wallet/providers/internal.d.ts +15 -0
  83. package/dist/wallet/providers/internal.d.ts.map +1 -0
  84. package/dist/wallet/providers/internal.js +208 -0
  85. package/dist/wallet/providers/internal.js.map +1 -0
  86. package/dist/wallet/providers/types.d.ts +50 -0
  87. package/dist/wallet/providers/types.d.ts.map +1 -0
  88. package/dist/wallet/providers/types.js +6 -0
  89. package/dist/wallet/providers/types.js.map +1 -0
  90. package/dist/wallet/providers/yours.d.ts +18 -0
  91. package/dist/wallet/providers/yours.d.ts.map +1 -0
  92. package/dist/wallet/providers/yours.js +122 -0
  93. package/dist/wallet/providers/yours.js.map +1 -0
  94. package/dist/wallet/wallet.d.ts +52 -5
  95. package/dist/wallet/wallet.d.ts.map +1 -1
  96. package/dist/wallet/wallet.js +223 -34
  97. package/dist/wallet/wallet.js.map +1 -1
  98. package/dist/webhooks/delivery.d.ts +37 -0
  99. package/dist/webhooks/delivery.d.ts.map +1 -0
  100. package/dist/webhooks/delivery.js +182 -0
  101. package/dist/webhooks/delivery.js.map +1 -0
  102. package/dist/webhooks/webhook.d.ts +85 -0
  103. package/dist/webhooks/webhook.d.ts.map +1 -0
  104. package/dist/webhooks/webhook.js +271 -0
  105. package/dist/webhooks/webhook.js.map +1 -0
  106. package/package.json +74 -54
  107. package/sdk-python/LICENSE +21 -0
  108. package/sdk-python/MANIFEST.in +9 -0
  109. package/sdk-python/README.md +372 -0
  110. package/sdk-python/agentspay/__init__.py +97 -0
  111. package/sdk-python/agentspay/client.py +256 -0
  112. package/sdk-python/agentspay/disputes.py +174 -0
  113. package/sdk-python/agentspay/exceptions.py +53 -0
  114. package/sdk-python/agentspay/payments.py +169 -0
  115. package/sdk-python/agentspay/services.py +198 -0
  116. package/sdk-python/agentspay/types.py +154 -0
  117. package/sdk-python/agentspay/wallet.py +113 -0
  118. package/sdk-python/agentspay/webhooks.py +195 -0
  119. package/sdk-python/examples/consumer.py +147 -0
  120. package/sdk-python/examples/provider.py +116 -0
  121. package/sdk-python/pyproject.toml +61 -0
  122. package/sdk-python/setup.py +53 -0
  123. package/sdk-python/tests/test_client.py +221 -0
  124. package/test-addr.js +29 -0
  125. package/test-mnee-simple.js +51 -0
  126. package/test-mnee.js +47 -0
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -7,74 +40,230 @@ exports.WalletManager = void 0;
7
40
  const uuid_1 = require("uuid");
8
41
  const crypto_1 = __importDefault(require("crypto"));
9
42
  const db_1 = require("../registry/db");
43
+ const crypto_2 = require("../bsv/crypto");
44
+ const whatsonchain_1 = require("../bsv/whatsonchain");
45
+ const config_1 = require("../config");
10
46
  /**
11
47
  * BSV Wallet Manager
12
48
  *
13
- * MVP: Uses simplified key generation.
14
- * TODO: Integrate @bsv/sdk for real BSV key pairs and transaction signing.
15
- * For now we generate deterministic-looking keys to build the full flow,
16
- * then swap in real BSV crypto before mainnet.
49
+ * Manages real BSV wallets with on-chain balance tracking.
17
50
  */
18
51
  class WalletManager {
19
- // Create a new agent wallet
52
+ hashApiKey(apiKey) {
53
+ return crypto_1.default.createHash('sha256').update(apiKey).digest('hex');
54
+ }
55
+ /**
56
+ * Generate a new API key for wallet auth.
57
+ * Returned ONLY on creation/rotation; stored hashed in DB.
58
+ */
59
+ generateApiKey() {
60
+ return crypto_1.default.randomBytes(32).toString('hex');
61
+ }
62
+ setApiKey(walletId, apiKey) {
63
+ const db = (0, db_1.getDb)();
64
+ db.prepare('UPDATE wallets SET apiKeyHash = ? WHERE id = ?').run(this.hashApiKey(apiKey), walletId);
65
+ }
66
+ verifyApiKey(walletId, apiKey) {
67
+ const db = (0, db_1.getDb)();
68
+ const row = db.prepare('SELECT apiKeyHash FROM wallets WHERE id = ?').get(walletId);
69
+ if (!row?.apiKeyHash)
70
+ return false;
71
+ return row.apiKeyHash === this.hashApiKey(apiKey);
72
+ }
73
+ getByApiKey(apiKey) {
74
+ const db = (0, db_1.getDb)();
75
+ const hash = this.hashApiKey(apiKey);
76
+ const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE apiKeyHash = ?').get(hash);
77
+ return row || null;
78
+ }
79
+ /**
80
+ * Create a new agent wallet with real BSV keys
81
+ */
20
82
  create() {
21
83
  const db = (0, db_1.getDb)();
22
84
  const id = (0, uuid_1.v4)();
23
- // MVP: Generate key pair (placeholder - will use @bsv/sdk)
24
- const keyPair = this.generateKeyPair();
85
+ const privKey = (0, crypto_2.generatePrivateKey)();
86
+ const privateKeyWif = privKey.toWif();
87
+ const publicKey = (0, crypto_2.getPublicKeyHex)(privKey);
88
+ const address = (0, crypto_2.deriveAddress)(privKey);
89
+ const encryptedPrivKey = (0, crypto_2.encryptPrivateKey)(privateKeyWif);
90
+ const apiKey = this.generateApiKey();
91
+ const apiKeyHash = this.hashApiKey(apiKey);
92
+ const createdAt = new Date().toISOString();
25
93
  db.prepare(`
26
- INSERT INTO wallets (id, publicKey, address, createdAt)
27
- VALUES (?, ?, ?, ?)
28
- `).run(id, keyPair.publicKey, keyPair.address, new Date().toISOString());
94
+ INSERT INTO wallets (id, publicKey, address, privateKey, apiKeyHash, createdAt)
95
+ VALUES (?, ?, ?, ?, ?, ?)
96
+ `).run(id, publicKey, address, encryptedPrivKey, apiKeyHash, createdAt);
29
97
  return {
30
98
  id,
31
- publicKey: keyPair.publicKey,
32
- address: keyPair.address,
33
- createdAt: new Date().toISOString(),
34
- privateKey: keyPair.privateKey, // Only returned on creation!
99
+ publicKey,
100
+ address,
101
+ createdAt,
102
+ privateKey: privateKeyWif, // Only returned on creation.
103
+ apiKey, // Only returned on creation.
35
104
  };
36
105
  }
37
- // Get wallet by ID
106
+ /**
107
+ * Import wallet from WIF private key
108
+ */
109
+ importFromWif(wif) {
110
+ const db = (0, db_1.getDb)();
111
+ const id = (0, uuid_1.v4)();
112
+ const privKey = (0, crypto_2.privateKeyFromWif)(wif);
113
+ const publicKey = (0, crypto_2.getPublicKeyHex)(privKey);
114
+ const address = (0, crypto_2.deriveAddress)(privKey);
115
+ const encryptedPrivKey = (0, crypto_2.encryptPrivateKey)(wif);
116
+ const existing = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE address = ?').get(address);
117
+ if (existing)
118
+ return existing;
119
+ const createdAt = new Date().toISOString();
120
+ db.prepare('INSERT INTO wallets (id, publicKey, address, privateKey, createdAt) VALUES (?, ?, ?, ?, ?)').run(id, publicKey, address, encryptedPrivKey, createdAt);
121
+ // Create an API key for the imported wallet (not returned here).
122
+ const apiKey = this.generateApiKey();
123
+ this.setApiKey(id, apiKey);
124
+ return { id, publicKey, address, createdAt };
125
+ }
126
+ /**
127
+ * Get wallet by ID
128
+ */
38
129
  getById(id) {
39
130
  const db = (0, db_1.getDb)();
40
- const row = db.prepare('SELECT * FROM wallets WHERE id = ?').get(id);
131
+ const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE id = ?').get(id);
41
132
  return row || null;
42
133
  }
43
- // Get wallet by address
134
+ /**
135
+ * Get wallet by address
136
+ */
44
137
  getByAddress(address) {
45
138
  const db = (0, db_1.getDb)();
46
- const row = db.prepare('SELECT * FROM wallets WHERE address = ?').get(address);
139
+ const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE address = ?').get(address);
47
140
  return row || null;
48
141
  }
49
- // Get balance (MVP: tracked internally, TODO: query BSV network)
142
+ /**
143
+ * Get encrypted private key (internal use only)
144
+ */
145
+ getPrivateKey(walletId) {
146
+ const db = (0, db_1.getDb)();
147
+ const row = db.prepare('SELECT privateKey FROM wallets WHERE id = ?').get(walletId);
148
+ if (!row || !row.privateKey)
149
+ return null;
150
+ return (0, crypto_2.decryptPrivateKey)(row.privateKey);
151
+ }
152
+ /**
153
+ * Get balance from BSV blockchain via WhatsOnChain
154
+ */
50
155
  async getBalance(walletId) {
156
+ const wallet = this.getById(walletId);
157
+ if (!wallet)
158
+ return 0;
159
+ if (config_1.config.demoMode) {
160
+ return this.getInternalBalance(walletId);
161
+ }
162
+ try {
163
+ const balance = await (0, whatsonchain_1.getBalance)(wallet.address);
164
+ return balance.confirmed + balance.unconfirmed;
165
+ }
166
+ catch (error) {
167
+ console.error(`Failed to fetch balance for ${wallet.address}:`, error);
168
+ return this.getInternalBalance(walletId);
169
+ }
170
+ }
171
+ /**
172
+ * Get UTXOs for a wallet
173
+ */
174
+ async getUtxos(walletId) {
175
+ const wallet = this.getById(walletId);
176
+ if (!wallet)
177
+ return [];
178
+ try {
179
+ const wocUtxos = await (0, whatsonchain_1.getUtxos)(wallet.address);
180
+ // Derive locking script from address (P2PKH) to avoid per-UTXO tx lookups.
181
+ const script = (0, crypto_2.getScriptForAddress)(wallet.address);
182
+ const utxos = wocUtxos.map(w => ({
183
+ txid: w.tx_hash,
184
+ vout: w.tx_pos,
185
+ amount: w.value,
186
+ script,
187
+ }));
188
+ if (utxos.length > 0)
189
+ this.syncUtxos(walletId, utxos);
190
+ return utxos.length > 0 ? utxos : this.getCachedUtxos(walletId);
191
+ }
192
+ catch (error) {
193
+ console.error(`Failed to fetch UTXOs for ${wallet?.address}:`, error);
194
+ return this.getCachedUtxos(walletId);
195
+ }
196
+ }
197
+ /**
198
+ * Get transaction history for a wallet
199
+ */
200
+ async getTxHistory(walletId) {
201
+ const wallet = this.getById(walletId);
202
+ if (!wallet)
203
+ return [];
204
+ const { getTxHistory } = await Promise.resolve().then(() => __importStar(require('../bsv/whatsonchain')));
205
+ try {
206
+ return await getTxHistory(wallet.address);
207
+ }
208
+ catch (error) {
209
+ console.error(`Failed to fetch tx history for ${wallet.address}:`, error);
210
+ return [];
211
+ }
212
+ }
213
+ /**
214
+ * Internal balance (fallback/legacy for testing)
215
+ */
216
+ getInternalBalance(walletId) {
51
217
  const db = (0, db_1.getDb)();
52
- // Deposits (faucet/funding)
53
218
  let deposits = 0;
54
219
  try {
55
220
  const dep = db.prepare(`SELECT COALESCE(SUM(amount), 0) as total FROM deposits WHERE walletId = ?`).get(walletId);
56
221
  deposits = dep?.total || 0;
57
222
  }
58
- catch { /* table may not exist yet */ }
59
- // Sum of received payments (released) minus sent payments
60
- const received = db.prepare(`
223
+ catch {
224
+ /* table may not exist yet */
225
+ }
226
+ const received = db
227
+ .prepare(`
61
228
  SELECT COALESCE(SUM(amount - platformFee), 0) as total
62
229
  FROM payments WHERE sellerWalletId = ? AND status = 'released'
63
- `).get(walletId);
64
- const sent = db.prepare(`
230
+ `)
231
+ .get(walletId);
232
+ const sent = db
233
+ .prepare(`
65
234
  SELECT COALESCE(SUM(amount), 0) as total
66
235
  FROM payments WHERE buyerWalletId = ? AND status IN ('released', 'escrowed')
67
- `).get(walletId);
236
+ `)
237
+ .get(walletId);
68
238
  return deposits + (received?.total || 0) - (sent?.total || 0);
69
239
  }
70
- generateKeyPair() {
71
- // MVP placeholder - generates fake but consistent keys
72
- // TODO: Replace with @bsv/sdk PrivateKey.fromRandom()
73
- const privateKeyBytes = crypto_1.default.randomBytes(32);
74
- const privateKey = privateKeyBytes.toString('hex');
75
- const publicKey = crypto_1.default.createHash('sha256').update(privateKeyBytes).digest('hex');
76
- const address = '1' + crypto_1.default.createHash('ripemd160').update(Buffer.from(publicKey, 'hex')).digest('hex').slice(0, 33);
77
- return { privateKey, publicKey, address };
240
+ /**
241
+ * Sync UTXOs to local cache
242
+ */
243
+ syncUtxos(walletId, utxos) {
244
+ const db = (0, db_1.getDb)();
245
+ db.prepare("UPDATE utxos SET spent = 1, spentAt = datetime('now') WHERE walletId = ? AND spent = 0").run(walletId);
246
+ const stmt = db.prepare(`
247
+ INSERT OR REPLACE INTO utxos (id, walletId, txid, vout, amount, script, spent, createdAt)
248
+ VALUES (?, ?, ?, ?, ?, ?, 0, datetime('now'))
249
+ `);
250
+ for (const utxo of utxos) {
251
+ const id = `${utxo.txid}:${utxo.vout}`;
252
+ stmt.run(id, walletId, utxo.txid, utxo.vout, utxo.amount, utxo.script);
253
+ }
254
+ }
255
+ /**
256
+ * Get cached UTXOs from local database
257
+ */
258
+ getCachedUtxos(walletId) {
259
+ const db = (0, db_1.getDb)();
260
+ const rows = db.prepare('SELECT txid, vout, amount, script FROM utxos WHERE walletId = ? AND spent = 0').all(walletId);
261
+ return rows.map(row => ({
262
+ txid: row.txid,
263
+ vout: row.vout,
264
+ amount: row.amount,
265
+ script: row.script,
266
+ }));
78
267
  }
79
268
  }
80
269
  exports.WalletManager = WalletManager;
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAAiC;AACjC,oDAA2B;AAC3B,uCAAsC;AAEtC,0CAQsB;AACtB,sDAA+E;AAC/E,sCAAkC;AAGlC;;;;GAIG;AACH,MAAa,aAAa;IAChB,UAAU,CAAC,MAAc;QAC/B,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjE,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,MAAc;QACxC,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IACrG,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,MAAc;QAC3C,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAQ,CAAA;QAC1F,IAAI,CAAC,GAAG,EAAE,UAAU;YAAE,OAAO,KAAK,CAAA;QAClC,OAAO,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC,GAAG,CAAC,IAAI,CAAQ,CAAA;QACrH,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,EAAE,GAAG,IAAA,SAAI,GAAE,CAAA;QAEjB,MAAM,OAAO,GAAG,IAAA,2BAAkB,GAAE,CAAA;QACpC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;QACrC,MAAM,SAAS,GAAG,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAA;QAEtC,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,aAAa,CAAC,CAAA;QAEzD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAE1C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC1C,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;QAEvE,OAAO;YACL,EAAE;YACF,SAAS;YACT,OAAO;YACP,SAAS;YACT,UAAU,EAAE,aAAa,EAAE,6BAA6B;YACxD,MAAM,EAAE,6BAA6B;SACtC,CAAA;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAW;QACvB,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,EAAE,GAAG,IAAA,SAAI,GAAE,CAAA;QAEjB,MAAM,OAAO,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAA;QACtC,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAA;QAE/C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAQ,CAAA;QAC1H,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAE7B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC1C,EAAE,CAAC,OAAO,CAAC,4FAA4F,CAAC,CAAC,GAAG,CAC1G,EAAE,EACF,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,SAAS,CACV,CAAA;QAED,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAE1B,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QAChB,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAQ,CAAA;QAC3G,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAC1B,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAQ,CAAA;QACrH,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAQ,CAAA;QAC1F,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO,IAAI,CAAA;QACxC,OAAO,IAAA,0BAAiB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAA;QAErB,IAAI,eAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAiB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvD,OAAO,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAA;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAA;YACtE,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAE/C,2EAA2E;YAC3E,MAAM,MAAM,GAAG,IAAA,4BAAmB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAElD,MAAM,KAAK,GAAW,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,CAAC,CAAC,OAAO;gBACf,IAAI,EAAE,CAAC,CAAC,MAAM;gBACd,MAAM,EAAE,CAAC,CAAC,KAAK;gBACf,MAAM;aACP,CAAC,CAAC,CAAA;YAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,EAAE,OAAO,GAAG,EAAE,KAAK,CAAC,CAAA;YACrE,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QAEtB,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAA;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAA;YACzE,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,QAAgB;QACzC,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAElB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAQ,CAAA;YACxH,QAAQ,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CACN;;;KAGH,CACE;aACA,GAAG,CAAC,QAAQ,CAAQ,CAAA;QAEvB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;KAGH,CACE;aACA,GAAG,CAAC,QAAQ,CAAQ,CAAA;QAEvB,OAAO,QAAQ,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,QAAgB,EAAE,KAAa;QAC/C,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAElB,EAAE,CAAC,OAAO,CAAC,wFAAwF,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAElH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAA;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;YACtC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,QAAgB;QACrC,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAA;QAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAU,CAAA;QAC/H,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AA/PD,sCA+PC"}
@@ -0,0 +1,37 @@
1
+ import { type WebhookEvent } from './webhook';
2
+ /**
3
+ * Webhook Delivery Service
4
+ *
5
+ * - Fire-and-forget delivery (doesn't block main flow)
6
+ * - Automatic retries with exponential backoff (3 attempts max)
7
+ * - HMAC-SHA256 signature verification
8
+ * - Idempotency keys
9
+ * - Audit log for all deliveries
10
+ */
11
+ export declare class WebhookDelivery {
12
+ private webhookManager;
13
+ private retryIntervals;
14
+ private deliveryTimeoutMs;
15
+ /**
16
+ * Trigger a webhook event (fire-and-forget)
17
+ */
18
+ trigger(eventType: WebhookEvent, payload: any): Promise<void>;
19
+ /**
20
+ * Async delivery with retries (internal)
21
+ */
22
+ private deliverAsync;
23
+ /**
24
+ * Attempt delivery with retries and exponential backoff
25
+ */
26
+ private attemptDelivery;
27
+ /**
28
+ * Process pending deliveries (for background worker/cron)
29
+ */
30
+ processPending(): Promise<void>;
31
+ /**
32
+ * Sanitize payload for demo mode (replace sensitive data)
33
+ */
34
+ private sanitizePayloadForDemo;
35
+ }
36
+ export declare const webhookDelivery: WebhookDelivery;
37
+ //# sourceMappingURL=delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7D;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAS;IAElC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE;;OAEG;YACW,YAAY;IAkB1B;;OAEG;YACW,eAAe;IAuF7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA0B/B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAA"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webhookDelivery = exports.WebhookDelivery = void 0;
4
+ const webhook_1 = require("./webhook");
5
+ const config_1 = require("../config");
6
+ /**
7
+ * Webhook Delivery Service
8
+ *
9
+ * - Fire-and-forget delivery (doesn't block main flow)
10
+ * - Automatic retries with exponential backoff (3 attempts max)
11
+ * - HMAC-SHA256 signature verification
12
+ * - Idempotency keys
13
+ * - Audit log for all deliveries
14
+ */
15
+ class WebhookDelivery {
16
+ webhookManager = new webhook_1.WebhookManager();
17
+ retryIntervals = [0, 60_000, 300_000]; // 0s, 1min, 5min
18
+ deliveryTimeoutMs = 15_000; // 15s timeout per attempt
19
+ /**
20
+ * Trigger a webhook event (fire-and-forget)
21
+ */
22
+ async trigger(eventType, payload) {
23
+ // Get all active webhooks subscribed to this event
24
+ const webhooks = this.webhookManager.getActiveWebhooksForEvent(eventType);
25
+ if (webhooks.length === 0) {
26
+ console.log(`[Webhooks] No subscribers for event: ${eventType}`);
27
+ return;
28
+ }
29
+ console.log(`[Webhooks] Triggering event ${eventType} for ${webhooks.length} webhook(s)`);
30
+ // Create deliveries for all webhooks (async, don't await)
31
+ for (const webhook of webhooks) {
32
+ this.deliverAsync(webhook.id, eventType, payload).catch(err => {
33
+ console.error(`[Webhooks] Failed to deliver to ${webhook.id}:`, err.message);
34
+ });
35
+ }
36
+ }
37
+ /**
38
+ * Async delivery with retries (internal)
39
+ */
40
+ async deliverAsync(webhookId, eventType, payload) {
41
+ const webhook = this.webhookManager.getById(webhookId);
42
+ if (!webhook || !webhook.active)
43
+ return;
44
+ // Add metadata to payload
45
+ const enrichedPayload = {
46
+ event: eventType,
47
+ timestamp: new Date().toISOString(),
48
+ data: config_1.config.demoMode ? this.sanitizePayloadForDemo(payload) : payload,
49
+ };
50
+ // Create delivery record
51
+ const delivery = this.webhookManager.createDelivery(webhookId, eventType, enrichedPayload);
52
+ // Attempt delivery (with retries)
53
+ await this.attemptDelivery(delivery.id, webhook.url, enrichedPayload, delivery.signature, delivery.idempotencyKey);
54
+ }
55
+ /**
56
+ * Attempt delivery with retries and exponential backoff
57
+ */
58
+ async attemptDelivery(deliveryId, url, payload, signature, idempotencyKey, attemptNumber = 0) {
59
+ if (attemptNumber >= 3) {
60
+ this.webhookManager.updateDelivery(deliveryId, {
61
+ status: 'failed',
62
+ completedAt: new Date().toISOString(),
63
+ });
64
+ console.error(`[Webhooks] Delivery ${deliveryId} failed after 3 attempts`);
65
+ return;
66
+ }
67
+ const now = new Date().toISOString();
68
+ try {
69
+ const controller = new AbortController();
70
+ const timeoutId = setTimeout(() => controller.abort(), this.deliveryTimeoutMs);
71
+ const response = await fetch(url, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'User-Agent': 'AgentPay-Webhooks/1.0',
76
+ 'X-AgentPay-Signature': signature,
77
+ 'X-AgentPay-Delivery': deliveryId,
78
+ 'X-Idempotency-Key': idempotencyKey,
79
+ },
80
+ body: JSON.stringify(payload),
81
+ signal: controller.signal,
82
+ });
83
+ clearTimeout(timeoutId);
84
+ const responseBody = await response.text().catch(() => '');
85
+ if (response.ok) {
86
+ // Success
87
+ this.webhookManager.updateDelivery(deliveryId, {
88
+ status: 'success',
89
+ attempts: attemptNumber + 1,
90
+ lastAttemptAt: now,
91
+ responseStatus: response.status,
92
+ responseBody: responseBody.substring(0, 1000), // Limit stored response
93
+ completedAt: now,
94
+ });
95
+ console.log(`[Webhooks] Delivery ${deliveryId} succeeded (attempt ${attemptNumber + 1})`);
96
+ }
97
+ else {
98
+ // HTTP error - retry
99
+ throw new Error(`HTTP ${response.status}: ${responseBody.substring(0, 200)}`);
100
+ }
101
+ }
102
+ catch (error) {
103
+ // Log the attempt
104
+ const nextRetryDelay = this.retryIntervals[attemptNumber + 1];
105
+ const nextRetryAt = nextRetryDelay
106
+ ? new Date(Date.now() + nextRetryDelay).toISOString()
107
+ : undefined;
108
+ this.webhookManager.updateDelivery(deliveryId, {
109
+ attempts: attemptNumber + 1,
110
+ lastAttemptAt: now,
111
+ responseBody: error.message.substring(0, 1000),
112
+ nextRetryAt,
113
+ });
114
+ console.warn(`[Webhooks] Delivery ${deliveryId} attempt ${attemptNumber + 1} failed: ${error.message}`);
115
+ // Schedule retry
116
+ if (nextRetryDelay !== undefined) {
117
+ setTimeout(() => {
118
+ this.attemptDelivery(deliveryId, url, payload, signature, idempotencyKey, attemptNumber + 1)
119
+ .catch(err => console.error(`[Webhooks] Retry failed:`, err));
120
+ }, nextRetryDelay);
121
+ }
122
+ else {
123
+ // No more retries
124
+ this.webhookManager.updateDelivery(deliveryId, {
125
+ status: 'failed',
126
+ completedAt: new Date().toISOString(),
127
+ });
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Process pending deliveries (for background worker/cron)
133
+ */
134
+ async processPending() {
135
+ const pending = this.webhookManager.getPendingDeliveries(100);
136
+ if (pending.length === 0)
137
+ return;
138
+ console.log(`[Webhooks] Processing ${pending.length} pending deliveries`);
139
+ for (const delivery of pending) {
140
+ const webhook = this.webhookManager.getById(delivery.webhookId);
141
+ if (!webhook || !webhook.active) {
142
+ this.webhookManager.updateDelivery(delivery.id, {
143
+ status: 'failed',
144
+ completedAt: new Date().toISOString(),
145
+ });
146
+ continue;
147
+ }
148
+ await this.attemptDelivery(delivery.id, webhook.url, delivery.payload, delivery.signature, delivery.idempotencyKey, delivery.attempts).catch(err => {
149
+ console.error(`[Webhooks] Failed to process delivery ${delivery.id}:`, err);
150
+ });
151
+ }
152
+ }
153
+ /**
154
+ * Sanitize payload for demo mode (replace sensitive data)
155
+ */
156
+ sanitizePayloadForDemo(payload) {
157
+ if (typeof payload !== 'object' || payload === null)
158
+ return payload;
159
+ const sanitized = { ...payload };
160
+ // Replace IDs with demo prefixes
161
+ if (sanitized.id && typeof sanitized.id === 'string') {
162
+ sanitized.id = `demo-${sanitized.id.slice(0, 8)}`;
163
+ }
164
+ // Replace wallet IDs
165
+ for (const key of ['buyerWalletId', 'sellerWalletId', 'agentId']) {
166
+ if (sanitized[key] && typeof sanitized[key] === 'string') {
167
+ sanitized[key] = `demo-wallet-${sanitized[key].slice(0, 6)}`;
168
+ }
169
+ }
170
+ // Replace transaction IDs
171
+ for (const key of ['txId', 'escrowTxId', 'releaseTxId']) {
172
+ if (sanitized[key] && typeof sanitized[key] === 'string') {
173
+ sanitized[key] = `demo-tx-${sanitized[key].slice(0, 8)}`;
174
+ }
175
+ }
176
+ return sanitized;
177
+ }
178
+ }
179
+ exports.WebhookDelivery = WebhookDelivery;
180
+ // Singleton instance
181
+ exports.webhookDelivery = new WebhookDelivery();
182
+ //# sourceMappingURL=delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ export interface Webhook {
2
+ id: string;
3
+ url: string;
4
+ events: string[];
5
+ secret: string;
6
+ active: boolean;
7
+ createdAt: string;
8
+ }
9
+ export interface WebhookDelivery {
10
+ id: string;
11
+ webhookId: string;
12
+ eventType: string;
13
+ payload: any;
14
+ signature: string;
15
+ idempotencyKey: string;
16
+ status: 'pending' | 'success' | 'failed';
17
+ attempts: number;
18
+ lastAttemptAt?: string;
19
+ nextRetryAt?: string;
20
+ responseStatus?: number;
21
+ responseBody?: string;
22
+ createdAt: string;
23
+ completedAt?: string;
24
+ }
25
+ export declare const WEBHOOK_EVENTS: readonly ["payment.created", "payment.escrowed", "payment.completed", "payment.failed", "payment.refunded", "service.registered", "service.executed", "dispute.opened", "dispute.resolved"];
26
+ export type WebhookEvent = typeof WEBHOOK_EVENTS[number];
27
+ export declare class WebhookManager {
28
+ /**
29
+ * Register a new webhook
30
+ */
31
+ register(params: {
32
+ url: string;
33
+ events: string[];
34
+ ownerId?: string;
35
+ }): Webhook;
36
+ /**
37
+ * List webhooks (optionally filtered by owner)
38
+ */
39
+ list(ownerId?: string): Omit<Webhook, 'secret'>[];
40
+ /**
41
+ * Get webhook by ID (with secret, for internal use)
42
+ */
43
+ getById(id: string): Webhook | null;
44
+ /**
45
+ * Update webhook
46
+ */
47
+ update(id: string, updates: {
48
+ url?: string;
49
+ events?: string[];
50
+ active?: boolean;
51
+ }, ownerId?: string): Omit<Webhook, 'secret'> | null;
52
+ /**
53
+ * Delete webhook
54
+ */
55
+ delete(id: string, ownerId?: string): boolean;
56
+ /**
57
+ * Get active webhooks for a specific event
58
+ */
59
+ getActiveWebhooksForEvent(eventType: string): Webhook[];
60
+ /**
61
+ * Create a delivery record
62
+ */
63
+ createDelivery(webhookId: string, eventType: string, payload: any): WebhookDelivery;
64
+ /**
65
+ * Update delivery status
66
+ */
67
+ updateDelivery(id: string, updates: {
68
+ status?: 'pending' | 'success' | 'failed';
69
+ attempts?: number;
70
+ lastAttemptAt?: string;
71
+ nextRetryAt?: string;
72
+ responseStatus?: number;
73
+ responseBody?: string;
74
+ completedAt?: string;
75
+ }): void;
76
+ /**
77
+ * Get pending deliveries for retry
78
+ */
79
+ getPendingDeliveries(limit?: number): WebhookDelivery[];
80
+ /**
81
+ * Generate HMAC-SHA256 signature
82
+ */
83
+ private generateSignature;
84
+ }
85
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/webhooks/webhook.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,GAAG,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,eAAO,MAAM,cAAc,6LAUjB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AAExD,qBAAa,cAAc;IACzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IA0C9E;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;IAmBjD;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAenC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI;IAyDpI;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAgB7C;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAmBvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,eAAe;IA6BnF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAClC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;QACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,GAAG,IAAI;IAcR;;OAEG;IACH,oBAAoB,CAAC,KAAK,SAAM,GAAG,eAAe,EAAE;IA+BpD;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAI1B"}