secure-timed-storage
Version:
Secure timed storage library for encrypting and managing data in localStorage with expiry
82 lines (81 loc) • 2.29 kB
JavaScript
import s from "crypto-js";
function E({ encryptionKey: c }) {
const a = !!c, u = (t, e, r = null) => {
try {
const o = r !== null ? Date.now() + r * 36e5 : null, n = a ? f({ value: e, expiry: o }) : JSON.stringify({ value: e, expiry: o });
localStorage.setItem(t, n);
} catch (o) {
throw console.error("Failed to set item", o), new Error("Failed to set item");
}
}, l = (t) => {
const e = localStorage.getItem(t);
if (!e)
return null;
try {
const r = a ? g(e) : JSON.parse(e);
return r.expiry && Date.now() > r.expiry ? (localStorage.removeItem(t), null) : r.value;
} catch (r) {
return console.error("Failed to get item", r), null;
}
}, i = (t) => {
localStorage.removeItem(t);
}, y = (t) => {
const e = localStorage.getItem(t);
if (!e)
return null;
try {
return (a ? g(e) : JSON.parse(e)).expiry;
} catch (r) {
return console.error("Failed to get expiry", r), null;
}
}, p = () => {
const t = Object.keys(localStorage).reduce((e, r) => {
const o = localStorage.getItem(r);
return o ? e + r.length + o.length : e;
}, 0);
return { usedBytes: t, remainingBytes: 5 * 1024 * 1024 - t };
}, d = () => {
localStorage.clear();
}, S = () => {
Object.keys(localStorage).forEach((t) => {
const e = l(t);
e != null && e.expiry && Date.now() > e.expiry && i(t);
});
}, m = (t) => {
const e = [];
for (let r = 0; r < localStorage.length; r++) {
const o = localStorage.key(r);
if (o) {
const n = l(o);
n && t(n) && e.push(n);
}
}
return e;
}, f = (t) => {
try {
return s.AES.encrypt(JSON.stringify(t), c).toString();
} catch (e) {
throw console.error("Encryption failed", e), new Error("Encryption failed");
}
}, g = (t) => {
try {
const e = s.AES.decrypt(t, c);
return JSON.parse(e.toString(s.enc.Utf8));
} catch (e) {
throw console.error("Decryption failed", e), new Error("Decryption failed");
}
};
return {
setItem: u,
getItem: l,
removeItem: i,
getExpiry: y,
getRemainingStorage: p,
clearStorage: d,
cleanUp: S,
query: m
};
}
export {
E as createSecureTimedStorage
};