chrome-mobile.ts

2.5 KB · raw

1// Capacitor-backed chrome.storage.local shim.2// Used on mobile builds where there is no service worker / Chrome extension API.3// Redirects all chrome.storage.local calls to @capacitor/preferences.4import { Preferences } from "@capacitor/preferences";56export const chrome = {7  storage: {8    local: {9      async get(keys: string | string[] | Record<string, unknown>): Promise<Record<string, unknown>> {10        const keyArray = Array.isArray(keys) ? keys : typeof keys === "string" ? [keys] : Object.keys(keys);11        const result: Record<string, unknown> = {};12        for (const k of keyArray) {13          const { value } = await Preferences.get({ key: k });14          if (value !== undefined) result[k] = value;15        }16        return result;17      },18      async set(items: Record<string, unknown>): Promise<void> {19        for (const [k, v] of Object.entries(items)) {20          await Preferences.set({ key: k, value: String(v) });21        }22      },23      async remove(keys: string | string[]): Promise<void> {24        const keyArray = Array.isArray(keys) ? keys : [keys];25        for (const k of keyArray) {26          await Preferences.remove({ key: k });27        }28      },29      async clear(): Promise<void> {30        await Preferences.clear();31      },32    },33    session: {34      // Session storage on mobile: use a plain Map (not persisted)35      _session: new Map<string, unknown>(),36      async get(keys: string | string[] | Record<string, unknown>): Promise<Record<string, unknown>> {37        const keyArray = Array.isArray(keys) ? keys : typeof keys === "string" ? [keys] : Object.keys(keys);38        const result: Record<string, unknown> = {};39        for (const k of keyArray) {40          if (this._session.has(k)) result[k] = this._session.get(k);41        }42        return result;43      },44      async set(items: Record<string, unknown>): Promise<void> {45        for (const [k, v] of Object.entries(items)) this._session.set(k, v);46      },47      async remove(keys: string | string[]): Promise<void> {48        const keyArray = Array.isArray(keys) ? keys : [keys];49        for (const k of keyArray) this._session.delete(k);50      },51    },52    onChanged: { addListener: () => {}, removeListener: () => {} },53  },54  runtime: {55    sendMessage: (_msg: unknown, cb?: (r: unknown) => void) => { if (cb) cb({ ok: false, error: "NO_SERVICE_WORKER" }); },56    onMessage: { addListener: () => {}, removeListener: () => {} },57    connect: () => ({ disconnect: () => {} }),58    lastError: null,59  },60};