{"version":3,"sources":["../../src/Cache.ts"],"names":["Cache","constructor","options","namespace","ttl","path","readonly","pretty","serialize","val","JSON","stringify","unserialize","parse","data","fileLastModified","fileContent","ensureFileExists","loadDataFromFile","force","stat","statSync","mtimeMs","readFileSync","saveDataToFile","content","writeFileSync","existsSync","dir","dirname","mkdirSync","recursive","getKey","key","parts","join","getKeys","mkey","vkey","unsetIfExpired","has","meta","get","created","Date","now","unset","getFilePath","clear","getSize","length","defaultValue","undefined","cloneDeep","set","args","value"],"mappings":"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","file":"chunk-TJGXZZGC.mjs","sourcesContent":["import { cloneDeep, get, has, set, unset } from '@radicjs/utils';\nimport { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\n\n\nexport type CacheMeta = {\n    /** created timestamp (miliseconds) */\n    created: number\n    /** time to live (seconds) **/\n    ttl: number\n}\n\nexport interface CacheOptions {\n\n    namespace: string;\n    /** time to live (seconds) **/\n    ttl?: number;\n    path: string;\n    readonly?: boolean;\n    pretty?: boolean;\n    serialize?: (val: any) => string;\n    unserialize?: (val: string) => any;\n}\n\nexport class Cache {\n    options: CacheOptions              = {\n        namespace: '_temp',\n        ttl: 60,\n        path: '',\n        readonly: false,\n        pretty: false,\n        serialize: val => JSON.stringify(val, null, this.options.pretty ? 4 : 0),\n        unserialize: val => JSON.parse(val),\n    };\n    data: any                          = {};\n    protected fileLastModified: number = 0;\n    protected fileContent: string      = '{}';\n\n    constructor(options: CacheOptions) {\n        this.options = {\n            ...this.options,\n            ...options,\n        };\n        this.ensureFileExists();\n        this.loadDataFromFile(true);\n    }\n\n    protected loadDataFromFile(force = false) {\n        const stat = statSync(this.options.path);\n        if ( force || this.fileLastModified < stat.mtimeMs ) {\n            this.fileContent      = readFileSync(this.options.path, 'utf-8');\n            this.data             = this.options.unserialize(this.fileContent);\n            this.fileLastModified = stat.mtimeMs;\n        }\n    }\n\n    protected saveDataToFile(force = false) {\n        if ( this.options.readonly ) {\n            return;\n        }\n        const content = this.options.serialize(this.data);\n        if ( force || this.fileContent !== content ) {\n            writeFileSync(this.options.path, content, 'utf-8');\n            this.data = this.options.unserialize(content);\n        }\n    }\n\n    protected ensureFileExists() {\n        if ( this.options.readonly ) {\n            return;\n        }\n        if ( !existsSync(this.options.path) ) {\n            let dir = dirname(this.options.path);\n            if ( !existsSync(dir) ) {\n                mkdirSync(dir, { recursive: true });\n            }\n            writeFileSync(this.options.path, '{}', 'utf-8');\n        }\n    }\n\n    protected getKey(key: string, ...parts: string[]): string {\n        return [ this.options.namespace, key, ...parts ].join('.');\n    }\n\n    protected getKeys(key: string) {\n        return {\n            mkey: this.getKey(key, 'metadata'),\n            vkey: this.getKey(key, 'value'),\n        };\n    }\n\n    protected unsetIfExpired(key: string) {\n        let { mkey, vkey } = this.getKeys(key);\n        if ( has(this.data, this.getKey(key)) ) {\n            let meta = get(this.data, mkey) as CacheMeta;\n            if ( meta.created + (meta.ttl * 1000) < Date.now() ) {\n                this.unset(key);\n            }\n        }\n    }\n\n    public getFilePath(){\n        return this.options.path;\n    }\n\n    public clear() {\n        this.data = {};\n    }\n\n    public getSize(): number {\n        return this.fileContent.length;\n    }\n\n    public get<T = any>(key?: string, defaultValue?: any): T {\n        if ( key === undefined ) {\n            return cloneDeep(this.data);\n        }\n        if ( !this.has(key) ) {\n            return defaultValue;\n        }\n        return get(this.data, this.getKeys(key).vkey);\n    }\n\n    public has(key: string): boolean {\n        this.unsetIfExpired(key);\n        return has(this.data, this.getKey(key));\n    }\n\n    public set(key: string, value: any)\n    public set(key: string, value: any, ttl?: number)\n    public set(...args): this {\n        let key             = args[ 0 ];\n        let { mkey, vkey }  = this.getKeys(key);\n        let value           = args[ 1 ];\n        let ttl             = args[ 2 ] || this.options.ttl;\n        let meta: CacheMeta = { created: Date.now(), ttl };\n\n        set(this.data, mkey, meta);\n        set(this.data, vkey, value);\n        this.saveDataToFile();\n        return this;\n    }\n\n\n    public unset(key: string): this {\n        unset(this.data, this.getKey(key));\n        this.saveDataToFile();\n        return this;\n    }\n}\n"]}