Files
ratebubble/doc/socket-events.md
2026-02-28 02:44:41 +03:00

4.6 KiB
Raw Permalink Blame History

Netflix Scraper API - Socket.IO Events

Bağlantı

URL

ws://localhost:3000

Transport

  • WebSocket
  • Polling (fallback)

Client → Server Events

job:subscribe

Bir job'ın güncellemelerine abone ol.

Payload:

jobId: string

Örnek:

socket.emit('job:subscribe', '550e8400-e29b-41d4-a716-446655440000');

job:unsubscribe

Job aboneliğini iptal et.

Payload:

jobId: string

Örnek:

socket.emit('job:unsubscribe', '550e8400-e29b-41d4-a716-446655440000');

Server → Client Events

job:progress

Job ilerleme durumu güncellendiğinde gönderilir.

Payload:

{
  jobId: string;
  progress: number;    // 0-100 arası
  status: string;      // "pending" | "processing" | "completed" | "failed"
  step: string;        // Mevcut adım açıklaması
}

Örnek:

{
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "progress": 50,
  "status": "processing",
  "step": "Scraping Netflix"
}

Adımlar:

Step Progress ıklama
created 0 Job oluşturuldu
checking_cache 10 Cache kontrol ediliyor
checking_database 30 Database kontrol ediliyor
scraping_netflix 50 Netflix'ten veri çekiliyor
saving_to_database 80 Veritabanına kaydediliyor
completed 100 İşlem tamamlandı

job:completed

Job başarıyla tamamlandığında gönderilir.

Payload:

{
  jobId: string;
  data: GetInfoResponse;
  source: "cache" | "database" | "netflix";
}

Örnek:

{
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "data": {
    "title": "Hayata Röveşata Çeken Adam",
    "year": 2022,
    "plot": "...",
    "genres": ["18+", "Komedi"],
    "cast": ["Tom Hanks", "Mariana Treviño", "Rachel Keller"],
    "backdrop": "https://..."
  },
  "source": "netflix"
}

job:error

Job sırasında hata oluştuğunda gönderilir.

Payload:

{
  jobId: string;
  error: {
    code: string;
    message: string;
  }
}

Örnek:

{
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "error": {
    "code": "SCRAPE_ERROR",
    "message": "Failed to fetch Netflix page: 403"
  }
}

Kullanım Örneği

JavaScript (Browser)

import { io } from 'socket.io-client';

// Bağlan
const socket = io('http://localhost:3000');

// Bağlantı başarılı
socket.on('connect', () => {
  console.log('Connected:', socket.id);
});

// Job oluştur (API üzerinden)
const response = await fetch('http://localhost:3000/api/getinfo/async', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'your-api-key'
  },
  body: JSON.stringify({
    url: 'https://www.netflix.com/tr/title/81616256'
  })
});

const { data: { jobId } } = await response.json();

// Job'a abone ol
socket.emit('job:subscribe', jobId);

// İlerleme dinle
socket.on('job:progress', (data) => {
  console.log(`Progress: ${data.progress}% - ${data.step}`);
});

// Tamamlanma dinle
socket.on('job:completed', (data) => {
  console.log('Completed:', data.data);
  socket.emit('job:unsubscribe', jobId);
});

// Hata dinle
socket.on('job:error', (data) => {
  console.error('Error:', data.error);
});

React Hook

import { useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';

interface JobProgress {
  jobId: string;
  progress: number;
  status: string;
  step: string;
}

export function useJobProgress(jobId: string | null) {
  const [progress, setProgress] = useState<JobProgress | null>(null);
  const [data, setData] = useState<any>(null);
  const [error, setError] = useState<any>(null);

  useEffect(() => {
    if (!jobId) return;

    const socket = io('http://localhost:3000');

    socket.emit('job:subscribe', jobId);

    socket.on('job:progress', setProgress);
    socket.on('job:completed', (result) => {
      setData(result.data);
      socket.emit('job:unsubscribe', jobId);
    });
    socket.on('job:error', (err) => {
      setError(err.error);
      socket.emit('job:unsubscribe', jobId);
    });

    return () => {
      socket.emit('job:unsubscribe', jobId);
      socket.disconnect();
    };
  }, [jobId]);

  return { progress, data, error };
}

CORS Yapılandırması

Production'da CORS ayarlarını yapılandırın:

// src/config/socket.ts
io = new Server(httpServer, {
  cors: {
    origin: ['https://yourdomain.com', 'https://admin.yourdomain.com'],
    methods: ['GET', 'POST'],
    credentials: true,
  },
});