invertase / react-native-firebase

🔥 A well-tested feature-rich modular Firebase implementation for React Native. Supports both iOS & Android platforms for all Firebase services.
https://rnfirebase.io
Other
11.66k stars 2.21k forks source link

[🔥🐛] `NOT_FOUND` error when using modular `httpsCallable` functions #7873

Closed harveyappleton closed 2 months ago

harveyappleton commented 3 months ago

Issue

I'm using Cloud Functions v2. I want to use httpsCallable to call my cloud function.

If I use the modular approach, it fails with error code NOT_FOUND:

const callFunction = httpsCallable(
      getFunctions(getApp(), 'europe-west9'),
      "myHandlerName",
    );

If I use the namespaced approach, it works:

const callFunction = firebase
      .app()
      .functions('europe-west9')
      .httpsCallable("myHandlerName");

Some facts that might help debug the issue:

I'm really happy to help debug this - is there anything I can do to help?

Thanks for an awesome library!!! :-)


Project Files

Javascript

Click To Expand

#### `package.json`: ```json "dependencies": { "@dotlottie/react-player": "^1.6.19", "@expo-google-fonts/inter": "^0.2.3", "@gluestack-style/react": "^1.0.56", "@gluestack-ui/config": "^1.1.18", "@gluestack-ui/themed": "^1.1.32", "@hookform/resolvers": "^3.7.0", "@invertase/react-native-apple-authentication": "^2.3.0", "@legendapp/motion": "^2.3.0", "@react-native-async-storage/async-storage": "1.23.1", "@react-native-community/netinfo": "11.3.1", "@react-native-firebase/analytics": "^20.1.0", "@react-native-firebase/app": "^20.1.0", "@react-native-firebase/auth": "^20.1.0", "@react-native-firebase/firestore": "^20.1.0", "@react-native-firebase/functions": "^20.1.0", "@react-native-firebase/messaging": "^20.1.0", "@react-native-firebase/remote-config": "^20.1.0", "@react-native-firebase/storage": "^20.1.0", "@react-native-google-signin/google-signin": "^12.2.1", "@react-navigation/drawer": "^6.7.0", "@react-navigation/elements": "^1.3.30", "@sentry/react": "^8.14.0", "@sentry/react-native": "~5.22.0", "@tanstack/react-query": "^5.49.2", "date-fns": "^3.6.0", "expo": "~51.0.18", "expo-blur": "^13.0.2", "expo-clipboard": "~6.0.3", "expo-constants": "~16.0.2", "expo-document-picker": "~12.0.2", "expo-font": "~12.0.7", "expo-image": "~1.12.12", "expo-image-manipulator": "^12.0.5", "expo-image-picker": "~15.0.7", "expo-linking": "~6.3.1", "expo-router": "~3.5.17", "expo-splash-screen": "~0.27.5", "expo-status-bar": "~1.12.1", "firebase": "^10.12.3", "jotai": "^2.8.4", "lodash-es": "^4.17.21", "lottie-react-native": "6.7.0", "nanoid": "^5.0.7", "posthog-js": "^1.144.1", "posthog-react-native": "^3.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.52.1", "react-native": "0.74.3", "react-native-device-info": "^11.1.0", "react-native-gesture-handler": "~2.16.1", "react-native-get-random-values": "^1.11.0", "react-native-linear-gradient": "^2.8.3", "react-native-purchases": "^7.28.0", "react-native-reanimated": "~3.10.1", "react-native-reanimated-skeleton": "^1.5.1", "react-native-restart": "^0.0.27", "react-native-safe-area-context": "4.10.1", "react-native-screens": "3.31.1", "react-native-signature-canvas": "^4.7.2", "react-native-svg": "15.2.0", "react-native-toast-message": "^2.2.0", "react-native-web": "~0.19.12", "react-native-web-linear-gradient": "^1.1.2", "react-native-webview": "13.8.6", "zod": "^3.23.8" }, "devDependencies": { "@babel/core": "^7.24.7", "@babel/preset-env": "^7.24.7", "@expo/metro-runtime": "~3.2.1", "@faker-js/faker": "^8.4.1", "@react-native/babel-preset": "^0.74.85", "@tanstack/eslint-plugin-query": "^5.50.0", "@testing-library/react-native": "^12.5.1", "@types/jest": "^29.5.12", "@types/lodash-es": "^4.17.12", "@types/react": "~18.2.79", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", "babel-plugin-module-resolver": "^5.0.2", "concurrently": "^8.2.2", "eslint": "^8", "eslint-config-universe": "^13.0.0", "eslint-plugin-react-hooks": "^4.6.2", "jest": "^29.7.0", "jest-expo": "~51.0.3", "prettier": "^3.3.2", "react-native-svg-transformer": "^1.4.0", "ts-jest": "^29.1.5", "typescript": "~5.3.3", "typescript-eslint": "^7.15.0" }, ```

