Download the PHP package barivanlab/video-call-meet-laravel-webrtc without Composer
On this page you can find all versions of the php package barivanlab/video-call-meet-laravel-webrtc. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download barivanlab/video-call-meet-laravel-webrtc
More information about barivanlab/video-call-meet-laravel-webrtc
Files in barivanlab/video-call-meet-laravel-webrtc
Package video-call-meet-laravel-webrtc
Short Description Self-hosted, peer-to-peer video meetings for Laravel. Zero external services — WebRTC signaling runs entirely on your own cache. Ships with drop-in routes, Blade views and a framework-free WebRTC client.
License MIT
Homepage https://github.com/barivanlab/video-call-meet-laravel-webrtc
Informations about the package video-call-meet-laravel-webrtc
Video Call Meet — Laravel WebRTC
Self-hosted, peer-to-peer video meetings for Laravel — zero external services.
This package adds real-time video/audio calling to any Laravel 11/12/13 application. WebRTC signaling runs entirely on your own cache store, so you need no database, no Redis, no message broker and no third-party signaling provider. It ships with a drop-in web UI (Blade + vanilla JS/CSS) and a clean PHP API you can use to build your own interface.
- 🔒 Private by design — media is peer-to-peer (browser → browser); your server only relays tiny signaling messages and never sees the call.
- ⚡ Zero infrastructure — signaling state lives in Laravel's cache; works on plain PHP + a shared cache out of the box.
- 🎵 High-fidelity audio — a "music mode" disables echo cancellation / noise suppression and captures stereo 48 kHz Opus, ideal for lessons and live performance.
- 🎛️ Configurable quality — per-call video resolution (360p → 1080p) and bitrate, switchable live without reconnecting.
- 📦 Standard & convention-driven — PSR-4, auto-discovery, publishable config/views/
assets,
vendor:publish, and aMeetfacade.
Requirements
- PHP
^8.2 - Laravel
^11.0 || ^12.0 || ^13.0 - A cache store reachable by every worker (the default
file/arraycache works for a single server; userediswhen you run multiple web workers/nodes).
TURN for hard NATs: calls between devices on the same network (or behind a normal home router) connect using only STUN. To support restrictive/symmetric NATs you can point the package at your own TURN server (see Configuration).
Installation
Require the package via Composer — Laravel's package auto-discovery will register the
service provider and the Meet facade automatically:
Publish the assets
The bundled UI (CSS/JS) and the Blade views are not served from the package by default — publish them into your app so they live alongside your own assets:
After publishing, the client script and stylesheet are available at
/vendor/meet/js/meet.js and /vendor/meet/css/app.css.
Optional: TURN server
If you operate a TURN server (e.g. coturn), expose it through environment variables:
Leave them unset to use STUN-only (sufficient for most calls).
Usage
Once installed and published, the UI is immediately available:
| Action | URL |
|---|---|
| Landing page (join / new meeting) | /meet |
| Start a new meeting | /meet/create |
| Open a room | /meet/{room} |
Open /meet, type a room code (or click New meeting) and share the room URL. That's
it — no controllers, models or migrations to wire up.
Routes
| Method | URI | Purpose |
|---|---|---|
GET |
/meet |
Landing page |
GET |
/meet/create |
Create a room and redirect into it |
GET |
/meet/{room} |
Room page |
POST |
/api/meet/join |
Register a participant |
POST |
/api/meet/signal |
Send an SDP offer/answer, ICE candidate or media state |
GET |
/api/meet/poll |
Short-poll for messages addressed to you |
POST |
/api/meet/heartbeat |
Refresh presence |
POST |
/api/meet/leave |
Leave a room |
GET |
/api/meet/peers |
List current participants |
Everything is wrapped in the web middleware (so CSRF + session apply). The signaling
client sends the CSRF token on every POST.
Using the API directly (headless)
You can call the signaling service from your own code via the Meet facade or the
SignalingServiceContract binding:
The contract is available for dependency injection:
Configuration
All behaviour is driven by config/meet.php (published via --tag=meet-config):
| Key | Env var | Default | Description |
|---|---|---|---|
ice_servers |
MEET_TURN_URL, MEET_TURN_USERNAME, MEET_TURN_CREDENTIAL |
Google STUN | ICE servers offered to peers |
routes.enabled |
MEET_ROUTES_ENABLED |
true |
Set false to use the package as a pure library (no routes/views) |
routes.web_prefix |
MEET_WEB_PREFIX |
meet |
Prefix for the web UI |
routes.api_prefix |
MEET_API_PREFIX |
api/meet |
Prefix for the JSON signaling API |
cache_store |
MEET_CACHE_STORE |
null (app default) |
Cache store used for meeting state |
peer_timeout |
MEET_PEER_TIMEOUT |
20 |
Seconds without a heartbeat before a peer is evicted |
signal_ttl |
MEET_SIGNAL_TTL |
60 |
Seconds a signaling message is kept before GC |
lock_path |
MEET_LOCK_PATH |
storage/.../meet-locks |
Directory for advisory file locks |
Customizing the UI
The Blade views are published to resources/views/vendor/meet/ and use the meet::
namespace, so you can override them exactly like any Laravel vendor view. Edit
home.blade.php / room.blade.php, or point your own views at the same routes.
The client reads everything it needs from <meta> tags injected by the room view:
room— the room codecsrf-token— CSRF protectionpeer-name— the participant's display nameapi-base— the signaling API prefix (kept in sync withconfig('meet.routes.api_prefix'))ice-servers— the JSON-encoded ICE server list fromconfig('meet.ice_servers')
You only need to touch meet.js/app.css if you want to change the client behaviour or
styling — they are published under public/vendor/meet/.
How it works
- A participant
joins a room; the server stores their peer id + name in the cache and broadcasts apeer-joinedevent. - Each peer opens an
RTCPeerConnectionandPOSTs its SDP offer/answer and ICE candidates to/api/meet/signal. - Peers
GET/api/meet/pollevery ~400 ms to collect any messages addressed to them. pollalso refreshes presence; peers that stop heartbeating withinpeer_timeoutseconds are evicted and apeer-leftevent is broadcast.
Because each room's peer list is mutated behind an advisory file lock, the signaling state stays consistent even under PHP's single-threaded request model.
Testing
The package ships with a Pest + Orchestra Testbench suite:
License
Released under the MIT License.
All versions of video-call-meet-laravel-webrtc with dependencies
illuminate/cache Version ^11.0 || ^12.0 || ^13.0
illuminate/contracts Version ^11.0 || ^12.0 || ^13.0
illuminate/routing Version ^11.0 || ^12.0 || ^13.0
illuminate/support Version ^11.0 || ^12.0 || ^13.0