O problema foi reportado pelo Twilio como nosso servidor não enviando nenhum dado RTP durante um tempo estendido, portanto a conexão estava expirando. O dialplan que eu estava usando tinha um script EAGI personalizado que gravaria a pessoa no telefone por um período indefinido de tempo. Este processo foi o tempo limite do outro lado.
Minha solução muito hacky foi a seguinte:
- Em vez de usar o comando RECORD FILE, usei o comando GET OPTION para jogar 10 segundos de silêncio, aguarde a tecla pound (#).
- Eu usei o EAGI stderr + 1 fd para capturar o áudio para um arquivo manualmente com o meu script.
- Eu usei o comando STREAM FILE para reproduzir a gravação para o usuário confirmar.
O envio dos 10 segundos de silêncio repetidamente impediu que o servidor atingisse o tempo limite. Eu poderia imaginar que enviar 1 segundo de silêncio faria a mesma coisa e economizar em largura de banda, mas sua milhagem pode variar.
Minha função de script Node.js substitui as funções WAIT FOR DIGIT ou RECORD FILE:
/**
* Loop playing silence until interrupted
* @param done =function( timedout ) Callback when the silence has been interrupted
* @param maxRecordTime Length of time to be able to record max. Leave blank for no timeout.
* @param stopTime Timestamp when the recording should be stopped
*/
Index.prototype.loopSilenceUntilInterrupted = function( done, maxRecordTime, stopTime ) {
var that = this;
// Set the stopTime?
if( maxRecordTime!==undefined && stopTime===undefined )
stopTime = Date.now()+maxRecordTime;
this.context.getOption( "silence/10", "#", 10, function( error, response ) {
if( response.result==35 )
done( false ); // We have been diggery
else if( stopTime!==undefined && Date.now()>=stopTime )
done( true ); // We have timed out!
else
that.loopSilenceUntilInterrupted( done, maxRecordTime, stopTime ); // Do it again
},
0 ); // No cooldown
};