Files
element-call-Github/sdk
Timo K. 038991fa97 [SDK] Cover transport discovery, the join options and the room options
Unit tests for the pieces that had none: which transport the local
member advertises (override, homeserver, fallback, none), what the js-sdk
join is called with, how a publish request becomes LiveKit capture and
publish options, and the room options the connection factory builds from
the initial requests and the media quality settings, including what a
resolved connection reports while it is up. The backend's `mediaFor` gains
the cases from Element Call's member matching tests: a member on another
transport, a member changing transport, and a member without one.
2026-10-13 16:17:13 +02:00
..

MatrixRTC SDK (EXPERIMENTAL)

@element-hq/matrixrtc-sdk is the call model under Element Call, on its own: MatrixRTC memberships and transports, media 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. Media goes through one media backend behind MediaBackend; LiveKit, under src/media-backend/livekit/, is the only one today and the only place that imports livekit-client.

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 {
  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
  {
    encryptionSystem: { kind: E2eeType.PER_PARTICIPANT },
    matrixRTCMode: MatrixRTCMode.Compatibility,
    publish: [{ source: "microphone" }, { source: "camera" }],
  },
);
rtcClient.join();

rtcClient.remoteMembers$.subscribe((members) => {
  // each member has displayName$, tracks$ 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.