MCPcopy
hub / github.com/element-hq/element-web / waitForRoomEncryption

Function waitForRoomEncryption

apps/web/src/createRoom.ts:475–507  ·  view source on GitHub ↗
(room: Room, waitTimeMs: number)

Source from the content-addressed store, hash-verified

473 * after 30 seconds.
474 */
475export async function waitForRoomEncryption(room: Room, waitTimeMs: number): Promise<void> {
476 if (room.hasEncryptionStateEvent()) {
477 return;
478 }
479
480 // Start a 30s timeout and return "timed_out" if we hit it
481 const { promise: timeoutPromise, resolve: timeoutResolve } = Promise.withResolvers();
482 const timeout = setTimeout(timeoutResolve, waitTimeMs, "timed_out");
483
484 // Listen for a RoomEncryption state update and return
485 // "received_encryption_state" if we get it
486 const roomState = room.getLiveTimeline().getState(Direction.Forward)!;
487 const { promise: stateUpdatePromise, resolve: stateUpdateResolve } = Promise.withResolvers();
488 const onRoomStateUpdate = (state: RoomState): void => {
489 if (state.getStateEvents(EventType.RoomEncryption, "")) {
490 stateUpdateResolve("received_encryption_state");
491 }
492 };
493 roomState.on(RoomStateEvent.Update, onRoomStateUpdate);
494
495 // Wait for one of the above to happen
496 const resolution = await Promise.race([timeoutPromise, stateUpdatePromise]);
497
498 // Clear the listener and the timeout
499 roomState.off(RoomStateEvent.Update, onRoomStateUpdate);
500 clearTimeout(timeout);
501
502 // Fail if we hit the timeout
503 if (resolution === "timed_out") {
504 logger.warn("Timed out while waiting for room to enable encryption");
505 throw new Error("Timed out while waiting for room to enable encryption");
506 }
507}
508
509/*
510 * Ensure that for every user in a room, there is at least one device that we

Callers 2

createRoom-test.tsFile · 0.90

Calls 4

offMethod · 0.80
warnMethod · 0.80
onMethod · 0.65
getStateMethod · 0.45

Tested by

no test coverage detected