iOS

Click To Expand

#### `ios/Podfile`: - [ ] I'm not using Pods - [x] I'm using Pods and my Podfile looks like: ```ruby require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") require 'json' podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4' install! 'cocoapods', :deterministic_uuids => false prepare_react_native_project! abstract_target 'common' do # common target config - https://docs.expo.dev/build-reference/variants/#ios use_expo_modules! config = use_native_modules! use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] use_frameworks! :linkage => :static # https://rnfirebase.io/#altering-cocoapods-to-use-frameworks $RNFirebaseAsStaticFramework = true use_react_native!( :path => config[:reactNativePath], :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/..", ) post_install do |installer| react_native_post_install( installer, config[:reactNativePath], :mac_catalyst_enabled => false ) # This is necessary for Xcode 14, because it signs resource bundles by default # when building for devices. installer.target_installation_results.pod_target_installation_results .each do |pod_name, target_installation_result| target_installation_result.resource_bundle_targets.each do |resource_bundle_target| resource_bundle_target.build_configurations.each do |config| config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' end end end end post_integrate do |installer| begin expo_patch_react_imports!(installer) rescue => e Pod::UI.warn e end end ``` #### `AppDelegate.m`: ```objc #import "AppDelegate.h" #import // https://rnfirebase.io/#configure-firebase-with-ios-credentials #import #import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure]; // https://rnfirebase.io/#configure-firebase-with-ios-credentials self.moduleName = @"main"; // You can add your custom initial props in the dictionary below. // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { return [self bundleURL]; } - (NSURL *)bundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } // Linking API - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; } // Universal Links - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; } // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; } // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; } // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; } @end ```


Android

Click To Expand

