@1sat/wallet 0.0.3 → 0.0.4

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 (141) hide show
  1. package/dist/OneSatWallet.d.ts +222 -0
  2. package/dist/OneSatWallet.d.ts.map +1 -0
  3. package/dist/OneSatWallet.js +754 -0
  4. package/dist/OneSatWallet.js.map +1 -0
  5. package/dist/address-sync/AddressManager.d.ts +86 -0
  6. package/dist/address-sync/AddressManager.d.ts.map +1 -0
  7. package/dist/address-sync/AddressManager.js +108 -0
  8. package/dist/address-sync/AddressManager.js.map +1 -0
  9. package/dist/address-sync/AddressSyncManager.d.ts +204 -0
  10. package/dist/address-sync/AddressSyncManager.d.ts.map +1 -0
  11. package/dist/address-sync/AddressSyncManager.js +525 -0
  12. package/dist/address-sync/AddressSyncManager.js.map +1 -0
  13. package/dist/address-sync/AddressSyncQueueIdb.d.ts +31 -0
  14. package/dist/address-sync/AddressSyncQueueIdb.d.ts.map +1 -0
  15. package/dist/address-sync/AddressSyncQueueIdb.js +356 -0
  16. package/dist/address-sync/AddressSyncQueueIdb.js.map +1 -0
  17. package/dist/address-sync/AddressSyncQueueSqlite.d.ts +55 -0
  18. package/dist/address-sync/AddressSyncQueueSqlite.d.ts.map +1 -0
  19. package/dist/address-sync/AddressSyncQueueSqlite.js +198 -0
  20. package/dist/address-sync/AddressSyncQueueSqlite.js.map +1 -0
  21. package/dist/address-sync/index.d.ts +8 -0
  22. package/dist/address-sync/index.d.ts.map +1 -0
  23. package/dist/address-sync/index.js +5 -0
  24. package/dist/address-sync/index.js.map +1 -0
  25. package/dist/backup/FileBackupProvider.d.ts +97 -0
  26. package/dist/backup/FileBackupProvider.d.ts.map +1 -0
  27. package/dist/backup/FileBackupProvider.js +185 -0
  28. package/dist/backup/FileBackupProvider.js.map +1 -0
  29. package/dist/backup/FileRestoreReader.d.ts +59 -0
  30. package/dist/backup/FileRestoreReader.d.ts.map +1 -0
  31. package/dist/backup/FileRestoreReader.js +89 -0
  32. package/dist/backup/FileRestoreReader.js.map +1 -0
  33. package/dist/backup/index.d.ts +6 -0
  34. package/dist/backup/index.d.ts.map +1 -0
  35. package/dist/backup/index.js +5 -0
  36. package/dist/backup/index.js.map +1 -0
  37. package/dist/backup/types.d.ts +32 -0
  38. package/dist/backup/types.d.ts.map +1 -0
  39. package/dist/backup/types.js +2 -0
  40. package/dist/backup/types.js.map +1 -0
  41. package/dist/browser.d.ts +6 -0
  42. package/dist/browser.d.ts.map +1 -0
  43. package/dist/browser.js +6 -0
  44. package/dist/browser.js.map +1 -0
  45. package/dist/cwi/chrome.d.ts +12 -0
  46. package/dist/cwi/chrome.d.ts.map +1 -0
  47. package/dist/cwi/chrome.js +44 -0
  48. package/dist/cwi/chrome.js.map +1 -0
  49. package/dist/cwi/event.d.ts +12 -0
  50. package/dist/cwi/event.d.ts.map +1 -0
  51. package/dist/cwi/event.js +39 -0
  52. package/dist/cwi/event.js.map +1 -0
  53. package/dist/cwi/factory.d.ts +15 -0
  54. package/dist/cwi/factory.d.ts.map +1 -0
  55. package/dist/cwi/factory.js +45 -0
  56. package/dist/cwi/factory.js.map +1 -0
  57. package/dist/cwi/index.d.ts +12 -0
  58. package/dist/cwi/index.d.ts.map +1 -0
  59. package/dist/cwi/index.js +12 -0
  60. package/dist/cwi/index.js.map +1 -0
  61. package/dist/cwi/types.d.ts +40 -0
  62. package/dist/cwi/types.d.ts.map +1 -0
  63. package/dist/cwi/types.js +40 -0
  64. package/dist/cwi/types.js.map +1 -0
  65. package/dist/factory/createWebWallet.d.ts +73 -0
  66. package/dist/factory/createWebWallet.d.ts.map +1 -0
  67. package/dist/factory/createWebWallet.js +251 -0
  68. package/dist/factory/createWebWallet.js.map +1 -0
  69. package/dist/factory/fullSync.d.ts +58 -0
  70. package/dist/factory/fullSync.d.ts.map +1 -0
  71. package/dist/factory/fullSync.js +92 -0
  72. package/dist/factory/fullSync.js.map +1 -0
  73. package/dist/factory/index.d.ts +5 -0
  74. package/dist/factory/index.d.ts.map +1 -0
  75. package/dist/factory/index.js +3 -0
  76. package/dist/factory/index.js.map +1 -0
  77. package/dist/index.d.ts +18 -20
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +24 -21
  80. package/dist/index.js.map +1 -1
  81. package/dist/indexers/Bsv21Indexer.d.ts +36 -0
  82. package/dist/indexers/Bsv21Indexer.d.ts.map +1 -0
  83. package/dist/indexers/Bsv21Indexer.js +232 -0
  84. package/dist/indexers/Bsv21Indexer.js.map +1 -0
  85. package/dist/indexers/CosignIndexer.d.ts +14 -0
  86. package/dist/indexers/CosignIndexer.d.ts.map +1 -0
  87. package/dist/indexers/CosignIndexer.js +27 -0
  88. package/dist/indexers/CosignIndexer.js.map +1 -0
  89. package/dist/indexers/FundIndexer.d.ts +20 -0
  90. package/dist/indexers/FundIndexer.d.ts.map +1 -0
  91. package/dist/indexers/FundIndexer.js +65 -0
  92. package/dist/indexers/FundIndexer.js.map +1 -0
  93. package/dist/indexers/InscriptionIndexer.d.ts +33 -0
  94. package/dist/indexers/InscriptionIndexer.d.ts.map +1 -0
  95. package/dist/indexers/InscriptionIndexer.js +116 -0
  96. package/dist/indexers/InscriptionIndexer.js.map +1 -0
  97. package/dist/indexers/LockIndexer.d.ts +11 -0
  98. package/dist/indexers/LockIndexer.d.ts.map +1 -0
  99. package/dist/indexers/LockIndexer.js +44 -0
  100. package/dist/indexers/LockIndexer.js.map +1 -0
  101. package/dist/indexers/MapIndexer.d.ts +14 -0
  102. package/dist/indexers/MapIndexer.d.ts.map +1 -0
  103. package/dist/indexers/MapIndexer.js +65 -0
  104. package/dist/indexers/MapIndexer.js.map +1 -0
  105. package/dist/indexers/OpNSIndexer.d.ts +10 -0
  106. package/dist/indexers/OpNSIndexer.d.ts.map +1 -0
  107. package/dist/indexers/OpNSIndexer.js +39 -0
  108. package/dist/indexers/OpNSIndexer.js.map +1 -0
  109. package/dist/indexers/OrdLockIndexer.d.ts +18 -0
  110. package/dist/indexers/OrdLockIndexer.d.ts.map +1 -0
  111. package/dist/indexers/OrdLockIndexer.js +65 -0
  112. package/dist/indexers/OrdLockIndexer.js.map +1 -0
  113. package/dist/indexers/OriginIndexer.d.ts +38 -0
  114. package/dist/indexers/OriginIndexer.d.ts.map +1 -0
  115. package/dist/indexers/OriginIndexer.js +241 -0
  116. package/dist/indexers/OriginIndexer.js.map +1 -0
  117. package/dist/indexers/Outpoint.d.ts +11 -0
  118. package/dist/indexers/Outpoint.d.ts.map +1 -0
  119. package/dist/indexers/Outpoint.js +62 -0
  120. package/dist/indexers/Outpoint.js.map +1 -0
  121. package/dist/indexers/SigmaIndexer.d.ts +29 -0
  122. package/dist/indexers/SigmaIndexer.d.ts.map +1 -0
  123. package/dist/indexers/SigmaIndexer.js +134 -0
  124. package/dist/indexers/SigmaIndexer.js.map +1 -0
  125. package/dist/indexers/index.d.ts +14 -0
  126. package/dist/indexers/index.d.ts.map +1 -0
  127. package/dist/indexers/index.js +14 -0
  128. package/dist/indexers/index.js.map +1 -0
  129. package/dist/indexers/parseAddress.d.ts +10 -0
  130. package/dist/indexers/parseAddress.d.ts.map +1 -0
  131. package/dist/indexers/parseAddress.js +25 -0
  132. package/dist/indexers/parseAddress.js.map +1 -0
  133. package/dist/node.d.ts +6 -0
  134. package/dist/node.d.ts.map +1 -0
  135. package/dist/node.js +6 -0
  136. package/dist/node.js.map +1 -0
  137. package/dist/signers/ReadOnlySigner.d.ts +16 -0
  138. package/dist/signers/ReadOnlySigner.d.ts.map +1 -0
  139. package/dist/signers/ReadOnlySigner.js +48 -0
  140. package/dist/signers/ReadOnlySigner.js.map +1 -0
  141. package/package.json +21 -8
