

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Actualización de las llamadas en curso para el audio PTSN de Amazon Chime SDK
<a name="update-sip-call"></a>

Como parte del servicio de audio PSTN, las aplicaciones multimedia SIP permiten configurar las acciones que se ejecutan en una llamada invocando funciones de Lambda definidas por el usuario en función de los eventos de la llamada, como una llamada entrante o dígitos DTMF. La API [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) le permite activar una función de Lambda en cualquier momento mientras la llamada esté activa, sustituyendo las acciones actuales por las nuevas acciones devueltas por la invocación.

**Flujo de trabajo**  
La API [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) se utiliza en varios casos, por ejemplo, para añadir participantes a una reunión, silenciar y volver a silenciar a un usuario, desconectarlo, etc. El siguiente caso de uso describe un flujo de trabajo típico.

Un usuario llama y escucha música mientras Amazon Chime SDK configura la reunión. Una vez completada la configuración, Amazon Chime SDK detiene el audio y admite a la persona que llama a la reunión. A continuación, suponga el uso de un sistema independiente, `MyMeetingService`, que gestione las reuniones. Todas las llamadas entrantes deben ponerse en espera. Chime notifica MyMeetingService las llamadas entrantes y, a MyMeetingService continuación, crea un asistente para cada llamada y, cuando MyMeetingService está listo para iniciar la reunión, lo notifica a la aplicación multimedia SIP y proporciona un token para unirse a la reunión.

Para gestionar este caso, la función de Lambda debe implementar la siguiente lógica. 
+ Cuando llega una nueva llamada entrante, se invoca la Lambda con un evento `NEW_INBOUND_CALL`. La Lambda llama a `MyMeetingService` y pasa el `transactionId` que identifica la llamada actual y devuelve la acción `PlayAudio`.
+ Cuando `MyMeetingService` está listo para añadir a la persona que ha convocado a la reunión, el servicio llama a la API [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) y pasa el `transactionId` de llamada y `JoinToken` como parte de sus argumentos. Esta llamada a la API vuelve a activar la función de Lambda, ahora con el evento `CALL_UPDATE_REQUESTED`. La MyMeetingService pasa `JoinToken` a la función Lambda como parte del evento y el token se utiliza para devolver la `JoinChimeMeeting` acción a la aplicación multimedia SIP, que la interrumpe y conecta a la `PlayAudio` persona que llama a la reunión.

