// Dauerbetrieb mit erfundenen Ereignissen: erfundener Chat und alle paar // Sekunden eine Einblendung. // // Fuer `abdulive overlay --demo` und fuer den Knopf "Vorfuehrung" auf der // Uebersichtsseite. Die einzelnen Ereignisse kommen aus test-events.ts - die // Knoepfe und der Dauerbetrieb sollen dasselbe zeigen. import { logger } from '#core/logger.ts'; import type { Bus } from './bus.ts'; import { testEvent, zufall, type TestArt } from './test-events.ts'; const log = logger('overlay:demo'); const ALARME: TestArt[] = ['sub', 'resub', 'subgift', 'massgift', 'raid', 'cheer', 'first']; const NACHRICHTEN: TestArt[] = ['chat', 'chat', 'chat', 'chat-emote', 'chat-emote', 'chat-erstmals']; /** * Speist den Bus, bis `signal` abbricht. * * Der Stream-Zustand wird mitgesetzt, damit Statusleiste und Pausenbild etwas * zu zeigen haben. Genau deshalb darf das nicht laufen, waehrend ein echter * Stream laeuft - der Aufrufer prueft das. */ export function startDemo(bus: Bus, signal: AbortSignal): void { log.info('Vorfuehrmodus: erfundener Chat und alle paar Sekunden eine Einblendung'); let viewers = 17; const seit = new Date(Date.now() - 74 * 60_000).toISOString(); const stand = (): void => { viewers = Math.max(3, viewers + Math.round((Math.random() - 0.45) * 4)); bus.publish({ kind: 'stream', live: true, title: 'Elden Ring, aber nur mit Fäusten - Tag 3', category: 'Elden Ring', viewers, startedAt: seit, }); }; stand(); const sende = (art: TestArt): void => { const ev = testEvent(art); if (ev) bus.publish(ev); }; const chat = setInterval(() => sende(zufall(NACHRICHTEN)), 1400); const alarm = setInterval(() => sende(zufall(ALARME)), 9000); const puls = setInterval(stand, 20_000); // Ab und zu eine Chat-Spitze, damit der Emote-Regen auch mal laeuft. const spitze = setInterval(() => sende('hype'), 31_000); signal.addEventListener('abort', () => { clearInterval(chat); clearInterval(alarm); clearInterval(puls); clearInterval(spitze); log.info('Vorfuehrmodus beendet'); }, { once: true }); }