First commit

This commit is contained in:
2026-04-08 19:36:03 +02:00
parent 66769b52fd
commit 3fb1145c6b
37 changed files with 2498 additions and 494 deletions

View File

@@ -0,0 +1,165 @@
import {inject, Injectable} from '@angular/core';
import {TuiAlertService} from '@taiga-ui/core';
import {DatabaseAPI} from '@chatenium/chatenium-sdk/storage/database';
@Injectable({
providedIn: 'root'
})
export class IndexedDB {
private dbVersion = 1
private db: IDBDatabase | null = null
getApi(): DatabaseAPI {
return {
get: async (collection, key) => {
return await this.get(collection, key)
},
set: (collection, key, value) => {
return this.putObject(collection, value, key);
},
flush: () => {},
delete: (collection, key) => {
return this.delete(collection, key);
}
}
}
openDatabase(): Promise<void> {
return new Promise(resolve => {
const request = indexedDB.open("cache", this.dbVersion);
request.onupgradeneeded = (e: IDBVersionChangeEvent) => {
const db = (e.target as IDBOpenDBRequest).result;
db.createObjectStore('sessions', { keyPath: 'id' })
db.createObjectStore('chats', { keyPath: 'id' })
db.createObjectStore('networks', { keyPath: 'id' })
db.createObjectStore('files', { keyPath: 'id' })
db.createObjectStore('messages', { keyPath: 'id' })
}
request.onsuccess = (event: Event) => {
this.db = (event.target as IDBOpenDBRequest).result;
console.log("Indexed DB Successfully opened")
resolve()
}
request.onerror = _ => {
const request = indexedDB.deleteDatabase("cache");
request.onsuccess = _ => {
setTimeout(() => {
console.log("Recreated the database.")
location.reload()
}, 1500)
}
request.onerror = _ => {
console.error("Fatal error. Cannot access indexedDB, check if access is not blocked.")
}
}
})
}
public putObject(storeName: string, data: any, id: string) {
if (this.db) {
const request = this.db.transaction([storeName], 'readwrite')
.objectStore(storeName)
.put({id: id, data: data})
request.onerror = _ => {
console.error("[IDB] ERROR: Adding data failed.")
}
} else {
console.error("[IDB] ERROR: DB Not open. Retrying in 500ms...")
setTimeout(() => {
console.log("Retrying now...")
this.putObject(storeName, data, id)
}, 1000)
}
}
clearObjectStore(storeName: string) {
return new Promise((resolve, reject) => {
if (this.db) {
const transaction = this.db.transaction([storeName], "readwrite");
const store = transaction.objectStore(storeName);
const request = store.clear();
request.onsuccess = () => {
resolve("Ok");
};
request.onerror = () => {
console.error("Getting chats cache failed");
reject([]);
};
} else {
console.error("DB NOT OPEN (CLEAROBJECTSTORE)")
}
});
}
getAll(storeName: string): Promise<any> {
return new Promise((resolve, reject) => {
if (this.db) {
const transaction = this.db.transaction([storeName], "readonly");
const store = transaction.objectStore(storeName);
const request = store.getAll();
request.onsuccess = () => {
resolve(request.result.map((data) => data.data));
};
request.onerror = () => {
console.error("Getting chats cache failed");
reject([]);
};
} else {
console.error("DB NOT OPEN (GETALL)")
}
});
}
get(storeName: string, key: string): Promise<string> {
return new Promise((resolve, reject) => {
if (this.db) {
const transaction = this.db.transaction([storeName], "readonly");
const store = transaction.objectStore(storeName);
const request = store.get(key);
request.onsuccess = () => {
resolve(request.result == null ? [] : request.result.data);
};
request.onerror = () => {
console.error("Getting chats cache failed");
reject([]);
};
} else {
console.error("[IDB GET] ERROR: DB Not open.")
}
});
}
delete(storeName: string, key: string): Promise<void> {
return new Promise((resolve, reject) => {
if (this.db) {
const transaction = this.db.transaction([storeName], "readonly");
const store = transaction.objectStore(storeName);
const request = store.delete(key);
request.onsuccess = () => {
resolve();
};
request.onerror = () => {
console.error("Getting chats cache failed");
reject([]);
};
} else {
console.error("[IDB GET] ERROR: DB Not open.")
}
});
}
}