@arkade-os/sdk 0.3.13 → 0.4.0-next.1

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 (270) hide show
  1. package/README.md +586 -54
  2. package/dist/cjs/asset/assetGroup.js +141 -0
  3. package/dist/cjs/asset/assetId.js +88 -0
  4. package/dist/cjs/asset/assetInput.js +204 -0
  5. package/dist/cjs/asset/assetOutput.js +159 -0
  6. package/dist/cjs/asset/assetRef.js +82 -0
  7. package/dist/cjs/asset/index.js +24 -0
  8. package/dist/cjs/asset/metadata.js +172 -0
  9. package/dist/cjs/asset/packet.js +164 -0
  10. package/dist/cjs/asset/types.js +25 -0
  11. package/dist/cjs/asset/utils.js +105 -0
  12. package/dist/cjs/bip322/index.js +270 -0
  13. package/dist/cjs/contracts/arkcontract.js +148 -0
  14. package/dist/cjs/contracts/contractManager.js +436 -0
  15. package/dist/cjs/contracts/contractWatcher.js +567 -0
  16. package/dist/cjs/contracts/handlers/default.js +85 -0
  17. package/dist/cjs/contracts/handlers/delegate.js +89 -0
  18. package/dist/cjs/contracts/handlers/helpers.js +105 -0
  19. package/dist/cjs/contracts/handlers/index.js +19 -0
  20. package/dist/cjs/contracts/handlers/registry.js +89 -0
  21. package/dist/cjs/contracts/handlers/vhtlc.js +193 -0
  22. package/dist/cjs/contracts/index.js +41 -0
  23. package/dist/cjs/contracts/types.js +2 -0
  24. package/dist/cjs/forfeit.js +12 -8
  25. package/dist/cjs/identity/index.js +1 -0
  26. package/dist/cjs/identity/seedIdentity.js +255 -0
  27. package/dist/cjs/index.js +72 -14
  28. package/dist/cjs/intent/index.js +47 -11
  29. package/dist/cjs/providers/ark.js +7 -0
  30. package/dist/cjs/providers/delegator.js +66 -0
  31. package/dist/cjs/providers/expoIndexer.js +5 -0
  32. package/dist/cjs/providers/indexer.js +68 -1
  33. package/dist/cjs/providers/utils.js +1 -0
  34. package/dist/cjs/repositories/contractRepository.js +0 -103
  35. package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
  36. package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
  37. package/dist/cjs/repositories/index.js +16 -0
  38. package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
  39. package/dist/cjs/repositories/indexedDB/db.js +19 -0
  40. package/dist/cjs/repositories/indexedDB/manager.js +97 -0
  41. package/dist/cjs/repositories/indexedDB/schema.js +159 -0
  42. package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
  43. package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
  44. package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
  45. package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
  46. package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
  47. package/dist/cjs/repositories/realm/contractRepository.js +120 -0
  48. package/dist/cjs/repositories/realm/index.js +9 -0
  49. package/dist/cjs/repositories/realm/schemas.js +108 -0
  50. package/dist/cjs/repositories/realm/types.js +7 -0
  51. package/dist/cjs/repositories/realm/walletRepository.js +273 -0
  52. package/dist/cjs/repositories/serialization.js +49 -0
  53. package/dist/cjs/repositories/sqlite/contractRepository.js +139 -0
  54. package/dist/cjs/repositories/sqlite/index.js +7 -0
  55. package/dist/cjs/repositories/sqlite/types.js +2 -0
  56. package/dist/cjs/repositories/sqlite/walletRepository.js +328 -0
  57. package/dist/cjs/repositories/walletRepository.js +0 -169
  58. package/dist/cjs/script/base.js +54 -0
  59. package/dist/cjs/script/delegate.js +49 -0
  60. package/dist/cjs/storage/asyncStorage.js +4 -1
  61. package/dist/cjs/storage/fileSystem.js +3 -0
  62. package/dist/cjs/storage/inMemory.js +3 -0
  63. package/dist/cjs/storage/indexedDB.js +5 -1
  64. package/dist/cjs/storage/localStorage.js +3 -0
  65. package/dist/cjs/utils/arkTransaction.js +16 -0
  66. package/dist/cjs/utils/transactionHistory.js +50 -0
  67. package/dist/cjs/wallet/asset-manager.js +338 -0
  68. package/dist/cjs/wallet/asset.js +117 -0
  69. package/dist/cjs/wallet/batch.js +1 -1
  70. package/dist/cjs/wallet/delegator.js +235 -0
  71. package/dist/cjs/wallet/expo/background.js +133 -0
  72. package/dist/cjs/wallet/expo/index.js +9 -0
  73. package/dist/cjs/wallet/expo/wallet.js +231 -0
  74. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
  75. package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
  76. package/dist/cjs/wallet/utils.js +58 -0
  77. package/dist/cjs/wallet/validation.js +151 -0
  78. package/dist/cjs/wallet/vtxo-manager.js +8 -1
  79. package/dist/cjs/wallet/wallet.js +702 -260
  80. package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
  81. package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  82. package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
  83. package/dist/cjs/worker/expo/index.js +12 -0
  84. package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
  85. package/dist/cjs/worker/expo/processors/index.js +6 -0
  86. package/dist/cjs/worker/expo/taskQueue.js +41 -0
  87. package/dist/cjs/worker/expo/taskRunner.js +57 -0
  88. package/dist/cjs/worker/messageBus.js +252 -0
  89. package/dist/esm/asset/assetGroup.js +137 -0
  90. package/dist/esm/asset/assetId.js +84 -0
  91. package/dist/esm/asset/assetInput.js +199 -0
  92. package/dist/esm/asset/assetOutput.js +154 -0
  93. package/dist/esm/asset/assetRef.js +78 -0
  94. package/dist/esm/asset/index.js +8 -0
  95. package/dist/esm/asset/metadata.js +167 -0
  96. package/dist/esm/asset/packet.js +159 -0
  97. package/dist/esm/asset/types.js +22 -0
  98. package/dist/esm/asset/utils.js +99 -0
  99. package/dist/esm/bip322/index.js +267 -0
  100. package/dist/esm/contracts/arkcontract.js +141 -0
  101. package/dist/esm/contracts/contractManager.js +432 -0
  102. package/dist/esm/contracts/contractWatcher.js +563 -0
  103. package/dist/esm/contracts/handlers/default.js +82 -0
  104. package/dist/esm/contracts/handlers/delegate.js +86 -0
  105. package/dist/esm/contracts/handlers/helpers.js +66 -0
  106. package/dist/esm/contracts/handlers/index.js +12 -0
  107. package/dist/esm/contracts/handlers/registry.js +86 -0
  108. package/dist/esm/contracts/handlers/vhtlc.js +190 -0
  109. package/dist/esm/contracts/index.js +13 -0
  110. package/dist/esm/contracts/types.js +1 -0
  111. package/dist/esm/forfeit.js +11 -8
  112. package/dist/esm/identity/index.js +1 -0
  113. package/dist/esm/identity/seedIdentity.js +249 -0
  114. package/dist/esm/index.js +28 -15
  115. package/dist/esm/intent/index.js +44 -9
  116. package/dist/esm/providers/ark.js +7 -0
  117. package/dist/esm/providers/delegator.js +62 -0
  118. package/dist/esm/providers/expoIndexer.js +5 -0
  119. package/dist/esm/providers/indexer.js +68 -1
  120. package/dist/esm/providers/utils.js +1 -0
  121. package/dist/esm/repositories/contractRepository.js +1 -101
  122. package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
  123. package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
  124. package/dist/esm/repositories/index.js +8 -0
  125. package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
  126. package/dist/esm/repositories/indexedDB/db.js +4 -0
  127. package/dist/esm/repositories/indexedDB/manager.js +92 -0
  128. package/dist/esm/repositories/indexedDB/schema.js +155 -0
  129. package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
  130. package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
  131. package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
  132. package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
  133. package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
  134. package/dist/esm/repositories/realm/contractRepository.js +116 -0
  135. package/dist/esm/repositories/realm/index.js +3 -0
  136. package/dist/esm/repositories/realm/schemas.js +105 -0
  137. package/dist/esm/repositories/realm/types.js +6 -0
  138. package/dist/esm/repositories/realm/walletRepository.js +269 -0
  139. package/dist/esm/repositories/serialization.js +40 -0
  140. package/dist/esm/repositories/sqlite/contractRepository.js +135 -0
  141. package/dist/esm/repositories/sqlite/index.js +2 -0
  142. package/dist/esm/repositories/sqlite/types.js +1 -0
  143. package/dist/esm/repositories/sqlite/walletRepository.js +324 -0
  144. package/dist/esm/repositories/walletRepository.js +1 -167
  145. package/dist/esm/script/base.js +21 -1
  146. package/dist/esm/script/delegate.js +46 -0
  147. package/dist/esm/storage/asyncStorage.js +4 -1
  148. package/dist/esm/storage/fileSystem.js +3 -0
  149. package/dist/esm/storage/inMemory.js +3 -0
  150. package/dist/esm/storage/indexedDB.js +5 -1
  151. package/dist/esm/storage/localStorage.js +3 -0
  152. package/dist/esm/utils/arkTransaction.js +15 -0
  153. package/dist/esm/utils/transactionHistory.js +50 -0
  154. package/dist/esm/wallet/asset-manager.js +333 -0
  155. package/dist/esm/wallet/asset.js +111 -0
  156. package/dist/esm/wallet/batch.js +1 -1
  157. package/dist/esm/wallet/delegator.js +231 -0
  158. package/dist/esm/wallet/expo/background.js +128 -0
  159. package/dist/esm/wallet/expo/index.js +2 -0
  160. package/dist/esm/wallet/expo/wallet.js +194 -0
  161. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
  162. package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
  163. package/dist/esm/wallet/utils.js +54 -0
  164. package/dist/esm/wallet/validation.js +139 -0
  165. package/dist/esm/wallet/vtxo-manager.js +8 -1
  166. package/dist/esm/wallet/wallet.js +704 -229
  167. package/dist/esm/worker/browser/service-worker-manager.js +76 -0
  168. package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  169. package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
  170. package/dist/esm/worker/expo/index.js +4 -0
  171. package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
  172. package/dist/esm/worker/expo/processors/index.js +1 -0
  173. package/dist/esm/worker/expo/taskQueue.js +37 -0
  174. package/dist/esm/worker/expo/taskRunner.js +54 -0
  175. package/dist/esm/worker/messageBus.js +248 -0
  176. package/dist/types/asset/assetGroup.d.ts +28 -0
  177. package/dist/types/asset/assetId.d.ts +19 -0
  178. package/dist/types/asset/assetInput.d.ts +46 -0
  179. package/dist/types/asset/assetOutput.d.ts +39 -0
  180. package/dist/types/asset/assetRef.d.ts +25 -0
  181. package/dist/types/asset/index.d.ts +8 -0
  182. package/dist/types/asset/metadata.d.ts +37 -0
  183. package/dist/types/asset/packet.d.ts +27 -0
  184. package/dist/types/asset/types.d.ts +18 -0
  185. package/dist/types/asset/utils.d.ts +21 -0
  186. package/dist/types/bip322/index.d.ts +55 -0
  187. package/dist/types/contracts/arkcontract.d.ts +101 -0
  188. package/dist/types/contracts/contractManager.d.ts +331 -0
  189. package/dist/types/contracts/contractWatcher.d.ts +192 -0
  190. package/dist/types/contracts/handlers/default.d.ts +19 -0
  191. package/dist/types/contracts/handlers/delegate.d.ts +21 -0
  192. package/dist/types/contracts/handlers/helpers.d.ts +18 -0
  193. package/dist/types/contracts/handlers/index.d.ts +7 -0
  194. package/dist/types/contracts/handlers/registry.d.ts +65 -0
  195. package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
  196. package/dist/types/contracts/index.d.ts +14 -0
  197. package/dist/types/contracts/types.d.ts +222 -0
  198. package/dist/types/forfeit.d.ts +2 -1
  199. package/dist/types/identity/index.d.ts +1 -0
  200. package/dist/types/identity/seedIdentity.d.ts +128 -0
  201. package/dist/types/index.d.ts +22 -12
  202. package/dist/types/intent/index.d.ts +15 -1
  203. package/dist/types/providers/ark.d.ts +11 -2
  204. package/dist/types/providers/delegator.d.ts +29 -0
  205. package/dist/types/providers/indexer.d.ts +11 -1
  206. package/dist/types/repositories/contractRepository.d.ts +30 -19
  207. package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
  208. package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
  209. package/dist/types/repositories/index.d.ts +7 -0
  210. package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
  211. package/dist/types/repositories/indexedDB/db.d.ts +4 -0
  212. package/dist/types/repositories/indexedDB/manager.d.ts +22 -0
  213. package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
  214. package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
  215. package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
  216. package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
  217. package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
  218. package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
  219. package/dist/types/repositories/realm/contractRepository.d.ts +24 -0
  220. package/dist/types/repositories/realm/index.d.ts +4 -0
  221. package/dist/types/repositories/realm/schemas.d.ts +208 -0
  222. package/dist/types/repositories/realm/types.d.ts +16 -0
  223. package/dist/types/repositories/realm/walletRepository.d.ts +31 -0
  224. package/dist/types/repositories/serialization.d.ts +40 -0
  225. package/dist/types/repositories/sqlite/contractRepository.d.ts +33 -0
  226. package/dist/types/repositories/sqlite/index.d.ts +3 -0
  227. package/dist/types/repositories/sqlite/types.d.ts +18 -0
  228. package/dist/types/repositories/sqlite/walletRepository.d.ts +40 -0
  229. package/dist/types/repositories/walletRepository.d.ts +13 -24
  230. package/dist/types/script/base.d.ts +1 -0
  231. package/dist/types/script/delegate.d.ts +36 -0
  232. package/dist/types/storage/asyncStorage.d.ts +4 -0
  233. package/dist/types/storage/fileSystem.d.ts +3 -0
  234. package/dist/types/storage/inMemory.d.ts +3 -0
  235. package/dist/types/storage/index.d.ts +3 -0
  236. package/dist/types/storage/indexedDB.d.ts +3 -0
  237. package/dist/types/storage/localStorage.d.ts +3 -0
  238. package/dist/types/utils/arkTransaction.d.ts +6 -0
  239. package/dist/types/wallet/asset-manager.d.ts +78 -0
  240. package/dist/types/wallet/asset.d.ts +21 -0
  241. package/dist/types/wallet/batch.d.ts +1 -1
  242. package/dist/types/wallet/delegator.d.ts +24 -0
  243. package/dist/types/wallet/expo/background.d.ts +66 -0
  244. package/dist/types/wallet/expo/index.d.ts +4 -0
  245. package/dist/types/wallet/expo/wallet.d.ts +97 -0
  246. package/dist/types/wallet/index.d.ts +75 -2
  247. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
  248. package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
  249. package/dist/types/wallet/utils.d.ts +12 -1
  250. package/dist/types/wallet/validation.d.ts +24 -0
  251. package/dist/types/wallet/wallet.d.ts +111 -17
  252. package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
  253. package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
  254. package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
  255. package/dist/types/worker/expo/index.d.ts +7 -0
  256. package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
  257. package/dist/types/worker/expo/processors/index.d.ts +1 -0
  258. package/dist/types/worker/expo/taskQueue.d.ts +50 -0
  259. package/dist/types/worker/expo/taskRunner.d.ts +42 -0
  260. package/dist/types/worker/messageBus.d.ts +109 -0
  261. package/package.json +69 -11
  262. package/dist/cjs/wallet/serviceWorker/request.js +0 -78
  263. package/dist/cjs/wallet/serviceWorker/response.js +0 -222
  264. package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
  265. package/dist/esm/wallet/serviceWorker/request.js +0 -75
  266. package/dist/esm/wallet/serviceWorker/response.js +0 -219
  267. package/dist/esm/wallet/serviceWorker/worker.js +0 -651
  268. package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
  269. package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
  270. package/dist/types/wallet/serviceWorker/worker.d.ts +0 -53
