{"version":3,"sources":["volatile-map.ts"],"sourcesContent":["/**\n * A map that automatically removes entries after a defined time period\n * or when the map size limit is reached\n */\nexport class VolatileMap<K,V> extends Map<K,V> {\n\n\tstatic readonly MAX_MAP_ENTRIES = 2**24\n\tstatic readonly MAP_ENTRIES_CLEANUP_CHUNK = 1000\n\tstatic readonly DEFAULT_ENTRYPOINT_LIFETIME = 30*60 // 30min\n\n\t#options: VolatileMapOptions\n\t#liftimeStartTimes = new Map<K, number>()\n\t#customLifetimes = new Map<K, number>()\n\n\tconstructor(iterable?: Iterable<readonly [K, V]> | null, options: Partial<VolatileMapOptions> = {}) {\n\t\tsuper(iterable)\n\t\tthis.#options = options as VolatileMapOptions;\n\t\tthis.#options.entryLifetime ??= VolatileMap.DEFAULT_ENTRYPOINT_LIFETIME\n\t\tthis.#options.preventMapOverflow ??= true\n\n\t\tthis.#startInterval()\n\t}\n\n\t/**\n\t * Resets the lifetime of the entry.\n\t * @param key\n\t * @param overrideLifetime optionally specify a lifetime for this entry that differs from options.entryLifetime\n\t * @returns the current value for the key\n\t */\n\tkeepalive(key: K, overrideLifetime?: number) {\n\t\tif (!this.has(key)) {\n\t\t\tconsole.warn(\"key does not exist in VolatileMap\")\n\t\t\treturn;\n\t\t}\n\t\tthis.#setTimeout(key, overrideLifetime);\n\t\treturn this.get(key)\n\t}\n\n\tset(key: K, value: V): this {\n\t\t// create new lifetime timeout\n\t\tthis.#setTimeout(key)\n\t\t// maximum map size reached?\n\t\tif (this.#options.preventMapOverflow && this.size >= VolatileMap.MAX_MAP_ENTRIES) {\n\t\t\tconsole.log(\"VolatileMap size limit (\"+VolatileMap.MAX_MAP_ENTRIES+\") reached. Force removing \"+VolatileMap.MAP_ENTRIES_CLEANUP_CHUNK+\" entries.\")\n\t\t\tlet i = 0;\n\t\t\tfor (const key of this.keys()) {\n\t\t\t\tif (i == VolatileMap.MAP_ENTRIES_CLEANUP_CHUNK) break;\n\t\t\t\tthis.delete(key)\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n\n\tdelete(key: K): boolean {\n\t\tthis.#clearTimeout(key);\n\t\treturn super.delete(key)\n\t}\n\n\tclear(): void {\n\t\tfor (const key of this.keys()) this.#clearTimeout(key);\n\t\treturn super.clear();\n\t}\n\n\t#startInterval() {\n\t\tsetInterval(\n\t\t\t() => {\n\t\t\t\tconst currentTime = new Date().getTime();\n\t\t\t\tfor (const [key, time] of this.#liftimeStartTimes) {\n\t\t\t\t\tconst lifetime = 1000 * (this.#customLifetimes.get(key) ?? this.#options.entryLifetime);\n\t\t\t\t\tif (currentTime-time > lifetime) {\n\t\t\t\t\t\tthis.delete(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, \n\t\t\tMath.min(this.#options.entryLifetime, (VolatileMap.DEFAULT_ENTRYPOINT_LIFETIME)) * 1000 / 5\n\t\t)\n\t}\n\n\t#clearTimeout(key: K) {\n\t\tthis.#liftimeStartTimes.delete(key);\n\t}\n\n\t#setTimeout(key: K, overrideLifetime?: number) {\n\t\t// reset previous timeout\n\t\tthis.#clearTimeout(key);\n\t\t// store custom lifetime\n\t\tif (overrideLifetime != undefined) this.#customLifetimes.set(key, overrideLifetime)\n\t\tconst lifetime = overrideLifetime ?? this.#options.entryLifetime;\n\t\tif (Number.isFinite(lifetime)) {\n\t\t\tthis.#liftimeStartTimes.set(key, new Date().getTime())\n\t\t}\n\t}\n}\n\nexport type VolatileMapOptions = {\n\t/**\n\t * Entry lifetime in seconds. If set to Infinity,\n\t * entries are only automatically removed if the map size limit\n\t * is reached and preventMapOverflow is set to true.\n\t * Default value: 1800 (30min)\n\t */\n\tentryLifetime: number,\n\t/**\n\t * Automatically deletes the oldest entries if the number of map entries\n\t * exceeds the maximum allowed number (2^24), even if their lifetime\n\t * is not yet expired.\n\t * Default value: true\n\t */\n\tpreventMapOverflow: boolean\n}"],"names":["VolatileMap","Map","MAX_MAP_ENTRIES","MAP_ENTRIES_CLEANUP_CHUNK","DEFAULT_ENTRYPOINT_LIFETIME","constructor","iterable","options","entryLifetime","preventMapOverflow","keepalive","key","overrideLifetime","has","console","warn","get","set","value","size","log","i","keys","delete","clear","setInterval","currentTime","Date","getTime","time","Math","min","undefined","Number","isFinite"],"mappings":"AAIA,OAAO,MAAMA,oBAAyBC;IAErC,OAAgBC,kBAAkB,SAAK;IACvC,OAAgBC,4BAA4B,KAAI;IAChD,OAAgBC,8BAA8B,KAAK;IAEnD,CAAA,OAAQ,CAAoB;IAC5B,CAAA,iBAAkB,GAAG,IAAIH,MAAgB;IACzC,CAAA,eAAgB,GAAG,IAAIA,MAAgB;IAEvCI,YAAYC,QAA2C,EAAEC,UAAuC,CAAC,CAAC,CAAE;QACnG,KAAK,CAACD,WACN,IAAI,CAAC,CAAA,OAAQ,GAAGC,SAChB,IAAI,CAAC,CAAA,OAAQ,CAACC,aAAa,KAAKR,YAAYI,2BAA2B,EACvE,IAAI,CAAC,CAAA,OAAQ,CAACK,kBAAkB,KAAK,CAAA,GAErC,IAAI,CAAC,CAAA,aAAc;IACpB;IAQAC,UAAUC,GAAM,EAAEC,gBAAyB,EAAE;QAC5C,IAAI,CAAC,IAAI,CAACC,GAAG,CAACF,MAAM;YACnBG,QAAQC,IAAI,CAAC;YACb;QACD;QAEA,OADA,IAAI,CAAC,CAAA,UAAW,CAACJ,KAAKC,mBACf,IAAI,CAACI,GAAG,CAACL;IACjB;IAEAM,IAAIN,GAAM,EAAEO,KAAQ,EAAQ;QAI3B,IAFA,IAAI,CAAC,CAAA,UAAW,CAACP,MAEb,IAAI,CAAC,CAAA,OAAQ,CAACF,kBAAkB,IAAI,IAAI,CAACU,IAAI,IAAInB,YAAYE,eAAe,EAAE;YACjFY,QAAQM,GAAG,CAAC,6BAA2BpB,YAAYE,eAAe,GAAC,+BAA6BF,YAAYG,yBAAyB,GAAC;YACtI,IAAIkB,IAAI;YACR,KAAK,IAAMV,OAAO,IAAI,CAACW,IAAI,GAAI;gBAC9B,IAAID,KAAKrB,YAAYG,yBAAyB,EAAE;gBAChD,IAAI,CAACoB,MAAM,CAACZ,MACZU;YACD;QACD;QACA,OAAO,KAAK,CAACJ,IAAIN,KAAKO;IACvB;IAEAK,OAAOZ,GAAM,EAAW;QAEvB,OADA,IAAI,CAAC,CAAA,YAAa,CAACA,MACZ,KAAK,CAACY,OAAOZ;IACrB;IAEAa,QAAc;QACb,KAAK,IAAMb,OAAO,IAAI,CAACW,IAAI,GAAI,IAAI,CAAC,CAAA,YAAa,CAACX;QAClD,OAAO,KAAK,CAACa;IACd;IAEA,CAAA,aAAc;QACbC,YACC;YACC,IAAMC,cAAc,IAAIC,OAAOC,OAAO;YACtC,KAAK,IAAM,CAACjB,KAAKkB,KAAK,IAAI,IAAI,CAAC,CAAA,iBAAkB,CAE5CH,cAAYG,OADC,OAAQ,CAAA,IAAI,CAAC,CAAA,eAAgB,CAACb,GAAG,CAACL,QAAQ,IAAI,CAAC,CAAA,OAAQ,CAACH,aAAa,AAAD,KAEpF,IAAI,CAACe,MAAM,CAACZ;QAGf,GACAmB,AAAmF,OAAnFA,KAAKC,GAAG,CAAC,IAAI,CAAC,CAAA,OAAQ,CAACvB,aAAa,EAAGR,YAAYI,2BAA2B,IAAY;IAE5F;IAEA,CAAA,YAAa,CAACO,GAAM;QACnB,IAAI,CAAC,CAAA,iBAAkB,CAACY,MAAM,CAACZ;IAChC;IAEA,CAAA,UAAW,CAACA,GAAM,EAAEC,gBAAyB;QAE5C,IAAI,CAAC,CAAA,YAAa,CAACD,MAEKqB,KAAAA,KAApBpB,oBAA+B,IAAI,CAAC,CAAA,eAAgB,CAACK,GAAG,CAACN,KAAKC,mBAE9DqB,OAAOC,QAAQ,CADFtB,oBAAoB,IAAI,CAAC,CAAA,OAAQ,CAACJ,aAAa,KAE/D,IAAI,CAAC,CAAA,iBAAkB,CAACS,GAAG,CAACN,KAAK,IAAIgB,OAAOC,OAAO;IAErD;AACD","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/utils/","file":"volatile-map.ts"}