SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
WebRTC+Websockety - Jak
stworzyłem aplikację do
kamerek internetowych w
Laravelu
Mateusz Garbarczyk
CTO w MirIT
mateuszg.programista@mirit.pl
Własne logo
Zdjęcie
Czym się dzisiaj zajmiemy?
● WebRTC - co to? Do czego służy?
● Websockety - dlaczego ich potrzebujemy?
Czym jest WebRTC
WebRTC (Web Real-Time Communication) – wolny (od wolności, a nie od
szybkości) i otwartoźródłowy projekt wbudowany w (nowoczesne)
przeglądarki internetowe jako część standardu HTML5 zaimplementowany
jako API javascriptowe.
Pozwala na komunikację typu peer-to-peer w czasie rzeczywistym między
przeglądarkami internetowymi.
Najczęściej służy do przesyłu audio i wideo, czyli grupowe czaty itp.
Największym plusem protokołu jest fakt, że nie wymaga instalacji żadnych
wtyczek czy innych aplikacji, wystarczy zaktualizowana przeglądarka
internetowa na komputerze lub smartfonie.
Jakie wyróżniamy sieci WebRTC
Wyróżniamy 3 rodzaje sieci dla połączeń WebRTC
● Mesh - który omawia dzisiejsza prezentacja
● SFU
● MCU
Grafika pochodzi z https://bloggeek.me
Kroki przy tworzeniu połączenia WebRTC
1. Signaling
2. Connecting
3. Securing
4. Communicating
Istotny szczegół - każdy krok musi zostać wykonany w 100% zanim
przejdziemy do kolejnego.
Zanim zaczniemy się łączyć - Websockety
Websocket - protokół zapewniający dwukierunkowy kanał wymiany danych między klientem
(przeglądarką) a serwerem. Zwykle używany przy chatach.
Przeglądarka łączy się z serwerem za pomocą zdefiniowanego kanału i nasłuchuje na wydarzenia
(eventy) emitowane przez serwer.
Dla Laravela możemy użyć kilku rozwiązań:
● Soketi (TypeScript) - substytut Pushera
● Pusher (rozwiązanie komercyjne)
● Socket.IO
● BeyondCode Laravel Websockets - substytut Pushera
● Ratchet
Przykładowy event w Laravelu
<?php
namespace AppEvents;
class CommentDeleted implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(
public CommentBroadcastResource $comment
) {
}
public function broadcastOn()
{
return new Channel('projects.'.$this->comment->project_id);
}
}
Przykładowy event w Laravelu
this.pusher = new Pusher(process.env.MIX_PUSHER_APP_KEY, {
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
encrypted: true,
wsPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT,
wssPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT,
wsHost: window.location.hostname,
enabledTransports: ['ws', 'wss'],
authEndpoint: '/broadcasting/auth',
auth: {
headers: {
'X-CSRF-Token': document.head.querySelector(
'meta[name="csrf-token"]'
).content
}
}
})
Przykładowy event w Laravelu
this.channel = this.pusher.subscribe(
'presence-session.' + this.session_id
)
this.channel.bind('comment-deleted', data =>
this.delete(JSON.parse(data.comment))
)
Powrót do WebRTC - Signalling
Kiedy już mamy skonstruowany protokół służący nam do szybkiej i dwustronnej komunikacji klient-serwer,
możemy przejść do punktu pierwszego nawiązywania połączenia WebRTC. Wspomniałem wcześniej, że
WebRTC to protokół komunikacji przeglądarka-przeglądarka, ale najpierw musimy je ze sobą jakoś
skontaktować, w tym celu posłużą nam Websockety.
Signalling - pierwszy i najważniejszy krok. W tym celu odsyłam przede wszystkim do
dokumentacji i hasła PERFECT NEGOTIATION.
Signalling w skrócie polega na tym, że za pomocą javascriptu “przejmujemy kontrolę” nad
lokalnymi mediami - mikrofon, kamerka, obraz, po czym przesyłamy wszelkie informacje o
nich do drugiej przeglądarki za pomocą Websocketów jako SDP (Session Description
Protocol).
Powrót do WebRTC - Signalling cd.
const signaling = new SignalingChannel(); // handles
JSON.stringify/parse
const constraints = {audio: true, video: true};
const configuration = {iceServers: [{urls: 'stun:stun.example.org'}]};
const pc = new RTCPeerConnection(configuration);
async function start() {
try {
const stream = await
navigator.mediaDevices.getUserMedia(constraints);
for (const track of stream.getTracks()) {
pc.addTrack(track, stream);
}
selfView.srcObject = stream;
} catch (err) {
console.error(err);
}
}
Powrót do WebRTC - Signalling cd.
let makingOffer = false;
let ignoreOffer = false;
let isSettingRemoteAnswerPending = false;
// let the "negotiationneeded" event trigger offer generation
pc.onnegotiationneeded = async () => {
try {
makingOffer = true;
await pc.setLocalDescription();
signaling.send({description: pc.localDescription});
} catch (err) {
console.error(err);
} finally {
makingOffer = false;
}
};
WebRTC - Connecting
Kolejnym krokiem jest wymiana informacji o możliwości połączenia się między przeglądarkami (adresy ip,
porty), w tym celu służą ICE (Interactive Connectivity Establishment) candidates. Zwykle nasze sieci mogą
stać za firewallami itd, co może skutecznie blokować połączenie. Dlatego polecam skonfigurować
dodatkowo ice servers (STUN/TURN). W internecie jest kilka darmowych, ale jeśli chcemy używać
WebRTC dla wzmożonego ruchu - warto zakupić własny.
Grafika pochodzi z
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity
Powrót do WebRTC - Perfect Negotiation
W prawdziwych warunkach nic nie jest idealne, może dojść do opóźnień lub zakleszczeń - obie
przeglądarki wyślą offer w tym samym momencie, dlatego warto zastosować design pattern zwany
Perfect Negotiation. Jest on o tyle dobry, że mamy jeden codebase, który wszystkim zarządza.
Pattern zakłada, że jedna przeglądarka występuje w roli polite, druga impolite - jak je podzielić zależy od
developera, u mnie decyduje o tym, kto pierwszy podłączył się do websocketów. Następnie obie
przeglądarki mogą do siebie wysyłać w tym samym czasie SDP i ICE, a jeśli dojdzie do zakleszczenia -
algorytm sam go rozwiąże - przeglądarka impolite zignoruje offer drugiej, jeśli sama go już wysłała.
Polecam wzorować się na tym przykładzie z samej dokumentacji na stronie
mozilli lub w3c.github.io - pozwala uniknąć błędów i frustracji.
WebRTC - Securing i Communicating
Krok securing odbywa się automatycznie i nie da się w niego zaingerować w żaden
sposób.
Communicating polega na przesyle obrazu/audio między połączonymi przeglądarkami w
obiektach MediaStream. W międzyczasie można do woli podmieniać źródła obrazu i
dźwięku - wtedy od nowa powinno się ustanowić połączenie, ale to zabezpiecza nam
perfect negotiation.
Tips & tricks
Żadne znane mi rozwiązanie związane z Websocketami nie oferowały prostego
przesyłu client eventu za pomocą websocketu zamiast requestu HTTP, jednak Laravel
Websockets po lekkim zmodyfikowaniu idealnie się do tego nadaje (jednak wymusza
to na nas forkowanie projektu i/lub nadpisywanie kilku klas i zatrzymanie wersji
paczki w composer.json).
Pytania?
mateuszg.programista@mirit.pl
Mateusz Garbarczyk
Własne logo

