{"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 { FallbackRouteParams } 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'\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  prerenderPhase?: boolean\n  devFallbackParams?: FallbackRouteParams | null\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<void> | null\n\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: FallbackRouteParams | 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: FallbackRouteParams | 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<CommonWorkUnitStore, 'implicitTags'> {\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<void> | null\n\n  /**\n   * As opposed to the public cache store, the private cache store is allowed to\n   * access the request cookies.\n   */\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<WorkUnitStore>\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 'prerender-legacy':\n    case 'request':\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      return workUnitStore.renderResumeDataCache\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\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 'prerender-ppr':\n    case 'prerender-legacy':\n    case 'request':\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<void> | 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":"AASA,qDAAqD;AACrD,SAASA,4BAA4B,QAAQ,0CAA0C;IAAE,wBAAwB;AAAc,EAAC;AAShI,SAASC,4BAA4B,QAAQ,6CAA4C;AACzF,SAASC,cAAc,QAAQ,mCAAkC;AAuTjE,SAASF,gCAAgCG,oBAAoB,GAAE;AAE/D,OAAO,SAASC,4BAA4BC,iBAAyB;IACnE,MAAM,qBAEL,CAFK,IAAIC,MACR,CAAC,EAAE,EAAED,kBAAkB,iHAAiH,CAAC,GADrI,qBAAA;eAAA;oBAAA;sBAAA;IAEN;AACF;AAEA,OAAO,SAASE;IACd,MAAM,qBAAoE,CAApE,IAAIL,eAAe,mDAAnB,qBAAA;eAAA;oBAAA;sBAAA;IAAmE;AAC3E;AAEA,OAAO,SAASM,4BACdC,aAA4B;IAE5B,OAAQA,cAAcC,IAAI;QACxB,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAOD,cAAcE,wBAAwB;QAC/C,KAAK;YACH,2EAA2E;YAC3E,oBAAoB;YACpB,OAAOF,cAAcE,wBAAwB;QAC/C,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO;QACT;YACE,OAAOF;IACX;AACF;AAEA,OAAO,SAASG,yBACdH,aAA4B;IAE5B,OAAQA,cAAcC,IAAI;QACxB,KAAK;YACH,OAAOD,cAAcI,qBAAqB;QAC5C,KAAK;QACL,KAAK;QACL,KAAK;YACH,IAAIJ,cAAcI,qBAAqB,EAAE;gBACvC,qEAAqE;gBACrE,8CAA8C;gBAC9C,OAAOJ,cAAcI,qBAAqB;YAC5C;QACF,cAAc;QACd,KAAK;YACH,yEAAyE;YACzE,2DAA2D;YAC3D,OAAOJ,cAAcE,wBAAwB;QAC/C,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO;QACT;YACE,OAAOF;IACX;AACF;AAEA,OAAO,SAASK,kBACdC,SAAoB,EACpBN,aAA4B;IAE5B,IAAIM,UAAUC,GAAG,EAAE;QACjB,OAAQP,cAAcC,IAAI;YACxB,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOD,cAAcQ,cAAc;YACrC,KAAK;oBACIR;gBAAP,QAAOA,6BAAAA,cAAcS,OAAO,CAACC,GAAG,CAAClB,kDAA1BQ,2BAAyDW,KAAK;YACvE,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH;YACF;gBACEX;QACJ;IACF;IAEA,OAAOY;AACT;AAEA,OAAO,SAASC,aACdP,SAAoB,EACpBN,aAA4B;IAE5B,IAAIM,UAAUC,GAAG,EAAE;QACjB,OAAQP,cAAcC,IAAI;YACxB,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOD,cAAca,YAAY,IAAI;YACvC,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH;YACF;gBACEb;QACJ;IACF;IAEA,OAAO;AACT;AAEA,OAAO,SAASc,4BACdR,SAAoB,EACpBN,aAA4B;IAE5B,IAAIM,UAAUC,GAAG,EAAE;QACjB,OAAQP,cAAcC,IAAI;YACxB,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOD,cAAce,wBAAwB;YAC/C,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH;YACF;gBACEf;QACJ;IACF;IAEA,OAAOY;AACT;AAEA;;CAEC,GACD,OAAO,SAASI,kCACdV,SAAoB,EACpBN,aAA4B;IAE5B,IAAIM,UAAUW,WAAW,EAAE;QACzB,OAAQjB,cAAcC,IAAI;YACxB,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOD,cAAckB,SAAS;YAChC,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH;YACF;gBACElB;QACJ;IACF;IAEA,OAAOY;AACT;AAEA,OAAO,SAASO,eACdnB,aAA4B;IAE5B,OAAQA,cAAcC,IAAI;QACxB,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAOD,cAAcoB,WAAW;QAClC,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO;QACT;YACE,OAAOpB;IACX;AACF;AAEA,OAAO,SAASqB,uBACdrB,aAA4B;IAE5B,OAAQA,cAAcC,IAAI;QACxB,KAAK;QACL,KAAK;YACH,OAAOD,cAAcsB,mBAAmB;QAC1C,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO;QACT;YACE,OAAOtB;IACX;AACF","ignoreList":[0]}