Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| 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()); | |