@@ -0,0 +1,525 @@
1
+ /**
2
+ * AddressSyncManager - Syncs external transactions to the BRC-100 wallet.
3
+ *
4
+ * Split into two components for Chrome extension compatibility:
5
+ * - AddressSyncFetcher: Calls SSE endpoint and enqueues txids (runs in UI context)
6
+ * - AddressSyncProcessor: Processes queue and internalizes outputs (runs in service worker)
7
+ *
8
+ * This separation is necessary because EventSource (SSE) doesn't work reliably
9
+ * in Chrome extension service workers due to their ephemeral nature.
10
+ */
11
+ import { Beef } from '@bsv/sdk';
12
+ import { Bsv21Indexer } from '../indexers/Bsv21Indexer';
13
+ import { FundIndexer } from '../indexers/FundIndexer';
14
+ import { InscriptionIndexer } from '../indexers/InscriptionIndexer';
15
+ import { MapIndexer } from '../indexers/MapIndexer';
16
+ import { OpNSIndexer } from '../indexers/OpNSIndexer';
17
+ import { OriginIndexer } from '../indexers/OriginIndexer';
18
+ import { Outpoint } from '../indexers/Outpoint';
19
+ import { SigmaIndexer } from '../indexers/SigmaIndexer';
20
+ /** Reorg-safe depth - only update lastQueuedScore for outputs this many blocks deep */
21
+ const REORG_SAFE_DEPTH = 6;
22
+ /** Default batch size for queue processing */
23
+ const DEFAULT_BATCH_SIZE = 20;
24
+ /**
25
+ * AddressSyncFetcher - Fetches outputs via SSE and enqueues them.
26
+ *
27
+ * Run this from the UI context (popup) when the wallet opens.
28
+ * It will fetch all new outputs since the last sync and add them to the queue.
29
+ */
30
+ export class AddressSyncFetcher {
31
+ services;
32
+ syncQueue;
33
+ addressManager;
34
+ unsubscribeStream = null;
35
+ listeners = new Map();
36
+ constructor(options) {
37
+ this.services = options.services;
38
+ this.syncQueue = options.syncQueue;
39
+ this.addressManager = options.addressManager;
40
+ }
41
+ on(event, listener) {
42
+ if (!this.listeners.has(event)) {
43
+ this.listeners.set(event, new Set());
44
+ }
45
+ this.listeners
46
+ .get(event)
47
+ ?.add(listener);
48
+ }
49
+ off(event, listener) {
50
+ this.listeners
51
+ .get(event)
52
+ ?.delete(listener);
53
+ }
54
+ emit(event, data) {
55
+ for (const listener of this.listeners.get(event) ?? []) {
56
+ listener(data);
57
+ }
58
+ }
59
+ /**
60
+ * Fetch new outputs via SSE and enqueue them.
61
+ * Returns when the stream completes (all historical data fetched).
62
+ */
63
+ async fetch(currentHeight) {
64
+ if (this.unsubscribeStream) {
65
+ console.warn('Fetch already running');
66
+ return 0;
67
+ }
68
+ const addresses = this.addressManager.getAddresses();
69
+ if (addresses.length === 0) {
70
+ console.warn('No addresses to fetch');
71
+ return 0;
72
+ }
73
+ this.emit('fetch:start', { addresses });
74
+ // Get last score for resumption
75
+ const state = await this.syncQueue.getState();
76
+ const fromScore = state.lastQueuedScore;
77
+ let queuedCount = 0;
78
+ return new Promise((resolve, reject) => {
79
+ this.unsubscribeStream = this.services.owner.sync(addresses, async (output) => {
80
+ await this.handleSyncOutput(output, currentHeight);
81
+ queuedCount++;
82
+ this.emit('fetch:queued', {
83
+ outpoint: output.outpoint,
84
+ score: output.score,
85
+ });
86
+ }, fromScore, () => {
87
+ // Stream complete
88
+ this.unsubscribeStream = null;
89
+ this.emit('fetch:complete', { queuedCount });
90
+ resolve(queuedCount);
91
+ }, (error) => {
92
+ this.unsubscribeStream = null;
93
+ this.emit('fetch:error', { message: error.message });
94
+ reject(error);
95
+ });
96
+ });
97
+ }
98
+ /**
99
+ * Stop the SSE stream if running.
100
+ */
101
+ stop() {
102
+ if (this.unsubscribeStream) {
103
+ this.unsubscribeStream();
104
+ this.unsubscribeStream = null;
105
+ }
106
+ }
107
+ async handleSyncOutput(output, currentHeight) {
108
+ // Enqueue the output
109
+ await this.syncQueue.enqueue([
110
+ {
111
+ outpoint: output.outpoint,
112
+ score: output.score,
113
+ spendTxid: output.spendTxid,
114
+ },
115
+ ]);
116
+ // Update lastQueuedScore only for reorg-safe outputs
117
+ const outputHeight = Math.floor(output.score / 1e9);
118
+ if (currentHeight - outputHeight >= REORG_SAFE_DEPTH) {
119
+ await this.syncQueue.setState({ lastQueuedScore: output.score });
120
+ }
121
+ }
122
+ }
123
+ /**
124
+ * AddressSyncProcessor - Processes the sync queue and internalizes outputs.
125
+ *
126
+ * Run this from the service worker. It will process items from the queue
127
+ * until the queue is empty or stop() is called.
128
+ */
129
+ export class AddressSyncProcessor {
130
+ wallet;
131
+ services;
132
+ syncQueue;
133
+ addressManager;
134
+ network;
135
+ batchSize;
136
+ indexers;
137
+ processorRunning = false;
138
+ stopRequested = false;
139
+ listeners = new Map();
140
+ constructor(options) {
141
+ this.wallet = options.wallet;
142
+ this.services = options.services;
143
+ this.syncQueue = options.syncQueue;
144
+ this.addressManager = options.addressManager;
145
+ this.network = options.network;
146
+ this.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
147
+ // Build owners set from address manager
148
+ const owners = new Set(this.addressManager.getAddresses());
149
+ // Initialize indexers for sync (P2PKH-based outputs only)
150
+ this.indexers = options.indexers ?? [
151
+ new FundIndexer(owners, this.network),
152
+ new InscriptionIndexer(owners, this.network),
153
+ new Bsv21Indexer(owners, this.network, this.services),
154
+ new OriginIndexer(owners, this.network, this.services),
155
+ new OpNSIndexer(owners, this.network),
156
+ new SigmaIndexer(owners, this.network),
157
+ new MapIndexer(owners, this.network),
158
+ ];
159
+ }
160
+ on(event, listener) {
161
+ if (!this.listeners.has(event)) {
162
+ this.listeners.set(event, new Set());
163
+ }
164
+ this.listeners
165
+ .get(event)
166
+ ?.add(listener);
167
+ }
168
+ off(event, listener) {
169
+ this.listeners
170
+ .get(event)
171
+ ?.delete(listener);
172
+ }
173
+ emit(event, data) {
174
+ for (const listener of this.listeners.get(event) ?? []) {
175
+ listener(data);
176
+ }
177
+ }
178
+ /**
179
+ * Start processing the queue.
180
+ * Processes until queue is empty or stop() is called.
181
+ */
182
+ async start() {
183
+ if (this.processorRunning) {
184
+ console.warn('Processor already running');
185
+ return;
186
+ }
187
+ // Reset any stuck processing items
188
+ await this.syncQueue.resetProcessing();
189
+ this.stopRequested = false;
190
+ this.emit('process:start', {});
191
+ await this.processQueueLoop();
192
+ }
193
+ /**
194
+ * Stop processing the queue.
195
+ */
196
+ stop() {
197
+ this.stopRequested = true;
198
+ }
199
+ /**
200
+ * Check if processor is currently running.
201
+ */
202
+ isRunning() {
203
+ return this.processorRunning;
204
+ }
205
+ async processQueueLoop() {
206
+ this.processorRunning = true;
207
+ try {
208
+ while (!this.stopRequested) {
209
+ // Claim batch of pending items grouped by txid
210
+ const byTxid = await this.syncQueue.claim(this.batchSize);
211
+ if (byTxid.size === 0) {
212
+ // Queue empty - wait and poll again
213
+ await new Promise((resolve) => setTimeout(resolve, 1000));
214
+ continue;
215
+ }
216
+ // Process each txid in parallel
217
+ await Promise.all(Array.from(byTxid.entries()).map(([txid, items]) => this.processTxid(txid, items)));
218
+ // Emit progress
219
+ const stats = await this.syncQueue.getStats();
220
+ this.emit('process:progress', {
221
+ pending: stats.pending,
222
+ done: stats.done,
223
+ failed: stats.failed,
224
+ });
225
+ }
226
+ this.emit('process:complete', {});
227
+ }
228
+ catch (error) {
229
+ this.emit('process:error', {
230
+ message: error instanceof Error ? error.message : String(error),
231
+ });
232
+ }
233
+ finally {
234
+ this.processorRunning = false;
235
+ }
236
+ }
237
+ async processTxid(txid, items) {
238
+ try {
239
+ // Build spend map: vout → spendTxid
240
+ const spendMap = new Map();
241
+ for (const item of items) {
242
+ if (item.spendTxid) {
243
+ const vout = Number.parseInt(item.outpoint.split('_')[1], 10);
244
+ spendMap.set(vout, item.spendTxid);
245
+ }
246
+ }
247
+ // If all items are spend-only (no new outputs), just mark outputs as spent
248
+ const hasNewOutputs = items.some((item) => !item.spendTxid);
249
+ if (!hasNewOutputs) {
250
+ // TODO: Mark outputs as spent in wallet storage
251
+ // For now, just complete the items
252
+ await this.syncQueue.completeMany(items.map((i) => i.id));
253
+ return;
254
+ }
255
+ // Load transaction as BEEF
256
+ const beef = await this.services.beef.getBeef(txid);
257
+ if (!beef) {
258
+ throw new Error(`Failed to load transaction ${txid}`);
259
+ }
260
+ // Parse transaction with indexers
261
+ const beefObj = Beef.fromBinary(Array.from(beef));
262
+ const btx = beefObj.findTxid(txid);
263
+ if (!btx?.tx) {
264
+ throw new Error(`Transaction ${txid} not found in BEEF`);
265
+ }
266
+ const ctx = await this.parseTransaction(btx.tx);
267
+ // Build InternalizeOutput entries for owned outputs
268
+ const outputs = [];
269
+ let internalizedCount = 0;
270
+ for (const txo of ctx.txos) {
271
+ if (!txo.owner)
272
+ continue;
273
+ // Check if this output is at one of our receive addresses
274
+ const derivation = this.addressManager.getDerivation(txo.owner);
275
+ if (!derivation)
276
+ continue;
277
+ // Build internalize output using protocol from indexer
278
+ const internalizeOutput = this.buildInternalizeOutput(txo, derivation);
279
+ if (internalizeOutput) {
280
+ outputs.push(internalizeOutput);
281
+ internalizedCount++;
282
+ }
283
+ }
284
+ // Internalize if we have owned outputs
285
+ if (outputs.length > 0) {
286
+ const args = {
287
+ tx: Array.from(beef),
288
+ outputs,
289
+ description: '1sat sync',
290
+ };
291
+ console.log(`[AddressSyncProcessor] Internalizing ${outputs.length} outputs for txid ${txid}`, outputs.map((o) => ({ vout: o.outputIndex, protocol: o.protocol })));
292
+ await this.wallet.internalizeAction(args);
293
+ console.log(`[AddressSyncProcessor] Internalization complete for txid ${txid}`);
294
+ this.emit('process:parsed', { internalizedCount });
295
+ }
296
+ // Complete all items for this txid
297
+ await this.syncQueue.completeMany(items.map((i) => i.id));
298
+ }
299
+ catch (error) {
300
+ // Fail all items for this txid
301
+ const errorMsg = error instanceof Error ? error.message : String(error);
302
+ console.error(`[AddressSyncProcessor] Failed to process txid ${txid}:`, errorMsg);
303
+ for (const item of items) {
304
+ await this.syncQueue.fail(item.id, errorMsg);
305
+ }
306
+ }
307
+ }
308
+ async parseTransaction(tx) {
309
+ const txid = tx.id('hex');
310
+ // Initialize parse context
311
+ const ctx = {
312
+ tx,
313
+ txid,
314
+ txos: [],
315
+ spends: [],
316
+ summary: {},
317
+ indexers: this.indexers,
318
+ };
319
+ // Parse each output
320
+ for (let vout = 0; vout < tx.outputs.length; vout++) {
321
+ const output = tx.outputs[vout];
322
+ const txo = {
323
+ output,
324
+ outpoint: new Outpoint(txid, vout),
325
+ data: {},
326
+ };
327
+ // Run through all indexers
328
+ for (const indexer of this.indexers) {
329
+ const result = await indexer.parse(txo);
330
+ if (result) {
331
+ txo.data[indexer.tag] = {
332
+ data: result.data,
333
+ tags: result.tags,
334
+ content: result.content,
335
+ };
336
+ // First indexer to set owner wins
337
+ if (result.owner && !txo.owner) {
338
+ txo.owner = result.owner;
339
+ }
340
+ // First indexer to set basket wins
341
+ if (result.basket && !txo.basket) {
342
+ txo.basket = result.basket;
343
+ }
344
+ // First indexer to set protocol wins (custom scripts override P2PKH)
345
+ if (result.protocol && !txo.protocol) {
346
+ txo.protocol = result.protocol;
347
+ }
348
+ }
349
+ }
350
+ ctx.txos.push(txo);
351
+ }
352
+ // Run summarize phase for all indexers
353
+ for (const indexer of this.indexers) {
354
+ const summary = await indexer.summarize(ctx, true);
355
+ if (summary) {
356
+ ctx.summary[indexer.tag] = summary;
357
+ }
358
+ }
359
+ return ctx;
360
+ }
361
+ buildInternalizeOutput(txo, derivation) {
362
+ const vout = txo.outpoint.vout;
363
+ // Use protocol from indexer, default to "wallet payment" for P2PKH
364
+ const protocol = txo.protocol || 'wallet payment';
365
+ if (protocol === 'basket insertion') {
366
+ // Custom script - use basket insertion
367
+ // These outputs need custom unlock scripts when spent
368
+ const basket = txo.basket || 'custom';
369
+ const tags = this.collectTags(txo);
370
+ const nameTag = tags.find((t) => t.startsWith('name:'));
371
+ return {
372
+ outputIndex: vout,
373
+ protocol: 'basket insertion',
374
+ insertionRemittance: {
375
+ basket,
376
+ tags,
377
+ customInstructions: JSON.stringify({
378
+ derivationPrefix: derivation.derivationPrefix,
379
+ derivationSuffix: derivation.derivationSuffix,
380
+ senderIdentityKey: derivation.senderIdentityKey,
381
+ ...(nameTag && { name: nameTag.slice(5).slice(0, 64) }),
382
+ }),
383
+ },
384
+ };
385
+ }
386
+ // P2PKH-based output - use wallet payment for auto-signing
387
+ return {
388
+ outputIndex: vout,
389
+ protocol: 'wallet payment',
390
+ paymentRemittance: {
391
+ derivationPrefix: derivation.derivationPrefix,
392
+ derivationSuffix: derivation.derivationSuffix,
393
+ senderIdentityKey: derivation.senderIdentityKey,
394
+ },
395
+ };
396
+ }
397
+ collectTags(txo) {
398
+ const tags = [];
399
+ for (const indexData of Object.values(txo.data)) {
400
+ tags.push(...indexData.tags);
401
+ }
402
+ return tags;
403
+ }
404
+ }
405
+ /**
406
+ * AddressSyncManager - Class that combines SSE fetching and queue processing.
407
+ *
408
+ * For Chrome extensions, use AddressSyncFetcher (UI) and AddressSyncProcessor
409
+ * (service worker) separately since EventSource doesn't work reliably in service workers.
410
+ */
411
+ export class AddressSyncManager {
412
+ fetcher;
413
+ processor;
414
+ wallet;
415
+ addressManager;
416
+ listeners = new Map();
417
+ fetchPromise = null;
418
+ constructor(options) {
419
+ this.wallet = options.wallet;
420
+ this.addressManager = options.addressManager;
421
+ // Create fetcher for SSE stream
422
+ this.fetcher = new AddressSyncFetcher({
423
+ services: options.services,
424
+ syncQueue: options.syncQueue,
425
+ addressManager: options.addressManager,
426
+ });
427
+ // Create processor for queue processing
428
+ this.processor = new AddressSyncProcessor({
429
+ wallet: options.wallet,
430
+ services: options.services,
431
+ syncQueue: options.syncQueue,
432
+ addressManager: options.addressManager,
433
+ network: options.network,
434
+ batchSize: options.batchSize,
435
+ indexers: options.indexers,
436
+ });
437
+ // Wire up event forwarding
438
+ this.setupEventForwarding();
439
+ }
440
+ setupEventForwarding() {
441
+ // Forward fetcher events
442
+ this.fetcher.on('fetch:start', (data) => {
443
+ this.emit('sync:start', { addresses: data.addresses });
444
+ });
445
+ this.fetcher.on('fetch:error', (data) => {
446
+ this.emit('sync:error', { message: data.message });
447
+ });
448
+ // Forward processor events
449
+ this.processor.on('process:progress', (data) => {
450
+ this.emit('sync:progress', data);
451
+ });
452
+ this.processor.on('process:complete', () => {
453
+ this.emit('sync:complete', {});
454
+ });
455
+ this.processor.on('process:error', (data) => {
456
+ this.emit('sync:error', { message: data.message });
457
+ });
458
+ this.processor.on('process:parsed', (data) => {
459
+ this.emit('sync:parsed', data);
460
+ });
461
+ }
462
+ // ===== Event Emitter =====
463
+ on(event, listener) {
464
+ if (!this.listeners.has(event)) {
465
+ this.listeners.set(event, new Set());
466
+ }
467
+ this.listeners
468
+ .get(event)
469
+ ?.add(listener);
470
+ }
471
+ off(event, listener) {
472
+ this.listeners
473
+ .get(event)
474
+ ?.delete(listener);
475
+ }
476
+ emit(event, data) {
477
+ for (const listener of this.listeners.get(event) ?? []) {
478
+ listener(data);
479
+ }
480
+ }
481
+ // ===== Sync Control =====
482
+ /**
483
+ * Start syncing - opens SSE stream and starts queue processor.
484
+ */
485
+ async sync() {
486
+ if (this.fetchPromise || this.processor.isRunning()) {
487
+ console.warn('Sync already running');
488
+ return;
489
+ }
490
+ const addresses = this.addressManager.getAddresses();
491
+ if (addresses.length === 0) {
492
+ console.warn('No addresses to sync');
493
+ return;
494
+ }
495
+ // Get current height for reorg protection
496
+ const { height: currentHeight } = await this.wallet.getHeight({});
497
+ // Start fetcher (SSE stream) - this runs until stream completes
498
+ this.fetchPromise = this.fetcher.fetch(currentHeight);
499
+ // Start processor in parallel - this processes items as they come in
500
+ // and waits for more until fetch completes
501
+ this.processor.start();
502
+ // Wait for fetch to complete, then let processor finish
503
+ try {
504
+ await this.fetchPromise;
505
+ }
506
+ finally {
507
+ this.fetchPromise = null;
508
+ }
509
+ }
510
+ /**
511
+ * Stop syncing - closes SSE stream and stops queue processor.
512
+ */
513
+ stop() {
514
+ this.fetcher.stop();
515
+ this.processor.stop();
516
+ this.fetchPromise = null;
517
+ }
518
+ /**
519
+ * Check if sync is currently running.
520
+ */
521
+ isSyncing() {
522
+ return this.fetchPromise !== null || this.processor.isRunning();
523
+ }
524
+ }
525
+ //# sourceMappingURL=AddressSyncManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddressSyncManager.js","sourceRoot":"","sources":["../../src/address-sync/AddressSyncManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { AddressSyncQueueInput, AddressSyncQueueItem, AddressSyncQueueStats, AddressSyncQueueStorage, AddressSyncState } from '@1sat/types';
2
+ /**
3
+ * IndexedDB implementation of AddressSyncQueueStorage for browser environments.
4
+ */
5
+ export declare class AddressSyncQueueIdb implements AddressSyncQueueStorage {
6
+ private dbName;
7
+ private db;
8
+ private dbPromise;
9
+ /**
10
+ * Create a new IndexedDB address sync queue.
11
+ * @param accountId - Unique identifier for the account (e.g., address, pubkey hash)
12
+ */
13
+ constructor(accountId: string);
14
+ private getDb;
15
+ enqueue(items: AddressSyncQueueInput[]): Promise<void>;
16
+ claim(count?: number): Promise<Map<string, AddressSyncQueueItem[]>>;
17
+ private getPendingByTxid;
18
+ private markProcessing;
19
+ complete(id: string): Promise<void>;
20
+ completeMany(ids: string[]): Promise<void>;
21
+ fail(id: string, error: string): Promise<void>;
22
+ getByTxid(txid: string): Promise<AddressSyncQueueItem[]>;
23
+ getByStatus(status: AddressSyncQueueItem['status'], limit?: number): Promise<AddressSyncQueueItem[]>;
24
+ getStats(): Promise<AddressSyncQueueStats>;
25
+ getState(): Promise<AddressSyncState>;
26
+ setState(state: Partial<AddressSyncState>): Promise<void>;
27
+ resetProcessing(): Promise<number>;
28
+ clear(): Promise<void>;
29
+ close(): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=AddressSyncQueueIdb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddressSyncQueueIdb.d.ts","sourceRoot":"","sources":["../../src/address-sync/AddressSyncQueueIdb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,MAAM,aAAa,CAAA;AAOpB;;GAEG;AACH,qBAAa,mBAAoB,YAAW,uBAAuB;IAClE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,SAAS,CAAoC;IAErD;;;OAGG;gBACS,SAAS,EAAE,MAAM;YAIf,KAAK;IAwCb,OAAO,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CtD,KAAK,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAqDtD,gBAAgB;YA6BhB,cAAc;IAwBtB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4BxD,WAAW,CAChB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EACtC,KAAK,SAAM,GACT,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAwB5B,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAmC1C,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAkBrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IA6BlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO5B"}