@arkade-os/sdk 0.3.12 → 0.4.0-next.0

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