feat: WebRTC MVP to Blax standard (namespace, README, tests, scaffolding)
- Rename namespace BlaxSoftware\LaravelWebRtc -> Blax\WebRtc (house standard) +
update kernel imports to Blax\ReactPhpKernel
- README rewritten to the Blax OSS package principles: OSS banner, title+badges,
emoji feature list, quick start, wire shape, config, architecture, star history
- Add PHPUnit suite (8 tests / 18 assertions, green): SignalingHandler routing
(offer/ice/record/connect/bridge/close/error paths via a fake engine) +
NullMediaEngine behaviour
- Add pint.json (laravel preset, applied), composer scripts, .gitattributes,
test.sh (nix), CHANGELOG
- Verified end-to-end: composer install resolves blax-software/reactphp-kernel
from Forgejo VCS and the suite runs green on it
rel learn-atc #1055 #1051 #1019
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 11:28:49 +00:00
|
|
|
# Changelog
|
|
|
|
|
|
|
|
|
|
All notable changes to `blax-software/laravel-webrtc` are documented here. This
|
|
|
|
|
project adheres to [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
|
|
|
Blax Software's backward-compatibility guarantee.
|
|
|
|
|
|
|
|
|
|
## [Unreleased]
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
feat: full package — typed rooms (public/private/presence/open-presence) + call recording
Rooms
- Rooms\RoomType derived from the name prefix (like laravel-websockets channels):
public, private-* (authorized), presence-* (authorized + member list),
open-presence-* (public + member list). Room/RoomManager carry per-member info.
- Contracts\RoomAuthorizer + secure DefaultRoomAuthorizer (denies private/presence
until the host binds one). Presence rooms broadcast the member list + info.
Recording (store the FULL call audio, in PHP, today)
- Pure-P2P audio is DTLS-SRTP end-to-end, so the server can't capture it. Instead
the browser MediaRecords its mic and streams chunks over the WS as BINARY frames
(needs the new laravel-ws onBinary); RelaySignalingHandler appends them per
participant via a RecordingStore. Recording\FileRecordingStore -> <room>/<peer>.webm.
welcome/joined carry a record flag telling the client to stream.
- Contracts\CallEventListener call-log seam (peer/room/recording lifecycle) so calls
are auditable even when unrecorded.
Wiring
- RelaySignalingHandler(authorizer, recorder, events); webrtc:serve + provider +
config/webrtc.php (recording enabled/path/format, authorizer, events).
Tests 35/99 incl on-disk FileRecordingStore, presence member lists, auth gating,
binary recording+finalize+events, RoomType, and the real WS round-trip. README
documents room types + the browser MediaRecorder->WS recording flow.
rel learn-atc #1060 #1055 #1057 #1051
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 07:01:12 +00:00
|
|
|
- **Typed rooms** (`Rooms\RoomType`, derived from the room name prefix like
|
|
|
|
|
laravel-websockets channels): `public`, `private-*` (authorized),
|
|
|
|
|
`presence-*` (authorized + member list), `open-presence-*` (public + member
|
|
|
|
|
list). `Contracts\RoomAuthorizer` (+ secure `DefaultRoomAuthorizer` that denies
|
|
|
|
|
private/presence) gates the join; presence rooms broadcast the member list +
|
|
|
|
|
per-member `info`.
|
|
|
|
|
- **Full call recording**: `Contracts\RecordingStore` + `Recording\FileRecordingStore`.
|
|
|
|
|
The browser streams its mic to the server as binary WS frames; the relay appends
|
|
|
|
|
them per participant (`<room>/<peer>.webm`) and finalizes on leave/disconnect.
|
|
|
|
|
`welcome`/`joined` carry a `record` flag telling the client to stream.
|
|
|
|
|
- **Call-event log seam**: `Contracts\CallEventListener` (+ `NullCallEventListener`)
|
|
|
|
|
receives peer-connected / room-joined / room-left / recording-finalized /
|
|
|
|
|
peer-disconnected events, so calls can be logged/audited even when not recorded.
|
|
|
|
|
- `RelaySignalingHandler` now takes an authorizer, recorder and event listener;
|
|
|
|
|
`webrtc:serve` wires them from `config/webrtc.php` (`recording`, `authorizer`,
|
|
|
|
|
`events`).
|
|
|
|
|
- Suite grew to 35 / 99 assertions (room types, auth, presence, recording via the
|
|
|
|
|
in-memory + on-disk stores, events).
|
|
|
|
|
|
|
|
|
|
### Added (earlier)
|
|
|
|
|
|
2026-07-08 06:35:02 +00:00
|
|
|
- **Working browser-to-browser (P2P) MVP.** `Signaling\RelaySignalingHandler` (a
|
|
|
|
|
`blax-software/laravel-ws` `MessageHandler`) relays SDP/ICE between browsers so
|
|
|
|
|
they connect peer-to-peer — no server-side media engine required. Protocol:
|
|
|
|
|
`welcome` on connect, `join` → `joined` + `peer-joined`, targeted `relay`, room
|
|
|
|
|
`broadcast`, `leave`/disconnect → `peer-left`. Peers tracked in the kernel
|
|
|
|
|
`ConnectionRegistry`, membership in `RoomManager`.
|
|
|
|
|
- `webrtc:serve` now runs this relay over a `laravel-ws` WebSocketServer, so it is
|
|
|
|
|
browser-usable out of the box (`ws://host:port`).
|
|
|
|
|
- `require blax-software/laravel-ws`.
|
|
|
|
|
- Tests grew to 26 / 60 assertions, including a real WebSocket `welcome`
|
|
|
|
|
round-trip (browser → laravel-ws → relay).
|
|
|
|
|
|
|
|
|
|
### Added (earlier)
|
|
|
|
|
|
feat: WebRTC MVP to Blax standard (namespace, README, tests, scaffolding)
- Rename namespace BlaxSoftware\LaravelWebRtc -> Blax\WebRtc (house standard) +
update kernel imports to Blax\ReactPhpKernel
- README rewritten to the Blax OSS package principles: OSS banner, title+badges,
emoji feature list, quick start, wire shape, config, architecture, star history
- Add PHPUnit suite (8 tests / 18 assertions, green): SignalingHandler routing
(offer/ice/record/connect/bridge/close/error paths via a fake engine) +
NullMediaEngine behaviour
- Add pint.json (laravel preset, applied), composer scripts, .gitattributes,
test.sh (nix), CHANGELOG
- Verified end-to-end: composer install resolves blax-software/reactphp-kernel
from Forgejo VCS and the suite runs green on it
rel learn-atc #1055 #1051 #1019
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 11:28:49 +00:00
|
|
|
- `WebRtcServiceProvider` + `config/webrtc.php` + the `webrtc:serve` command
|
|
|
|
|
(boots signaling on the shared `blax-software/reactphp-kernel`).
|
|
|
|
|
- `Contracts\MediaEngine` — the pluggable media backend
|
|
|
|
|
(`offer`/`addIceCandidate`/`startRecording`/`stopRecording`/`connectPeers`/`bridge`/`close`).
|
|
|
|
|
- `Media\NullMediaEngine` — signaling-only engine for dev/tests.
|
|
|
|
|
- `Media\Str0mMediaEngine` — seam for the Rust media core (str0m via ext-php-rs);
|
|
|
|
|
throws until the `blax_webrtc` extension is built (see `rust/`).
|
|
|
|
|
- `Signaling\SignalingHandler` — transport-agnostic router from a signaling
|
|
|
|
|
message to the media engine.
|
|
|
|
|
- `Server\SignalingServer` — a minimal kernel-attached (newline-JSON) signaling
|
|
|
|
|
transport; browsers ride the `laravel-websockets` WS transport into the same
|
|
|
|
|
handler.
|
|
|
|
|
- `rust/` — the `blax_webrtc` crate scaffold (str0m + ext-php-rs) documenting the
|
|
|
|
|
media plan.
|
2026-07-07 11:54:36 +00:00
|
|
|
- `Rooms\Room` + `Rooms\RoomManager` and `join`/`leave` signaling for
|
|
|
|
|
party-to-party / group calls: a new joiner is auto-meshed with everyone already
|
|
|
|
|
in the room; `close` also leaves. Empty rooms are dropped.
|
|
|
|
|
- `SignalingServer::address()` — the bound listen address (for integration).
|
|
|
|
|
- A real socket round-trip test (offer→answer over a live TCP connection on the
|
|
|
|
|
kernel loop), plus RoomManager + join/leave coverage. Suite: 17 tests / 42
|
|
|
|
|
assertions.
|