Commit Graph

42722 Commits

Author SHA1 Message Date
prlanzarin
9040cb86cb fix(audio): prevent spurious mute toggle due to AudioSettings remount
When listen only mode is deactivated and an user joins audio, an incorrect
remount of AudioSettings can trigger a spurious mute toggle. This happens
because AudioManager clears the `isConnecting` flag before setting the
`isConnected` flag. This creates a brief period where audio is flagged as
"disconnected," leading to a remount and unmount cycle that causes unwanted
mute/unmute actions due to AudioSettings' logic of muting/unmuting
active devices.

Ensure the `isConnected` flag is set before clearing the
`isConnecting` flag, preventing audio from being incorrectly flagged as
disconnected.
2024-08-16 01:51:10 +00:00
Paulo Lanzarin
2639600e1d
Merge pull request #20957 from bigbluebutton/sfu2141
build(bbb-webrtc-sfu): v2.14.1
2024-08-15 17:04:53 -03:00
Paulo Lanzarin
a152cc45c5
build(bbb-webrtc-sfu): v2.14.1
v2.14.1
---
* fix(screenshare): log presenter/viewer stop on all scenarios
* refactor(screenshare): add presenter data to viewer logs
* refactor(video): add video negotiation and flowing logs
* build(mediasoup): 3.14.9
2024-08-15 16:42:48 -03:00
Ramón Souza
39d68e4156
Merge pull request #20782 from prlanzarin/u30/feat/tlo-ui-rebased250724
feat(audio): rework audio join UI for transparentListenOnly
2024-08-15 16:38:35 -03:00
Ramón Souza
4227827165
fix feedback screen (#20949) 2024-08-15 11:58:19 -03:00
André Castro
a704c58dee
Fix: [3.0] Audio autoplay button is visually broken (#20950) 2024-08-15 11:18:56 -03:00
Ramón Souza
23e8e01871
fix: allowModsToUnmuteUsers param not working (#20888)
* fix unmute user feature
2024-08-15 11:10:08 -03:00
prlanzarin
381718a353 fix(audio): unmute when going from "no mic" -> mic via unmute trigger, +
When going from "no mic" -> mic via the unmute action, the client isn't
unmuting itself after confirming the change. This is caused by not
waiting the liveChangeInputDevice method (which is a Promise) to be
fully executed before unmounting the AudioSettings modal -- the one
responsible for triggering the unmute. Since it unmounts before the
device is changed, the unmute action will be ignored because the device
is still "listen-only" (no mic).

Properly unmute audio when transitioning from "no mic" -> "mic" via the
unmute trigger by waiting for liveChangeInputDevice to resolve.
Additionally, some general improvements to UI/UX:
  - Display the AudioSettings modal title when gUM is on prompt mode
  - Add specific subtitles to the AudioSettings modal to 1) warn that no
    mic is selected 2) Give a hint that the user can test their devices
  - Always honor settings.yml's "initialHearingState" state (whether
    local echo feedback should be played by default in AudioSettings)
2024-08-15 03:30:18 +00:00
prlanzarin
120bef5cc1 refactor(audio): improve audio settings' UI
We are missing a way to select transcription languages in some
scenarios, e.g.: listenOnlyMode=false. The audio settings UI is also not
handling item disposition very well on smaller devices.

This commit does the following to improve those blind spots:
  - Add the transcription language selector to it whenever applicable
  - Add proper styling to the transcription selector
  - Handle small screens by changing the disposition of elements to
    portrait mode
  - Improve how elements are disposed to a more familiar view: Mic ->
    Activity Indicator; Speaker -> Speaker test. This is more in line
    with how other platforms do audio configuration/pre flight screens.
2024-08-15 00:43:37 +00:00
prlanzarin
4f6e16f8e3 feat(audio): dynamic muteOnStart based on audio user count
The current default setting of muteOnStart=false can lead to performance
issues in larger rooms, especially with the "transparent listen only
mode" and LiveKit, as proven by load testing. In contrast,
muteOnStart=true helps mitigate these issues but complicates the entry
process for smaller meetings, such as 1-on-1 sessions or small classes.
Additionally, the ability to override muteOnStart via the API can create
scalability issues if not managed properly.

