bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
84 lines (83 loc) • 2.85 kB
JavaScript
/**
* Browser sessionStorage adapter
* Data persists only for the duration of the page session
* Only works in browser environments
*/
export function createSessionStorage(options) {
const prefix = options?.prefix ?? "bigblocks:";
// Check if sessionStorage is available
const isAvailable = typeof window !== "undefined" && window.sessionStorage;
if (!isAvailable) {
console.warn("sessionStorage is not available. Using memory storage as fallback.");
// Return a memory storage adapter as fallback
const fallbackStore = new Map();
return {
async get(key) {
return fallbackStore.get(prefix + key) ?? null;
},
async set(key, value) {
fallbackStore.set(prefix + key, value);
},
async delete(key) {
fallbackStore.delete(prefix + key);
},
async clear() {
for (const key of fallbackStore.keys()) {
if (key.startsWith(prefix)) {
fallbackStore.delete(key);
}
}
},
};
}
return {
async get(key) {
try {
return sessionStorage.getItem(prefix + key);
}
catch (error) {
console.error("sessionStorage.get error:", error);
return null;
}
},
async set(key, value) {
try {
sessionStorage.setItem(prefix + key, value);
}
catch (error) {
console.error("sessionStorage.set error:", error);
// Check if it's a quota exceeded error
if (error instanceof Error && error.name === "QuotaExceededError") {
throw new Error("sessionStorage quota exceeded");
}
throw error;
}
},
async delete(key) {
try {
sessionStorage.removeItem(prefix + key);
}
catch (error) {
console.error("sessionStorage.delete error:", error);
}
},
async clear() {
try {
// Only clear keys with our prefix
const keysToRemove = [];
for (let i = 0; i < sessionStorage.length; i++) {
const key = sessionStorage.key(i);
if (key?.startsWith(prefix)) {
keysToRemove.push(key);
}
}
for (const key of keysToRemove) {
sessionStorage.removeItem(key);
}
}
catch (error) {
console.error("sessionStorage.clear error:", error);
}
},
};
}