@stackframe/stack-shared 2.8.59 → 2.8.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -116,7 +116,7 @@ var StackClientInterface = class {
116
116
  client_secret: this.options.publishableClientKey
117
117
  };
118
118
  const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);
119
- const allowInsecure = (process.env.NODE_ENV?.includes("dev") || process.env.NODE_ENV === "test") && tokenEndpoint.startsWith("http://");
119
+ const allowInsecure = tokenEndpoint.startsWith("http://");
120
120
  const response = await this._networkRetryException(async () => {
121
121
  const rawResponse = await oauth.refreshTokenGrantRequest(
122
122
  as,
@@ -790,7 +790,7 @@ var StackClientInterface = class {
790
790
  client_secret: this.options.publishableClientKey
791
791
  };
792
792
  const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);
793
- const allowInsecure = (process.env.NODE_ENV?.includes("dev") || process.env.NODE_ENV === "test") && tokenEndpoint.startsWith("http://");
793
+ const allowInsecure = tokenEndpoint.startsWith("http://");
794
794
  let params;
795
795
  try {
796
796
  params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/interface/client-interface.ts"],"sourcesContent":["import * as oauth from 'oauth4webapi';\n\nimport * as yup from 'yup';\nimport { KnownError, KnownErrors } from '../known-errors';\nimport { inlineProductSchema } from '../schema-fields';\nimport { AccessToken, InternalSession, RefreshToken } from '../sessions';\nimport { generateSecureRandomString } from '../utils/crypto';\nimport { StackAssertionError, throwErr } from '../utils/errors';\nimport { globalVar } from '../utils/globals';\nimport { HTTP_METHODS, HttpMethod } from '../utils/http';\nimport { ReadonlyJson } from '../utils/json';\nimport { filterUndefined, filterUndefinedOrNull } from '../utils/objects';\nimport { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '../utils/passkey';\nimport { wait } from '../utils/promises';\nimport { Result } from \"../utils/results\";\nimport { deindent } from '../utils/strings';\nimport { urlString } from '../utils/urls';\nimport { ConnectedAccountAccessTokenCrud } from './crud/connected-accounts';\nimport { ContactChannelsCrud } from './crud/contact-channels';\nimport { CurrentUserCrud } from './crud/current-user';\nimport { ItemCrud } from './crud/items';\nimport { NotificationPreferenceCrud } from './crud/notification-preferences';\nimport { OAuthProviderCrud } from './crud/oauth-providers';\nimport { CustomerProductsListResponse, ListCustomerProductsOptions } from './crud/products';\nimport { TeamApiKeysCrud, UserApiKeysCrud, teamApiKeysCreateInputSchema, teamApiKeysCreateOutputSchema, userApiKeysCreateInputSchema, userApiKeysCreateOutputSchema } from './crud/project-api-keys';\nimport { ProjectPermissionsCrud } from './crud/project-permissions';\nimport { AdminUserProjectsCrud, ClientProjectsCrud } from './crud/projects';\nimport { SessionsCrud } from './crud/sessions';\nimport { TeamInvitationCrud } from './crud/team-invitation';\nimport { TeamMemberProfilesCrud } from './crud/team-member-profiles';\nimport { TeamPermissionsCrud } from './crud/team-permissions';\nimport { TeamsCrud } from './crud/teams';\n\nexport type ClientInterfaceOptions = {\n clientVersion: string,\n // This is a function instead of a string because it might be different based on the environment (for example client vs server)\n getBaseUrl: () => string,\n extraRequestHeaders: Record<string, string>,\n projectId: string,\n prepareRequest?: () => Promise<void>,\n} & ({\n publishableClientKey: string,\n} | {\n projectOwnerSession: InternalSession,\n});\n\nexport class StackClientInterface {\n private pendingNetworkDiagnostics?: ReturnType<StackClientInterface[\"_runNetworkDiagnosticsInner\"]>;\n\n constructor(public readonly options: ClientInterfaceOptions) {\n // nothing here\n }\n\n get projectId() {\n return this.options.projectId;\n }\n\n getApiUrl() {\n return this.options.getBaseUrl() + \"/api/v1\";\n }\n\n public async runNetworkDiagnostics(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n if (this.pendingNetworkDiagnostics) {\n return await this.pendingNetworkDiagnostics;\n }\n\n this.pendingNetworkDiagnostics = this._runNetworkDiagnosticsInner(session, requestType);\n try {\n return await this.pendingNetworkDiagnostics;\n } finally {\n this.pendingNetworkDiagnostics = undefined;\n }\n }\n\n private async _runNetworkDiagnosticsInner(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n const tryRequest = async (cb: () => Promise<void>) => {\n try {\n await cb();\n return \"OK\";\n } catch (e) {\n return `${e}`;\n }\n };\n const cfTrace = await tryRequest(async () => {\n const res = await fetch(\"https://1.1.1.1/cdn-cgi/trace\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const baseUrlBackend = await tryRequest(async () => {\n const res = await fetch(new URL(\"/health\", this.getApiUrl()));\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodDashboard = await tryRequest(async () => {\n const res = await fetch(\"https://app.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodBackend = await tryRequest(async () => {\n const res = await fetch(\"https://api.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n return {\n \"navigator?.onLine\": globalVar.navigator?.onLine,\n cfTrace,\n baseUrlBackend,\n prodDashboard,\n prodBackend,\n };\n }\n\n protected async _createNetworkError(cause: Error, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n return new Error(deindent`\n Stack Auth is unable to connect to the server. Please check your internet connection and try again.\n\n If the problem persists, please contact support and provide a screenshot of your entire browser console.\n\n ${cause}\n\n ${JSON.stringify(await this.runNetworkDiagnostics(session, requestType), null, 2)}\n `, { cause: cause });\n }\n\n protected async _networkRetry<T>(cb: () => Promise<Result<T, any>>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n const retriedResult = await Result.retry(\n cb,\n 5,\n { exponentialDelayBase: 1000 },\n );\n\n // try to diagnose the error for the user\n if (retriedResult.status === \"error\") {\n if (globalVar.navigator && globalVar.navigator.onLine === false) {\n throw new Error(\"You are offline. Please check your internet connection and try again. (window.navigator.onLine is false)\", { cause: retriedResult.error });\n }\n throw await this._createNetworkError(retriedResult.error, session, requestType);\n }\n return retriedResult.data;\n }\n\n protected async _networkRetryException<T>(cb: () => Promise<T>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n return await this._networkRetry(async () => await Result.fromThrowingAsync(cb), session, requestType);\n }\n\n public async fetchNewAccessToken(refreshToken: RefreshToken) {\n if (!('publishableClientKey' in this.options)) {\n // TODO support it\n throw new Error(\"Admin session token is currently not supported for fetching new access token. Did you try to log in on a StackApp initiated with the admin session?\");\n }\n\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = (process.env.NODE_ENV?.includes(\"dev\") || process.env.NODE_ENV === 'test') && tokenEndpoint.startsWith('http://');\n\n const response = await this._networkRetryException(async () => {\n const rawResponse = await oauth.refreshTokenGrantRequest(\n as,\n client,\n clientAuthentication,\n refreshToken.token,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n const response = await this._processResponse(rawResponse);\n\n if (response.status === \"error\") {\n const error = response.error;\n if (KnownErrors.RefreshTokenError.isInstance(error)) {\n return null;\n }\n throw error;\n }\n\n if (!response.data.ok) {\n const body = await response.data.text();\n throw new Error(`Failed to send refresh token request: ${response.status} ${body}`);\n }\n\n return response.data;\n });\n if (!response) return null;\n\n let result: oauth.TokenEndpointResponse;\n try {\n result = await oauth.processRefreshTokenResponse(as, client, response);\n } catch (e){\n if (e instanceof oauth.ResponseBodyError) {\n throw new StackAssertionError(\"ResponseBodyError when processing refresh token response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing refresh token response\", { cause: e });\n }\n\n if (!result.access_token) {\n throw new StackAssertionError(\"Access token not found in token endpoint response, this is weird!\");\n }\n\n return AccessToken.createIfValid(result.access_token) ?? throwErr(\"Access token in fetchNewAccessToken is invalid, looks like the backend is returning an invalid token!\", { result });\n\n }\n\n public async sendClientRequest(\n path: string,\n requestOptions: RequestInit,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\" = \"client\",\n ) {\n session ??= this.createSession({\n refreshToken: null,\n });\n\n\n return await this._networkRetry(\n () => this.sendClientRequestInner(path, requestOptions, session!, requestType),\n session,\n requestType,\n );\n }\n\n public createSession(options: Omit<ConstructorParameters<typeof InternalSession>[0], \"refreshAccessTokenCallback\">): InternalSession {\n const session = new InternalSession({\n refreshAccessTokenCallback: async (refreshToken) => await this.fetchNewAccessToken(refreshToken),\n ...options,\n });\n return session;\n }\n\n protected async sendClientRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendClientRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n private async sendClientRequestInner(\n path: string,\n options: RequestInit,\n session: InternalSession,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<Result<Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n }>> {\n /**\n * `tokenObj === null` means the session is invalid/not logged in\n */\n let tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n\n let adminSession = \"projectOwnerSession\" in this.options ? this.options.projectOwnerSession : null;\n let adminTokenObj = adminSession ? await adminSession.getOrFetchLikelyValidTokens(20_000, null) : null;\n\n // all requests should be dynamic to prevent Next.js caching\n await this.options.prepareRequest?.();\n\n let url = this.getApiUrl() + path;\n if (url.endsWith(\"/\")) {\n url = url.slice(0, -1);\n }\n const params: RequestInit = {\n /**\n * This fetch may be cross-origin, in which case we don't want to send cookies of the\n * original origin (this is the default behavior of `credentials`).\n *\n * To help debugging, also omit cookies on same-origin, so we don't accidentally\n * implement reliance on cookies anywhere.\n *\n * However, Cloudflare Workers don't actually support `credentials`, so we only set it\n * if Cloudflare-exclusive globals are not detected. https://github.com/cloudflare/workers-sdk/issues/2514\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n credentials: \"omit\",\n }),\n ...options,\n headers: {\n \"X-Stack-Override-Error-Status\": \"true\",\n \"X-Stack-Project-Id\": this.projectId,\n \"X-Stack-Access-Type\": requestType,\n \"X-Stack-Client-Version\": this.options.clientVersion,\n ...(tokenObj ? {\n \"X-Stack-Access-Token\": tokenObj.accessToken.token,\n } : {}),\n ...(tokenObj?.refreshToken ? {\n \"X-Stack-Refresh-Token\": tokenObj.refreshToken.token,\n } : {}),\n \"X-Stack-Allow-Anonymous-User\": \"true\",\n ...('publishableClientKey' in this.options ? {\n \"X-Stack-Publishable-Client-Key\": this.options.publishableClientKey,\n } : {}),\n ...(adminTokenObj ? {\n \"X-Stack-Admin-Access-Token\": adminTokenObj.accessToken.token,\n } : {}),\n /**\n * Next.js until v15 would cache fetch requests by default, and forcefully disabling it was nearly impossible.\n *\n * This header is used to change the cache key and hence always disable it, because we do our own caching.\n *\n * When we drop support for Next.js <15, we may be able to remove this header, but please make sure that this is\n * the case (I haven't actually tested.)\n */\n \"X-Stack-Random-Nonce\": generateSecureRandomString(),\n // don't show a warning when proxying the API through ngrok (only relevant if the API url is an ngrok site)\n 'ngrok-skip-browser-warning': 'true',\n ...this.options.extraRequestHeaders,\n ...options.headers,\n },\n /**\n * Cloudflare Workers does not support cache, so don't pass it there\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n cache: \"no-store\",\n }),\n };\n\n let rawRes;\n try {\n rawRes = await fetch(url, params);\n } catch (e) {\n if (e instanceof TypeError) {\n // Likely to be a network error. Retry if the request is idempotent, throw network error otherwise.\n if (HTTP_METHODS[(params.method ?? \"GET\") as HttpMethod].idempotent) {\n return Result.error(e);\n } else {\n throw await this._createNetworkError(e, session, requestType);\n }\n }\n throw e;\n }\n\n const processedRes = await this._processResponse(rawRes);\n if (processedRes.status === \"error\") {\n // If the access token is invalid, reset it and retry\n if (KnownErrors.InvalidAccessToken.isInstance(processedRes.error)) {\n if (!tokenObj) {\n throw new StackAssertionError(\"Received invalid access token, but session is not logged in\", { tokenObj, processedRes });\n }\n session.markAccessTokenExpired(tokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Same for the admin access token\n // TODO HACK: Some of the backend hasn't been ported to use the new error codes, so if we have project owner tokens we need to check for ApiKeyNotFound too. Once the migration to smartRouteHandlers is complete, we can check for InvalidAdminAccessToken only.\n if (adminSession && (KnownErrors.InvalidAdminAccessToken.isInstance(processedRes.error) || KnownErrors.ApiKeyNotFound.isInstance(processedRes.error))) {\n if (!adminTokenObj) {\n throw new StackAssertionError(\"Received invalid admin access token, but admin session is not logged in\", { adminTokenObj, processedRes });\n }\n adminSession.markAccessTokenExpired(adminTokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Known errors are client side errors, so except for the ones above they should not be retried\n // Hence, throw instead of returning an error\n throw processedRes.error;\n }\n\n\n const res = Object.assign(processedRes.data, {\n usedTokens: tokenObj,\n });\n if (res.ok) {\n return Result.ok(res);\n } else if (res.status === 429) {\n // Rate limited, so retry if we can\n const retryAfter = res.headers.get(\"Retry-After\");\n if (retryAfter !== null) {\n console.log(`Rate limited while sending request to ${url}. Will retry after ${retryAfter} seconds...`);\n await wait(Number(retryAfter) * 1000);\n return Result.error(new Error(`Rate limited, retrying after ${retryAfter} seconds`));\n }\n console.log(`Rate limited while sending request to ${url}, no retry-after header received. Retrying...`);\n return Result.error(new Error(\"Rate limited, no retry-after header received\"));\n } else {\n const error = await res.text();\n\n const errorObj = new StackAssertionError(`Failed to send request to ${url}: ${res.status} ${error}`, { request: params, res, path });\n\n if (res.status === 508 && error.includes(\"INFINITE_LOOP_DETECTED\")) {\n // Some Vercel deployments seem to have an odd infinite loop bug. In that case, retry.\n // See: https://github.com/stack-auth/stack-auth/issues/319\n return Result.error(errorObj);\n }\n\n // Do not retry, throw error instead of returning one\n throw errorObj;\n }\n }\n\n private async _processResponse(rawRes: Response): Promise<Result<Response, KnownError>> {\n let res = rawRes;\n if (rawRes.headers.has(\"x-stack-actual-status\")) {\n const actualStatus = Number(rawRes.headers.get(\"x-stack-actual-status\"));\n res = new Response(rawRes.body, {\n status: actualStatus,\n statusText: rawRes.statusText,\n headers: rawRes.headers,\n });\n }\n\n // Handle known errors\n if (res.headers.has(\"x-stack-known-error\")) {\n const errorJson = await res.json();\n if (res.headers.get(\"x-stack-known-error\") !== errorJson.code) {\n throw new StackAssertionError(\"Mismatch between x-stack-known-error header and error code in body; the server's response is invalid\");\n }\n const error = KnownError.fromJson(errorJson);\n return Result.error(error);\n }\n\n return Result.ok(res);\n }\n\n public async checkFeatureSupport(options: { featureName?: string } & ReadonlyJson): Promise<never> {\n const res = await this.sendClientRequest(\"/check-feature-support\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(options),\n }, null);\n\n throw new StackAssertionError(await res.text());\n }\n\n async sendForgotPasswordEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/send-reset-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.UserNotFound],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async sendVerificationEmail(\n email: string,\n callbackUrl: string,\n session: InternalSession\n ): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/send-verification-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async sendMagicLinkEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/send-sign-in-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.RedirectUrlNotWhitelisted]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async resetPassword(\n options: { code: string } & ({ password: string } | { onlyVerifyCode: true })\n ): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"onlyVerifyCode\" in options ? \"/auth/password/reset/check-code\" : \"/auth/password/reset\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n ...(\"password\" in options ? { password: options.password } : {}),\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n session,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async setPassword(\n options: { password: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/set\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.resetPassword({ code, onlyVerifyCode: true });\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/verify\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async initiatePasskeyRegistration(\n options: {},\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialCreationOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-registration\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async registerPasskey(\n options: { credential: RegistrationResponseJSON, code: string },\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"PasskeyRegistrationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/register\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasskeyRegistrationFailed]\n );\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n return Result.ok(undefined);\n }\n\n async initiatePasskeyAuthentication(\n options: {\n },\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialRequestOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-authentication\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async sendTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n session: InternalSession,\n }): Promise<void> {\n await this.sendClientRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n options.session,\n );\n }\n\n async acceptTeamInvitation<T extends 'use' | 'details' | 'check'>(options: {\n code: string,\n session: InternalSession,\n type: T,\n }): Promise<Result<T extends 'details' ? { team_display_name: string } : undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n options.type === 'check' ?\n \"/team-invitations/accept/check-code\" :\n options.type === 'details' ?\n \"/team-invitations/accept/details\" :\n \"/team-invitations/accept\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n }),\n },\n options.session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async totpMfa(\n attemptCode: string,\n totp: string,\n session: InternalSession\n ) {\n const res = await this.sendClientRequest(\"/auth/mfa/sign-in\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: attemptCode,\n type: \"totp\",\n totp: totp,\n }),\n }, session);\n\n const result = await res.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n };\n }\n\n async signInWithCredential(\n email: string,\n password: string,\n session: InternalSession\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"EmailPasswordMismatch\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n password,\n }),\n },\n session,\n [KnownErrors.EmailPasswordMismatch]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpWithCredential(\n email: string,\n password: string,\n emailVerificationRedirectUrl: string | undefined,\n session: InternalSession,\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-up\",\n {\n headers: {\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n body: JSON.stringify({\n email,\n password,\n verification_callback_url: emailVerificationRedirectUrl,\n }),\n },\n session,\n [KnownErrors.UserWithEmailAlreadyExists, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpAnonymously(session: InternalSession): Promise<Result<{ accessToken: string, refreshToken: string }, never>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/anonymous/sign-up\",\n {\n method: \"POST\",\n },\n session,\n [],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signInWithMagicLink(code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithMfa(totp: string, code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/mfa/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"totp\",\n totp,\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithPasskey(body: { authentication_response: AuthenticationResponseJSON, code: string }, session: InternalSession): Promise<Result<{accessToken: string, refreshToken: string }, KnownErrors[\"PasskeyAuthenticationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body),\n },\n session,\n [KnownErrors.PasskeyAuthenticationFailed]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async getOAuthUrl(\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n afterCallbackRedirectUrl?: string,\n codeChallenge: string,\n state: string,\n type: \"authenticate\" | \"link\",\n providerScope?: string,\n session: InternalSession,\n }\n ): Promise<string> {\n const updatedRedirectUrl = new URL(options.redirectUrl);\n for (const key of [\"code\", \"state\"]) {\n if (updatedRedirectUrl.searchParams.has(key)) {\n console.warn(\"Redirect URL already contains \" + key + \" parameter, removing it as it will be overwritten by the OAuth callback\");\n }\n updatedRedirectUrl.searchParams.delete(key);\n }\n\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const url = new URL(this.getApiUrl() + \"/auth/oauth/authorize/\" + options.provider.toLowerCase());\n url.searchParams.set(\"client_id\", this.projectId);\n url.searchParams.set(\"client_secret\", this.options.publishableClientKey);\n url.searchParams.set(\"redirect_uri\", updatedRedirectUrl.toString());\n url.searchParams.set(\"scope\", \"legacy\");\n url.searchParams.set(\"state\", options.state);\n url.searchParams.set(\"grant_type\", \"authorization_code\");\n url.searchParams.set(\"code_challenge\", options.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"type\", options.type);\n url.searchParams.set(\"error_redirect_url\", options.errorRedirectUrl);\n\n // TODO: This token will expire after 45s if the token lifetime is 60s, which may be shorter than the OAuth flow.\n // We should probably find a way to request a longer-lived token here.\n const tokens = await options.session.getOrFetchLikelyValidTokens(45_000, 60_000);\n if (tokens) {\n url.searchParams.set(\"token\", tokens.accessToken.token);\n }\n\n if (options.afterCallbackRedirectUrl) {\n url.searchParams.set(\"after_callback_redirect_url\", options.afterCallbackRedirectUrl);\n }\n if (options.providerScope) {\n url.searchParams.set(\"provider_scope\", options.providerScope);\n }\n\n return url.toString();\n }\n\n async callOAuthCallback(options: {\n oauthParams: URLSearchParams,\n redirectUri: string,\n codeVerifier: string,\n state: string,\n }): Promise<{ newUser: boolean, afterCallbackRedirectUrl?: string, accessToken: string, refreshToken: string }> {\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // Allow insecure HTTP requests only in test environment (for localhost testing)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = (process.env.NODE_ENV?.includes(\"dev\") || process.env.NODE_ENV === 'test') && tokenEndpoint.startsWith('http://');\n\n let params: URLSearchParams;\n try {\n params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);\n } catch (e) {\n if (e instanceof oauth.AuthorizationResponseError) {\n throw new StackAssertionError(\"Authorization response error when validating outer OAuth response\", {\n //cause is a URLSearchParams object for this error, so we need to serialize it better\n cause: Object.fromEntries(e.cause),\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when validating outer OAuth response\", { cause: e });\n }\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n clientAuthentication,\n params,\n options.redirectUri,\n options.codeVerifier,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n let result;\n try {\n result = await oauth.processAuthorizationCodeResponse(as, client, response);\n } catch (e) {\n if (e instanceof oauth.ResponseBodyError) {\n if ((e.cause as any).code === \"MULTI_FACTOR_AUTHENTICATION_REQUIRED\") {\n throw new KnownErrors.MultiFactorAuthenticationRequired((e.cause as any).details.attempt_code);\n }\n // TODO Handle OAuth 2.0 response body error\n throw new StackAssertionError(\"Outer OAuth error during authorization code response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing authorization code response\", { cause: e });\n }\n return {\n newUser: result.is_new_user as boolean,\n afterCallbackRedirectUrl: result.after_callback_redirect_url as string | undefined,\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? throwErr(\"Refresh token not found in outer OAuth response\"),\n };\n }\n\n async signOut(session: InternalSession): Promise<void> {\n const tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n if (tokenObj) {\n const resOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/sessions/current\",\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n session,\n [KnownErrors.RefreshTokenError]\n );\n if (resOrError.status === \"error\") {\n if (KnownErrors.RefreshTokenError.isInstance(resOrError.error)) {\n // refresh token was already invalid, just continue like nothing happened\n } else {\n // this should never happen\n throw new StackAssertionError(\"Unexpected error\", { error: resOrError.error });\n }\n } else {\n // user was signed out successfully, all good\n }\n }\n session.markInvalid();\n }\n\n async getClientUserByToken(session: InternalSession): Promise<CurrentUserCrud[\"Client\"][\"Read\"] | null> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new StackAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud[\"Client\"][\"Read\"] = await response.json();\n if (!(user as any)) throw new StackAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async listTeamInvitations(\n options: {\n teamId: string,\n },\n session: InternalSession,\n ): Promise<TeamInvitationCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-invitations?\" + new URLSearchParams({ team_id: options.teamId }),\n {},\n session,\n );\n const result = await response.json() as TeamInvitationCrud['Client']['List'];\n return result.items;\n }\n\n async revokeTeamInvitation(\n invitationId: string,\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n session,\n );\n }\n\n async listTeamMemberProfiles(\n options: {\n teamId?: string,\n userId?: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-member-profiles?\" + new URLSearchParams(filterUndefined({\n team_id: options.teamId,\n user_id: options.userId,\n })),\n {},\n session,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Client']['List'];\n return result.items;\n }\n\n async getTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async leaveTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-memberships/${teamId}/me`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n }\n\n async updateTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n session,\n );\n }\n\n async updateTeam(\n options: {\n teamId: string,\n data: TeamsCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${options.teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.data),\n },\n session,\n );\n }\n\n async listCurrentUserTeamPermissions(\n options: {\n teamId: string,\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<TeamPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/team-permissions?team_id=${options.teamId}&user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserProjectPermissions(\n options: {\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<ProjectPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/project-permissions?user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserTeams(session: InternalSession): Promise<TeamsCrud[\"Client\"][\"Read\"][]> {\n const response = await this.sendClientRequest(\n \"/teams?user_id=me\",\n {},\n session,\n );\n const result = await response.json() as TeamsCrud[\"Client\"][\"List\"];\n return result.items;\n }\n\n async getClientProject(): Promise<Result<ClientProjectsCrud['Client']['Read'], KnownErrors[\"ProjectNotFound\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\"/projects/current\", {}, null, [KnownErrors.ProjectNotFound]);\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const response = responseOrError.data;\n const project: ClientProjectsCrud['Client']['Read'] = await response.json();\n return Result.ok(project);\n }\n\n async updateClientUser(update: CurrentUserCrud[\"Client\"][\"Update\"], session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n session,\n );\n }\n\n async listProjects(session: InternalSession): Promise<AdminUserProjectsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\"/internal/projects\", {}, session);\n if (!response.ok) {\n throw new Error(\"Failed to list projects: \" + response.status + \" \" + (await response.text()));\n }\n\n const json = await response.json() as AdminUserProjectsCrud['Client']['List'];\n return json.items;\n }\n\n async createProject(\n project: AdminUserProjectsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<AdminUserProjectsCrud['Client']['Read']> {\n const fetchResponse = await this.sendClientRequest(\n \"/internal/projects\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(project),\n },\n session,\n );\n if (!fetchResponse.ok) {\n throw new Error(\"Failed to create project: \" + fetchResponse.status + \" \" + (await fetchResponse.text()));\n }\n\n const json = await fetchResponse.json();\n return json;\n }\n\n async createProviderAccessToken(\n provider: string,\n scope: string,\n session: InternalSession,\n ): Promise<ConnectedAccountAccessTokenCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/connected-accounts/me/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n session,\n );\n return await response.json();\n }\n\n async createClientTeam(\n data: TeamsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<TeamsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${teamId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteCurrentUser(session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async createClientContactChannel(\n data: ContactChannelsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async updateClientContactChannel(\n id: string,\n data: ContactChannelsCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteClientContactChannel(\n id: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteSession(\n sessionId: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/auth/sessions/${sessionId}?user_id=me`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async listSessions(\n session: InternalSession,\n ): Promise<SessionsCrud['Client']['List']> {\n const response = await this.sendClientRequest(\n \"/auth/sessions?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n\n async listClientContactChannels(\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/contact-channels?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n const json = await response.json() as ContactChannelsCrud['Client']['List'];\n return json.items;\n }\n\n async sendCurrentUserContactChannelVerificationEmail(\n contactChannelId: string,\n callbackUrl: string,\n session: InternalSession,\n ): Promise<Result<undefined, KnownErrors[\"EmailAlreadyVerified\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n `/contact-channels/me/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n async cliLogin(\n loginCode: string,\n refreshToken: string,\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"SchemaError\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/cli/complete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n login_code: loginCode,\n refresh_token: refreshToken,\n }),\n },\n session,\n [KnownErrors.SchemaError]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n private async _getApiKeyRequestInfo(options: { user_id: string | null } | { team_id: string }) {\n if (\"user_id\" in options && \"team_id\" in options) {\n throw new StackAssertionError(\"Cannot specify both user_id and team_id in _getApiKeyRequestInfo\");\n }\n\n return {\n endpoint: \"team_id\" in options ? \"/team-api-keys\" : \"/user-api-keys\",\n queryParams: new URLSearchParams(filterUndefinedOrNull(options)),\n };\n }\n\n // API Keys CRUD operations\n listProjectApiKeys(options: { user_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { user_id: string } | { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]>;\n async listProjectApiKeys(\n options: { user_id: string } | { team_id: string },\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n const json = await response.json();\n return json.items;\n }\n\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n async createProjectApiKey(\n data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint } = await this._getApiKeyRequestInfo(data);\n\n const response = await sendRequest(\n `${endpoint}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n getProjectApiKey(options: { user_id: string | null }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { user_id: string | null } | { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async getProjectApiKey(\n options: { user_id: string | null } | { team_id: string },\n keyId: string,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n updateProjectApiKey(options: { user_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { team_id: string }, keyId: string, data: TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { user_id: string } | { team_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async updateProjectApiKey(\n options: { user_id: string } | { team_id: string },\n keyId: string,\n data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'],\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n checkProjectApiKey(type: \"user\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null>;\n async checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequestAndCatchKnownError : (this as any).sendServerRequestAndCatchKnownError as never).bind(this);\n const result = await sendRequest(\n `/${type}-api-keys/check`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ api_key: apiKey }),\n },\n session,\n [KnownErrors.ApiKeyNotValid]\n );\n if (result.status === \"error\") {\n return null;\n }\n return await result.data.json();\n }\n\n async listNotificationCategories(\n session: InternalSession,\n ): Promise<NotificationPreferenceCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/emails/notification-preference/me`,\n {},\n session,\n );\n const result = await response.json() as NotificationPreferenceCrud['Client']['List'];\n return result.items;\n }\n\n async setNotificationsEnabled(\n notificationCategoryId: string,\n enabled: boolean,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/emails/notification-preference/me/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n session,\n );\n }\n\n async getOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n async updateOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async listOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendClientRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n session,\n );\n const result = await response.json();\n return result.items;\n }\n\n async deleteOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<void> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n return await response.json();\n }\n\n async getItem(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n session: InternalSession | null,\n ): Promise<ItemCrud['Client']['Read']> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new StackAssertionError(\"getItem requires one of userId, teamId, or customCustomerId\");\n }\n\n const response = await this.sendClientRequest(\n urlString`/payments/items/${customerType}/${customerId}/${options.itemId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async listProducts(\n options: ListCustomerProductsOptions,\n session: InternalSession | null,\n ): Promise<CustomerProductsListResponse> {\n const queryParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit !== undefined ? options.limit.toString() : undefined,\n }));\n const path = urlString`/payments/products/${options.customer_type}/${options.customer_id}`;\n const response = await this.sendClientRequest(\n `${path}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async cancelSubscription(\n options: {\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n product_id: string,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/${options.product_id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async switchSubscription(\n options: {\n customer_type: \"user\" | \"team\",\n customer_id: string,\n from_product_id: string,\n to_product_id: string,\n price_id?: string,\n quantity?: number,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/switch`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n from_product_id: options.from_product_id,\n to_product_id: options.to_product_id,\n price_id: options.price_id,\n quantity: options.quantity,\n }),\n },\n session,\n );\n }\n\n async createCheckoutUrl(\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n productIdOrInline: string | yup.InferType<typeof inlineProductSchema>,\n session: InternalSession | null,\n returnUrl?: string,\n ): Promise<string> {\n const productBody = typeof productIdOrInline === \"string\" ?\n { product_id: productIdOrInline } :\n { inline_product: productIdOrInline };\n const response = await this.sendClientRequest(\n \"/payments/purchases/create-purchase-url\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ customer_type, customer_id, ...productBody, return_url: returnUrl }),\n },\n session\n );\n const { url } = await response.json() as { url: string };\n return url;\n }\n\n async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n async transferProject(internalProjectSession: InternalSession, projectIdToTransfer: string, newTeamId: string): Promise<void> {\n if (this.options.projectId !== \"internal\") {\n throw new StackAssertionError(\"StackClientInterface.transferProject() is only available for internal projects (please specify the project ID in the constructor)\");\n }\n await this.sendClientRequest(\n \"/internal/projects/transfer\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n project_id: projectIdToTransfer,\n new_team_id: newTeamId,\n }),\n },\n internalProjectSession,\n );\n }\n}\n"],"mappings":"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","names":["response"]}
