laravel-webrtc/src/Contracts/RecordingStore.php

24 lines
743 B
PHP
Raw Normal View History

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
<?php
declare(strict_types=1);
namespace Blax\WebRtc\Contracts;
/**
* Where a call's audio is stored. The browser streams its mic to the server over
* the WebSocket as binary frames; the relay appends them here per participant and
* finalizes on leave/disconnect. Implement this to store to S3, a DB blob, etc.
*/
interface RecordingStore
{
/** Append a chunk of a participant's audio for a call. */
public function append(string $roomId, string $peerId, string $chunk): void;
/**
* Finish a participant's recording (they left / the call ended).
*
* @return string|null a locator (path/URL) for the finished recording, or null
*/
public function finalize(string $roomId, string $peerId): ?string;
}