@ory/nextjs
Version:
This library was generated with [Nx](https://nx.dev).
1 lines • 30.9 kB
Source Map (JSON)
{"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"]}