{
  "version": 3,
  "sources": ["../index.ts", "../src/metadata.ts", "../src/aragami.ts", "../src/utility/utility.ts", "../src/utility/encode-decode.ts", "../src/drivers/memory.ts", "../src/base-driver.ts", "../src/utility/better-lock.ts", "../src/drivers/redis.ts", "../src/drivers/redis-lock.ts", "../src/decorators.ts", "../src/utility/merge.ts", "../src/wrappers.ts"],
  "sourcesContent": ["import 'reflect-metadata';\n\nexport * from './src/aragami';\nexport * from './src/def';\nexport * from './src/decorators';\nexport * from './src/wrappers';\nexport * from './src/drivers';\nexport { AragamiReflector } from './src/metadata';\n", "import { MetadataSetter, Reflector } from 'typed-reflector';\nimport { MayBeArray } from './utility/utility';\nimport { AnyClass, Awaitable } from './def';\n\ninterface MetadataMap {\n  AragamiCacheTTL: number;\n  AragamiCachePrefix: string;\n  AragamiCacheKey: (obj: any) => Awaitable<string>;\n  AragamiType: () => AnyClass;\n}\n\ninterface MetadataArrayMap {\n  AragamiLockKeys: (obj: any) => Awaitable<MayBeArray<string>>;\n  AragamiWithKey: (param: any, obj: any, key: string) => Awaitable<string>;\n  AragamiWithLockKey: (\n    param: any,\n    obj: any,\n    key: string,\n  ) => Awaitable<MayBeArray<string>>;\n}\n\nexport const Metadata = new MetadataSetter<MetadataMap, MetadataArrayMap>();\nexport const AragamiReflector = new Reflector<\n  MetadataMap,\n  MetadataArrayMap\n>();\nexport const reflector = AragamiReflector;\n", "import { BaseDriver } from './base-driver';\nimport { AnyClass, AragamiOptions, Awaitable, ClassType } from './def';\nimport { reflector } from './metadata';\nimport { encode, decode } from 'encoded-buffer';\n\nimport { makeArray, MayBeArray } from './utility/utility';\nimport { PartialDeep } from './utility/partial-deep';\nimport { wrapClass } from './utility/encode-decode';\nimport { MemoryDriver, RedisDriver } from './drivers';\n\nexport class Aragami {\n  readonly driver: BaseDriver;\n\n  constructor(private options: AragamiOptions = {}) {\n    this.driver =\n      options.useDriver ||\n      (options.redis ? new RedisDriver(options.redis) : new MemoryDriver());\n  }\n\n  private getBaseKey(o: string | any): string {\n    if (typeof o === 'string') {\n      return o;\n    }\n    const keyFromMetadata = reflector.get('AragamiCachePrefix', o);\n    if (keyFromMetadata) {\n      return keyFromMetadata;\n    }\n    const keyFromConstructor =\n      typeof o === 'function' ? o.name : o.constructor?.name;\n    if (keyFromConstructor) {\n      return keyFromConstructor;\n    }\n    return 'default';\n  }\n\n  private async getKey(o: any, prototype?: AnyClass, fallback?: string) {\n    if (typeof o === 'string') {\n      return o;\n    }\n    if (prototype) {\n      o = wrapClass(prototype, o);\n    }\n    const keyTransformer = reflector.get('AragamiCacheKey', o);\n    if (!keyTransformer) {\n      if (fallback) {\n        return fallback;\n      }\n      throw new Error(`No key metadata found for ${o.constructor.name}`);\n    }\n    return await keyTransformer(o);\n  }\n\n  private getTTL(o: any) {\n    return reflector.get('AragamiCacheTTL', o) ?? this.options.defaultTTL ?? 0;\n  }\n\n  private encode(o: any) {\n    return encode(o);\n  }\n\n  private decode<T>(cl: ClassType<T>, value: Buffer) {\n    return wrapClass(cl, decode(value)[0]);\n  }\n\n  async get<T>(cl: ClassType<T>, key: string) {\n    const value = await this.driver.get(this.getBaseKey(cl), key);\n    if (!value) {\n      return;\n    }\n    return this.decode(cl, value);\n  }\n\n  async set<T>(\n    o: T,\n    options?: { ttl?: number; key?: string; prototype?: ClassType<T> },\n  ): Promise<T>;\n  async set<T>(\n    prototype: ClassType<T>,\n    o: PartialDeep<T>,\n    options?: { ttl?: number; key?: string },\n  ): Promise<T>;\n  async set<T>(...args: any[]) {\n    let prototype: ClassType<T>;\n    let o: T;\n    let options: { ttl?: number; key?: string; prototype?: ClassType<T> };\n    const firstArg = args[0];\n    if (typeof firstArg === 'function') {\n      prototype = firstArg;\n      o = args[1];\n      options = args[2] || {};\n    } else {\n      o = firstArg;\n      options = args[1] || {};\n      prototype = options.prototype;\n    }\n    if (!o) {\n      return o;\n    }\n    if (prototype) {\n      o = wrapClass(prototype, o);\n    }\n    const buf = this.encode(o);\n    await this.driver.set(\n      this.getBaseKey(o),\n      options.key || (await this.getKey(o)),\n      buf,\n      options.ttl ?? this.getTTL(o),\n    );\n    return o;\n  }\n\n  async has(base: AnyClass | string, key: string): Promise<boolean>;\n  async has(base: any): Promise<boolean>;\n  async has(base: any, key?: string) {\n    return this.driver.has(\n      this.getBaseKey(base),\n      key || (await this.getKey(base)),\n    );\n  }\n\n  async del(base: AnyClass | string, key: string): Promise<boolean>;\n  async del(base: any): Promise<boolean>;\n  async del(base: any, key?: string) {\n    return this.driver.del(\n      this.getBaseKey(base),\n      key || (await this.getKey(base)),\n    );\n  }\n\n  async clear(base: AnyClass | string, prefix?: string) {\n    return this.driver.clear(this.getBaseKey(base), prefix);\n  }\n\n  async keys(base: AnyClass | string, prefix?: string) {\n    return this.driver.keys(this.getBaseKey(base), prefix);\n  }\n\n  async values<T>(cl: ClassType<T>, prefix?: string) {\n    const buffers = await this.driver.values(this.getBaseKey(cl), prefix);\n    return buffers.map((buf) => this.decode(cl, buf));\n  }\n\n  async entries<T>(cl: ClassType<T>, prefix?: string): Promise<[string, T][]> {\n    const entries = await this.driver.entries(this.getBaseKey(cl), prefix);\n    return entries.map(([key, buf]) => [key, this.decode(cl, buf)]);\n  }\n\n  async cache<T>(\n    cl: ClassType<T>,\n    keyOrMeta: string | T,\n    cb: () => Awaitable<T>,\n  ) {\n    const key = await this.getKey(keyOrMeta, cl);\n    if (!key) {\n      return cb();\n    }\n    const cachedValue = await this.get(cl, key);\n    if (cachedValue != null) {\n      return cachedValue;\n    }\n    const value = await cb();\n    if (value != null) {\n      await this.set(value, { key, prototype: cl });\n    }\n    return value;\n  }\n\n  useCache<T, A extends any[]>(\n    cl: ClassType<T>,\n    cb: (...args: A) => Awaitable<T>,\n    keySource: (...args: A) => Awaitable<string | T>,\n  ) {\n    return async (...args: A): Promise<T> => {\n      const keyMeta = await keySource(...args);\n      return this.cache(cl, keyMeta, () => cb(...args));\n    };\n  }\n\n  private async getLockKeys(o: any) {\n    if (typeof o === 'string') {\n      return [o];\n    }\n    const baseKey = this.getBaseKey(o);\n    const keyTransformers = reflector.getArray('AragamiLockKeys', o);\n    const actualKeys = await Promise.all(keyTransformers.map((fn) => fn(o)));\n    return actualKeys\n      .flatMap((mayBeKeyArray) =>\n        makeArray(mayBeKeyArray).map((key) => `${baseKey}:${key}`),\n      )\n      .filter((s) => !!s);\n  }\n\n  async lock<R>(\n    keys: MayBeArray<string | any>,\n    cb: () => Awaitable<R>,\n  ): Promise<R> {\n    const keyMeta = makeArray(keys);\n    const actualKeys = (\n      await Promise.all(keyMeta.map((o) => this.getLockKeys(o)))\n    ).flat();\n    if (!actualKeys.length) {\n      return cb();\n    }\n    return this.driver.lock(actualKeys, async () => await cb());\n  }\n\n  async isFree(keys: MayBeArray<string | any>) {\n    const keyMeta = makeArray(keys);\n    const actualKeys = (\n      await Promise.all(keyMeta.map((o) => this.getLockKeys(o)))\n    ).flat();\n    if (!keys.length) {\n      return true;\n    }\n    return this.driver.isFree(actualKeys);\n  }\n\n  useLock<A extends any[], R>(\n    cb: (...args: A) => R,\n    keySource: (...args: A) => Awaitable<MayBeArray<string | any>>,\n  ) {\n    return async (...args: A) => {\n      const keys = await keySource(...args);\n      return this.lock(keys, () => cb(...args));\n    };\n  }\n\n  async destroy() {\n    try {\n      await this.driver.destroy();\n    } catch (e) {}\n  }\n\n  async isQueueEmpty<T>(cl: ClassType<T>, key = 'default') {\n    return this.driver.isQueueEmpty(this.getBaseKey(cl) + ':' + key);\n  }\n\n  async queueLength<T>(cl: ClassType<T>, key = 'default') {\n    return this.driver.queueLength(this.getBaseKey(cl) + ':' + key);\n  }\n\n  async queueItems<T>(cl: ClassType<T>, key = 'default') {\n    const items = await this.driver.queueItems(this.getBaseKey(cl) + ':' + key);\n    return items.map((buf) => this.decode(cl, buf));\n  }\n\n  async queueAdd<T>(\n    o: T,\n    options?: { key?: string; prototype?: ClassType<T>; prior?: boolean },\n  ): Promise<T>;\n  async queueAdd<T>(\n    prototype: ClassType<T>,\n    o: PartialDeep<T>,\n    options?: { key?: string; prior?: boolean },\n  ): Promise<T>;\n  async queueAdd<T>(...args: any[]) {\n    let prototype: ClassType<T>;\n    let o: T;\n    let options: {\n      ttl?: number;\n      key?: string;\n      prototype?: ClassType<T>;\n      prior?: boolean;\n    };\n    const firstArg = args[0];\n    if (typeof firstArg === 'function') {\n      prototype = firstArg;\n      o = args[1];\n      options = args[2] || {};\n    } else {\n      o = firstArg;\n      options = args[1] || {};\n      prototype = options.prototype;\n    }\n    if (!o) {\n      return o;\n    }\n    if (prototype) {\n      o = wrapClass(prototype, o);\n    }\n    const buf = this.encode(o);\n    const key =\n      this.getBaseKey(o) +\n      ':' +\n      (options.key || (await this.getKey(o, undefined, 'default')));\n    await this.driver.queueAdd(key, buf, options.prior);\n    return o;\n  }\n\n  async queueGather<T>(prototype: ClassType<T>, key = 'default'): Promise<T> {\n    const baseKey = this.getBaseKey(prototype);\n    const buffer = await this.driver.queueGather(baseKey + ':' + key);\n    if (!buffer) {\n      return;\n    }\n    return this.decode(prototype, buffer);\n  }\n\n  async queueGatherBlocking<T>(\n    prototype: ClassType<T>,\n    key = 'default',\n  ): Promise<T> {\n    const baseKey = this.getBaseKey(prototype);\n    const buffer = await this.driver.queueGatherBlocking(baseKey + ':' + key);\n    return this.decode(prototype, buffer);\n  }\n\n  async queueClear<T>(prototype: ClassType<T>, key = 'default') {\n    const baseKey = this.getBaseKey(prototype);\n    await this.driver.queueClear(baseKey + ':' + key);\n  }\n\n  async queueResumeAll<T>(\n    prototype: ClassType<T>,\n    key = 'default',\n    prior?: boolean,\n  ) {\n    const baseKey = this.getBaseKey(prototype);\n    await this.driver.queueResumeAll(baseKey + ':' + key, prior);\n  }\n\n  async runQueueOnce<T, R>(\n    prototype: ClassType<T>,\n    cb: (item: T) => Awaitable<R>,\n    key = 'default',\n  ) {\n    const baseKey = this.getBaseKey(prototype);\n    const buffer = await this.driver.queueGatherBlocking(baseKey + ':' + key);\n    const object = this.decode(prototype, buffer);\n    try {\n      const res = await cb(object);\n      await this.driver.queueAck(baseKey + ':' + key, buffer);\n      return res;\n    } catch (e) {\n      await this.driver.queueResume(baseKey + ':' + key, buffer, true);\n      throw e;\n    }\n  }\n}\n", "export type MayBeArray<T> = T | T[];\nexport function makeArray<T>(o: MayBeArray<T>): T[] {\n  return Array.isArray(o) ? o : [o];\n}\n", "import { AnyClass, ClassType } from '../def';\nimport { reflector } from '../metadata';\n\nexport const dewrapClass = (value: any) => {\n  return value;\n};\n\nfunction isClass(target: any) {\n  if (typeof target !== 'function') {\n    return false;\n  }\n  return (\n    target.constructor === Function &&\n    (target === Date || target.toString().startsWith('class '))\n  );\n}\n\nexport const wrapClass = <T>(\n  cl: ClassType<T>,\n  value: any,\n  visited = new Set(),\n): T => {\n  if (\n    !isClass(cl) ||\n    value instanceof cl ||\n    value == null ||\n    visited.has(value)\n  ) {\n    return value;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  if (cl === Date) {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    return new Date(value) as any;\n  }\n\n  visited.add(value);\n\n  const instance = new cl();\n\n  const runField = (key: string, val: any) => {\n    const meta = reflector.get('AragamiType', cl, key);\n    let fieldCl: AnyClass;\n    if (meta) {\n      fieldCl = meta();\n    } else {\n      // use design:type\n      fieldCl = Reflect.getMetadata('design:type', cl.prototype, key);\n    }\n\n    return wrapClass(fieldCl, val, visited);\n  };\n\n  for (const key of Object.keys(value)) {\n    const field = value[key];\n    if (Array.isArray(field)) {\n      instance[key] = field.map((v: any) => runField(key, v));\n    } else {\n      instance[key] = runField(key, field);\n    }\n  }\n  return instance;\n};\n", "import LRUCache from 'lru-cache';\nimport { BaseDriver } from '../base-driver';\nimport BetterLock from '../utility/better-lock';\n\nexport class MemoryDriver extends BaseDriver {\n  private cacheMap = new Map<string, LRUCache<string, Buffer>>();\n  private betterLock = new BetterLock();\n\n  async destroy() {\n    for (const cache of this.cacheMap.values()) {\n      cache.clear();\n    }\n    this.cacheMap.clear();\n    this.queues.clear();\n    [...this.blockingGathers.values()].forEach((v) =>\n      v.forEach((f) => f(undefined)),\n    );\n    this.blockingGathers.clear();\n  }\n\n  private getCacheInstance(baseKey: string) {\n    if (!this.cacheMap.has(baseKey)) {\n      this.cacheMap.set(\n        baseKey,\n        new LRUCache({\n          ttl: 1,\n          updateAgeOnGet: false,\n          updateAgeOnHas: false,\n        }),\n      );\n    }\n    return this.cacheMap.get(baseKey);\n  }\n\n  override async get(baseKey: string, key: string): Promise<Buffer> {\n    const cache = this.getCacheInstance(baseKey);\n    return cache.get(key);\n  }\n\n  override async set(\n    baseKey: string,\n    key: string,\n    value: Buffer,\n    ttl: number,\n  ): Promise<void> {\n    const cache = this.getCacheInstance(baseKey);\n    cache.set(key, value, { ttl });\n  }\n\n  override async del(baseKey: string, key: string): Promise<boolean> {\n    const cache = this.getCacheInstance(baseKey);\n    return cache.delete(key);\n  }\n\n  override async keys(baseKey: string, prefix?: string): Promise<string[]> {\n    const cache = this.getCacheInstance(baseKey);\n    let keys = Array.from(cache.keys());\n    if (prefix) {\n      keys = keys.filter((key) => key.startsWith(prefix));\n    }\n    return keys;\n  }\n\n  override async clear(baseKey: string, prefix?: string): Promise<void> {\n    const cache = this.getCacheInstance(baseKey);\n    if (prefix) {\n      const keys = Array.from(cache.keys());\n      for (const key of keys) {\n        if (key.startsWith(prefix)) {\n          cache.delete(key);\n        }\n      }\n    } else {\n      cache.clear();\n    }\n  }\n\n  override lock<R>(keys: string[], cb: () => Promise<R>): Promise<R> {\n    return this.betterLock.acquire(keys, cb);\n  }\n\n  override async isFree(keys: string[]): Promise<boolean> {\n    return keys.every((key) => this.betterLock.canAcquire(key));\n  }\n\n  private queues = new Map<string, Buffer[]>();\n  private backupQueues = new Map<string, Buffer[]>();\n  private blockingGathers = new Map<string, ((buf: Buffer) => void)[]>();\n\n  private getQueue(key: string) {\n    if (!this.queues.has(key)) {\n      this.queues.set(key, []);\n    }\n    return this.queues.get(key);\n  }\n\n  private getBackupQueue(key: string) {\n    if (!this.backupQueues.has(key)) {\n      this.backupQueues.set(key, []);\n    }\n    return this.backupQueues.get(key);\n  }\n\n  override async queueAdd(\n    key: string,\n    value: Buffer,\n    prior?: boolean,\n  ): Promise<void> {\n    if (this.blockingGathers.has(key)) {\n      const cb = this.blockingGathers.get(key).shift();\n      if (cb) {\n        cb(value);\n        return;\n      }\n    }\n    const queue = this.getQueue(key);\n    if (prior) {\n      queue.unshift(value);\n    } else {\n      queue.push(value);\n    }\n  }\n\n  async queueItems(key: string): Promise<Buffer[]> {\n    return [...(this.queues.get(key) || [])];\n  }\n\n  override async queueGather(key: string): Promise<Buffer> {\n    const queue = this.queues.get(key);\n    if (!queue.length) return;\n    const elem = queue.shift();\n    const backupQueue = this.getBackupQueue(key);\n    backupQueue.push(elem);\n    return elem;\n  }\n\n  override async queueGatherBlocking(key: string): Promise<Buffer> {\n    const itemInQueue = await this.queueGather(key);\n    if (itemInQueue) return itemInQueue;\n    if (!this.blockingGathers.has(key)) {\n      this.blockingGathers.set(key, []);\n    }\n    return new Promise((resolve) => {\n      this.blockingGathers.get(key).push(resolve);\n    });\n  }\n\n  override async queueAck(key: string, value: Buffer): Promise<void> {\n    const backupQueue = this.getBackupQueue(key);\n    const idx = backupQueue.findIndex((v) => value.equals(v));\n    if (idx === -1) return;\n    backupQueue.splice(idx, 1);\n  }\n\n  override async queueResume(\n    key: string,\n    value: Buffer,\n    prior?: boolean,\n  ): Promise<void> {\n    const backupQueue = this.getBackupQueue(key);\n    const idx = backupQueue.findIndex((v) => value.equals(v));\n    if (idx === -1) return;\n    backupQueue.splice(idx, 1);\n    return this.queueAdd(key, value, prior);\n  }\n\n  override async queueResumeAll(key: string, prior?: boolean): Promise<void> {\n    const backupQueue = this.getBackupQueue(key);\n    if (prior) {\n      backupQueue.reverse();\n    }\n    for (const value of backupQueue) {\n      await this.queueAdd(key, value, prior);\n    }\n    backupQueue.splice(0, backupQueue.length);\n  }\n\n  override async queueClear(key: string): Promise<void> {\n    this.queues.delete(key);\n  }\n}\n", "export class BaseDriver {\n  protected usingKey(baseKey: string, key: string): string {\n    return `${baseKey}:${key}`;\n  }\n\n  async get(baseKey: string, key: string): Promise<Buffer> {\n    return;\n  }\n\n  async has(baseKey: string, key: string): Promise<boolean> {\n    return !!(await this.get(baseKey, key));\n  }\n\n  async set(\n    baseKey: string,\n    key: string,\n    value: Buffer,\n    ttl: number,\n  ): Promise<void> {}\n\n  async del(baseKey: string, key: string): Promise<boolean> {\n    return false;\n  }\n\n  async keys(baseKey: string, prefix?: string): Promise<string[]> {\n    return [];\n  }\n\n  async values(baseKey: string, prefix?: string): Promise<Buffer[]> {\n    const keys = await this.keys(baseKey, prefix);\n    return Promise.all(keys.map((key) => this.get(baseKey, key)));\n  }\n\n  async entries(baseKey: string, prefix?: string): Promise<[string, Buffer][]> {\n    const keys = await this.keys(baseKey, prefix);\n    return Promise.all(\n      keys.map(async (key) => [key, await this.get(baseKey, key)]),\n    );\n  }\n\n  async clear(baseKey: string, prefix?: string) {\n    const keys = await this.keys(baseKey, prefix);\n    await Promise.all(keys.map((key) => this.del(baseKey, key)));\n  }\n\n  lock<R>(keys: string[], cb: () => Promise<R>) {\n    return cb();\n  }\n\n  async isFree(keys: string[]): Promise<boolean> {\n    return true;\n  }\n\n  async destroy(): Promise<void> {}\n\n  async isQueueEmpty(key: string): Promise<boolean> {\n    return (await this.queueLength(key)) === 0;\n  }\n\n  async queueLength(key: string): Promise<number> {\n    return (await this.queueItems(key)).length;\n  }\n\n  async queueItems(key: string): Promise<Buffer[]> {\n    return [];\n  }\n\n  async queueAdd(key: string, value: Buffer, prior?: boolean): Promise<void> {}\n\n  async queueGather(key: string): Promise<Buffer> {\n    return;\n  }\n\n  async queueGatherBlocking(key: string): Promise<Buffer> {\n    while (true) {\n      const value = await this.queueGather(key);\n      if (value) {\n        return value;\n      }\n      await new Promise((resolve) => setTimeout(resolve, 10));\n    }\n  }\n\n  async queueAck(key: string, value: Buffer): Promise<void> {\n    return;\n  }\n\n  async queueResume(\n    key: string,\n    value: Buffer,\n    prior?: boolean,\n  ): Promise<void> {\n    return;\n  }\n\n  async queueResumeAll(key: string, prior?: boolean): Promise<void> {\n    return;\n  }\n\n  async queueClear(key: string): Promise<void> {}\n}\n", "import BetterLockExport from 'better-lock';\n\ntype BetterLockConstructor = typeof BetterLockExport;\ntype BetterLockInterop = {\n  default?: BetterLockConstructor;\n  BetterLock?: BetterLockConstructor;\n};\n\nconst interop = BetterLockExport as BetterLockConstructor & BetterLockInterop;\n\nconst BetterLock = (\n  typeof BetterLockExport === 'function'\n    ? BetterLockExport\n    : interop.default ?? interop.BetterLock\n) as BetterLockConstructor;\n\nexport default BetterLock;\n", "import { BaseDriver } from '../base-driver';\nimport Redis from 'ioredis';\nimport { randomBytes } from 'crypto';\nimport { Awaitable, RedisDriverOptions } from '../def';\nimport { createPool } from 'generic-pool';\nimport BetterLock from '../utility/better-lock';\nimport { defineLockCommands, LockAcquireTimeoutError } from './redis-lock';\n\nexport class RedisDriver extends BaseDriver {\n  async createRedisClient() {\n    let redis: Redis;\n    if (this.options.uri) {\n      redis = new Redis(this.options.uri);\n    } else {\n      redis = new Redis(this.options);\n    }\n    defineLockCommands(redis);\n    // await redis.connect();\n    return redis;\n  }\n\n  async useTempRedisClient<T>(cb: (redis: Redis) => Awaitable<T>) {\n    const redis = await this.createRedisClient();\n    try {\n      return await cb(redis);\n    } finally {\n      await redis.quit();\n    }\n  }\n\n  private pool = createPool({\n    create: async () => {\n      const redis = await this.createRedisClient();\n      return {\n        redis,\n        // redlock: new Redlock([redis], this.options.lock),\n      };\n    },\n    destroy: async ({ redis }) => {\n      await redis.quit();\n    },\n  });\n  constructor(private options: RedisDriverOptions) {\n    super();\n  }\n\n  override async has(baseKey: string, key: string) {\n    return (\n      (await this.pool.use((r) =>\n        r.redis.exists(this.usingKey(baseKey, key)),\n      )) !== 0\n    );\n  }\n\n  override async get(baseKey: string, key: string): Promise<Buffer> {\n    return this.pool.use((r) => r.redis.getBuffer(this.usingKey(baseKey, key)));\n  }\n\n  override async set(\n    baseKey: string,\n    key: string,\n    value: Buffer,\n    ttl: number,\n  ): Promise<void> {\n    const redisKey = this.usingKey(baseKey, key);\n    await this.pool.use((r) => {\n      if (ttl) {\n        return r.redis.set(redisKey, value, 'PX', ttl);\n      } else {\n        return r.redis.set(redisKey, value);\n      }\n    });\n  }\n\n  override async del(baseKey: string, key: string): Promise<boolean> {\n    return !!(await this.pool.use((r) =>\n      r.redis.del(this.usingKey(baseKey, key)),\n    ));\n  }\n\n  private originalKeys(baseKey: string, prefix = '') {\n    return this.pool.use((r) =>\n      r.redis.keys(this.usingKey(baseKey, `${prefix}*`)),\n    );\n  }\n\n  override async keys(baseKey: string, prefix?: string): Promise<string[]> {\n    const keys = await this.originalKeys(baseKey, prefix ?? '');\n    return keys.map((key) => key.slice(baseKey.length + 1));\n  }\n\n  override async clear(baseKey: string, prefix?: string): Promise<void> {\n    const keys = await this.originalKeys(baseKey, prefix);\n    if (!keys.length) {\n      return;\n    }\n    await this.pool.use((r) => r.redis.del(keys));\n  }\n\n  private betterLock = new BetterLock();\n\n  private get lockSettings() {\n    const lock = this.options.lock || {};\n    const duration = lock.duration || 5000;\n    return {\n      prefix: lock.prefix || '_lock',\n      duration,\n      acquireTimeout: lock.acquireTimeout ?? 0,\n      retryDelay: lock.retryDelay ?? 200,\n      retryJitter: lock.retryJitter ?? 100,\n      extensionThreshold: Math.min(\n        lock.extensionThreshold ?? lock.automaticExtensionThreshold ?? 500,\n        Math.floor(duration / 2),\n      ),\n      retryCount: lock.retryCount ?? -1,\n    };\n  }\n\n  private get lockReleaseChannel() {\n    return `${this.lockSettings.prefix}:__released__`;\n  }\n\n  private subscriberPromise: Promise<Redis>;\n  private releaseListeners = new Set<(key: string) => void>();\n  private lockWakers = new Set<() => void>();\n\n  /**\n   * A dedicated connection subscribed to lock release notifications, so\n   * waiters are woken up immediately instead of polling.\n   */\n  private getSubscriber() {\n    if (!this.subscriberPromise) {\n      this.subscriberPromise = (async () => {\n        const subscriber = await this.createRedisClient();\n        subscriber.on('message', (channel: string, message: string) => {\n          if (channel !== this.lockReleaseChannel) return;\n          for (const listener of [...this.releaseListeners]) {\n            listener(message);\n          }\n        });\n        await subscriber.subscribe(this.lockReleaseChannel);\n        return subscriber;\n      })();\n      this.subscriberPromise.catch(() => {\n        this.subscriberPromise = undefined;\n      });\n    }\n    return this.subscriberPromise;\n  }\n\n  private async acquireLock(lockKeys: string[], value: string) {\n    const settings = this.lockSettings;\n    const deadline =\n      settings.acquireTimeout > 0\n        ? Date.now() + settings.acquireTimeout\n        : Infinity;\n    const maxAttempts =\n      settings.retryCount < 0 ? Infinity : settings.retryCount + 1;\n    let attempts = 0;\n    // Best-effort: polling still works if the subscriber fails.\n    await this.getSubscriber().catch(() => undefined);\n    const keySet = new Set(lockKeys);\n    for (;;) {\n      if (this.quitted) {\n        throw new Error('RedisDriver has been destroyed.');\n      }\n      // Register the waiter before attempting, so a release happening\n      // right after a failed attempt is never missed.\n      let wake: () => void;\n      const wakeProm = new Promise<void>((resolve) => (wake = resolve));\n      const listener = (key: string) => {\n        if (keySet.has(key)) wake();\n      };\n      this.releaseListeners.add(listener);\n      this.lockWakers.add(wake);\n      let sleepTimer: NodeJS.Timeout;\n      try {\n        const acquired = await this.pool.use((r) =>\n          r.redis.aragamiAcquireLock(\n            lockKeys.length,\n            ...lockKeys,\n            value,\n            settings.duration,\n          ),\n        );\n        if (acquired === 1) return;\n        attempts += 1;\n        const now = Date.now();\n        if (attempts >= maxAttempts || now >= deadline) {\n          throw new LockAcquireTimeoutError(lockKeys);\n        }\n        const jitter = Math.floor(\n          (Math.random() * 2 - 1) * settings.retryJitter,\n        );\n        const delay = Math.min(\n          Math.max(10, settings.retryDelay + jitter),\n          deadline - now,\n        );\n        await Promise.race([\n          wakeProm,\n          new Promise((resolve) => (sleepTimer = setTimeout(resolve, delay))),\n        ]);\n      } finally {\n        clearTimeout(sleepTimer);\n        this.releaseListeners.delete(listener);\n        this.lockWakers.delete(wake);\n      }\n    }\n  }\n\n  private async runWithLock<R>(keys: string[], cb: () => Promise<R>) {\n    const settings = this.lockSettings;\n    const lockKeys = keys.map((key) => `${settings.prefix}:${key}`);\n    const value = randomBytes(16).toString('hex');\n    await this.acquireLock(lockKeys, value);\n\n    let finished = false;\n    let timer: NodeJS.Timeout;\n    const extend = async () => {\n      if (finished) return;\n      try {\n        const extended = await this.pool.use((r) =>\n          r.redis.aragamiExtendLock(\n            lockKeys.length,\n            ...lockKeys,\n            value,\n            settings.duration,\n          ),\n        );\n        // The lock was lost (expired or taken over); stop extending.\n        if (extended !== 1) return;\n        if (!finished) {\n          timer = setTimeout(\n            extend,\n            Math.max(100, settings.duration - settings.extensionThreshold),\n          );\n        }\n      } catch (e) {\n        // Transient redis error; retry quickly until the lock expires.\n        if (!finished) {\n          timer = setTimeout(extend, 100);\n        }\n      }\n    };\n    timer = setTimeout(\n      extend,\n      Math.max(100, settings.duration - settings.extensionThreshold),\n    );\n\n    try {\n      return await cb();\n    } finally {\n      finished = true;\n      clearTimeout(timer);\n      await this.pool\n        .use((r) =>\n          r.redis.aragamiReleaseLock(\n            lockKeys.length,\n            ...lockKeys,\n            value,\n            this.lockReleaseChannel,\n          ),\n        )\n        .catch(() => {\n          // The lock will expire on its own.\n        });\n    }\n  }\n\n  override async lock<R>(keys: string[], cb: () => Promise<R>): Promise<R> {\n    const run = () => this.runWithLock(keys, cb);\n    if (this.options?.lock?.stacked) {\n      return this.betterLock.acquire(keys, run);\n    } else {\n      return run();\n    }\n  }\n\n  override async isFree(keys: string[]): Promise<boolean> {\n    const lockKeys = keys.map(\n      (key) => `${this.options.lock?.prefix || '_lock'}:${key}`,\n    );\n    return (await this.pool.use((r) => r.redis.exists(...lockKeys))) === 0;\n  }\n\n  quitted = false;\n\n  async destroy() {\n    this.quitted = true;\n    [...this.waitingBlockingProms.values()].forEach((resolve) => resolve());\n    [...this.lockWakers].forEach((wake) => wake());\n    if (this.subscriberPromise) {\n      await this.subscriberPromise\n        .then((subscriber) => subscriber.quit())\n        .catch(() => {});\n    }\n    await this.pool.drain();\n    await this.pool.clear();\n  }\n\n  private getQueueKey(key: string) {\n    return `${this.options.queueKey || '_queue'}:${key}`;\n  }\n\n  private getQueueBackupKey(key: string) {\n    return `${this.options.queueBackupKey || '_queue_backup'}:${key}`;\n  }\n\n  async queueLength(key: string): Promise<number> {\n    const _key = this.getQueueKey(key);\n    return this.pool.use((r) => r.redis.llen(_key));\n  }\n\n  async queueItems(key: string): Promise<Buffer[]> {\n    const _key = this.getQueueKey(key);\n    return this.pool.use((r) => r.redis.lrangeBuffer(_key, 0, -1));\n  }\n\n  override async queueAdd(\n    key: string,\n    value: Buffer,\n    prior?: boolean,\n  ): Promise<void> {\n    const _key = this.getQueueKey(key);\n    await this.pool.use(async (r) => {\n      if (prior) {\n        await r.redis.lpush(_key, value);\n      } else {\n        await r.redis.rpush(_key, value);\n      }\n    });\n  }\n\n  override async queueGather(key: string): Promise<Buffer> {\n    const _key = this.getQueueKey(key);\n    const backupKey = this.getQueueBackupKey(key);\n    const value = await this.pool.use((r) =>\n      r.redis.lmoveBuffer(_key, backupKey, 'LEFT', 'RIGHT'),\n    );\n    return value || undefined;\n  }\n\n  private waitingBlockingProms = new Map<Promise<Buffer>, () => void>();\n\n  override async queueGatherBlocking(key: string): Promise<Buffer> {\n    if (this.quitted) return;\n    const _key = this.getQueueKey(key);\n    const backupKey = this.getQueueBackupKey(key);\n    const res = await this.useTempRedisClient(async (redisClient) => {\n      try {\n        const valueProm = redisClient.blmoveBuffer(\n          _key,\n          backupKey,\n          'LEFT',\n          'RIGHT',\n          0,\n        );\n        const exitProm = new Promise<void>((resolve) => {\n          this.waitingBlockingProms.set(valueProm, resolve);\n        });\n        const value = await Promise.race([valueProm, exitProm]);\n        this.waitingBlockingProms.delete(valueProm);\n        if (value) return value;\n      } catch (e) {}\n    });\n    return res || this.queueGatherBlocking(key);\n  }\n\n  async queueAck(key: string, value: Buffer): Promise<void> {\n    if (this.quitted) return;\n    const backupKey = this.getQueueBackupKey(key);\n    await this.pool.use((r) => r.redis.lrem(backupKey, 1, value));\n  }\n\n  async queueResume(\n    key: string,\n    value: Buffer,\n    prior?: boolean,\n  ): Promise<void> {\n    if (this.quitted) return;\n    const _key = this.getQueueKey(key);\n    const backupKey = this.getQueueBackupKey(key);\n    await this.pool.use(async (r) => {\n      if (!(await r.redis.lrem(backupKey, 1, value))) return;\n      if (prior) {\n        await r.redis.lpush(_key, value);\n      } else {\n        await r.redis.rpush(_key, value);\n      }\n    });\n  }\n\n  async queueResumeAll(key: string, prior?: boolean): Promise<void> {\n    if (this.quitted) return;\n    const _key = this.getQueueKey(key);\n    const backupKey = this.getQueueBackupKey(key);\n    await this.pool.use(async (r) => {\n      const values = await r.redis.lrangeBuffer(backupKey, 0, -1);\n      const commands = r.redis.multi().del(backupKey);\n      if (prior) {\n        values.reverse();\n        values.forEach((value) => commands.lpush(_key, value));\n      } else {\n        values.forEach((value) => commands.rpush(_key, value));\n      }\n      await commands.exec();\n    });\n  }\n\n  async queueClear(key: string): Promise<void> {\n    const _key = this.getQueueKey(key);\n    await this.pool.use((r) => r.redis.del(_key));\n  }\n}\n", "import type Redis from 'ioredis';\nimport type { Result } from 'ioredis';\n\n// Acquires all KEYS atomically (all-or-nothing).\n// ARGV[1] = lock value, ARGV[2] = ttl in ms.\n// Returns 1 on success, 0 if any key is already held.\nconst ACQUIRE_SCRIPT = `\n  for _, key in ipairs(KEYS) do\n    if redis.call(\"exists\", key) == 1 then\n      return 0\n    end\n  end\n  for _, key in ipairs(KEYS) do\n    redis.call(\"set\", key, ARGV[1], \"PX\", ARGV[2])\n  end\n  return 1\n`;\n\n// Extends all KEYS if they are still held with ARGV[1].\n// ARGV[1] = lock value, ARGV[2] = ttl in ms.\n// Returns 1 on success, 0 if the lock was lost.\nconst EXTEND_SCRIPT = `\n  for _, key in ipairs(KEYS) do\n    if redis.call(\"get\", key) ~= ARGV[1] then\n      return 0\n    end\n  end\n  for _, key in ipairs(KEYS) do\n    redis.call(\"pexpire\", key, ARGV[2])\n  end\n  return 1\n`;\n\n// Releases KEYS held with ARGV[1] and notifies waiters via ARGV[2] channel.\n// Returns the number of keys released.\nconst RELEASE_SCRIPT = `\n  local count = 0\n  for _, key in ipairs(KEYS) do\n    if redis.call(\"get\", key) == ARGV[1] then\n      redis.call(\"del\", key)\n      redis.call(\"publish\", ARGV[2], key)\n      count = count + 1\n    end\n  end\n  return count\n`;\n\ndeclare module 'ioredis' {\n  interface RedisCommander<Context> {\n    aragamiAcquireLock(\n      keyCount: number,\n      ...keysAndArgs: (string | number)[]\n    ): Result<number, Context>;\n    aragamiExtendLock(\n      keyCount: number,\n      ...keysAndArgs: (string | number)[]\n    ): Result<number, Context>;\n    aragamiReleaseLock(\n      keyCount: number,\n      ...keysAndArgs: (string | number)[]\n    ): Result<number, Context>;\n  }\n}\n\nexport function defineLockCommands(client: Redis) {\n  if (typeof client.aragamiAcquireLock === 'function') {\n    return;\n  }\n  client.defineCommand('aragamiAcquireLock', { lua: ACQUIRE_SCRIPT });\n  client.defineCommand('aragamiExtendLock', { lua: EXTEND_SCRIPT });\n  client.defineCommand('aragamiReleaseLock', { lua: RELEASE_SCRIPT });\n}\n\nexport class LockAcquireTimeoutError extends Error {\n  constructor(public readonly keys: string[]) {\n    super(`Unable to acquire lock on resources: ${keys.join(', ')}`);\n    this.name = 'LockAcquireTimeoutError';\n  }\n}\n", "import 'reflect-metadata';\n\nimport { Metadata } from './metadata';\n\nimport { Awaitable, ClassType, TypedMethodDecorator } from './def';\nimport { MayBeArray } from './utility/utility';\nimport { Type } from 'class-transformer';\nimport { MergePropertyDecorators } from './utility/merge';\n\nexport const CacheTTL = (ttl: number): ClassDecorator & MethodDecorator =>\n  Metadata.set('AragamiCacheTTL', ttl);\n\nexport const CachePrefix = (prefix: string): ClassDecorator =>\n  Metadata.set('AragamiCachePrefix', prefix);\n\ntype ObjectFunction<T> = (o: any) => Awaitable<T>;\ntype ObjectAndKeyFunction<T> = (o: any, key: string) => Awaitable<T>;\n\nconst DrainKey =\n  <T>(\n    decoratorFactory: (cb: ObjectFunction<T>) => ClassDecorator,\n    defaultValue: ObjectAndKeyFunction<T>,\n  ) =>\n  (\n    fun: ObjectAndKeyFunction<T> = defaultValue,\n  ): PropertyDecorator & TypedMethodDecorator<ObjectFunction<T>> =>\n  (target: any, key: string, descriptor?: PropertyDescriptor) => {\n    let cb: ObjectFunction<T>;\n\n    if (descriptor) {\n      // method decorator: descriptor.value\n      if (typeof descriptor.value === 'function') {\n        cb = async (o) => fun(await descriptor.value.call(o), key);\n      }\n      // getter/accessor decorator: descriptor.get\n      else if (typeof descriptor.get === 'function') {\n        cb = async (o) => fun(await descriptor.get.call(o), key);\n      } else {\n        // unlikely: setter-only accessor etc.\n        cb = async (o) => fun(await (o as any)[key], key);\n      }\n    } else {\n      // property decorator\n      cb = (o) => fun((o as any)[key], key);\n    }\n\n    return decoratorFactory(cb)((target as any).constructor);\n  };\n\nexport const CacheKey = DrainKey<string>(\n  (cb) => Metadata.set('AragamiCacheKey', cb),\n  (o) => o.toString(),\n);\nexport const LockKey = DrainKey<MayBeArray<string>>(\n  (cb) => Metadata.append('AragamiLockKeys', cb),\n  (o, key) => `${key}_${o}`,\n);\n\nexport const CastType = <T>(cb: () => ClassType<T>): PropertyDecorator =>\n  MergePropertyDecorators([Metadata.set('AragamiType', cb), Type(cb)]);\n", "export function MergePropertyDecorators(\n  decs: PropertyDecorator[],\n): PropertyDecorator {\n  return (obj, key) => {\n    for (const dec of decs) {\n      dec(obj, key);\n    }\n  };\n}\n\nexport function MergeMethodDecorators(\n  decs: MethodDecorator[],\n): MethodDecorator {\n  return (obj, key, descriptor) => {\n    for (const dec of decs) {\n      dec(obj, key, descriptor);\n    }\n  };\n}\n\nexport function MergeClassDecorators(decs: ClassDecorator[]): ClassDecorator {\n  return (obj) => {\n    for (const dec of decs) {\n      dec(obj);\n    }\n  };\n}\n\nexport function MergeParameterDecorators(\n  decs: ParameterDecorator[],\n): ParameterDecorator {\n  return (obj, key, index) => {\n    for (const dec of decs) {\n      dec(obj, key, index);\n    }\n  };\n}\n\nexport function MergeClassOrMethodDecorators(\n  decs: (ClassDecorator & MethodDecorator)[],\n): ClassDecorator & MethodDecorator {\n  return (obj, key?, descriptor?) => {\n    if (descriptor) {\n      for (const dec of decs) {\n        dec(obj, key, descriptor);\n      }\n    } else {\n      for (const dec of decs) {\n        dec(obj);\n      }\n    }\n  };\n}\n", "import { Metadata, reflector } from './metadata';\nimport { makeArray, MayBeArray } from './utility/utility';\nimport { Awaitable, ClassType, TypedMethodDecorator } from './def';\nimport { Aragami } from './aragami';\n\nexport const WithKey = (\n  factory: (param: any, obj: any, key: string) => Awaitable<any> = (param) =>\n    param,\n) => Metadata.param('AragamiWithKey', factory);\nexport const WithLockKey = (\n  factory: (param: any, obj: any, key: string) => Awaitable<MayBeArray<any>> = (\n    param,\n    obj,\n    key,\n  ) => param,\n) => Metadata.param('AragamiWithLockKey', factory);\n\nexport class WrapDecoratorBuilder {\n  constructor(private aragamiFactory: (obj: any) => Awaitable<Aragami>) {}\n\n  build() {\n    const { aragamiFactory } = this;\n    return {\n      UseLock:\n        (): TypedMethodDecorator<(...args: any[]) => Promise<any>> =>\n        (obj, key, des) => {\n          const oldFun = des.value;\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          des.value = async function (...args) {\n            const aragami = await aragamiFactory(this);\n            const lockKeyParams = reflector.getArray(\n              'AragamiWithLockKey',\n              this,\n              key,\n            );\n            const keys = (\n              await Promise.all(\n                lockKeyParams\n                  .map(async (fun, i) => {\n                    if (!fun) return;\n                    const keyResult = (await fun(\n                      args[i],\n                      this,\n                      key as string,\n                    )) as MayBeArray<any>;\n                    return makeArray(keyResult);\n                  })\n                  .filter((s) => !!s),\n              )\n            ).flat();\n            return aragami.lock(keys, () => oldFun.apply(this, args));\n          };\n        },\n      UseCache:\n        <T>(\n          cl: ClassType<T>,\n        ): TypedMethodDecorator<(...args: any[]) => Promise<T>> =>\n        (obj, key, des) => {\n          const oldFun = des.value;\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          des.value = async function (...args) {\n            const aragami = await aragamiFactory(this);\n            const wrapped = aragami.useCache<T, []>(\n              cl,\n              () => oldFun.apply(this, args),\n              async () => {\n                const withKeyParameters = reflector.getArray(\n                  'AragamiWithKey',\n                  this,\n                  key,\n                );\n                const firstIndex = withKeyParameters.findIndex((f) => f);\n                if (firstIndex === -1) {\n                  return;\n                }\n                return withKeyParameters[firstIndex](\n                  args[firstIndex],\n                  this,\n                  key as string,\n                );\n              },\n            );\n            return wrapped();\n          };\n        },\n    };\n  }\n}\n"],
  "mappings": "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",
  "names": ["import_reflect_metadata", "BetterLockExport", "LRUCache", "Redis"]
}
