docs(20-04): API coverage of livekit-client, LiveKit, Centrifugo and Web Push

This commit is contained in:
Jakub Zych
2026-10-31 15:07:39 +01:00
parent b40c519747
commit 0301dc2ae4

View File

@@ -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 |