One way to put media on the session: publish(request) resolves with the local track once LiveKit has it, and unpublish(id) removes it. A request names a source with its device, processor and capture settings, so CaptureSettings on the client options goes, as do setMicrophoneEnabled and setCameraEnabled on the client and the four screen share fields on the local member; sharing is tracks$ having a screenShare track, and a capture failure rejects the promise. LocalMediaInputs becomes the list of initial requests, which also become the room defaults so that one permission prompt covers microphone and camera. The publisher keeps the requests across a reconnection and republishes what is not muted. The harness gains a Share screen button. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
MatrixRTC SDK (EXPERIMENTAL)
@element-hq/matrixrtc-sdk is the call model under Element Call, on its own:
MatrixRTC memberships and transports, LiveKit connections, publishing, E2EE keys and
the media of every member, as observables. It has no UI. Element Call's own
CallViewModel is meant to become one consumer of it. The design is in
SdkArchitecture.md, the migration from the view model
in SdkMigration.md.
Status: first implementation. createMatrixRTCClient joins the session, connects to
the transport, publishes the local media and exposes every member's media; the
development harness and its e2e tests in playwright/sdk drive it, and Element
Call's own CallViewModel is built on it. It depends on nothing in Element Call's
src/.
Using it
import {
constant,
createMatrixRTCClient,
E2eeType,
MatrixRTCMode,
ObservableScope,
} from "@element-hq/matrixrtc-sdk";
const scope = new ObservableScope();
const rtcClient = createMatrixRTCClient(
scope,
client, // a matrix-js-sdk MatrixClient, logged in and syncing
room, // the matrix-js-sdk Room, from client.getRoom() once the join has synced
{
publish: [{ source: "microphone" }, { source: "camera" }],
audioOutputDeviceId$: constant(undefined),
},
{
encryptionSystem: { kind: E2eeType.PER_PARTICIPANT },
matrixRTCMode: MatrixRTCMode.Compatibility,
},
);
rtcClient.join();
rtcClient.remoteMembers$.subscribe((members) => {
// each member has displayName$, media$ and more; a media track is rendered
// by handing it a <video> or <audio> element: track.attach(element)
});
// later
rtcClient.leave();
scope.end();
dev/main.ts is this example as a working page.
Development
Everything runs from the repository root. This directory is a pnpm project of its
own only so that a host can install it as a git dependency (see
pnpm-workspace.yaml).
pnpm dev:sdk # the harness, https://localhost:3002
pnpm build:sdk # dist/matrixrtc-sdk.js and dist/types
pnpm test:playwright playwright/sdk # needs `pnpm backend`
Installing
pnpm add github:element-hq/element-call#<ref>&path:/sdk
The host supplies matrix-js-sdk, livekit-client and rxjs; the build leaves
them external.