Twilio serverless function async operations execute order problem

What I’m trying to do:

  1. Incoming call from user would trigger a Digits Gather (No problem)
  2. After receiving the Digits, Say something to the user
  3. Play music while fetching phone number from an API using async/await
  4. Dial said phone number from API’s response.

My Code:

gather-extension.js (Gather and retry both work, thus not providing retry js)

exports.handler = async (context, event, callback) => {
  const retryMax = 2;
  const twiml = new Twilio.twiml.VoiceResponse();

  const gather = twiml.gather({
    action: `./fetch-driver-phone`,
    method: 'GET',
    timeout: 2
  });

  gather.say('Thanks for calling');
  //retry
  twiml.redirect(`./retry-gather-ext?retry=1&retry_max=${retryMax}`);

  return callback(null, twiml);
}

fetch-driver-phone.js (This is where the problem is)

exports.handler = async (context, event, callback) => {
  const twiml = new Twilio.twiml.VoiceResponse();

  const callerPhoneNumber = event.From;
  const extension = event.Digits;

  console.log('Caller Phone Number:', callerPhoneNumber);

  if (extension == null) {
    //handle error
  }

  twiml.say("Please wait while we connect you");
  twiml.play("http://com.twilio.sounds.music.s3.amazonaws.com/MARKOVICHAMP-Borghestral.mp3");

  try {
    console.log("Calling API");
    const result = await fetchDriver(extension, twiml)
    console.log(result);

    twiml.dial().number(result);
    callback(null, twiml);
  } catch(error) {
    console.error(error);
    twiml.say('We are unable to process your request at this time.');
    twiml.hangup();
    callback(error);
  }
}

const fetchDriver = async (code) => {
  console.log('Extension Digits:', code);
  return new Promise((resolve) => {
    setTimeout(() => {
        resolve('phone number');
    }, 5000);
  });
}

What is expected:

I expect the Say and Play to execute before the await statement. Then Dial is called after the response is fetched.

What is happening:

Say and Play are not triggered UNTIL await’s 5000ms is over, then Dial is flat-out ignored. I have tried using the actual API, and I got the same result.

When I use chatGPT or Twilio support AI. Both Gave me the solution of adding callback(null, twmil) right after Play. This indeed fixed the timing issue, however, it resulted in Dial never being called.

Then both AI’s suggested adding an additional VoiceResponse to be used after the first callback(null, twmil). This results in the response console.log showing up at the beginning of the 2nd call. The first call would still be stuck in the Play music.

I also tried using Enqueue, but got the same result.

I ran out of options and things to try. Thus I’m seeking help here. Thanks for any input!