@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.
- package/README.md +586 -54
- package/dist/cjs/asset/assetGroup.js +141 -0
- package/dist/cjs/asset/assetId.js +88 -0
- package/dist/cjs/asset/assetInput.js +204 -0
- package/dist/cjs/asset/assetOutput.js +159 -0
- package/dist/cjs/asset/assetRef.js +82 -0
- package/dist/cjs/asset/index.js +24 -0
- package/dist/cjs/asset/metadata.js +172 -0
- package/dist/cjs/asset/packet.js +164 -0
- package/dist/cjs/asset/types.js +25 -0
- package/dist/cjs/asset/utils.js +105 -0
- package/dist/cjs/bip322/index.js +270 -0
- package/dist/cjs/contracts/arkcontract.js +148 -0
- package/dist/cjs/contracts/contractManager.js +436 -0
- package/dist/cjs/contracts/contractWatcher.js +567 -0
- package/dist/cjs/contracts/handlers/default.js +85 -0
- package/dist/cjs/contracts/handlers/delegate.js +89 -0
- package/dist/cjs/contracts/handlers/helpers.js +105 -0
- package/dist/cjs/contracts/handlers/index.js +19 -0
- package/dist/cjs/contracts/handlers/registry.js +89 -0
- package/dist/cjs/contracts/handlers/vhtlc.js +193 -0
- package/dist/cjs/contracts/index.js +41 -0
- package/dist/cjs/contracts/types.js +2 -0
- package/dist/cjs/forfeit.js +12 -8
- package/dist/cjs/identity/index.js +1 -0
- package/dist/cjs/identity/seedIdentity.js +255 -0
- package/dist/cjs/index.js +72 -14
- package/dist/cjs/intent/index.js +47 -11
- package/dist/cjs/providers/ark.js +7 -0
- package/dist/cjs/providers/delegator.js +66 -0
- package/dist/cjs/providers/expoIndexer.js +5 -0
- package/dist/cjs/providers/indexer.js +68 -1
- package/dist/cjs/providers/utils.js +1 -0
- package/dist/cjs/repositories/contractRepository.js +0 -103
- package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
- package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
- package/dist/cjs/repositories/index.js +16 -0
- package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
- package/dist/cjs/repositories/indexedDB/db.js +19 -0
- package/dist/cjs/repositories/indexedDB/manager.js +97 -0
- package/dist/cjs/repositories/indexedDB/schema.js +159 -0
- package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
- package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
- package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
- package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
- package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
- package/dist/cjs/repositories/realm/contractRepository.js +120 -0
- package/dist/cjs/repositories/realm/index.js +9 -0
- package/dist/cjs/repositories/realm/schemas.js +108 -0
- package/dist/cjs/repositories/realm/types.js +7 -0
- package/dist/cjs/repositories/realm/walletRepository.js +273 -0
- package/dist/cjs/repositories/serialization.js +49 -0
- package/dist/cjs/repositories/sqlite/contractRepository.js +139 -0
- package/dist/cjs/repositories/sqlite/index.js +7 -0
- package/dist/cjs/repositories/sqlite/types.js +2 -0
- package/dist/cjs/repositories/sqlite/walletRepository.js +328 -0
- package/dist/cjs/repositories/walletRepository.js +0 -169
- package/dist/cjs/script/base.js +54 -0
- package/dist/cjs/script/delegate.js +49 -0
- package/dist/cjs/storage/asyncStorage.js +4 -1
- package/dist/cjs/storage/fileSystem.js +3 -0
- package/dist/cjs/storage/inMemory.js +3 -0
- package/dist/cjs/storage/indexedDB.js +5 -1
- package/dist/cjs/storage/localStorage.js +3 -0
- package/dist/cjs/utils/arkTransaction.js +16 -0
- package/dist/cjs/utils/transactionHistory.js +50 -0
- package/dist/cjs/wallet/asset-manager.js +338 -0
- package/dist/cjs/wallet/asset.js +117 -0
- package/dist/cjs/wallet/batch.js +1 -1
- package/dist/cjs/wallet/delegator.js +235 -0
- package/dist/cjs/wallet/expo/background.js +133 -0
- package/dist/cjs/wallet/expo/index.js +9 -0
- package/dist/cjs/wallet/expo/wallet.js +231 -0
- package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
- package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
- package/dist/cjs/wallet/utils.js +58 -0
- package/dist/cjs/wallet/validation.js +151 -0
- package/dist/cjs/wallet/vtxo-manager.js +8 -1
- package/dist/cjs/wallet/wallet.js +702 -260
- package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
- package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
- package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
- package/dist/cjs/worker/expo/index.js +12 -0
- package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
- package/dist/cjs/worker/expo/processors/index.js +6 -0
- package/dist/cjs/worker/expo/taskQueue.js +41 -0
- package/dist/cjs/worker/expo/taskRunner.js +57 -0
- package/dist/cjs/worker/messageBus.js +252 -0
- package/dist/esm/asset/assetGroup.js +137 -0
- package/dist/esm/asset/assetId.js +84 -0
- package/dist/esm/asset/assetInput.js +199 -0
- package/dist/esm/asset/assetOutput.js +154 -0
- package/dist/esm/asset/assetRef.js +78 -0
- package/dist/esm/asset/index.js +8 -0
- package/dist/esm/asset/metadata.js +167 -0
- package/dist/esm/asset/packet.js +159 -0
- package/dist/esm/asset/types.js +22 -0
- package/dist/esm/asset/utils.js +99 -0
- package/dist/esm/bip322/index.js +267 -0
- package/dist/esm/contracts/arkcontract.js +141 -0
- package/dist/esm/contracts/contractManager.js +432 -0
- package/dist/esm/contracts/contractWatcher.js +563 -0
- package/dist/esm/contracts/handlers/default.js +82 -0
- package/dist/esm/contracts/handlers/delegate.js +86 -0
- package/dist/esm/contracts/handlers/helpers.js +66 -0
- package/dist/esm/contracts/handlers/index.js +12 -0
- package/dist/esm/contracts/handlers/registry.js +86 -0
- package/dist/esm/contracts/handlers/vhtlc.js +190 -0
- package/dist/esm/contracts/index.js +13 -0
- package/dist/esm/contracts/types.js +1 -0
- package/dist/esm/forfeit.js +11 -8
- package/dist/esm/identity/index.js +1 -0
- package/dist/esm/identity/seedIdentity.js +249 -0
- package/dist/esm/index.js +28 -15
- package/dist/esm/intent/index.js +44 -9
- package/dist/esm/providers/ark.js +7 -0
- package/dist/esm/providers/delegator.js +62 -0
- package/dist/esm/providers/expoIndexer.js +5 -0
- package/dist/esm/providers/indexer.js +68 -1
- package/dist/esm/providers/utils.js +1 -0
- package/dist/esm/repositories/contractRepository.js +1 -101
- package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
- package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
- package/dist/esm/repositories/index.js +8 -0
- package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
- package/dist/esm/repositories/indexedDB/db.js +4 -0
- package/dist/esm/repositories/indexedDB/manager.js +92 -0
- package/dist/esm/repositories/indexedDB/schema.js +155 -0
- package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
- package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
- package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
- package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
- package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
- package/dist/esm/repositories/realm/contractRepository.js +116 -0
- package/dist/esm/repositories/realm/index.js +3 -0
- package/dist/esm/repositories/realm/schemas.js +105 -0
- package/dist/esm/repositories/realm/types.js +6 -0
- package/dist/esm/repositories/realm/walletRepository.js +269 -0
- package/dist/esm/repositories/serialization.js +40 -0
- package/dist/esm/repositories/sqlite/contractRepository.js +135 -0
- package/dist/esm/repositories/sqlite/index.js +2 -0
- package/dist/esm/repositories/sqlite/types.js +1 -0
- package/dist/esm/repositories/sqlite/walletRepository.js +324 -0
- package/dist/esm/repositories/walletRepository.js +1 -167
- package/dist/esm/script/base.js +21 -1
- package/dist/esm/script/delegate.js +46 -0
- package/dist/esm/storage/asyncStorage.js +4 -1
- package/dist/esm/storage/fileSystem.js +3 -0
- package/dist/esm/storage/inMemory.js +3 -0
- package/dist/esm/storage/indexedDB.js +5 -1
- package/dist/esm/storage/localStorage.js +3 -0
- package/dist/esm/utils/arkTransaction.js +15 -0
- package/dist/esm/utils/transactionHistory.js +50 -0
- package/dist/esm/wallet/asset-manager.js +333 -0
- package/dist/esm/wallet/asset.js +111 -0
- package/dist/esm/wallet/batch.js +1 -1
- package/dist/esm/wallet/delegator.js +231 -0
- package/dist/esm/wallet/expo/background.js +128 -0
- package/dist/esm/wallet/expo/index.js +2 -0
- package/dist/esm/wallet/expo/wallet.js +194 -0
- package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
- package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
- package/dist/esm/wallet/utils.js +54 -0
- package/dist/esm/wallet/validation.js +139 -0
- package/dist/esm/wallet/vtxo-manager.js +8 -1
- package/dist/esm/wallet/wallet.js +704 -229
- package/dist/esm/worker/browser/service-worker-manager.js +76 -0
- package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
- package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
- package/dist/esm/worker/expo/index.js +4 -0
- package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
- package/dist/esm/worker/expo/processors/index.js +1 -0
- package/dist/esm/worker/expo/taskQueue.js +37 -0
- package/dist/esm/worker/expo/taskRunner.js +54 -0
- package/dist/esm/worker/messageBus.js +248 -0
- package/dist/types/asset/assetGroup.d.ts +28 -0
- package/dist/types/asset/assetId.d.ts +19 -0
- package/dist/types/asset/assetInput.d.ts +46 -0
- package/dist/types/asset/assetOutput.d.ts +39 -0
- package/dist/types/asset/assetRef.d.ts +25 -0
- package/dist/types/asset/index.d.ts +8 -0
- package/dist/types/asset/metadata.d.ts +37 -0
- package/dist/types/asset/packet.d.ts +27 -0
- package/dist/types/asset/types.d.ts +18 -0
- package/dist/types/asset/utils.d.ts +21 -0
- package/dist/types/bip322/index.d.ts +55 -0
- package/dist/types/contracts/arkcontract.d.ts +101 -0
- package/dist/types/contracts/contractManager.d.ts +331 -0
- package/dist/types/contracts/contractWatcher.d.ts +192 -0
- package/dist/types/contracts/handlers/default.d.ts +19 -0
- package/dist/types/contracts/handlers/delegate.d.ts +21 -0
- package/dist/types/contracts/handlers/helpers.d.ts +18 -0
- package/dist/types/contracts/handlers/index.d.ts +7 -0
- package/dist/types/contracts/handlers/registry.d.ts +65 -0
- package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
- package/dist/types/contracts/index.d.ts +14 -0
- package/dist/types/contracts/types.d.ts +222 -0
- package/dist/types/forfeit.d.ts +2 -1
- package/dist/types/identity/index.d.ts +1 -0
- package/dist/types/identity/seedIdentity.d.ts +128 -0
- package/dist/types/index.d.ts +22 -12
- package/dist/types/intent/index.d.ts +15 -1
- package/dist/types/providers/ark.d.ts +11 -2
- package/dist/types/providers/delegator.d.ts +29 -0
- package/dist/types/providers/indexer.d.ts +11 -1
- package/dist/types/repositories/contractRepository.d.ts +30 -19
- package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
- package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
- package/dist/types/repositories/index.d.ts +7 -0
- package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
- package/dist/types/repositories/indexedDB/db.d.ts +4 -0
- package/dist/types/repositories/indexedDB/manager.d.ts +22 -0
- package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
- package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
- package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
- package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
- package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
- package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
- package/dist/types/repositories/realm/contractRepository.d.ts +24 -0
- package/dist/types/repositories/realm/index.d.ts +4 -0
- package/dist/types/repositories/realm/schemas.d.ts +208 -0
- package/dist/types/repositories/realm/types.d.ts +16 -0
- package/dist/types/repositories/realm/walletRepository.d.ts +31 -0
- package/dist/types/repositories/serialization.d.ts +40 -0
- package/dist/types/repositories/sqlite/contractRepository.d.ts +33 -0
- package/dist/types/repositories/sqlite/index.d.ts +3 -0
- package/dist/types/repositories/sqlite/types.d.ts +18 -0
- package/dist/types/repositories/sqlite/walletRepository.d.ts +40 -0
- package/dist/types/repositories/walletRepository.d.ts +13 -24
- package/dist/types/script/base.d.ts +1 -0
- package/dist/types/script/delegate.d.ts +36 -0
- package/dist/types/storage/asyncStorage.d.ts +4 -0
- package/dist/types/storage/fileSystem.d.ts +3 -0
- package/dist/types/storage/inMemory.d.ts +3 -0
- package/dist/types/storage/index.d.ts +3 -0
- package/dist/types/storage/indexedDB.d.ts +3 -0
- package/dist/types/storage/localStorage.d.ts +3 -0
- package/dist/types/utils/arkTransaction.d.ts +6 -0
- package/dist/types/wallet/asset-manager.d.ts +78 -0
- package/dist/types/wallet/asset.d.ts +21 -0
- package/dist/types/wallet/batch.d.ts +1 -1
- package/dist/types/wallet/delegator.d.ts +24 -0
- package/dist/types/wallet/expo/background.d.ts +66 -0
- package/dist/types/wallet/expo/index.d.ts +4 -0
- package/dist/types/wallet/expo/wallet.d.ts +97 -0
- package/dist/types/wallet/index.d.ts +75 -2
- package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
- package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
- package/dist/types/wallet/utils.d.ts +12 -1
- package/dist/types/wallet/validation.d.ts +24 -0
- package/dist/types/wallet/wallet.d.ts +111 -17
- package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
- package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
- package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
- package/dist/types/worker/expo/index.d.ts +7 -0
- package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
- package/dist/types/worker/expo/processors/index.d.ts +1 -0
- package/dist/types/worker/expo/taskQueue.d.ts +50 -0
- package/dist/types/worker/expo/taskRunner.d.ts +42 -0
- package/dist/types/worker/messageBus.d.ts +109 -0
- package/package.json +69 -11
- package/dist/cjs/wallet/serviceWorker/request.js +0 -78
- package/dist/cjs/wallet/serviceWorker/response.js +0 -222
- package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
- package/dist/esm/wallet/serviceWorker/request.js +0 -75
- package/dist/esm/wallet/serviceWorker/response.js +0 -219
- package/dist/esm/wallet/serviceWorker/worker.js +0 -651
- package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
- package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
- 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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
|
11
|
-
constructor(
|
|
12
|
-
|
|
13
|
-
this.
|
|
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
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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(
|
|
167
|
+
async sendMessage(request) {
|
|
83
168
|
return new Promise((resolve, reject) => {
|
|
84
169
|
const messageHandler = (event) => {
|
|
85
170
|
const response = event.data;
|
|
86
|
-
if (
|
|
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 (
|
|
95
|
-
reject(
|
|
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(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
return response.
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
return response.
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
603
|
+
if (response.error) {
|
|
334
604
|
navigator.serviceWorker.removeEventListener("message", messageHandler);
|
|
335
|
-
reject(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
}
|