Allmine API
Live Stream

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 subscribe zorunlu değildir. Client sadece socket'e baglanarak mevcut event'leri dinlemeye devam eder.
  • Kullanıcıya ozel liveStreamReadyToStart event'i için subscribe gerekir. 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 unsubscribe gönderilir.
  • App foreground'a dondugunde socket yeniden baglanir ve token varsa tekrar subscribe gönderilir.
  • Event kacirilirsa upcoming/active stream REST state'i fallback olarak kontrol edilir.
  • Ayni eventId veya ayni streamId + status tekrar 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 client olmalidir.
  • 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:

  1. Subscribe olmadan /live-stream-status baglantisi kurulur ve global event'ler dinlenir.
  2. Login olmus host token ile subscribe olur ve zamani gelen DuoSelf için liveStreamReadyToStart alir.
  3. Login olmus guest token ile subscribe olur ve hedefe ulasmis DuoCrowd zamani geldiginde recipientRole: 'guest' alir.
  4. Subscribe olmayan anonim client liveStreamReadyToStart almaz ama global liveStreamPreparing alir.
  5. Hedefe ulasmamis DuoCrowd zamani geldiginde liveStreamExpired alınir, liveStreamReadyToStart alınmaz.
  6. Token gecersizse subscribeError gelir; global socket baglantisi yine acik kalir.

5) Rollout Notlari

  • Bu migration mevcut global status socket davranisini bozmaz.
  • Mobil ve web once event listesine liveStreamReadyToStart ekleyebilir, sonra auth hazir oldugunda subscribe ekleyebilir.
  • Eski client'lar subscribe göndermedigi için sadece yeni ready event'i alamaz; mevcut global event akisi etkilenmez.
  • Product karari liveStreamReadyToStart event'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.

On this page