Sitzungen

Mit Sitzungen können Sie innerhalb Ihrer Instanz nahtlos einen Kontext erstellen und aufrechterhalten. Ihre Instanz kann viele Sitzungen haben, eine Beziehung von einer (Instanz) zu vielen (Sitzungen). Sitzungen werden erstellt, wenn Sie eine Vonage Cloud Runtime verwenden möchten Anbieter aus dem SDK. Dann können die Sitzungen bei späteren Aufrufen Ihrer Instanz wiederhergestellt werden, um auf den vorherigen Kontext zuzugreifen.

Erstellen einer Sitzung

Sitzungen können durch den Aufruf der Funktion createSession Funktion:

const session = vcr.createSession();

Standardmäßig haben Sitzungen eine TTL von 7 Tagen, aber dies kann durch Angabe einer benutzerdefinierte TTL im createSession Funktion.

Die neue Sitzung kann für den Zugriff auf Anbieter verwendet werden:

const session = vcr.createSession();
const voice = new Voice(session);
const messages = new Messages(session);
const state = vcr.getInstanceState();

Der Aufruf von Funktionen auf der voice oder messages Objekt wird nun mit dieser Sitzung verknüpft. Dies geschieht, indem Vonage Cloud Runtime bei Anfragen einen Header mit der Sitzungs-ID setzt.

Das ist wichtig: VCR führt immer mindestens 2 Repliken Ihrer Anwendung aus. Eine Sitzung, die mit vcr.createSession() beim Start ist lokal für die Replik, die sie erstellt hat - andere Repliken haben andere Sitzungen. Wenn Sie einen Status benötigen, der von allen Replikaten gemeinsam genutzt wird, verwenden Sie vcr.getInstanceState() anstelle von new State(session). Nur verwenden new State(session) wenn die Sitzung an eine bestimmte Anfrage gebunden ist über vcr.getSessionFromRequest(req) oder vcr.createSessionWithId(id).

Erstellen einer Sitzung mit einer benutzerdefinierten TTL

Um eine Sitzung mit einer benutzerdefinierten TTL zu erstellen, können Sie eine TTL in Sekunden für die Option createSession Funktion:

const session = vcr.createSession(3600);

Auf diese Weise wird eine Sitzung mit einer Dauer von 1 Stunde erstellt.

Die Global Session

Die globale Sitzung ist nützlich für die Erstellung von Anbietern, wenn Sie den Kontext nicht beibehalten wollen. Sie können die globale Sitzung mit der Funktion getGlobalSession Funktion:

const session = vcr.getGlobalSession();

Sitzung Wiederherstellung

Sie können eine Sitzung für eine spätere Verwendung speichern und sie dann anhand einer Sitzungs-ID wiederherstellen:

const session = vcr.getSessionById('sessionID');

Wenn Sie spätere Anfragen an Ihre Anwendung haben, können Sie eine bestehende Sitzung wiederherstellen, indem Sie die getSessionFromRequest Funktion:

app.post('/onMessage', async (req, res, next) => {
    const session = vcr.getSessionFromRequest(req);
    ...
});

getSessionFromRequest sucht in der Anfrage nach einer Kopfzeile:

'x-neru-sessionid': '44092039-fa65-41a6-a9ce-97a7d1274b96',

Dann wird die Sitzungs-ID in der Kopfzeile der Anfrage verwendet, getSessionFromRequest wird intern aufgerufen getSessionById. Dies ermöglicht es Ihnen, Ihren Code in Bezug auf eine Sitzung und Ereignisse in einer Sitzung zu betrachten.

Dies vereinfacht Zustandsoperationen, da Sie sicher sein können, dass das Zustandsobjekt der Sitzung nur diese Sitzung kennt.

Beispiel für die Wiederherstellung einer Sitzung

Zur Veranschaulichung sehen Sie hier ein Beispiel für eine Vonage Cloud Runtime-Anwendung, die den Kontext zwischen einem eingehenden Telefonanruf und einer Textnachricht desselben Benutzers übermittelt:

app.post('/onCall', async (req, res, next) => {
    const session = vcr.createSession();
    const voice = new Voice(session);
    const messages = new Messages(session);

    await voice.onVapiEvent({ vapiUUID: req.body.uuid, callback: "onEvent" }).execute();
    await messages.onMessage(
        'onMessage',
        {type: 'sms', number: req.body.from },
        vonageNumber
    ).execute();

    res.json([
        {
            action: 'talk',
            text: 'Say some words, then text this number for a transcript',
        },
        {
          "action": "input",
          "type": ["speech"]
        }
    ]);
});

Die onCall Route wird aufgerufen, wenn ein Anruf bei der Anwendung eingeht. Es wird eine neue Sitzung erstellt, die dazu dient, einen Listener für eingehende SMS-Nachrichten von der anrufenden Nummer sowie für Sprachereignisse des Anrufs einzurichten.

Die Vonage Cloud Runtime-Plattform empfängt eingehende RTC-, Sprach- und Nachrichten-Webhooks für Ihre Vonage-Anwendung gemäß der Konfiguration durch vcr app configure. Wenn Sie einen Listener für diese Webhooks haben, werden sie an Ihre Anwendung gesendet, wenn der eingehende Webhook die Filter des Listeners erfüllt, z. B. die Absendernummer.

Da die Listener mit einer Sitzung eingerichtet werden, werden alle Anfragen, die den Filtern des Listeners entsprechen, an Ihre Anwendung auf der Route gesendet, die mit der Option x-neru-sessionid gesetzt.

app.post('/onEvent', async (req, res, next) => {
    if (req.body.speech != null) {
        const session = vcr.getSessionFromRequest(req);
        const state = new State(session); // safe: session ID comes from the request, consistent across replicas
        await state.set('text', req.body.speech.results[0].text);
    } else {
        console.log(req.body)
    }
    res.sendStatus(200);
});

In der onEvent Route wird eine Sitzung wiederhergestellt, indem man getSessionFromRequest. Der Status dieser Sitzung wird verwendet, um die Sprachtextergebnisse des Telefonats zu speichern. Beachten Sie, dass es nicht notwendig war, irgendeine Form von Bezeichner für den Status zu verwenden, da der Status lokal für diese Sitzung ist, die die gleiche Sitzung ist, die beim Anruf des Benutzers erstellt wurde.

app.post('/onMessage', async (req, res, next) => {
    const session = vcr.getSessionFromRequest(req);
    const messages = new Messages(session);
    const state = new State(session); // safe: session ID comes from the request, consistent across replicas
    const text = await state.get('text');
   
    await messages.send({
        message_type: "text",
        to: req.body.from,
        from: vonageNumber.number,
        channel: vonageNumber.type,
        text: text
    }).execute();

    res.sendStatus(200);
});

Sobald der Nutzer eine eingehende SMS sendet, um die Abschrift seines Anrufs in onMessagewird die ursprüngliche Sitzung wiederhergestellt, in der der Status gespeichert ist.