@arkade-os/sdk 0.4.44 → 0.4.46

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 (88) hide show
  1. package/README.md +35 -0
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/adapters/indexedDB.cjs +5 -5
  7. package/dist/adapters/indexedDB.js +4 -4
  8. package/dist/{ark-I8jfe5VE.d.cts → ark-C9ognsOV.d.cts} +94 -2
  9. package/dist/{ark-I8jfe5VE.d.ts → ark-C9ognsOV.d.ts} +94 -2
  10. package/dist/{asyncStorageTaskQueue-BtSOVZFn.d.ts → asyncStorageTaskQueue-BAKZ5cS5.d.ts} +2 -2
  11. package/dist/{asyncStorageTaskQueue-Dap7qUlF.d.cts → asyncStorageTaskQueue-CmBYVlxw.d.cts} +2 -2
  12. package/dist/{chunk-32YKLQPS.cjs → chunk-4KXOCVXP.cjs} +32 -29
  13. package/dist/chunk-4KXOCVXP.cjs.map +1 -0
  14. package/dist/{chunk-RJ6XVCX4.cjs → chunk-6TQJOD72.cjs} +7 -7
  15. package/dist/{chunk-RJ6XVCX4.cjs.map → chunk-6TQJOD72.cjs.map} +1 -1
  16. package/dist/{chunk-UBYY2TPK.cjs → chunk-7IYIFMF4.cjs} +178 -79
  17. package/dist/chunk-7IYIFMF4.cjs.map +1 -0
  18. package/dist/{chunk-LJ35HPJW.js → chunk-CWJ7ZCP7.js} +171 -75
  19. package/dist/chunk-CWJ7ZCP7.js.map +1 -0
  20. package/dist/{chunk-XIVCG6EP.cjs → chunk-D46YDM36.cjs} +1173 -425
  21. package/dist/chunk-D46YDM36.cjs.map +1 -0
  22. package/dist/{chunk-BE5MUB7T.js → chunk-FWG4TSPN.js} +7 -2
  23. package/dist/chunk-FWG4TSPN.js.map +1 -0
  24. package/dist/{chunk-V7WIZR2B.js → chunk-JTCQ6QXQ.js} +4 -4
  25. package/dist/{chunk-V7WIZR2B.js.map → chunk-JTCQ6QXQ.js.map} +1 -1
  26. package/dist/{chunk-HXDZ2QTW.cjs → chunk-MQB5H4X5.cjs} +7 -2
  27. package/dist/chunk-MQB5H4X5.cjs.map +1 -0
  28. package/dist/{chunk-FMI2GKYO.js → chunk-P6VBP3CT.js} +977 -231
  29. package/dist/chunk-P6VBP3CT.js.map +1 -0
  30. package/dist/{chunk-YNEDJTX2.js → chunk-QKC2T54O.js} +6 -3
  31. package/dist/chunk-QKC2T54O.js.map +1 -0
  32. package/dist/{chunk-LCQQPOIT.js → chunk-R2SVAM5Q.js} +3 -3
  33. package/dist/{chunk-LCQQPOIT.js.map → chunk-R2SVAM5Q.js.map} +1 -1
  34. package/dist/{chunk-X37EKDIH.cjs → chunk-SOXGAA52.cjs} +14 -14
  35. package/dist/{chunk-X37EKDIH.cjs.map → chunk-SOXGAA52.cjs.map} +1 -1
  36. package/dist/contracts/handlers/index.cjs +7 -7
  37. package/dist/contracts/handlers/index.d.cts +3 -3
  38. package/dist/contracts/handlers/index.d.ts +3 -3
  39. package/dist/contracts/handlers/index.js +2 -2
  40. package/dist/{delegate-BRqbh2fW.d.cts → delegate-DVEgyRwI.d.cts} +1 -1
  41. package/dist/{delegate-CgjVjYOP.d.ts → delegate-aOd5qINr.d.ts} +1 -1
  42. package/dist/{index-DvWNB_rl.d.ts → index-CPzL4tqg.d.ts} +2 -2
  43. package/dist/{index-DHuXlDEg.d.cts → index-D8vmtWWO.d.cts} +2 -2
  44. package/dist/index.cjs +176 -156
  45. package/dist/index.d.cts +45 -20
  46. package/dist/index.d.ts +45 -20
  47. package/dist/index.js +4 -4
  48. package/dist/repositories/realm/index.cjs +23 -19
  49. package/dist/repositories/realm/index.cjs.map +1 -1
  50. package/dist/repositories/realm/index.d.cts +2 -2
  51. package/dist/repositories/realm/index.d.ts +2 -2
  52. package/dist/repositories/realm/index.js +9 -5
  53. package/dist/repositories/realm/index.js.map +1 -1
  54. package/dist/repositories/sqlite/index.cjs +22 -18
  55. package/dist/repositories/sqlite/index.cjs.map +1 -1
  56. package/dist/repositories/sqlite/index.d.cts +2 -2
  57. package/dist/repositories/sqlite/index.d.ts +2 -2
  58. package/dist/repositories/sqlite/index.js +9 -5
  59. package/dist/repositories/sqlite/index.js.map +1 -1
  60. package/dist/{taskRunner-Bptw9UMa.d.ts → taskRunner-B48-V-Pb.d.ts} +2 -2
  61. package/dist/{taskRunner-CeFxKhSH.d.cts → taskRunner-nNecmQ2C.d.cts} +2 -2
  62. package/dist/wallet/expo/background.cjs +14 -14
  63. package/dist/wallet/expo/background.d.cts +3 -3
  64. package/dist/wallet/expo/background.d.ts +3 -3
  65. package/dist/wallet/expo/background.js +6 -6
  66. package/dist/wallet/expo/index.cjs +27 -14
  67. package/dist/wallet/expo/index.cjs.map +1 -1
  68. package/dist/wallet/expo/index.d.cts +11 -4
  69. package/dist/wallet/expo/index.d.ts +11 -4
  70. package/dist/wallet/expo/index.js +18 -5
  71. package/dist/wallet/expo/index.js.map +1 -1
  72. package/dist/{wallet-BsqRU8KM.d.cts → wallet-BUg3D4WJ.d.cts} +139 -3
  73. package/dist/{wallet-D9z7wssl.d.ts → wallet-DM0oShTu.d.ts} +139 -3
  74. package/dist/worker/expo/index.cjs +10 -9
  75. package/dist/worker/expo/index.cjs.map +1 -1
  76. package/dist/worker/expo/index.d.cts +4 -4
  77. package/dist/worker/expo/index.d.ts +4 -4
  78. package/dist/worker/expo/index.js +6 -5
  79. package/dist/worker/expo/index.js.map +1 -1
  80. package/package.json +2 -2
  81. package/dist/chunk-32YKLQPS.cjs.map +0 -1
  82. package/dist/chunk-BE5MUB7T.js.map +0 -1
  83. package/dist/chunk-FMI2GKYO.js.map +0 -1
  84. package/dist/chunk-HXDZ2QTW.cjs.map +0 -1
  85. package/dist/chunk-LJ35HPJW.js.map +0 -1
  86. package/dist/chunk-UBYY2TPK.cjs.map +0 -1
  87. package/dist/chunk-XIVCG6EP.cjs.map +0 -1
  88. package/dist/chunk-YNEDJTX2.js.map +0 -1