Contenu connexe

Similaire à WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Laravelu

PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimy
PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimyPLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimy
PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimyPROIDEA
 
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...PROIDEA
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wojciech Barczyński
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)infakt
 
Seminarium - Tworzenie Aplikacji Mobilnych 2004
Seminarium - Tworzenie Aplikacji Mobilnych 2004Seminarium - Tworzenie Aplikacji Mobilnych 2004
Seminarium - Tworzenie Aplikacji Mobilnych 2004Tomasz Cieplak
 
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...Michal Furmankiewicz
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowychTomasz Borowski
 
Space Wars Hack - Class #1
Space Wars Hack - Class #1Space Wars Hack - Class #1
Space Wars Hack - Class #1Piotr Pawlak
 
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Gawel Mikolajczyk
 
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert RosiakPLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert RosiakPROIDEA
 
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDG
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDGAplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDG
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDGJarek Sokolnicki
 
[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)Jaroslaw Sobel
 
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...PROIDEA
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 

Similaire à WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Laravelu (20)

PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimy
PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimyPLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimy
PLNOG 4: Przemysław Frasunek - CDN w Polsce - czyli jak my to robimy
 
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...
PLNOG23 - Bartosz Belter & dr hab. inż. Andrzej Bęben - Techniki przetwarzani...
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
Otwarta chmura Microsoft
Otwarta chmura MicrosoftOtwarta chmura Microsoft
Otwarta chmura Microsoft
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 
university day 1
university day 1university day 1
university day 1
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)
 
Usługi sieci internet cz iiii 2012
Usługi sieci internet cz iiii   2012Usługi sieci internet cz iiii   2012
Usługi sieci internet cz iiii 2012
 
