Commit Graph

7 Commits

Author SHA1 Message Date
Blax Software fa0908eb99 chore: verify Forgejo->Packagist webhook after queue recovery
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 11:55:19 +02:00
Blax Software 9c791a8bba feat: transport-agnostic domain layer — run the relay on any WebSocket
Rooms / recording / realtime bridge no longer require the bundled ReactPHP
server, so a host (e.g. a fork-per-message Laravel WS) can consume the package
on its own transport:

- RoomStore contract + ArrayRoomStore; RoomManager takes a store so membership
  can be Cache/Redis-backed and survive across workers
- Realtime\OpenAiRealtimeBridge (+ RealtimeTransport / TextalkRealtimeTransport /
  RealtimeTurn): the OpenAI GA realtime WS mechanism, turn-based, unit-tested via
  a scripted transport
- Support\Audio (PCM16 -> WAV); RecordingStore::discard()
- provider binds RoomStore/RoomManager/RecordingStore/OpenAiRealtimeBridge and
  guards webrtc:serve behind class_exists(laravel-ws + reactphp-kernel)
- laravel-ws + reactphp-kernel + react/* -> require-dev; runtime needs only
  illuminate + textalk/websocket
- 40 tests green

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 11:22:53 +02:00
Blax Software 1be40ba59c 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 09:01:12 +02:00
Blax Software 028eaadaa8 feat: working browser-to-browser (P2P) MVP via WebSocket signaling relay
The key insight: a 2-party / small-mesh call needs NO server-side media — the
server only relays SDP/ICE and the browsers connect peer-to-peer. So the webrtc
package now has a genuinely working call MVP with no Rust/media engine.

- Signaling\RelaySignalingHandler: a blax-software/laravel-ws MessageHandler that
  relays between browsers — welcome/join/joined/peer-joined/relay/broadcast/
  peer-left. Peers in the kernel ConnectionRegistry, rooms in RoomManager.
- webrtc:serve now runs the relay over a laravel-ws WebSocketServer (browser-usable
  ws://). require blax-software/laravel-ws.
- The engine-backed path (SignalingHandler/SignalingServer + MediaEngine) stays
  for server-terminated media (recording/AI-bridge/SFU, Str0m = #1051).
- Tests 26 / 60 incl a REAL WebSocket welcome round-trip (browser->laravel-ws->relay);
  verified with laravel-ws + reactphp-kernel resolved from Forgejo. README leads
  with the browser P2P quickstart + JS example.

rel learn-atc #1055 #1051 #1019

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 08:35:02 +02:00
Blax Software 1479e36f49 feat: multi-party rooms + real socket round-trip test
- Rooms\Room + Rooms\RoomManager: track peers per room, auto-mesh a new joiner
  with everyone already there, drop empty rooms
- SignalingHandler: join/leave message types (auto-connectPeers on join), and
  close now also leaves the room; expose rooms()
- SignalingServer::address() for the bound listen address
- Tests: real offer->answer round-trip over a live TCP socket on the kernel loop,
  RoomManager + join/leave/close coverage. Suite: 17 tests / 42 assertions
- Verified on the updated reactphp-kernel (logging + registry)

rel learn-atc #1055 #1051 #1019

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 13:54:36 +02:00
Blax Software ac5d89111e 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 13:28:49 +02:00
Blax Software 4d79aee2cc feat: initial laravel-webrtc scaffold on the reactphp-kernel
WebRTC for Laravel on blax-software/reactphp-kernel. PHP owns signaling +
orchestration; a pluggable MediaEngine owns real-time media, with the production
engine backed by a Rust core (str0m via ext-php-rs) so PHP never runs per-20ms DSP.

- WebRtcServiceProvider + config/webrtc.php + webrtc:serve command
- Contracts\MediaEngine (offer/ice/record/connect/bridge/close)
- Media\NullMediaEngine (signaling-only) + Media\Str0mMediaEngine (Rust seam)
- Signaling\SignalingHandler (transport-agnostic) + Server\SignalingServer (on the kernel)
- rust/ crate stub (blax_webrtc: str0m + ext-php-rs) documenting the media plan

Enables: server-side record/intercept, provider-hidden AI-realtime bridging,
and party-to-party/group calls. rel learn-atc #1055 #1051 #1019

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 13:07:59 +02:00