{"version":3,"sources":["../../src/service/Stash.ts"],"sourcesContent":["import { log } from '../utils/index.js';\n\ntype StashItem = any;\n\nclass Stash {\n    private store: Map<string, StashItem> = new Map();\n    private queue: Promise<void> = Promise.resolve();\n\n    /**\n     * Internal method to serialize and validate JSON-serializable object\n     */\n    private validateSerializable(value: StashItem): void {\n        // since we are using socket.io, there is no need\n        try {\n            JSON.stringify(value);\n        } catch (err) {\n            throw new Error(\"Value must be JSON-serializable.\");\n        }\n    }\n\n    /**\n     * Internal lock function to queue up tasks\n     */\n    private async withLock<T>(fn: () => Promise<T>): Promise<T> {\n        let release: () => void;\n        const next = new Promise<void>(resolve => (release = resolve));\n\n        const prev = this.queue;\n        this.queue = next;\n\n        try {\n            await prev;\n        } catch (error) {\n            log('[Stash] Error waiting for previous operation: ' + error);\n            // Continue execution even if previous operation failed\n        }\n\n        try {\n            return await fn();\n        } catch (error) {\n            log('[Stash] Error in withLock operation: ' + error);\n            throw error;\n        } finally {\n            release!();\n        }\n    }\n\n    async set(key: string, value: StashItem): Promise<void> {\n        // if now key is pass assume a defualt key\n        if(value === undefined || value === null) {\n            value = key;\n            key = '_default';\n        }\n        //this.validateSerializable(value);\n        return this.withLock(async () => {\n            this.store.set(key, value);\n        });\n    }\n\n    async get<T = StashItem>(key: string): Promise<T | undefined> {\n        if(key === undefined || key === null || key === '')\n            key = '_default';\n        return this.withLock(async () => {\n            return this.store.get(key);\n        });\n    }\n\n    async delete(key: string): Promise<void> {\n        if(key === undefined || key === null || key === '')\n            key = '_default';\n        return this.withLock(async () => {\n            this.store.delete(key);\n        });\n    }\n\n    async clear(): Promise<void> {\n        return this.withLock(async () => {\n            this.store.clear();\n        });\n    }\n\n    async has(key: string): Promise<boolean> {\n        if(key === undefined || key === null || key === '')\n            key = '_default';\n        return this.withLock(async () => {\n            return this.store.has(key);\n        });\n    }\n\n    async keys(): Promise<string[]> {\n        return this.withLock(async () => {\n            return Array.from(this.store.keys());\n        });\n    }\n}\n\nexport default Stash;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoB;AAIpB,MAAM,MAAM;AAAA,EAAZ;AACI,wBAAQ,SAAgC,oBAAI,IAAI;AAChD,wBAAQ,SAAuB,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,qBAAqB,OAAwB;AAEjD,QAAI;AACA,WAAK,UAAU,KAAK;AAAA,IACxB,SAAS,KAAK;AACV,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACtD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAY,IAAkC;AACxD,QAAI;AACJ,UAAM,OAAO,IAAI,QAAc,aAAY,UAAU,OAAQ;AAE7D,UAAM,OAAO,KAAK;AAClB,SAAK,QAAQ;AAEb,QAAI;AACA,YAAM;AAAA,IACV,SAAS,OAAO;AACZ,4BAAI,mDAAmD,KAAK;AAAA,IAEhE;AAEA,QAAI;AACA,aAAO,MAAM,GAAG;AAAA,IACpB,SAAS,OAAO;AACZ,4BAAI,0CAA0C,KAAK;AACnD,YAAM;AAAA,IACV,UAAE;AACE,cAAS;AAAA,IACb;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,KAAa,OAAiC;AAEpD,QAAG,UAAU,UAAa,UAAU,MAAM;AACtC,cAAQ;AACR,YAAM;AAAA,IACV;AAEA,WAAO,KAAK,SAAS,YAAY;AAC7B,WAAK,MAAM,IAAI,KAAK,KAAK;AAAA,IAC7B,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,IAAmB,KAAqC;AAC1D,QAAG,QAAQ,UAAa,QAAQ,QAAQ,QAAQ;AAC5C,YAAM;AACV,WAAO,KAAK,SAAS,YAAY;AAC7B,aAAO,KAAK,MAAM,IAAI,GAAG;AAAA,IAC7B,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,OAAO,KAA4B;AACrC,QAAG,QAAQ,UAAa,QAAQ,QAAQ,QAAQ;AAC5C,YAAM;AACV,WAAO,KAAK,SAAS,YAAY;AAC7B,WAAK,MAAM,OAAO,GAAG;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,QAAuB;AACzB,WAAO,KAAK,SAAS,YAAY;AAC7B,WAAK,MAAM,MAAM;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,IAAI,KAA+B;AACrC,QAAG,QAAQ,UAAa,QAAQ,QAAQ,QAAQ;AAC5C,YAAM;AACV,WAAO,KAAK,SAAS,YAAY;AAC7B,aAAO,KAAK,MAAM,IAAI,GAAG;AAAA,IAC7B,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,OAA0B;AAC5B,WAAO,KAAK,SAAS,YAAY;AAC7B,aAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,IACvC,CAAC;AAAA,EACL;AACJ;AAEA,IAAO,gBAAQ;","names":[]}