@@ -1,8 +1,82 @@
1
1
  import { Transaction } from '@scure/btc-signer';
2
2
  import { Bytes } from '@scure/btc-signer/utils.js';
3
- import { B as BatchStartedEvent, u as TreeSigningStartedEvent, v as TxTree, w as TreeNoncesEvent, x as BatchFinalizationEvent, y as BatchFinalizedEvent, z as BatchFailedEvent, D as TreeTxEvent, F as TreeSignatureEvent, j as SettlementEvent, b as WalletConfig, W as WalletRepository, C as ContractRepository, H as DescriptorProvider, g as IContractManager, J as IReadonlyWallet, K as ReadonlyIdentity, N as Network, O as OnchainProvider, p as IndexerProvider, L as DelegateProvider, M as ReadonlyWalletConfig, P as IntentRepository, Q as VirtualTxRepository, q as RelativeTimelock, e as ActivityRegistry, U as IReadonlyAssetManager, o as ArkProvider, X as NetworkName, Y as ArkInfo, Z as ArkAddress, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, A as ArkTransaction, f as Activity, d as ExtendedCoin, _ as Coin, $ as ContractManager, I as IWallet, a as Identity, a0 as CSVMultisigTapscript, a1 as SettlementConfig, k as IAssetManager, a2 as VtxoManager, h as IDelegateManager, S as SendBitcoinParams, i as SettleParams, R as Recipient, a3 as SignerSession, a4 as SignedIntent, a5 as Intent } from './ark-I8jfe5VE.js';
3
+ import { J as BatchStartedEvent, K as TreeSigningStartedEvent, L as TxTree, M as TreeNoncesEvent, N as BatchFinalizationEvent, P as BatchFinalizedEvent, Q as BatchFailedEvent, U as TreeTxEvent, X as TreeSignatureEvent, j as SettlementEvent, b as WalletConfig, W as WalletRepository, C as ContractRepository, Y as DescriptorProvider, g as IContractManager, Z as IReadonlyWallet, _ as ReadonlyIdentity, $ as Network, a0 as OnchainProvider, p as IndexerProvider, a1 as DelegateProvider, a2 as ReadonlyWalletConfig, x as IntentRepository, B as VirtualTxRepository, a3 as ExitCaptureMode, a4 as ExitDataSource, q as RelativeTimelock, e as ActivityRegistry, a5 as IReadonlyAssetManager, a6 as ContractSyncState, o as ArkProvider, a7 as NetworkName, a8 as ArkInfo, a9 as ArkAddress, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, A as ArkTransaction, f as Activity, d as ExtendedCoin, aa as Coin, ab as ContractManager, I as IWallet, a as Identity, ac as CSVMultisigTapscript, ad as SettlementConfig, k as IAssetManager, ae as VtxoManager, h as IDelegateManager, S as SendBitcoinParams, i as SettleParams, R as Recipient, af as SignerSession, ag as SignedIntent, ah as Intent } from './ark-C9ognsOV.js';
4
4
  import { TransactionOutput } from '@scure/btc-signer/psbt.js';
5
- import { D as DefaultVtxo, a as DelegateVtxo } from './delegate-CgjVjYOP.js';
5
+ import { D as DefaultVtxo, a as DelegateVtxo } from './delegate-aOd5qINr.js';
6
+
7
+ declare class ArkError extends Error {
8
+ readonly code: number;
9
+ readonly message: string;
10
+ readonly name: string;
11
+ readonly metadata?: Record<string, string> | undefined;
12
+ constructor(code: number, message: string, name: string, metadata?: Record<string, string> | undefined);
13
+ }
14
+ /**
15
+ * Structured arkd error `name`s the SDK branches on, centralized so call sites don't
16
+ * hardcode string literals. Not an exhaustive mirror of the server's codes — only the
17
+ * ones the SDK acts on.
18
+ */
19
+ declare const ArkErrorName: {
20
+ readonly DIGEST_MISMATCH: "DIGEST_MISMATCH";
21
+ readonly VTXO_ALREADY_SPENT: "VTXO_ALREADY_SPENT";
22
+ readonly INVALID_TX_FILTER: "INVALID_TX_FILTER";
23
+ readonly TX_FILTERS_LIMIT_EXCEEDED: "TX_FILTERS_LIMIT_EXCEEDED";
24
+ /**
25
+ * A CLTV closure was spent before its absolute locktime matured. Raised only by
26
+ * `submitTx` (never `finalizeTx`), with metadata
27
+ * `{ locktime, current_locktime, type: "height" | "time" }`.
28
+ *
29
+ * Self-healing, so defer and retry rather than fail: the server matures a
30
+ * seconds-locktime against the **chain tip block's timestamp**, not its wall clock,
31
+ * so a spend attempted promptly at maturity is rejected until a later block lands.
32
+ */
33
+ readonly FORFEIT_CLOSURE_LOCKED: "FORFEIT_CLOSURE_LOCKED";
34
+ };
35
+ type ArkErrorName = (typeof ArkErrorName)[keyof typeof ArkErrorName];
36
+ /**
37
+ * Type guard for a structured {@link ArkError}, optionally narrowing to a specific
38
+ * `name`. Prefer it over comparing `err.name` literals.
39
+ *
40
+ * `name` accepts only cataloged {@link ArkErrorName} values; to branch on a name the
41
+ * catalog does not cover, either add it there or compare `err.name` after guarding
42
+ * with the one-argument form.
43
+ *
44
+ * @example
45
+ * if (isArkError(maybeArkError(err), ArkErrorName.DIGEST_MISMATCH)) { ... }
46
+ */
47
+ declare function isArkError(error: unknown, name?: ArkErrorName): error is ArkError;
48
+ /**
49
+ * Which remote dependency an availability failure refers to. Used to label the
50
+ * {@link ProviderUnavailableError} message and the wallet's
51
+ * `ProviderConnectionState`; it is deliberately *not* carried as a structured
52
+ * field on the error, since custom `Error` own-properties do not survive the
53
+ * service-worker `postMessage` boundary (only `name`/`message`/`cause` do).
54
+ */
55
+ type ProviderKind = "arkade" | "indexer";
56
+ /**
57
+ * A remote provider (Arkade operator or its indexer) is temporarily
58
+ * unreachable. This is a *retryable* condition — transport failure, request
59
+ * timeout, or a 5xx/429-style temporary HTTP response — as opposed to a
60
+ * terminal configuration/authorization/schema error, which stays a plain
61
+ * `Error`/{@link ArkError}. The original low-level error is preserved as
62
+ * {@link Error.cause}.
63
+ */
64
+ declare class ProviderUnavailableError extends Error {
65
+ /** Always `true`: this error type only ever wraps retryable conditions. */
66
+ readonly retryable = true;
67
+ constructor(message: string, options?: {
68
+ cause?: unknown;
69
+ });
70
+ }
71
+ /**
72
+ * Try to convert an error to an ArkError class, returning undefined if the error is not an ArkError
73
+ * @param error - The error to parse
74
+ * @returns The parsed ArkError, or undefined if the error is not an ArkError
75
+ */
76
+ declare function maybeArkError(error: any): ArkError | undefined;
77
+
78
+ /** Where the {@link ArkInfo} used to construct a wallet came from. */
79
+ type ServerInfoSource = "live" | "cache";
6
80
 