Add a new akka-apps flag `voiceConf.muteOnStartThreshold` which acts as
a trigger that forces muteOnStart=true when the number of audio
participants reaches the configured threshold. 0 means no threshold
(disabled).

This trigger overrides any API parameter or static configurations
related to muteOnStart, as well as the client's meeting mute actions.
Pending:
  - Remove MeetingStatus.meetingMute state side effects from the client's
    "Mute all" and "Mute all except presenter" actions. They should no
    longer alter the meeting mute state once this becomes default (just
    mute users instead).
2024-08-15 00:43:36 +00:00
prlanzarin
583eb2014e fix(audio): change unmute/unhold flow to work around FS unmute stutter
FS has an intermittent issue where unmuting a HELD channel sometimes
takes significantly (seconds) longer than usual.
conference <XYZ> unmute <WVU> simply gets stuck with no FS_API response,
which delays the unmute action whenever transparent listen only is
active.

Apparently, unholding the channel PRIOR TO unmuting works around the
issue - at least it could not be reproduced with the scenario at hand.
The unmute API already triggered an unhold in FS internally, which is
the reason why this was not done beforehand. The aforementioned issue is
way worse than an extra "redudant" API call, though.

Always unhold audio channels manually _before_ unmuting.
2024-08-15 00:43:35 +00:00
prlanzarin
2975448c16 build(bbb-webrtc-sfu): v2.14.0
v2.14.0
---
* feat(mediasoup): add least-loaded worker balancing strategy
* feat(mediasoup): worker transposition (off by default)
* feat(audio): dynamic global audio bridge mechanism
* feat: livekit module, initial implementation
* feat(audio): add signaling support for passive-sendrecv role
* feat(freeswitch): overridable UA string
* feat(audio): muteOnStart detection for conditional dialplans
* feat(audio): mute passive-sendrecv clients on start
* feat(audio): support for mute-and-hold on start
* fix(audio): ignore TLO-incapable clients in hold/unhold metrics
* fix(audio): mute/unmute stuck due to inconsistent hold status
* fix(audio): hold/unhold loop when there are multiple sessions per user
* fix(audio): muteOnStart sessions incorrectly muted on breakout transfers
* fix(audio): header-provided userName incorrectly decoded
* fix(audio): stuck unmute due to borked callerIdNum
* fix(audio): correctly decode user name space chars
* !build(npm): set min Node.js version to >=18.0.0
* build: nodemon@3.1.3
* build: ws@8.17.1
* build(mediasoup): 3.14.8
2024-08-15 00:43:34 +00:00
prlanzarin
196a12cff4 fix(audio): stuck unmute due to borked callerId(Num)
FreeSWITCH incorrectly generates callerNum headers in its ESL events
when specific, special characters are in place. e.g.:
w_etc_0-bbbID-User;Semi (notice the semicolon) will be generated by
FS as w_etc_0-bbbID-User (everything after the semicolon is ignored).
This breaks callerId comparision for session matching in a few places -
one of the is the unmute/unhold toggle control.

Compare callerNum as prefixes instead of exact strings to match those
scenarios.
This is a temporary fix; we should review callerNum generation in the
future (use Caller-Id-Name in FSESL), as well as stop relying on it
for session matching (use UUIDs and/or client session numbers instead).
Both of these are more involved changes, though.
2024-08-15 00:43:33 +00:00
prlanzarin
c10c0a7258 fix(audio): users unable to join audio when mic lock setting is active
Whenever both microphone lock settings and transparent listen are
active, users fail to join audio due to an oversight in the audio join
permission procedure. It's denying users from *joining* audio if they're
locked, even though they should only be prevented from *unmuting*
themselves.

Change the permission checks for audio join to allow users even when
they're locked. Use the lock setting to force the muteOnStart flag for
locked users instead.
2024-08-15 00:43:32 +00:00
prlanzarin
ceff20ff21 fix(audio): always send unhold
Alway send the unhold command since it doesn't change flip the state
(contrary to the uuid_hold toggle command).

