(room: Room, waitTimeMs: number)
| 473 | * after 30 seconds. |
| 474 | */ |
| 475 | export 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 |
no test coverage detected