@arkade-os/sdk 0.4.19 → 0.4.21

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 (61) hide show
  1. package/dist/cjs/contracts/contractWatcher.js +33 -3
  2. package/dist/cjs/contracts/handlers/default.js +10 -3
  3. package/dist/cjs/contracts/handlers/helpers.js +47 -5
  4. package/dist/cjs/contracts/handlers/vhtlc.js +4 -2
  5. package/dist/cjs/identity/descriptor.js +98 -0
  6. package/dist/cjs/identity/descriptorProvider.js +2 -0
  7. package/dist/cjs/identity/index.js +15 -1
  8. package/dist/cjs/identity/seedIdentity.js +91 -6
  9. package/dist/cjs/identity/serialize.js +166 -0
  10. package/dist/cjs/identity/staticDescriptorProvider.js +65 -0
  11. package/dist/cjs/index.js +6 -3
  12. package/dist/cjs/providers/ark.js +71 -46
  13. package/dist/cjs/providers/electrum.js +663 -0
  14. package/dist/cjs/providers/indexer.js +60 -43
  15. package/dist/cjs/providers/utils.js +62 -12
  16. package/dist/cjs/wallet/ramps.js +1 -1
  17. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +10 -0
  18. package/dist/cjs/wallet/serviceWorker/wallet.js +137 -91
  19. package/dist/cjs/wallet/vtxo-manager.js +56 -8
  20. package/dist/cjs/wallet/wallet.js +130 -156
  21. package/dist/cjs/worker/messageBus.js +200 -56
  22. package/dist/esm/contracts/contractWatcher.js +33 -3
  23. package/dist/esm/contracts/handlers/default.js +10 -3
  24. package/dist/esm/contracts/handlers/helpers.js +47 -5
  25. package/dist/esm/contracts/handlers/vhtlc.js +4 -2
  26. package/dist/esm/identity/descriptor.js +92 -0
  27. package/dist/esm/identity/descriptorProvider.js +1 -0
  28. package/dist/esm/identity/index.js +6 -1
  29. package/dist/esm/identity/seedIdentity.js +89 -6
  30. package/dist/esm/identity/serialize.js +159 -0
  31. package/dist/esm/identity/staticDescriptorProvider.js +61 -0
  32. package/dist/esm/index.js +2 -1
  33. package/dist/esm/providers/ark.js +72 -47
  34. package/dist/esm/providers/electrum.js +658 -0
  35. package/dist/esm/providers/indexer.js +61 -44
  36. package/dist/esm/providers/utils.js +61 -12
  37. package/dist/esm/wallet/ramps.js +1 -1
  38. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +10 -0
  39. package/dist/esm/wallet/serviceWorker/wallet.js +137 -91
  40. package/dist/esm/wallet/vtxo-manager.js +56 -8
  41. package/dist/esm/wallet/wallet.js +130 -156
  42. package/dist/esm/worker/messageBus.js +201 -57
  43. package/dist/types/contracts/contractWatcher.d.ts +3 -0
  44. package/dist/types/contracts/handlers/default.d.ts +1 -1
  45. package/dist/types/contracts/handlers/helpers.d.ts +1 -1
  46. package/dist/types/contracts/types.d.ts +11 -3
  47. package/dist/types/identity/descriptor.d.ts +35 -0
  48. package/dist/types/identity/descriptorProvider.d.ts +28 -0
  49. package/dist/types/identity/index.d.ts +7 -1
  50. package/dist/types/identity/seedIdentity.d.ts +41 -4
  51. package/dist/types/identity/serialize.d.ts +84 -0
  52. package/dist/types/identity/staticDescriptorProvider.d.ts +18 -0
  53. package/dist/types/index.d.ts +4 -2
  54. package/dist/types/providers/electrum.d.ts +212 -0
  55. package/dist/types/providers/utils.d.ts +10 -5
  56. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +11 -2
  57. package/dist/types/wallet/serviceWorker/wallet.d.ts +27 -10
  58. package/dist/types/wallet/vtxo-manager.d.ts +2 -0
  59. package/dist/types/wallet/wallet.d.ts +7 -6
  60. package/dist/types/worker/messageBus.d.ts +68 -8
  61. package/package.json +3 -2
