@clerk/expo 3.7.7-snapshot.v20260716135136 → 3.7.7

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.
@@ -56,6 +56,8 @@ class ClerkAuthNativeView(context: Context, appContext: AppContext) : ClerkCompo
56
56
  override fun onHostDetachedFromWindow() {
57
57
  // Clear our per-view ViewModelStore so any AuthView ViewModels are GC'd.
58
58
  viewModelStoreOwner.viewModelStore.clear()
59
+ // Reset so a detached-then-reattached view can emit dismissed again.
60
+ dismissalEventSent = false
59
61
  }
60
62
 
61
63
  @Composable
@@ -18,41 +18,58 @@ import androidx.savedstate.setViewTreeSavedStateRegistryOwner
18
18
  import expo.modules.kotlin.AppContext
19
19
  import expo.modules.kotlin.views.ExpoView
20
20
  import kotlinx.coroutines.CoroutineScope
21
+ import kotlinx.coroutines.Job
21
22
  import kotlinx.coroutines.launch
22
23
 
23
24
  abstract class ClerkComposeNativeViewHost(context: Context, appContext: AppContext) : ExpoView(context, appContext) {
24
25
  protected val activity: ComponentActivity? = findActivity(context)
25
26
 
26
27
  private var recomposer: Recomposer? = null
27
- private var recomposerJob: kotlinx.coroutines.Job? = null
28
+ private var recomposerJob: Job? = null
28
29
 
29
30
  private val composeView = ComposeView(context).also { view ->
30
31
  activity?.let { act ->
31
32
  view.setViewTreeLifecycleOwner(act)
32
33
  view.setViewTreeViewModelStoreOwner(act)
33
34
  view.setViewTreeSavedStateRegistryOwner(act)
34
-
35
- val recomposerContext = AndroidUiDispatcher.Main
36
- val newRecomposer = Recomposer(recomposerContext)
37
- recomposer = newRecomposer
38
- view.setParentCompositionContext(newRecomposer)
39
- val scope = CoroutineScope(recomposerContext + kotlinx.coroutines.SupervisorJob())
40
- recomposerJob = scope.coroutineContext[kotlinx.coroutines.Job]
41
- scope.launch {
42
- newRecomposer.runRecomposeAndApplyChanges()
43
- }
44
35
  }
45
36
  addView(view, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
46
37
  }
47
38
 
39
+ init {
40
+ // Fabric measures before window attach; without a parent composition context, ComposeView.onMeasure throws.
41
+ startRecomposer()
42
+ }
43
+
44
+ override fun onAttachedToWindow() {
45
+ super.onAttachedToWindow()
46
+ setupView()
47
+ }
48
+
48
49
  override fun onDetachedFromWindow() {
49
50
  recomposer?.cancel()
50
51
  recomposerJob?.cancel()
52
+ recomposer = null
53
+ recomposerJob = null
51
54
  onHostDetachedFromWindow()
52
55
  super.onDetachedFromWindow()
53
56
  }
54
57
 
58
+ private fun startRecomposer() {
59
+ if (activity == null || recomposerJob?.isActive == true) return
60
+
61
+ // Navigation can detach and later reattach the same host, so a reattached ComposeView needs a fresh recomposer.
62
+ val recomposerContext = AndroidUiDispatcher.Main
63
+ val newRecomposer = Recomposer(recomposerContext)
64
+ recomposer = newRecomposer
65
+ composeView.setParentCompositionContext(newRecomposer)
66
+ recomposerJob = CoroutineScope(recomposerContext).launch {
67
+ newRecomposer.runRecomposeAndApplyChanges()
68
+ }
69
+ }
70
+
55
71
  fun setupView() {
72
+ startRecomposer()
56
73
  composeView.setContent {
57
74
  val viewModelStoreOwner = localViewModelStoreOwner()
58
75
 
@@ -17,11 +17,6 @@ class ClerkUserButtonNativeView(context: Context, appContext: AppContext) : Cler
17
17
  activity?.let { Clerk.attachActivity(it) }
18
18
  }
19
19
 
20
- override fun onAttachedToWindow() {
21
- super.onAttachedToWindow()
22
- setupView()
23
- }
24
-
25
20
  @Composable
26
21
  override fun Content() {
27
22
  Box(
@@ -11,7 +11,7 @@ let src_provider_nativeClientSync = require("./nativeClientSync");
11
11
  //#region src/provider/ClerkProvider.tsx
12
12
  const SDK_METADATA = {
13
13
  name: "@clerk/expo",
14
- version: "3.7.7-snapshot.v20260716135136"
14
+ version: "3.7.7"
15
15
  };
16
16
  function ClerkProvider(props) {
17
17
  const { children, tokenCache, publishableKey, proxyUrl, domain, __experimental_passkeys, experimental, __experimental_resourceCache, ...rest } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"createClerkInstance.d.ts","sourceRoot":"","sources":["../../../src/provider/singleton/createClerkInstance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAwBvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAoEjD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,KAAK,IAClD,UAAU,iBAAiB,KAAG,oBAAoB,GAAG,YAAY,CAoK1E"}
1
+ {"version":3,"file":"createClerkInstance.d.ts","sourceRoot":"","sources":["../../../src/provider/singleton/createClerkInstance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAwBvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAwEjD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,KAAK,IAClD,UAAU,iBAAiB,KAAG,oBAAoB,GAAG,YAAY,CAuN1E"}
@@ -12,11 +12,14 @@ let src_constants = require("../../constants");
12
12
  let src_errorThrower = require("../../errorThrower");
13
13
 
14
14
  //#region src/provider/singleton/createClerkInstance.ts
15
+ const RESOURCE_RETRY_MAX_DELAY_MS = 3e4;
16
+ const RESOURCE_RETRY_MAX_EXPONENT = 4;
15
17
  function hasOwnOption(options, key) {
16
18
  return !!options && Object.prototype.hasOwnProperty.call(options, key);
17
19
  }
18
20
  let __internal_clerk;
19
21
  let __internal_clerkOptions;
22
+ let __internal_cancelResourceRetries;
20
23
  let __internal_tokenCache = src_cache_MemoryTokenCache.MemoryTokenCache;
21
24
  /**
22
25
  * Resolves the next native singleton config while preserving existing values for omitted options.
@@ -46,6 +49,8 @@ function createClerkInstance(ClerkClass) {
46
49
  if (hasOwnOption(options, "tokenCache")) __internal_tokenCache = options.tokenCache ?? src_cache_MemoryTokenCache.MemoryTokenCache;
47
50
  if (!__internal_clerk || hasConfigChanged) {
48
51
  (0, src_utils_errors.assertValidProxyUrl)(proxyUrl);
52
+ __internal_cancelResourceRetries?.();
53
+ __internal_cancelResourceRetries = void 0;
49
54
  if (hasConfigChanged) __internal_tokenCache.clearToken?.(src_constants.CLERK_CLIENT_JWT_KEY);
50
55
  const getToken = (key) => __internal_tokenCache.getToken(key);
51
56
  const saveToken = (key, token) => __internal_tokenCache.saveToken(key, token);
@@ -54,10 +59,11 @@ function createClerkInstance(ClerkClass) {
54
59
  proxyUrl,
55
60
  domain
56
61
  };
57
- __internal_clerk = new ClerkClass(publishableKey, {
62
+ const clerk = new ClerkClass(publishableKey, {
58
63
  proxyUrl,
59
64
  domain
60
65
  });
66
+ __internal_clerk = clerk;
61
67
  if (react_native.Platform.OS === "ios" || react_native.Platform.OS === "android") {
62
68
  __internal_clerk.__internal_createPublicCredentials = (publicKeyCredential) => {
63
69
  return options?.__experimental_passkeys?.create ? options?.__experimental_passkeys?.create(publicKeyCredential) : src_errorThrower.errorThrower.throw("create() for passkeys is missing");
@@ -76,15 +82,43 @@ function createClerkInstance(ClerkClass) {
76
82
  };
77
83
  const isClerkNetworkError = (err) => (0, _clerk_shared_error.isClerkRuntimeError)(err) && err.code === "network_error";
78
84
  if (createResourceCache) {
79
- const retryInitilizeResourcesFromFAPI = async () => {
85
+ let resourceRetryTimer;
86
+ let resourceRetryCancelled = false;
87
+ let resourceRetryInFlight = false;
88
+ let resourceRetryFailureCount = 0;
89
+ let initialResourcesLoaded = false;
90
+ __internal_cancelResourceRetries = () => {
91
+ resourceRetryCancelled = true;
92
+ if (resourceRetryTimer !== void 0) {
93
+ clearTimeout(resourceRetryTimer);
94
+ resourceRetryTimer = void 0;
95
+ }
96
+ };
97
+ const scheduleResourceRetry = (timeout) => {
98
+ if (resourceRetryCancelled || initialResourcesLoaded || resourceRetryTimer !== void 0 || resourceRetryInFlight) return;
99
+ resourceRetryTimer = setTimeout(() => {
100
+ resourceRetryTimer = void 0;
101
+ if (resourceRetryCancelled || initialResourcesLoaded) return;
102
+ retryInitializeResourcesFromFAPI();
103
+ }, timeout);
104
+ };
105
+ const retryInitializeResourcesFromFAPI = async () => {
106
+ if (resourceRetryCancelled || initialResourcesLoaded || resourceRetryInFlight) return;
107
+ resourceRetryInFlight = true;
108
+ let nextRetryTimeout;
80
109
  try {
81
- await __internal_clerk?.__internal_reloadInitialResources();
110
+ await clerk.__internal_reloadInitialResources();
111
+ initialResourcesLoaded = true;
82
112
  } catch (err) {
83
113
  if (isClerkNetworkError(err) || !(0, _clerk_shared_error.is4xxError)(err)) {
84
- const timeout = isClerkNetworkError(err) ? 2e3 : 1e4;
85
- setTimeout(() => void retryInitilizeResourcesFromFAPI(), timeout);
114
+ const initialRetryTimeout = isClerkNetworkError(err) ? 2e3 : 1e4;
115
+ nextRetryTimeout = Math.min(initialRetryTimeout * 2 ** resourceRetryFailureCount, RESOURCE_RETRY_MAX_DELAY_MS);
116
+ resourceRetryFailureCount = Math.min(resourceRetryFailureCount + 1, RESOURCE_RETRY_MAX_EXPONENT);
86
117
  }
118
+ } finally {
119
+ resourceRetryInFlight = false;
87
120
  }
121
+ if (nextRetryTimeout !== void 0) scheduleResourceRetry(nextRetryTimeout);
88
122
  };
89
123
  src_cache.EnvironmentResourceCache.init({
90
124
  publishableKey,
@@ -115,7 +149,7 @@ function createClerkInstance(ClerkClass) {
115
149
  if (!environment || !client) {
116
150
  environment = src_cache.DUMMY_CLERK_ENVIRONMENT_RESOURCE;
117
151
  client = src_cache.DUMMY_CLERK_CLIENT_RESOURCE;
118
- setTimeout(() => void retryInitilizeResourcesFromFAPI(), 3e3);
152
+ scheduleResourceRetry(3e3);
119
153
  }
120
154
  return {
121
155
  client,
@@ -1 +1 @@
1
- {"version":3,"file":"createClerkInstance.js","names":["MemoryTokenCache","CLERK_CLIENT_JWT_KEY","Platform","errorThrower","EnvironmentResourceCache","ClientResourceCache","SessionJWTCache","DUMMY_CLERK_ENVIRONMENT_RESOURCE","DUMMY_CLERK_CLIENT_RESOURCE","packageJson"],"sources":["../../../src/provider/singleton/createClerkInstance.ts"],"sourcesContent":["import { type Clerk } from '@clerk/clerk-js';\nimport type { BrowserClerk, HeadlessBrowserClerk } from '@clerk/react';\nimport { is4xxError, isClerkRuntimeError } from '@clerk/shared/error';\nimport type {\n ClientJSONSnapshot,\n EnvironmentJSONSnapshot,\n PublicKeyCredentialCreationOptionsWithoutExtensions,\n PublicKeyCredentialRequestOptionsWithoutExtensions,\n} from '@clerk/shared/types';\nimport { Platform } from 'react-native';\n\nimport packageJson from '../../../package.json';\nimport {\n ClientResourceCache,\n DUMMY_CLERK_CLIENT_RESOURCE,\n DUMMY_CLERK_ENVIRONMENT_RESOURCE,\n EnvironmentResourceCache,\n SessionJWTCache,\n} from '../../cache';\nimport { MemoryTokenCache } from '../../cache/MemoryTokenCache';\nimport type { TokenCache } from '../../cache/types';\nimport { CLERK_CLIENT_JWT_KEY } from '../../constants';\nimport { errorThrower } from '../../errorThrower';\nimport { assertValidProxyUrl } from '../../utils/errors';\nimport { isNative } from '../../utils/runtime';\nimport type { BuildClerkOptions } from './types';\n\n/**\n * Internal types for FAPI client callbacks.\n * These are simplified versions of the internal clerk-js types,\n * used only for the __internal_onBeforeRequest and __internal_onAfterResponse hooks.\n */\ntype FapiRequestInit = RequestInit & {\n url?: URL;\n headers?: Headers;\n};\n\ntype FapiResponse = Response & {\n payload: { errors?: Array<{ code: string }> } | null;\n};\n\ntype ClerkRuntimeOptions = Pick<BuildClerkOptions, 'publishableKey' | 'proxyUrl' | 'domain'>;\ntype ResolvedClerkRuntimeOptions = Omit<ClerkRuntimeOptions, 'publishableKey'> & {\n publishableKey: string;\n};\n\nfunction hasOwnOption<Key extends keyof BuildClerkOptions>(\n options: BuildClerkOptions | undefined,\n key: Key,\n): options is BuildClerkOptions & Required<Pick<BuildClerkOptions, Key>> {\n return !!options && Object.prototype.hasOwnProperty.call(options, key);\n}\n\nlet __internal_clerk: HeadlessBrowserClerk | BrowserClerk | undefined;\nlet __internal_clerkOptions: ClerkRuntimeOptions | undefined;\n// Token IO can change without recreating the native singleton.\nlet __internal_tokenCache: TokenCache = MemoryTokenCache;\n\n/**\n * Resolves the next native singleton config while preserving existing values for omitted options.\n * A publishable key change starts from a clean proxy/domain config unless those values are\n * explicitly provided alongside the new key.\n */\nfunction getUpdatedClerkOptions(\n currentOptions: ClerkRuntimeOptions | undefined,\n nextOptions: ClerkRuntimeOptions | undefined,\n): {\n hasConfigChanged: boolean;\n options: ResolvedClerkRuntimeOptions;\n} {\n const hasNextProxyUrl = hasOwnOption(nextOptions, 'proxyUrl');\n const hasNextDomain = hasOwnOption(nextOptions, 'domain');\n const hasKeyChanged =\n !!currentOptions &&\n typeof nextOptions?.publishableKey !== 'undefined' &&\n nextOptions.publishableKey !== currentOptions.publishableKey;\n const hasProxyChanged = !!currentOptions && hasNextProxyUrl && nextOptions.proxyUrl !== currentOptions.proxyUrl;\n const hasDomainChanged = !!currentOptions && hasNextDomain && nextOptions.domain !== currentOptions.domain;\n\n return {\n hasConfigChanged: hasKeyChanged || hasProxyChanged || hasDomainChanged,\n options: {\n publishableKey: nextOptions?.publishableKey ?? currentOptions?.publishableKey ?? '',\n proxyUrl: hasKeyChanged\n ? nextOptions?.proxyUrl\n : hasNextProxyUrl\n ? nextOptions.proxyUrl\n : currentOptions?.proxyUrl,\n domain: hasKeyChanged ? nextOptions?.domain : hasNextDomain ? nextOptions.domain : currentOptions?.domain,\n },\n };\n}\n\nexport function createClerkInstance(ClerkClass: typeof Clerk) {\n return (options?: BuildClerkOptions): HeadlessBrowserClerk | BrowserClerk => {\n const { __experimental_resourceCache: createResourceCache } = options || {};\n const {\n hasConfigChanged,\n options: { publishableKey, proxyUrl, domain },\n } = getUpdatedClerkOptions(__internal_clerkOptions, options);\n\n if (!__internal_clerk && !publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n }\n\n if (hasOwnOption(options, 'tokenCache')) {\n __internal_tokenCache = options.tokenCache ?? MemoryTokenCache;\n }\n\n if (!__internal_clerk || hasConfigChanged) {\n assertValidProxyUrl(proxyUrl);\n\n if (hasConfigChanged) {\n void __internal_tokenCache.clearToken?.(CLERK_CLIENT_JWT_KEY);\n }\n\n const getToken = (key: string) => __internal_tokenCache.getToken(key);\n const saveToken = (key: string, token: string) => __internal_tokenCache.saveToken(key, token);\n\n __internal_clerkOptions = { publishableKey, proxyUrl, domain };\n __internal_clerk = new ClerkClass(publishableKey, { proxyUrl, domain }) as unknown as BrowserClerk;\n\n if (Platform.OS === 'ios' || Platform.OS === 'android') {\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_createPublicCredentials = (\n publicKeyCredential: PublicKeyCredentialCreationOptionsWithoutExtensions,\n ) => {\n return options?.__experimental_passkeys?.create\n ? options?.__experimental_passkeys?.create(publicKeyCredential)\n : errorThrower.throw('create() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_getPublicCredentials = ({\n publicKeyOptions,\n }: {\n publicKeyOptions: PublicKeyCredentialRequestOptionsWithoutExtensions;\n }) => {\n return options?.__experimental_passkeys?.get\n ? options?.__experimental_passkeys?.get({ publicKeyOptions })\n : errorThrower.throw('get() for passkeys is missing');\n };\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnSupported = () => {\n return options?.__experimental_passkeys?.isSupported\n ? options?.__experimental_passkeys?.isSupported()\n : errorThrower.throw('isSupported() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnAutofillSupported = () => {\n return options?.__experimental_passkeys?.isAutoFillSupported\n ? options?.__experimental_passkeys?.isAutoFillSupported()\n : errorThrower.throw('isSupported() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnPlatformAuthenticatorSupported = () => {\n return Promise.resolve(true);\n };\n\n const isClerkNetworkError = (err: unknown): boolean => isClerkRuntimeError(err) && err.code === 'network_error';\n\n if (createResourceCache) {\n const retryInitilizeResourcesFromFAPI = async () => {\n try {\n await __internal_clerk?.__internal_reloadInitialResources();\n } catch (err: unknown) {\n // Retry after 3 seconds if the error is a network error or a 5xx error\n if (isClerkNetworkError(err) || !is4xxError(err)) {\n // Retry after 2 seconds if the error is a network error\n // Retry after 10 seconds if the error is a 5xx FAPI error\n const timeout = isClerkNetworkError(err) ? 2000 : 10000;\n setTimeout(() => void retryInitilizeResourcesFromFAPI(), timeout);\n }\n }\n };\n\n EnvironmentResourceCache.init({ publishableKey, storage: createResourceCache });\n ClientResourceCache.init({ publishableKey, storage: createResourceCache });\n SessionJWTCache.init({ publishableKey, storage: createResourceCache });\n\n __internal_clerk.addListener(({ client }) => {\n // @ts-expect-error - This is an internal API\n const environment = __internal_clerk?.__internal_environment as EnvironmentResource;\n if (environment) {\n void EnvironmentResourceCache.save(environment.__internal_toSnapshot());\n }\n\n if (client) {\n void ClientResourceCache.save(client.__internal_toSnapshot());\n if (client.lastActiveSessionId) {\n const currentSession = client.signedInSessions.find(s => s.id === client.lastActiveSessionId);\n const token = currentSession?.lastActiveToken?.getRawString();\n if (token) {\n void SessionJWTCache.save(token);\n }\n } else {\n void SessionJWTCache.remove();\n }\n }\n });\n\n __internal_clerk.__internal_getCachedResources = async (): Promise<{\n client: ClientJSONSnapshot | null;\n environment: EnvironmentJSONSnapshot | null;\n }> => {\n let environment = await EnvironmentResourceCache.load();\n let client = await ClientResourceCache.load();\n if (!environment || !client) {\n environment = DUMMY_CLERK_ENVIRONMENT_RESOURCE;\n client = DUMMY_CLERK_CLIENT_RESOURCE;\n setTimeout(() => void retryInitilizeResourcesFromFAPI(), 3000);\n }\n return { client, environment };\n };\n }\n }\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_onBeforeRequest(async (requestInit: FapiRequestInit) => {\n // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication\n requestInit.credentials = 'omit';\n\n // Instructs the backend to parse the api token from the Authorization header.\n requestInit.url?.searchParams.append('_is_native', '1');\n\n const jwt = await getToken(CLERK_CLIENT_JWT_KEY);\n (requestInit.headers as Headers).set('authorization', jwt || '');\n\n // Instructs the backend that the request is from a mobile device.\n // Some iOS devices have an empty user-agent, so we can't rely on that.\n if (isNative()) {\n (requestInit.headers as Headers).set('x-mobile', '1');\n (requestInit.headers as Headers).set('x-expo-sdk-version', packageJson.version);\n }\n });\n\n let nativeApiErrorShown = false;\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => {\n const authHeader = response.headers.get('authorization');\n if (authHeader) {\n await saveToken(CLERK_CLIENT_JWT_KEY, authHeader);\n }\n\n if (__DEV__ && !nativeApiErrorShown && response.payload?.errors?.[0]?.code === 'native_api_disabled') {\n console.error(\n 'The Native API is disabled for this instance.\\nGo to Clerk Dashboard > Configure > Native applications to enable it.\\nOr, navigate here: https://dashboard.clerk.com/last-active?path=native-applications',\n );\n nativeApiErrorShown = true;\n }\n });\n }\n\n // At this point __internal_clerk is guaranteed to be defined\n return __internal_clerk;\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createClerkInstance.js","names":["MemoryTokenCache","CLERK_CLIENT_JWT_KEY","Platform","errorThrower","EnvironmentResourceCache","ClientResourceCache","SessionJWTCache","DUMMY_CLERK_ENVIRONMENT_RESOURCE","DUMMY_CLERK_CLIENT_RESOURCE","packageJson"],"sources":["../../../src/provider/singleton/createClerkInstance.ts"],"sourcesContent":["import { type Clerk } from '@clerk/clerk-js';\nimport type { BrowserClerk, HeadlessBrowserClerk } from '@clerk/react';\nimport { is4xxError, isClerkRuntimeError } from '@clerk/shared/error';\nimport type {\n ClientJSONSnapshot,\n EnvironmentJSONSnapshot,\n PublicKeyCredentialCreationOptionsWithoutExtensions,\n PublicKeyCredentialRequestOptionsWithoutExtensions,\n} from '@clerk/shared/types';\nimport { Platform } from 'react-native';\n\nimport packageJson from '../../../package.json';\nimport {\n ClientResourceCache,\n DUMMY_CLERK_CLIENT_RESOURCE,\n DUMMY_CLERK_ENVIRONMENT_RESOURCE,\n EnvironmentResourceCache,\n SessionJWTCache,\n} from '../../cache';\nimport { MemoryTokenCache } from '../../cache/MemoryTokenCache';\nimport type { TokenCache } from '../../cache/types';\nimport { CLERK_CLIENT_JWT_KEY } from '../../constants';\nimport { errorThrower } from '../../errorThrower';\nimport { assertValidProxyUrl } from '../../utils/errors';\nimport { isNative } from '../../utils/runtime';\nimport type { BuildClerkOptions } from './types';\n\n/**\n * Internal types for FAPI client callbacks.\n * These are simplified versions of the internal clerk-js types,\n * used only for the __internal_onBeforeRequest and __internal_onAfterResponse hooks.\n */\ntype FapiRequestInit = RequestInit & {\n url?: URL;\n headers?: Headers;\n};\n\ntype FapiResponse = Response & {\n payload: { errors?: Array<{ code: string }> } | null;\n};\n\ntype ClerkRuntimeOptions = Pick<BuildClerkOptions, 'publishableKey' | 'proxyUrl' | 'domain'>;\ntype ResolvedClerkRuntimeOptions = Omit<ClerkRuntimeOptions, 'publishableKey'> & {\n publishableKey: string;\n};\n\nconst RESOURCE_RETRY_MAX_DELAY_MS = 30_000;\nconst RESOURCE_RETRY_MAX_EXPONENT = 4;\n\nfunction hasOwnOption<Key extends keyof BuildClerkOptions>(\n options: BuildClerkOptions | undefined,\n key: Key,\n): options is BuildClerkOptions & Required<Pick<BuildClerkOptions, Key>> {\n return !!options && Object.prototype.hasOwnProperty.call(options, key);\n}\n\nlet __internal_clerk: HeadlessBrowserClerk | BrowserClerk | undefined;\nlet __internal_clerkOptions: ClerkRuntimeOptions | undefined;\nlet __internal_cancelResourceRetries: (() => void) | undefined;\n// Token IO can change without recreating the native singleton.\nlet __internal_tokenCache: TokenCache = MemoryTokenCache;\n\n/**\n * Resolves the next native singleton config while preserving existing values for omitted options.\n * A publishable key change starts from a clean proxy/domain config unless those values are\n * explicitly provided alongside the new key.\n */\nfunction getUpdatedClerkOptions(\n currentOptions: ClerkRuntimeOptions | undefined,\n nextOptions: ClerkRuntimeOptions | undefined,\n): {\n hasConfigChanged: boolean;\n options: ResolvedClerkRuntimeOptions;\n} {\n const hasNextProxyUrl = hasOwnOption(nextOptions, 'proxyUrl');\n const hasNextDomain = hasOwnOption(nextOptions, 'domain');\n const hasKeyChanged =\n !!currentOptions &&\n typeof nextOptions?.publishableKey !== 'undefined' &&\n nextOptions.publishableKey !== currentOptions.publishableKey;\n const hasProxyChanged = !!currentOptions && hasNextProxyUrl && nextOptions.proxyUrl !== currentOptions.proxyUrl;\n const hasDomainChanged = !!currentOptions && hasNextDomain && nextOptions.domain !== currentOptions.domain;\n\n return {\n hasConfigChanged: hasKeyChanged || hasProxyChanged || hasDomainChanged,\n options: {\n publishableKey: nextOptions?.publishableKey ?? currentOptions?.publishableKey ?? '',\n proxyUrl: hasKeyChanged\n ? nextOptions?.proxyUrl\n : hasNextProxyUrl\n ? nextOptions.proxyUrl\n : currentOptions?.proxyUrl,\n domain: hasKeyChanged ? nextOptions?.domain : hasNextDomain ? nextOptions.domain : currentOptions?.domain,\n },\n };\n}\n\nexport function createClerkInstance(ClerkClass: typeof Clerk) {\n return (options?: BuildClerkOptions): HeadlessBrowserClerk | BrowserClerk => {\n const { __experimental_resourceCache: createResourceCache } = options || {};\n const {\n hasConfigChanged,\n options: { publishableKey, proxyUrl, domain },\n } = getUpdatedClerkOptions(__internal_clerkOptions, options);\n\n if (!__internal_clerk && !publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n }\n\n if (hasOwnOption(options, 'tokenCache')) {\n __internal_tokenCache = options.tokenCache ?? MemoryTokenCache;\n }\n\n if (!__internal_clerk || hasConfigChanged) {\n assertValidProxyUrl(proxyUrl);\n\n __internal_cancelResourceRetries?.();\n __internal_cancelResourceRetries = undefined;\n\n if (hasConfigChanged) {\n void __internal_tokenCache.clearToken?.(CLERK_CLIENT_JWT_KEY);\n }\n\n const getToken = (key: string) => __internal_tokenCache.getToken(key);\n const saveToken = (key: string, token: string) => __internal_tokenCache.saveToken(key, token);\n\n __internal_clerkOptions = { publishableKey, proxyUrl, domain };\n const clerk = new ClerkClass(publishableKey, { proxyUrl, domain }) as unknown as BrowserClerk;\n __internal_clerk = clerk;\n\n if (Platform.OS === 'ios' || Platform.OS === 'android') {\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_createPublicCredentials = (\n publicKeyCredential: PublicKeyCredentialCreationOptionsWithoutExtensions,\n ) => {\n return options?.__experimental_passkeys?.create\n ? options?.__experimental_passkeys?.create(publicKeyCredential)\n : errorThrower.throw('create() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_getPublicCredentials = ({\n publicKeyOptions,\n }: {\n publicKeyOptions: PublicKeyCredentialRequestOptionsWithoutExtensions;\n }) => {\n return options?.__experimental_passkeys?.get\n ? options?.__experimental_passkeys?.get({ publicKeyOptions })\n : errorThrower.throw('get() for passkeys is missing');\n };\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnSupported = () => {\n return options?.__experimental_passkeys?.isSupported\n ? options?.__experimental_passkeys?.isSupported()\n : errorThrower.throw('isSupported() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnAutofillSupported = () => {\n return options?.__experimental_passkeys?.isAutoFillSupported\n ? options?.__experimental_passkeys?.isAutoFillSupported()\n : errorThrower.throw('isSupported() for passkeys is missing');\n };\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_isWebAuthnPlatformAuthenticatorSupported = () => {\n return Promise.resolve(true);\n };\n\n const isClerkNetworkError = (err: unknown): boolean => isClerkRuntimeError(err) && err.code === 'network_error';\n\n if (createResourceCache) {\n let resourceRetryTimer: ReturnType<typeof setTimeout> | undefined;\n let resourceRetryCancelled = false;\n let resourceRetryInFlight = false;\n let resourceRetryFailureCount = 0;\n let initialResourcesLoaded = false;\n\n __internal_cancelResourceRetries = () => {\n resourceRetryCancelled = true;\n if (resourceRetryTimer !== undefined) {\n clearTimeout(resourceRetryTimer);\n resourceRetryTimer = undefined;\n }\n };\n\n const scheduleResourceRetry = (timeout: number) => {\n if (\n resourceRetryCancelled ||\n initialResourcesLoaded ||\n resourceRetryTimer !== undefined ||\n resourceRetryInFlight\n ) {\n return;\n }\n\n resourceRetryTimer = setTimeout(() => {\n resourceRetryTimer = undefined;\n if (resourceRetryCancelled || initialResourcesLoaded) {\n return;\n }\n void retryInitializeResourcesFromFAPI();\n }, timeout);\n };\n\n const retryInitializeResourcesFromFAPI = async () => {\n if (resourceRetryCancelled || initialResourcesLoaded || resourceRetryInFlight) {\n return;\n }\n\n resourceRetryInFlight = true;\n let nextRetryTimeout: number | undefined;\n try {\n await clerk.__internal_reloadInitialResources();\n initialResourcesLoaded = true;\n } catch (err: unknown) {\n if (isClerkNetworkError(err) || !is4xxError(err)) {\n const initialRetryTimeout = isClerkNetworkError(err) ? 2000 : 10000;\n nextRetryTimeout = Math.min(\n initialRetryTimeout * 2 ** resourceRetryFailureCount,\n RESOURCE_RETRY_MAX_DELAY_MS,\n );\n resourceRetryFailureCount = Math.min(resourceRetryFailureCount + 1, RESOURCE_RETRY_MAX_EXPONENT);\n }\n } finally {\n resourceRetryInFlight = false;\n }\n\n if (nextRetryTimeout !== undefined) {\n scheduleResourceRetry(nextRetryTimeout);\n }\n };\n\n EnvironmentResourceCache.init({ publishableKey, storage: createResourceCache });\n ClientResourceCache.init({ publishableKey, storage: createResourceCache });\n SessionJWTCache.init({ publishableKey, storage: createResourceCache });\n\n __internal_clerk.addListener(({ client }) => {\n // @ts-expect-error - This is an internal API\n const environment = __internal_clerk?.__internal_environment as EnvironmentResource;\n if (environment) {\n void EnvironmentResourceCache.save(environment.__internal_toSnapshot());\n }\n\n if (client) {\n void ClientResourceCache.save(client.__internal_toSnapshot());\n if (client.lastActiveSessionId) {\n const currentSession = client.signedInSessions.find(s => s.id === client.lastActiveSessionId);\n const token = currentSession?.lastActiveToken?.getRawString();\n if (token) {\n void SessionJWTCache.save(token);\n }\n } else {\n void SessionJWTCache.remove();\n }\n }\n });\n\n __internal_clerk.__internal_getCachedResources = async (): Promise<{\n client: ClientJSONSnapshot | null;\n environment: EnvironmentJSONSnapshot | null;\n }> => {\n let environment = await EnvironmentResourceCache.load();\n let client = await ClientResourceCache.load();\n if (!environment || !client) {\n environment = DUMMY_CLERK_ENVIRONMENT_RESOURCE;\n client = DUMMY_CLERK_CLIENT_RESOURCE;\n scheduleResourceRetry(3000);\n }\n return { client, environment };\n };\n }\n }\n\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_onBeforeRequest(async (requestInit: FapiRequestInit) => {\n // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication\n requestInit.credentials = 'omit';\n\n // Instructs the backend to parse the api token from the Authorization header.\n requestInit.url?.searchParams.append('_is_native', '1');\n\n const jwt = await getToken(CLERK_CLIENT_JWT_KEY);\n (requestInit.headers as Headers).set('authorization', jwt || '');\n\n // Instructs the backend that the request is from a mobile device.\n // Some iOS devices have an empty user-agent, so we can't rely on that.\n if (isNative()) {\n (requestInit.headers as Headers).set('x-mobile', '1');\n (requestInit.headers as Headers).set('x-expo-sdk-version', packageJson.version);\n }\n });\n\n let nativeApiErrorShown = false;\n // @ts-expect-error - This is an internal API\n __internal_clerk.__internal_onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => {\n const authHeader = response.headers.get('authorization');\n if (authHeader) {\n await saveToken(CLERK_CLIENT_JWT_KEY, authHeader);\n }\n\n if (__DEV__ && !nativeApiErrorShown && response.payload?.errors?.[0]?.code === 'native_api_disabled') {\n console.error(\n 'The Native API is disabled for this instance.\\nGo to Clerk Dashboard > Configure > Native applications to enable it.\\nOr, navigate here: https://dashboard.clerk.com/last-active?path=native-applications',\n );\n nativeApiErrorShown = true;\n }\n });\n }\n\n // At this point __internal_clerk is guaranteed to be defined\n return __internal_clerk;\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clerk/expo",
3
- "version": "3.7.7-snapshot.v20260716135136",
3
+ "version": "3.7.7",
4
4
  "description": "Clerk React Native/Expo library",
5
5
  "keywords": [
6
6
  "react",
@@ -104,9 +104,9 @@
104
104
  "base-64": "^1.0.0",
105
105
  "react-native-url-polyfill": "2.0.0",
106
106
  "tslib": "2.8.1",
107
- "@clerk/clerk-js": "6.25.5-snapshot.v20260716135136",
108
- "@clerk/react": "6.12.5-snapshot.v20260716135136",
109
- "@clerk/shared": "4.25.5-snapshot.v20260716135136"
107
+ "@clerk/clerk-js": "^6.25.5",
108
+ "@clerk/react": "^6.12.5",
109
+ "@clerk/shared": "^4.25.5"
110
110
  },
111
111
  "devDependencies": {
112
112
  "@expo/config-plugins": "^54.0.4",
@@ -120,10 +120,10 @@
120
120
  "expo-secure-store": "^12.8.1",
121
121
  "expo-web-browser": "^12.8.2",
122
122
  "react-native": "^0.86.0",
123
- "@clerk/expo-passkeys": "1.2.6-snapshot.v20260716135136"
123
+ "@clerk/expo-passkeys": "1.2.6"
124
124
  },
125
125
  "peerDependencies": {
126
- "@clerk/expo-passkeys": "1.2.6-snapshot.v20260716135136",
126
+ "@clerk/expo-passkeys": ">=0.0.6",
127
127
  "expo": ">=53 <58",
128
128
  "expo-apple-authentication": ">=7.0.0",
129
129
  "expo-auth-session": ">=5",