{"version":3,"file":"index.cjs","sources":["../reaper/src//main/index.ts"],"sourcesContent":["import { type Metadata } from '@cachemap/types';\nimport { isPlainObject } from 'lodash-es';\nimport {\n  type Callbacks,\n  type ConstructorOptions,\n  type DeleteCallback,\n  type Init,\n  type MetadataCallback,\n  type Options,\n} from '../types.ts';\n\nexport class Reaper {\n  private readonly _deleteCallback: DeleteCallback;\n  private readonly _interval: number;\n  private _intervalID?: NodeJS.Timeout;\n  private readonly _metadataCallback: MetadataCallback;\n\n  constructor(options: ConstructorOptions) {\n    const { deleteCallback, interval = 60_000, metadataCallback, start = false } = options;\n\n    this._deleteCallback = deleteCallback;\n    this._interval = interval;\n    this._metadataCallback = metadataCallback;\n\n    if (start) {\n      this._start();\n    }\n  }\n\n  public async cull(metadata: Metadata[]): Promise<void> {\n    await this._cull(metadata);\n  }\n\n  public start(): void {\n    this._start();\n  }\n\n  public stop(): void {\n    this._stop();\n  }\n\n  private async _cull(metadata: Metadata[]): Promise<void> {\n    if (metadata.length === 0) {\n      return;\n    }\n\n    try {\n      await Promise.all(metadata.map(({ key, tags }) => this._deleteCallback(key, tags)));\n    } catch {\n      // no catch\n    }\n  }\n\n  private _getExpiredMetadata(): Metadata[] {\n    const metadata = this._metadataCallback();\n    return metadata.filter(({ cacheability }) => !cacheability.checkTTL());\n  }\n\n  private _start(): void {\n    this._intervalID = setInterval(() => {\n      void this._cull(this._getExpiredMetadata());\n    }, this._interval);\n  }\n\n  private _stop(): void {\n    if (this._intervalID) {\n      clearInterval(this._intervalID);\n    }\n  }\n}\n\nexport const init = (options: Options = {}): Init => {\n  if (!isPlainObject(options)) {\n    throw new TypeError('@cachemap/reaper expected options to be a plain object.');\n  }\n\n  return (callbacks: Callbacks) => new Reaper({ ...options, ...callbacks });\n};\n"],"names":["Reaper","constructor","options","deleteCallback","interval","metadataCallback","start","this","_deleteCallback","_interval","_metadataCallback","_start","cull","metadata","_cull","stop","_stop","length","Promise","all","map","key","tags","_getExpiredMetadata","filter","cacheability","checkTTL","_intervalID","setInterval","clearInterval","isPlainObject","TypeError","callbacks"],"mappings":"wCAWO,MAAMA,EAMXC,WAAAA,CAAYC,GACV,MAAMC,eAAEA,EAAcC,SAAEA,EAAW,IAAMC,iBAAEA,EAAgBC,MAAEA,GAAQ,GAAUJ,EAE/EK,KAAKC,gBAAkBL,EACvBI,KAAKE,UAAYL,EACjBG,KAAKG,kBAAoBL,EAErBC,GACFC,KAAKI,QAET,CAEA,UAAaC,CAAKC,SACVN,KAAKO,MAAMD,EACnB,CAEOP,KAAAA,GACLC,KAAKI,QACP,CAEOI,IAAAA,GACLR,KAAKS,OACP,CAEA,WAAcF,CAAMD,GAClB,GAAwB,IAApBA,EAASI,OAIb,UACQC,QAAQC,IAAIN,EAASO,KAAI,EAAGC,MAAKC,UAAWf,KAAKC,gBAAgBa,EAAKC,KAC9E,CAAE,MAEF,CACF,CAEQC,mBAAAA,GAEN,OADiBhB,KAAKG,oBACNc,QAAO,EAAGC,mBAAoBA,EAAaC,YAC7D,CAEQf,MAAAA,GACNJ,KAAKoB,YAAcC,aAAY,KACxBrB,KAAKO,MAAMP,KAAKgB,sBAAmB,GACvChB,KAAKE,UACV,CAEQO,KAAAA,GACFT,KAAKoB,aACPE,cAActB,KAAKoB,YAEvB,gCAGkB,CAACzB,EAAmB,MACtC,IAAK4B,EAAAA,cAAc5B,GACjB,MAAM,IAAI6B,UAAU,2DAGtB,OAAQC,GAAyB,IAAIhC,EAAO,IAAKE,KAAY8B,GAAU"}