Add generic db operations

This commit is contained in:
omaroughriss 2025-11-27 16:49:43 +01:00
parent 59fff148ac
commit 8a356fe2fd

View File

@ -279,117 +279,90 @@ export class Database {
} }
} }
private handleAddObjectResponse = async (event: MessageEvent) => { // ============================================
const data = event.data; // GENERIC INDEXEDDB OPERATIONS
console.log('Received response from service worker (ADD_OBJECT):', data); // ============================================
const service = await Services.getInstance();
if (data.type === 'NOTIFICATIONS') { public async getStoreList(): Promise<{ [key: string]: string }> {
service.setNotifications(data.data); return this.sendMessageToWorker('GET_STORE_LIST', {});
} else if (data.type === 'TO_DOWNLOAD') { }
console.log(`Received missing data ${data}`);
// Download the missing data public async addObject(payload: { storeName: string; object: any; key: any }): Promise<void> {
let requestedStateId: string[] = []; await this.sendMessageToWorker('ADD_OBJECT', payload);
for (const hash of data.data) { }
public async batchWriting(payload: { storeName: string; objects: { key: any; object: any }[] }): Promise<void> {
await this.sendMessageToWorker('BATCH_WRITING', payload);
}
public async getObject(storeName: string, key: string): Promise<any | null> {
return this.sendMessageToWorker('GET_OBJECT', { storeName, key });
}
public async dumpStore(storeName: string): Promise<Record<string, any>> {
return this.sendMessageToWorker('DUMP_STORE', { storeName });
}
public async deleteObject(storeName: string, key: string): Promise<void> {
await this.sendMessageToWorker('DELETE_OBJECT', { storeName, key });
}
public async clearStore(storeName: string): Promise<void> {
await this.sendMessageToWorker('CLEAR_STORE', { storeName });
}
public async requestStoreByIndex(storeName: string, indexName: string, request: string): Promise<any[]> {
return this.sendMessageToWorker('REQUEST_STORE_BY_INDEX', { storeName, indexName, request });
}
public async clearMultipleStores(storeNames: string[]): Promise<void> {
for (const storeName of storeNames) {
await this.clearStore(storeName);
}
}
// ============================================
// BUSINESS METHODS - DEVICE
// ============================================
public async saveDevice(device: any): Promise<void> {
try { try {
const valueBytes = await service.fetchValueFromStorage(hash); const existing = await this.getObject('wallet', '1');
if (valueBytes) { if (existing) {
// Save data to db await this.deleteObject('wallet', '1');
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; } catch (e) {}
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);
}
}
}
};
private handleGetObjectResponse = (event: MessageEvent) => { await this.addObject({
console.log('Received response from service worker (GET_OBJECT):', event.data); storeName: 'wallet',
}; object: { pre_id: '1', device },
key: null,
public addObject(payload: { storeName: string; object: any; key: any }): Promise<void> {
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;
}
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}`));
}
}); });
} }
public batchWriting(payload: { storeName: string; objects: { key: any; object: any }[] }): Promise<void> { public async getDevice(): Promise<any | null> {
return new Promise(async (resolve, reject) => { const result = await this.getObject('wallet', '1');
if (!this.serviceWorkerRegistration) { return result ? result['device'] : null;
this.serviceWorkerRegistration = await navigator.serviceWorker.ready;
} }
const activeWorker = await this.waitForServiceWorkerActivation(this.serviceWorkerRegistration); // ============================================
const messageChannel = new MessageChannel(); // BUSINESS METHODS - PROCESS
// ============================================
messageChannel.port1.onmessage = (event) => { public async saveProcess(processId: string, process: any): Promise<void> {
if (event.data.status === 'success') { await this.addObject({
resolve(); storeName: 'processes',
} else { object: process,
const error = event.data.message; key: processId,
reject(new Error(error || 'Unknown error occurred while adding objects')); });
} }
};
try { public async saveProcessesBatch(processes: Record<string, any>): Promise<void> {
activeWorker?.postMessage( if (Object.keys(processes).length === 0) return;
{
type: 'BATCH_WRITING', await this.batchWriting({
payload, storeName: 'processes',
}, objects: Object.entries(processes).map(([key, value]) => ({ key, object: value })),
[messageChannel.port2],
);
} catch (error) {
reject(new Error(`Failed to send message to service worker: ${error}`));
}
}); });
} }