Update db

This commit is contained in:
Sosthene 2024-11-22 16:06:01 +01:00
parent 382517bab6
commit 704e6e7464
3 changed files with 80 additions and 72 deletions

View File

@ -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() {

View File

@ -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<void> {
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<any | null> {
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
}
}

View File

@ -297,18 +297,30 @@ export default class Services {
async saveDevice(device: any): Promise<any> {
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<string | null> {
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() {