diff --git a/.planning/phases/20-demo-instance-with-every-shared-plugin/COVERAGE.md b/.planning/phases/20-demo-instance-with-every-shared-plugin/COVERAGE.md new file mode 100644 index 00000000..7e4d2d00 --- /dev/null +++ b/.planning/phases/20-demo-instance-with-every-shared-plugin/COVERAGE.md @@ -0,0 +1,72 @@ +# API Coverage — Phase 20 (livekit-client, LiveKit server, Centrifugo, Web Push) + +> Full coverage by default. Opt-outs are explicit, reasoned decisions. The phase builds no new server-side client: LiveKit's server API is called by `sm-chatvideo-plugin` (server-sdk-go), Centrifugo by `lighthouse`, Web Push by `sm-herald-plugin`. This phase adds the browser side of the video calls (`vue-chatvideo-layer` on `livekit-client` 2.23.0, plan 04), the chat's use of Centrifugo (`vue-chat-layer`, plan 03) and herald's VAPID configuration (plan 04). + +## livekit-client 2.23.0 (plan 04, vue-chatvideo-layer) + +| capability | decision | reason | +|---|---|---| +| Room connect (livekit_url and the server-minted join token) | INTEGRATE | | +| Room disconnect (stops the local tracks) | INTEGRATE | | +| publish camera (localParticipant.setCameraEnabled) | INTEGRATE | | +| publish microphone (localParticipant.setMicrophoneEnabled) | INTEGRATE | | +| subscribe and attach remote tracks (TrackSubscribed, track.attach and detach) | INTEGRATE | | +| mute and unmute | INTEGRATE | | +| camera toggle | INTEGRATE | | +| participant events (ParticipantConnected, ParticipantDisconnected, TrackMuted, TrackUnmuted, LocalTrackPublished) | INTEGRATE | | +| connection state and reconnection (Reconnecting, Reconnected, Disconnected) | INTEGRATE | | +| adaptiveStream and dynacast | INTEGRATE | | +| audio playback unlock (AudioPlaybackStatusChanged, startAudio) | INTEGRATE | | +| dynamic import of the package | INTEGRATE | | +| screen share | OPT-OUT | explicitly out of scope: D-13 keeps the call page minimal and the server config has screen_share false | +| data channel (publishData, data streams, RPC) | OPT-OUT | not needed: chat messages go through the chat plugins, not the call | +| device selection (switchActiveDevice, getLocalDevices) | OPT-OUT | not needed for a minimal demo call: the browser's default camera and microphone are used | +| end-to-end encryption (E2EE worker) | OPT-OUT | explicitly out of scope: a public demo call with a short-lived room; media is DTLS-SRTP encrypted in transit | +| recording and egress | OPT-OUT | explicitly out of scope: the demo records nothing | +| simulcast tuning (videoEncoding, layers) | OPT-OUT | not needed: the defaults with adaptiveStream and dynacast fit 1:1 calls | +| audio-only mode | OPT-OUT | not needed: turning the camera off gives the same call without video | +| background effects and track processors | OPT-OUT | not needed: not part of a minimal call page | +| active speaker highlighting | OPT-OUT | not needed: calls are 1:1 DMs (D-11), so there is no speaker to pick out | + +## LiveKit server 1.13.1 through golem15.chatvideo (plans 02 and 05) + +| capability | decision | reason | +|---|---|---| +| room create (on video/start) | INTEGRATE | | +| room delete (on video/end and at max_duration) | INTEGRATE | | +| join token mint (per participant, token_ttl 900) | INTEGRATE | | +| participant count and active rooms (reconcile) | INTEGRATE | | +| remove participant (on video/leave) | INTEGRATE | | +| reconcile job (chatvideo:reconcile-sessions ends idle and overdue rooms) | INTEGRATE | | +| room max_participants (4 in livekit.yaml, next to chatvideo max_participants, D-12) | INTEGRATE | | +| /rtc/validate (check-local call) | INTEGRATE | | +| egress (recording, streaming) | OPT-OUT | explicitly out of scope: the demo records nothing | +| ingress (RTMP, WHIP) | OPT-OUT | explicitly out of scope: calls start from the site only | +| SIP | OPT-OUT | explicitly out of scope: no phone dial-in on a public demo | +| webhooks | OPT-OUT | not needed: the reconcile job polls room state, and the call events go through Centrifugo | +| TURN server | OPT-OUT | deferred: plan 05 decides it with the rome network setup (ICE TCP 7891 and UDP 7892 first) | + +## Centrifugo v6 (plans 02 to 04) + +| capability | decision | reason | +|---|---|---| +| chat namespace with presence and join/leave | INTEGRATE | | +| user namespace (user:{id}, the chat's events and video:call:incoming) | INTEGRATE | | +| video namespace (video:session:{id}: accepted, ended, participant joined and left) | INTEGRATE | | +| subscribe proxy on chat, user and video | INTEGRATE | | +| one shared client per page (vue-chat-layer realtime, onUserEvent for other layers) | INTEGRATE | | +| server HTTP API publish (lighthouse broadcast jobs) | INTEGRATE | | +| history and recovery | OPT-OUT | not needed: the chat refetches the open conversation over HTTP on every (re)subscribe | +| client-side publish | OPT-OUT | explicitly out of scope: browsers never publish; Go publishes after authorizing the write | +| client RPC | OPT-OUT | not needed: every action is an HTTP call | +| presence on the video namespace | OPT-OUT | not needed: LiveKit's participant events show who is in the call | + +## Web Push through golem15.herald (plan 04) + +| capability | decision | reason | +|---|---|---| +| VAPID key pair in .env (herald:vapid-generate, D-16) | INTEGRATE | | +| VAPID public key route (/_herald/api/v1/push/vapid-public-key, check-local herald) | INTEGRATE | | +| subscribe UI and service worker | OPT-OUT | deferred per D-16: herald is mounted without UI in this phase | +| push on chat events (DMs, mentions, incoming calls) | OPT-OUT | deferred per D-16: needs the subscribe UI first | +| push to /_herald from the site (goPaths) | OPT-OUT | deferred per D-16: the site does not call herald, so /_herald is not routed by vue-demo-app |