UNPKG

@tanstack/offline-transactions

Version:

Offline-first transaction capabilities for TanStack DB

103 lines (102 loc) 2.93 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const StorageAdapter = require("./StorageAdapter.cjs"); class LocalStorageAdapter extends StorageAdapter.BaseStorageAdapter { constructor(prefix = `offline-tx:`) { super(); this.prefix = prefix; } /** * Probe localStorage availability by attempting a test write. * This catches private mode and other restrictions that block localStorage. */ static probe() { if (typeof localStorage === `undefined`) { return { available: false, error: new Error(`localStorage is not available in this environment`) }; } try { const testKey = `__offline-tx-probe__`; const testValue = `test`; localStorage.setItem(testKey, testValue); const retrieved = localStorage.getItem(testKey); localStorage.removeItem(testKey); if (retrieved !== testValue) { return { available: false, error: new Error(`localStorage read/write verification failed`) }; } return { available: true }; } catch (error) { return { available: false, error: error instanceof Error ? error : new Error(String(error)) }; } } getKey(key) { return `${this.prefix}${key}`; } get(key) { try { return Promise.resolve(localStorage.getItem(this.getKey(key))); } catch (error) { console.warn(`localStorage get failed:`, error); return Promise.resolve(null); } } set(key, value) { try { localStorage.setItem(this.getKey(key), value); return Promise.resolve(); } catch (error) { if (error instanceof DOMException && error.name === `QuotaExceededError`) { return Promise.reject( new Error( `Storage quota exceeded. Consider clearing old transactions.` ) ); } return Promise.reject(error); } } delete(key) { try { localStorage.removeItem(this.getKey(key)); return Promise.resolve(); } catch (error) { console.warn(`localStorage delete failed:`, error); return Promise.resolve(); } } keys() { try { const keys = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key && key.startsWith(this.prefix)) { keys.push(key.slice(this.prefix.length)); } } return Promise.resolve(keys); } catch (error) { console.warn(`localStorage keys failed:`, error); return Promise.resolve([]); } } async clear() { try { const keys = await this.keys(); for (const key of keys) { localStorage.removeItem(this.getKey(key)); } } catch (error) { console.warn(`localStorage clear failed:`, error); } } } exports.LocalStorageAdapter = LocalStorageAdapter; //# sourceMappingURL=LocalStorageAdapter.cjs.map