Merge pull request #3679 from element-hq/toger5/fix-unnecassary-error-logs

Fix some error log lines that lead to confusion
This commit is contained in:
Timo
2026-01-19 17:57:34 +01:00
committed by GitHub
5 changed files with 61 additions and 16 deletions

View File

@@ -194,8 +194,8 @@ describe("LocalMembership", () => {
matrixRTCMode: MatrixRTCMode.Matrix_2_0,
}),
matrixRTCSession: {
updateCallIntent: () => {},
leaveRoomSession: () => {},
updateCallIntent: vi.fn().mockReturnValue(Promise.resolve()),
leaveRoomSession: vi.fn(),
} as unknown as MatrixRTCSession,
muteStates: mockMuteStates(),
trackProcessorState$: constant({
@@ -244,6 +244,37 @@ describe("LocalMembership", () => {
});
});
it("logs if callIntent cannot be updated", async () => {
const scope = new ObservableScope();
const localTransport$ = new BehaviorSubject(aTransport);
const mockConnectionManager = {
transports$: constant(new Epoch([])),
connectionManagerData$: constant(new Epoch(new ConnectionManagerData())),
};
async function reject(): Promise<void> {
return Promise.reject(new Error("Not connected yet"));
}
const localMembership = createLocalMembership$({
scope,
...defaultCreateLocalMemberValues,
matrixRTCSession: {
updateCallIntent: vi.fn().mockImplementation(reject),
leaveRoomSession: vi.fn(),
},
connectionManager: mockConnectionManager,
localTransport$,
});
const expextedLog =
"'not connected yet' while updating the call intent (this is expected on startup)";
const internalLogger = vi.spyOn(localMembership.internalLoggerRef, "debug");
await flushPromises();
defaultCreateLocalMemberValues.muteStates.video.setEnabled$.value?.(true);
expect(internalLogger).toHaveBeenCalledWith(expextedLog);
scope.end();
});
const aTransport = {
transport: {
livekit_service_url: "a",

View File

@@ -200,6 +200,7 @@ export const createLocalMembership$ = ({
* Fully connected
*/
connected$: Behavior<boolean>;
internalLoggerRef: Logger;
} => {
const logger = parentLogger.getChild("[LocalMembership]");
logger.debug(`Creating local membership..`);
@@ -524,12 +525,19 @@ export const createLocalMembership$ = ({
}
});
combineLatest([muteStates.video.enabled$, homeserverConnected.combined$])
.pipe(scope.bind())
.subscribe(([videoEnabled, connected]) => {
if (!connected) return;
void matrixRTCSession.updateCallIntent(videoEnabled ? "video" : "audio");
});
muteStates.video.enabled$.pipe(scope.bind()).subscribe((videoEnabled) => {
void matrixRTCSession
.updateCallIntent(videoEnabled ? "video" : "audio")
.catch((e) => {
if (e instanceof Error && e.message === "Not connected yet") {
logger.debug(
"'not connected yet' while updating the call intent (this is expected on startup)",
);
} else {
throw e;
}
});
});
// Keep matrix rtc session in sync with localTransport$, connectRequested$
scope.reconcile(
@@ -673,6 +681,7 @@ export const createLocalMembership$ = ({
sharingScreen$,
toggleScreenSharing,
connection$: localConnection$,
internalLoggerRef: logger,
};
};

View File

@@ -352,17 +352,22 @@ async function makeTransport(
// MSC4143: Attempt to fetch transports from backend.
if ("_unstable_getRTCTransports" in client) {
try {
const selectedTransport = await getFirstUsableTransport(
await client._unstable_getRTCTransports(),
);
const transportList = await client._unstable_getRTCTransports();
const selectedTransport = await getFirstUsableTransport(transportList);
if (selectedTransport) {
logger.info("Using backend-configured SFU", selectedTransport);
logger.info(
"Using backend-configured (client.getRTCTransports) SFU",
selectedTransport,
);
return selectedTransport;
}
} catch (ex) {
if (ex instanceof MatrixError && ex.httpStatus === 404) {
// Expected, this is an unstable endpoint and it's not required.
logger.debug("Backend does not provide any RTC transports", ex);
// There will be expected 404 errors in the console. When we check if synapse supports the endpoint.
logger.debug(
"Matrix homeserver does not provide any RTC transports via `/rtc/transports` (will retry with well-known.)",
);
} else if (ex instanceof FailToGetOpenIdToken) {
throw ex;
} else {

View File

@@ -63,7 +63,6 @@ interface SpotlightItemBaseProps {
mxcAvatarUrl: string | undefined;
focusable: boolean;
"aria-hidden"?: boolean;
localParticipant: boolean;
}
interface SpotlightUserMediaItemBaseProps extends SpotlightItemBaseProps {
@@ -188,7 +187,6 @@ const SpotlightItem: FC<SpotlightItemProps> = ({
focusable,
encryptionStatus,
"aria-hidden": ariaHidden,
localParticipant: vm.local,
};
return vm instanceof ScreenShareViewModel ? (

View File

@@ -460,7 +460,9 @@ export class MockRTCSession extends TypedEventEmitter<
return this;
}
public updateCallIntent = vitest.fn();
public updateCallIntent = vitest
.fn()
.mockImplementation(async () => Promise.resolve());
private _membershipStatus = Status.Connected;
public get membershipStatus(): Status {