It's not idempotent, though - so always update the internal hold state
to prevent state mismatches preventing channels from being unheld.
2024-08-15 00:43:32 +00:00
prlanzarin
58ccd9e586 feat(audio): add memberId to VoiceStateEvent when applicable
We need the voiceUserId (memberId) in IN_CONFERENCE callState events so
that the SFU can bypass dialplan-level mute states when transferring
between breakout rooms.

Add memberId to VoiceCallStateEvent when applicable. For CHANNEL_STATE
events that do not carry it (RINGING, HANGUP), memberId is an empty
string.
2024-08-15 00:43:31 +00:00
prlanzarin
f49c63fa09 fix(audio): do not send FSESL hold cmd if already on hold
This is an edge case with the uuid_hold command being used through
FSESL or fsapi where holding only works via the uuid_hold <toggle>
subcommand, which may cause the channel to be the opposite of what
we want.

Do not execute if the command is asking for the channel to be HELD
and the channel is already HELD.
2024-08-15 00:43:30 +00:00
prlanzarin
5b5653fead fix(audio): only enforce hold on mute state mismatch if !muted
There's a routine that's supposed to enforce the channel hold state if
mute and hold states are mismatched. This should only happen in case the
user is unmuted and the channel is held to avoid leaving an user without
inbound or outbound audio by accident. The routine currently checks for
the oppositve scenario as well (muted=true,hold=false), which should not
be enforced because of special scenarios (e.g.: audio-only breakout room
transfers, which have their transparent LO mechanism disabled).

Only enforce hold on muted state mismatch IF muted == false.
2024-08-15 00:43:29 +00:00
prlanzarin
c6ca6d5c45 fix(audio): add callerNum to transparent listen only RPCs
There are some scenarios where transparent listen only toggle RPCs are
directed to multiple different sessions in the SFU, which might cause a
hold-unhold loop because they're all anchored to the userId.

Append the callerNum to transparent listen only toggle RPCs so that they
are directed to the appropriate audio sessions in all cases.
2024-08-15 00:43:29 +00:00
prlanzarin
325887e325 feat(audio): rework audio join without listen only
This is a rework of the audio join procedure whithout the explict listen
only separation in mind. It's supposed to be used in conjunction with
the transparent listen only feature so that the distinction between
modes is seamless with minimal server-side impact. An abridged list of
changes:
  - Let the user pick no input device when joining microphone while
    allowing them to set an input device on the fly later on
  - Give the user the option to join audio with no input device whenever
    we fail to obtain input devices, with the option to try re-enabling
    them on the fly later on
  - Add the option to open the audio settings modal (echo test et al)
    via the in-call device selection chevron
  - Rework the SFU audio bridge and its services to support
    adding/removing tracks on the fly without renegotiation
  - Rework the SFU audio bridge and its services to support a new peer
    role called "passive-sendrecv". That role is used by dupled peers
    that have no active input source on start, but might have one later
    on.
  - Remove stale PermissionsOverlay component from the audio modal
  - Rework how permission errors are detected using the Permissions API
  - Rework the local echo test so that it uses a separate media tag
    rather than the remote
  - Add new, separate dialplans that mute/hold FreeSWITCH channels on
    hold based on UA strings. This is orchestrated server-side via
    webrtc-sfu and akka-apps. The basic difference here is that channels
    now join in their desired state rather than waiting for client side
    observers to sync the state up. It also mitigates transparent listen
    only performance edge cases on multiple audio channels joining at
    the same time.

The old, decoupled listen only mode is still present in code while we
validate this new approach. To test this, transparentListenOnly
must be enabled and listen only mode must be disable on audio join so
that the user skips straight through microphone join.
2024-08-15 00:43:28 +00:00
prlanzarin
cf293fe7fd feat(audio): channel threshold for transparent listen only activation
Transparent listen only is currently only worth it for meetings with a
number of duplex audio channels larger than a certain value (dependant
on system performance). That is due to the fact that global audio
bridges created for the mechanism also use significant CPU (roughly the
same as an unheld duplex channel), which means it's cost is usually
offset only once there are enough potential channels to be held in a
conference.

