Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get link to composition by using status callbacks twilio

Tags:

twilio

Here is what I tried but it's not working.

This guy is responsible for creating a composition after the meeting is ended.

app.post('/api/endMeeting', (req, res) => {
  const roomSid = req.body.roomSid;
  userEmail = req.body.userEmail;
  const client = require('twilio')(config.twilio.apiKey, config.twilio.apiSecret, {accountSid: config.twilio.accountSid});
  client.video.rooms(roomSid).update({ status: 'completed' });
  client.video.compositions.create({
    roomSid: roomSid,
    audioSources: '*',
    videoLayout: {
      grid : {
        video_sources: ['*']
      }
    },
    statusCallback: `${process.env.REACT_APP_BASE_URL}/api/getMeeting`,
    statusCallbackMethod: 'POST',
    format: 'mp4'
  }).then(() => {
    // sendRecordingEmail(composition.sid, userEmail);
    res.status(200).send({
      message: 'success'
    });
  }).catch(err => {
    res.status(500).send({
      message: err.message
    });
  });
});

And this guy will send the download link of the composition to the participant when it's available.

app.post('/api/getMeeting', (req, res) => {
  if (req.query.StatusCallbackEvent === 'composition-available') {
    const client = require('twilio')(config.twilio.apiKey, config.twilio.apiSecret, {accountSid: config.twilio.accountSid});
    const compositionSid = req.query.CompositionSid;
    const uri = "https://video.twilio.com/v1/Compositions/" + compositionSid + "/Media?Ttl=3600";

    client.request({
      method: "GET",
      uri: uri,
    }).then((response) => {
      const requestUrl = request(response.data.redirect_to);
      sendRecordingEmail(requestUrl, userEmail);
      res.status(200).send("success");

    }).catch((error) => {
      res.status(500).send("Error fetching /Media resource " + error);
    });
  }
});

I can confirm that the composition is created exactly in the Twilio console. But it seems the status callback guy is not working and I can see the below issue.

Bug from Twilio debugger

It seems I made mistakes in using the status callback. Please let me know what is the problem and how I can solve this. Thank you.

like image 585
Derek Yang Avatar asked Dec 02 '25 08:12

Derek Yang


1 Answers

Thank you very much for @philnash's help in solving this problem.👍


I solved the above issue and I can get the download link of the composition for now.

The problem was in the status callback function and I should use req.body instead of req.query because of the status callback method. (It's POST on my code.)

Here is the code that is fixed.

app.post('/api/getMeeting', (req, res) => {
  if (req.body.StatusCallbackEvent === 'composition-available') {
    const client = require('twilio')(config.twilio.apiKey, config.twilio.apiSecret, {accountSid: config.twilio.accountSid});
    const compositionSid = req.body.CompositionSid;
    const uri = "https://video.twilio.com/v1/Compositions/" + compositionSid + "/Media?Ttl=3600";

    client.request({
      method: "GET",
      uri: uri,
    }).then((response) => {
      const requestUrl = response.body.redirect_to; // Getting the redirect link that user can download composition
      sendRecordingEmail(requestUrl, userEmail); // Send URL via email to the user
      res.status(200).send("success");

    }).catch((error) => {
      res.status(500).send("Error fetching /Media resource " + error);
    });
  } else {
    res.status(204).send('compositioin is not available');
  }
});
like image 110
Derek Yang Avatar answered Dec 05 '25 08:12

Derek Yang



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!