@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.
- package/README.md +483 -54
- package/dist/cjs/adapters/expo-db.js +35 -0
- 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/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/db/manager.js +97 -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 +70 -14
- package/dist/cjs/intent/index.js +28 -2
- 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/onchain.js +2 -2
- 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 +57 -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/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/utils/txSizeEstimator.js +39 -14
- 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/onchain.js +57 -12
- package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
- package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
- package/dist/cjs/wallet/unroll.js +7 -2
- package/dist/cjs/wallet/utils.js +60 -0
- package/dist/cjs/wallet/validation.js +151 -0
- package/dist/cjs/wallet/vtxo-manager.js +1 -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/adapters/expo-db.js +27 -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/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/db/manager.js +92 -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 +25 -15
- package/dist/esm/intent/index.js +28 -2
- 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/onchain.js +2 -2
- 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 +42 -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/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/utils/txSizeEstimator.js +39 -14
- 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/onchain.js +57 -12
- package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
- package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
- package/dist/esm/wallet/unroll.js +7 -2
- package/dist/esm/wallet/utils.js +55 -0
- package/dist/esm/wallet/validation.js +139 -0
- package/dist/esm/wallet/vtxo-manager.js +1 -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/adapters/expo-db.d.ts +7 -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/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/db/manager.d.ts +22 -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 +21 -12
- package/dist/types/intent/index.d.ts +2 -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 +56 -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/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/utils/txSizeEstimator.d.ts +12 -2
- 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/onchain.d.ts +22 -1
- 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 +13 -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 +71 -17
- 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
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.__resetServiceWorkerManager = void 0;
|
|
4
|
+
exports.setupServiceWorkerOnce = setupServiceWorkerOnce;
|
|
5
|
+
exports.getActiveServiceWorker = getActiveServiceWorker;
|
|
6
|
+
const registrations = new Map();
|
|
7
|
+
function ensureServiceWorkerSupport() {
|
|
8
|
+
if (!("serviceWorker" in navigator)) {
|
|
9
|
+
throw new Error("Service workers are not supported in this browser");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function registerOnce(path) {
|
|
13
|
+
if (!registrations.has(path)) {
|
|
14
|
+
const registrationPromise = navigator.serviceWorker
|
|
15
|
+
.register(path)
|
|
16
|
+
.then(async (registration) => {
|
|
17
|
+
try {
|
|
18
|
+
await registration.update();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.warn("Service worker update failed; continuing with registration", error);
|
|
22
|
+
}
|
|
23
|
+
return registration;
|
|
24
|
+
})
|
|
25
|
+
.catch((error) => {
|
|
26
|
+
// delete failed registration to allow retrials
|
|
27
|
+
registrations.delete(path);
|
|
28
|
+
throw error;
|
|
29
|
+
});
|
|
30
|
+
registrations.set(path, registrationPromise);
|
|
31
|
+
}
|
|
32
|
+
return registrations.get(path);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Registers a service worker for the given path only once and caches the
|
|
36
|
+
* registration promise for subsequent calls.
|
|
37
|
+
*
|
|
38
|
+
* @param path - Service worker script path to register.
|
|
39
|
+
* @throws if service workers are not supported or registration fails.
|
|
40
|
+
*/
|
|
41
|
+
async function setupServiceWorkerOnce(path) {
|
|
42
|
+
ensureServiceWorkerSupport();
|
|
43
|
+
return registerOnce(path);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Returns an active service worker instance, optionally ensuring a specific
|
|
47
|
+
* script path is registered before resolving.
|
|
48
|
+
*
|
|
49
|
+
* @param path - Optional service worker script path to register and prefer.
|
|
50
|
+
* @throws if service workers are not supported or no active worker is available.
|
|
51
|
+
*/
|
|
52
|
+
async function getActiveServiceWorker(path) {
|
|
53
|
+
ensureServiceWorkerSupport();
|
|
54
|
+
// Avoid mixing registrations when a specific script path is provided.
|
|
55
|
+
const registration = path
|
|
56
|
+
? await registerOnce(path)
|
|
57
|
+
: await navigator.serviceWorker.ready;
|
|
58
|
+
let serviceWorker = registration.active ||
|
|
59
|
+
registration.waiting ||
|
|
60
|
+
registration.installing ||
|
|
61
|
+
navigator.serviceWorker.controller;
|
|
62
|
+
if (!serviceWorker && path) {
|
|
63
|
+
const readyRegistration = await navigator.serviceWorker.ready;
|
|
64
|
+
serviceWorker =
|
|
65
|
+
readyRegistration.active ||
|
|
66
|
+
readyRegistration.waiting ||
|
|
67
|
+
readyRegistration.installing ||
|
|
68
|
+
navigator.serviceWorker.controller;
|
|
69
|
+
}
|
|
70
|
+
if (!serviceWorker) {
|
|
71
|
+
throw new Error("Service worker not ready yet");
|
|
72
|
+
}
|
|
73
|
+
return serviceWorker;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Clears the cached registration promises.
|
|
77
|
+
* Intended for tests to reset state between runs.
|
|
78
|
+
*/
|
|
79
|
+
const __resetServiceWorkerManager = () => {
|
|
80
|
+
registrations.clear();
|
|
81
|
+
};
|
|
82
|
+
exports.__resetServiceWorkerManager = __resetServiceWorkerManager;
|
|
@@ -6,9 +6,10 @@ exports.DEFAULT_DB_NAME = "arkade-service-worker";
|
|
|
6
6
|
/**
|
|
7
7
|
* setupServiceWorker sets up the service worker.
|
|
8
8
|
* @param path - the path to the service worker script
|
|
9
|
+
* @throws if service workers are not supported or activation fails
|
|
9
10
|
* @example
|
|
10
11
|
* ```typescript
|
|
11
|
-
* const
|
|
12
|
+
* const worker = await setupServiceWorker("/service-worker.js");
|
|
12
13
|
* ```
|
|
13
14
|
*/
|
|
14
15
|
async function setupServiceWorker(path) {
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsyncStorageTaskQueue = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* AsyncStorage-backed TaskQueue for Expo/React Native.
|
|
6
|
+
*
|
|
7
|
+
* Persists inbox, outbox, and an optional config blob to AsyncStorage
|
|
8
|
+
* so that data survives process restarts and can be shared between
|
|
9
|
+
* foreground and background execution contexts.
|
|
10
|
+
*/
|
|
11
|
+
class AsyncStorageTaskQueue {
|
|
12
|
+
constructor(storage, prefix = "ark:task-queue") {
|
|
13
|
+
this.storage = storage;
|
|
14
|
+
this.inboxKey = `${prefix}:inbox`;
|
|
15
|
+
this.outboxKey = `${prefix}:outbox`;
|
|
16
|
+
this.configKey = `${prefix}:config`;
|
|
17
|
+
}
|
|
18
|
+
// ── Inbox ────────────────────────────────────────────────────────
|
|
19
|
+
async addTask(task) {
|
|
20
|
+
const tasks = await this.readList(this.inboxKey);
|
|
21
|
+
tasks.push(task);
|
|
22
|
+
await this.writeList(this.inboxKey, tasks);
|
|
23
|
+
}
|
|
24
|
+
async removeTask(id) {
|
|
25
|
+
const tasks = await this.readList(this.inboxKey);
|
|
26
|
+
await this.writeList(this.inboxKey, tasks.filter((t) => t.id !== id));
|
|
27
|
+
}
|
|
28
|
+
async getTasks(type) {
|
|
29
|
+
const tasks = await this.readList(this.inboxKey);
|
|
30
|
+
if (type) {
|
|
31
|
+
return tasks.filter((t) => t.type === type);
|
|
32
|
+
}
|
|
33
|
+
return tasks;
|
|
34
|
+
}
|
|
35
|
+
async clearTasks() {
|
|
36
|
+
await this.storage.removeItem(this.inboxKey);
|
|
37
|
+
}
|
|
38
|
+
// ── Outbox ───────────────────────────────────────────────────────
|
|
39
|
+
async pushResult(result) {
|
|
40
|
+
const results = await this.readList(this.outboxKey);
|
|
41
|
+
results.push(result);
|
|
42
|
+
await this.writeList(this.outboxKey, results);
|
|
43
|
+
}
|
|
44
|
+
async getResults() {
|
|
45
|
+
return this.readList(this.outboxKey);
|
|
46
|
+
}
|
|
47
|
+
async acknowledgeResults(ids) {
|
|
48
|
+
const idSet = new Set(ids);
|
|
49
|
+
const results = await this.readList(this.outboxKey);
|
|
50
|
+
await this.writeList(this.outboxKey, results.filter((r) => !idSet.has(r.id)));
|
|
51
|
+
}
|
|
52
|
+
// ── Config persistence (for background handler rehydration) ──────
|
|
53
|
+
/**
|
|
54
|
+
* Persist a config blob alongside the queue data.
|
|
55
|
+
* Used by {@link ExpoWallet.setup} to store the wallet parameters
|
|
56
|
+
* that the background handler needs to reconstruct providers.
|
|
57
|
+
*/
|
|
58
|
+
async persistConfig(config) {
|
|
59
|
+
await this.storage.setItem(this.configKey, JSON.stringify(config));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load the persisted config blob.
|
|
63
|
+
* Used by the background handler to rehydrate wallet dependencies.
|
|
64
|
+
*/
|
|
65
|
+
async loadConfig() {
|
|
66
|
+
const raw = await this.storage.getItem(this.configKey);
|
|
67
|
+
return raw ? JSON.parse(raw) : null;
|
|
68
|
+
}
|
|
69
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
70
|
+
async readList(key) {
|
|
71
|
+
const raw = await this.storage.getItem(key);
|
|
72
|
+
return raw ? JSON.parse(raw) : [];
|
|
73
|
+
}
|
|
74
|
+
async writeList(key, list) {
|
|
75
|
+
await this.storage.setItem(key, JSON.stringify(list));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.AsyncStorageTaskQueue = AsyncStorageTaskQueue;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONTRACT_POLL_TASK_TYPE = exports.contractPollProcessor = exports.runTasks = exports.AsyncStorageTaskQueue = exports.InMemoryTaskQueue = void 0;
|
|
4
|
+
var taskQueue_1 = require("./taskQueue");
|
|
5
|
+
Object.defineProperty(exports, "InMemoryTaskQueue", { enumerable: true, get: function () { return taskQueue_1.InMemoryTaskQueue; } });
|
|
6
|
+
var asyncStorageTaskQueue_1 = require("./asyncStorageTaskQueue");
|
|
7
|
+
Object.defineProperty(exports, "AsyncStorageTaskQueue", { enumerable: true, get: function () { return asyncStorageTaskQueue_1.AsyncStorageTaskQueue; } });
|
|
8
|
+
var taskRunner_1 = require("./taskRunner");
|
|
9
|
+
Object.defineProperty(exports, "runTasks", { enumerable: true, get: function () { return taskRunner_1.runTasks; } });
|
|
10
|
+
var processors_1 = require("./processors");
|
|
11
|
+
Object.defineProperty(exports, "contractPollProcessor", { enumerable: true, get: function () { return processors_1.contractPollProcessor; } });
|
|
12
|
+
Object.defineProperty(exports, "CONTRACT_POLL_TASK_TYPE", { enumerable: true, get: function () { return processors_1.CONTRACT_POLL_TASK_TYPE; } });
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contractPollProcessor = exports.CONTRACT_POLL_TASK_TYPE = void 0;
|
|
4
|
+
exports.CONTRACT_POLL_TASK_TYPE = "contract-poll";
|
|
5
|
+
/**
|
|
6
|
+
* Polls the indexer for the latest VTXO state of every contract and
|
|
7
|
+
* persists the results to the wallet repository.
|
|
8
|
+
*
|
|
9
|
+
* Replicates the polling subset of {@link ContractManager.initialize}:
|
|
10
|
+
* 1. Load all contracts from the contract repository.
|
|
11
|
+
* 2. Mark expired active contracts as inactive.
|
|
12
|
+
* 3. Paginated fetch of spendable VTXOs from the indexer.
|
|
13
|
+
* 4. Extend each VTXO with tapscript data.
|
|
14
|
+
* 5. Save to the wallet repository.
|
|
15
|
+
*/
|
|
16
|
+
exports.contractPollProcessor = {
|
|
17
|
+
taskType: exports.CONTRACT_POLL_TASK_TYPE,
|
|
18
|
+
async execute(item, deps) {
|
|
19
|
+
const { contractRepository, walletRepository, indexerProvider, extendVtxo, } = deps;
|
|
20
|
+
const contracts = await contractRepository.getContracts();
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
let contractsProcessed = 0;
|
|
23
|
+
let vtxosSaved = 0;
|
|
24
|
+
for (const contract of contracts) {
|
|
25
|
+
// Mark expired active contracts as inactive
|
|
26
|
+
if (contract.state === "active" &&
|
|
27
|
+
contract.expiresAt &&
|
|
28
|
+
contract.expiresAt <= now) {
|
|
29
|
+
contract.state = "inactive";
|
|
30
|
+
await contractRepository.saveContract(contract);
|
|
31
|
+
}
|
|
32
|
+
// Paginated fetch of spendable VTXOs
|
|
33
|
+
const pageSize = 100;
|
|
34
|
+
let pageIndex = 0;
|
|
35
|
+
let hasMore = true;
|
|
36
|
+
const allVtxos = [];
|
|
37
|
+
while (hasMore) {
|
|
38
|
+
const { vtxos, page } = await indexerProvider.getVtxos({
|
|
39
|
+
scripts: [contract.script],
|
|
40
|
+
spendableOnly: true,
|
|
41
|
+
pageIndex,
|
|
42
|
+
pageSize,
|
|
43
|
+
});
|
|
44
|
+
for (const vtxo of vtxos) {
|
|
45
|
+
allVtxos.push(extendVtxo(vtxo, contract));
|
|
46
|
+
}
|
|
47
|
+
hasMore = page ? vtxos.length === pageSize : false;
|
|
48
|
+
pageIndex++;
|
|
49
|
+
}
|
|
50
|
+
await walletRepository.saveVtxos(contract.address, allVtxos);
|
|
51
|
+
vtxosSaved += allVtxos.length;
|
|
52
|
+
contractsProcessed++;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
taskItemId: item.id,
|
|
56
|
+
type: exports.CONTRACT_POLL_TASK_TYPE,
|
|
57
|
+
status: "success",
|
|
58
|
+
data: { contractsProcessed, vtxosSaved },
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONTRACT_POLL_TASK_TYPE = exports.contractPollProcessor = void 0;
|
|
4
|
+
var contractPollProcessor_1 = require("./contractPollProcessor");
|
|
5
|
+
Object.defineProperty(exports, "contractPollProcessor", { enumerable: true, get: function () { return contractPollProcessor_1.contractPollProcessor; } });
|
|
6
|
+
Object.defineProperty(exports, "CONTRACT_POLL_TASK_TYPE", { enumerable: true, get: function () { return contractPollProcessor_1.CONTRACT_POLL_TASK_TYPE; } });
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryTaskQueue = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory TaskQueue for testing and lightweight use.
|
|
6
|
+
* State is lost when the process exits.
|
|
7
|
+
*/
|
|
8
|
+
class InMemoryTaskQueue {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.inbox = new Map();
|
|
11
|
+
this.outbox = new Map();
|
|
12
|
+
}
|
|
13
|
+
async addTask(task) {
|
|
14
|
+
this.inbox.set(task.id, task);
|
|
15
|
+
}
|
|
16
|
+
async removeTask(id) {
|
|
17
|
+
this.inbox.delete(id);
|
|
18
|
+
}
|
|
19
|
+
async getTasks(type) {
|
|
20
|
+
const tasks = Array.from(this.inbox.values());
|
|
21
|
+
if (type) {
|
|
22
|
+
return tasks.filter((t) => t.type === type);
|
|
23
|
+
}
|
|
24
|
+
return tasks;
|
|
25
|
+
}
|
|
26
|
+
async clearTasks() {
|
|
27
|
+
this.inbox.clear();
|
|
28
|
+
}
|
|
29
|
+
async pushResult(result) {
|
|
30
|
+
this.outbox.set(result.id, result);
|
|
31
|
+
}
|
|
32
|
+
async getResults() {
|
|
33
|
+
return Array.from(this.outbox.values());
|
|
34
|
+
}
|
|
35
|
+
async acknowledgeResults(ids) {
|
|
36
|
+
for (const id of ids) {
|
|
37
|
+
this.outbox.delete(id);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.InMemoryTaskQueue = InMemoryTaskQueue;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runTasks = runTasks;
|
|
4
|
+
const utils_1 = require("../../wallet/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Run all pending tasks from the queue through matching processors.
|
|
7
|
+
*
|
|
8
|
+
* For each task in the inbox:
|
|
9
|
+
* 1. Find the processor whose `taskType` matches `task.type`.
|
|
10
|
+
* 2. Execute it, producing a {@link TaskResult}.
|
|
11
|
+
* 3. Push the result to the outbox and remove the task from the inbox.
|
|
12
|
+
*
|
|
13
|
+
* Tasks with no matching processor produce a `"noop"` result.
|
|
14
|
+
* Processor errors produce a `"failed"` result with the error message.
|
|
15
|
+
*/
|
|
16
|
+
async function runTasks(queue, processors, deps) {
|
|
17
|
+
const tasks = await queue.getTasks();
|
|
18
|
+
const processorMap = new Map(processors.map((p) => [p.taskType, p]));
|
|
19
|
+
const results = [];
|
|
20
|
+
for (const task of tasks) {
|
|
21
|
+
const processor = processorMap.get(task.type);
|
|
22
|
+
let partial;
|
|
23
|
+
if (!processor) {
|
|
24
|
+
partial = {
|
|
25
|
+
taskItemId: task.id,
|
|
26
|
+
type: task.type,
|
|
27
|
+
status: "noop",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
try {
|
|
32
|
+
partial = await processor.execute(task, deps);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
partial = {
|
|
36
|
+
taskItemId: task.id,
|
|
37
|
+
type: task.type,
|
|
38
|
+
status: "failed",
|
|
39
|
+
data: {
|
|
40
|
+
error: error instanceof Error
|
|
41
|
+
? error.message
|
|
42
|
+
: String(error),
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const result = {
|
|
48
|
+
...partial,
|
|
49
|
+
id: (0, utils_1.getRandomId)(),
|
|
50
|
+
executedAt: Date.now(),
|
|
51
|
+
};
|
|
52
|
+
await queue.pushResult(result);
|
|
53
|
+
await queue.removeTask(task.id);
|
|
54
|
+
results.push(result);
|
|
55
|
+
}
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/// <reference lib="webworker" />
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MessageBus = void 0;
|
|
5
|
+
const service_worker_manager_1 = require("./browser/service-worker-manager");
|
|
6
|
+
const ark_1 = require("../providers/ark");
|
|
7
|
+
const identity_1 = require("../identity");
|
|
8
|
+
const wallet_1 = require("../wallet/wallet");
|
|
9
|
+
const base_1 = require("@scure/base");
|
|
10
|
+
class MessageBus {
|
|
11
|
+
constructor(walletRepository, contractRepository, { messageHandlers, tickIntervalMs = 10000, debug = false, buildServices, }) {
|
|
12
|
+
this.walletRepository = walletRepository;
|
|
13
|
+
this.contractRepository = contractRepository;
|
|
14
|
+
this.running = false;
|
|
15
|
+
this.tickTimeout = null;
|
|
16
|
+
this.tickInProgress = false;
|
|
17
|
+
this.debug = false;
|
|
18
|
+
this.initialized = false;
|
|
19
|
+
this.handlers = new Map(messageHandlers.map((u) => [u.messageTag, u]));
|
|
20
|
+
this.tickIntervalMs = tickIntervalMs;
|
|
21
|
+
this.debug = debug;
|
|
22
|
+
this.buildServicesFn = buildServices ?? this.buildServices.bind(this);
|
|
23
|
+
}
|
|
24
|
+
async start() {
|
|
25
|
+
if (this.running)
|
|
26
|
+
return;
|
|
27
|
+
this.running = true;
|
|
28
|
+
if (this.debug)
|
|
29
|
+
console.log("MessageBus starting");
|
|
30
|
+
// Hook message routing
|
|
31
|
+
self.addEventListener("message", this.onMessage.bind(this));
|
|
32
|
+
// activate service worker immediately
|
|
33
|
+
self.addEventListener("install", () => {
|
|
34
|
+
self.skipWaiting();
|
|
35
|
+
});
|
|
36
|
+
// take control of clients immediately
|
|
37
|
+
self.addEventListener("activate", () => {
|
|
38
|
+
self.clients.claim();
|
|
39
|
+
if (this.initialized) {
|
|
40
|
+
this.runTick();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async stop() {
|
|
45
|
+
if (this.debug)
|
|
46
|
+
console.log("MessageBus stopping");
|
|
47
|
+
this.running = false;
|
|
48
|
+
this.tickInProgress = false;
|
|
49
|
+
this.initialized = false;
|
|
50
|
+
if (this.tickTimeout !== null) {
|
|
51
|
+
self.clearTimeout(this.tickTimeout);
|
|
52
|
+
this.tickTimeout = null;
|
|
53
|
+
}
|
|
54
|
+
self.removeEventListener("message", this.onMessage.bind(this));
|
|
55
|
+
await Promise.all(Array.from(this.handlers.values()).map((updater) => updater.stop()));
|
|
56
|
+
}
|
|
57
|
+
scheduleNextTick() {
|
|
58
|
+
if (!this.running)
|
|
59
|
+
return;
|
|
60
|
+
if (this.tickTimeout !== null)
|
|
61
|
+
return;
|
|
62
|
+
if (this.tickInProgress)
|
|
63
|
+
return;
|
|
64
|
+
this.tickTimeout = self.setTimeout(() => this.runTick(), this.tickIntervalMs);
|
|
65
|
+
}
|
|
66
|
+
async runTick() {
|
|
67
|
+
if (!this.running)
|
|
68
|
+
return;
|
|
69
|
+
if (this.tickInProgress)
|
|
70
|
+
return;
|
|
71
|
+
this.tickInProgress = true;
|
|
72
|
+
if (this.tickTimeout !== null) {
|
|
73
|
+
self.clearTimeout(this.tickTimeout);
|
|
74
|
+
this.tickTimeout = null;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
for (const updater of this.handlers.values()) {
|
|
79
|
+
try {
|
|
80
|
+
const response = await updater.tick(now);
|
|
81
|
+
if (this.debug)
|
|
82
|
+
console.log(`[${updater.messageTag}] outgoing tick response:`, response);
|
|
83
|
+
if (response && response.length > 0) {
|
|
84
|
+
self.clients
|
|
85
|
+
.matchAll({
|
|
86
|
+
includeUncontrolled: true,
|
|
87
|
+
type: "window",
|
|
88
|
+
})
|
|
89
|
+
.then((clients) => {
|
|
90
|
+
for (const message of response) {
|
|
91
|
+
clients.forEach((client) => {
|
|
92
|
+
client.postMessage(message);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (this.debug)
|
|
100
|
+
console.error(`[${updater.messageTag}] tick failed`, err);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
this.tickInProgress = false;
|
|
106
|
+
this.scheduleNextTick();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async waitForInit(config) {
|
|
110
|
+
if (this.initialized)
|
|
111
|
+
return;
|
|
112
|
+
const services = await this.buildServicesFn(config);
|
|
113
|
+
// Start all handlers
|
|
114
|
+
for (const updater of this.handlers.values()) {
|
|
115
|
+
if (this.debug)
|
|
116
|
+
console.log(`Starting updater: ${updater.messageTag}`);
|
|
117
|
+
await updater.start(services, {
|
|
118
|
+
walletRepository: this.walletRepository,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// Kick off scheduler
|
|
122
|
+
this.scheduleNextTick();
|
|
123
|
+
this.initialized = true;
|
|
124
|
+
}
|
|
125
|
+
async buildServices(config) {
|
|
126
|
+
const arkProvider = new ark_1.RestArkProvider(config.arkServer.url);
|
|
127
|
+
const storage = {
|
|
128
|
+
walletRepository: this.walletRepository,
|
|
129
|
+
contractRepository: this.contractRepository,
|
|
130
|
+
};
|
|
131
|
+
if ("privateKey" in config.wallet) {
|
|
132
|
+
const identity = identity_1.SingleKey.fromHex(config.wallet.privateKey);
|
|
133
|
+
const wallet = await wallet_1.Wallet.create({
|
|
134
|
+
identity,
|
|
135
|
+
arkServerUrl: config.arkServer.url,
|
|
136
|
+
arkServerPublicKey: config.arkServer.publicKey,
|
|
137
|
+
storage,
|
|
138
|
+
});
|
|
139
|
+
return { wallet, arkProvider, readonlyWallet: wallet };
|
|
140
|
+
}
|
|
141
|
+
else if ("publicKey" in config.wallet) {
|
|
142
|
+
const identity = identity_1.ReadonlySingleKey.fromPublicKey(base_1.hex.decode(config.wallet.publicKey));
|
|
143
|
+
const readonlyWallet = await wallet_1.ReadonlyWallet.create({
|
|
144
|
+
identity,
|
|
145
|
+
arkServerUrl: config.arkServer.url,
|
|
146
|
+
arkServerPublicKey: config.arkServer.publicKey,
|
|
147
|
+
storage,
|
|
148
|
+
});
|
|
149
|
+
return { readonlyWallet, arkProvider };
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
throw new Error("Missing privateKey or publicKey in configuration object");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async onMessage(event) {
|
|
156
|
+
const { id, tag, broadcast } = event.data;
|
|
157
|
+
if (tag === "INITIALIZE_MESSAGE_BUS") {
|
|
158
|
+
if (this.debug) {
|
|
159
|
+
console.log("Init Command received");
|
|
160
|
+
}
|
|
161
|
+
await this.waitForInit(event.data.config);
|
|
162
|
+
event.source?.postMessage({ id, tag });
|
|
163
|
+
if (this.debug) {
|
|
164
|
+
console.log("MessageBus initialized");
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (!this.initialized) {
|
|
169
|
+
if (this.debug)
|
|
170
|
+
console.warn("Event received before initialization, dropping", event.data);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (!id || !tag) {
|
|
174
|
+
if (this.debug)
|
|
175
|
+
console.error("Invalid message received, missing required fields:", event.data);
|
|
176
|
+
event.source?.postMessage({
|
|
177
|
+
id,
|
|
178
|
+
tag: tag ?? "unknown",
|
|
179
|
+
error: new TypeError("Invalid message received, missing required fields"),
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (broadcast) {
|
|
184
|
+
const updaters = Array.from(this.handlers.values());
|
|
185
|
+
const results = await Promise.allSettled(updaters.map((updater) => updater.handleMessage(event.data)));
|
|
186
|
+
results.forEach((result, index) => {
|
|
187
|
+
const updater = updaters[index];
|
|
188
|
+
if (result.status === "fulfilled") {
|
|
189
|
+
const response = result.value;
|
|
190
|
+
if (response) {
|
|
191
|
+
event.source?.postMessage(response);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
if (this.debug)
|
|
196
|
+
console.error(`[${updater.messageTag}] handleMessage failed`, result.reason);
|
|
197
|
+
const error = result.reason instanceof Error
|
|
198
|
+
? result.reason
|
|
199
|
+
: new Error(String(result.reason));
|
|
200
|
+
event.source?.postMessage({
|
|
201
|
+
id,
|
|
202
|
+
tag: updater.messageTag,
|
|
203
|
+
error,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const updater = this.handlers.get(tag);
|
|
210
|
+
if (!updater) {
|
|
211
|
+
if (this.debug)
|
|
212
|
+
console.warn(`[${tag}] unknown message tag, ignoring message`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const response = await updater.handleMessage(event.data);
|
|
217
|
+
if (this.debug)
|
|
218
|
+
console.log(`[${tag}] outgoing response:`, response);
|
|
219
|
+
if (response) {
|
|
220
|
+
event.source?.postMessage(response);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
if (this.debug)
|
|
225
|
+
console.error(`[${tag}] handleMessage failed`, err);
|
|
226
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
227
|
+
event.source?.postMessage({ id, tag, error });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Returns the registered SW for the path.
|
|
232
|
+
* It uses the functions in `service-worker-manager.ts` module.
|
|
233
|
+
* @param path
|
|
234
|
+
* @return the Service Worker
|
|
235
|
+
* @throws if not running in a browser environment
|
|
236
|
+
*/
|
|
237
|
+
static async getServiceWorker(path) {
|
|
238
|
+
return (0, service_worker_manager_1.getActiveServiceWorker)(path);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Set up and register the Service Worker, ensuring it's done once at most.
|
|
242
|
+
* It uses the functions in `service-worker-manager.ts` module.
|
|
243
|
+
* @param path
|
|
244
|
+
* @return the Service Worker
|
|
245
|
+
* @throws if not running in a browser environment
|
|
246
|
+
*/
|
|
247
|
+
static async setup(path) {
|
|
248
|
+
await (0, service_worker_manager_1.setupServiceWorkerOnce)(path);
|
|
249
|
+
return (0, service_worker_manager_1.getActiveServiceWorker)(path);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.MessageBus = MessageBus;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Expo IndexedDB polyfill — requires expo-sqlite and indexeddbshim.
|
|
2
|
+
//
|
|
3
|
+
// Separated from ./expo so that consumers who only need the streaming
|
|
4
|
+
// providers (ExpoArkProvider, ExpoIndexerProvider) don't pull in a
|
|
5
|
+
// hard dependency on expo-sqlite at bundle time.
|
|
6
|
+
import setGlobalVars from "indexeddbshim";
|
|
7
|
+
import { openDatabase } from '../repositories/indexedDB/websqlAdapter.js';
|
|
8
|
+
export { openDatabase } from '../repositories/indexedDB/websqlAdapter.js';
|
|
9
|
+
let _initialized = false;
|
|
10
|
+
export function setupExpoDb(options) {
|
|
11
|
+
if (_initialized)
|
|
12
|
+
return;
|
|
13
|
+
const { origin = "expo://localhost", checkOrigin = false, cacheDatabaseInstances = true, } = options ?? {};
|
|
14
|
+
if (typeof globalThis.window === "undefined") {
|
|
15
|
+
globalThis.window = globalThis;
|
|
16
|
+
}
|
|
17
|
+
if (typeof globalThis.location === "undefined") {
|
|
18
|
+
globalThis.location = { origin };
|
|
19
|
+
}
|
|
20
|
+
globalThis.openDatabase = openDatabase;
|
|
21
|
+
setGlobalVars(globalThis, {
|
|
22
|
+
checkOrigin,
|
|
23
|
+
useSQLiteIndexes: true,
|
|
24
|
+
cacheDatabaseInstances,
|
|
25
|
+
});
|
|
26
|
+
_initialized = true;
|
|
27
|
+
}
|