This commit adds a new optional feature that introduces some dynamicity
for the mechanism: it'll only be triggered after at least
@voiceConf.transparentListenOnlyThreshold number of muted duplex
audio channels are present in a conference.
The default is 0 (always trigger transparent listen only if the general
mechanism is activated).
2024-08-15 00:43:27 +00:00
André Castro
39dba53dec
Fix: Emoji picker not closing when clicking outside (#20910)
* Fix: Emoji picker not closing when clicking outside
2024-08-14 13:54:41 -04:00
Paulo Lanzarin
8fb5d84fb8
docs: remove leftover Kurento documentation (#20930) 2024-08-14 10:14:23 -04:00
dependabot[bot]
e2a21dbea2
build(deps-dev): bump postcss (#20932)
Bumps the npm_and_yarn group with 1 update in the /bbb-learning-dashboard directory: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.4.38 to 8.4.39
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.38...8.4.39)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-14 09:32:30 -04:00
Ramón Souza
68121436b6
Merge pull request #20923 from AtilaU19/task_1927
fix(darkmode): fix avatar username color when dark mode is enabled
2024-08-14 10:14:57 -03:00
dependabot[bot]
23d5f75693
build(deps): bump the npm_and_yarn group across 6 directories with 2 updates (#20928)
Bumps the npm_and_yarn group with 1 update in the /bbb-export-annotations directory: [axios](https://github.com/axios/axios).
Bumps the npm_and_yarn group with 1 update in the /bbb-graphql-actions directory: [axios](https://github.com/axios/axios).
Bumps the npm_and_yarn group with 1 update in the /bbb-learning-dashboard directory: [postcss](https://github.com/postcss/postcss).
Bumps the npm_and_yarn group with 1 update in the /bigbluebutton-html5 directory: [axios](https://github.com/axios/axios).
Bumps the npm_and_yarn group with 1 update in the /bigbluebutton-tests/playwright directory: [axios](https://github.com/axios/axios).
Bumps the npm_and_yarn group with 1 update in the /bigbluebutton-tests/puppeteer directory: [axios](https://github.com/axios/axios).


Updates `axios` from 1.7.2 to 1.7.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.7.4)

Updates `axios` from 1.6.4 to 1.7.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.7.4)

Updates `postcss` from 8.4.37 to 8.4.38
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.37...8.4.38)

Updates `axios` from 1.7.3 to 1.7.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.7.4)

Updates `axios` from 1.7.2 to 1.7.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.7.4)

Updates `axios` from 1.7.2 to 1.7.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: axios
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: postcss
  dependency-type: direct:development
  dependency-group: npm_and_yarn
- dependency-name: axios
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: axios
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: axios
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-14 08:52:25 -04:00
Anton Georgiev
21533ee42a
build: revert removal of gzip command in bbb-html5/build.sh (#20929) 2024-08-14 08:48:13 -04:00
transifex-integration[bot]
35ac6f14a2
Updates for project BigBlueButton v3.0 HTML5 client and language pt_BR (#20931)
* Translate en.json in pt_BR

100% translated source file: 'en.json'
on 'pt_BR'.

* Translate en.json in pt_BR

100% translated source file: 'en.json'
on 'pt_BR'.

---------

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-08-14 08:45:46 -04:00
Anton Barboza de Sá
c6e8464693
core: Makes CI read the needed data from an uploaded file when the tests finish (#20810)
* core: get PR number from artifacts on completed testing workflow

* core: split merge and upload blob-report action into a separate file

* ci: do not remove artifact files
2024-08-13 23:48:18 -03:00
João Victor Nunes
2139817595
fix(external-video): player unsynced when switching presenter (#20883) 2024-08-13 19:11:55 -04:00
Ramón Souza
9cb0123717
fix(client): undefined variable in emoji rain (#20926) 2024-08-13 16:00:10 -04:00
Anton Georgiev
b6b06e714e
chore: add list of supported languages for captions (#20924) 2024-08-13 14:09:09 -04:00
AtilaU19
0f646c4c7f fix(darkmode): fix avatar username color when dark mode is enabled 2024-08-13 16:26:37 +00:00
Paulo Lanzarin
79df213a46
Merge pull request #20898 from prlanzarin/u30/fix/remove-spurious-gum
fix: remove spurious getUserMedia in ErrorScreen
2024-08-13 11:26:10 -03:00
Paulo Lanzarin
955b3cffc3
fix(html5): restore lint:file npm script (#20891)
Restore the  `lint:file` npm script. Rationale outlined in
  - 07960af
  - https://github.com/bigbluebutton/bigbluebutton/pull/13870

> The lint:fix hook fixes/alters things. The lint run script runs eslint over the whole root directory.
> I just want to check linting offenses on a per-file/directory basis without having files messed with or needing a fancy IDE.
2024-08-13 09:55:14 -04:00
Ramón Souza
32f42163fa
fix(client): add doctype + remove extra styles (#20911) 2024-08-12 17:36:41 -04:00
Tainan Felipe
41582d57a6
Fix: Improve performance in webpack hmr and build (#20912)
* Fix: Improve performance in webpack hmr and build

* Add: performance boundaries
2024-08-12 14:41:38 -04:00
Jesus Federico
f488859b32
fix: docs/package.json & docs/package-lock.json to reduce vulnerabilities (#20901)
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116

Co-authored-by: snyk-bot <snyk-bot@snyk.io>
2024-08-12 13:02:43 -04:00
dependabot[bot]
d1e00ae99e
build(dashboard): bump postcss (#20895)
Bumps the npm_and_yarn group with 1 update in the /bbb-learning-dashboard directory: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.4.36 to 8.4.37
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.36...8.4.37)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-12 13:01:18 -04:00
transifex-integration[bot]
45aec8bb80
Translate en.json in ja (#20902)
100% translated source file: 'en.json'
on 'ja'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-08-12 13:00:25 -04:00
transifex-integration[bot]
e93ca48b75
Translate en.json in et (#20905)
100% translated source file: 'en.json'
on 'et'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-08-12 12:59:57 -04:00
Anton Georgiev
1d64e6536e
config: Warn when .dpkg-dist files detected in /etc/default (#20904)
* config: Warn when .dpkg-dist files detected in /etc/default

* Update bigbluebutton-config/bin/bbb-conf
2024-08-12 12:45:45 -04:00
Ramón Souza
1639978d17
Merge pull request #20907 from ramonlsouza/fix-font-path
fix: fonts path
2024-08-12 11:01:00 -03:00
Ramón Souza
3d5dedec90 fix font path 2024-08-12 10:15:38 -03:00
Ramón Souza
865032895a
Merge pull request #20886 from ramonlsouza/away-audio-flag
add config flag to mute audio output on away mode
2024-08-12 10:05:13 -03:00
Gustavo Trott
47997a932a
Add scripts to run html5 from source (#20899)
* Add scripts to run html5 from source

* remove unnecessary sudo
2024-08-12 09:35:45 -03:00
Anton Georgiev
b1b79653cc
build: remove old custom bbb-html5 NodeJS binaries (#20897)
* build: remove old custom bbb-html5 NodeJS binaries

* docs: mention removal of node v14

* build: list bbb-web as dependency to bbb-config

* build: undo set license

* re-add bbb-html5 as dependency to bbb-config
2024-08-10 13:03:11 -04:00
prlanzarin
4dcc77968b fix: remove spurious getUserMedia in ErrorScreen
There's a very odd getUserMedia call tucked into the base ErrorScreen.
There's no rationale in either the commit or PR that added them, but the
intention seems to be stopping audio on client crash.
Using getUserMedia like that will have no effect other than an odd
permission prompt on iframe-based environments or a webcam activation
flash after the client crashes.

Remove ErrorScreen's getUserMedia call as well as the HTMLMedia pause
call - both should be handled gracefully by AudioManager's forceExitAudio
triggered by the StopAudioTracks event (also ErrorScreen). If there's an
edge case where it isn't properly stopped, we'll have to tackle it
there.
2024-08-09 19:24:33 +00:00
Ramón Souza
7896b37f46
Merge pull request #20893 from gabriellpr/skip-pin-notes
test: Skip pin notes onto whiteboard to be updated
2024-08-09 16:02:08 -03:00
dependabot[bot]
81f6664f7c
build(deps-dev): bump postcss (#20890)
Bumps the npm_and_yarn group with 1 update in the /bbb-learning-dashboard directory: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.4.35 to 8.4.36
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.35...8.4.36)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-09 14:48:03 -04:00