@bigmi/client
Version:
Reactive primitives for Bitcoin apps.
64 lines • 2.04 kB
JavaScript
import { deserialize as deserialize_ } from '../utils/deserialize.js';
import { serialize as serialize_ } from '../utils/serialize.js';
export function createStorage(parameters) {
const { deserialize = deserialize_, key: prefix = 'bigmi', serialize = serialize_, storage = noopStorage, } = parameters;
function unwrap(value) {
if (value instanceof Promise) {
return value.then((x) => x).catch(() => null);
}
return value;
}
return {
...storage,
key: prefix,
async getItem(key, defaultValue) {
const value = storage.getItem(`${prefix}.${key}`);
const unwrapped = await unwrap(value);
if (unwrapped) {
return deserialize(unwrapped) ?? null;
}
return (defaultValue ?? null);
},
async setItem(key, value) {
const storageKey = `${prefix}.${key}`;
if (value === null) {
await unwrap(storage.removeItem(storageKey));
}
else {
await unwrap(storage.setItem(storageKey, serialize(value)));
}
},
async removeItem(key) {
await unwrap(storage.removeItem(`${prefix}.${key}`));
},
};
}
export const noopStorage = {
getItem: () => null,
setItem: () => { },
removeItem: () => { },
};
export function getDefaultStorage() {
const storage = (() => {
if (typeof window !== 'undefined' && window.localStorage) {
return window.localStorage;
}
return noopStorage;
})();
return {
getItem(key) {
return storage.getItem(key);
},
removeItem(key) {
storage.removeItem(key);
},
setItem(key, value) {
try {
storage.setItem(key, value);
// silence errors by default (QuotaExceededError, SecurityError, etc.)
}
catch { }
},
};
}
//# sourceMappingURL=createStorage.js.map