UNPKG

@cmtlyt/storage

Version:
2 lines (1 loc) 4.32 kB
"use strict";const base=require("@cmtlyt/base"),jsonSchema=require("@cmtlyt/json-schema"),stringZip=require("@cmtlyt/string-zip");function h(r={}){return{dbName:"cl-storage",autoSaveDelay:1e3*60*5,zipKeyLength:6,...r}}class BaseStorage{#e={};#t;name="BaseStorage";config={};constructor(e){this.config=h(e),this.#t=new Promise((t,s)=>{this._createHook(base.deepClone(this.config)),(async()=>{try{const o=await this.init();typeof o=="string"?this.#e=jsonSchema.decodeDataSchema(await stringZip.unGzip(o)):this.#e=o||{},t()}catch(o){s(o)}})(),this._createdHook()}),this._createAutoSaveInterval()}_createAutoSaveInterval(){this.config.autoSaveDelay<1||setTimeout(async()=>{const e=await this.getDataSchema();this.autoSave(e),this._createAutoSaveInterval()},this.config.autoSaveDelay)}get length(){return Object.keys(this.#e).length}_createHook(e){}_createdHook(){}_setItemBeforeHook(e,t){}_setItemAfterHook(e,t){}_getItemBeforeHook(e){}_getItemAfterHook(e,t){}_removeItemBeforeHook(e){}_removeItemAfterHook(e){}_clearBeforeHook(){}_clearAfterHook(){}_getKeysBeforeHook(){}_getKeysAfterHook(e){}autoSave(e){}async getDataSchema(){return stringZip.gzip(jsonSchema.encodeDataSchema(this.#e),this.config.zipKeyLength)}async setItem(e,t){return this.#t.then(()=>{t=this._setItemBeforeHook(e,t)??t,this.#e[e]=t,this._setItemAfterHook(e,t)})}async getItem(e){return this.#t.then(()=>{this._getItemBeforeHook(e);let t=this.#e[e];return t=this._getItemAfterHook(e,t)??t,t})}async removeItem(e){return this.#t.then(()=>{this._removeItemBeforeHook(e),delete this.#e[e],this._removeItemAfterHook(e)})}async clear(){return this.#t.then(()=>{this._clearBeforeHook(),this.#e={},this._clearAfterHook()})}async getKeys(){return this.#t.then(()=>{this._getKeysBeforeHook();let e=Object.keys(this.#e);return e=this._getKeysAfterHook(e)??e,e})}}class MemoryStorage extends BaseStorage{name="MemoryStorage";constructor(e){super({...e,autoSaveDelay:0})}init(){return{}}autoSave(e){base.warning("MemaryStorage(\u5185\u5B58\u5B58\u50A8) \u4E0D\u652F\u6301\u4FDD\u5B58\u6570\u636E")}}class SessionStorage extends BaseStorage{name="SessionStorage";constructor(e){if(!base.caniuse("sessionStorage"))return base.warning("\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 sessionStorage, \u5DF2\u81EA\u52A8\u964D\u7EA7\u4E3A MemaryStorage"),new MemoryStorage(e);super({dbName:"cl-storage",autoSaveDelay:1e3*60*1,...e})}init(){const e=this.config.dbName;return sessionStorage.getItem(e)||{}}autoSave(e){const t=this.config.dbName;sessionStorage.setItem(t,e)}}class LocalStorage extends BaseStorage{name="LocalStorage";constructor(e){if(base.caniuse("localStorage"))return base.warning("\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 localStorage, \u5DF2\u81EA\u52A8\u964D\u7EA7\u4E3A SessionStorage"),new SessionStorage(e);super({dbName:"cl-storage",autoSaveDelay:1e3*60*1,...e})}init(){const e=this.config.dbName;return localStorage.getItem(e)||{}}autoSave(e){const t=this.config.dbName;localStorage.setItem(t,e)}}const n="value";class IndexedDBStorage extends BaseStorage{#e;name="IndexedDBStorage";constructor(e){if(!base.caniuse("indexedDB"))return base.warning("\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 IndexedDB, \u5DF2\u81EA\u52A8\u964D\u7EA7\u4E3A LocalStorage"),new LocalStorage(e);super({dbName:"cl-storage",autoSaveDelay:1e3*60*1,...e})}async#t(){const e=this.#e.transaction([this.config.dbName],"readonly").objectStore(this.config.dbName).get(n);return new Promise((t,s)=>{e.addEventListener("error",s),e.addEventListener("success",()=>{t(e.result)})})}async#o(e){const t=this.#e.transaction([this.config.dbName],"readwrite").objectStore(this.config.dbName).put(e,n);return new Promise((s,o)=>{t.addEventListener("error",o),t.addEventListener("success",()=>{s(t.result)})})}autoSave(e){this.#o(e)}init(){const e=this.config.dbName,t=indexedDB.open(e,1);return new Promise((s,o)=>{t.addEventListener("error",o),t.addEventListener("upgradeneeded",()=>{const a=this.#e=t.result;a.objectStoreNames.contains(e)||(a.createObjectStore(e),this.#o(""))}),t.addEventListener("success",()=>{this.#e??=t.result,this.#t().then(s,o)})})}async forceSave(){return this.#o(await this.getDataSchema())}}exports.IndexedDBStorage=IndexedDBStorage,exports.LocalStorage=LocalStorage,exports.MemoryStorage=MemoryStorage,exports.SessionStorage=SessionStorage;