ngrx-store-persist
Version:
ngrx-store-persist depends on @ngrx/store and angular 2+
104 lines (88 loc) • 3.18 kB
text/typescript
export class IndexedDBService {
private db: IDBDatabase | null = null;
private readonly DB_NAME = 'NGRX Storage';
private readonly STORE_NAME = 'keyvaluepairs';
async init(): Promise<void> {
if (this.db) {
return;
}
return new Promise((resolve, reject) => {
const request = indexedDB.open(this.DB_NAME, 3);
request.onerror = () => reject(request.error);
request.onsuccess = () => {
this.db = request.result;
resolve();
};
request.onupgradeneeded = (event) => {
const db = (event.target as IDBOpenDBRequest).result;
if (!db.objectStoreNames.contains(this.STORE_NAME)) {
db.createObjectStore(this.STORE_NAME);
}
};
});
}
async getItem(key: string): Promise<any> {
await this.init();
return new Promise((resolve, reject) => {
if (!this.db) {
reject(new Error('Database not initialized'));
return;
}
const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
const store = transaction.objectStore(this.STORE_NAME);
const request = store.get(key);
request.onerror = () => reject(request.error);
request.onsuccess = () => {
try {
const value = request.result;
resolve(value ? JSON.parse(value) : null);
} catch {
resolve(request.result);
}
};
});
}
async setItem(key: string, value: any): Promise<void> {
await this.init();
return new Promise((resolve, reject) => {
if (!this.db) {
reject(new Error('Database not initialized'));
return;
}
const transaction = this.db.transaction(this.STORE_NAME, 'readwrite');
const store = transaction.objectStore(this.STORE_NAME);
const serialized = typeof value === 'string' ? value : JSON.stringify(value);
const request = store.put(serialized, key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve();
});
}
async removeItem(key: string): Promise<void> {
await this.init();
return new Promise((resolve, reject) => {
if (!this.db) {
reject(new Error('Database not initialized'));
return;
}
const transaction = this.db.transaction(this.STORE_NAME, 'readwrite');
const store = transaction.objectStore(this.STORE_NAME);
const request = store.delete(key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve();
});
}
async keys(): Promise<string[]> {
await this.init();
return new Promise((resolve, reject) => {
if (!this.db) {
reject(new Error('Database not initialized'));
return;
}
const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
const store = transaction.objectStore(this.STORE_NAME);
const request = store.getAllKeys();
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve(Array.from(request.result as string[]));
});
}
}