diff --git a/src/service-workers/database.worker.js b/src/service-workers/database.worker.js index be596d0..78cc01c 100755 --- a/src/service-workers/database.worker.js +++ b/src/service-workers/database.worker.js @@ -16,29 +16,18 @@ self.addEventListener('message', async (event) => { const db = await openDatabase(); const tx = db.transaction(storeName, 'readwrite'); const store = tx.objectStore(storeName); - await store.put({ - ...object, - modified: Date.now() - }); - event.ports[0].postMessage({ status: 'success', message: 'Object added or replaced successfully' }); + + if (key) { + await store.put(object, key); + } else { + await store.put(object); + } + + event.ports[0].postMessage({ status: 'success', message: '' }); } catch (error) { event.ports[0].postMessage({ status: 'error', message: error.message }); } } - - if (data.type === 'GET_OBJECT') { - const { storeName, key } = data.payload; - const db = await openDatabase(); - const tx = db.transaction(storeName, 'readonly'); - const store = tx.objectStore(storeName); - const result = await new Promise((resolve, reject) => { - const getRequest = store.get(key); - getRequest.onsuccess = (event) => resolve(getRequest.result); - getRequest.onerror = (event) => reject(getRequest.error); - }); - - event.ports[0].postMessage({ type: 'GET_OBJECT_RESULT', payload: result }); - } }); async function openDatabase() { diff --git a/src/services/database.service.ts b/src/services/database.service.ts index fc8f989..53225b7 100755 --- a/src/services/database.service.ts +++ b/src/services/database.service.ts @@ -17,9 +17,14 @@ class Database { options: { keyPath: 'id' }, indices: [], }, - AnkMessages: { - name: 'messages', - options: { keyPath: 'id' }, + AnkSharedSecrets: { + name: 'shared_secrets', + options: { keyPath: 'key' }, + indices: [], + }, + AnkUnconfirmedSecrets: { + name: 'unconfirmed_secrets', + options: { autoIncrement: true }, indices: [], }, AnkProcessData: { @@ -139,50 +144,52 @@ class Database { console.log('Received response from service worker (GET_OBJECT):', event.data); }; - public async addObject(payload: { storeName: string; object: any; key: any }) { - if (this.serviceWorkerRegistration?.active) { - const messageChannel = this.createMessageChannel(this.handleAddObjectResponse); - this.serviceWorkerRegistration.active.postMessage( - { - type: 'ADD_OBJECT', - payload, - }, - [messageChannel.port2], - ); - } else { - const { storeName, object } = payload; - const db = await openDatabase(); - const tx = db.transaction(storeName, 'readwrite'); - const store = tx.objectStore(storeName); - await store.put({ - ...object, - modified: Date.now() - }); - } + public addObject(payload: { storeName: string; object: any; key: any }): Promise { + return new Promise((resolve, reject) => { + // Check if the service worker is active + if (!this.serviceWorkerRegistration?.active) { + reject(new Error('Service worker is not active')); + return; + } + + // Create a message channel for communication + const messageChannel = new MessageChannel(); + + // Handle the response from the service worker + messageChannel.port1.onmessage = (event) => { + if (event.data.status === 'success') { + resolve(); + } else { + const error = event.data.message; + reject(new Error(error || 'Unknown error occurred while adding object')); + } + }; + + // Send the add object request to the service worker + try { + this.serviceWorkerRegistration.active.postMessage( + { + type: 'ADD_OBJECT', + payload, + }, + [messageChannel.port2], + ); + } catch (error) { + reject(new Error(`Failed to send message to service worker: ${error}`)); + } + }); } - public async getObject(storeName: string, key: string) { - if (this.serviceWorkerRegistration?.active) { - const messageChannel = this.createMessageChannel(this.handleGetObjectResponse); - - this.serviceWorkerRegistration.active.postMessage( - { - type: 'GET_OBJECT', - payload: { storeName, key }, - }, - [messageChannel.port2], - ); - } else { - const db = await openDatabase(); - const tx = db.transaction(storeName, 'readonly'); - const store = tx.objectStore(storeName); - const result = await new Promise((resolve, reject) => { - const getRequest = store.get(key); - getRequest.onsuccess = () => resolve(getRequest.result); - getRequest.onerror = () => reject(getRequest.error); - }); - console.log("🚀 ~ Database ~ result ~ result:", result) - } + public async getObject(storeName: string, key: string): Promise { + const db = await this.getDb(); + const tx = db.transaction(storeName, 'readonly'); + const store = tx.objectStore(storeName); + const result = await new Promise((resolve, reject) => { + const getRequest = store.get(key); + getRequest.onsuccess = () => resolve(getRequest.result); + getRequest.onerror = () => reject(getRequest.error); + }); + return result } } diff --git a/src/services/service.ts b/src/services/service.ts index fbbb8db..fcbae1d 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -297,18 +297,30 @@ export default class Services { async saveDevice(device: any): Promise { const db = await Database.getInstance(); - db.addObject({ - storeName: 'wallet', - object: { pre_id: '1', device }, - key: '1', - }); - localStorage.setItem('wallet', device); + try { + await db.addObject({ + storeName: 'wallet', + object: { pre_id: '1', device }, + key: null, + }); + } catch (e) { + console.error(e); + } } async getDevice(): Promise { const db = await Database.getInstance(); - db.getObject('wallet', '1'); - return localStorage.getItem('wallet'); + try { + const dbRes = await db.getObject('wallet', '1'); + if (dbRes) { + const wallet = dbRes['device']; + return wallet; + } else { + return null; + } + } catch (e) { + throw new Error(`Failed to retrieve device from db: ${e}`); + } } async dumpWallet() {