{"version":3,"sources":["../../src/types.ts","../../src/utils/sdk.ts","../../src/app/client.ts","../../src/utils/rewrite.ts","../../src/utils/utils.ts","../../src/app/utils.ts","../../src/app/flow.ts","../../src/app/login.ts","../../src/app/registration.ts","../../src/app/recovery.ts","../../src/app/verification.ts","../../src/app/settings.ts","../../src/app/logout.ts","../../src/app/session.ts"],"names":["getCookieHeader","toFlowParams","redirect","FlowType","headers"],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nexport interface OryConfig {\n  /**\n   * Sets the base path for proxying requests to Ory during development and previews. Is unset per default for best\n   * compatibility.\n   *\n   * For example, Ory's `/self-service/login/browser` API will be proxied in your application at `/self-service/login/browser`.\n   * This proxying is only enabled in development and preview deployments and disabled in production.\n   *\n   * If you want to proxy Ory's `/self-service/login/browser` API at `/api/self-service/login/browser`, you can set this option to `/api`.\n   */\n  proxyBasePath?: string\n\n  /**\n   * Per default, this handler will strip the cookie domain from\n   * the Set-Cookie instruction which is recommended for most set ups.\n   *\n   * If you are running this app on a subdomain and you want the session and CSRF cookies\n   * to be valid for the whole TLD, you can use this setting to force a cookie domain.\n   *\n   * Please be aware that his method disables the `dontUseTldForCookieDomain` option.\n   */\n  forceCookieDomain?: string\n\n  /**\n   * Per default headers are filtered to forward only a fixed list.\n   *\n   * If you need to forward additional headers you can use this setting to define them.\n   */\n  forwardAdditionalHeaders?: string[]\n\n  /**\n   * Override the default UI for login, registration, recovery, verification, and settings flows with a page\n   * in your project. This is useful if you want to customize the UI for these flows.\n   */\n  override?: {\n    applicationName?: string\n\n    /**\n     * Set this to use a custom login UI for the login flow. This path should be relative to the\n     * project root. Assuming you have a file at `./app/my-login/page.tsx`, you would set this to\n     * `/my-login`.\n     */\n    loginUiPath?: string\n\n    /**\n     * Set this to use a custom registration UI for the registration flow. This path should be relative to the\n     * project root. Assuming you have a file at `./app/my-registration/page.tsx`, you would set this to\n     * `/my-registration`.\n     */\n    registrationUiPath?: string\n\n    /**\n     * Set this to use a custom recovery UI for the recovery flow. This path should be relative to the\n     * project root. Assuming you have a file at `./app/my-recovery/page.tsx`, you would set this to\n     * `/my-recovery`.\n     */\n    recoveryUiPath?: string\n\n    /**\n     * Set this to use a custom verification UI for the verification flow. This path should be relative to the\n     * project root. Assuming you have a file at `./app/my-verification/page.tsx`, you would set this to\n     * `/my-verification`.\n     */\n    verificationUiPath?: string\n\n    /**\n     * Set this to use a custom settings UI for the settings flow. This path should be relative to the\n     * project root. Assuming you have a file at `./app/my-settings/page.tsx`, you would set this to\n     * `/my-settings`.\n     */\n    settingsUiPath?: string\n\n    /**\n     * Set this to use a custom default redirect URI. This path should be relative to your application's base URL.\n     */\n    defaultRedirectUri?: string\n  }\n}\n\nexport type QueryParams = { [key: string]: string | string[] | undefined }\n\nexport const initOverrides: RequestInit = {\n  cache: \"no-cache\",\n}\n\nexport type FlowParams = {\n  id: string\n  cookie: string | undefined\n  return_to: string\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nexport function orySdkUrl() {\n  let baseUrl\n\n  if (process.env[\"NEXT_PUBLIC_ORY_SDK_URL\"]) {\n    baseUrl = process.env[\"NEXT_PUBLIC_ORY_SDK_URL\"]\n  }\n\n  if (!baseUrl) {\n    throw new Error(\n      \"You need to set environment variable `NEXT_PUBLIC_ORY_SDK_URL` to your Ory Network SDK URL.\",\n    )\n  }\n\n  return baseUrl.replace(/\\/$/, \"\")\n}\n\nexport function isProduction() {\n  return (\n    [\"production\", \"prod\"].indexOf(\n      process.env[\"VERCEL_ENV\"] || process.env[\"NODE_ENV\"] || \"\",\n    ) > -1\n  )\n}\n\nexport function guessPotentiallyProxiedOrySdkUrl(options?: {\n  knownProxiedUrl?: string\n}) {\n  if (isProduction()) {\n    // In production, we use the production custom domain\n    return orySdkUrl()\n  }\n\n  if (process.env[\"VERCEL_ENV\"]) {\n    // We are in vercel\n\n    // The domain name of the generated deployment URL. Example: *.vercel.app. The value does not include the protocol scheme https://.\n    //\n    // This is only available for preview deployments on Vercel.\n    if (!isProduction() && process.env[\"VERCEL_URL\"]) {\n      return `https://${process.env[\"VERCEL_URL\"]}`.replace(/\\/$/, \"\")\n    }\n\n    // This is sometimes set by the render server.\n    if (process.env[\"__NEXT_PRIVATE_ORIGIN\"]) {\n      return process.env[\"__NEXT_PRIVATE_ORIGIN\"].replace(/\\/$/, \"\")\n    }\n  }\n\n  // Unable to figure out the SDK URL. Either because we are not using Vercel or because we are on a local machine.\n  // Let's try to use the window location.\n  if (typeof window !== \"undefined\") {\n    return window.location.origin\n  }\n\n  if (options?.knownProxiedUrl) {\n    return options.knownProxiedUrl\n  }\n\n  // We tried everything. Let's use the SDK URL.\n  const final = orySdkUrl()\n  console.warn(\n    `Unable to determine a suitable SDK URL for setting up the Next.js integration of Ory Elements. Will proceed using default Ory SDK URL \"${final}\". This is likely not what you want for local development and your authentication and login may not work.`,\n  )\n\n  return final\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Configuration, FrontendApi } from \"@ory/client-fetch\"\n\nimport { orySdkUrl } from \"../utils/sdk\"\n\nexport const serverSideFrontendClient = new FrontendApi(\n  new Configuration({\n    headers: {\n      Accept: \"application/json\",\n    },\n    basePath: orySdkUrl(),\n  }),\n)\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nimport { OryConfig } from \"../types\"\nimport { joinUrlPaths } from \"./utils\"\nimport { orySdkUrl } from \"./sdk\"\n\nexport function rewriteUrls(\n  source: string,\n  matchBaseUrl: string,\n  selfUrl: string,\n  config: OryConfig,\n) {\n  for (const [_, [matchPath, replaceWith]] of [\n    // TODO load these dynamically from the project config\n    [\"/ui/recovery\", config.override?.recoveryUiPath],\n    [\"/ui/registration\", config.override?.registrationUiPath],\n    [\"/ui/login\", config.override?.loginUiPath],\n    [\"/ui/verification\", config.override?.verificationUiPath],\n    [\"/ui/settings\", config.override?.settingsUiPath],\n    [\"/ui/welcome\", config.override?.defaultRedirectUri],\n  ].entries()) {\n    const match = joinUrlPaths(matchBaseUrl, matchPath || \"\")\n    if (replaceWith && source.startsWith(match)) {\n      source = source.replaceAll(\n        match,\n        new URL(replaceWith, selfUrl).toString(),\n      )\n    }\n  }\n  return source.replaceAll(\n    matchBaseUrl.replace(/\\/$/, \"\"),\n    new URL(selfUrl).toString().replace(/\\/$/, \"\"),\n  )\n}\n\n/**\n * Rewrites Ory SDK URLs in JSON responses (objects, arrays, strings) with the provided proxy URL.\n *\n * If `proxyUrl` is provided, the SDK URL is replaced with the proxy URL.\n *\n * @param obj - The object to rewrite\n * @param proxyUrl - The proxy URL to replace the SDK URL with\n */\nexport function rewriteJsonResponse<T extends object>(\n  obj: T,\n  proxyUrl?: string,\n): T {\n  return Object.fromEntries(\n    Object.entries(obj)\n      .filter(([_, value]) => value !== undefined)\n      .map(([key, value]) => {\n        if (Array.isArray(value)) {\n          // Recursively process each item in the array\n          return [\n            key,\n            value\n              .map((item) => {\n                if (typeof item === \"object\" && item !== null) {\n                  // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n                  return rewriteJsonResponse(item, proxyUrl)\n                } else if (typeof item === \"string\" && proxyUrl) {\n                  return item.replaceAll(orySdkUrl(), proxyUrl)\n                }\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n                return item\n              })\n              .filter((item) => item !== undefined),\n          ]\n        } else if (typeof value === \"object\" && value !== null) {\n          // Recursively remove undefined in nested objects\n          return [key, rewriteJsonResponse(value, proxyUrl)]\n        } else if (typeof value === \"string\" && proxyUrl) {\n          // Replace SDK URL with the provided proxy URL\n          return [key, value.replaceAll(orySdkUrl(), proxyUrl)]\n        }\n        return [key, value]\n      }),\n  ) as T\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { parse, splitCookiesString } from \"set-cookie-parser\"\nimport { serialize, SerializeOptions } from \"cookie\"\n\nimport { FlowParams, OryConfig, QueryParams } from \"../types\"\nimport { guessCookieDomain } from \"./cookie\"\nimport { defaultForwardedHeaders } from \"./headers\"\nimport { ApiResponse } from \"@ory/client-fetch\"\nimport { rewriteJsonResponse } from \"./rewrite\"\n\nexport function onValidationError<T>(value: T): T {\n  return value\n}\n\nexport async function toFlowParams(\n  params: QueryParams,\n  getCookieHeader: () => Promise<string | undefined>,\n): Promise<FlowParams> {\n  return {\n    id: params[\"flow\"]?.toString() ?? \"\",\n    cookie: await getCookieHeader(),\n    return_to: params[\"return_to\"]?.toString() ?? \"\",\n  }\n}\nexport function processSetCookieHeaders(\n  protocol: string,\n  fetchResponse: Response,\n  options: OryConfig,\n  requestHeaders: Headers,\n) {\n  const isTls =\n    protocol === \"https:\" || requestHeaders.get(\"x-forwarded-proto\") === \"https\"\n\n  const forwarded = requestHeaders.get(\"x-forwarded-host\")\n  const host = forwarded ? forwarded : requestHeaders.get(\"host\")\n  const domain = guessCookieDomain(host ?? \"\", options)\n\n  return parse(\n    splitCookiesString(fetchResponse.headers.get(\"set-cookie\") || \"\"),\n  )\n    .map((cookie) => ({\n      ...cookie,\n      domain,\n      secure: isTls,\n      encode: (v: string) => v,\n    }))\n    .map(({ value, name, ...options }) =>\n      serialize(name, value, options as SerializeOptions),\n    )\n}\n\nexport function filterRequestHeaders(\n  headers: Headers,\n  forwardAdditionalHeaders?: string[],\n): Headers {\n  const filteredHeaders = new Headers()\n\n  headers.forEach((value, key) => {\n    const isValid =\n      defaultForwardedHeaders.includes(key) ||\n      (forwardAdditionalHeaders ?? []).includes(key)\n    if (isValid) filteredHeaders.set(key, value)\n  })\n\n  return filteredHeaders\n}\n\nexport function joinUrlPaths(baseUrl: string, relativeUrl: string): string {\n  const base = new URL(baseUrl)\n  const relative = new URL(relativeUrl, baseUrl)\n\n  relative.pathname =\n    base.pathname.replace(/\\/$/, \"\") +\n    \"/\" +\n    relative.pathname.replace(/^\\//, \"\")\n\n  return new URL(relative.toString(), baseUrl).href\n}\n\nexport function toValue<T extends object>(res: ApiResponse<T>): Promise<T> {\n  // Remove all undefined values from the response (array and object) using lodash:\n  // Remove all (nested) undefined values from the response using lodash\n  return res.value().then((v) => rewriteJsonResponse(v))\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { headers } from \"next/headers\"\nimport { redirect } from \"next/navigation\"\nimport { OnRedirectHandler } from \"@ory/client-fetch\"\n\nimport { QueryParams } from \"../types\"\nimport { toFlowParams as baseToFlowParams } from \"../utils/utils\"\n\nexport async function getCookieHeader() {\n  // eslint-disable-next-line @typescript-eslint/await-thenable -- types in the next SDK are wrong?\n  const h = await headers()\n  return h.get(\"cookie\") ?? undefined\n}\n\nexport const onRedirect: OnRedirectHandler = (url) => {\n  redirect(url)\n}\n\nexport async function toFlowParams(params: QueryParams) {\n  return baseToFlowParams(params, getCookieHeader)\n}\n\nexport async function getPublicUrl() {\n  // eslint-disable-next-line @typescript-eslint/await-thenable -- types in the next SDK are wrong?\n  const h = await headers()\n  const host = h.get(\"host\")\n  const protocol = h.get(\"x-forwarded-proto\") || \"http\"\n  return `${protocol}://${host}`\n}\n\nexport interface OryPageParams {\n  searchParams: Promise<{ [key: string]: string | string[] | undefined }>\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nimport { redirect, RedirectType } from \"next/navigation\"\nimport { FlowType, handleFlowError } from \"@ory/client-fetch\"\n\nimport { getPublicUrl, onRedirect } from \"./utils\"\nimport { QueryParams } from \"../types\"\nimport { guessPotentiallyProxiedOrySdkUrl } from \"../utils/sdk\"\nimport { onValidationError } from \"../utils/utils\"\nimport { rewriteJsonResponse } from \"../utils/rewrite\"\nimport * as runtime from \"@ory/client-fetch/src/runtime\"\n\nexport async function getFlow<T extends object>(\n  params: QueryParams,\n  fetchFlowRaw: () => Promise<runtime.ApiResponse<T>>,\n  flowType: FlowType,\n): Promise<T | null | void> {\n  // Guess our own public url using Next.js helpers. We need the hostname, port, and protocol.\n  const knownProxiedUrl = await getPublicUrl()\n  const url = guessPotentiallyProxiedOrySdkUrl({\n    knownProxiedUrl,\n  })\n\n  const onRestartFlow = () => {\n    const redirectTo = new URL(\n      \"/self-service/\" + flowType.toString() + \"/browser\",\n      url,\n    )\n    redirectTo.search = queryParamsToURLSearch(params).toString()\n    return redirect(redirectTo.toString(), RedirectType.replace)\n  }\n\n  if (!params[\"flow\"]) {\n    onRestartFlow()\n    return\n  }\n\n  try {\n    const rawResponse = await fetchFlowRaw()\n    return await rawResponse\n      .value()\n      .then((v: T): T => rewriteJsonResponse(v, url))\n  } catch (error) {\n    const errorHandler = handleFlowError({\n      onValidationError,\n      onRestartFlow,\n      onRedirect: onRedirect,\n    })\n    await errorHandler(error)\n    return null\n  }\n}\n\nfunction queryParamsToURLSearch(q: QueryParams) {\n  const url = new URLSearchParams()\n  for (const key in q) {\n    const v = q[key]\n    if (v) {\n      url.set(key, v.toString())\n    }\n  }\n  return url.toString()\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { FlowType, LoginFlow } from \"@ory/client-fetch\"\n\nimport { initOverrides, QueryParams } from \"../types\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getFlow } from \"./flow\"\nimport { toFlowParams } from \"./utils\"\n\n/**\n * Use this method in an app router page to fetch an existing login flow or to create a new one. This method works with server-side rendering.\n *\n * ```\n * import { Login } from \"@ory/elements-react/theme\"\n * import { getLoginFlow, OryPageParams } from \"@ory/nextjs/app\"\n * import { enhanceConfig } from \"@ory/nextjs\"\n *\n * import config from \"@/ory.config\"\n * import CardHeader from \"@/app/auth/login/card-header\"\n *\n * export default async function LoginPage(props: OryPageParams) {\n *   const flow = await getLoginFlow(props.searchParams)\n *\n *   if (!flow) {\n *     return null\n *   }\n *\n *   return (\n *     <Login\n *       flow={flow}\n *       config={enhanceConfig(config)}\n *       components={{\n *         Card: {\n *           Header: CardHeader,\n *         },\n *       }}\n *     />\n *   )\n * }\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getLoginFlow(\n  params: QueryParams | Promise<QueryParams>,\n): Promise<LoginFlow | null | void> {\n  const p = await toFlowParams(await params)\n  return getFlow(\n    await params,\n    () => serverSideFrontendClient.getLoginFlowRaw(p, initOverrides),\n    FlowType.Login,\n  )\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { FlowType, RegistrationFlow } from \"@ory/client-fetch\"\n\nimport { initOverrides, QueryParams } from \"../types\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getFlow } from \"./flow\"\nimport { toFlowParams } from \"./utils\"\n\n/**\n * Use this method in an app router page to fetch an existing registration flow or to create a new one. This method works with server-side rendering.\n *\n * ```\n * import { Registration } from \"@ory/elements-react/theme\"\n * import { getRegistrationFlow, OryPageParams } from \"@ory/nextjs/app\"\n * import { enhanceConfig } from \"@ory/nextjs\"\n *\n * import config from \"@/ory.config\"\n * import CardHeader from \"@/app/auth/registration/card-header\"\n *\n * export default async function RegistrationPage(props: OryPageParams) {\n *   const flow = await getRegistrationFlow(props.searchParams)\n *\n *   if (!flow) {\n *     return null\n *   }\n *\n *   return (\n *     <Registration\n *       flow={flow}\n *       config={enhanceConfig(config)}\n *       components={{\n *         Card: {\n *           Header: CardHeader,\n *         },\n *       }}\n *     />\n *   )\n * }\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getRegistrationFlow(\n  params: QueryParams | Promise<QueryParams>,\n): Promise<RegistrationFlow | null | void> {\n  const p = await toFlowParams(await params)\n  return getFlow(\n    await params,\n    () => serverSideFrontendClient.getRegistrationFlowRaw(p, initOverrides),\n    FlowType.Registration,\n  )\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { FlowType, RecoveryFlow } from \"@ory/client-fetch\"\n\nimport { initOverrides, QueryParams } from \"../types\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getFlow } from \"./flow\"\nimport { toFlowParams } from \"./utils\"\n\n/**\n * Use this method in an app router page to fetch an existing recovery flow or to create a new one. This method works with server-side rendering.\n *\n * ```\n * import { Recovery } from \"@ory/elements-react/theme\"\n * import { getRecoveryFlow, OryPageParams } from \"@ory/nextjs/app\"\n * import { enhanceConfig } from \"@ory/nextjs\"\n *\n * import config from \"@/ory.config\"\n * import CardHeader from \"@/app/auth/recovery/card-header\"\n *\n * export default async function RecoveryPage(props: OryPageParams) {\n *   const flow = await getRecoveryFlow(props.searchParams)\n *\n *   if (!flow) {\n *     return null\n *   }\n *\n *   return (\n *     <Recovery\n *       flow={flow}\n *       config={enhanceConfig(config)}\n *       components={{\n *         Card: {\n *           Header: CardHeader,\n *         },\n *       }}\n *     />\n *   )\n * }\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getRecoveryFlow(\n  params: QueryParams | Promise<QueryParams>,\n): Promise<RecoveryFlow | null | void> {\n  const p = await toFlowParams(await params)\n  return getFlow(\n    await params,\n    () => serverSideFrontendClient.getRecoveryFlowRaw(p, initOverrides),\n    FlowType.Recovery,\n  )\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { FlowType, VerificationFlow } from \"@ory/client-fetch\"\n\nimport { initOverrides, QueryParams } from \"../types\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getFlow } from \"./flow\"\nimport { toFlowParams } from \"./utils\"\n\n/**\n * Use this method in an app router page to fetch an existing verification flow or to create a new one. This method works with server-side rendering.\n *\n * ```\n * import { Verification } from \"@ory/elements-react/theme\"\n * import { getVerificationFlow, OryPageParams } from \"@ory/nextjs/app\"\n * import { enhanceConfig } from \"@ory/nextjs\"\n *\n * import config from \"@/ory.config\"\n * import CardHeader from \"@/app/auth/verification/card-header\"\n *\n * export default async function VerificationPage(props: OryPageParams) {\n *   const flow = await getVerificationFlow(props.searchParams)\n *\n *   if (!flow) {\n *     return null\n *   }\n *\n *   return (\n *     <Verification\n *       flow={flow}\n *       config={enhanceConfig(config)}\n *       components={{\n *         Card: {\n *           Header: CardHeader,\n *         },\n *       }}\n *     />\n *   )\n * }\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getVerificationFlow(\n  params: QueryParams | Promise<QueryParams>,\n): Promise<VerificationFlow | null | void> {\n  const p = await toFlowParams(await params)\n  return getFlow(\n    await params,\n    () => serverSideFrontendClient.getVerificationFlowRaw(p, initOverrides),\n    FlowType.Verification,\n  )\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { FlowType, SettingsFlow } from \"@ory/client-fetch\"\n\nimport { initOverrides, QueryParams } from \"../types\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getFlow } from \"./flow\"\nimport { toFlowParams } from \"./utils\"\n\n/**\n * Use this method in an app router page to fetch an existing login flow or to create a new one. This method works with server-side rendering.\n *\n * ```\n * import { Login } from \"@ory/elements-react/theme\"\n * import { getLoginFlow, OryPageParams } from \"@ory/nextjs/app\"\n * import { enhanceConfig } from \"@ory/nextjs\"\n *\n * import config from \"@/ory.config\"\n * import CardHeader from \"@/app/auth/login/card-header\"\n *\n * export default async function LoginPage(props: OryPageParams) {\n *   const flow = await getLoginFlow(props.searchParams)\n *\n *   if (!flow) {\n *     return null\n *   }\n *\n *   return (\n *     <Login\n *       flow={flow}\n *       config={enhanceConfig(config)}\n *       components={{\n *         Card: {\n *           Header: CardHeader,\n *         },\n *       }}\n *     />\n *   )\n * }\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getSettingsFlow(\n  params: QueryParams | Promise<QueryParams>,\n): Promise<SettingsFlow | null | void> {\n  const p = await toFlowParams(await params)\n  return getFlow(\n    await params,\n    () => serverSideFrontendClient.getSettingsFlowRaw(p, initOverrides),\n    FlowType.Settings,\n  )\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\nimport { LogoutFlow } from \"@ory/client-fetch\"\n\nimport { headers } from \"next/headers\"\nimport { rewriteJsonResponse } from \"../utils/rewrite\"\nimport { guessPotentiallyProxiedOrySdkUrl } from \"../utils/sdk\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getPublicUrl } from \"./utils\"\n\n/**\n * Use this method in an app router page to create a new logout flow. This method works with server-side rendering.\n *\n * ```\n * import { getLogoutFlow } from \"@ory/nextjs/app\"\n *\n * async function LogoutLink() {\n *   const flow = await getLogoutFlow()\n *\n *   return (\n *     <a href={flow.logout_url}>\n *       Logout\n *     </a>\n *   )\n * }\n *\n * ```\n *\n * @param params - The query parameters of the request.\n */\nexport async function getLogoutFlow({\n  returnTo,\n}: { returnTo?: string } = {}): Promise<LogoutFlow> {\n  const h = await headers()\n\n  const knownProxiedUrl = await getPublicUrl()\n  const url = guessPotentiallyProxiedOrySdkUrl({\n    knownProxiedUrl,\n  })\n  return serverSideFrontendClient\n    .createBrowserLogoutFlow({\n      cookie: h.get(\"cookie\") ?? \"\",\n      returnTo,\n    })\n    .then((v: LogoutFlow): LogoutFlow => rewriteJsonResponse(v, url))\n}\n","// Copyright © 2024 Ory Corp\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Session } from \"@ory/client-fetch\"\nimport { serverSideFrontendClient } from \"./client\"\nimport { getCookieHeader } from \"./utils\"\n\nexport async function getServerSession(): Promise<Session | null> {\n  const cookie = await getCookieHeader()\n  return serverSideFrontendClient\n    .toSession({\n      cookie,\n    })\n    .catch(() => null)\n}\n"]}