@@ -1,4 +1,5 @@
1
1
  import { ArkProvider } from "../providers/ark";
2
+ import { type SerializedIdentity, type LegacySerializedIdentity } from "../identity";
2
3
  import { ReadonlyWallet, Wallet } from "../wallet/wallet";
3
4
  import type { SettlementConfig } from "../wallet/vtxo-manager";
4
5
  import type { ContractWatcherConfig } from "../contracts/contractWatcher";
@@ -45,11 +46,29 @@ export interface MessageHandler<REQ extends RequestEnvelope = RequestEnvelope, R
45
46
  * Handle routed messages from the clients
46
47
  **/
47
48
  handleMessage(message: REQ): Promise<RES | null>;
49
+ /**
50
+ * Optional opt-out from the bus-level message timeout.
51
+ *
52
+ * Long-running flows (e.g. settlement) surrender control to remote peers
53
+ * and can legitimately sit idle for longer than `messageTimeoutMs`. When
54
+ * this returns true, the bus awaits `handleMessage` without a deadline.
55
+ * Defaults to false.
56
+ */
57
+ isLongRunning?(message: REQ): boolean;
48
58
  }
49
59
  type Options = {
50
60
  messageHandlers: MessageHandler[];
51
61
  tickIntervalMs?: number;
52
62
  messageTimeoutMs?: number;
63
+ /**
64
+ * Per-operation timeout overrides. Keys are either message types
65
+ * (e.g. "SETTLE") or handler tags (e.g. "WALLET_UPDATER"). Message-type
66
+ * matches take precedence over tag matches. Unspecified operations use
67
+ * `messageTimeoutMs`. These are treated as defaults: any map supplied
68
+ * via `INITIALIZE_MESSAGE_BUS` overrides per-key and is re-applied on
69
+ * every (re-)init.
70
+ */
71
+ messageTimeoutOverrides?: Record<string, number>;
53
72
  debug?: boolean;
54
73
  buildServices?: (config: Initialize["config"]) => Promise<{
55
74
  arkProvider: ArkProvider;
@@ -61,11 +80,7 @@ type Initialize = {
61
80
  type: "INITIALIZE_MESSAGE_BUS";
62
81
  id: string;
63
82
  config: {
64
- wallet: {
65
- privateKey: string;
66
- } | {
67
- publicKey: string;
68
- };
83
+ wallet: SerializedIdentity | LegacySerializedIdentity;
69
84
  arkServer: {
70
85
  url: string;
71
86
  publicKey?: string;
@@ -75,6 +90,12 @@ type Initialize = {
75
90
  esploraUrl?: string;
76
91
  settlementConfig?: SettlementConfig | false;
77
92
  watcherConfig?: Partial<Omit<ContractWatcherConfig, "indexerProvider">>;
93
+ /**
94
+ * Page-supplied per-operation timeout map. Keys are message types
95
+ * (e.g. "SETTLE"). Overrides constructor-supplied
96
+ * `messageTimeoutOverrides` per-key; re-applied on every init.
97
+ */
98
+ messageTimeouts?: Record<string, number>;
78
99
  };
79
100
  };
80
101
  export declare class MessageBus {
@@ -83,6 +104,9 @@ export declare class MessageBus {
83
104
  private handlers;
84
105
  private tickIntervalMs;
85
106
  private messageTimeoutMs;
107
+ private readonly constructorTimeoutOverrides;
108
+ private messageTimeoutOverrides;
109
+ private lateDeliveries;
86
110
  private running;
87
111
  private tickTimeout;
88
112
  private tickInProgress;
@@ -91,7 +115,7 @@ export declare class MessageBus {
91
115
  private readonly buildServicesFn;
92
116
  private readonly boundOnMessage;
93
117
  /** Create the service-worker message bus with repositories and handler configuration. */
94
- constructor(walletRepository: WalletRepository, contractRepository: ContractRepository, { messageHandlers, tickIntervalMs, messageTimeoutMs, debug, buildServices, }: Options);
118
+ constructor(walletRepository: WalletRepository, contractRepository: ContractRepository, { messageHandlers, tickIntervalMs, messageTimeoutMs, messageTimeoutOverrides, debug, buildServices, }: Options);
95
119
  /** Start the message bus and attach service-worker event listeners. */
96
120
  start(): Promise<void>;
97
121
  /** Stop the message bus, cancel ticks, and stop all registered handlers. */
@@ -104,10 +128,46 @@ export declare class MessageBus {
104
128
  private processMessage;
105
129
  /**
106
130
  * Race `promise` against a timeout. Note: this does NOT cancel the
107
- * underlying work — the original promise keeps running. This is safe
108
- * here because only the caller (not the handler) posts the response.
131
+ * underlying work — the original promise keeps running. Call
132
+ * `attachLateDelivery` after catching the timeout to surface the
133
+ * eventual result so the message id does not go silent.
109
134
  */
110
135
  private withTimeout;
136
+ /**
137
+ * Extract the declared `type` from a request envelope (e.g. "SETTLE").
138
+ * Not every envelope carries a type (PING/INIT are special cased
139
+ * earlier), so this returns undefined for envelopes that lack one.
140
+ */
141
+ private extractMessageType;
142
+ /**
143
+ * Resolve the timeout for an operation. Message-type overrides take
144
+ * precedence over handler-tag overrides, with the bus-wide default
145
+ * (`messageTimeoutMs`) as the final fallback.
146
+ */
147
+ private resolveTimeoutMs;
148
+ /**
149
+ * Build a human-readable label for timeout errors. Format:
150
+ * `"<MESSAGE_TYPE> via <HANDLER_TAG>"` when both are known, else the
151
+ * handler tag alone. Used so timeout errors name the operation the
152
+ * client actually triggered (e.g. SETTLE) rather than just the
153
+ * handler that received it (e.g. WALLET_UPDATER).
154
+ */
155
+ private labelFor;
156
+ /**
157
+ * Post a response to the originating client. When `source` is null
158
+ * (client tab closed, detached frame, etc.) the response cannot be
159
+ * delivered; we log the drop in debug mode so it is not invisible.
160
+ */
161
+ private deliverResponse;
162
+ /**
163
+ * After a handler times out the client has already received a timeout
164
+ * error, but the handler keeps running. Attach a follow-up so the
165
+ * handler's eventual result (or error) is delivered under the same
166
+ * message id, or — if the handler never completes within
167
+ * {@link LATE_DELIVERY_GRACE_MS} — an "Operation abandoned" error is
168
+ * sent so the client's listener (if still attached) does not hang.
169
+ */
170
+ private attachLateDelivery;
111
171
  /**
112
172
  * Returns the registered SW for the path.
113
173
  * It uses the functions in `service-worker-manager.ts` module.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkade-os/sdk",
3
- "version": "0.4.19",
3
+ "version": "0.4.21",
4
4
  "description": "TypeScript SDK for building Bitcoin wallets using the Arkade protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -87,7 +87,8 @@
87
87
  "@scure/base": "2.0.0",
88
88
  "@scure/bip39": "2.0.1",
89
89
  "@scure/btc-signer": "2.0.1",
90
- "bip68": "1.0.4"
90
+ "bip68": "1.0.4",
91
+ "ws-electrumx-client": "1.0.5"
91
92
  },
92
93
  "devDependencies": {
93
94
  "@types/better-sqlite3": "7.6.13",