Seminarium - Tworzenie Aplikacji Mobilnych 2004
Seminarium - Tworzenie Aplikacji Mobilnych 2004Seminarium - Tworzenie Aplikacji Mobilnych 2004
Seminarium - Tworzenie Aplikacji Mobilnych 2004
 
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Slicing a cake
Slicing a cakeSlicing a cake
Slicing a cake
 
Space Wars Hack - Class #1
Space Wars Hack - Class #1Space Wars Hack - Class #1
Space Wars Hack - Class #1
 
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
 
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert RosiakPLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
 
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDG
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDGAplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDG
Aplikacje i serwisy intranetowe w chmurze publicznej - transkrypt webinarium IDG
 
[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)
 
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 

Plus de Laravel Poland MeetUp

xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) Laravel Poland MeetUp
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentLaravel Poland MeetUp
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Laravel Poland MeetUp
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Laravel Poland MeetUp
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Laravel Poland MeetUp
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravel Poland MeetUp
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaLaravel Poland MeetUp
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Poland MeetUp
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Poland MeetUp
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelLaravel Poland MeetUp
 
Laravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Poland MeetUp
 

Plus de Laravel Poland MeetUp (20)

xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w Eloquent
 
Licencje otwartego oprogramowania
Licencje otwartego oprogramowaniaLicencje otwartego oprogramowania
Licencje otwartego oprogramowania
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
 
Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do Laravela
 
Walidacja w Laravelu
Walidacja w LaraveluWalidacja w Laravelu
Walidacja w Laravelu
 