![Diagrama que muestra el flujo de datos en la API UpdateSipMediaApplicationCall.](http://docs.aws.amazon.com/es_es/chime-sdk/latest/dg/images/update-sip-call-flow3.png)


**nota**  
La API [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) devuelve HTTP 202 (aceptado). La aplicación multimedia SIP confirma que la llamada está en curso y que se puede actualizar, por lo que intenta invocar la función de Lambda. La invocación se realiza de forma asíncrona, por lo que una respuesta correcta de la API no garantiza que la función de Lambda se haya iniciado o completado.

En el siguiente ejemplo se muestra la sintaxis de solicitud.

```
{
    "SipMediaApplicationId": "{{string}}",
    "TransactionId": "{{string}}",
    "Arguments": {
        "string": "{{string}}"
    } 
}
```

**Parámetros de solicitud**
+ `SipMediaApplicationId`: el ID de la aplicación multimedia SIP que gestiona la llamada. 
+ `TransactionId`: ID de transacción de la llamada. En el caso de las llamadas entrantes, el `TransactionId` se puede obtener del evento `NEW_INCOMING_CALL` pasado a la función de Lambda en su primera invocación. En el caso de las llamadas salientes, `TransactionId` se devuelve en la respuesta de [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html). 
+ **Argumentos**: argumentos personalizados que se ponen a disposición de la función de Lambda como parte de los datos de la acción `CallUpdateRequest`. Puede contener de 0 a 20 pares de clave-valor.

A continuación se muestra un ejemplo de solicitud:

```
aws chime update-sip-media-application-call --sip-media-application-id feb37a7e-2b66-49fb-b2dd-30f4780dc36d --transaction-id 1322a4e7-c106-4e70-aaaf-a8fa4c77c0cb --arguments '{"JoinToken": "{{abc123}}"}'
```

**Sintaxis de la respuesta**

```
{
  "SipMediaApplicationCall": {
  "TransactionId": "{{string}}"
  }
}
```

**Elementos de respuesta**
+ **TransactionId**— El identificador de la transacción de llamada, el mismo identificador que el de la solicitud.

En el siguiente ejemplo, se muestra un evento de invocación `CALL_UPDATE_REQUESTED`.

```
{
  "SchemaVersion": "1.0",
  "Sequence": {{2}},
  "InvocationEventType": "CALL_UPDATE_REQUESTED",
  "ActionData": {
    "Type": "CallUpdateRequest",
    "Parameters": {
      "Arguments": {
        "{{string}}": "{{string}}"
      }
    }
  },
  "CallDetails": {
    ...
  }
}
```

**Elementos de evento**
+ **SchemaVersion**— La versión del esquema JSON (1.0)
+ **Secuencia**: el número de secuencia del evento de la llamada
+ **InvocationEventType**— El tipo de evento de invocación de Lambda, en este caso, `CALL_UPDATE_REQUESTED`
+ **ActionData**— Los datos asociados a la `CallUpdateRequest` acción.
  + **Tipo**: el tipo de acción, en este caso, `CallUpdateRequest`
  + **Parámetros**: los parámetros de la acción
    + **Argumentos**: los argumentos que se pasan como parte de la solicitud de API `UpdateSipMediaApplicationCall`
+ **CallDetails**— La información sobre el estado actual de la llamada

**Comprensión de las acciones interrumpibles y no interrumpibles**  
Cuando una función de Lambda devuelve una nueva lista de acciones mientras se ejecutan las acciones existentes, todas las acciones que siguen a la acción en curso se sustituyen por las nuevas acciones. En algunos casos, la función de Lambda interrumpe las acciones en curso para ejecutar nuevas acciones de forma inmediata.

El siguiente diagrama muestra un ejemplo típico. El texto que aparece debajo del diagrama explica la lógica.

![Diagrama que muestra cómo se pueden reemplazar las acciones durante una llamada en curso a una aplicación multimedia SIP.](http://docs.aws.amazon.com/es_es/chime-sdk/latest/dg/images/update-sip-actions.png)


Si la acción 2 es interrumpible, la detenemos y ejecutamos la nueva acción 1 en su lugar.

Si la acción 2 no es interrumpible, se completa antes de que comience la nueva acción 1.

En ambos casos, la acción 3 no se ejecuta.

Si algo interrumpe una acción, la función de Lambda se invoca con un evento `ACTION_INTERRUPTED`. Este evento se utiliza únicamente con fines informativos. La aplicación multimedia SIP ignora todas las acciones devueltas por esta invocación.

Tipos de acciones interrumpibles:
+ `PlayAudio`
+ `RecordAudio`
+ `Pause`

**Función de Lambda de ejemplo**  
En este ejemplo, se muestra una función de Lambda típica que reproduce un archivo de audio, pasa un token de unión y actualiza la llamada.

```
const MMS = require('my-meeting-service');
const myMeetingServiceClient = new MMS.Client();

exports.handler = async (event) => {
    console.log('Request: ' + JSON.stringify(event));
    
    const playAudio = () => {
      return {
        Type: 'PlayAudio',
        Parameters: {
          ParticipantTag: 'LEG-A',
          AudioSource: {
            Type: 'S3',
            BucketName: '{{chime-meetings-audio-files-bucket-name}}',
            Key: '{{welcome.wav}}'
          }
        }
      }
    }
    
    const joinChimeMeeting = (joinToken) => {
      return {
        Type: 'JoinChimeMeeting',
        Parameters: {
          JoinToken: {{joinToken}}
        }
      }
    }
    
    const response = (...actions) => {
      const r = {
        SchemaVersion: '1.0',
        Actions: actions
      };
      console.log('Response: ' + JSON.stringify(r));
      return r;
    };
    
    switch (event.InvocationEventType) {
      case 'NEW_INBOUND_CALL': 
        myMeetingServiceClient.addPendingCall(event.CallDetails.TransactionId);         
        return response(playAudio());      
      case 'CALL_UPDATE_REQUESTED':
        const joinToken = event.ActionData.Parameters.Arguments['{{JoinToken}}']
        return response(joinChimeMeeting(joinToken));
      default:
        return response();
    }
}
```