diff --git a/packages/cache/src/use-cache.ts b/packages/cache/src/use-cache.ts index ced5bf0c..a54ac194 100644 --- a/packages/cache/src/use-cache.ts +++ b/packages/cache/src/use-cache.ts @@ -9,7 +9,7 @@ import { AnalyticsEvents } from 'commandkit/analytics'; import { randomUUID } from 'node:crypto'; import ms, { type StringValue } from 'ms'; import { getCacheProvider } from './cache-plugin'; -import stableHash from 'stable-hash'; +import { createHash } from './utils'; const cacheContext = new AsyncLocalStorage(); const fnStore = new Map< @@ -28,13 +28,7 @@ const CACHE_FN_ID = `__cache_fn_id_${Date.now()}__${Math.random()}__`; const CACHED_FN_SYMBOL = Symbol('commandkit.cache.sentinel'); // WeakMap to store function metadata without preventing garbage collection -const fnMetadata = new WeakMap< - GenericFunction, - { id: string; buildId: string } ->(); - -// Generate a stable build ID that persists across restarts -const BUILD_ID = randomUUID(); +const fnMetadata = new WeakMap(); /** * Context for managing cache operations within an async scope @@ -88,20 +82,13 @@ function useCache>( // Get or create function metadata let metadata = fnMetadata.get(fn); if (!metadata) { - metadata = { - id: randomUUID(), - buildId: BUILD_ID, - }; + metadata = randomUUID(); fnMetadata.set(fn, metadata); } const memo = (async (...args) => { const analytics = getCommandKit()?.analytics; - const keyHash = await stableHash({ - fnId: metadata.id, - buildId: metadata.buildId, - args, - }); + const keyHash = createHash(metadata, args); const resolvedTTL = isLocal && params?.ttl != null diff --git a/packages/cache/src/utils.ts b/packages/cache/src/utils.ts new file mode 100644 index 00000000..4912981e --- /dev/null +++ b/packages/cache/src/utils.ts @@ -0,0 +1,16 @@ +import stableHash from 'stable-hash'; +import { createHash as createHashNode } from 'node:crypto'; + +/** + * @private + */ +export function createHash(id: string, args: any[]): string { + const objectHash = stableHash({ + id, + args, + }); + + const hash = createHashNode('sha256').update(objectHash).digest('hex'); + + return hash; +}