@tanstack/offline-transactions
Version:
Offline-first transaction capabilities for TanStack DB
103 lines (102 loc) • 2.93 kB
JavaScript
;
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