firebase / firebase-js-sdk

Firebase Javascript SDK
https://firebase.google.com/docs/web/setup
Other
4.86k stars 891 forks source link

`deleteApp` hangs indefinitely when auth and firestore are initialized #7816

Open kaisermann opened 11 months ago

kaisermann commented 11 months ago

Operating System

MacOS Sonoma 14.1.1

Browser Version

n/a

Firebase SDK Version

10.6.0

Firebase SDK Product:

Firestore

Describe your project's tooling

The minimal repro contains only the js SDK in the latest version. Tested in node@16 @18 and @20.

Describe the problem

Calling deleteApp for an app initialized with both firestore/auth hangs indefinitely. I encountered this while trying to connect both to the emulator, but the issue seems to happen without calling the connect{...}Emulator functions.

However, if some operation is called to the firestore instance, the app seems to be deleted as expected.

Steps and code to reproduce issue

Stackblitz repro

Create a repro.mjs file with:

import { deleteApp, initializeApp } from 'firebase/app';
import { initializeAuth } from 'firebase/auth';
import { initializeFirestore, doc, getDoc } from 'firebase/firestore';

const testApp = initializeApp({
  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  projectId: 'some-project-id',
});

// Comment these two lines and the app will delete successfully
const testFirestore = initializeFirestore(testApp, {
  ignoreUndefinedProperties: true,
});

// Or comment these two lines and the app will delete successfully
const testAuth = initializeAuth(testApp);

async function reproIssue() {
  console.log('Deleting app...');

  // Uncomment this getDoc call and the deleteApp works with both firestore/auth
  // await getDoc(doc(testFirestore, 'users/alice'), { name: 'Alice' }).catch(
  //   () => {
  //     /** ignore errors */
  //   }
  // );

  // This hangs indefinitely when both firestore and auth are initialized
  // This DOES NOT hand if only firestore or auth is initialized
  // Or if the getDoc call above is not commented.
  await deleteApp(testApp);
  console.log('App deleted'); // This is never reached
}

await reproIssue();
  1. Run node repro.mjs

  2. Deleting app... should be logged but App deleted not. CleanShot 2023-11-27 at 10 55 53

  3. Comment either the testFirestore or testAuth initialization and run the file again..

  4. Both Deleting app... and App deleted should be logged. CleanShot 2023-11-27 at 10 56 04

  5. Now add an operation to firestore, i.e a getDoc, right before the deleteApp:

  await getDoc(doc(testFirestore, 'users/alice'), { name: 'Alice' }).catch(
    () => {}
  );
  1. Run the file again with both auth/firestore initialized.

  2. Both Deleting app... and App deleted should be logged.

CleanShot 2023-11-27 at 11 26 15

milaGGL commented 11 months ago

Hi @kaisermann, thank you for reporting this issue. I am able to reproduce the error with the provided code. I will start looking into the issue.

tappin-kr commented 6 months ago

Hi @kaisermann, thank you for reporting this issue. I am able to reproduce the error with the provided code. I will start looking into the issue.

Any update on this issue? I see the PR was closed, not merged.

milaGGL commented 6 months ago

Hi @tappin-kr, that PR only solves the problem by ignoring a promises that we should have waited for, and high likely will introduce other errors. The main problem actually exists in a node library, which explains why this only happens in Node.

Internally pinged another team to debug the issue.