#### Have you converted to AndroidX? - [ ] my application is an AndroidX application? - [ ] I am using `android/gradle.settings` `jetifier=true` for Android compatibility? - [ ] I am using the NPM package `jetifier` for react-native compatibility? #### `android/build.gradle`: ```groovy // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { buildToolsVersion = findProperty('android.buildToolsVersion') ?: '34.0.0' minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '23') compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '34') targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.23' googlePlayServicesAuthVersion = "21.2.0" // https://react-native-google-signin.github.io/docs/setting-up/android#2-update-gradle-files ndkVersion = "26.1.10909125" } repositories { google() mavenCentral() } dependencies { classpath('com.android.tools.build:gradle') classpath('com.facebook.react:react-native-gradle-plugin') classpath 'com.google.gms:google-services:4.4.2' // https://rnfirebase.io/#configure-firebase-with-android-credentials classpath("io.sentry:sentry-android-gradle-plugin:4.4.0") // https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/#enable-sentry-agp classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') } } apply plugin: "com.facebook.react.rootproject" allprojects { repositories { maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) } maven { // Android JSC is installed from npm url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) } google() mavenCentral() maven { url 'https://www.jitpack.io' } } } ``` #### `android/app/build.gradle`: ```groovy apply plugin: "com.android.application" apply plugin: 'com.google.gms.google-services' // https://rnfirebase.io/#configure-firebase-with-android-credentials apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() // https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/#enable-sentry-agp project.ext.sentryCli = [ logLevel: "debug" ] apply from: "../../node_modules/@sentry/react-native/sentry.gradle" apply plugin: "io.sentry.android.gradle" sentry { // Enables or disables the automatic configuration of Native Symbols // for Sentry. This executes sentry-cli automatically so // you don't need to do it manually. // Default is disabled. uploadNativeSymbols = true // Enables or disables the automatic upload of the app's native source code to Sentry. // This executes sentry-cli with the --include-sources param automatically so // you don't need to do it manually. // This option has an effect only when [uploadNativeSymbols] is enabled. // Default is disabled. includeNativeSources = true // `@sentry/react-native` ships with compatible `sentry-android` // This option would install the latest version that ships with the SDK or SAGP (Sentry Android Gradle Plugin) // which might be incompatible with the React Native SDK // Enable auto-installation of Sentry components (sentry-android SDK and okhttp, timber and fragment integrations). // Default is enabled. autoInstallation { enabled = true } } /** * This is the configuration block to customize your React Native Android app. * By default you don't need to apply any configuration, just uncomment the lines you need. */ react { entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() // Use Expo CLI to bundle the app, this ensures the Metro config // works correctly with Expo projects. cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) bundleCommand = "export:embed" /* Folders */ // The root of your project, i.e. where "package.json" lives. Default is '..' // root = file("../") // The folder where the react-native NPM package is. Default is ../node_modules/react-native // reactNativeDir = file("../node_modules/react-native") // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen // codegenDir = file("../node_modules/@react-native/codegen") /* Variants */ // The list of variants to that are debuggable. For those we're going to // skip the bundling of the JS bundle and the assets. By default is just 'debug'. // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. debuggableVariants = ["development", "staging"] /* Bundling */ // A list containing the node command and its flags. Default is just 'node'. // nodeExecutableAndArgs = ["node"] // // The path to the CLI configuration file. Default is empty. // bundleConfig = file(../rn-cli.config.js) // // The name of the generated asset file containing your JS bundle // bundleAssetName = "MyApplication.android.bundle" // // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' // entryFile = file("../js/MyApplication.android.js") // // A list of extra flags to pass to the 'bundle' commands. // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle // extraPackagerArgs = [] /* Hermes Commands */ // The hermes compiler command to run. By default it is 'hermesc' // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" // // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" // hermesFlags = ["-O", "-output-source-map"] } /** * Set this to true to Run Proguard on Release builds to minify the Java bytecode. */ def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() /** * The preferred build flavor of JavaScriptCore (JSC) * * For example, to use the international variant, you can use: * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ def jscFlavor = 'org.webkit:android-jsc:+' android { ndkVersion rootProject.ext.ndkVersion buildToolsVersion rootProject.ext.buildToolsVersion compileSdk rootProject.ext.compileSdkVersion namespace "app.tradecert.tradecert" defaultConfig { applicationId "app.tradecert.tradecert" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" } // https://docs.expo.dev/build-reference/variants/#android flavorDimensions "env" productFlavors { production { dimension "env" applicationId "app.tradecert.tradecert" } staging { dimension "env" applicationId "app.tradecert.staging" } development { dimension "env" applicationId "app.tradecert.development" } } signingConfigs { debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } } buildTypes { debug { signingConfig signingConfigs.debug } release { // Caution! In production, you need to generate your own keystore file. // see https://reactnative.dev/docs/signed-apk-android. signingConfig signingConfigs.debug shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } packagingOptions { jniLibs { useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) } } } // Apply static values from `gradle.properties` to the `android.packagingOptions` // Accepts values in comma delimited lists, example: // android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini ["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> // Split option: 'foo,bar' -> ['foo', 'bar'] def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); // Trim all elements in place. for (i in 0.. 0) { println "android.packagingOptions.$prop += $options ($options.length)" // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' options.each { android.packagingOptions[prop] += it } } } dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; if (isGifEnabled) { // For animated gif support implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") } if (isWebpEnabled) { // For webp support implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") if (isWebpAnimatedEnabled) { // Animated webp support implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") } } if (hermesEnabled.toBoolean()) { implementation("com.facebook.react:hermes-android") } else { implementation jscFlavor } } apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); applyNativeModulesAppBuildGradle(project) ``` #### `android/settings.gradle`: ```groovy rootProject.name = 'tradecert' dependencyResolutionManagement { versionCatalogs { reactAndroidLibs { from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) } } } apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); useExpoModules() apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) ``` #### `MainApplication.java`: ```java package app.tradecert.tradecert import android.app.Application import android.content.res.Configuration import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.ReactHost import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.soloader.SoLoader import expo.modules.ApplicationLifecycleDispatcher import expo.modules.ReactNativeHostWrapper class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( this, object : DefaultReactNativeHost(this) { override fun getPackages(): List { // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); return PackageList(this).packages } override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED } ) override val reactHost: ReactHost get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) override fun onCreate() { super.onCreate() SoLoader.init(this, false) if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // If you opted-in for the New Architecture, we load the native entry point for this app. load() } ApplicationLifecycleDispatcher.onApplicationCreate(this) } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) } } ``` #### `AndroidManifest.xml`: ```xml ```