@@ -1,50 +1,135 @@
1
- import { Response } from './response.js';
2
1
  import { hex } from "@scure/base";
3
- import { IndexedDBStorageAdapter } from '../../storage/indexedDB.js';
4
- import { WalletRepositoryImpl } from '../../repositories/walletRepository.js';
5
- import { ContractRepositoryImpl } from '../../repositories/contractRepository.js';
6
- import { DEFAULT_DB_NAME, setupServiceWorker } from './utils.js';
2
+ import { setupServiceWorker } from '../../worker/browser/utils.js';
3
+ import { IndexedDBContractRepository, IndexedDBWalletRepository, } from '../../repositories/index.js';
4
+ import { DEFAULT_MESSAGE_TAG, } from './wallet-message-handler.js';
5
+ import { getRandomId } from '../utils.js';
7
6
  const isPrivateKeyIdentity = (identity) => {
8
7
  return typeof identity.toHex === "function";
9
8
  };
10
- class UnexpectedResponseError extends Error {
11
- constructor(response) {
12
- super(`Unexpected response type. Got: ${JSON.stringify(response, null, 2)}`);
13
- this.name = "UnexpectedResponseError";
9
+ class ServiceWorkerReadonlyAssetManager {
10
+ constructor(sendMessage, messageTag) {
11
+ this.sendMessage = sendMessage;
12
+ this.messageTag = messageTag;
13
+ }
14
+ async getAssetDetails(assetId) {
15
+ const message = {
16
+ tag: this.messageTag,
17
+ type: "GET_ASSET_DETAILS",
18
+ id: getRandomId(),
19
+ payload: { assetId },
20
+ };
21
+ const response = await this.sendMessage(message);
22
+ return response.payload.assetDetails;
23
+ }
24
+ }
25
+ class ServiceWorkerAssetManager extends ServiceWorkerReadonlyAssetManager {
26
+ async issue(params) {
27
+ const message = {
28
+ tag: this.messageTag,
29
+ type: "ISSUE",
30
+ id: getRandomId(),
31
+ payload: { params },
32
+ };
33
+ const response = await this.sendMessage(message);
34
+ return response.payload.result;
35
+ }
36
+ async reissue(params) {
37
+ const message = {
38
+ tag: this.messageTag,
39
+ type: "REISSUE",
40
+ id: getRandomId(),
41
+ payload: { params },
42
+ };
43
+ const response = await this.sendMessage(message);
44
+ return response.payload.txid;
45
+ }
46
+ async burn(params) {
47
+ const message = {
48
+ tag: this.messageTag,
49
+ type: "BURN",
50
+ id: getRandomId(),
51
+ payload: { params },
52
+ };
53
+ const response = await this.sendMessage(message);
54
+ return response.payload.txid;
14
55
  }
15
56
  }
16
- const createCommon = (options) => {
17
- // Default to IndexedDB for service worker context
18
- const storage = new IndexedDBStorageAdapter(options.dbName || DEFAULT_DB_NAME, options.dbVersion);
19
- // Create repositories
20
- return {
21
- walletRepo: new WalletRepositoryImpl(storage),
22
- contractRepo: new ContractRepositoryImpl(storage),
57
+ const initializeMessageBus = (serviceWorker, config, timeoutMs = 2000) => {
58
+ const initCmd = {
59
+ tag: "INITIALIZE_MESSAGE_BUS",
60
+ id: getRandomId(),
61
+ config: { ...config, timeoutMs },
23
62
  };
63
+ return new Promise((resolve, reject) => {
64
+ const cleanup = () => {
65
+ navigator.serviceWorker.removeEventListener("message", onMessage);
66
+ clearTimeout(timeoutId);
67
+ };
68
+ const onMessage = (event) => {
69
+ const response = event.data;
70
+ if (response?.id !== initCmd.id)
71
+ return;
72
+ cleanup();
73
+ if (response.error) {
74
+ reject(response.error);
75
+ }
76
+ else {
77
+ resolve();
78
+ }
79
+ };
80
+ const timeoutId = setTimeout(() => {
81
+ cleanup();
82
+ reject(new Error("MessageBus timed out!"));
83
+ }, timeoutMs);
84
+ navigator.serviceWorker.addEventListener("message", onMessage);
85
+ serviceWorker.postMessage(initCmd);
86
+ });
24
87
  };
25
88
  export class ServiceWorkerReadonlyWallet {
26
- constructor(serviceWorker, identity, walletRepository, contractRepository) {
89
+ get assetManager() {
90
+ return this._readonlyAssetManager;
91
+ }
92
+ constructor(serviceWorker, identity, walletRepository, contractRepository, messageTag) {
27
93
  this.serviceWorker = serviceWorker;
94
+ this.messageTag = messageTag;
28
95
  this.identity = identity;
29
96
  this.walletRepository = walletRepository;
30
97
  this.contractRepository = contractRepository;
98
+ this._readonlyAssetManager = new ServiceWorkerReadonlyAssetManager((msg) => this.sendMessage(msg), messageTag);
31
99
  }
32
100
  static async create(options) {
33
- const { walletRepo, contractRepo } = createCommon(options);
101
+ const walletRepository = options.storage?.walletRepository ??
102
+ new IndexedDBWalletRepository();
103
+ const contractRepository = options.storage?.contractRepository ??
104
+ new IndexedDBContractRepository();
105
+ const messageTag = options.walletUpdaterTag ?? DEFAULT_MESSAGE_TAG;
34
106
  // Create the wallet instance
35
- const wallet = new ServiceWorkerReadonlyWallet(options.serviceWorker, options.identity, walletRepo, contractRepo);
107
+ const wallet = new ServiceWorkerReadonlyWallet(options.serviceWorker, options.identity, walletRepository, contractRepository, messageTag);
36
108
  const publicKey = await options.identity
37
109
  .compressedPublicKey()
38
110
  .then(hex.encode);
39
- // Initialize the service worker with the config
40
- const initMessage = {
41
- type: "INIT_WALLET",
42
- id: getRandomId(),
111
+ const initConfig = {
43
112
  key: { publicKey },
44
113
  arkServerUrl: options.arkServerUrl,
45
114
  arkServerPublicKey: options.arkServerPublicKey,
115
+ delegatorUrl: options.delegatorUrl,
116
+ };
117
+ // Bootstrap the MessageBus in the service worker
118
+ await initializeMessageBus(options.serviceWorker, {
119
+ wallet: initConfig.key,
120
+ arkServer: {
121
+ url: initConfig.arkServerUrl,
122
+ publicKey: initConfig.arkServerPublicKey,
123
+ },
124
+ timeoutMs: options.messageBusTimeoutMs,
125
+ }, options.messageBusTimeoutMs);
126
+ // Initialize the wallet handler
127
+ const initMessage = {
128
+ tag: messageTag,
129
+ type: "INIT_WALLET",
130
+ id: getRandomId(),
131
+ payload: initConfig,
46
132
  };
47
- // Initialize the service worker
48
133
  await wallet.sendMessage(initMessage);
49
134
  return wallet;
50
135
  }
@@ -73,44 +158,41 @@ export class ServiceWorkerReadonlyWallet {
73
158
  // Register and setup the service worker
74
159
  const serviceWorker = await setupServiceWorker(options.serviceWorkerPath);
75
160
  // Use the existing create method
76
- return ServiceWorkerReadonlyWallet.create({
161
+ return await ServiceWorkerReadonlyWallet.create({
77
162
  ...options,
78
163
  serviceWorker,
79
164
  });
80
165
  }
81
166
  // send a message and wait for a response
82
- async sendMessage(message) {
167
+ async sendMessage(request) {
83
168
  return new Promise((resolve, reject) => {
84
169
  const messageHandler = (event) => {
85
170
  const response = event.data;
86
- if (response.id === "") {
87
- reject(new Error("Invalid response id"));
88
- return;
89
- }
90
- if (response.id !== message.id) {
171
+ if (request.id !== response.id) {
91
172
  return;
92
173
  }
93
174
  navigator.serviceWorker.removeEventListener("message", messageHandler);
94
- if (!response.success) {
95
- reject(new Error(response.message));
175
+ if (response.error) {
176
+ reject(response.error);
96
177
  }
97
178
  else {
98
179
  resolve(response);
99
180
  }
100
181
  };
101
182
  navigator.serviceWorker.addEventListener("message", messageHandler);
102
- this.serviceWorker.postMessage(message);
183
+ this.serviceWorker.postMessage(request);
103
184
  });
104
185
  }
105
186
  async clear() {
106
187
  const message = {
107
- type: "CLEAR",
108
188
  id: getRandomId(),
189
+ tag: this.messageTag,
190
+ type: "CLEAR",
109
191
  };
110
192
  // Clear page-side storage to maintain parity with SW
111
193
  try {
112
194
  const address = await this.getAddress();
113
- await this.walletRepository.clearVtxos(address);
195
+ await this.walletRepository.deleteVtxos(address);
114
196
  }
115
197
  catch (_) {
116
198
  console.warn("Failed to clear vtxos from wallet repository");
@@ -119,15 +201,13 @@ export class ServiceWorkerReadonlyWallet {
119
201
  }
120
202
  async getAddress() {
121
203
  const message = {
122
- type: "GET_ADDRESS",
123
204
  id: getRandomId(),
205
+ tag: this.messageTag,
206
+ type: "GET_ADDRESS",
124
207
  };
125
208
  try {
126
209
  const response = await this.sendMessage(message);
127
- if (Response.isAddress(response)) {
128
- return response.address;
129
- }
130
- throw new UnexpectedResponseError(response);
210
+ return response.payload.address;
131
211
  }
132
212
  catch (error) {
133
213
  throw new Error(`Failed to get address: ${error}`);
@@ -135,15 +215,13 @@ export class ServiceWorkerReadonlyWallet {
135
215
  }
136
216
  async getBoardingAddress() {
137
217
  const message = {
138
- type: "GET_BOARDING_ADDRESS",
139
218
  id: getRandomId(),
219
+ tag: this.messageTag,
220
+ type: "GET_BOARDING_ADDRESS",
140
221
  };
141
222
  try {
142
223
  const response = await this.sendMessage(message);
143
- if (Response.isBoardingAddress(response)) {
144
- return response.address;
145
- }
146
- throw new UnexpectedResponseError(response);
224
+ return response.payload.address;
147
225
  }
148
226
  catch (error) {
149
227
  throw new Error(`Failed to get boarding address: ${error}`);
@@ -151,15 +229,13 @@ export class ServiceWorkerReadonlyWallet {
151
229
  }
152
230
  async getBalance() {
153
231
  const message = {
154
- type: "GET_BALANCE",
155
232
  id: getRandomId(),
233
+ tag: this.messageTag,
234
+ type: "GET_BALANCE",
156
235
  };
157
236
  try {
158
237
  const response = await this.sendMessage(message);
159
- if (Response.isBalance(response)) {
160
- return response.balance;
161
- }
162
- throw new UnexpectedResponseError(response);
238
+ return response.payload;
163
239
  }
164
240
  catch (error) {
165
241
  throw new Error(`Failed to get balance: ${error}`);
@@ -167,15 +243,13 @@ export class ServiceWorkerReadonlyWallet {
167
243
  }
168
244
  async getBoardingUtxos() {
169
245
  const message = {
170
- type: "GET_BOARDING_UTXOS",
171
246
  id: getRandomId(),
247
+ tag: this.messageTag,
248
+ type: "GET_BOARDING_UTXOS",
172
249
  };
173
250
  try {
174
251
  const response = await this.sendMessage(message);
175
- if (Response.isBoardingUtxos(response)) {
176
- return response.boardingUtxos;
177
- }
178
- throw new UnexpectedResponseError(response);
252
+ return response.payload.utxos;
179
253
  }
180
254
  catch (error) {
181
255
  throw new Error(`Failed to get boarding UTXOs: ${error}`);
@@ -183,26 +257,28 @@ export class ServiceWorkerReadonlyWallet {
183
257
  }
184
258
  async getStatus() {
185
259
  const message = {
186
- type: "GET_STATUS",
187
260
  id: getRandomId(),
261
+ tag: this.messageTag,
262
+ type: "GET_STATUS",
188
263
  };
189
- const response = await this.sendMessage(message);
190
- if (Response.isWalletStatus(response)) {
191
- return response.status;
264
+ try {
265
+ const response = await this.sendMessage(message);
266
+ return response.payload;
267
+ }
268
+ catch (error) {
269
+ throw new Error(`Failed to get status: ${error}`);
192
270
  }
193
- throw new UnexpectedResponseError(response);
194
271
  }
195
272
  async getTransactionHistory() {
196
273
  const message = {
197
- type: "GET_TRANSACTION_HISTORY",
198
274
  id: getRandomId(),
275
+ tag: this.messageTag,
276
+ type: "GET_TRANSACTION_HISTORY",
199
277
  };
200
278
  try {
201
279
  const response = await this.sendMessage(message);
202
- if (Response.isTransactionHistory(response)) {
203
- return response.transactions;
204
- }
205
- throw new UnexpectedResponseError(response);
280
+ return response.payload
281
+ .transactions;
206
282
  }
207
283
  catch (error) {
208
284
  throw new Error(`Failed to get transaction history: ${error}`);
@@ -210,16 +286,14 @@ export class ServiceWorkerReadonlyWallet {
210
286
  }
211
287
  async getVtxos(filter) {
212
288
  const message = {
213
- type: "GET_VTXOS",
214
289
  id: getRandomId(),
215
- filter,
290
+ tag: this.messageTag,
291
+ type: "GET_VTXOS",
292
+ payload: { filter },
216
293
  };
217
294
  try {
218
295
  const response = await this.sendMessage(message);
219
- if (Response.isVtxos(response)) {
220
- return response.vtxos;
221
- }
222
- throw new UnexpectedResponseError(response);
296
+ return response.payload.vtxos;
223
297
  }
224
298
  catch (error) {
225
299
  throw new Error(`Failed to get vtxos: ${error}`);
@@ -227,26 +301,209 @@ export class ServiceWorkerReadonlyWallet {
227
301
  }
228
302
  async reload() {
229
303
  const message = {
230
- type: "RELOAD_WALLET",
231
304
  id: getRandomId(),
305
+ tag: this.messageTag,
306
+ type: "RELOAD_WALLET",
232
307
  };
233
- const response = await this.sendMessage(message);
234
- if (Response.isWalletReloaded(response)) {
235
- return response.success;
308
+ try {
309
+ const response = await this.sendMessage(message);
310
+ return response.payload.reloaded;
311
+ }
312
+ catch (error) {
313
+ throw new Error(`Failed to reload wallet: ${error}`);
236
314
  }
237
- throw new UnexpectedResponseError(response);
315
+ }
316
+ async getContractManager() {
317
+ const wallet = this;
318
+ const sendContractMessage = async (message) => {
319
+ return wallet.sendMessage(message);
320
+ };
321
+ const messageTag = this.messageTag;
322
+ const manager = {
323
+ async createContract(params) {
324
+ const message = {
325
+ type: "CREATE_CONTRACT",
326
+ id: getRandomId(),
327
+ tag: messageTag,
328
+ payload: params,
329
+ };
330
+ try {
331
+ const response = await sendContractMessage(message);
332
+ return response.payload
333
+ .contract;
334
+ }
335
+ catch (e) {
336
+ throw new Error("Failed to create contract");
337
+ }
338
+ },
339
+ async getContracts(filter) {
340
+ const message = {
341
+ type: "GET_CONTRACTS",
342
+ id: getRandomId(),
343
+ tag: messageTag,
344
+ payload: { filter },
345
+ };
346
+ try {
347
+ const response = await sendContractMessage(message);
348
+ return response.payload.contracts;
349
+ }
350
+ catch (e) {
351
+ throw new Error("Failed to get contracts");
352
+ }
353
+ },
354
+ async getContractsWithVtxos(filter) {
355
+ const message = {
356
+ type: "GET_CONTRACTS_WITH_VTXOS",
357
+ id: getRandomId(),
358
+ tag: messageTag,
359
+ payload: { filter },
360
+ };
361
+ try {
362
+ const response = await sendContractMessage(message);
363
+ return response.payload
364
+ .contracts;
365
+ }
366
+ catch (e) {
367
+ throw new Error("Failed to get contracts with vtxos");
368
+ }
369
+ },
370
+ async updateContract(script, updates) {
371
+ const message = {
372
+ type: "UPDATE_CONTRACT",
373
+ id: getRandomId(),
374
+ tag: messageTag,
375
+ payload: { script, updates },
376
+ };
377
+ try {
378
+ const response = await sendContractMessage(message);
379
+ return response.payload
380
+ .contract;
381
+ }
382
+ catch (e) {
383
+ throw new Error("Failed to update contract");
384
+ }
385
+ },
386
+ async setContractState(script, state) {
387
+ const message = {
388
+ type: "UPDATE_CONTRACT",
389
+ id: getRandomId(),
390
+ tag: messageTag,
391
+ payload: { script, updates: { state } },
392
+ };
393
+ try {
394
+ await sendContractMessage(message);
395
+ return;
396
+ }
397
+ catch (e) {
398
+ throw new Error("Failed to update contract state");
399
+ }
400
+ },
401
+ async deleteContract(script) {
402
+ const message = {
403
+ type: "DELETE_CONTRACT",
404
+ id: getRandomId(),
405
+ tag: messageTag,
406
+ payload: { script },
407
+ };
408
+ try {
409
+ await sendContractMessage(message);
410
+ return;
411
+ }
412
+ catch (e) {
413
+ throw new Error("Failed to delete contract");
414
+ }
415
+ },
416
+ async getSpendablePaths(options) {
417
+ const message = {
418
+ type: "GET_SPENDABLE_PATHS",
419
+ id: getRandomId(),
420
+ tag: messageTag,
421
+ payload: { options },
422
+ };
423
+ try {
424
+ const response = await sendContractMessage(message);
425
+ return response.payload
426
+ .paths;
427
+ }
428
+ catch (e) {
429
+ throw new Error("Failed to get spendable paths");
430
+ }
431
+ },
432
+ async getAllSpendingPaths(options) {
433
+ const message = {
434
+ type: "GET_ALL_SPENDING_PATHS",
435
+ id: getRandomId(),
436
+ tag: messageTag,
437
+ payload: { options },
438
+ };
439
+ try {
440
+ const response = await sendContractMessage(message);
441
+ return response.payload
442
+ .paths;
443
+ }
444
+ catch (e) {
445
+ throw new Error("Failed to get all spending paths");
446
+ }
447
+ },
448
+ onContractEvent(callback) {
449
+ const messageHandler = (event) => {
450
+ const response = event.data;
451
+ if (response.type !== "CONTRACT_EVENT") {
452
+ return;
453
+ }
454
+ if (response.tag !== messageTag) {
455
+ return;
456
+ }
457
+ callback(response.payload.event);
458
+ };
459
+ navigator.serviceWorker.addEventListener("message", messageHandler);
460
+ return () => {
461
+ navigator.serviceWorker.removeEventListener("message", messageHandler);
462
+ };
463
+ },
464
+ async isWatching() {
465
+ const message = {
466
+ type: "IS_CONTRACT_MANAGER_WATCHING",
467
+ id: getRandomId(),
468
+ tag: messageTag,
469
+ };
470
+ try {
471
+ const response = await sendContractMessage(message);
472
+ return response
473
+ .payload.isWatching;
474
+ }
475
+ catch (e) {
476
+ throw new Error("Failed to check if contract manager is watching");
477
+ }
478
+ },
479
+ dispose() {
480
+ return;
481
+ },
482
+ [Symbol.dispose]() {
483
+ // no-op
484
+ return;
485
+ },
486
+ };
487
+ return manager;
238
488
  }
239
489
  }
240
490
  export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
241
- constructor(serviceWorker, identity, walletRepository, contractRepository) {
242
- super(serviceWorker, identity, walletRepository, contractRepository);
491
+ constructor(serviceWorker, identity, walletRepository, contractRepository, messageTag) {
492
+ super(serviceWorker, identity, walletRepository, contractRepository, messageTag);
243
493
  this.serviceWorker = serviceWorker;
244
494
  this.identity = identity;
245
495
  this.walletRepository = walletRepository;
246
496
  this.contractRepository = contractRepository;
497
+ this._assetManager = new ServiceWorkerAssetManager((msg) => this.sendMessage(msg), messageTag);
498
+ }
499
+ get assetManager() {
500
+ return this._assetManager;
247
501
  }
248
502
  static async create(options) {
249
- const { walletRepo, contractRepo } = createCommon(options);
503
+ const walletRepository = options.storage?.walletRepository ??
504
+ new IndexedDBWalletRepository();
505
+ const contractRepository = options.storage?.contractRepository ??
506
+ new IndexedDBContractRepository();
250
507
  // Extract identity and check if it can expose private key
251
508
  const identity = isPrivateKeyIdentity(options.identity)
252
509
  ? options.identity
@@ -256,15 +513,29 @@ export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
256
513
  }
257
514
  // Extract private key for service worker initialization
258
515
  const privateKey = identity.toHex();
516
+ const messageTag = options.walletUpdaterTag ?? DEFAULT_MESSAGE_TAG;
259
517
  // Create the wallet instance
260
- const wallet = new ServiceWorkerWallet(options.serviceWorker, identity, walletRepo, contractRepo);
518
+ const wallet = new ServiceWorkerWallet(options.serviceWorker, identity, walletRepository, contractRepository, messageTag);
519
+ const initConfig = {
520
+ key: { privateKey },
521
+ arkServerUrl: options.arkServerUrl,
522
+ arkServerPublicKey: options.arkServerPublicKey,
523
+ delegatorUrl: options.delegatorUrl,
524
+ };
525
+ await initializeMessageBus(options.serviceWorker, {
526
+ wallet: initConfig.key,
527
+ arkServer: {
528
+ url: initConfig.arkServerUrl,
529
+ publicKey: initConfig.arkServerPublicKey,
530
+ },
531
+ timeoutMs: options.messageBusTimeoutMs,
532
+ }, options.messageBusTimeoutMs);
261
533
  // Initialize the service worker with the config
262
534
  const initMessage = {
535
+ tag: messageTag,
263
536
  type: "INIT_WALLET",
264
537
  id: getRandomId(),
265
- key: { privateKey },
266
- arkServerUrl: options.arkServerUrl,
267
- arkServerPublicKey: options.arkServerPublicKey,
538
+ payload: initConfig,
268
539
  };
269
540
  // Initialize the service worker
270
541
  await wallet.sendMessage(initMessage);
@@ -302,16 +573,14 @@ export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
302
573
  }
303
574
  async sendBitcoin(params) {
304
575
  const message = {
305
- type: "SEND_BITCOIN",
306
- params,
307
576
  id: getRandomId(),
577
+ tag: this.messageTag,
578
+ type: "SEND_BITCOIN",
579
+ payload: params,
308
580
  };
309
581
  try {
310
582
  const response = await this.sendMessage(message);
311
- if (Response.isSendBitcoinSuccess(response)) {
312
- return response.txid;
313
- }
314
- throw new UnexpectedResponseError(response);
583
+ return response.payload.txid;
315
584
  }
316
585
  catch (error) {
317
586
  throw new Error(`Failed to send bitcoin: ${error}`);
@@ -319,9 +588,10 @@ export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
319
588
  }
320
589
  async settle(params, callback) {
321
590
  const message = {
322
- type: "SETTLE",
323
- params,
324
591
  id: getRandomId(),
592
+ tag: this.messageTag,
593
+ type: "SETTLE",
594
+ payload: { params },
325
595
  };
326
596
  try {
327
597
  return new Promise((resolve, reject) => {
@@ -330,23 +600,23 @@ export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
330
600
  if (response.id !== message.id) {
331
601
  return;
332
602
  }
333
- if (!response.success) {
603
+ if (response.error) {
334
604
  navigator.serviceWorker.removeEventListener("message", messageHandler);
335
- reject(new Error(response.message));
605
+ reject(response.error);
336
606
  return;
337
607
  }
338
608
  switch (response.type) {
339
609
  case "SETTLE_EVENT":
340
610
  if (callback) {
341
- callback(response.event);
611
+ callback(response.payload);
342
612
  }
343
613
  break;
344
614
  case "SETTLE_SUCCESS":
345
615
  navigator.serviceWorker.removeEventListener("message", messageHandler);
346
- resolve(response.txid);
616
+ resolve(response.payload.txid);
347
617
  break;
348
618
  default:
349
- break;
619
+ console.error(`Unexpected response type for SETTLE request: ${response.type}`);
350
620
  }
351
621
  };
352
622
  navigator.serviceWorker.addEventListener("message", messageHandler);
@@ -357,8 +627,19 @@ export class ServiceWorkerWallet extends ServiceWorkerReadonlyWallet {
357
627
  throw new Error(`Settlement failed: ${error}`);
358
628
  }
359
629
  }
360
- }
361
- function getRandomId() {
362
- const randomValue = crypto.getRandomValues(new Uint8Array(16));
363
- return hex.encode(randomValue);
630
+ async send(...recipients) {
631
+ const message = {
632
+ tag: this.messageTag,
633
+ type: "SEND",
634
+ id: getRandomId(),
635
+ payload: { recipients },
636
+ };
637
+ try {
638
+ const response = await this.sendMessage(message);
639
+ return response.payload.txid;
640
+ }
641
+ catch (error) {
642
+ throw new Error(`Send failed: ${error}`);
643
+ }
644
+ }
364
645
  }