Live Stream ready to start — client migration
liveStreamReadyToStart socket event entegrasyonu
Live Stream Ready-To-Start Client Migration
Migration rehberi
Yapılandırma sırası için Migration şablonu. Yeni düzenlemelerde Amaç → Önkoşullar → Endpoint → Request/Response → Hata kodları → Client adımları → İlgili sayfalar bölümlerini tercih edin.
Bu doküman, liveStreamReadyToStart event'inin mobil ve web istemcilerine entegrasyonu için migration adimlarini anlatır.
1) Backend Socket Kontrati
- Namespace:
/live-stream-status - Global event'ler için
subscribezorunlu değildir. Client sadece socket'e baglanarak mevcut event'leri dinlemeye devam eder. - Kullanıcıya ozel
liveStreamReadyToStartevent'i içinsubscribegerekir. Bu event sadece host/guest kullanıcı odasina gönderilir.
Mevcut global event'ler:
type GlobalLiveStreamStatusEvent =
| 'liveStreamScheduled'
| 'liveStreamPreparing'
| 'liveStreamStarted'
| 'liveStreamEnded'
| 'liveStreamExpired'
| 'liveStreamCancelled'
| 'liveStreamFundingProgress'
| 'liveStreamFundingGoalReached';Yeni kullanıcıya ozel event:
type LiveStreamReadyToStartEventName = 'liveStreamReadyToStart';Payload:
type LiveStreamReadyToStartEvent = {
eventId: string;
streamId: string;
occurredAt: string;
previousStatus: 'scheduled';
status: 'preparing';
recipientRole: 'host' | 'guest';
readyToStart: true;
summary: {
title: string | null;
liveStreamType: 'duocrowd' | 'duoself' | 'solo' | null;
accessType: 'free' | 'paid' | null;
plannedStartDate: string | null;
startedAt: string | null;
endedAt: string | null;
fundingGoal: number | null;
collectedFunding: number | null;
fundingPercentage: number | null;
};
};Tetiklenme kosullari:
- DuoCrowd: yayin zamani geldi ve
collectedFunding >= fundingGoal. - DuoSelf: yayin zamani geldi.
- Solo yayinlar, hedefe ulasmamis DuoCrowd yayinlar, timeout ile expire olan yayinlar ve concurrent update no-op durumlari bu event'i uretmez.
2) React Native Migration
2.1 Event listesine yeni event'i ekleyin
Mevcut /live-stream-status socket servisindeki event listesine liveStreamReadyToStart eklenmelidir.
const LIVE_STREAM_STATUS_EVENTS = [
'liveStreamScheduled',
'liveStreamPreparing',
'liveStreamStarted',
'liveStreamEnded',
'liveStreamExpired',
'liveStreamCancelled',
'liveStreamFundingProgress',
'liveStreamFundingGoalReached',
'liveStreamReadyToStart',
] as const;2.2 Socket baglantisini subscribe olmadan calismaya devam ettirin
Global event'lerin calismasi için client tarafında zorunlu bir değişiklik yoktur.
const socket = io(`${baseUrl.replace(/\/$/, '')}/live-stream-status`, {
transports: ['websocket', 'polling'],
reconnection: true,
});
socket.on('liveStreamPreparing', handleGlobalPreparing);
socket.on('liveStreamStarted', handleGlobalStarted);2.3 Kullanıcıya ozel ready event için token ile subscribe edin
liveStreamReadyToStart almak isteyen login olmus kullanıcı, socket connect olduktan sonra token ile abone olmalidir.
socket.on('connect', () => {
if (accessToken) {
socket.emit('subscribe', { token: accessToken });
}
});
socket.on('subscribeSuccess', ({ userId, room }) => {
console.log('live-stream-status subscribed', userId, room);
});
socket.on('subscribeError', ({ code, message }) => {
console.log('live-stream-status subscribe error', code, message);
});Token refresh oldugunda eski socket'i disconnect edip yeni token ile yeniden baglanmak en temiz yaklasimdir. Alternatif olarak ayni socket uzerinden tekrar subscribe gönderilebilir; backend socket'i yeni kullanıcı odasina tasir.
2.4 Ready event handler ekleyin
socket.on('liveStreamReadyToStart', (event: LiveStreamReadyToStartEvent) => {
if (!event.readyToStart) return;
if (event.recipientRole === 'host') {
navigate('LiveStreamEntry', {
streamId: event.streamId,
role: 'host',
});
return;
}
navigate('LiveStreamEntry', {
streamId: event.streamId,
role: 'guest',
});
});2.5 Mobil kabul kriterleri
- Logout veya token temizlenmesinde socket disconnect edilir ya da
unsubscribegönderilir. - App foreground'a dondugunde socket yeniden baglanir ve token varsa tekrar
subscribegönderilir. - Event kacirilirsa upcoming/active stream REST state'i fallback olarak kontrol edilir.
- Ayni
eventIdveya aynistreamId + statustekrar gelirse UI tekrar tekrar navigate etmez.
3) Web / Next.js Migration
3.1 Socket kodunu client-only tutun
Next.js App Router tarafında socket kodu sadece client component veya client hook içinde calismalidir.
'use client';
import { useEffect } from 'react';
import { io, Socket } from 'socket.io-client';
export function useLiveStreamStatusSocket({
baseUrl,
accessToken,
onReadyToStart,
}: {
baseUrl: string;
accessToken?: string | null;
onReadyToStart: (event: LiveStreamReadyToStartEvent) => void;
}) {
useEffect(() => {
const socket: Socket = io(`${baseUrl.replace(/\/$/, '')}/live-stream-status`, {
transports: ['websocket', 'polling'],
reconnection: true,
});
socket.on('connect', () => {
if (accessToken) {
socket.emit('subscribe', { token: accessToken });
}
});
socket.on('liveStreamReadyToStart', onReadyToStart);
return () => {
socket.off('liveStreamReadyToStart', onReadyToStart);
socket.emit('unsubscribe');
socket.disconnect();
};
}, [baseUrl, accessToken, onReadyToStart]);
}3.2 Global event listener'lari bozmayin
Web tarafında mevcut global status listener'lari aynen kalabilir. subscribe sadece hedefli ready event için eklenir.
socket.on('liveStreamFundingProgress', handleFundingProgress);
socket.on('liveStreamFundingGoalReached', handleGoalReached);
socket.on('liveStreamPreparing', handlePreparing);3.3 Ready event ile yonlendirme
const onReadyToStart = (event: LiveStreamReadyToStartEvent) => {
const role = event.recipientRole;
router.push(`/live-stream/${event.streamId}/entry?role=${role}`);
};3.4 Web kabul kriterleri
- Socket kurulumu SSR'da calismaz; hook/component
use clientolmalidir. - Access token yoksa global event'ler yine calismalidir.
- Access token geldikten sonra socket subscribe olmalidir.
- Token değişirse hook yeniden calisir ve yeni token ile subscribe olur.
- Ready event duplicate gelirse ayni route'a tekrar push edilmez.
4) Test Senaryolari
Mobil ve web tarafında manuel veya e2e testlerde su senaryolar dogrulanmalidir:
- Subscribe olmadan
/live-stream-statusbaglantisi kurulur ve global event'ler dinlenir. - Login olmus host token ile
subscribeolur ve zamani gelen DuoSelf içinliveStreamReadyToStartalir. - Login olmus guest token ile
subscribeolur ve hedefe ulasmis DuoCrowd zamani geldiginderecipientRole: 'guest'alir. - Subscribe olmayan anonim client
liveStreamReadyToStartalmaz ama globalliveStreamPreparingalir. - Hedefe ulasmamis DuoCrowd zamani geldiginde
liveStreamExpiredalınir,liveStreamReadyToStartalınmaz. - Token gecersizse
subscribeErrorgelir; global socket baglantisi yine acik kalir.
5) Rollout Notlari
- Bu migration mevcut global status socket davranisini bozmaz.
- Mobil ve web once event listesine
liveStreamReadyToStartekleyebilir, sonra auth hazir oldugundasubscribeekleyebilir. - Eski client'lar
subscribegöndermedigi için sadece yeni ready event'i alamaz; mevcut global event akisi etkilenmez. - Product karari
liveStreamReadyToStartevent'inin de herkese global gitmesi yonunde değişirse backend tarafında ayrica global emit eklenmelidir. Mevcut kontratta ready event hedefli host/guest event'idir.