File size: 2,970 Bytes
1778c9e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
import { JsonDataProvider, Remult, remult, type JsonEntityStorage } from "remult";
import { createSubscriber } from "svelte/reactivity";
// To be done once in the application.
export function initRemultSvelteReactivity() {
// Auth reactivity (remult.user, remult.authenticated(), ...)
{
let update = () => {};
const s = createSubscriber(u => {
update = u;
});
remult.subscribeAuth({
reportObserved: () => s(),
reportChanged: () => update(),
});
}
// Entities reactivity
{
Remult.entityRefInit = x => {
let update = () => {};
const s = createSubscriber(u => {
update = u;
});
x.subscribe({
reportObserved: () => s(),
reportChanged: () => update(),
});
};
}
}
export class JsonEntityIndexedDbStorage implements JsonEntityStorage {
constructor(
private dbName: string = "db",
private storeName: string = "jsonStore"
) {}
supportsRawJson = true;
//@internal
db?: IDBDatabase;
async getItem(entityDbName: string) {
// eslint-disable-next-line no-async-promise-executor
return new Promise<string>(async (resolve, reject) => {
const transaction = (await this.init()).transaction([this.storeName], "readonly");
const store = transaction.objectStore(this.storeName);
const request = store.get(entityDbName);
request.onerror = _event => reject(request.error);
request.onsuccess = _event => {
if (request.result) {
resolve(request.result);
} else {
resolve(null!);
}
};
});
}
//@internal
async init() {
if (!this.db) {
this.db = await new Promise<IDBDatabase>((resolve, reject) => {
let db: IDBDatabase;
const request = indexedDB.open(this.dbName, 1);
request.onerror = _event => reject(request.error);
request.onsuccess = _event => {
db = request.result;
resolve(db);
};
request.onupgradeneeded = _event => {
db = request.result;
db.createObjectStore(this.storeName);
};
});
}
return this.db;
}
async setItem(entityDbName: string, json: string) {
// eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async (resolve, reject) => {
const transaction = (await this.init()).transaction([this.storeName], "readwrite");
const store = transaction.objectStore(this.storeName);
const request = store.put(json, entityDbName);
request.onerror = _event => reject(request.error);
request.onsuccess = _event => resolve();
});
}
async deleteItem(entityDbName: string) {
// eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async (resolve, reject) => {
const transaction = (await this.init()).transaction([this.storeName], "readwrite");
const store = transaction.objectStore(this.storeName);
const request = store.delete(entityDbName);
request.onerror = _event => reject(request.error);
request.onsuccess = _event => resolve();
});
}
}
export const idb = new JsonDataProvider(new JsonEntityIndexedDbStorage());
|