@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.
- package/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt +2 -0
- package/android/src/main/java/expo/modules/clerk/ClerkComposeNativeViewHost.kt +28 -11
- package/android/src/main/java/expo/modules/clerk/ClerkUserButtonViewModule.kt +0 -5
- package/dist/provider/ClerkProvider.js +1 -1
- package/dist/provider/singleton/createClerkInstance.d.ts.map +1 -1
- package/dist/provider/singleton/createClerkInstance.js +40 -6
- package/dist/provider/singleton/createClerkInstance.js.map +1 -1
- package/package.json +6 -6
|
@@ -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:
|
|
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
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
85
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
108
|
-
"@clerk/react": "6.12.5
|
|
109
|
-
"@clerk/shared": "4.25.5
|
|
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
|
|
123
|
+
"@clerk/expo-passkeys": "1.2.6"
|
|
124
124
|
},
|
|
125
125
|
"peerDependencies": {
|
|
126
|
-
"@clerk/expo-passkeys": "
|
|
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",
|