{"version":3,"file":"getToken.mjs","names":["resolve!: (clerk: LoadedClerk) => void","reject!: (error: Error) => void","timeoutId: ReturnType<typeof setTimeout>"],"sources":["../../src/getToken.ts"],"sourcesContent":["import { inBrowser } from './browser';\nimport { ClerkRuntimeError } from './errors/clerkRuntimeError';\nimport type { GetTokenOptions, LoadedClerk } from './types';\n\nconst TIMEOUT_MS = 10000; // 10 second timeout for Clerk to load\n\n/**\n * A promise that includes resolve/reject callbacks for external resolution.\n * Used for coordination between getToken() and clerk-js initialization.\n */\ntype ClerkReadyPromise = Promise<LoadedClerk> & {\n  __resolve?: (clerk: LoadedClerk) => void;\n  __reject?: (error: Error) => void;\n};\n\n/**\n * Local Window type extension for __clerk_internal_ready coordination.\n * Avoids global augmentation to prevent declaration collisions for consumers.\n */\ninterface ClerkWindow extends Window {\n  __clerk_internal_ready?: ClerkReadyPromise;\n}\n\nfunction getWindowClerk(): LoadedClerk | undefined {\n  if (inBrowser() && 'Clerk' in window) {\n    const clerk = (window as unknown as { Clerk?: LoadedClerk }).Clerk;\n    if (clerk && (clerk.status === 'ready' || clerk.status === 'degraded')) {\n      return clerk;\n    }\n    // Legacy fallback for older clerk-js versions without status\n    if (clerk?.loaded && !clerk.status) {\n      return clerk;\n    }\n  }\n  return undefined;\n}\n\nasync function waitForClerk(): Promise<LoadedClerk> {\n  if (!inBrowser()) {\n    throw new ClerkRuntimeError(\n      'getToken can only be used in browser environments. To access auth data server-side, see the Auth object reference doc: https://clerk.com/docs/reference/backend/types/auth-object',\n      {\n        code: 'clerk_runtime_not_browser',\n      },\n    );\n  }\n\n  const clerk = getWindowClerk();\n  if (clerk) {\n    return clerk;\n  }\n\n  const clerkWindow = window as ClerkWindow;\n\n  // Get or create the coordination promise\n  if (!clerkWindow.__clerk_internal_ready) {\n    let resolve!: (clerk: LoadedClerk) => void;\n    let reject!: (error: Error) => void;\n    const promise = new Promise<LoadedClerk>((res, rej) => {\n      resolve = res;\n      reject = rej;\n    }) as ClerkReadyPromise;\n    promise.__resolve = resolve;\n    promise.__reject = reject;\n    clerkWindow.__clerk_internal_ready = promise;\n  }\n\n  const readyPromise = clerkWindow.__clerk_internal_ready;\n\n  let timeoutId: ReturnType<typeof setTimeout>;\n\n  const timeoutPromise = new Promise<never>((_, reject) => {\n    timeoutId = setTimeout(\n      () =>\n        reject(\n          new ClerkRuntimeError('Timeout waiting for Clerk to load.', {\n            code: 'clerk_runtime_load_timeout',\n          }),\n        ),\n      TIMEOUT_MS,\n    );\n  });\n\n  return Promise.race([readyPromise, timeoutPromise]).finally(() => {\n    clearTimeout(timeoutId);\n  });\n}\n\n/**\n * Retrieves the current session token, waiting for Clerk to initialize if necessary.\n *\n * This function is safe to call from anywhere in the browser, such as API interceptors,\n * data fetching layers, or vanilla JavaScript code.\n *\n * **Note:** In frameworks with concurrent rendering (e.g., React 18+), a global token read\n * may not correspond to the currently committed UI during transitions. This is a coherence\n * consideration, not an auth safety issue.\n *\n * @param options - Optional configuration for token retrieval\n * @param options.template - The name of a JWT template to use\n * @param options.organizationId - Organization ID to include in the token\n * @param options.skipCache - Whether to skip the token cache\n * @returns A Promise that resolves to the session token, or `null` if the user is not signed in\n *\n * @throws {ClerkRuntimeError} When called in a non-browser environment (code: `clerk_runtime_not_browser`)\n *\n * @throws {ClerkRuntimeError} When Clerk fails to load within timeout (code: `clerk_runtime_load_timeout`)\n *\n * @throws {ClerkOfflineError} When the browser is offline and unable to fetch a token (code: `clerk_offline`).\n * Use `ClerkOfflineError.is(error)` to check for this error type.\n *\n * @example\n * ```typescript\n * // In an Axios interceptor\n * import { getToken } from '@clerk/nextjs';\n *\n * axios.interceptors.request.use(async (config) => {\n *   const token = await getToken();\n *   if (token) {\n *     config.headers.Authorization = `Bearer ${token}`;\n *   }\n *   return config;\n * });\n * ```\n */\nexport async function getToken(options?: GetTokenOptions): Promise<string | null> {\n  const clerk = await waitForClerk();\n\n  if (!clerk.session) {\n    return null;\n  }\n\n  return clerk.session.getToken(options);\n}\n"],"mappings":";;;;AAIA,MAAM,aAAa;AAmBnB,SAAS,iBAA0C;AACjD,KAAI,WAAW,IAAI,WAAW,QAAQ;EACpC,MAAM,QAAS,OAA8C;AAC7D,MAAI,UAAU,MAAM,WAAW,WAAW,MAAM,WAAW,YACzD,QAAO;AAGT,MAAI,OAAO,UAAU,CAAC,MAAM,OAC1B,QAAO;;;AAMb,eAAe,eAAqC;AAClD,KAAI,CAAC,WAAW,CACd,OAAM,IAAI,kBACR,qLACA,EACE,MAAM,6BACP,CACF;CAGH,MAAM,QAAQ,gBAAgB;AAC9B,KAAI,MACF,QAAO;CAGT,MAAM,cAAc;AAGpB,KAAI,CAAC,YAAY,wBAAwB;EACvC,IAAIA;EACJ,IAAIC;EACJ,MAAM,UAAU,IAAI,SAAsB,KAAK,QAAQ;AACrD,aAAU;AACV,YAAS;IACT;AACF,UAAQ,YAAY;AACpB,UAAQ,WAAW;AACnB,cAAY,yBAAyB;;CAGvC,MAAM,eAAe,YAAY;CAEjC,IAAIC;CAEJ,MAAM,iBAAiB,IAAI,SAAgB,GAAG,WAAW;AACvD,cAAY,iBAER,OACE,IAAI,kBAAkB,sCAAsC,EAC1D,MAAM,8BACP,CAAC,CACH,EACH,WACD;GACD;AAEF,QAAO,QAAQ,KAAK,CAAC,cAAc,eAAe,CAAC,CAAC,cAAc;AAChE,eAAa,UAAU;GACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCJ,eAAsB,SAAS,SAAmD;CAChF,MAAM,QAAQ,MAAM,cAAc;AAElC,KAAI,CAAC,MAAM,QACT,QAAO;AAGT,QAAO,MAAM,QAAQ,SAAS,QAAQ"}