From 8a356fe2fdc8d0f1e129b8b5765c0be9265b2aa3 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Thu, 27 Nov 2025 16:49:43 +0100 Subject: [PATCH] Add generic db operations --- src/services/database.service.ts | 173 +++++++++++++------------------ 1 file changed, 73 insertions(+), 100 deletions(-) diff --git a/src/services/database.service.ts b/src/services/database.service.ts index 8f5224d..36b796b 100755 --- a/src/services/database.service.ts +++ b/src/services/database.service.ts @@ -279,117 +279,90 @@ export class Database { } } - private handleAddObjectResponse = async (event: MessageEvent) => { - const data = event.data; - console.log('Received response from service worker (ADD_OBJECT):', data); - const service = await Services.getInstance(); - if (data.type === 'NOTIFICATIONS') { - service.setNotifications(data.data); - } else if (data.type === 'TO_DOWNLOAD') { - console.log(`Received missing data ${data}`); - // Download the missing data - let requestedStateId: string[] = []; - for (const hash of data.data) { - try { - const valueBytes = await service.fetchValueFromStorage(hash); - if (valueBytes) { - // Save data to db - const blob = new Blob([valueBytes], { type: 'application/octet-stream' }); - await service.saveBlobToDb(hash, blob); - } else { - // We first request the data from managers - console.log('Request data from managers of the process'); - // get the diff from db - const diff = await service.getDiffByValue(hash); - if (diff === null) { - continue; - } - const processId = diff!.process_id; - const stateId = diff!.state_id; - const roles = diff!.roles; - if (!requestedStateId.includes(stateId)) { - await service.requestDataFromPeers(processId, [stateId], [roles]); - requestedStateId.push(stateId); - } - } - } catch (e) { - console.error(e); - } - } + // ============================================ + // GENERIC INDEXEDDB OPERATIONS + // ============================================ + + public async getStoreList(): Promise<{ [key: string]: string }> { + return this.sendMessageToWorker('GET_STORE_LIST', {}); + } + + public async addObject(payload: { storeName: string; object: any; key: any }): Promise { + await this.sendMessageToWorker('ADD_OBJECT', payload); + } + + public async batchWriting(payload: { storeName: string; objects: { key: any; object: any }[] }): Promise { + await this.sendMessageToWorker('BATCH_WRITING', payload); + } + + public async getObject(storeName: string, key: string): Promise { + return this.sendMessageToWorker('GET_OBJECT', { storeName, key }); + } + + public async dumpStore(storeName: string): Promise> { + return this.sendMessageToWorker('DUMP_STORE', { storeName }); + } + + public async deleteObject(storeName: string, key: string): Promise { + await this.sendMessageToWorker('DELETE_OBJECT', { storeName, key }); + } + + public async clearStore(storeName: string): Promise { + await this.sendMessageToWorker('CLEAR_STORE', { storeName }); + } + + public async requestStoreByIndex(storeName: string, indexName: string, request: string): Promise { + return this.sendMessageToWorker('REQUEST_STORE_BY_INDEX', { storeName, indexName, request }); + } + + public async clearMultipleStores(storeNames: string[]): Promise { + for (const storeName of storeNames) { + await this.clearStore(storeName); } - }; + } - private handleGetObjectResponse = (event: MessageEvent) => { - console.log('Received response from service worker (GET_OBJECT):', event.data); - }; + // ============================================ + // BUSINESS METHODS - DEVICE + // ============================================ - public addObject(payload: { storeName: string; object: any; key: any }): Promise { - return new Promise(async (resolve, reject) => { - // Check if the service worker is active - if (!this.serviceWorkerRegistration) { - // console.warn('Service worker registration is not ready. Waiting...'); - this.serviceWorkerRegistration = await navigator.serviceWorker.ready; + public async saveDevice(device: any): Promise { + try { + const existing = await this.getObject('wallet', '1'); + if (existing) { + await this.deleteObject('wallet', '1'); } + } catch (e) {} - const activeWorker = await this.waitForServiceWorkerActivation(this.serviceWorkerRegistration); - - // 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 { - activeWorker?.postMessage( - { - type: 'ADD_OBJECT', - payload, - }, - [messageChannel.port2], - ); - } catch (error) { - reject(new Error(`Failed to send message to service worker: ${error}`)); - } + await this.addObject({ + storeName: 'wallet', + object: { pre_id: '1', device }, + key: null, }); } - public batchWriting(payload: { storeName: string; objects: { key: any; object: any }[] }): Promise { - return new Promise(async (resolve, reject) => { - if (!this.serviceWorkerRegistration) { - this.serviceWorkerRegistration = await navigator.serviceWorker.ready; - } + public async getDevice(): Promise { + const result = await this.getObject('wallet', '1'); + return result ? result['device'] : null; + } - const activeWorker = await this.waitForServiceWorkerActivation(this.serviceWorkerRegistration); - const messageChannel = new MessageChannel(); + // ============================================ + // BUSINESS METHODS - PROCESS + // ============================================ - 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 objects')); - } - }; + public async saveProcess(processId: string, process: any): Promise { + await this.addObject({ + storeName: 'processes', + object: process, + key: processId, + }); + } - try { - activeWorker?.postMessage( - { - type: 'BATCH_WRITING', - payload, - }, - [messageChannel.port2], - ); - } catch (error) { - reject(new Error(`Failed to send message to service worker: ${error}`)); - } + public async saveProcessesBatch(processes: Record): Promise { + if (Object.keys(processes).length === 0) return; + + await this.batchWriting({ + storeName: 'processes', + objects: Object.entries(processes).map(([key, value]) => ({ key, object: value })), }); }