1
+ {"version":3,"sources":["../../../src/interface/client-interface.ts"],"sourcesContent":["import * as oauth from 'oauth4webapi';\n\nimport * as yup from 'yup';\nimport { KnownError, KnownErrors } from '../known-errors';\nimport { inlineProductSchema } from '../schema-fields';\nimport { AccessToken, InternalSession, RefreshToken } from '../sessions';\nimport { generateSecureRandomString } from '../utils/crypto';\nimport { StackAssertionError, throwErr } from '../utils/errors';\nimport { globalVar } from '../utils/globals';\nimport { HTTP_METHODS, HttpMethod } from '../utils/http';\nimport { ReadonlyJson } from '../utils/json';\nimport { filterUndefined, filterUndefinedOrNull } from '../utils/objects';\nimport { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '../utils/passkey';\nimport { wait } from '../utils/promises';\nimport { Result } from \"../utils/results\";\nimport { deindent } from '../utils/strings';\nimport { urlString } from '../utils/urls';\nimport { ConnectedAccountAccessTokenCrud } from './crud/connected-accounts';\nimport { ContactChannelsCrud } from './crud/contact-channels';\nimport { CurrentUserCrud } from './crud/current-user';\nimport { ItemCrud } from './crud/items';\nimport { NotificationPreferenceCrud } from './crud/notification-preferences';\nimport { OAuthProviderCrud } from './crud/oauth-providers';\nimport { CustomerProductsListResponse, ListCustomerProductsOptions } from './crud/products';\nimport { TeamApiKeysCrud, UserApiKeysCrud, teamApiKeysCreateInputSchema, teamApiKeysCreateOutputSchema, userApiKeysCreateInputSchema, userApiKeysCreateOutputSchema } from './crud/project-api-keys';\nimport { ProjectPermissionsCrud } from './crud/project-permissions';\nimport { AdminUserProjectsCrud, ClientProjectsCrud } from './crud/projects';\nimport { SessionsCrud } from './crud/sessions';\nimport { TeamInvitationCrud } from './crud/team-invitation';\nimport { TeamMemberProfilesCrud } from './crud/team-member-profiles';\nimport { TeamPermissionsCrud } from './crud/team-permissions';\nimport { TeamsCrud } from './crud/teams';\n\nexport type ClientInterfaceOptions = {\n clientVersion: string,\n // This is a function instead of a string because it might be different based on the environment (for example client vs server)\n getBaseUrl: () => string,\n extraRequestHeaders: Record<string, string>,\n projectId: string,\n prepareRequest?: () => Promise<void>,\n} & ({\n publishableClientKey: string,\n} | {\n projectOwnerSession: InternalSession,\n});\n\nexport class StackClientInterface {\n private pendingNetworkDiagnostics?: ReturnType<StackClientInterface[\"_runNetworkDiagnosticsInner\"]>;\n\n constructor(public readonly options: ClientInterfaceOptions) {\n // nothing here\n }\n\n get projectId() {\n return this.options.projectId;\n }\n\n getApiUrl() {\n return this.options.getBaseUrl() + \"/api/v1\";\n }\n\n public async runNetworkDiagnostics(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n if (this.pendingNetworkDiagnostics) {\n return await this.pendingNetworkDiagnostics;\n }\n\n this.pendingNetworkDiagnostics = this._runNetworkDiagnosticsInner(session, requestType);\n try {\n return await this.pendingNetworkDiagnostics;\n } finally {\n this.pendingNetworkDiagnostics = undefined;\n }\n }\n\n private async _runNetworkDiagnosticsInner(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n const tryRequest = async (cb: () => Promise<void>) => {\n try {\n await cb();\n return \"OK\";\n } catch (e) {\n return `${e}`;\n }\n };\n const cfTrace = await tryRequest(async () => {\n const res = await fetch(\"https://1.1.1.1/cdn-cgi/trace\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const baseUrlBackend = await tryRequest(async () => {\n const res = await fetch(new URL(\"/health\", this.getApiUrl()));\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodDashboard = await tryRequest(async () => {\n const res = await fetch(\"https://app.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodBackend = await tryRequest(async () => {\n const res = await fetch(\"https://api.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n return {\n \"navigator?.onLine\": globalVar.navigator?.onLine,\n cfTrace,\n baseUrlBackend,\n prodDashboard,\n prodBackend,\n };\n }\n\n protected async _createNetworkError(cause: Error, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n return new Error(deindent`\n Stack Auth is unable to connect to the server. Please check your internet connection and try again.\n\n If the problem persists, please contact support and provide a screenshot of your entire browser console.\n\n ${cause}\n\n ${JSON.stringify(await this.runNetworkDiagnostics(session, requestType), null, 2)}\n `, { cause: cause });\n }\n\n protected async _networkRetry<T>(cb: () => Promise<Result<T, any>>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n const retriedResult = await Result.retry(\n cb,\n 5,\n { exponentialDelayBase: 1000 },\n );\n\n // try to diagnose the error for the user\n if (retriedResult.status === \"error\") {\n if (globalVar.navigator && globalVar.navigator.onLine === false) {\n throw new Error(\"You are offline. Please check your internet connection and try again. (window.navigator.onLine is false)\", { cause: retriedResult.error });\n }\n throw await this._createNetworkError(retriedResult.error, session, requestType);\n }\n return retriedResult.data;\n }\n\n protected async _networkRetryException<T>(cb: () => Promise<T>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n return await this._networkRetry(async () => await Result.fromThrowingAsync(cb), session, requestType);\n }\n\n public async fetchNewAccessToken(refreshToken: RefreshToken) {\n if (!('publishableClientKey' in this.options)) {\n // TODO support it\n throw new Error(\"Admin session token is currently not supported for fetching new access token. Did you try to log in on a StackApp initiated with the admin session?\");\n }\n\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = tokenEndpoint.startsWith('http://');\n\n const response = await this._networkRetryException(async () => {\n const rawResponse = await oauth.refreshTokenGrantRequest(\n as,\n client,\n clientAuthentication,\n refreshToken.token,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n const response = await this._processResponse(rawResponse);\n\n if (response.status === \"error\") {\n const error = response.error;\n if (KnownErrors.RefreshTokenError.isInstance(error)) {\n return null;\n }\n throw error;\n }\n\n if (!response.data.ok) {\n const body = await response.data.text();\n throw new Error(`Failed to send refresh token request: ${response.status} ${body}`);\n }\n\n return response.data;\n });\n if (!response) return null;\n\n let result: oauth.TokenEndpointResponse;\n try {\n result = await oauth.processRefreshTokenResponse(as, client, response);\n } catch (e){\n if (e instanceof oauth.ResponseBodyError) {\n throw new StackAssertionError(\"ResponseBodyError when processing refresh token response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing refresh token response\", { cause: e });\n }\n\n if (!result.access_token) {\n throw new StackAssertionError(\"Access token not found in token endpoint response, this is weird!\");\n }\n\n return AccessToken.createIfValid(result.access_token) ?? throwErr(\"Access token in fetchNewAccessToken is invalid, looks like the backend is returning an invalid token!\", { result });\n\n }\n\n public async sendClientRequest(\n path: string,\n requestOptions: RequestInit,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\" = \"client\",\n ) {\n session ??= this.createSession({\n refreshToken: null,\n });\n\n\n return await this._networkRetry(\n () => this.sendClientRequestInner(path, requestOptions, session!, requestType),\n session,\n requestType,\n );\n }\n\n public createSession(options: Omit<ConstructorParameters<typeof InternalSession>[0], \"refreshAccessTokenCallback\">): InternalSession {\n const session = new InternalSession({\n refreshAccessTokenCallback: async (refreshToken) => await this.fetchNewAccessToken(refreshToken),\n ...options,\n });\n return session;\n }\n\n protected async sendClientRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendClientRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n private async sendClientRequestInner(\n path: string,\n options: RequestInit,\n session: InternalSession,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<Result<Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n }>> {\n /**\n * `tokenObj === null` means the session is invalid/not logged in\n */\n let tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n\n let adminSession = \"projectOwnerSession\" in this.options ? this.options.projectOwnerSession : null;\n let adminTokenObj = adminSession ? await adminSession.getOrFetchLikelyValidTokens(20_000, null) : null;\n\n // all requests should be dynamic to prevent Next.js caching\n await this.options.prepareRequest?.();\n\n let url = this.getApiUrl() + path;\n if (url.endsWith(\"/\")) {\n url = url.slice(0, -1);\n }\n const params: RequestInit = {\n /**\n * This fetch may be cross-origin, in which case we don't want to send cookies of the\n * original origin (this is the default behavior of `credentials`).\n *\n * To help debugging, also omit cookies on same-origin, so we don't accidentally\n * implement reliance on cookies anywhere.\n *\n * However, Cloudflare Workers don't actually support `credentials`, so we only set it\n * if Cloudflare-exclusive globals are not detected. https://github.com/cloudflare/workers-sdk/issues/2514\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n credentials: \"omit\",\n }),\n ...options,\n headers: {\n \"X-Stack-Override-Error-Status\": \"true\",\n \"X-Stack-Project-Id\": this.projectId,\n \"X-Stack-Access-Type\": requestType,\n \"X-Stack-Client-Version\": this.options.clientVersion,\n ...(tokenObj ? {\n \"X-Stack-Access-Token\": tokenObj.accessToken.token,\n } : {}),\n ...(tokenObj?.refreshToken ? {\n \"X-Stack-Refresh-Token\": tokenObj.refreshToken.token,\n } : {}),\n \"X-Stack-Allow-Anonymous-User\": \"true\",\n ...('publishableClientKey' in this.options ? {\n \"X-Stack-Publishable-Client-Key\": this.options.publishableClientKey,\n } : {}),\n ...(adminTokenObj ? {\n \"X-Stack-Admin-Access-Token\": adminTokenObj.accessToken.token,\n } : {}),\n /**\n * Next.js until v15 would cache fetch requests by default, and forcefully disabling it was nearly impossible.\n *\n * This header is used to change the cache key and hence always disable it, because we do our own caching.\n *\n * When we drop support for Next.js <15, we may be able to remove this header, but please make sure that this is\n * the case (I haven't actually tested.)\n */\n \"X-Stack-Random-Nonce\": generateSecureRandomString(),\n // don't show a warning when proxying the API through ngrok (only relevant if the API url is an ngrok site)\n 'ngrok-skip-browser-warning': 'true',\n ...this.options.extraRequestHeaders,\n ...options.headers,\n },\n /**\n * Cloudflare Workers does not support cache, so don't pass it there\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n cache: \"no-store\",\n }),\n };\n\n let rawRes;\n try {\n rawRes = await fetch(url, params);\n } catch (e) {\n if (e instanceof TypeError) {\n // Likely to be a network error. Retry if the request is idempotent, throw network error otherwise.\n if (HTTP_METHODS[(params.method ?? \"GET\") as HttpMethod].idempotent) {\n return Result.error(e);\n } else {\n throw await this._createNetworkError(e, session, requestType);\n }\n }\n throw e;\n }\n\n const processedRes = await this._processResponse(rawRes);\n if (processedRes.status === \"error\") {\n // If the access token is invalid, reset it and retry\n if (KnownErrors.InvalidAccessToken.isInstance(processedRes.error)) {\n if (!tokenObj) {\n throw new StackAssertionError(\"Received invalid access token, but session is not logged in\", { tokenObj, processedRes });\n }\n session.markAccessTokenExpired(tokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Same for the admin access token\n // TODO HACK: Some of the backend hasn't been ported to use the new error codes, so if we have project owner tokens we need to check for ApiKeyNotFound too. Once the migration to smartRouteHandlers is complete, we can check for InvalidAdminAccessToken only.\n if (adminSession && (KnownErrors.InvalidAdminAccessToken.isInstance(processedRes.error) || KnownErrors.ApiKeyNotFound.isInstance(processedRes.error))) {\n if (!adminTokenObj) {\n throw new StackAssertionError(\"Received invalid admin access token, but admin session is not logged in\", { adminTokenObj, processedRes });\n }\n adminSession.markAccessTokenExpired(adminTokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Known errors are client side errors, so except for the ones above they should not be retried\n // Hence, throw instead of returning an error\n throw processedRes.error;\n }\n\n\n const res = Object.assign(processedRes.data, {\n usedTokens: tokenObj,\n });\n if (res.ok) {\n return Result.ok(res);\n } else if (res.status === 429) {\n // Rate limited, so retry if we can\n const retryAfter = res.headers.get(\"Retry-After\");\n if (retryAfter !== null) {\n console.log(`Rate limited while sending request to ${url}. Will retry after ${retryAfter} seconds...`);\n await wait(Number(retryAfter) * 1000);\n return Result.error(new Error(`Rate limited, retrying after ${retryAfter} seconds`));\n }\n console.log(`Rate limited while sending request to ${url}, no retry-after header received. Retrying...`);\n return Result.error(new Error(\"Rate limited, no retry-after header received\"));\n } else {\n const error = await res.text();\n\n const errorObj = new StackAssertionError(`Failed to send request to ${url}: ${res.status} ${error}`, { request: params, res, path });\n\n if (res.status === 508 && error.includes(\"INFINITE_LOOP_DETECTED\")) {\n // Some Vercel deployments seem to have an odd infinite loop bug. In that case, retry.\n // See: https://github.com/stack-auth/stack-auth/issues/319\n return Result.error(errorObj);\n }\n\n // Do not retry, throw error instead of returning one\n throw errorObj;\n }\n }\n\n private async _processResponse(rawRes: Response): Promise<Result<Response, KnownError>> {\n let res = rawRes;\n if (rawRes.headers.has(\"x-stack-actual-status\")) {\n const actualStatus = Number(rawRes.headers.get(\"x-stack-actual-status\"));\n res = new Response(rawRes.body, {\n status: actualStatus,\n statusText: rawRes.statusText,\n headers: rawRes.headers,\n });\n }\n\n // Handle known errors\n if (res.headers.has(\"x-stack-known-error\")) {\n const errorJson = await res.json();\n if (res.headers.get(\"x-stack-known-error\") !== errorJson.code) {\n throw new StackAssertionError(\"Mismatch between x-stack-known-error header and error code in body; the server's response is invalid\");\n }\n const error = KnownError.fromJson(errorJson);\n return Result.error(error);\n }\n\n return Result.ok(res);\n }\n\n public async checkFeatureSupport(options: { featureName?: string } & ReadonlyJson): Promise<never> {\n const res = await this.sendClientRequest(\"/check-feature-support\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(options),\n }, null);\n\n throw new StackAssertionError(await res.text());\n }\n\n async sendForgotPasswordEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/send-reset-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.UserNotFound],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async sendVerificationEmail(\n email: string,\n callbackUrl: string,\n session: InternalSession\n ): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/send-verification-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async sendMagicLinkEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/send-sign-in-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.RedirectUrlNotWhitelisted]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async resetPassword(\n options: { code: string } & ({ password: string } | { onlyVerifyCode: true })\n ): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"onlyVerifyCode\" in options ? \"/auth/password/reset/check-code\" : \"/auth/password/reset\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n ...(\"password\" in options ? { password: options.password } : {}),\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n session,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async setPassword(\n options: { password: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/set\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.resetPassword({ code, onlyVerifyCode: true });\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/verify\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async initiatePasskeyRegistration(\n options: {},\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialCreationOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-registration\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async registerPasskey(\n options: { credential: RegistrationResponseJSON, code: string },\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"PasskeyRegistrationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/register\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasskeyRegistrationFailed]\n );\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n return Result.ok(undefined);\n }\n\n async initiatePasskeyAuthentication(\n options: {\n },\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialRequestOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-authentication\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async sendTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n session: InternalSession,\n }): Promise<void> {\n await this.sendClientRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n options.session,\n );\n }\n\n async acceptTeamInvitation<T extends 'use' | 'details' | 'check'>(options: {\n code: string,\n session: InternalSession,\n type: T,\n }): Promise<Result<T extends 'details' ? { team_display_name: string } : undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n options.type === 'check' ?\n \"/team-invitations/accept/check-code\" :\n options.type === 'details' ?\n \"/team-invitations/accept/details\" :\n \"/team-invitations/accept\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n }),\n },\n options.session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async totpMfa(\n attemptCode: string,\n totp: string,\n session: InternalSession\n ) {\n const res = await this.sendClientRequest(\"/auth/mfa/sign-in\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: attemptCode,\n type: \"totp\",\n totp: totp,\n }),\n }, session);\n\n const result = await res.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n };\n }\n\n async signInWithCredential(\n email: string,\n password: string,\n session: InternalSession\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"EmailPasswordMismatch\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n password,\n }),\n },\n session,\n [KnownErrors.EmailPasswordMismatch]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpWithCredential(\n email: string,\n password: string,\n emailVerificationRedirectUrl: string | undefined,\n session: InternalSession,\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-up\",\n {\n headers: {\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n body: JSON.stringify({\n email,\n password,\n verification_callback_url: emailVerificationRedirectUrl,\n }),\n },\n session,\n [KnownErrors.UserWithEmailAlreadyExists, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpAnonymously(session: InternalSession): Promise<Result<{ accessToken: string, refreshToken: string }, never>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/anonymous/sign-up\",\n {\n method: \"POST\",\n },\n session,\n [],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signInWithMagicLink(code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithMfa(totp: string, code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/mfa/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"totp\",\n totp,\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithPasskey(body: { authentication_response: AuthenticationResponseJSON, code: string }, session: InternalSession): Promise<Result<{accessToken: string, refreshToken: string }, KnownErrors[\"PasskeyAuthenticationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body),\n },\n session,\n [KnownErrors.PasskeyAuthenticationFailed]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async getOAuthUrl(\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n afterCallbackRedirectUrl?: string,\n codeChallenge: string,\n state: string,\n type: \"authenticate\" | \"link\",\n providerScope?: string,\n session: InternalSession,\n }\n ): Promise<string> {\n const updatedRedirectUrl = new URL(options.redirectUrl);\n for (const key of [\"code\", \"state\"]) {\n if (updatedRedirectUrl.searchParams.has(key)) {\n console.warn(\"Redirect URL already contains \" + key + \" parameter, removing it as it will be overwritten by the OAuth callback\");\n }\n updatedRedirectUrl.searchParams.delete(key);\n }\n\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const url = new URL(this.getApiUrl() + \"/auth/oauth/authorize/\" + options.provider.toLowerCase());\n url.searchParams.set(\"client_id\", this.projectId);\n url.searchParams.set(\"client_secret\", this.options.publishableClientKey);\n url.searchParams.set(\"redirect_uri\", updatedRedirectUrl.toString());\n url.searchParams.set(\"scope\", \"legacy\");\n url.searchParams.set(\"state\", options.state);\n url.searchParams.set(\"grant_type\", \"authorization_code\");\n url.searchParams.set(\"code_challenge\", options.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"type\", options.type);\n url.searchParams.set(\"error_redirect_url\", options.errorRedirectUrl);\n\n // TODO: This token will expire after 45s if the token lifetime is 60s, which may be shorter than the OAuth flow.\n // We should probably find a way to request a longer-lived token here.\n const tokens = await options.session.getOrFetchLikelyValidTokens(45_000, 60_000);\n if (tokens) {\n url.searchParams.set(\"token\", tokens.accessToken.token);\n }\n\n if (options.afterCallbackRedirectUrl) {\n url.searchParams.set(\"after_callback_redirect_url\", options.afterCallbackRedirectUrl);\n }\n if (options.providerScope) {\n url.searchParams.set(\"provider_scope\", options.providerScope);\n }\n\n return url.toString();\n }\n\n async callOAuthCallback(options: {\n oauthParams: URLSearchParams,\n redirectUri: string,\n codeVerifier: string,\n state: string,\n }): Promise<{ newUser: boolean, afterCallbackRedirectUrl?: string, accessToken: string, refreshToken: string }> {\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // Allow insecure HTTP requests only in test environment (for localhost testing)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = tokenEndpoint.startsWith('http://');\n\n let params: URLSearchParams;\n try {\n params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);\n } catch (e) {\n if (e instanceof oauth.AuthorizationResponseError) {\n throw new StackAssertionError(\"Authorization response error when validating outer OAuth response\", {\n //cause is a URLSearchParams object for this error, so we need to serialize it better\n cause: Object.fromEntries(e.cause),\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when validating outer OAuth response\", { cause: e });\n }\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n clientAuthentication,\n params,\n options.redirectUri,\n options.codeVerifier,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n let result;\n try {\n result = await oauth.processAuthorizationCodeResponse(as, client, response);\n } catch (e) {\n if (e instanceof oauth.ResponseBodyError) {\n if ((e.cause as any).code === \"MULTI_FACTOR_AUTHENTICATION_REQUIRED\") {\n throw new KnownErrors.MultiFactorAuthenticationRequired((e.cause as any).details.attempt_code);\n }\n // TODO Handle OAuth 2.0 response body error\n throw new StackAssertionError(\"Outer OAuth error during authorization code response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing authorization code response\", { cause: e });\n }\n return {\n newUser: result.is_new_user as boolean,\n afterCallbackRedirectUrl: result.after_callback_redirect_url as string | undefined,\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? throwErr(\"Refresh token not found in outer OAuth response\"),\n };\n }\n\n async signOut(session: InternalSession): Promise<void> {\n const tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n if (tokenObj) {\n const resOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/sessions/current\",\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n session,\n [KnownErrors.RefreshTokenError]\n );\n if (resOrError.status === \"error\") {\n if (KnownErrors.RefreshTokenError.isInstance(resOrError.error)) {\n // refresh token was already invalid, just continue like nothing happened\n } else {\n // this should never happen\n throw new StackAssertionError(\"Unexpected error\", { error: resOrError.error });\n }\n } else {\n // user was signed out successfully, all good\n }\n }\n session.markInvalid();\n }\n\n async getClientUserByToken(session: InternalSession): Promise<CurrentUserCrud[\"Client\"][\"Read\"] | null> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new StackAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud[\"Client\"][\"Read\"] = await response.json();\n if (!(user as any)) throw new StackAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async listTeamInvitations(\n options: {\n teamId: string,\n },\n session: InternalSession,\n ): Promise<TeamInvitationCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-invitations?\" + new URLSearchParams({ team_id: options.teamId }),\n {},\n session,\n );\n const result = await response.json() as TeamInvitationCrud['Client']['List'];\n return result.items;\n }\n\n async revokeTeamInvitation(\n invitationId: string,\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n session,\n );\n }\n\n async listTeamMemberProfiles(\n options: {\n teamId?: string,\n userId?: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-member-profiles?\" + new URLSearchParams(filterUndefined({\n team_id: options.teamId,\n user_id: options.userId,\n })),\n {},\n session,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Client']['List'];\n return result.items;\n }\n\n async getTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async leaveTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-memberships/${teamId}/me`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n }\n\n async updateTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n session,\n );\n }\n\n async updateTeam(\n options: {\n teamId: string,\n data: TeamsCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${options.teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.data),\n },\n session,\n );\n }\n\n async listCurrentUserTeamPermissions(\n options: {\n teamId: string,\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<TeamPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/team-permissions?team_id=${options.teamId}&user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserProjectPermissions(\n options: {\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<ProjectPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/project-permissions?user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserTeams(session: InternalSession): Promise<TeamsCrud[\"Client\"][\"Read\"][]> {\n const response = await this.sendClientRequest(\n \"/teams?user_id=me\",\n {},\n session,\n );\n const result = await response.json() as TeamsCrud[\"Client\"][\"List\"];\n return result.items;\n }\n\n async getClientProject(): Promise<Result<ClientProjectsCrud['Client']['Read'], KnownErrors[\"ProjectNotFound\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\"/projects/current\", {}, null, [KnownErrors.ProjectNotFound]);\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const response = responseOrError.data;\n const project: ClientProjectsCrud['Client']['Read'] = await response.json();\n return Result.ok(project);\n }\n\n async updateClientUser(update: CurrentUserCrud[\"Client\"][\"Update\"], session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n session,\n );\n }\n\n async listProjects(session: InternalSession): Promise<AdminUserProjectsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\"/internal/projects\", {}, session);\n if (!response.ok) {\n throw new Error(\"Failed to list projects: \" + response.status + \" \" + (await response.text()));\n }\n\n const json = await response.json() as AdminUserProjectsCrud['Client']['List'];\n return json.items;\n }\n\n async createProject(\n project: AdminUserProjectsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<AdminUserProjectsCrud['Client']['Read']> {\n const fetchResponse = await this.sendClientRequest(\n \"/internal/projects\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(project),\n },\n session,\n );\n if (!fetchResponse.ok) {\n throw new Error(\"Failed to create project: \" + fetchResponse.status + \" \" + (await fetchResponse.text()));\n }\n\n const json = await fetchResponse.json();\n return json;\n }\n\n async createProviderAccessToken(\n provider: string,\n scope: string,\n session: InternalSession,\n ): Promise<ConnectedAccountAccessTokenCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/connected-accounts/me/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n session,\n );\n return await response.json();\n }\n\n async createClientTeam(\n data: TeamsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<TeamsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${teamId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteCurrentUser(session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async createClientContactChannel(\n data: ContactChannelsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async updateClientContactChannel(\n id: string,\n data: ContactChannelsCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteClientContactChannel(\n id: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteSession(\n sessionId: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/auth/sessions/${sessionId}?user_id=me`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async listSessions(\n session: InternalSession,\n ): Promise<SessionsCrud['Client']['List']> {\n const response = await this.sendClientRequest(\n \"/auth/sessions?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n\n async listClientContactChannels(\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/contact-channels?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n const json = await response.json() as ContactChannelsCrud['Client']['List'];\n return json.items;\n }\n\n async sendCurrentUserContactChannelVerificationEmail(\n contactChannelId: string,\n callbackUrl: string,\n session: InternalSession,\n ): Promise<Result<undefined, KnownErrors[\"EmailAlreadyVerified\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n `/contact-channels/me/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n async cliLogin(\n loginCode: string,\n refreshToken: string,\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"SchemaError\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/cli/complete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n login_code: loginCode,\n refresh_token: refreshToken,\n }),\n },\n session,\n [KnownErrors.SchemaError]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n private async _getApiKeyRequestInfo(options: { user_id: string | null } | { team_id: string }) {\n if (\"user_id\" in options && \"team_id\" in options) {\n throw new StackAssertionError(\"Cannot specify both user_id and team_id in _getApiKeyRequestInfo\");\n }\n\n return {\n endpoint: \"team_id\" in options ? \"/team-api-keys\" : \"/user-api-keys\",\n queryParams: new URLSearchParams(filterUndefinedOrNull(options)),\n };\n }\n\n // API Keys CRUD operations\n listProjectApiKeys(options: { user_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { user_id: string } | { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]>;\n async listProjectApiKeys(\n options: { user_id: string } | { team_id: string },\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n const json = await response.json();\n return json.items;\n }\n\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n async createProjectApiKey(\n data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint } = await this._getApiKeyRequestInfo(data);\n\n const response = await sendRequest(\n `${endpoint}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n getProjectApiKey(options: { user_id: string | null }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { user_id: string | null } | { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async getProjectApiKey(\n options: { user_id: string | null } | { team_id: string },\n keyId: string,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n updateProjectApiKey(options: { user_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { team_id: string }, keyId: string, data: TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { user_id: string } | { team_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async updateProjectApiKey(\n options: { user_id: string } | { team_id: string },\n keyId: string,\n data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'],\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n checkProjectApiKey(type: \"user\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null>;\n async checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequestAndCatchKnownError : (this as any).sendServerRequestAndCatchKnownError as never).bind(this);\n const result = await sendRequest(\n `/${type}-api-keys/check`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ api_key: apiKey }),\n },\n session,\n [KnownErrors.ApiKeyNotValid]\n );\n if (result.status === \"error\") {\n return null;\n }\n return await result.data.json();\n }\n\n async listNotificationCategories(\n session: InternalSession,\n ): Promise<NotificationPreferenceCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/emails/notification-preference/me`,\n {},\n session,\n );\n const result = await response.json() as NotificationPreferenceCrud['Client']['List'];\n return result.items;\n }\n\n async setNotificationsEnabled(\n notificationCategoryId: string,\n enabled: boolean,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/emails/notification-preference/me/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n session,\n );\n }\n\n async getOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n async updateOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async listOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendClientRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n session,\n );\n const result = await response.json();\n return result.items;\n }\n\n async deleteOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<void> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n return await response.json();\n }\n\n async getItem(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n session: InternalSession | null,\n ): Promise<ItemCrud['Client']['Read']> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new StackAssertionError(\"getItem requires one of userId, teamId, or customCustomerId\");\n }\n\n const response = await this.sendClientRequest(\n urlString`/payments/items/${customerType}/${customerId}/${options.itemId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async listProducts(\n options: ListCustomerProductsOptions,\n session: InternalSession | null,\n ): Promise<CustomerProductsListResponse> {\n const queryParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit !== undefined ? options.limit.toString() : undefined,\n }));\n const path = urlString`/payments/products/${options.customer_type}/${options.customer_id}`;\n const response = await this.sendClientRequest(\n `${path}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async cancelSubscription(\n options: {\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n product_id: string,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/${options.product_id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async switchSubscription(\n options: {\n customer_type: \"user\" | \"team\",\n customer_id: string,\n from_product_id: string,\n to_product_id: string,\n price_id?: string,\n quantity?: number,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/switch`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n from_product_id: options.from_product_id,\n to_product_id: options.to_product_id,\n price_id: options.price_id,\n quantity: options.quantity,\n }),\n },\n session,\n );\n }\n\n async createCheckoutUrl(\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n productIdOrInline: string | yup.InferType<typeof inlineProductSchema>,\n session: InternalSession | null,\n returnUrl?: string,\n ): Promise<string> {\n const productBody = typeof productIdOrInline === \"string\" ?\n { product_id: productIdOrInline } :\n { inline_product: productIdOrInline };\n const response = await this.sendClientRequest(\n \"/payments/purchases/create-purchase-url\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ customer_type, customer_id, ...productBody, return_url: returnUrl }),\n },\n session\n );\n const { url } = await response.json() as { url: string };\n return url;\n }\n\n async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n async transferProject(internalProjectSession: InternalSession, projectIdToTransfer: string, newTeamId: string): Promise<void> {\n if (this.options.projectId !== \"internal\") {\n throw new StackAssertionError(\"StackClientInterface.transferProject() is only available for internal projects (please specify the project ID in the constructor)\");\n }\n await this.sendClientRequest(\n \"/internal/projects/transfer\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n project_id: projectIdToTransfer,\n new_team_id: newTeamId,\n }),\n },\n internalProjectSession,\n );\n }\n}\n"],"mappings":"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","names":["response"]}
@@ -150,7 +150,7 @@ var StackClientInterface = class {
150
150
  client_secret: this.options.publishableClientKey
151
151
  };
