mirror of
https://github.com/element-hq/element-call.git
synced 2026-10-06 01:37:22 +00:00
Set up `sdk/` as a package shaped exactly like `component/`: its own package.json with peer dependencies, the pnpm workspace marker so a host can install it as a git dependency, a build tsconfig for type emission, and a vite lib config with an externals list that `pnpm lint:externals` now checks for both library builds. The package holds only the interface for now. `createRtcSession` returns an empty object; `RtcSession`, `RtcMember`, `MemberMedia` and `TransportMetadata` are the contract Element Call's `CallViewModel` will be rebuilt on (see sdk-plan.md). The shared primitives are re-exported from `src` until the first implementation slice moves them. `sdk/dev` is the smallest consumer of the SDK: a plain page that logs in, joins a room and renders one tile per member, served by `pnpm dev:sdk` on port 3002. Playwright starts it as a third web server, and `playwright/sdk/smoke.spec.ts` has two browsers join one session. It fails on the status line with the SDK's own error until there is an implementation behind the interface. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
/*
|
|
Copyright 2026 Element Creations Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import {
|
|
ClientEvent,
|
|
createClient,
|
|
type MatrixClient,
|
|
MemoryStore,
|
|
SyncState,
|
|
} from "matrix-js-sdk";
|
|
|
|
/** Logs in with a password and returns a client that has finished its first sync. */
|
|
export async function createSession(
|
|
homeserver: string,
|
|
username: string,
|
|
password: string,
|
|
): Promise<MatrixClient> {
|
|
const login = await createClient({ baseUrl: homeserver }).login(
|
|
"m.login.password",
|
|
{ identifier: { type: "m.id.user", user: username }, password },
|
|
);
|
|
|
|
const client = createClient({
|
|
baseUrl: homeserver,
|
|
accessToken: login.access_token,
|
|
userId: login.user_id,
|
|
deviceId: login.device_id,
|
|
store: new MemoryStore(),
|
|
useAuthorizationHeader: true,
|
|
fallbackICEServerAllowed: true,
|
|
});
|
|
|
|
await client.initRustCrypto({ useIndexedDB: false });
|
|
await client.startClient();
|
|
await new Promise<void>((resolve) => {
|
|
const onSync = (state: SyncState): void => {
|
|
if (state !== SyncState.Prepared && state !== SyncState.Syncing) return;
|
|
client.off(ClientEvent.Sync, onSync);
|
|
resolve();
|
|
};
|
|
client.on(ClientEvent.Sync, onSync);
|
|
});
|
|
|
|
return client;
|
|
}
|