Compare commits

...

4 Commits

Author SHA1 Message Date
damencho
5ff3219935 debug: Drop. 2025-10-02 14:40:39 -05:00
bgrozev
386bdbfc22 test: Use the directory as parentSuite. (#16493)
* test: Use the directory as a parent suite.
2025-10-02 14:30:57 -05:00
Jaya Allamsetty
a45453e391 fix(RTCStats) Stop sending dominantSpeaker events.
They are handled in lib-jitsi-meet now.
2025-10-01 18:01:57 -04:00
Jaya Allamsetty
07554a156b chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v2097.0.0+58646fc3...v2099.0.0+89536686
2025-10-01 18:00:18 -04:00
7 changed files with 150 additions and 212 deletions

10
package-lock.json generated
View File

@@ -66,7 +66,7 @@
"js-md5": "0.6.1",
"js-sha512": "0.8.0",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2097.0.0+58646fc3/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2099.0.0+89536686/lib-jitsi-meet.tgz",
"lodash-es": "4.17.21",
"null-loader": "4.0.1",
"optional-require": "1.0.3",
@@ -18260,8 +18260,8 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2097.0.0+58646fc3/lib-jitsi-meet.tgz",
"integrity": "sha512-CViaK78aH8jmlmUkx+J3StpYFDDWyd5ry2CIoBEJx9uZtSnqczVjOBkbx/9VFifd8ZTr+VClfDRM/ZpkJye8rg==",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2099.0.0+89536686/lib-jitsi-meet.tgz",
"integrity": "sha512-0FYPvOFSdg9L4ocH8bJw8doUE0rM55JnqRijXMOLS3ZOphbpeBg8tBTH33jwb+bqgo5jjmjTrvJkmkvGNF5/Jg==",
"license": "Apache-2.0",
"dependencies": {
"@jitsi/js-utils": "2.4.6",
@@ -39715,8 +39715,8 @@
}
},
"lib-jitsi-meet": {
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2097.0.0+58646fc3/lib-jitsi-meet.tgz",
"integrity": "sha512-CViaK78aH8jmlmUkx+J3StpYFDDWyd5ry2CIoBEJx9uZtSnqczVjOBkbx/9VFifd8ZTr+VClfDRM/ZpkJye8rg==",
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2099.0.0+89536686/lib-jitsi-meet.tgz",
"integrity": "sha512-0FYPvOFSdg9L4ocH8bJw8doUE0rM55JnqRijXMOLS3ZOphbpeBg8tBTH33jwb+bqgo5jjmjTrvJkmkvGNF5/Jg==",
"requires": {
"@jitsi/js-utils": "2.4.6",
"@jitsi/logger": "2.1.1",

View File

@@ -72,7 +72,7 @@
"js-md5": "0.6.1",
"js-sha512": "0.8.0",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2097.0.0+58646fc3/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2099.0.0+89536686/lib-jitsi-meet.tgz",
"lodash-es": "4.17.21",
"null-loader": "4.0.1",
"optional-require": "1.0.3",

View File

@@ -2,10 +2,8 @@ import JitsiMeetJS, { RTCStatsEvents } from '../base/lib-jitsi-meet';
import logger from './logger';
import {
DominantSpeakerData,
E2ERTTData,
FaceLandmarksData,
VideoTypeData
FaceLandmarksData
} from './types';
// TODO(saghul): expose these in libn-jitsi-meet?
@@ -46,16 +44,6 @@ class RTCStats {
JitsiMeetJS.rtcstats.sendStatsEntry('logs', logEntries);
}
/**
* Send dominant speaker data, the data will be processed by rtcstats-server and saved in the dump file.
*
* @param {Object} dominantSpeakerData - Dominant speaker data to be saved in the rtcstats dump.
* @returns {void}
*/
sendDominantSpeakerData(dominantSpeakerData: DominantSpeakerData) {
JitsiMeetJS.rtcstats.sendStatsEntry('dominantSpeaker', dominantSpeakerData);
}
/**
* Send e2e rtt data, the data will be processed by rtcstats-server and saved in the dump file.
*
@@ -87,16 +75,6 @@ class RTCStats {
JitsiMeetJS.rtcstats.sendStatsEntry('conferenceStartTimestamp', timestamp);
}
/**
* Send videoType data, the data will be processed by rtcstats-server and saved in the dump file.
*
* @param {Object} videoTypeData - The object that holds the videoType data.
* @returns {void}
*/
sendVideoTypeData(videoTypeData: VideoTypeData) {
JitsiMeetJS.rtcstats.sendStatsEntry('setVideoType', videoTypeData);
}
/**
* Send face landmarks data, the data will be processed by rtcstats-server and saved in the dump file.
*

View File

@@ -5,9 +5,8 @@ import {
CONFERENCE_JOINED,
E2E_RTT_CHANGED
} from '../base/conference/actionTypes';
import { DOMINANT_SPEAKER_CHANGED } from '../base/participants/actionTypes';
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
import { TRACK_ADDED, TRACK_UPDATED } from '../base/tracks/actionTypes';
import { TRACK_UPDATED } from '../base/tracks/actionTypes';
import { ADD_FACE_LANDMARKS } from '../face-landmarks/actionTypes';
import { FaceLandmarks } from '../face-landmarks/types';
import { sendGetCustomerIdRequest } from '../jaas/functions';
@@ -47,25 +46,10 @@ MiddlewareRegistry.register((store: IStore) => (next: Function) => (action: AnyA
}
break;
}
case TRACK_ADDED: {
if (isRTCStatsEnabled(state)) {
const jitsiTrack = action?.track?.jitsiTrack;
const { ssrc, videoType } = jitsiTrack || { };
// Remote tracks store their ssrc in the jitsiTrack object. Local tracks don't. See getSsrcByTrack.
if (videoType && ssrc && !jitsiTrack.isLocal() && !jitsiTrack.isAudioTrack()) {
RTCStats.sendVideoTypeData({
ssrc,
videoType
});
}
}
break;
}
case TRACK_UPDATED: {
if (isRTCStatsEnabled(state)) {
const { videoType, jitsiTrack, muted } = action?.track || { };
const { ssrc, isLocal, videoType: trackVideoType, conference } = jitsiTrack || { };
const { jitsiTrack, muted } = action?.track || { };
const { isLocal, videoType: trackVideoType, conference } = jitsiTrack || { };
if (trackVideoType === 'camera' && conference && isLocal()) {
RTCStats.sendFaceLandmarksData({
@@ -74,27 +58,6 @@ MiddlewareRegistry.register((store: IStore) => (next: Function) => (action: AnyA
timestamp: Date.now()
});
}
// if the videoType of the remote track has changed we expect to find it in track.videoType. grep for
// trackVideoTypeChanged.
if (videoType && ssrc && !jitsiTrack.isLocal() && !jitsiTrack.isAudioTrack()) {
RTCStats.sendVideoTypeData({
ssrc,
videoType
});
}
}
break;
}
case DOMINANT_SPEAKER_CHANGED: {
if (isRTCStatsEnabled(state)) {
const { id, previousSpeakers, silence } = action.participant;
RTCStats.sendDominantSpeakerData({
dominantSpeakerEndpoint: silence ? null : id,
previousSpeakers
});
}
break;
}

View File

@@ -1,13 +1,4 @@
export type VideoTypeData = {
ssrc: number;
videoType: string;
};
export type DominantSpeakerData = {
dominantSpeakerEndpoint: string;
previousSpeakers: string[];
};
// Types for RTC stats entries.
export type E2ERTTData = {
remoteEndpointId: string;
remoteRegion: string;

View File

@@ -1,12 +1,10 @@
import {
checkForScreensharingTile,
ensureOneParticipant,
ensureTwoParticipants,
hangupAllParticipants,
joinSecondParticipant,
joinThirdParticipant
} from '../../helpers/participants';
import { unmuteVideoAndCheck } from '../helpers/mute';
describe('StartMuted', () => {
it('checkboxes test', async () => {
@@ -144,134 +142,134 @@ describe('StartMuted', () => {
await p1.waitForAudioMuted(p3, false /* unmuted */);
});
it('startWithVideoMuted=true can unmute', async () => {
// Maybe disable if there is FF or Safari participant.
await hangupAllParticipants();
// Explicitly enable P2P due to a regression with unmute not updating
// large video while in P2P.
const options = {
configOverwrite: {
p2p: {
enabled: true
},
startWithVideoMuted: true
}
};
await ensureTwoParticipants(options);
const { p1, p2 } = ctx;
await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2);
await p2.getParticipantsPane().assertVideoMuteIconIsDisplayed(p1);
await Promise.all([
p1.getLargeVideo().waitForSwitchTo(await p2.getEndpointId()),
p2.getLargeVideo().waitForSwitchTo(await p1.getEndpointId())
]);
await unmuteVideoAndCheck(p2, p1);
await p1.getLargeVideo().assertPlaying();
});
it('startWithAudioMuted=true can unmute', async () => {
await hangupAllParticipants();
const options = {
configOverwrite: {
startWithAudioMuted: true,
testing: {
testMode: true,
debugAudioLevels: true
}
}
};
await ensureTwoParticipants(options);
const { p1, p2 } = ctx;
await Promise.all([ p1.waitForAudioMuted(p2, true), p2.waitForAudioMuted(p1, true) ]);
await p1.getToolbar().clickAudioUnmuteButton();
await Promise.all([ p1.waitForAudioMuted(p2, true), p2.waitForAudioMuted(p1, false) ]);
});
it('startWithAudioVideoMuted=true can unmute', async () => {
await hangupAllParticipants();
const options = {
configOverwrite: {
startWithAudioMuted: true,
startWithVideoMuted: true,
p2p: {
enabled: true
}
}
};
await ensureOneParticipant(options);
await joinSecondParticipant({
configOverwrite: {
testing: {
testMode: true,
debugAudioLevels: true
},
p2p: {
enabled: true
}
}
});
const { p1, p2 } = ctx;
await p2.waitForIceConnected();
await p2.waitForSendMedia();
await p2.waitForAudioMuted(p1, true);
await p2.getParticipantsPane().assertVideoMuteIconIsDisplayed(p1);
// Unmute p1's both audio and video and check on p2.
await p1.getToolbar().clickAudioUnmuteButton();
await p2.waitForAudioMuted(p1, false);
await unmuteVideoAndCheck(p1, p2);
await p2.getLargeVideo().assertPlaying();
});
it('test p2p JVB switch and switch back', async () => {
const { p1, p2 } = ctx;
// Mute p2's video just before p3 joins.
await p2.getToolbar().clickVideoMuteButton();
await joinThirdParticipant({
configOverwrite: {
p2p: {
enabled: true
}
}
});
const { p3 } = ctx;
// Unmute p2 and check if its video is being received by p1 and p3.
await unmuteVideoAndCheck(p2, p3);
await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2, true);
// Mute p2's video just before p3 leaves.
await p2.getToolbar().clickVideoMuteButton();
await p3.hangup();
await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2);
await p2.getToolbar().clickVideoUnmuteButton();
// Check if p2's video is playing on p1.
await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2, true);
await p1.getLargeVideo().assertPlaying();
});
// it('startWithVideoMuted=true can unmute', async () => {
// // Maybe disable if there is FF or Safari participant.
//
// await hangupAllParticipants();
//
// // Explicitly enable P2P due to a regression with unmute not updating
// // large video while in P2P.
// const options = {
// configOverwrite: {
// p2p: {
// enabled: true
// },
// startWithVideoMuted: true
// }
// };
//
// await ensureTwoParticipants(options);
//
// const { p1, p2 } = ctx;
//
// await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2);
// await p2.getParticipantsPane().assertVideoMuteIconIsDisplayed(p1);
//
// await Promise.all([
// p1.getLargeVideo().waitForSwitchTo(await p2.getEndpointId()),
// p2.getLargeVideo().waitForSwitchTo(await p1.getEndpointId())
// ]);
//
// await unmuteVideoAndCheck(p2, p1);
// await p1.getLargeVideo().assertPlaying();
// });
//
// it('startWithAudioMuted=true can unmute', async () => {
// await hangupAllParticipants();
//
// const options = {
// configOverwrite: {
// startWithAudioMuted: true,
// testing: {
// testMode: true,
// debugAudioLevels: true
// }
// }
// };
//
// await ensureTwoParticipants(options);
//
// const { p1, p2 } = ctx;
//
// await Promise.all([ p1.waitForAudioMuted(p2, true), p2.waitForAudioMuted(p1, true) ]);
// await p1.getToolbar().clickAudioUnmuteButton();
// await Promise.all([ p1.waitForAudioMuted(p2, true), p2.waitForAudioMuted(p1, false) ]);
// });
//
// it('startWithAudioVideoMuted=true can unmute', async () => {
// await hangupAllParticipants();
//
// const options = {
// configOverwrite: {
// startWithAudioMuted: true,
// startWithVideoMuted: true,
// p2p: {
// enabled: true
// }
// }
// };
//
// await ensureOneParticipant(options);
// await joinSecondParticipant({
// configOverwrite: {
// testing: {
// testMode: true,
// debugAudioLevels: true
// },
// p2p: {
// enabled: true
// }
// }
// });
//
// const { p1, p2 } = ctx;
//
// await p2.waitForIceConnected();
// await p2.waitForSendMedia();
//
// await p2.waitForAudioMuted(p1, true);
// await p2.getParticipantsPane().assertVideoMuteIconIsDisplayed(p1);
//
// // Unmute p1's both audio and video and check on p2.
// await p1.getToolbar().clickAudioUnmuteButton();
// await p2.waitForAudioMuted(p1, false);
//
// await unmuteVideoAndCheck(p1, p2);
// await p2.getLargeVideo().assertPlaying();
// });
//
//
// it('test p2p JVB switch and switch back', async () => {
// const { p1, p2 } = ctx;
//
// // Mute p2's video just before p3 joins.
// await p2.getToolbar().clickVideoMuteButton();
//
// await joinThirdParticipant({
// configOverwrite: {
// p2p: {
// enabled: true
// }
// }
// });
//
// const { p3 } = ctx;
//
// // Unmute p2 and check if its video is being received by p1 and p3.
// await unmuteVideoAndCheck(p2, p3);
// await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2, true);
//
// // Mute p2's video just before p3 leaves.
// await p2.getToolbar().clickVideoMuteButton();
//
// await p3.hangup();
//
// await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2);
//
// await p2.getToolbar().clickVideoUnmuteButton();
//
// // Check if p2's video is playing on p1.
// await p1.getParticipantsPane().assertVideoMuteIconIsDisplayed(p2, true);
// await p1.getLargeVideo().assertPlaying();
// });
});

View File

@@ -58,7 +58,7 @@ const chromePreferences = {
};
const specs = [
'specs/**/*.spec.ts'
'specs/**/startMuted.spec.ts'
];
/**
@@ -312,6 +312,14 @@ export const config: WebdriverIO.MultiremoteConfig = {
* @param {Object} context - The context object.
*/
beforeTest(test, context) {
// Use the directory under 'tests/specs' as the parent suite
const match = test.file.match(/.*\/tests\/specs\/([^\/]+)\//);
const dir = match ? match[1] : false;
if (dir) {
AllureReporter.addParentSuite(dir);
}
if (ctx.skipSuiteTests) {
context.skip();