@cachemap/web-storage
Version:
The Cachemap web storage module.
1 lines • 6.26 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../web-storage/src//main/index.ts"],"sourcesContent":["import { type Store, type StoreInit, type StoreOptions } from '@cachemap/types';\nimport { isNumber, isPlainObject } from 'lodash-es';\nimport { type ConstructorOptions, type InitOptions, type Options } from '../types.ts';\n\nexport class WebStorageStore implements Store {\n public static init(options: InitOptions): Promise<WebStorageStore> {\n return Promise.resolve(new WebStorageStore(options));\n }\n\n public readonly type = 'webStorage';\n private readonly _maxHeapSize: number = 4_194_304;\n private readonly _name: string;\n private _storage: Storage = globalThis.localStorage;\n\n constructor(options: ConstructorOptions) {\n if (isNumber(options.maxHeapSize)) {\n this._maxHeapSize = options.maxHeapSize;\n }\n\n this._name = options.name;\n\n if (options.storageType === 'session') {\n this._storage = globalThis.sessionStorage;\n }\n }\n\n public clear(): Promise<void> {\n for (let index = this._storage.length - 1; index >= 0; index -= 1) {\n const key = this._storage.key(index);\n\n if (key?.startsWith(this._name)) {\n this._storage.removeItem(key);\n }\n }\n\n return Promise.resolve();\n }\n\n public delete(key: string): Promise<boolean> {\n const builtKey = this._buildKey(key);\n\n if (this._storage.getItem(builtKey) === null) {\n return Promise.resolve(false);\n }\n\n this._storage.removeItem(builtKey);\n return Promise.resolve(true);\n }\n\n public entries(keys: string[]): Promise<[string, string][]> {\n const entryKeys = new Set(keys.map(key => this._buildKey(key)));\n const entries: [string, string][] = [];\n const regex = new RegExp(`${this._name}-`);\n\n for (let index = 0; index < this._storage.length; index += 1) {\n const key = this._storage.key(index);\n\n if (!key?.startsWith(this._name)) {\n continue;\n }\n\n if (entryKeys.has(key)) {\n const item = this._storage.getItem(key);\n\n if (item) {\n entries.push([key.replace(regex, ''), item]);\n }\n }\n }\n\n return Promise.resolve(entries);\n }\n\n public get(key: string): Promise<string | undefined> {\n return Promise.resolve(this._storage.getItem(this._buildKey(key)) ?? undefined);\n }\n\n public has(key: string): Promise<boolean> {\n return Promise.resolve(this._storage.getItem(this._buildKey(key)) !== null);\n }\n\n public import(entries: [string, string][]): Promise<void> {\n for (const [key, value] of entries) {\n this._storage.setItem(this._buildKey(key), JSON.stringify(value));\n }\n\n return Promise.resolve();\n }\n\n get maxHeapSize(): number {\n return this._maxHeapSize;\n }\n\n get name(): string {\n return this._name;\n }\n\n public set(key: string, value: string): Promise<void> {\n this._storage.setItem(this._buildKey(key), value);\n return Promise.resolve();\n }\n\n public size(): Promise<number> {\n const keys: string[] = [];\n\n for (let index = 0; index < this._storage.length; index += 1) {\n const key = this._storage.key(index);\n\n if (key?.startsWith(this._name)) {\n keys.push(key);\n }\n }\n\n // metadata is stored in the same DB as the\n // entries it describes, so we need to remove\n // one entry to get actual size\n return Promise.resolve(keys.length - 1);\n }\n\n private _buildKey(key: string): string {\n return `${this._name}-${key}`;\n }\n}\n\nexport const init = (options: Options = {}): StoreInit => {\n if (!isPlainObject(options)) {\n throw new TypeError('@cachemap/map expected options to be a plain object.');\n }\n\n return (storeOptions: StoreOptions) => WebStorageStore.init({ ...options, ...storeOptions });\n};\n"],"names":["WebStorageStore","init","options","Promise","resolve","constructor","type","_maxHeapSize","_storage","globalThis","localStorage","isNumber","maxHeapSize","this","_name","name","storageType","sessionStorage","clear","index","length","key","startsWith","removeItem","delete","builtKey","_buildKey","getItem","entries","keys","entryKeys","Set","map","regex","RegExp","has","item","push","replace","get","undefined","import","value","setItem","JSON","stringify","set","size","isPlainObject","TypeError","storeOptions"],"mappings":"ocAIO,MAAMA,EACX,WAAcC,CAAKC,GACjB,OAAOC,QAAQC,QAAQ,IAAIJ,EAAgBE,GAC7C,CAOA,WAAAG,CAAYH,QALII,KAAO,kBACNC,aAAuB,QAEhCC,KAAAA,SAAoBC,WAAWC,aAGjCC,EAAST,EAAQU,eACnBC,KAAKN,aAAeL,EAAQU,aAG9BC,KAAKC,MAAQZ,EAAQa,KAEO,YAAxBb,EAAQc,cACVH,KAAKL,SAAWC,WAAWQ,eAE/B,CAEOC,KAAAA,GACL,IAAK,IAAIC,EAAQN,KAAKL,SAASY,OAAS,EAAGD,GAAS,EAAGA,GAAS,EAAG,CACjE,MAAME,EAAMR,KAAKL,SAASa,IAAIF,GAE1BE,GAAKC,WAAWT,KAAKC,QACvBD,KAAKL,SAASe,WAAWF,EAE7B,CAEA,OAAOlB,QAAQC,SACjB,CAEOoB,OAAOH,GACZ,MAAMI,EAAWZ,KAAKa,UAAUL,GAEhC,OAAwC,OAApCR,KAAKL,SAASmB,QAAQF,GACjBtB,QAAQC,SAAQ,IAGzBS,KAAKL,SAASe,WAAWE,GAClBtB,QAAQC,SAAQ,GACzB,CAEOwB,OAAAA,CAAQC,GACb,MAAMC,EAAY,IAAIC,IAAIF,EAAKG,KAAIX,GAAOR,KAAKa,UAAUL,MACnDO,EAA8B,GAC9BK,EAAQ,IAAIC,OAAO,GAAGrB,KAAKC,UAEjC,IAAK,IAAIK,EAAQ,EAAGA,EAAQN,KAAKL,SAASY,OAAQD,GAAS,EAAG,CAC5D,MAAME,EAAMR,KAAKL,SAASa,IAAIF,GAE9B,GAAKE,GAAKC,WAAWT,KAAKC,QAItBgB,EAAUK,IAAId,GAAM,CACtB,MAAMe,EAAOvB,KAAKL,SAASmB,QAAQN,GAE/Be,GACFR,EAAQS,KAAK,CAAChB,EAAIiB,QAAQL,EAAO,IAAKG,GAE1C,CACF,CAEA,OAAOjC,QAAQC,QAAQwB,EACzB,CAEOW,GAAAA,CAAIlB,GACT,OAAOlB,QAAQC,QAAQS,KAAKL,SAASmB,QAAQd,KAAKa,UAAUL,UAASmB,EACvE,CAEOL,GAAAA,CAAId,GACT,OAAOlB,QAAQC,QAAuD,OAA/CS,KAAKL,SAASmB,QAAQd,KAAKa,UAAUL,IAC9D,CAEOoB,MAAAA,CAAOb,GACZ,IAAK,MAAOP,EAAKqB,KAAUd,EACzBf,KAAKL,SAASmC,QAAQ9B,KAAKa,UAAUL,GAAMuB,KAAKC,UAAUH,IAG5D,OAAOvC,QAAQC,SACjB,CAEA,eAAIQ,GACF,OAAOC,KAAKN,YACd,CAEA,QAAIQ,GACF,OAAOF,KAAKC,KACd,CAEOgC,GAAAA,CAAIzB,EAAaqB,GAEtB,OADA7B,KAAKL,SAASmC,QAAQ9B,KAAKa,UAAUL,GAAMqB,GACpCvC,QAAQC,SACjB,CAEO2C,IAAAA,GACL,MAAMlB,EAAiB,GAEvB,IAAK,IAAIV,EAAQ,EAAGA,EAAQN,KAAKL,SAASY,OAAQD,GAAS,EAAG,CAC5D,MAAME,EAAMR,KAAKL,SAASa,IAAIF,GAE1BE,GAAKC,WAAWT,KAAKC,QACvBe,EAAKQ,KAAKhB,EAEd,CAKA,OAAOlB,QAAQC,QAAQyB,EAAKT,OAAS,EACvC,CAEQM,SAAAA,CAAUL,GAChB,MAAO,GAAGR,KAAKC,SAASO,GAC1B,EAGK,MAAMpB,EAAO,CAACC,EAAmB,MACtC,IAAK8C,EAAc9C,GACjB,MAAM,IAAI+C,UAAU,wDAGtB,OAAQC,GAA+BlD,EAAgBC,KAAK,IAAKC,KAAYgD,GAAa"}