Start · Sprachen · JavaScript · Referenz · PresentationConnection.terminate()

PresentationConnection.terminate()

Methode

Beendet die laufende Präsentation endgültig: Die Empfängerseite wird geschlossen und alle Verbindungen gehen in den Zustand <code>"terminated"</code> über.

seit JavaScript Experimentell: nur Chromium-Browser (Chrome/Edge, Kategorie: webapi

Signatur

PresentationConnection.prototype.terminate()

Beschreibung

Mit terminate() beendet die steuernde Seite (Controller) oder die präsentierende Seite (Receiver) eine Präsentation der Presentation API vollständig. Der User-Agent schließt dann den Browsing-Kontext auf dem Zweitbildschirm, also etwa auf dem Chromecast, dem Beamer oder dem angeschlossenen Monitor. Danach setzt er den state jeder zugehörigen PresentationConnection auf "terminated" und löst auf jeder das Ereignis terminate aus.

Wichtig ist der Unterschied zu close(). close() trennt nur die Verbindung, die Präsentation läuft auf dem Zweitbildschirm weiter. Später kann man sich mit PresentationRequest.reconnect() wieder verbinden. terminate() dagegen ist endgültig: Eine beendete Präsentation lässt sich nicht wiederherstellen, man muss mit PresentationRequest.start() eine neue starten.

Typische Einsätze sind ein Button „Präsentation beenden“ in einer Folien- oder Medien-App, das Aufräumen, wenn der Nutzer die Sitzung abmeldet, oder das Selbstbeenden einer Receiver-Seite, wenn der Inhalt zu Ende ist.

Die Methode wirkt nur, wenn die Verbindung im Zustand "connected" oder "connecting" ist. In allen anderen Zuständen passiert nichts.

Beispiele

Präsentation starten und per Button beenden

const request = new PresentationRequest(['/slides/receiver.html']);
let connection = null;

document.querySelector('#start').addEventListener('click', async () => {
  try {
    connection = await request.start();
    console.log('Präsentation läuft, ID:', connection.id);
  } catch (err) {
    console.error('Start fehlgeschlagen:', err.name);
  }
});

document.querySelector('#stop').addEventListener('click', () => {
  // Nur beenden, wenn die Verbindung aktiv ist
  if (connection && ['connected', 'connecting'].includes(connection.state)) {
    connection.terminate();
  }
});
Präsentation läuft, ID: 3f1c…

Auf das terminate-Ereignis reagieren und aufräumen

const setupConnection = (connection) => {
  connection.addEventListener('message', (e) => console.log('Empfangen:', e.data));

  connection.addEventListener('terminate', () => {
    console.log('Präsentation beendet, Zustand:', connection.state);
    localStorage.removeItem('presentationId');
    document.querySelector('#stop').disabled = true;
  });

  // Alternativ über die on-Property:
  // connection.onterminate = () => { ... };
};

const request = new PresentationRequest(['/slides/receiver.html']);
const connection = await request.start();
setupConnection(connection);
localStorage.setItem('presentationId', connection.id);

// Später: endgültig beenden
connection.terminate();
Präsentation beendet, Zustand: terminated

close() und terminate() im Vergleich

const request = new PresentationRequest(['/player/receiver.html']);
const connection = await request.start();

// Variante A: nur trennen, die Präsentation läuft weiter
connection.close();
const again = await request.reconnect(connection.id);
console.log('Wieder verbunden:', again.state);

// Variante B: endgültig beenden, reconnect() schlägt danach fehl
again.terminate();
try {
  await request.reconnect(again.id);
} catch (err) {
  console.log('Reconnect nicht möglich:', err.name);
}
Wieder verbunden: connected Reconnect nicht möglich: NotFoundError

Receiver-Seite beendet sich selbst

// Läuft in der Seite auf dem Zweitbildschirm (receiver.html)
const list = await navigator.presentation.receiver.connectionList;

const video = document.querySelector('video');
video.addEventListener('ended', () => {
  // Eine Verbindung genügt, der User-Agent beendet die gesamte Präsentation
  list.connections[0]?.terminate();
});

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Presentation API ist experimentell. Sie wird nur von Chromium-Browsern unterstützt, Firefox und Safari kennen sie nicht. Vorher per Feature-Erkennung prüfen, z. B. 'PresentationRequest' in window.
  • Sicherer Kontext: Die API steht nur über HTTPS (oder localhost) zur Verfügung.
  • Endgültig: Nach terminate() ist die Präsentation weg, reconnect() mit derselben ID schlägt fehl. Wer die Präsentation später fortsetzen will, nutzt close().
  • Kein Fehler, kein Promise: Ist die Verbindung bereits "closed" oder "terminated", bleibt der Aufruf ohne Wirkung. Es wird kein Fehler ausgelöst. Den Abschluss erkennt man nur über das Ereignis terminate.
  • Mehrere Controller: Das Ereignis terminate erreicht alle verbundenen Controller, auch andere Tabs oder Geräte. Deren Oberflächen sollten also darauf reagieren und z. B. gespeicherte Präsentations-IDs entfernen.
  • Beim Aufruf auf der Receiver-Seite schließt der User-Agent den Browsing-Kontext des Receivers. Code nach dem Aufruf läuft unter Umständen nicht mehr vollständig.