Skip to content

Commit 3082f30

Browse files
committed
wip
1 parent 6468853 commit 3082f30

File tree

4 files changed

+82
-4
lines changed

4 files changed

+82
-4
lines changed

packages/clerk-js/src/core/clerk.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ import {
118118
EmailLinkError,
119119
EmailLinkErrorCode,
120120
Environment,
121+
isClerkRuntimeError,
121122
Organization,
122123
Waitlist,
123124
} from './resources/internal';
@@ -190,6 +191,11 @@ export class Clerk implements ClerkInterface {
190191
#pageLifecycle: ReturnType<typeof createPageLifecycle> | null = null;
191192
#touchThrottledUntil = 0;
192193

194+
public __internal_getEnvironment: (() => Promise<EnvironmentResource>) | undefined;
195+
public __internal_getClient: (() => Promise<ClientResource>) | undefined;
196+
public __internal_setEnvironment: ((environment: EnvironmentResource) => Promise<void>) | undefined;
197+
public __internal_setClient: ((client: ClientResource) => Promise<void>) | undefined;
198+
193199
public __internal_createPublicCredentials:
194200
| ((
195201
publicKey: PublicKeyCredentialCreationOptionsWithoutExtensions,
@@ -1835,10 +1841,29 @@ export class Clerk implements ClerkInterface {
18351841
};
18361842

18371843
#loadInNonStandardBrowser = async (): Promise<boolean> => {
1838-
const [environment, client] = await Promise.all([
1839-
Environment.getInstance().fetch({ touch: false }),
1840-
Client.getInstance().fetch(),
1841-
]);
1844+
let environment, client;
1845+
try {
1846+
const [fetchedEnv, fetchedClient] = await Promise.all([
1847+
Environment.getInstance().fetch({ touch: false }),
1848+
Client.getInstance().fetch(),
1849+
]);
1850+
environment = fetchedEnv;
1851+
client = fetchedClient;
1852+
await this.__internal_setEnvironment?.(fetchedEnv);
1853+
await this.__internal_setClient?.(fetchedClient);
1854+
} catch (err) {
1855+
if (isClerkRuntimeError(err) && err.code === 'network_error') {
1856+
console.log('Clerk: using cached environment and client');
1857+
environment = await this.__internal_getEnvironment?.();
1858+
client = await this.__internal_getClient?.();
1859+
} else {
1860+
throw err;
1861+
}
1862+
}
1863+
1864+
if (!environment || !client) {
1865+
return false;
1866+
}
18421867

18431868
this.updateClient(client);
18441869
this.updateEnvironment(environment);

packages/expo/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@
6565
"@clerk/expo-passkeys": "workspace:*",
6666
"@clerk/shared": "workspace:*",
6767
"@clerk/types": "workspace:*",
68+
"@react-native-async-storage/async-storage": "^2.1.0",
6869
"base-64": "^1.0.0",
6970
"react-native-url-polyfill": "2.0.0",
7071
"tslib": "2.4.1"
7172
},
7273
"devDependencies": {
7374
"@clerk/eslint-config-custom": "workspace:*",
75+
"@react-native-async-storage/async-storage": "^2.1.0",
7476
"@types/base-64": "^1.0.2",
7577
"@types/node": "^20.11.24",
7678
"@types/react": "18.3.12",
@@ -83,6 +85,7 @@
8385
"typescript": "*"
8486
},
8587
"peerDependencies": {
88+
"@react-native-async-storage/async-storage": ">=2",
8689
"expo-auth-session": ">=5",
8790
"expo-local-authentication": ">=13.5.0",
8891
"expo-secure-store": ">=12.4.0",

packages/expo/src/provider/singleton/createClerkInstance.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
PublicKeyCredentialCreationOptionsWithoutExtensions,
66
PublicKeyCredentialRequestOptionsWithoutExtensions,
77
} from '@clerk/types';
8+
import AsyncStorage from '@react-native-async-storage/async-storage';
89
import { Platform } from 'react-native';
910

1011
import { MemoryTokenCache } from '../../cache/MemoryTokenCache';
@@ -81,6 +82,28 @@ export function createClerkInstance(ClerkClass: typeof Clerk) {
8182
__internal_clerk.__internal_isWebAuthnPlatformAuthenticatorSupported = () => {
8283
return Promise.resolve(true);
8384
};
85+
86+
// @ts-expect-error - This is an internal API
87+
__internal_clerk.__internal_setClient = async (client: any) => {
88+
await AsyncStorage.setItem('clerk_client', JSON.stringify(client));
89+
};
90+
91+
// @ts-expect-error - This is an internal API
92+
__internal_clerk.__internal_getClient = async () => {
93+
const client = await AsyncStorage.getItem('clerk_client');
94+
return client ? JSON.parse(client) : null;
95+
};
96+
97+
// @ts-expect-error - This is an internal API
98+
__internal_clerk.__internal_setEnvironment = async (environment: any) => {
99+
await AsyncStorage.setItem('clerk_environment', JSON.stringify(environment));
100+
};
101+
102+
// @ts-expect-error - This is an internal API
103+
__internal_clerk.__internal_getEnvironment = async () => {
104+
const environment = await AsyncStorage.getItem('clerk_environment');
105+
return environment ? JSON.parse(environment) : null;
106+
};
84107
}
85108

86109
// @ts-expect-error - This is an internal API

pnpm-lock.yaml

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)