Как прервать вызов Twilio после того, как SIP-сегмент повесил трубку?

#twilio

#twilio

Вопрос:

Я пытаюсь заставить Twilio отвечать на звонки по номеру телефона PSTN, а затем попытаться позвонить на SIP-устройство.

Если SIP-устройство недоступно, занято или не отвечает; затем запишите сообщение и отправьте его по электронной почте.

Если SIP-устройство отвечает, подключите две стороны и отключите вызов, когда любая из сторон повесит трубку.

Для этого я использую функции Twilio.

Но по какой-то причине я не могу заставить Twilio прервать вызов, когда SIP-устройство вешает трубку. Он также не отключает SIP-сегмент, если абонент PSTN вешает трубку.

 // /handle_incoming_call
exports.handler = function(context, event, callback) {
  console.log('running handle_incoming_call')
  console.log(context,event)
  
  const twiml = new Twilio.twiml.VoiceResponse();
  const dialOptions = {
    action: "https://example.twil.io/record_voicemail",
    ringTone: 'ch',
  }
  const dialString = `sip:${context.MY_CLIENT}`

  try {
    twiml.dial(dialOptions).sip(`${dialString};region=de1;transport=tls`);
    
    console.log(`Calling '${dialString}'.`);
    return callback(null, twiml);
  } catch(e) {
    console.error("Something went wrong while handling incoming call.", e);
    return callback(e);
  }
};
 
 // /record_voicemail
exports.handler = function(context, event, callback) {
  console.log('Running /record_voicemail')
  console.log('c,e', context,event)
  console.log('dial call status: ', event.DialCallStatus)

  let twiml = new Twilio.twiml.VoiceResponse();

  if(event.DialCallStatus === "busy" || 
    event.DialCallStatus === "failed" || 
    event.DialCallStatus === "no-answer" || 
    event.DialCallStatus === "canceled") {
    const recordOptions = {
      action: "https://example.twil.io/forward_vm_via_email",
      transcribe: false,
      maxLength: 120, // seconds
      playBeep: true,
      trim: "trim-silence",
    }

    try {
      twiml.play("https://example.twil.io/greeting_en.mp3");
      twiml.play("https://example.twil.io/greeting_fr.mp3");

      twiml.record(recordOptions);

      return callback(null, twiml);
    } catch(e) {
      console.error("Something went wrong while recording voicemail.", e);
      twiml.hangup();

      return callback(e, twiml);
    }
  }
};
 
 // /forward_vm_via_email
const sgMail = require('@sendgrid/mail');

exports.handler = function(context, event, callback) {
  console.log('running forward_vm_via_email')
  sgMail.setApiKey(context.SENDGRID_API_KEY);
    const msg = {
      to: context.TO_EMAIL_ADDRESS,
      from: context.FROM_EMAIL_ADDRESS,
      html: `<p><strong>New Voicemail from:</strong> ${event.From}</p>
                <p><a href=${event.RecordingUrl}>Click here to listen (${event.RecordingDuration} seconds)</a></p>`,
      subject: `New Voicemail from: ${event.From}`,
    };

  sgMail.send(msg)
    .then(response => {
      console.log("Voicemail successfully forwarded.")
      return callback();
    })
    .catch(err => {
      console.error("Something went wrong while forwarding voicemail.")
      return callback(err);
    });
};
 

Этот код работает для записи голосовой почты при занятости, сбое, отсутствии ответа. Но если SIP-устройство отвечает, а затем вешает трубку, вызов остается подключенным на стороне ТСОП и просто зависает навсегда.

Я также попытался добавить a twiml.hangup() /record_voicemail вне if цикла, чтобы перехватить случаи, когда вызов был успешно завершен, но он ничего не делает. То же самое с добавлением twiml.hangup() /handle_incoming_call ввода, после twiml.dial().sip() но, опять же, ничего не происходит.

Почему весь вызов не зависает, когда SIP-набор отключен?

Комментарии:

1. Евангелист-разработчик Twilio здесь. Я думаю, что ваш код верен, и вызов должен зависнуть. Итак, этот вопрос лучше всего задать службе поддержки Twilio . Отправьте им несколько идентификаторов вызовов, где это произошло, и они должны иметь возможность проверить, что произошло и почему вызов не повесил трубку.