I'm getting a "deadline-exceeded" error on the frontend when calling a firebase callable cloud function (onCall).
I know that I have to return a Promise so the function knows when to clean itself, but it is still not working.
After 60 seconds, "deadline-exceeded" is throw to the frontend but the function keeps running on the server and finish with success. All batch operations are written to the firestore.
10:37:14.782 AM
syncExchangeOperations
Function execution took 319445 ms, finished with status code: 200
10:36:57.323 AM
syncExchangeOperations
Function execution started
10:36:57.124 AM
syncExchangeOperations
Function execution took 170 ms, finished with status code: 204
10:36:56.955 AM
syncExchangeOperations
Function execution started
async function syncBinanceOperations(
  userId,
  userExchange,
  userExchangeLastOperations,
  systemExchange
) {
  try {
    const client = Binance({
      apiKey: userExchange.apiKey,
      apiSecret: userExchange.privateKey
    });
    const batch = admin.firestore().batch();
    const lastOperations = userExchangeLastOperations
      ? userExchangeLastOperations
      : false;
    const promises = [];
    promises.push(
      syncBinanceTrades(client, lastOperations, userId, systemExchange, batch)
    );
    promises.push(
      syncBinanceDeposits(client, lastOperations, userId, systemExchange, batch)
    );
    promises.push(
      syncBinanceWhitdraws(
        client,
        lastOperations,
        userId,
        systemExchange,
        batch
      )
    );
    promises.push(
      updateUserExchange(userId, userExchange.id, {
        lastSync: moment().format('x')
      })
    );
    await Promise.all(promises);
    return batch.commit();
  } catch (error) {
    return handleErrors(error);
  }
}
exports.syncExchangeOperations = functions.https.onCall(
  async (data, context) => {
    try {
      userAuthenthication(data.userId, context.auth);
      let user = await getUser(data.userId);
      if (!user.plan.benefits.syncExchanges) {
        throw 'Operação não autorizada para o plano contratado';
      }
      let userExchange = await getUserExchange(data.userId, data.exchangeId);
      let response = await Promise.all([
        getUserLastOperations(data.userId, userExchange.exchangeId),
        getSystemExchange(userExchange.exchangeId)
      ]);
      let userExchangeLastOperations = response[0];
      let systemExchange = response[1];
      switch (systemExchange.id) {
        case 'binance':
          return syncBinanceOperations(
            user.id,
            userExchange,
            userExchangeLastOperations,
            systemExchange
          );
      }
    } catch (error) {
      return handleErrors(error);
    }
  }
);
It works fine if I change this function to a HTTP request. It waits the function to finish and returns.
exports.syncExchangeOperations = functions
  .runWith(runtimeOpts)
  .https.onRequest((req, res) => {
    return cors(req, res, async () => {
      try {
        let auth = await admin.auth().verifyIdToken(req.get('Authorization').split('Bearer ')[1]);
        let userExchange = await getUserExchange(
          auth.uid,
          req.query.exchangeId
        );
        let response = await Promise.all([
          getUserLastOperations(auth.uid, userExchange.exchangeId),
          getSystemExchange(userExchange.exchangeId)
        ]);
        let userExchangeLastOperations = response[0];
        let systemExchange = response[1];
        switch (systemExchange.id) {
          case 'binance':
            await syncBinanceOperations(
              auth.uid,
              userExchange,
              userExchangeLastOperations,
              systemExchange
            );
        }
        res.status(200).send();
      } catch (error) {
        res.status(401).send(handleErrors(error));
      }
    });
  });
 
     
    