{"version":3,"file":"cacheMemory.cjs","names":[],"sources":["../../../src/utils/cacheMemory.ts"],"sourcesContent":["import { createHash, type Hash } from 'node:crypto';\n\n/** ------------------------- Utilities ------------------------- **/\n\n/** Prefer a fast non-crypto hash if available, then fast crypto, then sha256. */\nconst pickHashAlgorithm = (): string => {\n  try {\n    // Node 20+ supports xxhash64 (very fast). We feature-detect at module load.\n    createHash('xxhash64').update('test').digest();\n    return 'xxhash64';\n  } catch {}\n  try {\n    // sha1 is faster than sha256 and sufficient for cache keys.\n    createHash('sha1').update('test').digest();\n    return 'sha1';\n  } catch {}\n\n  return 'sha256';\n};\nconst HASH_ALGORITHM = pickHashAlgorithm();\n\n/** Base64url without padding for compact, file-system-safe ids. */\nconst toBase64Url = (buffer: Buffer): string =>\n  buffer\n    .toString('base64')\n    .replace(/\\+/g, '-')\n    .replace(/\\//g, '_')\n    .replace(/=+$/g, '');\n\n/** Token helpers to minimize collisions while streaming to the hasher. */\nconst token = {\n  start: (hasher: Hash, tag: string) => hasher.update(`<${tag}>`),\n  sep: (hasher: Hash) => hasher.update('|'),\n  end: (hasher: Hash, tag: string) => hasher.update(`</${tag}>`),\n  str: (hasher: Hash, stringValue: string) => {\n    // length prefix to avoid ambiguity: len#value\n    hasher.update(`${stringValue.length}#`);\n    hasher.update(stringValue);\n  },\n  num: (hasher: Hash, numberValue: number) =>\n    hasher.update(\n      Number.isNaN(numberValue)\n        ? 'NaN'\n        : numberValue === Infinity\n          ? 'Inf'\n          : numberValue === -Infinity\n            ? '-Inf'\n            : String(numberValue)\n    ),\n  big: (hasher: Hash, bigintValue: bigint) =>\n    hasher.update(bigintValue.toString(10)),\n  bool: (hasher: Hash, booleanValue: boolean) =>\n    hasher.update(booleanValue ? '1' : '0'),\n};\n\n/** ------------------- Canonical, streaming hasher ------------------- **/\n\ntype Seen = WeakSet<object>;\n\n/**\n * Streams a canonical representation of `value` into `hasher` without\n * constructing large intermediate strings. Objects/Maps/Sets are normalized.\n */\nconst stableHashValue = (hasher: Hash, value: unknown, seen: Seen): void => {\n  const valueType = typeof value;\n\n  if (value === null) {\n    token.start(hasher, 'null');\n    token.end(hasher, 'null');\n    return;\n  }\n\n  if (valueType === 'undefined') {\n    token.start(hasher, 'undef');\n    token.end(hasher, 'undef');\n    return;\n  }\n\n  if (valueType === 'number') {\n    token.start(hasher, 'num');\n    token.num(hasher, value as number);\n    token.end(hasher, 'num');\n    return;\n  }\n\n  if (valueType === 'bigint') {\n    token.start(hasher, 'big');\n    token.big(hasher, value as bigint);\n    token.end(hasher, 'big');\n    return;\n  }\n\n  if (valueType === 'boolean') {\n    token.start(hasher, 'bool');\n    token.bool(hasher, value as boolean);\n    token.end(hasher, 'bool');\n    return;\n  }\n\n  if (valueType === 'string') {\n    token.start(hasher, 'str');\n    token.str(hasher, value as string);\n    token.end(hasher, 'str');\n    return;\n  }\n\n  if (valueType === 'symbol') {\n    token.start(hasher, 'sym');\n    token.str(hasher, String(value));\n    token.end(hasher, 'sym');\n    return;\n  }\n\n  if (valueType === 'function') {\n    // Stable-ish fingerprint: name and arity (avoid source text).\n    const functionValue = value as Function;\n    token.start(hasher, 'fn');\n    token.str(hasher, functionValue.name ?? '');\n    token.sep(hasher);\n    token.num(hasher, functionValue.length);\n    token.end(hasher, 'fn');\n    return;\n  }\n\n  // Arrays and typed arrays\n  if (Array.isArray(value)) {\n    if (seen.has(value)) {\n      token.start(hasher, 'arr');\n      token.str(hasher, 'Circular');\n      token.end(hasher, 'arr');\n      return;\n    }\n    seen.add(value);\n    token.start(hasher, 'arr');\n    for (let i = 0; i < value.length; i++) {\n      token.sep(hasher);\n      stableHashValue(hasher, value[i], seen);\n    }\n    token.end(hasher, 'arr');\n    seen.delete(value);\n    return;\n  }\n\n  // Node/Builtins\n  if (value instanceof Date) {\n    token.start(hasher, 'date');\n    token.str(hasher, (value as Date).toISOString());\n    token.end(hasher, 'date');\n    return;\n  }\n\n  if (value instanceof RegExp) {\n    const regex = value as RegExp;\n    token.start(hasher, 're');\n    token.str(hasher, regex.source);\n    token.sep(hasher);\n    token.str(hasher, regex.flags);\n    token.end(hasher, 're');\n    return;\n  }\n\n  if (value instanceof Set) {\n    const setValue = value as Set<unknown>;\n    if (seen.has(setValue)) {\n      token.start(hasher, 'set');\n      token.str(hasher, 'Circular');\n      token.end(hasher, 'set');\n      return;\n    }\n    seen.add(setValue);\n    // Normalize by item fingerprints (strings) to sort deterministically.\n    const items: string[] = [];\n    for (const v of setValue) items.push(stableStringify(v)); // small, bounded use of stringify\n    items.sort();\n    token.start(hasher, 'set');\n    for (const item of items) {\n      token.sep(hasher);\n      token.str(hasher, item);\n    }\n    token.end(hasher, 'set');\n    seen.delete(setValue);\n    return;\n  }\n\n  if (value instanceof Map) {\n    const mapObject = value as Map<unknown, unknown>;\n    if (seen.has(mapObject)) {\n      token.start(hasher, 'map');\n      token.str(hasher, 'Circular');\n      token.end(hasher, 'map');\n      return;\n    }\n    seen.add(mapObject);\n    // Normalize by sorted key fingerprints.\n    const entries: Array<[string, unknown]> = [];\n    for (const [k, v] of mapObject.entries())\n      entries.push([stableStringify(k), v]);\n    entries.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n    token.start(hasher, 'map');\n    for (const [keyFingerprint, entryValue] of entries) {\n      token.sep(hasher);\n      token.str(hasher, keyFingerprint);\n      token.sep(hasher);\n      stableHashValue(hasher, entryValue, seen);\n    }\n    token.end(hasher, 'map');\n    seen.delete(mapObject);\n    return;\n  }\n\n  // ArrayBuffer & typed arrays\n  if (ArrayBuffer.isView(value)) {\n    const view = value as ArrayBufferView;\n    token.start(hasher, 'typed');\n    token.str(hasher, Object.getPrototypeOf(view).constructor.name);\n    token.sep(hasher);\n    hasher.update(Buffer.from(view.buffer, view.byteOffset, view.byteLength));\n    token.end(hasher, 'typed');\n    return;\n  }\n  if (value instanceof ArrayBuffer) {\n    const buffer = Buffer.from(value as ArrayBuffer);\n    token.start(hasher, 'ab');\n    hasher.update(buffer);\n    token.end(hasher, 'ab');\n    return;\n  }\n\n  // URL\n  if (typeof URL !== 'undefined' && value instanceof URL) {\n    token.start(hasher, 'url');\n    token.str(hasher, (value as URL).toString());\n    token.end(hasher, 'url');\n    return;\n  }\n\n  // Errors\n  if (value instanceof Error) {\n    const errorValue = value as Error;\n    token.start(hasher, 'err');\n    token.str(hasher, errorValue.name || '');\n    token.sep(hasher);\n    token.str(hasher, errorValue.message || '');\n    token.sep(hasher);\n    token.str(hasher, errorValue.stack || '');\n    token.end(hasher, 'err');\n    return;\n  }\n\n  // Generic objects\n  if (valueType === 'object') {\n    const objectValue = value as Record<string, unknown>;\n    if (seen.has(objectValue)) {\n      token.start(hasher, 'obj');\n      token.str(hasher, 'Circular');\n      token.end(hasher, 'obj');\n      return;\n    }\n    seen.add(objectValue);\n\n    const keys = Object.keys(objectValue).sort();\n    token.start(hasher, 'obj');\n    for (const key of keys) {\n      token.sep(hasher);\n      token.str(hasher, key);\n      token.sep(hasher);\n      stableHashValue(hasher, (objectValue as any)[key], seen);\n    }\n    token.end(hasher, 'obj');\n\n    seen.delete(objectValue);\n    return;\n  }\n\n  // Fallback\n  token.start(hasher, 'other');\n  token.str(hasher, String(value));\n  token.end(hasher, 'other');\n};\n\n/** Public stringify kept for convenience / debugging (now faster & broader). */\nexport const stableStringify = (\n  value: unknown,\n  _stack = new WeakSet<object>()\n): string => {\n  const hasher = createHash(HASH_ALGORITHM);\n  stableHashValue(hasher, value, _stack);\n  return toBase64Url(hasher.digest());\n};\n\n/** Compute a compact, stable id for arbitrary key tuples. */\nexport const computeKeyId = (keyParts: unknown[]): string => {\n  const h = createHash(HASH_ALGORITHM);\n  token.start(h, 'keys');\n  for (let i = 0; i < keyParts.length; i++) {\n    token.sep(h);\n    stableHashValue(h, keyParts[i], new WeakSet());\n  }\n  token.end(h, 'keys');\n  return toBase64Url(h.digest());\n};\n\n/** ------------------------- In-memory cache ------------------------- **/\n\nexport type CacheKey = unknown;\nconst cacheMap = new Map<string, any>();\n\nexport const getCache = <T>(...key: CacheKey[]): T | undefined => {\n  return cacheMap.get(computeKeyId(key));\n};\n\ntype CacheSetArgs<T> = [...keys: CacheKey[], value: T];\n\nexport const setCache = <T>(...args: CacheSetArgs<T>): void => {\n  const value = args[args.length - 1] as T;\n  const key = args.slice(0, -1) as CacheKey[];\n  cacheMap.set(computeKeyId(key), value);\n};\n\nexport const clearCache = (idOrKey: string): void => {\n  // Accept either our computed id or a legacy string id the caller already computed.\n  cacheMap.delete(idOrKey);\n};\n\nexport const clearAllCache = (): void => {\n  cacheMap.clear();\n};\n\nexport const cacheMemory = {\n  get: getCache,\n  set: setCache,\n  clear: clearCache,\n};\n"],"mappings":"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"}