Group voice and video calls with MatrixRTC and LiveKit
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Test (windows-latest) (push) Canceled after 0s
CI / Storage tests on PostgreSQL (push) Canceled after 0s
CI / Complement (federation off) (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
CI / Smoke test the binary (push) Canceled after 0s
CI / Admin panel (push) Canceled after 0s
CI / Web client (push) Canceled after 0s
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Test (windows-latest) (push) Canceled after 0s
CI / Storage tests on PostgreSQL (push) Canceled after 0s
CI / Complement (federation off) (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
CI / Smoke test the binary (push) Canceled after 0s
CI / Admin panel (push) Canceled after 0s
CI / Web client (push) Canceled after 0s
Every call in the web client now goes through MatrixRTC with a LiveKit
SFU, the model Element Call and Element X use; the legacy 1:1 m.call.*
calls are gone. In a room of two the other person is rung and can answer
or decline; in a bigger room a banner offers to join the call. Calls show
a grid of participant tiles with mute, camera, screen sharing and leave,
and media is end-to-end encrypted in encrypted rooms.
Server:
- MSC4140 delayed events (send/state with a delay, plus the
delayed_events list/restart/cancel/send API), stored and scheduled, so
a member whose client drops off is taken out of the call.
- POST /user/{userId}/openid/request_token, which lk-jwt-service uses to
hand out LiveKit tokens.
- org.matrix.msc4143.rtc_foci in /.well-known/matrix/client, configured
under client_api.rtc.
- Room presets let members send call membership state.
- Migration 0014 for both SQL dialects.
Deploy: LiveKit and lk-jwt-service in compose (calls.yml) and the helm
chart. Docs: docs/calls.md, configuration and deployment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
325431a5be
commit
76dfc98a86
49 files changed
+3849
-432
No files matched your search
@@ -6,6 +6,7 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/dariuszjaniak/warp/server/internal/delayedevents"
|
||||
"github.com/dariuszjaniak/warp/server/internal/httputil"
|
||||
"github.com/dariuszjaniak/warp/server/internal/matrix/id"
|
||||
"github.com/dariuszjaniak/warp/server/internal/roomserver"
|
||||
@@ -155,10 +156,20 @@ func (c *ClientAPI) handleSendEvent(w http.ResponseWriter, r *http.Request, auth
|
||||
return httputil.MissingParam("A transaction ID is required")
|
||||
}
|
||||
|
||||
delay, delayed, err := c.delayRequested(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var content sendEventRequest
|
||||
if err := httputil.DecodeJSON(w, r, &content); err != nil {
|
||||
return err
|
||||
}
|
||||
if delayed {
|
||||
return c.scheduleDelayed(w, r, delayedevents.ScheduleRequest{
|
||||
UserID: auth.UserID, DeviceID: auth.DeviceID, RoomID: roomID,
|
||||
Type: eventType, Content: content, Delay: delay,
|
||||
})
|
||||
}
|
||||
|
||||
eventID, err := c.rooms.SendEvent(r.Context(), roomserver.SendEventRequest{
|
||||
RoomID: roomID,
|
||||
@@ -191,10 +202,20 @@ func (c *ClientAPI) handlePutState(w http.ResponseWriter, r *http.Request, auth
|
||||
}
|
||||
stateKey := r.PathValue("stateKey")
|
||||
|
||||
delay, delayed, err := c.delayRequested(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var content sendEventRequest
|
||||
if err := httputil.DecodeJSON(w, r, &content); err != nil {
|
||||
return err
|
||||
}
|
||||
if delayed {
|
||||
return c.scheduleDelayed(w, r, delayedevents.ScheduleRequest{
|
||||
UserID: auth.UserID, DeviceID: auth.DeviceID, RoomID: roomID,
|
||||
Type: eventType, StateKey: &stateKey, Content: content, Delay: delay,
|
||||
})
|
||||
}
|
||||
|
||||
eventID, err := c.rooms.SendEvent(r.Context(), roomserver.SendEventRequest{
|
||||
RoomID: roomID,
|
||||
|
||||
Reference in new issue
Block a user