{"version":3,"sources":["../src/stores/index.ts","../src/stores/memory.ts","../src/stores/redis.ts"],"sourcesContent":["export * from './interface';\nexport * from './entry';\nexport * from './memory';\nexport * from './redis';\n","import type { Entry } from './entry';\nimport type { Store } from './interface';\n\nexport type MemoryStoreConfig<TValue> = {\n  persistentMap: Map<string, TValue>;\n};\n\nexport class MemoryStore implements Store {\n  private readonly state: Map<string, { expires: number; entry: Entry<any> }>;\n\n  public readonly name = 'memory';\n\n  constructor(\n    config: MemoryStoreConfig<{ expires: number; entry: Entry<any> }>,\n  ) {\n    this.state = config.persistentMap;\n  }\n\n  public async get<Result>(key: string): Promise<Entry<Result> | undefined> {\n    const value = this.state.get(key);\n    if (!value) {\n      return Promise.resolve(undefined);\n    }\n    if (value.expires <= Date.now()) {\n      await this.remove(key);\n    }\n    return Promise.resolve(value.entry);\n  }\n\n  public async set<Result>(key: string, entry: Entry<Result>): Promise<void> {\n    this.state.set(key, {\n      expires: entry.staleUntil,\n      entry,\n    });\n\n    return Promise.resolve();\n  }\n\n  public async remove(keys: string | string[]): Promise<void> {\n    const cacheKeys = Array.isArray(keys) ? keys : [keys];\n\n    for (const key of cacheKeys) {\n      this.state.delete(key);\n    }\n    return Promise.resolve();\n  }\n\n  public async removeByPrefix(prefix: string): Promise<void> {\n    for (const key of this.state.keys()) {\n      if (key.startsWith(prefix)) {\n        this.state.delete(key);\n      }\n    }\n  }\n}\n","import type { Redis } from 'ioredis';\n\nimport type { Entry } from './entry';\nimport type { Store } from './interface';\n\nexport type RedisStoreConfig = {\n  redis: Redis;\n  prefix?: string;\n};\n\nexport class RedisStore implements Store {\n  private readonly redis: Redis;\n  public readonly name = 'redis';\n  private readonly prefix: string;\n\n  constructor(config: RedisStoreConfig) {\n    this.redis = config.redis;\n    this.prefix = config.prefix || 'sbch';\n  }\n\n  private buildCacheKey(key: string): string {\n    return [this.prefix, key].join('::');\n  }\n\n  public async get<Result>(key: string): Promise<Entry<Result> | undefined> {\n    const res = await this.redis.get(this.buildCacheKey(key));\n    if (!res) return;\n\n    return JSON.parse(res) as Entry<Result>;\n  }\n\n  public async set<Result>(key: string, entry: Entry<Result>): Promise<void> {\n    await this.redis.set(\n      this.buildCacheKey(key),\n      JSON.stringify(entry),\n      'PXAT',\n      entry.staleUntil,\n    );\n  }\n\n  public async remove(keys: string | string[]): Promise<void> {\n    const cacheKeys = (Array.isArray(keys) ? keys : [keys]).map((key) =>\n      this.buildCacheKey(key).toString(),\n    );\n    this.redis.del(...cacheKeys);\n  }\n\n  public async removeByPrefix(prefix: string): Promise<void> {\n    const pattern = `${prefix}*`;\n    let cursor = '0';\n\n    do {\n      const [nextCursor, keys] = await this.redis.scan(\n        cursor,\n        'MATCH',\n        pattern,\n        'COUNT',\n        100,\n      );\n      cursor = nextCursor;\n\n      if (keys.length > 0) {\n        await this.redis.del(...keys);\n      }\n    } while (cursor !== '0');\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,cAAN,MAAmC;AAAA,EACvB;AAAA,EAED,OAAO;AAAA,EAEvB,YACE,QACA;AACA,SAAK,QAAQ,OAAO;AAAA,EACtB;AAAA,EAEA,MAAa,IAAY,KAAiD;AACxE,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,CAAC,OAAO;AACV,aAAO,QAAQ,QAAQ,MAAS;AAAA,IAClC;AACA,QAAI,MAAM,WAAW,KAAK,IAAI,GAAG;AAC/B,YAAM,KAAK,OAAO,GAAG;AAAA,IACvB;AACA,WAAO,QAAQ,QAAQ,MAAM,KAAK;AAAA,EACpC;AAAA,EAEA,MAAa,IAAY,KAAa,OAAqC;AACzE,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAa,OAAO,MAAwC;AAC1D,UAAM,YAAY,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAEpD,eAAW,OAAO,WAAW;AAC3B,WAAK,MAAM,OAAO,GAAG;AAAA,IACvB;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAa,eAAe,QAA+B;AACzD,eAAW,OAAO,KAAK,MAAM,KAAK,GAAG;AACnC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAK,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;;;AC5CO,IAAM,aAAN,MAAkC;AAAA,EACtB;AAAA,EACD,OAAO;AAAA,EACN;AAAA,EAEjB,YAAY,QAA0B;AACpC,SAAK,QAAQ,OAAO;AACpB,SAAK,SAAS,OAAO,UAAU;AAAA,EACjC;AAAA,EAEQ,cAAc,KAAqB;AACzC,WAAO,CAAC,KAAK,QAAQ,GAAG,EAAE,KAAK,IAAI;AAAA,EACrC;AAAA,EAEA,MAAa,IAAY,KAAiD;AACxE,UAAM,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK,cAAc,GAAG,CAAC;AACxD,QAAI,CAAC,IAAK;AAEV,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AAAA,EAEA,MAAa,IAAY,KAAa,OAAqC;AACzE,UAAM,KAAK,MAAM;AAAA,MACf,KAAK,cAAc,GAAG;AAAA,MACtB,KAAK,UAAU,KAAK;AAAA,MACpB;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,MAAwC;AAC1D,UAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG;AAAA,MAAI,CAAC,QAC3D,KAAK,cAAc,GAAG,EAAE,SAAS;AAAA,IACnC;AACA,SAAK,MAAM,IAAI,GAAG,SAAS;AAAA,EAC7B;AAAA,EAEA,MAAa,eAAe,QAA+B;AACzD,UAAM,UAAU,GAAG,MAAM;AACzB,QAAI,SAAS;AAEb,OAAG;AACD,YAAM,CAAC,YAAY,IAAI,IAAI,MAAM,KAAK,MAAM;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,eAAS;AAET,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,MAC9B;AAAA,IACF,SAAS,WAAW;AAAA,EACtB;AACF;","names":[]}