152
152
  const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);
153
- const allowInsecure = (process.env.NODE_ENV?.includes("dev") || process.env.NODE_ENV === "test") && tokenEndpoint.startsWith("http://");
153
+ const allowInsecure = tokenEndpoint.startsWith("http://");
154
154
  const response = await this._networkRetryException(async () => {
155
155
  const rawResponse = await oauth.refreshTokenGrantRequest(
156
156
  as,
@@ -824,7 +824,7 @@ var StackClientInterface = class {
824
824
  client_secret: this.options.publishableClientKey
825
825
  };
826
826
  const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);
827
- const allowInsecure = (process.env.NODE_ENV?.includes("dev") || process.env.NODE_ENV === "test") && tokenEndpoint.startsWith("http://");
827
+ const allowInsecure = tokenEndpoint.startsWith("http://");
828
828
  let params;
829
829
  try {
830
830
  params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/interface/client-interface.ts"],"sourcesContent":["import * as oauth from 'oauth4webapi';\n\nimport * as yup from 'yup';\nimport { KnownError, KnownErrors } from '../known-errors';\nimport { inlineProductSchema } from '../schema-fields';\nimport { AccessToken, InternalSession, RefreshToken } from '../sessions';\nimport { generateSecureRandomString } from '../utils/crypto';\nimport { StackAssertionError, throwErr } from '../utils/errors';\nimport { globalVar } from '../utils/globals';\nimport { HTTP_METHODS, HttpMethod } from '../utils/http';\nimport { ReadonlyJson } from '../utils/json';\nimport { filterUndefined, filterUndefinedOrNull } from '../utils/objects';\nimport { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '../utils/passkey';\nimport { wait } from '../utils/promises';\nimport { Result } from \"../utils/results\";\nimport { deindent } from '../utils/strings';\nimport { urlString } from '../utils/urls';\nimport { ConnectedAccountAccessTokenCrud } from './crud/connected-accounts';\nimport { ContactChannelsCrud } from './crud/contact-channels';\nimport { CurrentUserCrud } from './crud/current-user';\nimport { ItemCrud } from './crud/items';\nimport { NotificationPreferenceCrud } from './crud/notification-preferences';\nimport { OAuthProviderCrud } from './crud/oauth-providers';\nimport { CustomerProductsListResponse, ListCustomerProductsOptions } from './crud/products';\nimport { TeamApiKeysCrud, UserApiKeysCrud, teamApiKeysCreateInputSchema, teamApiKeysCreateOutputSchema, userApiKeysCreateInputSchema, userApiKeysCreateOutputSchema } from './crud/project-api-keys';\nimport { ProjectPermissionsCrud } from './crud/project-permissions';\nimport { AdminUserProjectsCrud, ClientProjectsCrud } from './crud/projects';\nimport { SessionsCrud } from './crud/sessions';\nimport { TeamInvitationCrud } from './crud/team-invitation';\nimport { TeamMemberProfilesCrud } from './crud/team-member-profiles';\nimport { TeamPermissionsCrud } from './crud/team-permissions';\nimport { TeamsCrud } from './crud/teams';\n\nexport type ClientInterfaceOptions = {\n clientVersion: string,\n // This is a function instead of a string because it might be different based on the environment (for example client vs server)\n getBaseUrl: () => string,\n extraRequestHeaders: Record<string, string>,\n projectId: string,\n prepareRequest?: () => Promise<void>,\n} & ({\n publishableClientKey: string,\n} | {\n projectOwnerSession: InternalSession,\n});\n\nexport class StackClientInterface {\n private pendingNetworkDiagnostics?: ReturnType<StackClientInterface[\"_runNetworkDiagnosticsInner\"]>;\n\n constructor(public readonly options: ClientInterfaceOptions) {\n // nothing here\n }\n\n get projectId() {\n return this.options.projectId;\n }\n\n getApiUrl() {\n return this.options.getBaseUrl() + \"/api/v1\";\n }\n\n public async runNetworkDiagnostics(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n if (this.pendingNetworkDiagnostics) {\n return await this.pendingNetworkDiagnostics;\n }\n\n this.pendingNetworkDiagnostics = this._runNetworkDiagnosticsInner(session, requestType);\n try {\n return await this.pendingNetworkDiagnostics;\n } finally {\n this.pendingNetworkDiagnostics = undefined;\n }\n }\n\n private async _runNetworkDiagnosticsInner(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n const tryRequest = async (cb: () => Promise<void>) => {\n try {\n await cb();\n return \"OK\";\n } catch (e) {\n return `${e}`;\n }\n };\n const cfTrace = await tryRequest(async () => {\n const res = await fetch(\"https://1.1.1.1/cdn-cgi/trace\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const baseUrlBackend = await tryRequest(async () => {\n const res = await fetch(new URL(\"/health\", this.getApiUrl()));\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodDashboard = await tryRequest(async () => {\n const res = await fetch(\"https://app.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodBackend = await tryRequest(async () => {\n const res = await fetch(\"https://api.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n return {\n \"navigator?.onLine\": globalVar.navigator?.onLine,\n cfTrace,\n baseUrlBackend,\n prodDashboard,\n prodBackend,\n };\n }\n\n protected async _createNetworkError(cause: Error, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n return new Error(deindent`\n Stack Auth is unable to connect to the server. Please check your internet connection and try again.\n\n If the problem persists, please contact support and provide a screenshot of your entire browser console.\n\n ${cause}\n\n ${JSON.stringify(await this.runNetworkDiagnostics(session, requestType), null, 2)}\n `, { cause: cause });\n }\n\n protected async _networkRetry<T>(cb: () => Promise<Result<T, any>>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n const retriedResult = await Result.retry(\n cb,\n 5,\n { exponentialDelayBase: 1000 },\n );\n\n // try to diagnose the error for the user\n if (retriedResult.status === \"error\") {\n if (globalVar.navigator && globalVar.navigator.onLine === false) {\n throw new Error(\"You are offline. Please check your internet connection and try again. (window.navigator.onLine is false)\", { cause: retriedResult.error });\n }\n throw await this._createNetworkError(retriedResult.error, session, requestType);\n }\n return retriedResult.data;\n }\n\n protected async _networkRetryException<T>(cb: () => Promise<T>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n return await this._networkRetry(async () => await Result.fromThrowingAsync(cb), session, requestType);\n }\n\n public async fetchNewAccessToken(refreshToken: RefreshToken) {\n if (!('publishableClientKey' in this.options)) {\n // TODO support it\n throw new Error(\"Admin session token is currently not supported for fetching new access token. Did you try to log in on a StackApp initiated with the admin session?\");\n }\n\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = (process.env.NODE_ENV?.includes(\"dev\") || process.env.NODE_ENV === 'test') && tokenEndpoint.startsWith('http://');\n\n const response = await this._networkRetryException(async () => {\n const rawResponse = await oauth.refreshTokenGrantRequest(\n as,\n client,\n clientAuthentication,\n refreshToken.token,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n const response = await this._processResponse(rawResponse);\n\n if (response.status === \"error\") {\n const error = response.error;\n if (KnownErrors.RefreshTokenError.isInstance(error)) {\n return null;\n }\n throw error;\n }\n\n if (!response.data.ok) {\n const body = await response.data.text();\n throw new Error(`Failed to send refresh token request: ${response.status} ${body}`);\n }\n\n return response.data;\n });\n if (!response) return null;\n\n let result: oauth.TokenEndpointResponse;\n try {\n result = await oauth.processRefreshTokenResponse(as, client, response);\n } catch (e){\n if (e instanceof oauth.ResponseBodyError) {\n throw new StackAssertionError(\"ResponseBodyError when processing refresh token response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing refresh token response\", { cause: e });\n }\n\n if (!result.access_token) {\n throw new StackAssertionError(\"Access token not found in token endpoint response, this is weird!\");\n }\n\n return AccessToken.createIfValid(result.access_token) ?? throwErr(\"Access token in fetchNewAccessToken is invalid, looks like the backend is returning an invalid token!\", { result });\n\n }\n\n public async sendClientRequest(\n path: string,\n requestOptions: RequestInit,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\" = \"client\",\n ) {\n session ??= this.createSession({\n refreshToken: null,\n });\n\n\n return await this._networkRetry(\n () => this.sendClientRequestInner(path, requestOptions, session!, requestType),\n session,\n requestType,\n );\n }\n\n public createSession(options: Omit<ConstructorParameters<typeof InternalSession>[0], \"refreshAccessTokenCallback\">): InternalSession {\n const session = new InternalSession({\n refreshAccessTokenCallback: async (refreshToken) => await this.fetchNewAccessToken(refreshToken),\n ...options,\n });\n return session;\n }\n\n protected async sendClientRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendClientRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n private async sendClientRequestInner(\n path: string,\n options: RequestInit,\n session: InternalSession,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<Result<Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n }>> {\n /**\n * `tokenObj === null` means the session is invalid/not logged in\n */\n let tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n\n let adminSession = \"projectOwnerSession\" in this.options ? this.options.projectOwnerSession : null;\n let adminTokenObj = adminSession ? await adminSession.getOrFetchLikelyValidTokens(20_000, null) : null;\n\n // all requests should be dynamic to prevent Next.js caching\n await this.options.prepareRequest?.();\n\n let url = this.getApiUrl() + path;\n if (url.endsWith(\"/\")) {\n url = url.slice(0, -1);\n }\n const params: RequestInit = {\n /**\n * This fetch may be cross-origin, in which case we don't want to send cookies of the\n * original origin (this is the default behavior of `credentials`).\n *\n * To help debugging, also omit cookies on same-origin, so we don't accidentally\n * implement reliance on cookies anywhere.\n *\n * However, Cloudflare Workers don't actually support `credentials`, so we only set it\n * if Cloudflare-exclusive globals are not detected. https://github.com/cloudflare/workers-sdk/issues/2514\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n credentials: \"omit\",\n }),\n ...options,\n headers: {\n \"X-Stack-Override-Error-Status\": \"true\",\n \"X-Stack-Project-Id\": this.projectId,\n \"X-Stack-Access-Type\": requestType,\n \"X-Stack-Client-Version\": this.options.clientVersion,\n ...(tokenObj ? {\n \"X-Stack-Access-Token\": tokenObj.accessToken.token,\n } : {}),\n ...(tokenObj?.refreshToken ? {\n \"X-Stack-Refresh-Token\": tokenObj.refreshToken.token,\n } : {}),\n \"X-Stack-Allow-Anonymous-User\": \"true\",\n ...('publishableClientKey' in this.options ? {\n \"X-Stack-Publishable-Client-Key\": this.options.publishableClientKey,\n } : {}),\n ...(adminTokenObj ? {\n \"X-Stack-Admin-Access-Token\": adminTokenObj.accessToken.token,\n } : {}),\n /**\n * Next.js until v15 would cache fetch requests by default, and forcefully disabling it was nearly impossible.\n *\n * This header is used to change the cache key and hence always disable it, because we do our own caching.\n *\n * When we drop support for Next.js <15, we may be able to remove this header, but please make sure that this is\n * the case (I haven't actually tested.)\n */\n \"X-Stack-Random-Nonce\": generateSecureRandomString(),\n // don't show a warning when proxying the API through ngrok (only relevant if the API url is an ngrok site)\n 'ngrok-skip-browser-warning': 'true',\n ...this.options.extraRequestHeaders,\n ...options.headers,\n },\n /**\n * Cloudflare Workers does not support cache, so don't pass it there\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n cache: \"no-store\",\n }),\n };\n\n let rawRes;\n try {\n rawRes = await fetch(url, params);\n } catch (e) {\n if (e instanceof TypeError) {\n // Likely to be a network error. Retry if the request is idempotent, throw network error otherwise.\n if (HTTP_METHODS[(params.method ?? \"GET\") as HttpMethod].idempotent) {\n return Result.error(e);\n } else {\n throw await this._createNetworkError(e, session, requestType);\n }\n }\n throw e;\n }\n\n const processedRes = await this._processResponse(rawRes);\n if (processedRes.status === \"error\") {\n // If the access token is invalid, reset it and retry\n if (KnownErrors.InvalidAccessToken.isInstance(processedRes.error)) {\n if (!tokenObj) {\n throw new StackAssertionError(\"Received invalid access token, but session is not logged in\", { tokenObj, processedRes });\n }\n session.markAccessTokenExpired(tokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Same for the admin access token\n // TODO HACK: Some of the backend hasn't been ported to use the new error codes, so if we have project owner tokens we need to check for ApiKeyNotFound too. Once the migration to smartRouteHandlers is complete, we can check for InvalidAdminAccessToken only.\n if (adminSession && (KnownErrors.InvalidAdminAccessToken.isInstance(processedRes.error) || KnownErrors.ApiKeyNotFound.isInstance(processedRes.error))) {\n if (!adminTokenObj) {\n throw new StackAssertionError(\"Received invalid admin access token, but admin session is not logged in\", { adminTokenObj, processedRes });\n }\n adminSession.markAccessTokenExpired(adminTokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Known errors are client side errors, so except for the ones above they should not be retried\n // Hence, throw instead of returning an error\n throw processedRes.error;\n }\n\n\n const res = Object.assign(processedRes.data, {\n usedTokens: tokenObj,\n });\n if (res.ok) {\n return Result.ok(res);\n } else if (res.status === 429) {\n // Rate limited, so retry if we can\n const retryAfter = res.headers.get(\"Retry-After\");\n if (retryAfter !== null) {\n console.log(`Rate limited while sending request to ${url}. Will retry after ${retryAfter} seconds...`);\n await wait(Number(retryAfter) * 1000);\n return Result.error(new Error(`Rate limited, retrying after ${retryAfter} seconds`));\n }\n console.log(`Rate limited while sending request to ${url}, no retry-after header received. Retrying...`);\n return Result.error(new Error(\"Rate limited, no retry-after header received\"));\n } else {\n const error = await res.text();\n\n const errorObj = new StackAssertionError(`Failed to send request to ${url}: ${res.status} ${error}`, { request: params, res, path });\n\n if (res.status === 508 && error.includes(\"INFINITE_LOOP_DETECTED\")) {\n // Some Vercel deployments seem to have an odd infinite loop bug. In that case, retry.\n // See: https://github.com/stack-auth/stack-auth/issues/319\n return Result.error(errorObj);\n }\n\n // Do not retry, throw error instead of returning one\n throw errorObj;\n }\n }\n\n private async _processResponse(rawRes: Response): Promise<Result<Response, KnownError>> {\n let res = rawRes;\n if (rawRes.headers.has(\"x-stack-actual-status\")) {\n const actualStatus = Number(rawRes.headers.get(\"x-stack-actual-status\"));\n res = new Response(rawRes.body, {\n status: actualStatus,\n statusText: rawRes.statusText,\n headers: rawRes.headers,\n });\n }\n\n // Handle known errors\n if (res.headers.has(\"x-stack-known-error\")) {\n const errorJson = await res.json();\n if (res.headers.get(\"x-stack-known-error\") !== errorJson.code) {\n throw new StackAssertionError(\"Mismatch between x-stack-known-error header and error code in body; the server's response is invalid\");\n }\n const error = KnownError.fromJson(errorJson);\n return Result.error(error);\n }\n\n return Result.ok(res);\n }\n\n public async checkFeatureSupport(options: { featureName?: string } & ReadonlyJson): Promise<never> {\n const res = await this.sendClientRequest(\"/check-feature-support\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(options),\n }, null);\n\n throw new StackAssertionError(await res.text());\n }\n\n async sendForgotPasswordEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/send-reset-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.UserNotFound],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async sendVerificationEmail(\n email: string,\n callbackUrl: string,\n session: InternalSession\n ): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/send-verification-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async sendMagicLinkEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/send-sign-in-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.RedirectUrlNotWhitelisted]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async resetPassword(\n options: { code: string } & ({ password: string } | { onlyVerifyCode: true })\n ): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"onlyVerifyCode\" in options ? \"/auth/password/reset/check-code\" : \"/auth/password/reset\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n ...(\"password\" in options ? { password: options.password } : {}),\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n session,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async setPassword(\n options: { password: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/set\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.resetPassword({ code, onlyVerifyCode: true });\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/verify\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async initiatePasskeyRegistration(\n options: {},\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialCreationOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-registration\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async registerPasskey(\n options: { credential: RegistrationResponseJSON, code: string },\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"PasskeyRegistrationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/register\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasskeyRegistrationFailed]\n );\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n return Result.ok(undefined);\n }\n\n async initiatePasskeyAuthentication(\n options: {\n },\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialRequestOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-authentication\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async sendTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n session: InternalSession,\n }): Promise<void> {\n await this.sendClientRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n options.session,\n );\n }\n\n async acceptTeamInvitation<T extends 'use' | 'details' | 'check'>(options: {\n code: string,\n session: InternalSession,\n type: T,\n }): Promise<Result<T extends 'details' ? { team_display_name: string } : undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n options.type === 'check' ?\n \"/team-invitations/accept/check-code\" :\n options.type === 'details' ?\n \"/team-invitations/accept/details\" :\n \"/team-invitations/accept\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n }),\n },\n options.session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async totpMfa(\n attemptCode: string,\n totp: string,\n session: InternalSession\n ) {\n const res = await this.sendClientRequest(\"/auth/mfa/sign-in\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: attemptCode,\n type: \"totp\",\n totp: totp,\n }),\n }, session);\n\n const result = await res.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n };\n }\n\n async signInWithCredential(\n email: string,\n password: string,\n session: InternalSession\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"EmailPasswordMismatch\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n password,\n }),\n },\n session,\n [KnownErrors.EmailPasswordMismatch]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpWithCredential(\n email: string,\n password: string,\n emailVerificationRedirectUrl: string | undefined,\n session: InternalSession,\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-up\",\n {\n headers: {\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n body: JSON.stringify({\n email,\n password,\n verification_callback_url: emailVerificationRedirectUrl,\n }),\n },\n session,\n [KnownErrors.UserWithEmailAlreadyExists, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpAnonymously(session: InternalSession): Promise<Result<{ accessToken: string, refreshToken: string }, never>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/anonymous/sign-up\",\n {\n method: \"POST\",\n },\n session,\n [],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signInWithMagicLink(code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithMfa(totp: string, code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/mfa/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"totp\",\n totp,\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithPasskey(body: { authentication_response: AuthenticationResponseJSON, code: string }, session: InternalSession): Promise<Result<{accessToken: string, refreshToken: string }, KnownErrors[\"PasskeyAuthenticationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body),\n },\n session,\n [KnownErrors.PasskeyAuthenticationFailed]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async getOAuthUrl(\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n afterCallbackRedirectUrl?: string,\n codeChallenge: string,\n state: string,\n type: \"authenticate\" | \"link\",\n providerScope?: string,\n session: InternalSession,\n }\n ): Promise<string> {\n const updatedRedirectUrl = new URL(options.redirectUrl);\n for (const key of [\"code\", \"state\"]) {\n if (updatedRedirectUrl.searchParams.has(key)) {\n console.warn(\"Redirect URL already contains \" + key + \" parameter, removing it as it will be overwritten by the OAuth callback\");\n }\n updatedRedirectUrl.searchParams.delete(key);\n }\n\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const url = new URL(this.getApiUrl() + \"/auth/oauth/authorize/\" + options.provider.toLowerCase());\n url.searchParams.set(\"client_id\", this.projectId);\n url.searchParams.set(\"client_secret\", this.options.publishableClientKey);\n url.searchParams.set(\"redirect_uri\", updatedRedirectUrl.toString());\n url.searchParams.set(\"scope\", \"legacy\");\n url.searchParams.set(\"state\", options.state);\n url.searchParams.set(\"grant_type\", \"authorization_code\");\n url.searchParams.set(\"code_challenge\", options.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"type\", options.type);\n url.searchParams.set(\"error_redirect_url\", options.errorRedirectUrl);\n\n // TODO: This token will expire after 45s if the token lifetime is 60s, which may be shorter than the OAuth flow.\n // We should probably find a way to request a longer-lived token here.\n const tokens = await options.session.getOrFetchLikelyValidTokens(45_000, 60_000);\n if (tokens) {\n url.searchParams.set(\"token\", tokens.accessToken.token);\n }\n\n if (options.afterCallbackRedirectUrl) {\n url.searchParams.set(\"after_callback_redirect_url\", options.afterCallbackRedirectUrl);\n }\n if (options.providerScope) {\n url.searchParams.set(\"provider_scope\", options.providerScope);\n }\n\n return url.toString();\n }\n\n async callOAuthCallback(options: {\n oauthParams: URLSearchParams,\n redirectUri: string,\n codeVerifier: string,\n state: string,\n }): Promise<{ newUser: boolean, afterCallbackRedirectUrl?: string, accessToken: string, refreshToken: string }> {\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // Allow insecure HTTP requests only in test environment (for localhost testing)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = (process.env.NODE_ENV?.includes(\"dev\") || process.env.NODE_ENV === 'test') && tokenEndpoint.startsWith('http://');\n\n let params: URLSearchParams;\n try {\n params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);\n } catch (e) {\n if (e instanceof oauth.AuthorizationResponseError) {\n throw new StackAssertionError(\"Authorization response error when validating outer OAuth response\", {\n //cause is a URLSearchParams object for this error, so we need to serialize it better\n cause: Object.fromEntries(e.cause),\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when validating outer OAuth response\", { cause: e });\n }\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n clientAuthentication,\n params,\n options.redirectUri,\n options.codeVerifier,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n let result;\n try {\n result = await oauth.processAuthorizationCodeResponse(as, client, response);\n } catch (e) {\n if (e instanceof oauth.ResponseBodyError) {\n if ((e.cause as any).code === \"MULTI_FACTOR_AUTHENTICATION_REQUIRED\") {\n throw new KnownErrors.MultiFactorAuthenticationRequired((e.cause as any).details.attempt_code);\n }\n // TODO Handle OAuth 2.0 response body error\n throw new StackAssertionError(\"Outer OAuth error during authorization code response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing authorization code response\", { cause: e });\n }\n return {\n newUser: result.is_new_user as boolean,\n afterCallbackRedirectUrl: result.after_callback_redirect_url as string | undefined,\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? throwErr(\"Refresh token not found in outer OAuth response\"),\n };\n }\n\n async signOut(session: InternalSession): Promise<void> {\n const tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n if (tokenObj) {\n const resOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/sessions/current\",\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n session,\n [KnownErrors.RefreshTokenError]\n );\n if (resOrError.status === \"error\") {\n if (KnownErrors.RefreshTokenError.isInstance(resOrError.error)) {\n // refresh token was already invalid, just continue like nothing happened\n } else {\n // this should never happen\n throw new StackAssertionError(\"Unexpected error\", { error: resOrError.error });\n }\n } else {\n // user was signed out successfully, all good\n }\n }\n session.markInvalid();\n }\n\n async getClientUserByToken(session: InternalSession): Promise<CurrentUserCrud[\"Client\"][\"Read\"] | null> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new StackAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud[\"Client\"][\"Read\"] = await response.json();\n if (!(user as any)) throw new StackAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async listTeamInvitations(\n options: {\n teamId: string,\n },\n session: InternalSession,\n ): Promise<TeamInvitationCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-invitations?\" + new URLSearchParams({ team_id: options.teamId }),\n {},\n session,\n );\n const result = await response.json() as TeamInvitationCrud['Client']['List'];\n return result.items;\n }\n\n async revokeTeamInvitation(\n invitationId: string,\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n session,\n );\n }\n\n async listTeamMemberProfiles(\n options: {\n teamId?: string,\n userId?: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-member-profiles?\" + new URLSearchParams(filterUndefined({\n team_id: options.teamId,\n user_id: options.userId,\n })),\n {},\n session,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Client']['List'];\n return result.items;\n }\n\n async getTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async leaveTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-memberships/${teamId}/me`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n }\n\n async updateTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n session,\n );\n }\n\n async updateTeam(\n options: {\n teamId: string,\n data: TeamsCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${options.teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.data),\n },\n session,\n );\n }\n\n async listCurrentUserTeamPermissions(\n options: {\n teamId: string,\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<TeamPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/team-permissions?team_id=${options.teamId}&user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserProjectPermissions(\n options: {\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<ProjectPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/project-permissions?user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserTeams(session: InternalSession): Promise<TeamsCrud[\"Client\"][\"Read\"][]> {\n const response = await this.sendClientRequest(\n \"/teams?user_id=me\",\n {},\n session,\n );\n const result = await response.json() as TeamsCrud[\"Client\"][\"List\"];\n return result.items;\n }\n\n async getClientProject(): Promise<Result<ClientProjectsCrud['Client']['Read'], KnownErrors[\"ProjectNotFound\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\"/projects/current\", {}, null, [KnownErrors.ProjectNotFound]);\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const response = responseOrError.data;\n const project: ClientProjectsCrud['Client']['Read'] = await response.json();\n return Result.ok(project);\n }\n\n async updateClientUser(update: CurrentUserCrud[\"Client\"][\"Update\"], session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n session,\n );\n }\n\n async listProjects(session: InternalSession): Promise<AdminUserProjectsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\"/internal/projects\", {}, session);\n if (!response.ok) {\n throw new Error(\"Failed to list projects: \" + response.status + \" \" + (await response.text()));\n }\n\n const json = await response.json() as AdminUserProjectsCrud['Client']['List'];\n return json.items;\n }\n\n async createProject(\n project: AdminUserProjectsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<AdminUserProjectsCrud['Client']['Read']> {\n const fetchResponse = await this.sendClientRequest(\n \"/internal/projects\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(project),\n },\n session,\n );\n if (!fetchResponse.ok) {\n throw new Error(\"Failed to create project: \" + fetchResponse.status + \" \" + (await fetchResponse.text()));\n }\n\n const json = await fetchResponse.json();\n return json;\n }\n\n async createProviderAccessToken(\n provider: string,\n scope: string,\n session: InternalSession,\n ): Promise<ConnectedAccountAccessTokenCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/connected-accounts/me/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n session,\n );\n return await response.json();\n }\n\n async createClientTeam(\n data: TeamsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<TeamsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${teamId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteCurrentUser(session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async createClientContactChannel(\n data: ContactChannelsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async updateClientContactChannel(\n id: string,\n data: ContactChannelsCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteClientContactChannel(\n id: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteSession(\n sessionId: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/auth/sessions/${sessionId}?user_id=me`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async listSessions(\n session: InternalSession,\n ): Promise<SessionsCrud['Client']['List']> {\n const response = await this.sendClientRequest(\n \"/auth/sessions?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n\n async listClientContactChannels(\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/contact-channels?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n const json = await response.json() as ContactChannelsCrud['Client']['List'];\n return json.items;\n }\n\n async sendCurrentUserContactChannelVerificationEmail(\n contactChannelId: string,\n callbackUrl: string,\n session: InternalSession,\n ): Promise<Result<undefined, KnownErrors[\"EmailAlreadyVerified\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n `/contact-channels/me/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n async cliLogin(\n loginCode: string,\n refreshToken: string,\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"SchemaError\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/cli/complete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n login_code: loginCode,\n refresh_token: refreshToken,\n }),\n },\n session,\n [KnownErrors.SchemaError]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n private async _getApiKeyRequestInfo(options: { user_id: string | null } | { team_id: string }) {\n if (\"user_id\" in options && \"team_id\" in options) {\n throw new StackAssertionError(\"Cannot specify both user_id and team_id in _getApiKeyRequestInfo\");\n }\n\n return {\n endpoint: \"team_id\" in options ? \"/team-api-keys\" : \"/user-api-keys\",\n queryParams: new URLSearchParams(filterUndefinedOrNull(options)),\n };\n }\n\n // API Keys CRUD operations\n listProjectApiKeys(options: { user_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { user_id: string } | { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]>;\n async listProjectApiKeys(\n options: { user_id: string } | { team_id: string },\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n const json = await response.json();\n return json.items;\n }\n\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n async createProjectApiKey(\n data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint } = await this._getApiKeyRequestInfo(data);\n\n const response = await sendRequest(\n `${endpoint}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n getProjectApiKey(options: { user_id: string | null }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { user_id: string | null } | { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async getProjectApiKey(\n options: { user_id: string | null } | { team_id: string },\n keyId: string,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n updateProjectApiKey(options: { user_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { team_id: string }, keyId: string, data: TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { user_id: string } | { team_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async updateProjectApiKey(\n options: { user_id: string } | { team_id: string },\n keyId: string,\n data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'],\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n checkProjectApiKey(type: \"user\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null>;\n async checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequestAndCatchKnownError : (this as any).sendServerRequestAndCatchKnownError as never).bind(this);\n const result = await sendRequest(\n `/${type}-api-keys/check`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ api_key: apiKey }),\n },\n session,\n [KnownErrors.ApiKeyNotValid]\n );\n if (result.status === \"error\") {\n return null;\n }\n return await result.data.json();\n }\n\n async listNotificationCategories(\n session: InternalSession,\n ): Promise<NotificationPreferenceCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/emails/notification-preference/me`,\n {},\n session,\n );\n const result = await response.json() as NotificationPreferenceCrud['Client']['List'];\n return result.items;\n }\n\n async setNotificationsEnabled(\n notificationCategoryId: string,\n enabled: boolean,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/emails/notification-preference/me/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n session,\n );\n }\n\n async getOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n async updateOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async listOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendClientRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n session,\n );\n const result = await response.json();\n return result.items;\n }\n\n async deleteOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<void> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n return await response.json();\n }\n\n async getItem(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n session: InternalSession | null,\n ): Promise<ItemCrud['Client']['Read']> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new StackAssertionError(\"getItem requires one of userId, teamId, or customCustomerId\");\n }\n\n const response = await this.sendClientRequest(\n urlString`/payments/items/${customerType}/${customerId}/${options.itemId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async listProducts(\n options: ListCustomerProductsOptions,\n session: InternalSession | null,\n ): Promise<CustomerProductsListResponse> {\n const queryParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit !== undefined ? options.limit.toString() : undefined,\n }));\n const path = urlString`/payments/products/${options.customer_type}/${options.customer_id}`;\n const response = await this.sendClientRequest(\n `${path}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async cancelSubscription(\n options: {\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n product_id: string,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/${options.product_id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async switchSubscription(\n options: {\n customer_type: \"user\" | \"team\",\n customer_id: string,\n from_product_id: string,\n to_product_id: string,\n price_id?: string,\n quantity?: number,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/switch`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n from_product_id: options.from_product_id,\n to_product_id: options.to_product_id,\n price_id: options.price_id,\n quantity: options.quantity,\n }),\n },\n session,\n );\n }\n\n async createCheckoutUrl(\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n productIdOrInline: string | yup.InferType<typeof inlineProductSchema>,\n session: InternalSession | null,\n returnUrl?: string,\n ): Promise<string> {\n const productBody = typeof productIdOrInline === \"string\" ?\n { product_id: productIdOrInline } :\n { inline_product: productIdOrInline };\n const response = await this.sendClientRequest(\n \"/payments/purchases/create-purchase-url\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ customer_type, customer_id, ...productBody, return_url: returnUrl }),\n },\n session\n );\n const { url } = await response.json() as { url: string };\n return url;\n }\n\n async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n async transferProject(internalProjectSession: InternalSession, projectIdToTransfer: string, newTeamId: string): Promise<void> {\n if (this.options.projectId !== \"internal\") {\n throw new StackAssertionError(\"StackClientInterface.transferProject() is only available for internal projects (please specify the project ID in the constructor)\");\n }\n await this.sendClientRequest(\n \"/internal/projects/transfer\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n project_id: projectIdToTransfer,\n new_team_id: newTeamId,\n }),\n },\n internalProjectSession,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AAGvB,0BAAwC;AAExC,sBAA2D;AAC3D,oBAA2C;AAC3C,oBAA8C;AAC9C,qBAA0B;AAC1B,kBAAyC;AAEzC,qBAAuD;AAEvD,sBAAqB;AACrB,qBAAuB;AACvB,qBAAyB;AACzB,kBAA0B;AA8BnB,IAAM,uBAAN,MAA2B;AAAA,EAGhC,YAA4B,SAAiC;AAAjC;AAAA,EAE5B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,YAAY;AACV,WAAO,KAAK,QAAQ,WAAW,IAAI;AAAA,EACrC;AAAA,EAEA,MAAa,sBAAsB,SAAkC,aAA6C;AAChH,QAAI,KAAK,2BAA2B;AAClC,aAAO,MAAM,KAAK;AAAA,IACpB;AAEA,SAAK,4BAA4B,KAAK,4BAA4B,SAAS,WAAW;AACtF,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK,4BAA4B;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAc,4BAA4B,SAAkC,aAA6C;AACvH,UAAM,aAAa,OAAO,OAA4B;AACpD,UAAI;AACF,cAAM,GAAG;AACT,eAAO;AAAA,MACT,SAAS,GAAG;AACV,eAAO,GAAG,CAAC;AAAA,MACb;AAAA,IACF;AACA,UAAM,UAAU,MAAM,WAAW,YAAY;AAC3C,YAAM,MAAM,MAAM,MAAM,+BAA+B;AACvD,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE;AAAA,MACxE;AAAA,IACF,CAAC;AACD,UAAM,iBAAiB,MAAM,WAAW,YAAY;AAClD,YAAM,MAAM,MAAM,MAAM,IAAI,IAAI,WAAW,KAAK,UAAU,CAAC,CAAC;AAC5D,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE;AAAA,MACxE;AAAA,IACF,CAAC;AACD,UAAM,gBAAgB,MAAM,WAAW,YAAY;AACjD,YAAM,MAAM,MAAM,MAAM,mCAAmC;AAC3D,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE;AAAA,MACxE;AAAA,IACF,CAAC;AACD,UAAM,cAAc,MAAM,WAAW,YAAY;AAC/C,YAAM,MAAM,MAAM,MAAM,mCAAmC;AAC3D,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE;AAAA,MACxE;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,qBAAqB,yBAAU,WAAW;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,OAAc,SAAkC,aAA6C;AAC/H,WAAO,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAKb,KAAK;AAAA;AAAA,QAEL,KAAK,UAAU,MAAM,KAAK,sBAAsB,SAAS,WAAW,GAAG,MAAM,CAAC,CAAC;AAAA,OAChF,EAAE,MAAa,CAAC;AAAA,EACrB;AAAA,EAEA,MAAgB,cAAiB,IAAmC,SAAkC,aAAyD;AAC7J,UAAM,gBAAgB,MAAM,sBAAO;AAAA,MACjC;AAAA,MACA;AAAA,MACA,EAAE,sBAAsB,IAAK;AAAA,IAC/B;AAGA,QAAI,cAAc,WAAW,SAAS;AACpC,UAAI,yBAAU,aAAa,yBAAU,UAAU,WAAW,OAAO;AAC/D,cAAM,IAAI,MAAM,4GAA4G,EAAE,OAAO,cAAc,MAAM,CAAC;AAAA,MAC5J;AACA,YAAM,MAAM,KAAK,oBAAoB,cAAc,OAAO,SAAS,WAAW;AAAA,IAChF;AACA,WAAO,cAAc;AAAA,EACvB;AAAA,EAEA,MAAgB,uBAA0B,IAAsB,SAAkC,aAAyD;AACzJ,WAAO,MAAM,KAAK,cAAc,YAAY,MAAM,sBAAO,kBAAkB,EAAE,GAAG,SAAS,WAAW;AAAA,EACtG;AAAA,EAEA,MAAa,oBAAoB,cAA4B;AAC3D,QAAI,EAAE,0BAA0B,KAAK,UAAU;AAE7C,YAAM,IAAI,MAAM,qJAAqJ;AAAA,IACvK;AAEA,UAAM,gBAAgB,KAAK,UAAU,IAAI;AACzC,UAAM,KAAK;AAAA,MACT,QAAQ,KAAK,QAAQ,WAAW;AAAA,MAChC,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AACA,UAAM,SAAuB;AAAA,MAC3B,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK,QAAQ;AAAA,IAC9B;AAEA,UAAM,uBAA6B,uBAAiB,KAAK,QAAQ,oBAAoB;AAErF,UAAM,iBAAiB,QAAQ,IAAI,UAAU,SAAS,KAAK,KAAK,QAAQ,IAAI,aAAa,WAAW,cAAc,WAAW,SAAS;AAEtI,UAAM,WAAW,MAAM,KAAK,uBAAuB,YAAY;AAC7D,YAAM,cAAc,MAAY;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,gBAAgB,EAAE,CAAO,2BAAqB,GAAG,KAAK,IAAI;AAAA,MAC5D;AAEA,YAAMA,YAAW,MAAM,KAAK,iBAAiB,WAAW;AAExD,UAAIA,UAAS,WAAW,SAAS;AAC/B,cAAM,QAAQA,UAAS;AACvB,YAAI,gCAAY,kBAAkB,WAAW,KAAK,GAAG;AACnD,iBAAO;AAAA,QACT;AACA,cAAM;AAAA,MACR;AAEA,UAAI,CAACA,UAAS,KAAK,IAAI;AACrB,cAAM,OAAO,MAAMA,UAAS,KAAK,KAAK;AACtC,cAAM,IAAI,MAAM,yCAAyCA,UAAS,MAAM,IAAI,IAAI,EAAE;AAAA,MACpF;AAEA,aAAOA,UAAS;AAAA,IAClB,CAAC;AACD,QAAI,CAAC,SAAU,QAAO;AAEtB,QAAI;AACJ,QAAI;AACF,eAAS,MAAY,kCAA4B,IAAI,QAAQ,QAAQ;AAAA,IACvE,SAAS,GAAE;AACT,UAAI,aAAmB,yBAAmB;AACxC,cAAM,IAAI,kCAAoB,4DAA4D;AAAA,UACxF,OAAO,EAAE;AAAA,UACT,MAAM,EAAE;AAAA,UACR,OAAO,EAAE;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,IAAI,kCAAoB,2DAA2D,EAAE,OAAO,EAAE,CAAC;AAAA,IACvG;AAEA,QAAI,CAAC,OAAO,cAAc;AACxB,YAAM,IAAI,kCAAoB,mEAAmE;AAAA,IACnG;AAEA,WAAO,4BAAY,cAAc,OAAO,YAAY,SAAK,wBAAS,yGAAyG,EAAE,OAAO,CAAC;AAAA,EAEvL;AAAA,EAEA,MAAa,kBACX,MACA,gBACA,SACA,cAA6C,UAC7C;AACA,gBAAY,KAAK,cAAc;AAAA,MAC7B,cAAc;AAAA,IAChB,CAAC;AAGD,WAAO,MAAM,KAAK;AAAA,MAChB,MAAM,KAAK,uBAAuB,MAAM,gBAAgB,SAAU,WAAW;AAAA,MAC7E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEO,cAAc,SAAgH;AACnI,UAAM,UAAU,IAAI,gCAAgB;AAAA,MAClC,4BAA4B,OAAO,iBAAiB,MAAM,KAAK,oBAAoB,YAAY;AAAA,MAC/F,GAAG;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,oCACd,MACA,gBACA,kBACA,eASC;AACD,QAAI;AACF,aAAO,sBAAO,GAAG,MAAM,KAAK,kBAAkB,MAAM,gBAAgB,gBAAgB,CAAC;AAAA,IACvF,SAAS,GAAG;AACV,iBAAW,aAAa,eAAe;AACrC,YAAI,UAAU,WAAW,CAAC,GAAG;AAC3B,iBAAO,sBAAO,MAAM,CAAoB;AAAA,QAC1C;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,MACA,SACA,SACA,aAME;AAIF,QAAI,WAAW,MAAM,QAAQ,4BAA4B,KAAQ,IAAI;AAErE,QAAI,eAAe,yBAAyB,KAAK,UAAU,KAAK,QAAQ,sBAAsB;AAC9F,QAAI,gBAAgB,eAAe,MAAM,aAAa,4BAA4B,KAAQ,IAAI,IAAI;AAGlG,UAAM,KAAK,QAAQ,iBAAiB;AAEpC,QAAI,MAAM,KAAK,UAAU,IAAI;AAC7B,QAAI,IAAI,SAAS,GAAG,GAAG;AACrB,YAAM,IAAI,MAAM,GAAG,EAAE;AAAA,IACvB;AACA,UAAM,SAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAW1B,GAAI,mBAAmB,2BAAY,CAAC,IAAI;AAAA,QACtC,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,MACH,SAAS;AAAA,QACP,iCAAiC;AAAA,QACjC,sBAAsB,KAAK;AAAA,QAC3B,uBAAuB;AAAA,QACvB,0BAA0B,KAAK,QAAQ;AAAA,QACvC,GAAI,WAAW;AAAA,UACb,wBAAwB,SAAS,YAAY;AAAA,QAC/C,IAAI,CAAC;AAAA,QACL,GAAI,UAAU,eAAe;AAAA,UAC3B,yBAAyB,SAAS,aAAa;AAAA,QACjD,IAAI,CAAC;AAAA,QACL,gCAAgC;AAAA,QAChC,GAAI,0BAA0B,KAAK,UAAU;AAAA,UAC3C,kCAAkC,KAAK,QAAQ;AAAA,QACjD,IAAI,CAAC;AAAA,QACL,GAAI,gBAAgB;AAAA,UAClB,8BAA8B,cAAc,YAAY;AAAA,QAC1D,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASL,4BAAwB,0CAA2B;AAAA;AAAA,QAEnD,8BAA8B;AAAA,QAC9B,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAIA,GAAI,mBAAmB,2BAAY,CAAC,IAAI;AAAA,QACtC,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,MAAM,KAAK,MAAM;AAAA,IAClC,SAAS,GAAG;AACV,UAAI,aAAa,WAAW;AAE1B,YAAI,yBAAc,OAAO,UAAU,KAAoB,EAAE,YAAY;AACnE,iBAAO,sBAAO,MAAM,CAAC;AAAA,QACvB,OAAO;AACL,gBAAM,MAAM,KAAK,oBAAoB,GAAG,SAAS,WAAW;AAAA,QAC9D;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAEA,UAAM,eAAe,MAAM,KAAK,iBAAiB,MAAM;AACvD,QAAI,aAAa,WAAW,SAAS;AAEnC,UAAI,gCAAY,mBAAmB,WAAW,aAAa,KAAK,GAAG;AACjE,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,kCAAoB,+DAA+D,EAAE,UAAU,aAAa,CAAC;AAAA,QACzH;AACA,gBAAQ,uBAAuB,SAAS,WAAW;AACnD,eAAO,sBAAO,MAAM,aAAa,KAAK;AAAA,MACxC;AAIA,UAAI,iBAAiB,gCAAY,wBAAwB,WAAW,aAAa,KAAK,KAAK,gCAAY,eAAe,WAAW,aAAa,KAAK,IAAI;AACrJ,YAAI,CAAC,eAAe;AAClB,gBAAM,IAAI,kCAAoB,2EAA2E,EAAE,eAAe,aAAa,CAAC;AAAA,QAC1I;AACA,qBAAa,uBAAuB,cAAc,WAAW;AAC7D,eAAO,sBAAO,MAAM,aAAa,KAAK;AAAA,MACxC;AAIA,YAAM,aAAa;AAAA,IACrB;AAGA,UAAM,MAAM,OAAO,OAAO,aAAa,MAAM;AAAA,MAC3C,YAAY;AAAA,IACd,CAAC;AACD,QAAI,IAAI,IAAI;AACV,aAAO,sBAAO,GAAG,GAAG;AAAA,IACtB,WAAW,IAAI,WAAW,KAAK;AAE7B,YAAM,aAAa,IAAI,QAAQ,IAAI,aAAa;AAChD,UAAI,eAAe,MAAM;AACvB,gBAAQ,IAAI,yCAAyC,GAAG,sBAAsB,UAAU,aAAa;AACrG,kBAAM,sBAAK,OAAO,UAAU,IAAI,GAAI;AACpC,eAAO,sBAAO,MAAM,IAAI,MAAM,gCAAgC,UAAU,UAAU,CAAC;AAAA,MACrF;AACA,cAAQ,IAAI,yCAAyC,GAAG,+CAA+C;AACvG,aAAO,sBAAO,MAAM,IAAI,MAAM,8CAA8C,CAAC;AAAA,IAC/E,OAAO;AACL,YAAM,QAAQ,MAAM,IAAI,KAAK;AAE7B,YAAM,WAAW,IAAI,kCAAoB,6BAA6B,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,QAAQ,KAAK,KAAK,CAAC;AAEnI,UAAI,IAAI,WAAW,OAAO,MAAM,SAAS,wBAAwB,GAAG;AAGlE,eAAO,sBAAO,MAAM,QAAQ;AAAA,MAC9B;AAGA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,QAAyD;AACtF,QAAI,MAAM;AACV,QAAI,OAAO,QAAQ,IAAI,uBAAuB,GAAG;AAC/C,YAAM,eAAe,OAAO,OAAO,QAAQ,IAAI,uBAAuB,CAAC;AACvE,YAAM,IAAI,SAAS,OAAO,MAAM;AAAA,QAC9B,QAAQ;AAAA,QACR,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAGA,QAAI,IAAI,QAAQ,IAAI,qBAAqB,GAAG;AAC1C,YAAM,YAAY,MAAM,IAAI,KAAK;AACjC,UAAI,IAAI,QAAQ,IAAI,qBAAqB,MAAM,UAAU,MAAM;AAC7D,cAAM,IAAI,kCAAoB,sGAAsG;AAAA,MACtI;AACA,YAAM,QAAQ,+BAAW,SAAS,SAAS;AAC3C,aAAO,sBAAO,MAAM,KAAK;AAAA,IAC3B;AAEA,WAAO,sBAAO,GAAG,GAAG;AAAA,EACtB;AAAA,EAEA,MAAa,oBAAoB,SAAkE;AACjG,UAAM,MAAM,MAAM,KAAK,kBAAkB,0BAA0B;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,GAAG,IAAI;AAEP,UAAM,IAAI,kCAAoB,MAAM,IAAI,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,wBACJ,OACA,aACyD;AACzD,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,YAAY;AAAA,IAC3B;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAS;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,sBACJ,OACA,aACA,SAC0D;AAC1D,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,oBAAoB;AAAA,IACnC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,OACA,aAC8E;AAC9E,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,yBAAyB;AAAA,IACxC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,SACkE;AAClE,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,oBAAoB,UAAU,oCAAoC;AAAA,MAClE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM,QAAQ;AAAA,UACd,GAAI,cAAc,UAAU,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAS;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,SACA,SAC8G;AAC9G,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,cAAc,QAAQ;AAAA,UACtB,cAAc,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,8BAA8B,gCAAY,0BAA0B;AAAA,IACnF;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,SACA,SACgE;AAChE,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,0BAA0B;AAAA,IACzC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,MAAgF;AAC5G,UAAM,MAAM,MAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,KAAK,CAAC;AACnE,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAS;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,MAAgF;AAChG,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAS;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,4BACJ,SACA,SACwG;AACxG,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,WAAO,sBAAO,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,gBACJ,SACA,SACsE;AACtE,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,yBAAyB;AAAA,IACxC;AACA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AACA,WAAO,sBAAO,GAAG,MAAS;AAAA,EAC5B;AAAA,EAEA,MAAM,8BACJ,SAEA,SACuG;AACvG,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,WAAO,sBAAO,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,mBAAmB,SAKP;AAChB,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,QAAQ;AAAA,UACf,SAAS,QAAQ;AAAA,UACjB,cAAc,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,qBAA4D,SAIyD;AACzH,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,QAAQ,SAAS,UACf,wCACA,QAAQ,SAAS,YACf,qCACA;AAAA,MACJ;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,MACR,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,sBAAO,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,aACA,MACA,SACA;AACA,UAAM,MAAM,MAAM,KAAK,kBAAkB,qBAAqB;AAAA,MAC5D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH,GAAG,OAAO;AAEV,UAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,WAAO;AAAA,MACL,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,OACA,UACA,SACsG;AACtG,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBACJ,OACA,UACA,8BACA,SACuJ;AACvJ,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,2BAA2B;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,4BAA4B,gCAAY,0BAA0B;AAAA,IACjF;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,SAAiG;AACvH,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,MAAc,SAAkJ;AACxL,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,MAAc,MAAc,SAAkJ;AAChM,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,qBAAqB;AAAA,IACpC;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,MAA6E,SAAqI;AACxO,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,2BAA2B;AAAA,IAC1C;AAEA,QAAI,IAAI,WAAW,SAAS;AAC1B,aAAO,sBAAO,MAAM,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,SAAS,MAAM,IAAI,KAAK,KAAK;AACnC,WAAO,sBAAO,GAAG;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YACJ,SAWiB;AACjB,UAAM,qBAAqB,IAAI,IAAI,QAAQ,WAAW;AACtD,eAAW,OAAO,CAAC,QAAQ,OAAO,GAAG;AACnC,UAAI,mBAAmB,aAAa,IAAI,GAAG,GAAG;AAC5C,gBAAQ,KAAK,mCAAmC,MAAM,yEAAyE;AAAA,MACjI;AACA,yBAAmB,aAAa,OAAO,GAAG;AAAA,IAC5C;AAEA,QAAI,EAAE,0BAA0B,KAAK,UAAU;AAE7C,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,UAAM,MAAM,IAAI,IAAI,KAAK,UAAU,IAAI,2BAA2B,QAAQ,SAAS,YAAY,CAAC;AAChG,QAAI,aAAa,IAAI,aAAa,KAAK,SAAS;AAChD,QAAI,aAAa,IAAI,iBAAiB,KAAK,QAAQ,oBAAoB;AACvE,QAAI,aAAa,IAAI,gBAAgB,mBAAmB,SAAS,CAAC;AAClE,QAAI,aAAa,IAAI,SAAS,QAAQ;AACtC,QAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAC3C,QAAI,aAAa,IAAI,cAAc,oBAAoB;AACvD,QAAI,aAAa,IAAI,kBAAkB,QAAQ,aAAa;AAC5D,QAAI,aAAa,IAAI,yBAAyB,MAAM;AACpD,QAAI,aAAa,IAAI,iBAAiB,MAAM;AAC5C,QAAI,aAAa,IAAI,QAAQ,QAAQ,IAAI;AACzC,QAAI,aAAa,IAAI,sBAAsB,QAAQ,gBAAgB;AAInE,UAAM,SAAS,MAAM,QAAQ,QAAQ,4BAA4B,MAAQ,GAAM;AAC/E,QAAI,QAAQ;AACV,UAAI,aAAa,IAAI,SAAS,OAAO,YAAY,KAAK;AAAA,IACxD;AAEA,QAAI,QAAQ,0BAA0B;AACpC,UAAI,aAAa,IAAI,+BAA+B,QAAQ,wBAAwB;AAAA,IACtF;AACA,QAAI,QAAQ,eAAe;AACzB,UAAI,aAAa,IAAI,kBAAkB,QAAQ,aAAa;AAAA,IAC9D;AAEA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEA,MAAM,kBAAkB,SAKwF;AAC9G,QAAI,EAAE,0BAA0B,KAAK,UAAU;AAE7C,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,UAAM,gBAAgB,KAAK,UAAU,IAAI;AACzC,UAAM,KAAK;AAAA,MACT,QAAQ,KAAK,QAAQ,WAAW;AAAA,MAChC,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AACA,UAAM,SAAuB;AAAA,MAC3B,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK,QAAQ;AAAA,IAC9B;AACA,UAAM,uBAA6B,uBAAiB,KAAK,QAAQ,oBAAoB;AAGrF,UAAM,iBAAiB,QAAQ,IAAI,UAAU,SAAS,KAAK,KAAK,QAAQ,IAAI,aAAa,WAAW,cAAc,WAAW,SAAS;AAEtI,QAAI;AACJ,QAAI;AACF,eAAe,2BAAqB,IAAI,QAAQ,QAAQ,aAAa,QAAQ,KAAK;AAAA,IACpF,SAAS,GAAG;AACV,UAAI,aAAmB,kCAA4B;AACjD,cAAM,IAAI,kCAAoB,qEAAqE;AAAA;AAAA,UAEjG,OAAO,OAAO,YAAY,EAAE,KAAK;AAAA,UACjC,MAAM,EAAE;AAAA,UACR,OAAO,EAAE;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,IAAI,kCAAoB,yDAAyD,EAAE,OAAO,EAAE,CAAC;AAAA,IACrG;AACA,UAAM,WAAW,MAAY;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,gBAAgB,EAAE,CAAO,2BAAqB,GAAG,KAAK,IAAI;AAAA,IAC5D;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,MAAY,uCAAiC,IAAI,QAAQ,QAAQ;AAAA,IAC5E,SAAS,GAAG;AACV,UAAI,aAAmB,yBAAmB;AACxC,YAAK,EAAE,MAAc,SAAS,wCAAwC;AACpE,gBAAM,IAAI,gCAAY,kCAAmC,EAAE,MAAc,QAAQ,YAAY;AAAA,QAC/F;AAEA,cAAM,IAAI,kCAAoB,wDAAwD;AAAA,UACpF,OAAO,EAAE;AAAA,UACT,MAAM,EAAE;AAAA,UACR,OAAO,EAAE;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,IAAI,kCAAoB,gEAAgE,EAAE,OAAO,EAAE,CAAC;AAAA,IAC5G;AACA,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,0BAA0B,OAAO;AAAA,MACjC,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO,qBAAiB,wBAAS,iDAAiD;AAAA,IAClG;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAyC;AACrD,UAAM,WAAW,MAAM,QAAQ,4BAA4B,KAAQ,IAAI;AACvE,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,QACzB;AAAA,QACA;AAAA,QACA,CAAC,gCAAY,iBAAiB;AAAA,MAChC;AACA,UAAI,WAAW,WAAW,SAAS;AACjC,YAAI,gCAAY,kBAAkB,WAAW,WAAW,KAAK,GAAG;AAAA,QAEhE,OAAO;AAEL,gBAAM,IAAI,kCAAoB,oBAAoB,EAAE,OAAO,WAAW,MAAM,CAAC;AAAA,QAC/E;AAAA,MACF,OAAO;AAAA,MAEP;AAAA,IACF;AACA,YAAQ,YAAY;AAAA,EACtB;AAAA,EAEA,MAAM,qBAAqB,SAA6E;AACtG,UAAM,kBAAkB,MAAM,KAAK;AAAA,MACjC;AAAA,MACA,CAAC;AAAA,MACD;AAAA,MACA,CAAC,gCAAY,2BAA2B;AAAA,IAC1C;AACA,QAAI,gBAAgB,WAAW,SAAS;AACtC,UAAI,gCAAY,4BAA4B,WAAW,gBAAgB,KAAK,GAAG;AAC7E,eAAO;AAAA,MACT,OAAO;AACL,cAAM,IAAI,kCAAoB,6BAA6B,EAAE,OAAO,gBAAgB,MAAM,CAAC;AAAA,MAC7F;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB;AACjC,UAAM,OAA0C,MAAM,SAAS,KAAK;AACpE,QAAI,CAAE,KAAc,OAAM,IAAI,kCAAoB,uDAAuD;AACzG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBACJ,SAGA,SACiD;AACjD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,uBAAuB,IAAI,gBAAgB,EAAE,SAAS,QAAQ,OAAO,CAAC;AAAA,MACtE,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,qBACJ,cACA,QACA,SACA;AACA,UAAM,KAAK;AAAA,MACT,qBAAqB,YAAY,YAAY,MAAM;AAAA,MACnD,EAAE,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,uBACJ,SAIA,SACqD;AACrD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,2BAA2B,IAAI,oBAAgB,gCAAgB;AAAA,QAC7D,SAAS,QAAQ;AAAA,QACjB,SAAS,QAAQ;AAAA,MACnB,CAAC,CAAC;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,qBACJ,SAIA,SACmD;AACnD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,yBAAyB,QAAQ,MAAM,IAAI,QAAQ,MAAM;AAAA,MACzD,CAAC;AAAA,MACD;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,UACJ,QACA,SACA;AACA,UAAM,KAAK;AAAA,MACT,qBAAqB,MAAM;AAAA,MAC3B;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,wBACJ,SAKA,SACA;AACA,UAAM,KAAK;AAAA,MACT,yBAAyB,QAAQ,MAAM,IAAI,QAAQ,MAAM;AAAA,MACzD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,QAAQ,OAAO;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SAIA,SACA;AACA,UAAM,KAAK;AAAA,MACT,UAAU,QAAQ,MAAM;AAAA,MACxB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,QAAQ,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,+BACJ,SAIA,SACkD;AAClD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,6BAA6B,QAAQ,MAAM,yBAAyB,QAAQ,SAAS;AAAA,MACrF,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,kCACJ,SAGA,SACqD;AACrD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,6CAA6C,QAAQ,SAAS;AAAA,MAC9D,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,qBAAqB,SAAkE;AAC3F,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,mBAA0G;AAC9G,UAAM,kBAAkB,MAAM,KAAK,oCAAoC,qBAAqB,CAAC,GAAG,MAAM,CAAC,gCAAY,eAAe,CAAC;AACnI,QAAI,gBAAgB,WAAW,SAAS;AACtC,aAAO,sBAAO,MAAM,gBAAgB,KAAK;AAAA,IAC3C;AACA,UAAM,WAAW,gBAAgB;AACjC,UAAM,UAAgD,MAAM,SAAS,KAAK;AAC1E,WAAO,sBAAO,GAAG,OAAO;AAAA,EAC1B;AAAA,EAEA,MAAM,iBAAiB,QAA6C,SAA0B;AAC5F,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAA8E;AAC/F,UAAM,WAAW,MAAM,KAAK,kBAAkB,sBAAsB,CAAC,GAAG,OAAO;AAC/E,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,SAAS,MAAO,MAAM,SAAS,KAAK,CAAE;AAAA,IAC/F;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cACJ,SACA,SACkD;AAClD,UAAM,gBAAgB,MAAM,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,cAAc,IAAI;AACrB,YAAM,IAAI,MAAM,+BAA+B,cAAc,SAAS,MAAO,MAAM,cAAc,KAAK,CAAE;AAAA,IAC1G;AAEA,UAAM,OAAO,MAAM,cAAc,KAAK;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BACJ,UACA,OACA,SAC4D;AAC5D,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,0BAA0B,QAAQ;AAAA,MAClC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,iBACJ,MACA,SACsC;AACtC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,WACJ,QACA,SACA;AACA,UAAM,KAAK;AAAA,MACT,UAAU,MAAM;AAAA,MAChB;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,SAA0B;AAChD,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,2BACJ,MACA,SACgD;AAChD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,2BACJ,IACA,MACA,SACgD;AAChD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,wBAAwB,EAAE;AAAA,MAC1B;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,2BACJ,IACA,SACe;AACf,UAAM,KAAK;AAAA,MACT,wBAAwB,EAAE;AAAA,MAC1B;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,WACA,SACe;AACf,UAAM,KAAK;AAAA,MACT,kBAAkB,SAAS;AAAA,MAC3B;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,SACyC;AACzC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAGA,MAAM,0BACJ,SACkD;AAClD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,+CACJ,kBACA,aACA,SACiE;AACjE,UAAM,kBAAkB,MAAM,KAAK;AAAA,MACjC,wBAAwB,gBAAgB;AAAA,MACxC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,cAAc,YAAY,CAAC;AAAA,MACpD;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,oBAAoB;AAAA,IACnC;AAEA,QAAI,gBAAgB,WAAW,SAAS;AACtC,aAAO,sBAAO,MAAM,gBAAgB,KAAK;AAAA,IAC3C;AACA,WAAO,sBAAO,GAAG,MAAS;AAAA,EAC5B;AAAA,EAEA,MAAM,SACJ,WACA,cACA,SACwD;AACxD,UAAM,kBAAkB,MAAM,KAAK;AAAA,MACjC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,WAAW;AAAA,IAC1B;AAEA,QAAI,gBAAgB,WAAW,SAAS;AACtC,aAAO,sBAAO,MAAM,gBAAgB,KAAK;AAAA,IAC3C;AACA,WAAO,sBAAO,GAAG,MAAS;AAAA,EAC5B;AAAA,EAEA,MAAc,sBAAsB,SAA2D;AAC7F,QAAI,aAAa,WAAW,aAAa,SAAS;AAChD,YAAM,IAAI,kCAAoB,kEAAkE;AAAA,IAClG;AAEA,WAAO;AAAA,MACL,UAAU,aAAa,UAAU,mBAAmB;AAAA,MACpD,aAAa,IAAI,oBAAgB,sCAAsB,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAMA,MAAM,mBACJ,SACA,SACA,aACoF;AACpF,UAAM,eAAe,gBAAgB,WAAW,KAAK,oBAAqB,KAAa,mBAA4B,KAAK,IAAI;AAC5H,UAAM,EAAE,UAAU,YAAY,IAAI,MAAM,KAAK,sBAAsB,OAAO;AAE1E,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,MACrC;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAKA,MAAM,oBACJ,MACA,SACA,aACoH;AACpH,UAAM,eAAe,gBAAgB,WAAW,KAAK,oBAAqB,KAAa,mBAA4B,KAAK,IAAI;AAC5H,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,sBAAsB,IAAI;AAE1D,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,QAAQ;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAKA,MAAM,iBACJ,SACA,OACA,SACA,aACgF;AAChF,UAAM,eAAe,gBAAgB,WAAW,KAAK,oBAAqB,KAAa,mBAA4B,KAAK,IAAI;AAC5H,UAAM,EAAE,UAAU,YAAY,IAAI,MAAM,KAAK,sBAAsB,OAAO;AAE1E,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,QAAQ,IAAI,KAAK,IAAI,YAAY,SAAS,CAAC;AAAA,MAC9C;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAKA,MAAM,oBACJ,SACA,OACA,MACA,SACA,aACgF;AAChF,UAAM,eAAe,gBAAgB,WAAW,KAAK,oBAAqB,KAAa,mBAA4B,KAAK,IAAI;AAC5H,UAAM,EAAE,UAAU,YAAY,IAAI,MAAM,KAAK,sBAAsB,OAAO;AAE1E,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,QAAQ,IAAI,KAAK,IAAI,YAAY,SAAS,CAAC;AAAA,MAC9C;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAKA,MAAM,mBAAmB,MAAuB,QAAgB,SAAiC,aAAmI;AAClO,UAAM,eAAe,gBAAgB,WAAW,KAAK,sCAAuC,KAAa,qCAA8C,KAAK,IAAI;AAChK,UAAM,SAAS,MAAM;AAAA,MACnB,IAAI,IAAI;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,CAAC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,CAAC,gCAAY,cAAc;AAAA,IAC7B;AACA,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,MAAM,OAAO,KAAK,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,2BACJ,SACyD;AACzD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,wBACJ,wBACA,SACA,SACe;AACf,UAAM,KAAK;AAAA,MACT,sCAAsC,sBAAsB;AAAA,MAC5D;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,QACA,YACA,SAC8C;AAC9C,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,oBAAoB,MAAM,IAAI,UAAU;AAAA,MACxC;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,oBACJ,QACA,YACA,MACA,SAC8C;AAC9C,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,oBAAoB,MAAM,IAAI,UAAU;AAAA,MACxC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,mBACJ,UAEI,CAAC,GACL,SACgD;AAChD,UAAM,cAAc,IAAI,oBAAgB,gCAAgB,OAAO,CAAC;AAChE,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,mBAAmB,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,CAAC,KAAK,EAAE;AAAA,MAC7E;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,oBACJ,QACA,YACA,SACe;AACf,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,oBAAoB,MAAM,IAAI,UAAU;AAAA,MACxC;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,QACJ,SAKA,SACqC;AACrC,QAAI;AACJ,QAAI;AACJ,QAAI,YAAY,SAAS;AACvB,qBAAe;AACf,mBAAa,QAAQ;AAAA,IACvB,WAAW,YAAY,SAAS;AAC9B,qBAAe;AACf,mBAAa,QAAQ;AAAA,IACvB,WAAW,sBAAsB,SAAS;AACxC,qBAAe;AACf,mBAAa,QAAQ;AAAA,IACvB,OAAO;AACL,YAAM,IAAI,kCAAoB,6DAA6D;AAAA,IAC7F;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,wCAA4B,YAAY,IAAI,UAAU,IAAI,QAAQ,MAAM;AAAA,MACxE,CAAC;AAAA,MACD;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,aACJ,SACA,SACuC;AACvC,UAAM,cAAc,IAAI,oBAAgB,gCAAgB;AAAA,MACtD,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ,UAAU,SAAY,QAAQ,MAAM,SAAS,IAAI;AAAA,IAClE,CAAC,CAAC;AACF,UAAM,OAAO,2CAA+B,QAAQ,aAAa,IAAI,QAAQ,WAAW;AACxF,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,GAAG,IAAI,GAAG,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,CAAC,KAAK,EAAE;AAAA,MACpE,CAAC;AAAA,MACD;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,mBACJ,SAKA,SACe;AACf,UAAM,KAAK;AAAA,MACT,2CAA+B,QAAQ,aAAa,IAAI,QAAQ,WAAW,IAAI,QAAQ,UAAU;AAAA,MACjG;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,SAQA,SACe;AACf,UAAM,KAAK;AAAA,MACT,2CAA+B,QAAQ,aAAa,IAAI,QAAQ,WAAW;AAAA,MAC3E;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,iBAAiB,QAAQ;AAAA,UACzB,eAAe,QAAQ;AAAA,UACvB,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,eACA,aACA,mBACA,SACA,WACiB;AACjB,UAAM,cAAc,OAAO,sBAAsB,WAC/C,EAAE,YAAY,kBAAkB,IAChC,EAAE,gBAAgB,kBAAkB;AACtC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,eAAe,aAAa,GAAG,aAAa,YAAY,UAAU,CAAC;AAAA,MAC5F;AAAA,MACA;AAAA,IACF;AACA,UAAM,EAAE,IAAI,IAAI,MAAM,SAAS,KAAK;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBACJ,cACA,YACA,SAUC;AACD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,0CAA8B,YAAY,IAAI,UAAU;AAAA,MACxD,CAAC;AAAA,MACD;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,uCACJ,cACA,YACA,SAIC;AACD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,iDAAqC,YAAY,IAAI,UAAU;AAAA,MAC/D;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,+CACJ,cACA,YACA,eACA,SASC;AACD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,iDAAqC,YAAY,IAAI,UAAU;AAAA,MAC/D;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,gBAAgB,wBAAyC,qBAA6B,WAAkC;AAC5H,QAAI,KAAK,QAAQ,cAAc,YAAY;AACzC,YAAM,IAAI,kCAAoB,mIAAmI;AAAA,IACnK;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":["response"]}
1
+ {"version":3,"sources":["../../src/interface/client-interface.ts"],"sourcesContent":["import * as oauth from 'oauth4webapi';\n\nimport * as yup from 'yup';\nimport { KnownError, KnownErrors } from '../known-errors';\nimport { inlineProductSchema } from '../schema-fields';\nimport { AccessToken, InternalSession, RefreshToken } from '../sessions';\nimport { generateSecureRandomString } from '../utils/crypto';\nimport { StackAssertionError, throwErr } from '../utils/errors';\nimport { globalVar } from '../utils/globals';\nimport { HTTP_METHODS, HttpMethod } from '../utils/http';\nimport { ReadonlyJson } from '../utils/json';\nimport { filterUndefined, filterUndefinedOrNull } from '../utils/objects';\nimport { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '../utils/passkey';\nimport { wait } from '../utils/promises';\nimport { Result } from \"../utils/results\";\nimport { deindent } from '../utils/strings';\nimport { urlString } from '../utils/urls';\nimport { ConnectedAccountAccessTokenCrud } from './crud/connected-accounts';\nimport { ContactChannelsCrud } from './crud/contact-channels';\nimport { CurrentUserCrud } from './crud/current-user';\nimport { ItemCrud } from './crud/items';\nimport { NotificationPreferenceCrud } from './crud/notification-preferences';\nimport { OAuthProviderCrud } from './crud/oauth-providers';\nimport { CustomerProductsListResponse, ListCustomerProductsOptions } from './crud/products';\nimport { TeamApiKeysCrud, UserApiKeysCrud, teamApiKeysCreateInputSchema, teamApiKeysCreateOutputSchema, userApiKeysCreateInputSchema, userApiKeysCreateOutputSchema } from './crud/project-api-keys';\nimport { ProjectPermissionsCrud } from './crud/project-permissions';\nimport { AdminUserProjectsCrud, ClientProjectsCrud } from './crud/projects';\nimport { SessionsCrud } from './crud/sessions';\nimport { TeamInvitationCrud } from './crud/team-invitation';\nimport { TeamMemberProfilesCrud } from './crud/team-member-profiles';\nimport { TeamPermissionsCrud } from './crud/team-permissions';\nimport { TeamsCrud } from './crud/teams';\n\nexport type ClientInterfaceOptions = {\n clientVersion: string,\n // This is a function instead of a string because it might be different based on the environment (for example client vs server)\n getBaseUrl: () => string,\n extraRequestHeaders: Record<string, string>,\n projectId: string,\n prepareRequest?: () => Promise<void>,\n} & ({\n publishableClientKey: string,\n} | {\n projectOwnerSession: InternalSession,\n});\n\nexport class StackClientInterface {\n private pendingNetworkDiagnostics?: ReturnType<StackClientInterface[\"_runNetworkDiagnosticsInner\"]>;\n\n constructor(public readonly options: ClientInterfaceOptions) {\n // nothing here\n }\n\n get projectId() {\n return this.options.projectId;\n }\n\n getApiUrl() {\n return this.options.getBaseUrl() + \"/api/v1\";\n }\n\n public async runNetworkDiagnostics(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n if (this.pendingNetworkDiagnostics) {\n return await this.pendingNetworkDiagnostics;\n }\n\n this.pendingNetworkDiagnostics = this._runNetworkDiagnosticsInner(session, requestType);\n try {\n return await this.pendingNetworkDiagnostics;\n } finally {\n this.pendingNetworkDiagnostics = undefined;\n }\n }\n\n private async _runNetworkDiagnosticsInner(session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n const tryRequest = async (cb: () => Promise<void>) => {\n try {\n await cb();\n return \"OK\";\n } catch (e) {\n return `${e}`;\n }\n };\n const cfTrace = await tryRequest(async () => {\n const res = await fetch(\"https://1.1.1.1/cdn-cgi/trace\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const baseUrlBackend = await tryRequest(async () => {\n const res = await fetch(new URL(\"/health\", this.getApiUrl()));\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodDashboard = await tryRequest(async () => {\n const res = await fetch(\"https://app.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n const prodBackend = await tryRequest(async () => {\n const res = await fetch(\"https://api.stack-auth.com/health\");\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);\n }\n });\n return {\n \"navigator?.onLine\": globalVar.navigator?.onLine,\n cfTrace,\n baseUrlBackend,\n prodDashboard,\n prodBackend,\n };\n }\n\n protected async _createNetworkError(cause: Error, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\") {\n return new Error(deindent`\n Stack Auth is unable to connect to the server. Please check your internet connection and try again.\n\n If the problem persists, please contact support and provide a screenshot of your entire browser console.\n\n ${cause}\n\n ${JSON.stringify(await this.runNetworkDiagnostics(session, requestType), null, 2)}\n `, { cause: cause });\n }\n\n protected async _networkRetry<T>(cb: () => Promise<Result<T, any>>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n const retriedResult = await Result.retry(\n cb,\n 5,\n { exponentialDelayBase: 1000 },\n );\n\n // try to diagnose the error for the user\n if (retriedResult.status === \"error\") {\n if (globalVar.navigator && globalVar.navigator.onLine === false) {\n throw new Error(\"You are offline. Please check your internet connection and try again. (window.navigator.onLine is false)\", { cause: retriedResult.error });\n }\n throw await this._createNetworkError(retriedResult.error, session, requestType);\n }\n return retriedResult.data;\n }\n\n protected async _networkRetryException<T>(cb: () => Promise<T>, session?: InternalSession | null, requestType?: \"client\" | \"server\" | \"admin\"): Promise<T> {\n return await this._networkRetry(async () => await Result.fromThrowingAsync(cb), session, requestType);\n }\n\n public async fetchNewAccessToken(refreshToken: RefreshToken) {\n if (!('publishableClientKey' in this.options)) {\n // TODO support it\n throw new Error(\"Admin session token is currently not supported for fetching new access token. Did you try to log in on a StackApp initiated with the admin session?\");\n }\n\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = tokenEndpoint.startsWith('http://');\n\n const response = await this._networkRetryException(async () => {\n const rawResponse = await oauth.refreshTokenGrantRequest(\n as,\n client,\n clientAuthentication,\n refreshToken.token,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n const response = await this._processResponse(rawResponse);\n\n if (response.status === \"error\") {\n const error = response.error;\n if (KnownErrors.RefreshTokenError.isInstance(error)) {\n return null;\n }\n throw error;\n }\n\n if (!response.data.ok) {\n const body = await response.data.text();\n throw new Error(`Failed to send refresh token request: ${response.status} ${body}`);\n }\n\n return response.data;\n });\n if (!response) return null;\n\n let result: oauth.TokenEndpointResponse;\n try {\n result = await oauth.processRefreshTokenResponse(as, client, response);\n } catch (e){\n if (e instanceof oauth.ResponseBodyError) {\n throw new StackAssertionError(\"ResponseBodyError when processing refresh token response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing refresh token response\", { cause: e });\n }\n\n if (!result.access_token) {\n throw new StackAssertionError(\"Access token not found in token endpoint response, this is weird!\");\n }\n\n return AccessToken.createIfValid(result.access_token) ?? throwErr(\"Access token in fetchNewAccessToken is invalid, looks like the backend is returning an invalid token!\", { result });\n\n }\n\n public async sendClientRequest(\n path: string,\n requestOptions: RequestInit,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\" = \"client\",\n ) {\n session ??= this.createSession({\n refreshToken: null,\n });\n\n\n return await this._networkRetry(\n () => this.sendClientRequestInner(path, requestOptions, session!, requestType),\n session,\n requestType,\n );\n }\n\n public createSession(options: Omit<ConstructorParameters<typeof InternalSession>[0], \"refreshAccessTokenCallback\">): InternalSession {\n const session = new InternalSession({\n refreshAccessTokenCallback: async (refreshToken) => await this.fetchNewAccessToken(refreshToken),\n ...options,\n });\n return session;\n }\n\n protected async sendClientRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendClientRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n private async sendClientRequestInner(\n path: string,\n options: RequestInit,\n session: InternalSession,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<Result<Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n }>> {\n /**\n * `tokenObj === null` means the session is invalid/not logged in\n */\n let tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n\n let adminSession = \"projectOwnerSession\" in this.options ? this.options.projectOwnerSession : null;\n let adminTokenObj = adminSession ? await adminSession.getOrFetchLikelyValidTokens(20_000, null) : null;\n\n // all requests should be dynamic to prevent Next.js caching\n await this.options.prepareRequest?.();\n\n let url = this.getApiUrl() + path;\n if (url.endsWith(\"/\")) {\n url = url.slice(0, -1);\n }\n const params: RequestInit = {\n /**\n * This fetch may be cross-origin, in which case we don't want to send cookies of the\n * original origin (this is the default behavior of `credentials`).\n *\n * To help debugging, also omit cookies on same-origin, so we don't accidentally\n * implement reliance on cookies anywhere.\n *\n * However, Cloudflare Workers don't actually support `credentials`, so we only set it\n * if Cloudflare-exclusive globals are not detected. https://github.com/cloudflare/workers-sdk/issues/2514\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n credentials: \"omit\",\n }),\n ...options,\n headers: {\n \"X-Stack-Override-Error-Status\": \"true\",\n \"X-Stack-Project-Id\": this.projectId,\n \"X-Stack-Access-Type\": requestType,\n \"X-Stack-Client-Version\": this.options.clientVersion,\n ...(tokenObj ? {\n \"X-Stack-Access-Token\": tokenObj.accessToken.token,\n } : {}),\n ...(tokenObj?.refreshToken ? {\n \"X-Stack-Refresh-Token\": tokenObj.refreshToken.token,\n } : {}),\n \"X-Stack-Allow-Anonymous-User\": \"true\",\n ...('publishableClientKey' in this.options ? {\n \"X-Stack-Publishable-Client-Key\": this.options.publishableClientKey,\n } : {}),\n ...(adminTokenObj ? {\n \"X-Stack-Admin-Access-Token\": adminTokenObj.accessToken.token,\n } : {}),\n /**\n * Next.js until v15 would cache fetch requests by default, and forcefully disabling it was nearly impossible.\n *\n * This header is used to change the cache key and hence always disable it, because we do our own caching.\n *\n * When we drop support for Next.js <15, we may be able to remove this header, but please make sure that this is\n * the case (I haven't actually tested.)\n */\n \"X-Stack-Random-Nonce\": generateSecureRandomString(),\n // don't show a warning when proxying the API through ngrok (only relevant if the API url is an ngrok site)\n 'ngrok-skip-browser-warning': 'true',\n ...this.options.extraRequestHeaders,\n ...options.headers,\n },\n /**\n * Cloudflare Workers does not support cache, so don't pass it there\n */\n ...(\"WebSocketPair\" in globalVar ? {} : {\n cache: \"no-store\",\n }),\n };\n\n let rawRes;\n try {\n rawRes = await fetch(url, params);\n } catch (e) {\n if (e instanceof TypeError) {\n // Likely to be a network error. Retry if the request is idempotent, throw network error otherwise.\n if (HTTP_METHODS[(params.method ?? \"GET\") as HttpMethod].idempotent) {\n return Result.error(e);\n } else {\n throw await this._createNetworkError(e, session, requestType);\n }\n }\n throw e;\n }\n\n const processedRes = await this._processResponse(rawRes);\n if (processedRes.status === \"error\") {\n // If the access token is invalid, reset it and retry\n if (KnownErrors.InvalidAccessToken.isInstance(processedRes.error)) {\n if (!tokenObj) {\n throw new StackAssertionError(\"Received invalid access token, but session is not logged in\", { tokenObj, processedRes });\n }\n session.markAccessTokenExpired(tokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Same for the admin access token\n // TODO HACK: Some of the backend hasn't been ported to use the new error codes, so if we have project owner tokens we need to check for ApiKeyNotFound too. Once the migration to smartRouteHandlers is complete, we can check for InvalidAdminAccessToken only.\n if (adminSession && (KnownErrors.InvalidAdminAccessToken.isInstance(processedRes.error) || KnownErrors.ApiKeyNotFound.isInstance(processedRes.error))) {\n if (!adminTokenObj) {\n throw new StackAssertionError(\"Received invalid admin access token, but admin session is not logged in\", { adminTokenObj, processedRes });\n }\n adminSession.markAccessTokenExpired(adminTokenObj.accessToken);\n return Result.error(processedRes.error);\n }\n\n // Known errors are client side errors, so except for the ones above they should not be retried\n // Hence, throw instead of returning an error\n throw processedRes.error;\n }\n\n\n const res = Object.assign(processedRes.data, {\n usedTokens: tokenObj,\n });\n if (res.ok) {\n return Result.ok(res);\n } else if (res.status === 429) {\n // Rate limited, so retry if we can\n const retryAfter = res.headers.get(\"Retry-After\");\n if (retryAfter !== null) {\n console.log(`Rate limited while sending request to ${url}. Will retry after ${retryAfter} seconds...`);\n await wait(Number(retryAfter) * 1000);\n return Result.error(new Error(`Rate limited, retrying after ${retryAfter} seconds`));\n }\n console.log(`Rate limited while sending request to ${url}, no retry-after header received. Retrying...`);\n return Result.error(new Error(\"Rate limited, no retry-after header received\"));\n } else {\n const error = await res.text();\n\n const errorObj = new StackAssertionError(`Failed to send request to ${url}: ${res.status} ${error}`, { request: params, res, path });\n\n if (res.status === 508 && error.includes(\"INFINITE_LOOP_DETECTED\")) {\n // Some Vercel deployments seem to have an odd infinite loop bug. In that case, retry.\n // See: https://github.com/stack-auth/stack-auth/issues/319\n return Result.error(errorObj);\n }\n\n // Do not retry, throw error instead of returning one\n throw errorObj;\n }\n }\n\n private async _processResponse(rawRes: Response): Promise<Result<Response, KnownError>> {\n let res = rawRes;\n if (rawRes.headers.has(\"x-stack-actual-status\")) {\n const actualStatus = Number(rawRes.headers.get(\"x-stack-actual-status\"));\n res = new Response(rawRes.body, {\n status: actualStatus,\n statusText: rawRes.statusText,\n headers: rawRes.headers,\n });\n }\n\n // Handle known errors\n if (res.headers.has(\"x-stack-known-error\")) {\n const errorJson = await res.json();\n if (res.headers.get(\"x-stack-known-error\") !== errorJson.code) {\n throw new StackAssertionError(\"Mismatch between x-stack-known-error header and error code in body; the server's response is invalid\");\n }\n const error = KnownError.fromJson(errorJson);\n return Result.error(error);\n }\n\n return Result.ok(res);\n }\n\n public async checkFeatureSupport(options: { featureName?: string } & ReadonlyJson): Promise<never> {\n const res = await this.sendClientRequest(\"/check-feature-support\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(options),\n }, null);\n\n throw new StackAssertionError(await res.text());\n }\n\n async sendForgotPasswordEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/send-reset-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.UserNotFound],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async sendVerificationEmail(\n email: string,\n callbackUrl: string,\n session: InternalSession\n ): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/send-verification-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async sendMagicLinkEmail(\n email: string,\n callbackUrl: string,\n ): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/send-sign-in-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n [KnownErrors.RedirectUrlNotWhitelisted]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async resetPassword(\n options: { code: string } & ({ password: string } | { onlyVerifyCode: true })\n ): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"onlyVerifyCode\" in options ? \"/auth/password/reset/check-code\" : \"/auth/password/reset\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n ...(\"password\" in options ? { password: options.password } : {}),\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n session,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async setPassword(\n options: { password: string },\n session: InternalSession\n ): Promise<KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/set\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n async verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.resetPassword({ code, onlyVerifyCode: true });\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/contact-channels/verify\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n null,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(undefined);\n }\n }\n\n async initiatePasskeyRegistration(\n options: {},\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialCreationOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-registration\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async registerPasskey(\n options: { credential: RegistrationResponseJSON, code: string },\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"PasskeyRegistrationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/register\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n [KnownErrors.PasskeyRegistrationFailed]\n );\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n return Result.ok(undefined);\n }\n\n async initiatePasskeyAuthentication(\n options: {\n },\n session: InternalSession\n ): Promise<Result<{ options_json: PublicKeyCredentialRequestOptionsJSON, code: string }, KnownErrors[]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/initiate-passkey-authentication\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(options),\n },\n session,\n []\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n return Result.ok(await res.data.json());\n }\n\n async sendTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n session: InternalSession,\n }): Promise<void> {\n await this.sendClientRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n options.session,\n );\n }\n\n async acceptTeamInvitation<T extends 'use' | 'details' | 'check'>(options: {\n code: string,\n session: InternalSession,\n type: T,\n }): Promise<Result<T extends 'details' ? { team_display_name: string } : undefined, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n options.type === 'check' ?\n \"/team-invitations/accept/check-code\" :\n options.type === 'details' ?\n \"/team-invitations/accept/details\" :\n \"/team-invitations/accept\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: options.code,\n }),\n },\n options.session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n } else {\n return Result.ok(await res.data.json());\n }\n }\n\n async totpMfa(\n attemptCode: string,\n totp: string,\n session: InternalSession\n ) {\n const res = await this.sendClientRequest(\"/auth/mfa/sign-in\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code: attemptCode,\n type: \"totp\",\n totp: totp,\n }),\n }, session);\n\n const result = await res.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n };\n }\n\n async signInWithCredential(\n email: string,\n password: string,\n session: InternalSession\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"EmailPasswordMismatch\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n password,\n }),\n },\n session,\n [KnownErrors.EmailPasswordMismatch]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpWithCredential(\n email: string,\n password: string,\n emailVerificationRedirectUrl: string | undefined,\n session: InternalSession,\n ): Promise<Result<{ accessToken: string, refreshToken: string }, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/password/sign-up\",\n {\n headers: {\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n body: JSON.stringify({\n email,\n password,\n verification_callback_url: emailVerificationRedirectUrl,\n }),\n },\n session,\n [KnownErrors.UserWithEmailAlreadyExists, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signUpAnonymously(session: InternalSession): Promise<Result<{ accessToken: string, refreshToken: string }, never>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/anonymous/sign-up\",\n {\n method: \"POST\",\n },\n session,\n [],\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async signInWithMagicLink(code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/otp/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithMfa(totp: string, code: string, session: InternalSession): Promise<Result<{ newUser: boolean, accessToken: string, refreshToken: string }, KnownErrors[\"VerificationCodeError\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/mfa/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"totp\",\n totp,\n code,\n }),\n },\n session,\n [KnownErrors.VerificationCodeError]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n newUser: result.is_new_user,\n });\n }\n\n async signInWithPasskey(body: { authentication_response: AuthenticationResponseJSON, code: string }, session: InternalSession): Promise<Result<{accessToken: string, refreshToken: string }, KnownErrors[\"PasskeyAuthenticationFailed\"]>> {\n const res = await this.sendClientRequestAndCatchKnownError(\n \"/auth/passkey/sign-in\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body),\n },\n session,\n [KnownErrors.PasskeyAuthenticationFailed]\n );\n\n if (res.status === \"error\") {\n return Result.error(res.error);\n }\n\n const result = await res.data.json();\n return Result.ok({\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n });\n }\n\n async getOAuthUrl(\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n afterCallbackRedirectUrl?: string,\n codeChallenge: string,\n state: string,\n type: \"authenticate\" | \"link\",\n providerScope?: string,\n session: InternalSession,\n }\n ): Promise<string> {\n const updatedRedirectUrl = new URL(options.redirectUrl);\n for (const key of [\"code\", \"state\"]) {\n if (updatedRedirectUrl.searchParams.has(key)) {\n console.warn(\"Redirect URL already contains \" + key + \" parameter, removing it as it will be overwritten by the OAuth callback\");\n }\n updatedRedirectUrl.searchParams.delete(key);\n }\n\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const url = new URL(this.getApiUrl() + \"/auth/oauth/authorize/\" + options.provider.toLowerCase());\n url.searchParams.set(\"client_id\", this.projectId);\n url.searchParams.set(\"client_secret\", this.options.publishableClientKey);\n url.searchParams.set(\"redirect_uri\", updatedRedirectUrl.toString());\n url.searchParams.set(\"scope\", \"legacy\");\n url.searchParams.set(\"state\", options.state);\n url.searchParams.set(\"grant_type\", \"authorization_code\");\n url.searchParams.set(\"code_challenge\", options.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"type\", options.type);\n url.searchParams.set(\"error_redirect_url\", options.errorRedirectUrl);\n\n // TODO: This token will expire after 45s if the token lifetime is 60s, which may be shorter than the OAuth flow.\n // We should probably find a way to request a longer-lived token here.\n const tokens = await options.session.getOrFetchLikelyValidTokens(45_000, 60_000);\n if (tokens) {\n url.searchParams.set(\"token\", tokens.accessToken.token);\n }\n\n if (options.afterCallbackRedirectUrl) {\n url.searchParams.set(\"after_callback_redirect_url\", options.afterCallbackRedirectUrl);\n }\n if (options.providerScope) {\n url.searchParams.set(\"provider_scope\", options.providerScope);\n }\n\n return url.toString();\n }\n\n async callOAuthCallback(options: {\n oauthParams: URLSearchParams,\n redirectUri: string,\n codeVerifier: string,\n state: string,\n }): Promise<{ newUser: boolean, afterCallbackRedirectUrl?: string, accessToken: string, refreshToken: string }> {\n if (!('publishableClientKey' in this.options)) {\n // TODO fix\n throw new Error(\"Admin session token is currently not supported for OAuth\");\n }\n const tokenEndpoint = this.getApiUrl() + '/auth/oauth/token';\n const as = {\n issuer: this.options.getBaseUrl(),\n algorithm: 'oauth2',\n token_endpoint: tokenEndpoint,\n };\n const client: oauth.Client = {\n client_id: this.projectId,\n client_secret: this.options.publishableClientKey,\n };\n const clientAuthentication = oauth.ClientSecretPost(this.options.publishableClientKey);\n // Allow insecure HTTP requests only in test environment (for localhost testing)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const allowInsecure = tokenEndpoint.startsWith('http://');\n\n let params: URLSearchParams;\n try {\n params = oauth.validateAuthResponse(as, client, options.oauthParams, options.state);\n } catch (e) {\n if (e instanceof oauth.AuthorizationResponseError) {\n throw new StackAssertionError(\"Authorization response error when validating outer OAuth response\", {\n //cause is a URLSearchParams object for this error, so we need to serialize it better\n cause: Object.fromEntries(e.cause),\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when validating outer OAuth response\", { cause: e });\n }\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n clientAuthentication,\n params,\n options.redirectUri,\n options.codeVerifier,\n allowInsecure ? { [oauth.allowInsecureRequests]: true } : undefined,\n );\n\n let result;\n try {\n result = await oauth.processAuthorizationCodeResponse(as, client, response);\n } catch (e) {\n if (e instanceof oauth.ResponseBodyError) {\n if ((e.cause as any).code === \"MULTI_FACTOR_AUTHENTICATION_REQUIRED\") {\n throw new KnownErrors.MultiFactorAuthenticationRequired((e.cause as any).details.attempt_code);\n }\n // TODO Handle OAuth 2.0 response body error\n throw new StackAssertionError(\"Outer OAuth error during authorization code response\", {\n cause: e.cause,\n code: e.code,\n error: e.error,\n });\n }\n throw new StackAssertionError(\"Unexpected error when processing authorization code response\", { cause: e });\n }\n return {\n newUser: result.is_new_user as boolean,\n afterCallbackRedirectUrl: result.after_callback_redirect_url as string | undefined,\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? throwErr(\"Refresh token not found in outer OAuth response\"),\n };\n }\n\n async signOut(session: InternalSession): Promise<void> {\n const tokenObj = await session.getOrFetchLikelyValidTokens(20_000, null);\n if (tokenObj) {\n const resOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/sessions/current\",\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n session,\n [KnownErrors.RefreshTokenError]\n );\n if (resOrError.status === \"error\") {\n if (KnownErrors.RefreshTokenError.isInstance(resOrError.error)) {\n // refresh token was already invalid, just continue like nothing happened\n } else {\n // this should never happen\n throw new StackAssertionError(\"Unexpected error\", { error: resOrError.error });\n }\n } else {\n // user was signed out successfully, all good\n }\n }\n session.markInvalid();\n }\n\n async getClientUserByToken(session: InternalSession): Promise<CurrentUserCrud[\"Client\"][\"Read\"] | null> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new StackAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud[\"Client\"][\"Read\"] = await response.json();\n if (!(user as any)) throw new StackAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async listTeamInvitations(\n options: {\n teamId: string,\n },\n session: InternalSession,\n ): Promise<TeamInvitationCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-invitations?\" + new URLSearchParams({ team_id: options.teamId }),\n {},\n session,\n );\n const result = await response.json() as TeamInvitationCrud['Client']['List'];\n return result.items;\n }\n\n async revokeTeamInvitation(\n invitationId: string,\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n session,\n );\n }\n\n async listTeamMemberProfiles(\n options: {\n teamId?: string,\n userId?: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/team-member-profiles?\" + new URLSearchParams(filterUndefined({\n team_id: options.teamId,\n user_id: options.userId,\n })),\n {},\n session,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Client']['List'];\n return result.items;\n }\n\n async getTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n session: InternalSession,\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async leaveTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-memberships/${teamId}/me`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n }\n\n async updateTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n session,\n );\n }\n\n async updateTeam(\n options: {\n teamId: string,\n data: TeamsCrud['Client']['Update'],\n },\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${options.teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.data),\n },\n session,\n );\n }\n\n async listCurrentUserTeamPermissions(\n options: {\n teamId: string,\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<TeamPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/team-permissions?team_id=${options.teamId}&user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserProjectPermissions(\n options: {\n recursive: boolean,\n },\n session: InternalSession\n ): Promise<ProjectPermissionsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/project-permissions?user_id=me&recursive=${options.recursive}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Client']['List'];\n return result.items;\n }\n\n async listCurrentUserTeams(session: InternalSession): Promise<TeamsCrud[\"Client\"][\"Read\"][]> {\n const response = await this.sendClientRequest(\n \"/teams?user_id=me\",\n {},\n session,\n );\n const result = await response.json() as TeamsCrud[\"Client\"][\"List\"];\n return result.items;\n }\n\n async getClientProject(): Promise<Result<ClientProjectsCrud['Client']['Read'], KnownErrors[\"ProjectNotFound\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\"/projects/current\", {}, null, [KnownErrors.ProjectNotFound]);\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const response = responseOrError.data;\n const project: ClientProjectsCrud['Client']['Read'] = await response.json();\n return Result.ok(project);\n }\n\n async updateClientUser(update: CurrentUserCrud[\"Client\"][\"Update\"], session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n session,\n );\n }\n\n async listProjects(session: InternalSession): Promise<AdminUserProjectsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\"/internal/projects\", {}, session);\n if (!response.ok) {\n throw new Error(\"Failed to list projects: \" + response.status + \" \" + (await response.text()));\n }\n\n const json = await response.json() as AdminUserProjectsCrud['Client']['List'];\n return json.items;\n }\n\n async createProject(\n project: AdminUserProjectsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<AdminUserProjectsCrud['Client']['Read']> {\n const fetchResponse = await this.sendClientRequest(\n \"/internal/projects\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(project),\n },\n session,\n );\n if (!fetchResponse.ok) {\n throw new Error(\"Failed to create project: \" + fetchResponse.status + \" \" + (await fetchResponse.text()));\n }\n\n const json = await fetchResponse.json();\n return json;\n }\n\n async createProviderAccessToken(\n provider: string,\n scope: string,\n session: InternalSession,\n ): Promise<ConnectedAccountAccessTokenCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/connected-accounts/me/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n session,\n );\n return await response.json();\n }\n\n async createClientTeam(\n data: TeamsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<TeamsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteTeam(\n teamId: string,\n session: InternalSession,\n ) {\n await this.sendClientRequest(\n `/teams/${teamId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteCurrentUser(session: InternalSession) {\n await this.sendClientRequest(\n \"/users/me\",\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async createClientContactChannel(\n data: ContactChannelsCrud['Client']['Create'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async updateClientContactChannel(\n id: string,\n data: ContactChannelsCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async deleteClientContactChannel(\n id: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/contact-channels/me/${id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async deleteSession(\n sessionId: string,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/auth/sessions/${sessionId}?user_id=me`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async listSessions(\n session: InternalSession,\n ): Promise<SessionsCrud['Client']['List']> {\n const response = await this.sendClientRequest(\n \"/auth/sessions?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n\n async listClientContactChannels(\n session: InternalSession,\n ): Promise<ContactChannelsCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n \"/contact-channels?user_id=me\",\n {\n method: \"GET\",\n },\n session,\n );\n const json = await response.json() as ContactChannelsCrud['Client']['List'];\n return json.items;\n }\n\n async sendCurrentUserContactChannelVerificationEmail(\n contactChannelId: string,\n callbackUrl: string,\n session: InternalSession,\n ): Promise<Result<undefined, KnownErrors[\"EmailAlreadyVerified\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n `/contact-channels/me/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n session,\n [KnownErrors.EmailAlreadyVerified]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n async cliLogin(\n loginCode: string,\n refreshToken: string,\n session: InternalSession\n ): Promise<Result<undefined, KnownErrors[\"SchemaError\"]>> {\n const responseOrError = await this.sendClientRequestAndCatchKnownError(\n \"/auth/cli/complete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n login_code: loginCode,\n refresh_token: refreshToken,\n }),\n },\n session,\n [KnownErrors.SchemaError]\n );\n\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n return Result.ok(undefined);\n }\n\n private async _getApiKeyRequestInfo(options: { user_id: string | null } | { team_id: string }) {\n if (\"user_id\" in options && \"team_id\" in options) {\n throw new StackAssertionError(\"Cannot specify both user_id and team_id in _getApiKeyRequestInfo\");\n }\n\n return {\n endpoint: \"team_id\" in options ? \"/team-api-keys\" : \"/user-api-keys\",\n queryParams: new URLSearchParams(filterUndefinedOrNull(options)),\n };\n }\n\n // API Keys CRUD operations\n listProjectApiKeys(options: { user_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'][]>;\n listProjectApiKeys(options: { user_id: string } | { team_id: string }, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]>;\n async listProjectApiKeys(\n options: { user_id: string } | { team_id: string },\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<(UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'])[]> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n const json = await response.json();\n return json.items;\n }\n\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n createProjectApiKey(data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>>;\n async createProjectApiKey(\n data: yup.InferType<typeof userApiKeysCreateInputSchema> | yup.InferType<typeof teamApiKeysCreateInputSchema>,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<yup.InferType<typeof userApiKeysCreateOutputSchema> | yup.InferType<typeof teamApiKeysCreateOutputSchema>> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint } = await this._getApiKeyRequestInfo(data);\n\n const response = await sendRequest(\n `${endpoint}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n getProjectApiKey(options: { user_id: string | null }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n getProjectApiKey(options: { user_id: string | null } | { team_id: string }, keyId: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async getProjectApiKey(\n options: { user_id: string | null } | { team_id: string },\n keyId: string,\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"GET\",\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n updateProjectApiKey(options: { user_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { team_id: string }, keyId: string, data: TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read']>;\n updateProjectApiKey(options: { user_id: string } | { team_id: string }, keyId: string, data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'], session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']>;\n async updateProjectApiKey(\n options: { user_id: string } | { team_id: string },\n keyId: string,\n data: UserApiKeysCrud['Client']['Update'] | TeamApiKeysCrud['Client']['Update'],\n session: InternalSession | null,\n requestType: \"client\" | \"server\" | \"admin\",\n ): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read']> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequest : (this as any).sendServerRequest as never).bind(this);\n const { endpoint, queryParams } = await this._getApiKeyRequestInfo(options);\n\n const response = await sendRequest(\n `${endpoint}/${keyId}?${queryParams.toString()}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n requestType,\n );\n return await response.json();\n }\n\n checkProjectApiKey(type: \"user\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<TeamApiKeysCrud['Client']['Read'] | null>;\n checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null>;\n async checkProjectApiKey(type: \"user\" | \"team\", apiKey: string, session: InternalSession | null, requestType: \"client\" | \"server\" | \"admin\"): Promise<UserApiKeysCrud['Client']['Read'] | TeamApiKeysCrud['Client']['Read'] | null> {\n const sendRequest = (requestType === \"client\" ? this.sendClientRequestAndCatchKnownError : (this as any).sendServerRequestAndCatchKnownError as never).bind(this);\n const result = await sendRequest(\n `/${type}-api-keys/check`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ api_key: apiKey }),\n },\n session,\n [KnownErrors.ApiKeyNotValid]\n );\n if (result.status === \"error\") {\n return null;\n }\n return await result.data.json();\n }\n\n async listNotificationCategories(\n session: InternalSession,\n ): Promise<NotificationPreferenceCrud['Client']['Read'][]> {\n const response = await this.sendClientRequest(\n `/emails/notification-preference/me`,\n {},\n session,\n );\n const result = await response.json() as NotificationPreferenceCrud['Client']['List'];\n return result.items;\n }\n\n async setNotificationsEnabled(\n notificationCategoryId: string,\n enabled: boolean,\n session: InternalSession,\n ): Promise<void> {\n await this.sendClientRequest(\n `/emails/notification-preference/me/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n session,\n );\n }\n\n async getOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"GET\",\n },\n session,\n );\n return await response.json();\n }\n\n async updateOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Client']['Update'],\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read']> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n session,\n );\n return await response.json();\n }\n\n async listOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n session: InternalSession,\n ): Promise<OAuthProviderCrud['Client']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendClientRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n session,\n );\n const result = await response.json();\n return result.items;\n }\n\n async deleteOAuthProvider(\n userId: string,\n providerId: string,\n session: InternalSession,\n ): Promise<void> {\n const response = await this.sendClientRequest(\n `/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n return await response.json();\n }\n\n async getItem(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n session: InternalSession | null,\n ): Promise<ItemCrud['Client']['Read']> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new StackAssertionError(\"getItem requires one of userId, teamId, or customCustomerId\");\n }\n\n const response = await this.sendClientRequest(\n urlString`/payments/items/${customerType}/${customerId}/${options.itemId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async listProducts(\n options: ListCustomerProductsOptions,\n session: InternalSession | null,\n ): Promise<CustomerProductsListResponse> {\n const queryParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit !== undefined ? options.limit.toString() : undefined,\n }));\n const path = urlString`/payments/products/${options.customer_type}/${options.customer_id}`;\n const response = await this.sendClientRequest(\n `${path}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async cancelSubscription(\n options: {\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n product_id: string,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/${options.product_id}`,\n {\n method: \"DELETE\",\n },\n session,\n );\n }\n\n async switchSubscription(\n options: {\n customer_type: \"user\" | \"team\",\n customer_id: string,\n from_product_id: string,\n to_product_id: string,\n price_id?: string,\n quantity?: number,\n },\n session: InternalSession | null,\n ): Promise<void> {\n await this.sendClientRequest(\n urlString`/payments/products/${options.customer_type}/${options.customer_id}/switch`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n from_product_id: options.from_product_id,\n to_product_id: options.to_product_id,\n price_id: options.price_id,\n quantity: options.quantity,\n }),\n },\n session,\n );\n }\n\n async createCheckoutUrl(\n customer_type: \"user\" | \"team\" | \"custom\",\n customer_id: string,\n productIdOrInline: string | yup.InferType<typeof inlineProductSchema>,\n session: InternalSession | null,\n returnUrl?: string,\n ): Promise<string> {\n const productBody = typeof productIdOrInline === \"string\" ?\n { product_id: productIdOrInline } :\n { inline_product: productIdOrInline };\n const response = await this.sendClientRequest(\n \"/payments/purchases/create-purchase-url\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ customer_type, customer_id, ...productBody, return_url: returnUrl }),\n },\n session\n );\n const { url } = await response.json() as { url: string };\n return url;\n }\n\n async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendClientRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n async transferProject(internalProjectSession: InternalSession, projectIdToTransfer: string, newTeamId: string): Promise<void> {\n if (this.options.projectId !== \"internal\") {\n throw new StackAssertionError(\"StackClientInterface.transferProject() is only available for internal projects (please specify the project ID in the constructor)\");\n }\n await this.sendClientRequest(\n \"/internal/projects/transfer\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n project_id: projectIdToTransfer,\n new_team_id: newTeamId,\n }),\n },\n internalProjectSession,\n );\n }\n}\n"],"mappings":"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","names":["response"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackframe/stack-shared",
3
- "version": "2.8.59",
3
+ "version": "2.8.60",
4
4
  "repository": "https://github.com/stack-auth/stack-auth",
5
5
  "files": [
6
6
  "README.md",