7
81
  /**
8
82
  * Batch namespace provides utilities for joining and processing batch session.
@@ -412,6 +486,23 @@ interface BoardingUtxoGroup {
412
486
  csvTimelock: RelativeTimelock;
413
487
  coins: ExtendedCoin[];
414
488
  }
489
+ /**
490
+ * Freshness of the wallet's provider-backed sync, composed from the boot
491
+ * server-info source and the contract-manager's indexer-sync health. It
492
+ * describes only how fresh provider data is — never the wallet balances/VTXOs
493
+ * themselves, which are always served from the repository (system of record).
494
+ */
495
+ type ProviderConnectionState = {
496
+ mode: "online";
497
+ source: "live";
498
+ lastOnlineAt: number;
499
+ } | {
500
+ mode: "degraded";
501
+ source: "cache" | "repository";
502
+ provider: ProviderKind;
503
+ reason: string;
504
+ lastOnlineAt?: number;
505
+ };
415
506
  declare class ReadonlyWallet implements IReadonlyWallet {
416
507
  readonly identity: ReadonlyIdentity;
417
508
  readonly network: Network;
@@ -438,6 +529,12 @@ declare class ReadonlyWallet implements IReadonlyWallet {
438
529
  * (ContractManager isn't given it); `undefined` ⇒ no-op.
439
530
  */
440
531
  virtualTxRepository?: VirtualTxRepository;
532
+ /** Opt-in exit-data capture settings; see {@link StorageConfig.exitDataCapture}. */
533
+ exitDataCapture?: {
534
+ mode?: ExitCaptureMode;
535
+ minExitWorthSats?: number;
536
+ sources?: ExitDataSource[];
537
+ };
441
538
  private readonly _assetManager;
442
539
  readonly walletContractTimelocks: RelativeTimelock[];
443
540
  protected _pendingSpendOutpoints: Set<string>;
@@ -473,6 +570,43 @@ declare class ReadonlyWallet implements IReadonlyWallet {
473
570
  * construction-time snapshot for their lifetime.
474
571
  */
475
572
  protected _arkServerPublicKey: Bytes;
573
+ /**
574
+ * Whether this wallet was constructed from live operator server-info
575
+ * (`"live"`) or from a cached snapshot because the operator was unreachable
576
+ * (`"cache"`). Freshness signal for {@link getProviderConnectionState}.
577
+ */
578
+ protected _serverInfoSource: ServerInfoSource;
579
+ /**
580
+ * Epoch-ms of the last known live operator contact: construction time on the
581
+ * `live` boot path, the cached snapshot's `savedAt` on the `cache` path.
582
+ */
583
+ protected _serverInfoLastOnlineAt?: number;
584
+ /** @see {@link _serverInfoSource} */
585
+ get serverInfoSource(): ServerInfoSource;
586
+ /**
587
+ * Composed provider-connection freshness: the boot server-info source
588
+ * (Arkade) combined with the contract-manager's indexer-sync health, if the
589
+ * manager has been initialized. Reads no live provider state — it never
590
+ * forces a `ContractManager` to construct — so it is safe for readonly
591
+ * callers that only use address/balance APIs.
592
+ *
593
+ * - Boot fell back to a cached snapshot → degraded on `arkade` (`cache`).
594
+ * - Otherwise, if the contract manager has degraded to repository data →
595
+ * degraded on `indexer` (`repository`).
596
+ * - Otherwise online.
597
+ *
598
+ * This only describes sync freshness; wallet balances/VTXOs are always read
599
+ * from the repository regardless of this state.
600
+ */
601
+ getProviderConnectionState(): ProviderConnectionState;
602
+ /**
603
+ * The contract-manager's current provider-sync health **without forcing it
604
+ * to initialize** — reads the already-constructed manager, or reports
605
+ * `online` when none exists yet. Unlike {@link getContractManager}, this
606
+ * never triggers a remote sync, so it is safe on a pure diagnostics path
607
+ * (e.g. the service-worker sync-state message).
608
+ */
609
+ getContractSyncState(): ContractSyncState;
476
610
  protected constructor(identity: ReadonlyIdentity, network: Network, onchainProvider: OnchainProvider, indexerProvider: IndexerProvider, arkServerPublicKey: Bytes, offchainTapscript: DefaultVtxo.Script | DelegateVtxo.Script, boardingTapscript: DefaultVtxo.Script, dustAmount: bigint, walletRepository: WalletRepository, contractRepository: ContractRepository, delegateProvider?: DelegateProvider | undefined, watcherConfig?: ReadonlyWalletConfig["watcherConfig"], walletContractTimelocks?: RelativeTimelock[]);
477
611
  /**
478
612
  * x-only hex of the operator's deprecated signer keys (from
@@ -570,6 +704,8 @@ declare class ReadonlyWallet implements IReadonlyWallet {
570
704
  walletRepository: WalletRepository;
571
705
  contractRepository: ContractRepository;
572
706
  info: ArkInfo;
707
+ serverInfoSource: ServerInfoSource;
708
+ serverInfoLastOnlineAt: number | undefined;
573
709
  delegateProvider: DelegateProvider | undefined;
574
710
  /** @deprecated alias for `delegateProvider` */
575
711
  delegatorProvider: DelegateProvider | undefined;
@@ -1190,4 +1326,4 @@ declare class Wallet extends ReadonlyWallet implements IWallet {
1190
1326
  */
1191
1327
  declare function waitForIncomingFunds(wallet: Wallet): Promise<IncomingFunds>;
1192
1328
 
1193
- export { Batch as B, type IncomingFunds as I, ReadonlyWallet as R, Wallet as W, type ReceiveRotatorFactory as a, type ReceiveRotatorBootOpts as b, type ReceiveRotatorBoot as c, type BoardingUtxoGroup as d, waitForIncomingFunds as w };
1329
+ export { ArkError as A, Batch as B, type IncomingFunds as I, type ProviderConnectionState as P, ReadonlyWallet as R, type ServerInfoSource as S, Wallet as W, type ReceiveRotatorFactory as a, type ReceiveRotatorBootOpts as b, type ReceiveRotatorBoot as c, ArkErrorName as d, type BoardingUtxoGroup as e, type ProviderKind as f, ProviderUnavailableError as g, isArkError as i, maybeArkError as m, waitForIncomingFunds as w };
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkRJ6XVCX4_cjs = require('../../chunk-RJ6XVCX4.cjs');
4
- require('../../chunk-XIVCG6EP.cjs');
5
- require('../../chunk-UBYY2TPK.cjs');
6
- require('../../chunk-32YKLQPS.cjs');
7
- require('../../chunk-HXDZ2QTW.cjs');
3
+ var chunk6TQJOD72_cjs = require('../../chunk-6TQJOD72.cjs');
4
+ require('../../chunk-D46YDM36.cjs');
5
+ require('../../chunk-7IYIFMF4.cjs');
6
+ require('../../chunk-4KXOCVXP.cjs');
7
+ require('../../chunk-MQB5H4X5.cjs');
8
8
  require('../../chunk-5BLDMQED.cjs');
9
9
 
10
10
  // src/worker/expo/taskQueue.ts
@@ -48,6 +48,7 @@ var AsyncStorageTaskQueue = class {
48
48
  this.outboxKey = `${prefix}:outbox`;
49
49
  this.configKey = `${prefix}:config`;
50
50
  }
51
+ storage;
51
52
  inboxKey;
52
53
  outboxKey;
53
54
  configKey;
@@ -120,19 +121,19 @@ var AsyncStorageTaskQueue = class {
120
121
 
121
122
  Object.defineProperty(exports, "CONTRACT_POLL_TASK_TYPE", {
122
123
  enumerable: true,
123
- get: function () { return chunkRJ6XVCX4_cjs.CONTRACT_POLL_TASK_TYPE; }
124
+ get: function () { return chunk6TQJOD72_cjs.CONTRACT_POLL_TASK_TYPE; }
124
125
  });
125
126
  Object.defineProperty(exports, "contractPollProcessor", {
126
127
  enumerable: true,
127
- get: function () { return chunkRJ6XVCX4_cjs.contractPollProcessor; }
128
+ get: function () { return chunk6TQJOD72_cjs.contractPollProcessor; }
128
129
  });
129
130
  Object.defineProperty(exports, "createTaskDependencies", {
130
131
  enumerable: true,
131
- get: function () { return chunkRJ6XVCX4_cjs.createTaskDependencies; }
132
+ get: function () { return chunk6TQJOD72_cjs.createTaskDependencies; }
132
133
  });
133
134
  Object.defineProperty(exports, "runTasks", {
134
135
  enumerable: true,
135
- get: function () { return chunkRJ6XVCX4_cjs.runTasks; }
136
+ get: function () { return chunk6TQJOD72_cjs.runTasks; }
136
137
  });
137
138
  exports.AsyncStorageTaskQueue = AsyncStorageTaskQueue;
138
139
  exports.InMemoryTaskQueue = InMemoryTaskQueue;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/worker/expo/taskQueue.ts","../../../src/worker/expo/asyncStorageTaskQueue.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A task item represents a unit of work in the inbox.\n */\nexport interface TaskItem {\n id: string;\n type: string;\n data: Record<string, unknown>;\n createdAt: number;\n}\n\n/**\n * A task result represents the outcome of processing a task item.\n */\nexport interface TaskResult {\n id: string;\n taskItemId: string;\n type: string;\n status: \"success\" | \"failed\" | \"noop\";\n data?: Record<string, unknown>;\n executedAt: number;\n}\n\n/**\n * Persistence layer for handing off work between foreground and background.\n *\n * - **Inbox**: tasks waiting to be processed.\n * - **Outbox**: results produced by processors, waiting to be consumed.\n */\nexport interface TaskQueue {\n // Inbox\n addTask(task: TaskItem): Promise<void>;\n removeTask(id: string): Promise<void>;\n getTasks(type?: string): Promise<TaskItem[]>;\n clearTasks(): Promise<void>;\n\n // Outbox\n pushResult(result: TaskResult): Promise<void>;\n getResults(): Promise<TaskResult[]>;\n acknowledgeResults(ids: string[]): Promise<void>;\n}\n\n/**\n * In-memory TaskQueue for testing and lightweight use.\n * State is lost when the process exits.\n */\nexport class InMemoryTaskQueue implements TaskQueue {\n private inbox = new Map<string, TaskItem>();\n private outbox = new Map<string, TaskResult>();\n\n async addTask(task: TaskItem): Promise<void> {\n this.inbox.set(task.id, task);\n }\n\n async removeTask(id: string): Promise<void> {\n this.inbox.delete(id);\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = Array.from(this.inbox.values());\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n this.inbox.clear();\n }\n\n async pushResult(result: TaskResult): Promise<void> {\n this.outbox.set(result.id, result);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return Array.from(this.outbox.values());\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.outbox.delete(id);\n }\n }\n}\n","import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\n\n/**\n * Minimal async key-value storage interface.\n *\n * Compatible with `@react-native-async-storage/async-storage` and\n * any other storage that exposes the same three methods.\n */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * AsyncStorage-backed TaskQueue for Expo/React Native.\n *\n * Persists inbox, outbox, and an optional config blob to AsyncStorage\n * so that data survives process restarts and can be shared between\n * foreground and background execution contexts.\n */\nexport class AsyncStorageTaskQueue implements TaskQueue {\n private readonly inboxKey: string;\n private readonly outboxKey: string;\n private readonly configKey: string;\n\n constructor(\n private readonly storage: AsyncStorageLike,\n prefix = \"ark:task-queue\",\n ) {\n this.inboxKey = `${prefix}:inbox`;\n this.outboxKey = `${prefix}:outbox`;\n this.configKey = `${prefix}:config`;\n }\n\n // ── Inbox ────────────────────────────────────────────────────────\n\n async addTask(task: TaskItem): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n tasks.push(task);\n await this.writeList(this.inboxKey, tasks);\n }\n\n async removeTask(id: string): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n await this.writeList(\n this.inboxKey,\n tasks.filter((t) => t.id !== id),\n );\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n await this.storage.removeItem(this.inboxKey);\n }\n\n // ── Outbox ───────────────────────────────────────────────────────\n\n async pushResult(result: TaskResult): Promise<void> {\n const results = await this.readList<TaskResult>(this.outboxKey);\n results.push(result);\n await this.writeList(this.outboxKey, results);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return this.readList<TaskResult>(this.outboxKey);\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n const idSet = new Set(ids);\n const results = await this.readList<TaskResult>(this.outboxKey);\n await this.writeList(\n this.outboxKey,\n results.filter((r) => !idSet.has(r.id)),\n );\n }\n\n // ── Config persistence (for background handler rehydration) ──────\n\n /**\n * Persist a config blob alongside the queue data.\n * Used by @see ExpoWallet.setup to store the wallet parameters\n * that the background handler needs to reconstruct providers.\n */\n async persistConfig(config: Record<string, unknown> | object): Promise<void> {\n await this.storage.setItem(this.configKey, JSON.stringify(config));\n }\n\n /**\n * Load the persisted config blob.\n * Used by the background handler to rehydrate wallet dependencies.\n */\n async loadConfig<T = Record<string, unknown>>(): Promise<T | null> {\n const raw = await this.storage.getItem(this.configKey);\n return raw ? JSON.parse(raw) : null;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────\n\n private async readList<T>(key: string): Promise<T[]> {\n const raw = await this.storage.getItem(key);\n return raw ? JSON.parse(raw) : [];\n }\n\n private async writeList<T>(key: string, list: T[]): Promise<void> {\n await this.storage.setItem(key, JSON.stringify(list));\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/worker/expo/taskQueue.ts","../../../src/worker/expo/asyncStorageTaskQueue.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A task item represents a unit of work in the inbox.\n */\nexport interface TaskItem {\n id: string;\n type: string;\n data: Record<string, unknown>;\n createdAt: number;\n}\n\n/**\n * A task result represents the outcome of processing a task item.\n */\nexport interface TaskResult {\n id: string;\n taskItemId: string;\n type: string;\n status: \"success\" | \"failed\" | \"noop\";\n data?: Record<string, unknown>;\n executedAt: number;\n}\n\n/**\n * Persistence layer for handing off work between foreground and background.\n *\n * - **Inbox**: tasks waiting to be processed.\n * - **Outbox**: results produced by processors, waiting to be consumed.\n */\nexport interface TaskQueue {\n // Inbox\n addTask(task: TaskItem): Promise<void>;\n removeTask(id: string): Promise<void>;\n getTasks(type?: string): Promise<TaskItem[]>;\n clearTasks(): Promise<void>;\n\n // Outbox\n pushResult(result: TaskResult): Promise<void>;\n getResults(): Promise<TaskResult[]>;\n acknowledgeResults(ids: string[]): Promise<void>;\n}\n\n/**\n * In-memory TaskQueue for testing and lightweight use.\n * State is lost when the process exits.\n */\nexport class InMemoryTaskQueue implements TaskQueue {\n private inbox = new Map<string, TaskItem>();\n private outbox = new Map<string, TaskResult>();\n\n async addTask(task: TaskItem): Promise<void> {\n this.inbox.set(task.id, task);\n }\n\n async removeTask(id: string): Promise<void> {\n this.inbox.delete(id);\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = Array.from(this.inbox.values());\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n this.inbox.clear();\n }\n\n async pushResult(result: TaskResult): Promise<void> {\n this.outbox.set(result.id, result);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return Array.from(this.outbox.values());\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.outbox.delete(id);\n }\n }\n}\n","import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\n\n/**\n * Minimal async key-value storage interface.\n *\n * Compatible with `@react-native-async-storage/async-storage` and\n * any other storage that exposes the same three methods.\n */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * AsyncStorage-backed TaskQueue for Expo/React Native.\n *\n * Persists inbox, outbox, and an optional config blob to AsyncStorage\n * so that data survives process restarts and can be shared between\n * foreground and background execution contexts.\n */\nexport class AsyncStorageTaskQueue implements TaskQueue {\n private readonly inboxKey: string;\n private readonly outboxKey: string;\n private readonly configKey: string;\n\n constructor(\n private readonly storage: AsyncStorageLike,\n prefix = \"ark:task-queue\",\n ) {\n this.inboxKey = `${prefix}:inbox`;\n this.outboxKey = `${prefix}:outbox`;\n this.configKey = `${prefix}:config`;\n }\n\n // ── Inbox ────────────────────────────────────────────────────────\n\n async addTask(task: TaskItem): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n tasks.push(task);\n await this.writeList(this.inboxKey, tasks);\n }\n\n async removeTask(id: string): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n await this.writeList(\n this.inboxKey,\n tasks.filter((t) => t.id !== id),\n );\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n await this.storage.removeItem(this.inboxKey);\n }\n\n // ── Outbox ───────────────────────────────────────────────────────\n\n async pushResult(result: TaskResult): Promise<void> {\n const results = await this.readList<TaskResult>(this.outboxKey);\n results.push(result);\n await this.writeList(this.outboxKey, results);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return this.readList<TaskResult>(this.outboxKey);\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n const idSet = new Set(ids);\n const results = await this.readList<TaskResult>(this.outboxKey);\n await this.writeList(\n this.outboxKey,\n results.filter((r) => !idSet.has(r.id)),\n );\n }\n\n // ── Config persistence (for background handler rehydration) ──────\n\n /**\n * Persist a config blob alongside the queue data.\n * Used by @see ExpoWallet.setup to store the wallet parameters\n * that the background handler needs to reconstruct providers.\n */\n async persistConfig(config: Record<string, unknown> | object): Promise<void> {\n await this.storage.setItem(this.configKey, JSON.stringify(config));\n }\n\n /**\n * Load the persisted config blob.\n * Used by the background handler to rehydrate wallet dependencies.\n */\n async loadConfig<T = Record<string, unknown>>(): Promise<T | null> {\n const raw = await this.storage.getItem(this.configKey);\n return raw ? JSON.parse(raw) : null;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────\n\n private async readList<T>(key: string): Promise<T[]> {\n const raw = await this.storage.getItem(key);\n return raw ? JSON.parse(raw) : [];\n }\n\n private async writeList<T>(key: string, list: T[]): Promise<void> {\n await this.storage.setItem(key, JSON.stringify(list));\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { T as TaskProcessor } from '../../taskRunner-CeFxKhSH.cjs';
2
- export { C as CreateTaskDependenciesOptions, I as InMemoryTaskQueue, a as TaskDependencies, b as TaskItem, c as TaskQueue, d as TaskResult, e as createTaskDependencies, r as runTasks } from '../../taskRunner-CeFxKhSH.cjs';
3
- export { A as AsyncStorageLike, a as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-Dap7qUlF.cjs';
4
- import '../../ark-I8jfe5VE.cjs';
1
+ import { T as TaskProcessor } from '../../taskRunner-nNecmQ2C.cjs';
2
+ export { C as CreateTaskDependenciesOptions, I as InMemoryTaskQueue, b as TaskDependencies, c as TaskItem, a as TaskQueue, d as TaskResult, e as createTaskDependencies, r as runTasks } from '../../taskRunner-nNecmQ2C.cjs';
3
+ export { a as AsyncStorageLike, A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-CmBYVlxw.cjs';
4
+ import '../../ark-C9ognsOV.cjs';
5
5
  import '@scure/btc-signer/transaction.js';
6
6
  import '@scure/btc-signer/utils.js';
7
7
  import '@scure/btc-signer/psbt.js';
@@ -1,7 +1,7 @@
1
- import { T as TaskProcessor } from '../../taskRunner-Bptw9UMa.js';
2
- export { C as CreateTaskDependenciesOptions, I as InMemoryTaskQueue, a as TaskDependencies, b as TaskItem, c as TaskQueue, d as TaskResult, e as createTaskDependencies, r as runTasks } from '../../taskRunner-Bptw9UMa.js';
3
- export { A as AsyncStorageLike, a as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-BtSOVZFn.js';
4
- import '../../ark-I8jfe5VE.js';
1
+ import { T as TaskProcessor } from '../../taskRunner-B48-V-Pb.js';
2
+ export { C as CreateTaskDependenciesOptions, I as InMemoryTaskQueue, b as TaskDependencies, c as TaskItem, a as TaskQueue, d as TaskResult, e as createTaskDependencies, r as runTasks } from '../../taskRunner-B48-V-Pb.js';
3
+ export { a as AsyncStorageLike, A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-BAKZ5cS5.js';
4
+ import '../../ark-C9ognsOV.js';
5
5
  import '@scure/btc-signer/transaction.js';
6
6
  import '@scure/btc-signer/utils.js';
7
7
  import '@scure/btc-signer/psbt.js';
@@ -1,8 +1,8 @@
1
- export { CONTRACT_POLL_TASK_TYPE, contractPollProcessor, createTaskDependencies, runTasks } from '../../chunk-LCQQPOIT.js';
2
- import '../../chunk-FMI2GKYO.js';
3
- import '../../chunk-LJ35HPJW.js';
4
- import '../../chunk-YNEDJTX2.js';
5
- import '../../chunk-BE5MUB7T.js';
1
+ export { CONTRACT_POLL_TASK_TYPE, contractPollProcessor, createTaskDependencies, runTasks } from '../../chunk-R2SVAM5Q.js';
2
+ import '../../chunk-P6VBP3CT.js';
3
+ import '../../chunk-CWJ7ZCP7.js';
4
+ import '../../chunk-QKC2T54O.js';
5
+ import '../../chunk-FWG4TSPN.js';
6
6
  import '../../chunk-NSBPE2FW.js';
7
7
 
8
8
  // src/worker/expo/taskQueue.ts
@@ -46,6 +46,7 @@ var AsyncStorageTaskQueue = class {
46
46
  this.outboxKey = `${prefix}:outbox`;
47
47
  this.configKey = `${prefix}:config`;
48
48
  }
49
+ storage;
49
50
  inboxKey;
50
51
  outboxKey;
51
52
  configKey;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/worker/expo/taskQueue.ts","../../../src/worker/expo/asyncStorageTaskQueue.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * A task item represents a unit of work in the inbox.\n */\nexport interface TaskItem {\n id: string;\n type: string;\n data: Record<string, unknown>;\n createdAt: number;\n}\n\n/**\n * A task result represents the outcome of processing a task item.\n */\nexport interface TaskResult {\n id: string;\n taskItemId: string;\n type: string;\n status: \"success\" | \"failed\" | \"noop\";\n data?: Record<string, unknown>;\n executedAt: number;\n}\n\n/**\n * Persistence layer for handing off work between foreground and background.\n *\n * - **Inbox**: tasks waiting to be processed.\n * - **Outbox**: results produced by processors, waiting to be consumed.\n */\nexport interface TaskQueue {\n // Inbox\n addTask(task: TaskItem): Promise<void>;\n removeTask(id: string): Promise<void>;\n getTasks(type?: string): Promise<TaskItem[]>;\n clearTasks(): Promise<void>;\n\n // Outbox\n pushResult(result: TaskResult): Promise<void>;\n getResults(): Promise<TaskResult[]>;\n acknowledgeResults(ids: string[]): Promise<void>;\n}\n\n/**\n * In-memory TaskQueue for testing and lightweight use.\n * State is lost when the process exits.\n */\nexport class InMemoryTaskQueue implements TaskQueue {\n private inbox = new Map<string, TaskItem>();\n private outbox = new Map<string, TaskResult>();\n\n async addTask(task: TaskItem): Promise<void> {\n this.inbox.set(task.id, task);\n }\n\n async removeTask(id: string): Promise<void> {\n this.inbox.delete(id);\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = Array.from(this.inbox.values());\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n this.inbox.clear();\n }\n\n async pushResult(result: TaskResult): Promise<void> {\n this.outbox.set(result.id, result);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return Array.from(this.outbox.values());\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.outbox.delete(id);\n }\n }\n}\n","import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\n\n/**\n * Minimal async key-value storage interface.\n *\n * Compatible with `@react-native-async-storage/async-storage` and\n * any other storage that exposes the same three methods.\n */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * AsyncStorage-backed TaskQueue for Expo/React Native.\n *\n * Persists inbox, outbox, and an optional config blob to AsyncStorage\n * so that data survives process restarts and can be shared between\n * foreground and background execution contexts.\n */\nexport class AsyncStorageTaskQueue implements TaskQueue {\n private readonly inboxKey: string;\n private readonly outboxKey: string;\n private readonly configKey: string;\n\n constructor(\n private readonly storage: AsyncStorageLike,\n prefix = \"ark:task-queue\",\n ) {\n this.inboxKey = `${prefix}:inbox`;\n this.outboxKey = `${prefix}:outbox`;\n this.configKey = `${prefix}:config`;\n }\n\n // ── Inbox ────────────────────────────────────────────────────────\n\n async addTask(task: TaskItem): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n tasks.push(task);\n await this.writeList(this.inboxKey, tasks);\n }\n\n async removeTask(id: string): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n await this.writeList(\n this.inboxKey,\n tasks.filter((t) => t.id !== id),\n );\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n await this.storage.removeItem(this.inboxKey);\n }\n\n // ── Outbox ───────────────────────────────────────────────────────\n\n async pushResult(result: TaskResult): Promise<void> {\n const results = await this.readList<TaskResult>(this.outboxKey);\n results.push(result);\n await this.writeList(this.outboxKey, results);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return this.readList<TaskResult>(this.outboxKey);\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n const idSet = new Set(ids);\n const results = await this.readList<TaskResult>(this.outboxKey);\n await this.writeList(\n this.outboxKey,\n results.filter((r) => !idSet.has(r.id)),\n );\n }\n\n // ── Config persistence (for background handler rehydration) ──────\n\n /**\n * Persist a config blob alongside the queue data.\n * Used by @see ExpoWallet.setup to store the wallet parameters\n * that the background handler needs to reconstruct providers.\n */\n async persistConfig(config: Record<string, unknown> | object): Promise<void> {\n await this.storage.setItem(this.configKey, JSON.stringify(config));\n }\n\n /**\n * Load the persisted config blob.\n * Used by the background handler to rehydrate wallet dependencies.\n */\n async loadConfig<T = Record<string, unknown>>(): Promise<T | null> {\n const raw = await this.storage.getItem(this.configKey);\n return raw ? JSON.parse(raw) : null;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────\n\n private async readList<T>(key: string): Promise<T[]> {\n const raw = await this.storage.getItem(key);\n return raw ? JSON.parse(raw) : [];\n }\n\n private async writeList<T>(key: string, list: T[]): Promise<void> {\n await this.storage.setItem(key, JSON.stringify(list));\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/worker/expo/taskQueue.ts","../../../src/worker/expo/asyncStorageTaskQueue.ts"],"names":[],"mappings":";;;;;;;;AA6CO,IAAM,oBAAN,MAA6C;AAAA,EACxC,KAAA,uBAAY,GAAA,EAAsB;AAAA,EAClC,MAAA,uBAAa,GAAA,EAAwB;AAAA,EAE7C,MAAM,QAAQ,IAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,EAAA,EAA2B;AACxC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,SAAS,IAAA,EAAoC;AAC/C,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC5C,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,UAAA,GAA4B;AAC9B,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAM,WAAW,MAAA,EAAmC;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,UAAA,GAAoC;AACtC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,mBAAmB,GAAA,EAA8B;AACnD,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,IACzB;AAAA,EACJ;AACJ;;;AC7DO,IAAM,wBAAN,MAAiD;AAAA,EAKpD,WAAA,CACqB,OAAA,EACjB,MAAA,GAAS,gBAAA,EACX;AAFmB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGjB,IAAA,IAAA,CAAK,QAAA,GAAW,GAAG,MAAM,CAAA,MAAA,CAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,GAAG,MAAM,CAAA,OAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,GAAG,MAAM,CAAA,OAAA,CAAA;AAAA,EAC9B;AAAA,EANqB,OAAA;AAAA,EALJ,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAajB,MAAM,QAAQ,IAAA,EAA+B;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAmB,KAAK,QAAQ,CAAA;AACzD,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,WAAW,EAAA,EAA2B;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAmB,KAAK,QAAQ,CAAA;AACzD,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACP,IAAA,CAAK,QAAA;AAAA,MACL,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE;AAAA,KACnC;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS,IAAA,EAAoC;AAC/C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAmB,KAAK,QAAQ,CAAA;AACzD,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,UAAA,GAA4B;AAC9B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA,EAIA,MAAM,WAAW,MAAA,EAAmC;AAChD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAqB,KAAK,SAAS,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,UAAA,GAAoC;AACtC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAqB,IAAA,CAAK,SAAS,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,mBAAmB,GAAA,EAA8B;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAqB,KAAK,SAAS,CAAA;AAC9D,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACP,IAAA,CAAK,SAAA;AAAA,MACL,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC;AAAA,KAC1C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,MAAA,EAAyD;AACzE,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA6D;AAC/D,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,SAAS,CAAA;AACrD,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACnC;AAAA;AAAA,EAIA,MAAc,SAAY,GAAA,EAA2B;AACjD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC1C,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,IAAI,EAAC;AAAA,EACpC;AAAA,EAEA,MAAc,SAAA,CAAa,GAAA,EAAa,IAAA,EAA0B;AAC9D,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EACxD;AACJ","file":"index.js","sourcesContent":["/**\n * A task item represents a unit of work in the inbox.\n */\nexport interface TaskItem {\n id: string;\n type: string;\n data: Record<string, unknown>;\n createdAt: number;\n}\n\n/**\n * A task result represents the outcome of processing a task item.\n */\nexport interface TaskResult {\n id: string;\n taskItemId: string;\n type: string;\n status: \"success\" | \"failed\" | \"noop\";\n data?: Record<string, unknown>;\n executedAt: number;\n}\n\n/**\n * Persistence layer for handing off work between foreground and background.\n *\n * - **Inbox**: tasks waiting to be processed.\n * - **Outbox**: results produced by processors, waiting to be consumed.\n */\nexport interface TaskQueue {\n // Inbox\n addTask(task: TaskItem): Promise<void>;\n removeTask(id: string): Promise<void>;\n getTasks(type?: string): Promise<TaskItem[]>;\n clearTasks(): Promise<void>;\n\n // Outbox\n pushResult(result: TaskResult): Promise<void>;\n getResults(): Promise<TaskResult[]>;\n acknowledgeResults(ids: string[]): Promise<void>;\n}\n\n/**\n * In-memory TaskQueue for testing and lightweight use.\n * State is lost when the process exits.\n */\nexport class InMemoryTaskQueue implements TaskQueue {\n private inbox = new Map<string, TaskItem>();\n private outbox = new Map<string, TaskResult>();\n\n async addTask(task: TaskItem): Promise<void> {\n this.inbox.set(task.id, task);\n }\n\n async removeTask(id: string): Promise<void> {\n this.inbox.delete(id);\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = Array.from(this.inbox.values());\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n this.inbox.clear();\n }\n\n async pushResult(result: TaskResult): Promise<void> {\n this.outbox.set(result.id, result);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return Array.from(this.outbox.values());\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.outbox.delete(id);\n }\n }\n}\n","import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\n\n/**\n * Minimal async key-value storage interface.\n *\n * Compatible with `@react-native-async-storage/async-storage` and\n * any other storage that exposes the same three methods.\n */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * AsyncStorage-backed TaskQueue for Expo/React Native.\n *\n * Persists inbox, outbox, and an optional config blob to AsyncStorage\n * so that data survives process restarts and can be shared between\n * foreground and background execution contexts.\n */\nexport class AsyncStorageTaskQueue implements TaskQueue {\n private readonly inboxKey: string;\n private readonly outboxKey: string;\n private readonly configKey: string;\n\n constructor(\n private readonly storage: AsyncStorageLike,\n prefix = \"ark:task-queue\",\n ) {\n this.inboxKey = `${prefix}:inbox`;\n this.outboxKey = `${prefix}:outbox`;\n this.configKey = `${prefix}:config`;\n }\n\n // ── Inbox ────────────────────────────────────────────────────────\n\n async addTask(task: TaskItem): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n tasks.push(task);\n await this.writeList(this.inboxKey, tasks);\n }\n\n async removeTask(id: string): Promise<void> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n await this.writeList(\n this.inboxKey,\n tasks.filter((t) => t.id !== id),\n );\n }\n\n async getTasks(type?: string): Promise<TaskItem[]> {\n const tasks = await this.readList<TaskItem>(this.inboxKey);\n if (type) {\n return tasks.filter((t) => t.type === type);\n }\n return tasks;\n }\n\n async clearTasks(): Promise<void> {\n await this.storage.removeItem(this.inboxKey);\n }\n\n // ── Outbox ───────────────────────────────────────────────────────\n\n async pushResult(result: TaskResult): Promise<void> {\n const results = await this.readList<TaskResult>(this.outboxKey);\n results.push(result);\n await this.writeList(this.outboxKey, results);\n }\n\n async getResults(): Promise<TaskResult[]> {\n return this.readList<TaskResult>(this.outboxKey);\n }\n\n async acknowledgeResults(ids: string[]): Promise<void> {\n const idSet = new Set(ids);\n const results = await this.readList<TaskResult>(this.outboxKey);\n await this.writeList(\n this.outboxKey,\n results.filter((r) => !idSet.has(r.id)),\n );\n }\n\n // ── Config persistence (for background handler rehydration) ──────\n\n /**\n * Persist a config blob alongside the queue data.\n * Used by @see ExpoWallet.setup to store the wallet parameters\n * that the background handler needs to reconstruct providers.\n */\n async persistConfig(config: Record<string, unknown> | object): Promise<void> {\n await this.storage.setItem(this.configKey, JSON.stringify(config));\n }\n\n /**\n * Load the persisted config blob.\n * Used by the background handler to rehydrate wallet dependencies.\n */\n async loadConfig<T = Record<string, unknown>>(): Promise<T | null> {\n const raw = await this.storage.getItem(this.configKey);\n return raw ? JSON.parse(raw) : null;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────\n\n private async readList<T>(key: string): Promise<T[]> {\n const raw = await this.storage.getItem(key);\n return raw ? JSON.parse(raw) : [];\n }\n\n private async writeList<T>(key: string, list: T[]): Promise<void> {\n await this.storage.setItem(key, JSON.stringify(list));\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkade-os/sdk",
3
- "version": "0.4.44",
3
+ "version": "0.4.46",
4
4
  "description": "TypeScript SDK for building Bitcoin wallets using the Arkade protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -149,7 +149,7 @@
149
149
  },
150
150
  "devDependencies": {
151
151
  "@types/better-sqlite3": "7.6.13",
152
- "@vitest/coverage-v8": "3.2.4",
152
+ "@vitest/coverage-v8": "3.2.7",
153
153
  "better-sqlite3": "12.6.2",
154
154
  "typedoc": "^0.28.19"
155
155
  },