(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2E
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?
 
Laravel Jobs i PHP8
Laravel Jobs i PHP8Laravel Jobs i PHP8
Laravel Jobs i PHP8
 
Wszystko o Laravel Livewire
Wszystko o Laravel Livewire Wszystko o Laravel Livewire
Wszystko o Laravel Livewire
 
Laravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFamiLaravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFami
 
Action-based Laravel
Action-based LaravelAction-based Laravel
Action-based Laravel
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
 
Laravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydach
 

WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Laravelu

  • 1. WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Laravelu
  • 2. Mateusz Garbarczyk CTO w MirIT mateuszg.programista@mirit.pl Własne logo Zdjęcie
  • 3. Czym się dzisiaj zajmiemy? ● WebRTC - co to? Do czego służy? ● Websockety - dlaczego ich potrzebujemy?
  • 4. Czym jest WebRTC WebRTC (Web Real-Time Communication) – wolny (od wolności, a nie od szybkości) i otwartoźródłowy projekt wbudowany w (nowoczesne) przeglądarki internetowe jako część standardu HTML5 zaimplementowany jako API javascriptowe. Pozwala na komunikację typu peer-to-peer w czasie rzeczywistym między przeglądarkami internetowymi. Najczęściej służy do przesyłu audio i wideo, czyli grupowe czaty itp. Największym plusem protokołu jest fakt, że nie wymaga instalacji żadnych wtyczek czy innych aplikacji, wystarczy zaktualizowana przeglądarka internetowa na komputerze lub smartfonie.
  • 5. Jakie wyróżniamy sieci WebRTC Wyróżniamy 3 rodzaje sieci dla połączeń WebRTC ● Mesh - który omawia dzisiejsza prezentacja ● SFU ● MCU Grafika pochodzi z https://bloggeek.me
  • 6. Kroki przy tworzeniu połączenia WebRTC 1. Signaling 2. Connecting 3. Securing 4. Communicating Istotny szczegół - każdy krok musi zostać wykonany w 100% zanim przejdziemy do kolejnego.
  • 7. Zanim zaczniemy się łączyć - Websockety Websocket - protokół zapewniający dwukierunkowy kanał wymiany danych między klientem (przeglądarką) a serwerem. Zwykle używany przy chatach. Przeglądarka łączy się z serwerem za pomocą zdefiniowanego kanału i nasłuchuje na wydarzenia (eventy) emitowane przez serwer. Dla Laravela możemy użyć kilku rozwiązań: ● Soketi (TypeScript) - substytut Pushera ● Pusher (rozwiązanie komercyjne) ● Socket.IO ● BeyondCode Laravel Websockets - substytut Pushera ● Ratchet
  • 8. Przykładowy event w Laravelu <?php namespace AppEvents; class CommentDeleted implements ShouldBroadcast { use Dispatchable, InteractsWithSockets, SerializesModels; public function __construct( public CommentBroadcastResource $comment ) { } public function broadcastOn() { return new Channel('projects.'.$this->comment->project_id); } }
  • 9. Przykładowy event w Laravelu this.pusher = new Pusher(process.env.MIX_PUSHER_APP_KEY, { cluster: process.env.MIX_PUSHER_APP_CLUSTER, encrypted: true, wsPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT, wssPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT, wsHost: window.location.hostname, enabledTransports: ['ws', 'wss'], authEndpoint: '/broadcasting/auth', auth: { headers: { 'X-CSRF-Token': document.head.querySelector( 'meta[name="csrf-token"]' ).content } } })
  • 10. Przykładowy event w Laravelu this.channel = this.pusher.subscribe( 'presence-session.' + this.session_id ) this.channel.bind('comment-deleted', data => this.delete(JSON.parse(data.comment)) )
  • 11. Powrót do WebRTC - Signalling Kiedy już mamy skonstruowany protokół służący nam do szybkiej i dwustronnej komunikacji klient-serwer, możemy przejść do punktu pierwszego nawiązywania połączenia WebRTC. Wspomniałem wcześniej, że WebRTC to protokół komunikacji przeglądarka-przeglądarka, ale najpierw musimy je ze sobą jakoś skontaktować, w tym celu posłużą nam Websockety. Signalling - pierwszy i najważniejszy krok. W tym celu odsyłam przede wszystkim do dokumentacji i hasła PERFECT NEGOTIATION. Signalling w skrócie polega na tym, że za pomocą javascriptu “przejmujemy kontrolę” nad lokalnymi mediami - mikrofon, kamerka, obraz, po czym przesyłamy wszelkie informacje o nich do drugiej przeglądarki za pomocą Websocketów jako SDP (Session Description Protocol).
  • 12. Powrót do WebRTC - Signalling cd. const signaling = new SignalingChannel(); // handles JSON.stringify/parse const constraints = {audio: true, video: true}; const configuration = {iceServers: [{urls: 'stun:stun.example.org'}]}; const pc = new RTCPeerConnection(configuration); async function start() { try { const stream = await navigator.mediaDevices.getUserMedia(constraints); for (const track of stream.getTracks()) { pc.addTrack(track, stream); } selfView.srcObject = stream; } catch (err) { console.error(err); } }
  • 13. Powrót do WebRTC - Signalling cd. let makingOffer = false; let ignoreOffer = false; let isSettingRemoteAnswerPending = false; // let the "negotiationneeded" event trigger offer generation pc.onnegotiationneeded = async () => { try { makingOffer = true; await pc.setLocalDescription(); signaling.send({description: pc.localDescription}); } catch (err) { console.error(err); } finally { makingOffer = false; } };
  • 14. WebRTC - Connecting Kolejnym krokiem jest wymiana informacji o możliwości połączenia się między przeglądarkami (adresy ip, porty), w tym celu służą ICE (Interactive Connectivity Establishment) candidates. Zwykle nasze sieci mogą stać za firewallami itd, co może skutecznie blokować połączenie. Dlatego polecam skonfigurować dodatkowo ice servers (STUN/TURN). W internecie jest kilka darmowych, ale jeśli chcemy używać WebRTC dla wzmożonego ruchu - warto zakupić własny. Grafika pochodzi z https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity
  • 15. Powrót do WebRTC - Perfect Negotiation W prawdziwych warunkach nic nie jest idealne, może dojść do opóźnień lub zakleszczeń - obie przeglądarki wyślą offer w tym samym momencie, dlatego warto zastosować design pattern zwany Perfect Negotiation. Jest on o tyle dobry, że mamy jeden codebase, który wszystkim zarządza. Pattern zakłada, że jedna przeglądarka występuje w roli polite, druga impolite - jak je podzielić zależy od developera, u mnie decyduje o tym, kto pierwszy podłączył się do websocketów. Następnie obie przeglądarki mogą do siebie wysyłać w tym samym czasie SDP i ICE, a jeśli dojdzie do zakleszczenia - algorytm sam go rozwiąże - przeglądarka impolite zignoruje offer drugiej, jeśli sama go już wysłała. Polecam wzorować się na tym przykładzie z samej dokumentacji na stronie mozilli lub w3c.github.io - pozwala uniknąć błędów i frustracji.
  • 16. WebRTC - Securing i Communicating Krok securing odbywa się automatycznie i nie da się w niego zaingerować w żaden sposób. Communicating polega na przesyle obrazu/audio między połączonymi przeglądarkami w obiektach MediaStream. W międzyczasie można do woli podmieniać źródła obrazu i dźwięku - wtedy od nowa powinno się ustanowić połączenie, ale to zabezpiecza nam perfect negotiation.
  • 17. Tips & tricks Żadne znane mi rozwiązanie związane z Websocketami nie oferowały prostego przesyłu client eventu za pomocą websocketu zamiast requestu HTTP, jednak Laravel Websockets po lekkim zmodyfikowaniu idealnie się do tego nadaje (jednak wymusza to na nas forkowanie projektu i/lub nadpisywanie kilku klas i zatrzymanie wersji paczki w composer.json).