// Capacitor-backed chrome.storage.local shim. // Used on mobile builds where there is no service worker / Chrome extension API. // Redirects all chrome.storage.local calls to @capacitor/preferences. import { Preferences } from "@capacitor/preferences"; export const chrome = { storage: { local: { async get(keys: string | string[] | Record): Promise> { const keyArray = Array.isArray(keys) ? keys : typeof keys === "string" ? [keys] : Object.keys(keys); const result: Record = {}; for (const k of keyArray) { const { value } = await Preferences.get({ key: k }); if (value !== undefined) result[k] = value; } return result; }, async set(items: Record): Promise { for (const [k, v] of Object.entries(items)) { await Preferences.set({ key: k, value: String(v) }); } }, async remove(keys: string | string[]): Promise { const keyArray = Array.isArray(keys) ? keys : [keys]; for (const k of keyArray) { await Preferences.remove({ key: k }); } }, async clear(): Promise { await Preferences.clear(); }, }, session: { // Session storage on mobile: use a plain Map (not persisted) _session: new Map(), async get(keys: string | string[] | Record): Promise> { const keyArray = Array.isArray(keys) ? keys : typeof keys === "string" ? [keys] : Object.keys(keys); const result: Record = {}; for (const k of keyArray) { if (this._session.has(k)) result[k] = this._session.get(k); } return result; }, async set(items: Record): Promise { for (const [k, v] of Object.entries(items)) this._session.set(k, v); }, async remove(keys: string | string[]): Promise { const keyArray = Array.isArray(keys) ? keys : [keys]; for (const k of keyArray) this._session.delete(k); }, }, onChanged: { addListener: () => {}, removeListener: () => {} }, }, runtime: { sendMessage: (_msg: unknown, cb?: (r: unknown) => void) => { if (cb) cb({ ok: false, error: "NO_SERVICE_WORKER" }); }, onMessage: { addListener: () => {}, removeListener: () => {} }, connect: () => ({ disconnect: () => {} }), lastError: null, }, };