UNPKG

secure-timed-storage

Version:

Secure timed storage library for encrypting and managing data in localStorage with expiry

2 lines (1 loc) 1.93 kB
(function(n,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","crypto-js"],c):(n=typeof globalThis<"u"?globalThis:n||self,c(n.secureTimedStorage={},n.CryptoJS))})(this,function(n,c){"use strict";function y({encryptionKey:l}){const i=!!l,g=(t,e,r=null)=>{try{const o=r!==null?Date.now()+r*36e5:null,a=i?E({value:e,expiry:o}):JSON.stringify({value:e,expiry:o});localStorage.setItem(t,a)}catch(o){throw console.error("Failed to set item",o),new Error("Failed to set item")}},s=t=>{const e=localStorage.getItem(t);if(!e)return null;try{const r=i?d(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}},u=t=>{localStorage.removeItem(t)},p=t=>{const e=localStorage.getItem(t);if(!e)return null;try{return(i?d(e):JSON.parse(e)).expiry}catch(r){return console.error("Failed to get expiry",r),null}},f=()=>{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}},S=()=>{localStorage.clear()},m=()=>{Object.keys(localStorage).forEach(t=>{const e=s(t);e!=null&&e.expiry&&Date.now()>e.expiry&&u(t)})},h=t=>{const e=[];for(let r=0;r<localStorage.length;r++){const o=localStorage.key(r);if(o){const a=s(o);a&&t(a)&&e.push(a)}}return e},E=t=>{try{return c.AES.encrypt(JSON.stringify(t),l).toString()}catch(e){throw console.error("Encryption failed",e),new Error("Encryption failed")}},d=t=>{try{const e=c.AES.decrypt(t,l);return JSON.parse(e.toString(c.enc.Utf8))}catch(e){throw console.error("Decryption failed",e),new Error("Decryption failed")}};return{setItem:g,getItem:s,removeItem:u,getExpiry:p,getRemainingStorage:f,clearStorage:S,cleanUp:m,query:h}}n.createSecureTimedStorage=y,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});