| Server IP : 159.203.156.69 / Your IP : 216.73.217.172 Web Server : nginx/1.24.0 System : Linux main-ubuntu 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/tanviranik.com/node_modules/vinext/dist/shims/ |
Upload File : |
{"version":3,"file":"cache-for-request.js","names":[],"sources":["../../src/shims/cache-for-request.ts"],"sourcesContent":["/**\n * Cache a factory function's result for the duration of a request.\n *\n * Returns a function that lazily invokes the factory on first call within\n * a request, then returns the cached result for all subsequent calls in\n * the same request. Each new request gets a fresh invocation.\n *\n * The factory function's identity (reference) is the cache key — no\n * string keys, no collision risk between modules.\n *\n * Async factories are supported: the returned Promise is cached, so\n * concurrent `await` calls within the same request share one invocation.\n * If the Promise rejects, the cached entry is cleared so the next call\n * can retry.\n *\n * Outside a request scope (tests, build-time), the factory runs every\n * time with no caching — safe and predictable.\n *\n * @example\n * ```ts\n * import { cacheForRequest } from \"vinext/cache\";\n *\n * const getPrisma = cacheForRequest(() => {\n * const pool = new Pool({ connectionString: env.HYPERDRIVE.connectionString });\n * return new PrismaClient({ adapter: new PrismaPg(pool) });\n * });\n *\n * // In a route handler or server component:\n * const prisma = getPrisma(); // first call creates, subsequent calls reuse\n * ```\n *\n * @example\n * ```ts\n * // Async factory — Promise is cached, not re-invoked.\n * // If it rejects, the cache is cleared for retry.\n * const getDb = cacheForRequest(async () => {\n * const pool = new Pool({ connectionString });\n * await pool.connect();\n * return drizzle(pool);\n * });\n *\n * const db = await getDb();\n * ```\n *\n * @module\n */\n\nimport { getRequestContext, isInsideUnifiedScope } from \"./unified-request-context.js\";\n\n/**\n * Create a request-scoped cached version of a factory function.\n *\n * @param factory - Function that creates the value. Called once per request for sync\n * factories. Async factories that reject have their cache cleared, allowing retry.\n * @returns A function with the same return type that caches the result per request.\n */\nexport function cacheForRequest<T>(factory: () => T): () => T {\n return (): T => {\n if (!isInsideUnifiedScope()) {\n return factory();\n }\n\n const ctx = getRequestContext();\n const cache = ctx.requestCache;\n\n if (cache.has(factory)) {\n return cache.get(factory) as T;\n }\n\n const value = factory();\n\n // For async factories: if the Promise rejects, clear the cached entry\n // so subsequent calls within the same request can retry.\n if (value instanceof Promise) {\n cache.set(factory, value);\n (value as Promise<unknown>).catch(() => {\n // Only clear if the cached value is still this exact Promise\n // (avoids clearing a newer retry's value).\n if (cache.get(factory) === value) {\n cache.delete(factory);\n }\n });\n } else {\n cache.set(factory, value);\n }\n\n return value;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,SAAgB,gBAAmB,SAA2B;CAC5D,aAAgB;EACd,IAAI,CAAC,sBAAsB,EACzB,OAAO,SAAS;EAIlB,MAAM,QADM,mBACK,CAAC;EAElB,IAAI,MAAM,IAAI,QAAQ,EACpB,OAAO,MAAM,IAAI,QAAQ;EAG3B,MAAM,QAAQ,SAAS;EAIvB,IAAI,iBAAiB,SAAS;GAC5B,MAAM,IAAI,SAAS,MAAM;GACzB,MAA4B,YAAY;IAGtC,IAAI,MAAM,IAAI,QAAQ,KAAK,OACzB,MAAM,OAAO,QAAQ;KAEvB;SAEF,MAAM,IAAI,SAAS,MAAM;EAG3B,OAAO"}