Environment

Click To Expand

**`react-native info` output:** ``` System: OS: macOS 14.5 CPU: (10) arm64 Apple M1 Max Memory: 1.79 GB / 32.00 GB Shell: version: "5.9" path: /bin/zsh Binaries: Node: version: 20.9.0 path: /var/folders/k_/gmftqzcn06x4y0lm047bj50w0000gn/T/yarn--1720115111004-0.7188707950564386/node Yarn: version: 1.22.22 path: /var/folders/k_/gmftqzcn06x4y0lm047bj50w0000gn/T/yarn--1720115111004-0.7188707950564386/yarn npm: version: 10.1.0 path: ~/.nvm/versions/node/v20.9.0/bin/npm Watchman: version: 2024.01.22.00 path: /opt/homebrew/bin/watchman Managers: CocoaPods: version: 1.15.2 path: /opt/homebrew/bin/pod SDKs: iOS SDK: Platforms: - DriverKit 23.5 - iOS 17.5 - macOS 14.5 - tvOS 17.5 - visionOS 1.2 - watchOS 10.5 Android SDK: Not Found IDEs: Android Studio: 2023.3 AI-233.14808.21.2331.11709847 Xcode: version: 15.4/15F31d path: /usr/bin/xcodebuild Languages: Java: version: 17.0.10 path: /usr/bin/javac Ruby: version: 3.3.0 path: /opt/homebrew/opt/ruby/bin/ruby npmPackages: "@react-native-community/cli": Not Found react: installed: 18.2.0 wanted: 18.2.0 react-native: installed: 0.74.3 wanted: 0.74.3 react-native-macos: Not Found npmGlobalPackages: "*react-native*": Not Found Android: hermesEnabled: true newArchEnabled: false iOS: hermesEnabled: true newArchEnabled: false ``` - **Platform that you're experiencing the issue on**: - [x] iOS - [x] Android - **`react-native-firebase` version you're using that has this issue:** - `20.1.0` - **`Firebase` module(s) you're using that has the issue:** - `Functions` - **Are you using `TypeScript`?** - `Y` & `5.3.3`


harveyappleton commented 3 months ago

Just been doing some more digging on the modular front using Charles proxy on my iOS device. It looks like the modular version is not respecting the europe-west9 (even if I do getFunctions(undefined, 'europe-west9')) - it still calls us-central1.

Salakar commented 2 months ago

Hmm we do have a test for this which is passing so I'm not sure what's going on here 🤔

harveyappleton commented 2 months ago

Yeah it's odd isn't it! Is there anything I can do locally to help debug this?