import { getApp, initializeAppCheck, getToken, getLimitedUseToken, setTokenAutoRefreshEnabled, CustomProvider, onTokenChanged, makeIDBAvailable, type AppCheckOptions, type AppCheckTokenResult, } from '@react-native-firebase/app/dist/module/internal/web/firebaseAppCheck'; import { guard, emitEvent } from '@react-native-firebase/app/dist/module/internal/web/utils'; let appCheckInstances: Record = {}; let listenersForApp: Record void> = {}; function getAppCheckInstanceForApp(appName: string): any { if (!appCheckInstances[appName]) { throw new Error( `firebase AppCheck instance for app ${appName} has not been initialized, ensure you have called initializeAppCheck() first.`, ); } return appCheckInstances[appName]; } interface AppCheckModule { initializeAppCheck(appName: string, options: AppCheckOptions): Promise; setTokenAutoRefreshEnabled(appName: string, isTokenAutoRefreshEnabled: boolean): Promise; getLimitedUseToken(appName: string): Promise; getToken(appName: string, forceRefresh: boolean): Promise; addAppCheckListener(appName: string): Promise; removeAppCheckListener(appName: string): Promise; } /** * This is a 'NativeModule' for the web platform. * Methods here are identical to the ones found in * the native android/ios modules e.g. `@ReactMethod` annotated * java methods on Android. */ const appCheckWebModule: AppCheckModule = { initializeAppCheck(appName: string, options: AppCheckOptions) { makeIDBAvailable(); return guard(async () => { if (appCheckInstances[appName]) { return; } const { provider, isTokenAutoRefreshEnabled } = options; if (!provider) { throw new Error('AppCheck provider is required'); } const _provider = new CustomProvider({ getToken() { if ('getToken' in provider && typeof provider.getToken === 'function') { return provider.getToken(); } throw new Error('Provider does not have a getToken method'); }, }); appCheckInstances[appName] = initializeAppCheck(getApp(appName), { provider: _provider, isTokenAutoRefreshEnabled, }); }); }, setTokenAutoRefreshEnabled(appName: string, isTokenAutoRefreshEnabled: boolean) { return guard(async () => { const instance = getAppCheckInstanceForApp(appName); setTokenAutoRefreshEnabled(instance, isTokenAutoRefreshEnabled); }); }, getLimitedUseToken(appName: string) { return guard(async () => { const instance = getAppCheckInstanceForApp(appName); return getLimitedUseToken(instance); }); }, getToken(appName: string, forceRefresh: boolean) { return guard(async () => { const instance = getAppCheckInstanceForApp(appName); return getToken(instance, forceRefresh); }); }, addAppCheckListener(appName: string) { return guard(async () => { if (listenersForApp[appName]) { return; } const instance = getAppCheckInstanceForApp(appName); listenersForApp[appName] = onTokenChanged(instance, (tokenResult: AppCheckTokenResult) => { emitEvent('appCheck_token_changed', { appName, ...tokenResult, }); }); }); }, removeAppCheckListener(appName: string) { return guard(async () => { if (!listenersForApp[appName]) { return; } listenersForApp[appName](); delete listenersForApp[appName]; }); }, }; export default appCheckWebModule;