Recuperar invitaciones de llamada pendientes

Cuando un usuario recibe una invitación de llamada entrante y, a continuación, actualiza la página (o reinicia la aplicación) antes de responder, el Client SDK puede reenviar automáticamente la invitación, sin que sea necesaria ninguna llamada adicional a la API.

Esto funciona porque el Servicio de Conversación almacena los eventos pendientes durante aproximadamente 30 segundos. Cuando pasas el ID de la sesión anterior a createSession, el servidor reproduce esos eventos en la nueva sesión y el callInvite evento (o onCallInvite (delegado) se ejecuta automáticamente.

Cómo funciona

  1. Mantener el identificador de sesión devuelto por createSession (p. ej., en sessionStorage en la web, o UserDefaults / SharedPreferences (en el móvil).
  2. En la próxima carga, recuperar el ID de sesión guardado y devolverlo a createSession.
  3. Registra el oyente de invitaciones antes de llamar createSession para que ya esté activo cuando se envíen los eventos pendientes.

Advertencia: El servicio de conversación conserva los eventos pendientes durante unos 30 segundos. Si ha transcurrido más tiempo desde que se recibió la invitación original, esta no se volverá a enviar.

Casos extremos

  • El plazo ha vencido: Si ha transcurrido el plazo de retención de 30 segundos, createSession aún así se realiza con éxito: se obtiene una sesión válida, pero la invitación pendiente no se vuelve a enviar. Para entonces, la persona que ha realizado la llamada ya habrá agotado el tiempo de espera o habrá cancelado la llamada.
  • ID de sesión no válido: Si el ID de sesión almacenado no es válido o pertenece a otro usuario, el SDK lo ignora y crea una nueva sesión. No se reproducen los eventos pendientes.
  • Cierre de la aplicación frente a actualización de la página: En la web, sessionStorage se borra al cerrar la pestaña, por lo que este patrón funciona para las actualizaciones dentro de la misma pestaña. En el caso de los reinicios de la aplicación móvil, hay que conservar el ID de sesión en un almacenamiento duradero (UserDefaults / SharedPreferences).

Ejemplo

client.on('callInvite', (callId, from) => {
  console.log(`Received call invite ${callId} from ${from}`);
});

const previousSessionId = store.getSessionId();

try {
  const sessionId = previousSessionId
    ? await client.createSession(jwt, previousSessionId)
    : await client.createSession(jwt);

  store.saveSessionId(sessionId);
  console.log(`Session ready: ${sessionId}`);
} catch (error) {
  console.error('Failed to create/reconnect session', error);
}
 client.setCallInviteListener { callId, from, channelType ->
     println("Received call invite $callId from $from on $channelType")
 }

 val previousSessionId = store.getSessionId()
 if (previousSessionId != null) {
     client.createSession(jwt, previousSessionId) { error, sessionId ->
         if (error != null) {
             println("Failed to reconnect session: $error")
             return@createSession
         }

         sessionId?.let(store::saveSessionId)
         println("Reconnected session: $sessionId")
     }
 } else {
     client.createSession(jwt) { error, sessionId ->
         if (error != null) {
             println("Failed to create session: $error")
             return@createSession
         }

         sessionId?.let(store::saveSessionId)
         println("Session created: $sessionId")
     }
 }
 client.setCallInviteListener((callId, from, channelType) -> {
     System.out.println(
             "Received call invite " + callId + " from " + from + " on " + channelType
     );
     return null;
 });

 String previousSessionId = store.getSessionId();
 if (previousSessionId != null) {
     client.createSession(jwt, previousSessionId, (error, sessionId) -> {
         if (error != null) {
             System.out.println("Failed to reconnect session: " + error);
             return null;
         }

         if (sessionId != null) {
             store.saveSessionId(sessionId);
         }
         System.out.println("Reconnected session: " + sessionId);
         return null;
     });
 } else {
     client.createSession(jwt, null, (error, sessionId) -> {
         if (error != null) {
             System.out.println("Failed to create session: " + error);
             return null;
         }

         if (sessionId != null) {
             store.saveSessionId(sessionId);
         }
         System.out.println("Session created: " + sessionId);
         return null;
     });
 }
 class InviteDelegate: NSObject, VGVoiceClientDelegate {
     func voiceClient(_ client: VGVoiceClient, didReceiveInviteForCall callId: VGCallId, from caller: String, with type: VGVoiceChannelType) {
         print("Received call invite \(callId) from \(caller)")
     }

     func voiceClient(_ client: VGVoiceClient, didReceiveHangupForCall callId: VGCallId, withQuality callQuality: VGRTCQuality, reason: VGHangupReason) {}
     func voiceClient(_ client: VGVoiceClient, didReceiveInviteCancelForCall callId: VGCallId, with reason: VGVoiceInviteCancelReason) {}
     func client(_ client: VGBaseClient, didReceiveSessionErrorWith reason: VGSessionErrorReason) {}
 }

 let delegate = InviteDelegate()
 client.delegate = delegate

 if let previousSessionId = store.getSessionId() {
     client.createSession(jwt, sessionId: previousSessionId) { error, sessionId in
         guard error == nil, let sessionId = sessionId else {
             print("Failed to reconnect session: \(error?.localizedDescription ?? "unknown")")
             return
         }

         store.saveSessionId(sessionId)
         print("Reconnected session: \(sessionId)")
     }
 } else {
     client.createSession(jwt) { error, sessionId in
         guard error == nil, let sessionId = sessionId else {
             print("Failed to create session: \(error?.localizedDescription ?? "unknown")")
             return
         }

         store.saveSessionId(sessionId)
         print("Session created: \(sessionId)")
     }
 }
 self.store = store;
 client.delegate = self;

 NSString *previousSessionId = [store getSessionId];
 if (previousSessionId != nil) {
     [client createSession:jwt sessionId:previousSessionId callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
         if (error != nil || sessionId == nil) {
             NSLog(@"Failed to reconnect session: %@", error);
             return;
         }

         [store saveSessionId:sessionId];
         NSLog(@"Reconnected session: %@", sessionId);
     }];
 } else {
     [client createSession:jwt callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
         if (error != nil || sessionId == nil) {
             NSLog(@"Failed to create session: %@", error);
             return;
         }

         [store saveSessionId:sessionId];
         NSLog(@"Session created: %@", sessionId);
     }];
 }