{"version":3,"sources":["../../../src/server/app-render/work-unit-async-storage.external.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'async_hooks'\nimport type { DraftModeProvider } from '../async-storage/draft-mode-provider'\nimport type { ResponseCookies } from '../web/spec-extension/cookies'\nimport type { ReadonlyHeaders } from '../web/spec-extension/adapters/headers'\nimport type { ReadonlyRequestCookies } from '../web/spec-extension/adapters/request-cookies'\nimport type { CacheSignal } from './cache-signal'\nimport type { DynamicTrackingState } from './dynamic-rendering'\nimport type { OpaqueFallbackRouteParams } from '../request/fallback-params'\n\n// Share the instance module in the next-shared layer\nimport { workUnitAsyncStorageInstance } from './work-unit-async-storage-instance' with { 'turbopack-transition': 'next-shared' }\nimport type { ServerComponentsHmrCache } from '../response-cache'\nimport type {\n RenderResumeDataCache,\n PrerenderResumeDataCache,\n} from '../resume-data-cache/resume-data-cache'\nimport type { Params } from '../request/params'\nimport type { ImplicitTags } from '../lib/implicit-tags'\nimport type { WorkStore } from './work-async-storage.external'\nimport { NEXT_HMR_REFRESH_HASH_COOKIE } from '../../client/components/app-router-headers'\nimport { InvariantError } from '../../shared/lib/invariant-error'\nimport type { StagedRenderingController } from './staged-rendering'\n\nexport type WorkUnitPhase = 'action' | 'render' | 'after'\n\nexport interface CommonWorkUnitStore {\n /** NOTE: Will be mutated as phases change */\n phase: WorkUnitPhase\n readonly implicitTags: ImplicitTags\n}\n\nexport interface RequestStore extends CommonWorkUnitStore {\n readonly type: 'request'\n\n /**\n * The URL of the request. This only specifies the pathname and the search\n * part of the URL.\n */\n readonly url: {\n /**\n * The pathname of the requested URL.\n */\n readonly pathname: string\n\n /**\n * The search part of the requested URL. If the request did not provide a\n * search part, this will be an empty string.\n */\n readonly search: string\n }\n\n readonly headers: ReadonlyHeaders\n // This is mutable because we need to reassign it when transitioning from the action phase to the render phase.\n // The cookie object itself is deliberately read only and thus can't be updated.\n cookies: ReadonlyRequestCookies\n readonly mutableCookies: ResponseCookies\n readonly userspaceMutableCookies: ResponseCookies\n readonly draftMode: DraftModeProvider\n readonly isHmrRefresh?: boolean\n readonly serverComponentsHmrCache?: ServerComponentsHmrCache\n\n readonly rootParams: Params\n\n /**\n * The resume data cache for this request. This will be a immutable cache.\n */\n renderResumeDataCache: RenderResumeDataCache | null\n\n // DEV-only\n usedDynamic?: boolean\n devFallbackParams?: OpaqueFallbackRouteParams | null\n stagedRendering?: StagedRenderingController | null\n asyncApiPromises?: DevAsyncApiPromises\n cacheSignal?: CacheSignal | null\n prerenderResumeDataCache?: PrerenderResumeDataCache | null\n}\n\ntype DevAsyncApiPromises = {\n cookies: Promise\n mutableCookies: Promise\n headers: Promise\n\n sharedParamsParent: Promise\n sharedSearchParamsParent: Promise\n\n connection: Promise\n}\n\n/**\n * The Prerender store is for tracking information related to prerenders.\n *\n * It can be used for both RSC and SSR prerendering and should be scoped as close\n * to the individual `renderTo...` API call as possible. To keep the type simple\n * we don't distinguish between RSC and SSR prerendering explicitly but instead\n * use conditional object properties to infer which mode we are in. For instance cache tracking\n * only needs to happen during the RSC prerender when we are prospectively prerendering\n * to fill all caches.\n */\nexport type PrerenderStoreModern =\n | PrerenderStoreModernClient\n | PrerenderStoreModernServer\n | PrerenderStoreModernRuntime\n\n/** Like `PrerenderStoreModern`, but only including static prerenders (i.e. not runtime prerenders) */\nexport type StaticPrerenderStoreModern = Exclude<\n PrerenderStoreModern,\n PrerenderStoreModernRuntime\n>\n\nexport interface PrerenderStoreModernClient\n extends PrerenderStoreModernCommon,\n StaticPrerenderStoreCommon {\n readonly type: 'prerender-client'\n}\n\nexport interface PrerenderStoreModernServer\n extends PrerenderStoreModernCommon,\n StaticPrerenderStoreCommon {\n readonly type: 'prerender'\n}\n\nexport interface PrerenderStoreModernRuntime\n extends PrerenderStoreModernCommon {\n readonly type: 'prerender-runtime'\n\n /**\n * A runtime prerender resolves APIs in two tasks:\n *\n * 1. Static data (available in a static prerender)\n * 2. Runtime data (available in a runtime prerender)\n *\n * This separation is achieved by awaiting this promise in \"runtime\" APIs.\n * In the final prerender, the promise will be resolved during the second task,\n * and the render will be aborted in the task that follows it.\n */\n readonly runtimeStagePromise: Promise | null\n\n readonly headers: RequestStore['headers']\n readonly cookies: RequestStore['cookies']\n readonly draftMode: RequestStore['draftMode']\n}\n\nexport interface RevalidateStore {\n // Collected revalidate times and tags for this document during the prerender.\n revalidate: number // in seconds. 0 means dynamic. INFINITE_CACHE and higher means never revalidate.\n expire: number // server expiration time\n stale: number // client expiration time\n tags: null | string[]\n}\n\ninterface PrerenderStoreModernCommon\n extends CommonWorkUnitStore,\n RevalidateStore {\n /**\n * The render signal is aborted after React's `prerender` function is aborted\n * (using a separate signal), which happens in two cases:\n *\n * 1. When all caches are filled during the prospective prerender.\n * 2. When the final prerender is aborted immediately after the prerender was\n * started.\n *\n * It can be used to reject any pending I/O, including hanging promises. This\n * allows React to properly track the async I/O in dev mode, which yields\n * better owner stacks for dynamic validation errors.\n */\n readonly renderSignal: AbortSignal\n\n /**\n * This is the AbortController which represents the boundary between Prerender\n * and dynamic. In some renders it is the same as the controller for React,\n * but in others it is a separate controller. It should be aborted whenever we\n * are no longer in the prerender phase of rendering. Typically this is after\n * one task, or when you call a sync API which requires the prerender to end\n * immediately.\n */\n readonly controller: AbortController\n\n /**\n * When not null, this signal is used to track cache reads during prerendering\n * and to await all cache reads completing, before aborting the prerender.\n */\n readonly cacheSignal: null | CacheSignal\n\n /**\n * During some prerenders we want to track dynamic access.\n */\n readonly dynamicTracking: null | DynamicTrackingState\n\n readonly rootParams: Params\n\n /**\n * A mutable resume data cache for this prerender.\n */\n prerenderResumeDataCache: PrerenderResumeDataCache | null\n\n /**\n * An immutable resume data cache for this prerender. This may be provided\n * instead of the `prerenderResumeDataCache` if the prerender is not supposed\n * to fill caches, and only read from prefilled caches, e.g. when prerendering\n * an optional fallback shell.\n */\n renderResumeDataCache: RenderResumeDataCache | null\n\n /**\n * The HMR refresh hash is only provided in dev mode. It is needed for the dev\n * warmup render to ensure that the cache keys will be identical for the\n * subsequent dynamic render.\n */\n readonly hmrRefreshHash: string | undefined\n\n /**\n * Only available in dev mode.\n */\n readonly captureOwnerStack: undefined | (() => string | null)\n}\n\ninterface StaticPrerenderStoreCommon {\n /**\n * The set of unknown route parameters. Accessing these will be tracked as\n * a dynamic access.\n */\n readonly fallbackRouteParams: OpaqueFallbackRouteParams | null\n\n /**\n * When true, the page is prerendered as a fallback shell, while allowing any\n * dynamic accesses to result in an empty shell. This is the case when there\n * are also routes prerendered with a more complete set of params.\n * Prerendering those routes would catch any invalid dynamic accesses.\n */\n readonly allowEmptyStaticShell: boolean\n}\n\nexport interface PrerenderStorePPR\n extends CommonWorkUnitStore,\n RevalidateStore {\n readonly type: 'prerender-ppr'\n readonly rootParams: Params\n readonly dynamicTracking: null | DynamicTrackingState\n\n /**\n * The set of unknown route parameters. Accessing these will be tracked as\n * a dynamic access.\n */\n readonly fallbackRouteParams: OpaqueFallbackRouteParams | null\n\n /**\n * The resume data cache for this prerender.\n */\n prerenderResumeDataCache: PrerenderResumeDataCache\n}\n\nexport interface PrerenderStoreLegacy\n extends CommonWorkUnitStore,\n RevalidateStore {\n readonly type: 'prerender-legacy'\n readonly rootParams: Params\n}\n\nexport type PrerenderStore =\n | PrerenderStoreLegacy\n | PrerenderStorePPR\n | PrerenderStoreModern\n\n// /** Like `PrerenderStoreModern`, but only including static prerenders (i.e. not runtime prerenders) */\nexport type StaticPrerenderStore = Exclude<\n PrerenderStore,\n PrerenderStoreModernRuntime\n>\n\nexport interface CommonCacheStore\n extends Omit {\n /**\n * A cache work unit store might not always have an outer work unit store,\n * from which implicit tags could be inherited.\n */\n readonly implicitTags: ImplicitTags | undefined\n /**\n * Draft mode is only available if the outer work unit store is a request\n * store and draft mode is enabled.\n */\n readonly draftMode: DraftModeProvider | undefined\n}\n\nexport interface CommonUseCacheStore extends CommonCacheStore, RevalidateStore {\n explicitRevalidate: undefined | number // explicit revalidate time from cacheLife() calls\n explicitExpire: undefined | number // server expiration time\n explicitStale: undefined | number // client expiration time\n readonly hmrRefreshHash: string | undefined\n readonly isHmrRefresh: boolean\n readonly serverComponentsHmrCache: ServerComponentsHmrCache | undefined\n readonly forceRevalidate: boolean\n}\n\nexport interface PublicUseCacheStore extends CommonUseCacheStore {\n readonly type: 'cache'\n}\n\nexport interface PrivateUseCacheStore extends CommonUseCacheStore {\n readonly type: 'private-cache'\n\n /**\n * A runtime prerender resolves APIs in two tasks:\n *\n * 1. Static data (available in a static prerender)\n * 2. Runtime data (available in a runtime prerender)\n *\n * This separation is achieved by awaiting this promise in \"runtime\" APIs.\n * In the final prerender, the promise will be resolved during the second task,\n * and the render will be aborted in the task that follows it.\n */\n readonly runtimeStagePromise: Promise | null\n\n readonly headers: ReadonlyHeaders\n readonly cookies: ReadonlyRequestCookies\n\n /**\n * Private caches don't currently need to track root params in the cache key\n * because they're not persisted anywhere, so we can allow root params access\n * (unlike public caches)\n */\n readonly rootParams: Params\n}\n\nexport type UseCacheStore = PublicUseCacheStore | PrivateUseCacheStore\n\nexport interface UnstableCacheStore extends CommonCacheStore {\n readonly type: 'unstable-cache'\n}\n\n/**\n * The Cache store is for tracking information inside a \"use cache\" or\n * unstable_cache context. A cache store shadows an outer request store (if\n * present) as a work unit, so that we never accidentally expose any request or\n * page specific information to cache functions, unless it's explicitly desired.\n * For those exceptions, the data is copied over from the request store to the\n * cache store, instead of generally making the request store available to cache\n * functions.\n */\nexport type CacheStore = UseCacheStore | UnstableCacheStore\n\nexport type WorkUnitStore = RequestStore | CacheStore | PrerenderStore\n\nexport type WorkUnitAsyncStorage = AsyncLocalStorage\n\nexport { workUnitAsyncStorageInstance as workUnitAsyncStorage }\n\nexport function throwForMissingRequestStore(callingExpression: string): never {\n throw new Error(\n `\\`${callingExpression}\\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`\n )\n}\n\nexport function throwInvariantForMissingStore(): never {\n throw new InvariantError('Expected workUnitAsyncStorage to have a store.')\n}\n\nexport function getPrerenderResumeDataCache(\n workUnitStore: WorkUnitStore\n): PrerenderResumeDataCache | null {\n switch (workUnitStore.type) {\n case 'prerender':\n case 'prerender-runtime':\n case 'prerender-ppr':\n return workUnitStore.prerenderResumeDataCache\n case 'prerender-client':\n // TODO eliminate fetch caching in client scope and stop exposing this data\n // cache during SSR.\n return workUnitStore.prerenderResumeDataCache\n case 'request': {\n // In dev, we might fill caches even during a dynamic request.\n if (workUnitStore.prerenderResumeDataCache) {\n return workUnitStore.prerenderResumeDataCache\n }\n // fallthrough\n }\n case 'prerender-legacy':\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n return null\n default:\n return workUnitStore satisfies never\n }\n}\n\nexport function getRenderResumeDataCache(\n workUnitStore: WorkUnitStore\n): RenderResumeDataCache | null {\n switch (workUnitStore.type) {\n case 'request':\n case 'prerender':\n case 'prerender-runtime':\n case 'prerender-client':\n if (workUnitStore.renderResumeDataCache) {\n // If we are in a prerender, we might have a render resume data cache\n // that is used to read from prefilled caches.\n return workUnitStore.renderResumeDataCache\n }\n // fallthrough\n case 'prerender-ppr':\n // Otherwise we return the mutable resume data cache here as an immutable\n // version of the cache as it can also be used for reading.\n return workUnitStore.prerenderResumeDataCache ?? null\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n case 'prerender-legacy':\n return null\n default:\n return workUnitStore satisfies never\n }\n}\n\nexport function getHmrRefreshHash(\n workStore: WorkStore,\n workUnitStore: WorkUnitStore\n): string | undefined {\n if (workStore.dev) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'private-cache':\n case 'prerender':\n case 'prerender-runtime':\n return workUnitStore.hmrRefreshHash\n case 'request':\n return workUnitStore.cookies.get(NEXT_HMR_REFRESH_HASH_COOKIE)?.value\n case 'prerender-client':\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n return undefined\n}\n\nexport function isHmrRefresh(\n workStore: WorkStore,\n workUnitStore: WorkUnitStore\n): boolean {\n if (workStore.dev) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'private-cache':\n case 'request':\n return workUnitStore.isHmrRefresh ?? false\n case 'prerender':\n case 'prerender-client':\n case 'prerender-runtime':\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n return false\n}\n\nexport function getServerComponentsHmrCache(\n workStore: WorkStore,\n workUnitStore: WorkUnitStore\n): ServerComponentsHmrCache | undefined {\n if (workStore.dev) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'private-cache':\n case 'request':\n return workUnitStore.serverComponentsHmrCache\n case 'prerender':\n case 'prerender-client':\n case 'prerender-runtime':\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n return undefined\n}\n\n/**\n * Returns a draft mode provider only if draft mode is enabled.\n */\nexport function getDraftModeProviderForCacheScope(\n workStore: WorkStore,\n workUnitStore: WorkUnitStore\n): DraftModeProvider | undefined {\n if (workStore.isDraftMode) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n case 'prerender-runtime':\n case 'request':\n return workUnitStore.draftMode\n case 'prerender':\n case 'prerender-client':\n case 'prerender-ppr':\n case 'prerender-legacy':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n return undefined\n}\n\nexport function getCacheSignal(\n workUnitStore: WorkUnitStore\n): CacheSignal | null {\n switch (workUnitStore.type) {\n case 'prerender':\n case 'prerender-client':\n case 'prerender-runtime':\n return workUnitStore.cacheSignal\n case 'request': {\n // In dev, we might fill caches even during a dynamic request.\n if (workUnitStore.cacheSignal) {\n return workUnitStore.cacheSignal\n }\n // fallthrough\n }\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n return null\n default:\n return workUnitStore satisfies never\n }\n}\n\nexport function getRuntimeStagePromise(\n workUnitStore: WorkUnitStore\n): Promise | null {\n switch (workUnitStore.type) {\n case 'prerender-runtime':\n case 'private-cache':\n return workUnitStore.runtimeStagePromise\n case 'prerender':\n case 'prerender-client':\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'request':\n case 'cache':\n case 'unstable-cache':\n return null\n default:\n return workUnitStore satisfies never\n }\n}\n"],"names":["workUnitAsyncStorageInstance","NEXT_HMR_REFRESH_HASH_COOKIE","InvariantError","workUnitAsyncStorage","throwForMissingRequestStore","callingExpression","Error","throwInvariantForMissingStore","getPrerenderResumeDataCache","workUnitStore","type","prerenderResumeDataCache","getRenderResumeDataCache","renderResumeDataCache","getHmrRefreshHash","workStore","dev","hmrRefreshHash","cookies","get","value","undefined","isHmrRefresh","getServerComponentsHmrCache","serverComponentsHmrCache","getDraftModeProviderForCacheScope","isDraftMode","draftMode","getCacheSignal","cacheSignal","getRuntimeStagePromise","runtimeStagePromise"],"mappings":"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","ignoreList":[0]}