მთავარ კონტენტზე გადასვლა

განყოფილება

ტექნოლოგია

რეალური Dueli-ს ტექნოლოგიური სტეკი ორ შრედ: მარტივი ენით ახსნა და ინჟინერული ხედი.

ეს გვერდი ხსნის ტექნოლოგიებს, რომლებსაც Dueli რეალურად იყენებს, ორ შრედ: მარტივი ენის ხედს ყველასთვის და ინჟინერულ ხედს სპეციალისტებისთვის. ტექნოლოგია სიაში არ შედის, თუ მიმდინარე კოდი არ იყენებს.

მარტივად რომ ვთქვათ

Dueli ბრაუზერში მუშაობს Cloudflare-ის გლობალურ ქსელზე. ორი მონაწილე პირდაპირ ვიდეოზარით ხვდება ერთმანეთს საკუთარი მოწყობილობებიდან (WebRTC peer-to-peer); როცა ქსელი პირდაპირ გზას ბლოკავს, TURN რელე კავშირს გზას უხსნის.

კონკურსის დროს ბრაუზერი ორივე კამერის სურათს ერთ კადრში აერთიანებს და მოკლე, 5-წამიან ნაწილებად იწერს. ნაწილები წარმოქმნისასვე იტვირთება, თანმიმდევრობით იკვრება და მატჩის დასრულების შემდეგ სრულ ჩანაწერად იკრიბება.

ჩაწერილი კონკურსები MP4 ფაილად ჩამოიტვირთება. როცა ჩანაწერს გადაქცევა სჭირდება, გადაქცევა სტუმრის ბრაუზერშივე სრულდება FFmpeg.wasm-ით, ამიტომ ფაილი გარე გადამქმნელ სერვისს არ გადაეცემა.

პლატფორმის მონაცემები D1-ში ცხოვრობს, გვერდები და API-ები Hono-სა და TypeScript-ზეა აწყობილი Cloudflare-ზე, ინტერფეისი კი Tailwind CSS-ს იყენებს. პირდაპირი განახლებები SSE-ით და პოლინგით მოდის.

ინჟინრებისთვის

გამშვები გარემო: Cloudflare Pages/Workers Hono 4-ით TypeScript-ზე. D1 (SQLite) არის მონაცემთა ბაზა. Vite Worker-ის ბანდლს აწყობს, Tailwind CSS 4 ინტერფეისს ასტილავს, esbuild კი ბრაუზერის შესასვლელ წერტილებს აბანდლავს.

პირდაპირი მედია: ბრაუზერის RTCPeerConnection ატარებს WebRTC-ს მასპინძელსა და მოწინააღმდეგეს შორის. ICE სერვერები თითო სესიაზე გაიცემა GET /api/signaling/ice-servers-იდან; რელედ შეიძლება Cloudflare Calls TURN (TURN_TOKEN_ID და TURN_API_TOKEN) ან საკუთარ სერვერზე განთავსებული coturn (TURN_URL და TURN_SECRET), ხოლო როცა არცერთი არ არის დაყენებული, მუშაობს მხოლოდ STUN-იანი სათადარიგო.

ჩაწერა: canvas კომპოზიტორი ორივე სურათს ხატავს, MediaRecorder კი ყოველ 5 წამში ნაწილს გამოსცემს. მასპინძელი თითო ნაწილს რეგისტრირებს POST /api/chunks/register-ზე (ხანმოკლე, ერთჯერადი გასაღები, რომელიც კონკურსს, თანმიმდევრობასა და ბაიტების ზღვარსაა მიბმული), ტვირთავს მას, გადაამოწმებს GET /verify-ით და შედეგს POST /receipt-ზე ახსენებს. დაკვრა კითხულობს GET /api/chunks/playlist/:id-ს, ხოლო არსებული საბოლოო ნაბიჯი სრულ ვიდეოჩანაწერს (VOD) ქმნის.

ჩამოტვირთვები: @ffmpeg/core 0.12.10 საკუთარ სერვერზე განთავსებულ ბრაუზერულ ვორკერში მუშაობს MP4-ზე გადასაქცევად, სტრუქტურული remux გზით იმ ჩანაწერებისთვის, რომლებიც უკვე MP4-თავსებადია. პროგრესსა და მეხსიერების ზღვრებს კლიენტის სერვისი მართავს.

რეალურ დროში: SSE GET /api/sse-ით პირდაპირ განახლებებს ატარებს, სიგნალიზაცია კი HTTP პოლინგს იყენებს; სამუშაო ვერსიის გზა WebSocket-ს არ იყენებს.

ხარისხი: Vitest ერთეულ ტესტებსა და UI კონტრაქტებს ფარავს, Playwright კი ბრაუზერულ ნაკადებს დასაწყისიდან ბოლომდე. Markdown დოკუმენტები marked-ით იხატება, PostCSS კი Autoprefixer-თან ერთად CSS კონვეიერს ასრულებს.

სტეკი ამ რეპოზიტორიაში

  • Cloudflare Pages / Workers ჰოსტინგი და სერვერული გამშვები გარემო
  • Cloudflare D1 (SQLite) აპლიკაციის მონაცემთა ბაზა
  • Hono 4 HTTP მარშრუტები, გვერდები და API
  • TypeScript 5 ტიპიზებული წყაროს კოდი სერვერისა და კლიენტისთვის
  • Tailwind CSS 4 + PostCSS + Autoprefixer ინტერფეისის სტილიზაცია და CSS კონვეიერი
  • Vite 7 + esbuild Worker-ის ბანდლი და ბრაუზერის შესასვლელი წერტილები
  • WebRTC (RTCPeerConnection) + TURN/STUN პირდაპირი აუდიო და ვიდეო მონაწილეებს შორის
  • Canvas კომპოზიტორი + MediaRecorder 5-წამიანი ჩაწერილი ნაწილები ბრაუზერში
  • FFmpeg.wasm (@ffmpeg/core 0.12.10) ბრაუზერშივე MP4-ზე გადაქცევა და ჩამოტვირთვა
  • marked 17 Markdown-ის რენდერი მართვადი დოკუმენტებისთვის
  • Vitest 5 ერთეულოვანი და UI ტესტების პაკეტი
  • Playwright ბრაუზერული ტესტები დასაწყისიდან ბოლომდე
  • Wrangler 4 Cloudflare-ის განვითარებისა და განლაგების ხელსაწყოები
  • SSE + HTTP პოლინგი პირდაპირი განახლებები მედიის გზის გარეთ

სია შემოიფარგლება იმით, რასაც package.json და რეპოზიტორია რეალურად შეიცავს. ეს ტექნიკური აღწერაა და არა პარტნიორობის ან მხარდაჭერის განცხადება.

სახელმძღვანელოს ცენტრში დაბრუნება