In cases like waiting-for-host lobby, jicofo can leave the room and rejoin later, without the room being destroyed. We need to make sure the metadata will reach jicofo on second attempt.
* fix: Fix example file.
* fix: Fix using webhook proxy with iframe and jaas tests.
* fix: Fixes detecting max users notification.
* ref: Clear _joinParticipant to not depend on participant names.
* ref: Use joinParticipant in jaas tests.
* ref: Drops JAAS_DOMAIN as BASE_URL is used.
* fix: Drops ctx from function parameters.
* ref: Drops not needed context members.
* ref: Drops extra function.
* ref: Participant.joinConference to use roomName from options.
* doc: Updates docs.
* fix: Adds roomName to joinOptions.
Make it possible to override the generated value.
Replaces hard-coded pixel values with relative rem units across UI components to improve typography responsiveness and maintainability.
Co-authored-by: Hristo Terezov <hristo@jitsi.org>
* ref: Don't use global context for local state.
* ref: Don't use global context to store the pin.
* feat: Add a test for setting passcode via settings provisioning.
* Use local state.
* Remove "data" from context.
* ref: Rename a function.
* test: Fail quick when join muc fails, assert specific errors (e.g. "token expired").
* test: Add tests for joining a JaaS MUC with different token options.
* ref: Refactor token generation and usage
* ref: Reduce usage of global context
* test: Add a maxOccupants jaas test.
Before the chat message context menu was appearing on the left if the private chat message was disabled. The fix makes the context menu appear on the left only for messages from the local partcipant which are the only messages rendered to the right (therefore the context menu have to appear on the left side). For all other messages the context menu should appear on the right side because the message is positioned on the left side.
The participant pane lost its scrolling capability when commit 2305ae85a removed the overflowY: 'auto' property from the container styles. This prevented users from scrolling through long lists of participants, breakout rooms, or visitors when the content exceeded the available height.
Additionally, context menus were being clipped on the left side due to the overflow constraints. This became apparent after the av-moderation feature added longer menu items like "Stop screen-sharing for everyone else".
Fix:
- Restore overflowY: 'auto' to enable vertical scrolling
- Add maxWidth constraint (285px) to context menus to prevent horizontal clipping
- Allow menu text to wrap to multiple lines instead of being cut off
- Add TODO comment for future portal-based implementation
This temporary solution provides both functional scrolling and fully readable context menus until a proper architectural change can be implemented to portal context menus outside the scrollable container.
- Move namespace declaration to correct location in build.gradle
- Remove deprecated package attribute from AndroidManifest.xml
- Update README with gradle plugin version requirement
- Fix Android namespace configuration for React Native SDK
These changes resolve installation and build errors when integrating
the Jitsi Meet React Native SDK into new projects.
Fixes: SDK installation failures on Android with newer Gradle versions
When a moderator joins or someone is granted moderation we update the whitelist for any media type for which moderation is enabled. The updated whitelist is sent to all the moderators including the newly joined or granted one.
Visitors with empty or undefined names now show the configured
defaultRemoteDisplayName or 'Fellow Jitster' as fallback, matching
the behavior of regular remote participants.
We were comparing if the number of waiting participants have changed with the wrong property from the state - the number of visitors. The result was that we won't update the state when the new waiting value matches the number of visitors already in the state. Most of the times this will be 0 and we would never go to 0.
Remove filtering on the receive side, because:
1. It's not applied to visitors, and should be for the "all" case
2. We don't want to strip stats-id from stanzas sent to jicofo
* JIT-14750 Do not show names to visitors
* apply review
* change name and email too
* fix: Fix filtering initial presence to vnodes.
* Also strip stats-id and identity.user.name.
* Move filtering logic to a util, filter all identity in main room
---------
Co-authored-by: Boris Grozev <boris@jitsi.org>
Adds .web suffixes to all web specific files to prevent beeing included in the native build. Before this it seems those files were included in the build but by some chance nothing was failing.
When we open a custom scheme URL before the window load event has been fired it seems that GUM prompt is not displayed after this due to Chrome bug. See more details here https://issues.chromium.org/issues/41398687.
The result in Jitsi Meet is the following:
If the user is joining a call for first time and haven't granted A/V permissions and lands on the deeplinking page we try to open the desktop app via redirect to a custom scheme URL. If the user chooses cancel and "Launch in web" we go to the prejoin screen and proceed with the initial GUM. At this point any GUM call won't display the permission prompt due to the browser bug and will go on forever making it impossible for the user to unmute camera or microphone.
* This is a huge update, mostly because we updated Gradle on the Android side, which includes a more strict bundle process for third party modules. On iOS, even though new architecture is disabled, we had to be explicit about it because of this react native update and because some updated dependencies have it enabled by default and are using turbo modules which are not available, YET, in our project.
When there is empty array cjson produces array: {} while prosody's json impl checks is it array and produces the correct value (array: []). Prosody impl is a little bit slower, but this is not a hot path and those are not huge json strings.
* Reusing existing translation string for virtual background error notification, instead of current hardcoded english value.
* Update VirtualBackgroundPreview.tsx
* Attempt to call a nil value (global 'get_visitors_room_metadata')
* make the linter happy
* more trailing whitespace + cleanup
* apply review
* use default false
Skip updating the transcribing state when the 'audio-recording-enabled'
property is not provided.
This fixes a race when a transcriber is already in the room, we'll see
it before properties are updated (sometimes) and without checking for
undefined we'd flip the local value to false.
For all intents and purposes 8x8 apps are integrating the SDK as a 3rd
party.
Yes, we are a 1st party of sorts, but that's ok because 8x8.vc allows
embedding.
We have observed terrible framerates due to the decoder getting
constantly restarted. Surprisingly, this only happens when using the
JVB, it does not happen when using P2P with Chromium as the other
endpoint.
We shall look into that from the bridge side.
At any rate, I'm disabling the HW video decoder for AV1, which means we
will be using dav1d, the software video decoder.
We do not need to keep granted permissions in separate field. We can always check the granted user-id or whether the current participant has a token (session.auth_token).
* feat(visitors): Allow participants pane button.
* feat(visitors): Do not count the local participant when in visitor mode.
* feat(visitors): Use same buttons on web and native.
* feat(visitors): Always show the visitors count.
It was shown only for the main participants.
* feat(visitors): Skips showing local in participants pane when visitor.
* feat(jwt): Delay loading of avatar.
Only load avatar when jwt has been validated server-side (after connected). The drawback is not loading the avatar on pre-join page only the first time.
* squash: fix comments.
* feat(metadata): Sends a list of main participants to jicofo.
Drops adding metadata in the form, jicofo, jigasi and client are reading both and now we send initial message before the self-presence.
* squash: Fix error and make a shallow copy of metadata before sending to jicofo.
We have observed some failed recordings which are lacking the EBML
header. The only way in which that seems plausible is if the
dataavailable event is received while processing the stop event. This is
allegedly not possible, but it's the only plausible explanation, so
let's defend against that.
Extend the timeslice back to 5s too.
* chore(deps): replace moment.js with day.js for locale handling and
pin day.js version to 1.11.13 in package-lock.json
---------
Co-authored-by: Calin-Teodor <calin.chitu@8x8.com>
Rework sync so uploading multiple files at once or several moderators
uploading files simultaneously doesn't break synchronization.
The current room metadata plugin operates on <key,value> pairs and we
were using a generic "files" key and using a nested object as our value.
Since with every operation the entire object is replaced it's easy to
get out of sync because one needs to be sure to have the full state
before overwriting it.
This is not realistic.
We'll look into making the metadata plugin more flexible in order to
support add / delete operations also on nested objects, but for the time
being the following will suffice:
Use a key prefix, so each file has en entry in the room metadata, like
so: "files.<the file ID> -> file metadata". This means that when a file
is deleted we just empty the metadata. The metadata plugin doesn't
currently support removing existing keys.
After a lot of back and forth, WebM seems to be the only option we
really have. In terms of containers and codecs, here is the rundown:
- WebM, any codec: the resulting file is not seekable
- MKV, any codec: the resulting file is not seekable
- MP4, vp9 + opus: video artifacts and audio clipping, file is seekable
- MP4, av1 + AAC: all good, but not supported on Linux :-/
MP4 looked very promising but there is no combination that leads to
something that works reliably everywhere, oh well. In addition, MP4
files can be opened with QuickTime on macOS, but not with the codec
combination we'd use, so that is somewhat a disadvantage.
So, we are back to where we started: WebM with VP8 and opus. But we need
to fix the duration in a potentially long file... the trick is to _only_
fix the duration. We can do that by inserting the right segment in the
metadata section. Something we cannot do without reading the whole file
is create cue points, but players like VLC seem to work well without
them.
Setting the UA string in Electron doesn't propagate the change to the
iframe where the meeting is loaded (🤦).
Thus make it more resilient by trying different things:
- A freshly introduced "iAmSpot" config option, similar to Jibri
- The app ID is present in the UA string, so we can test for that
- As a last-ditch effort, check if the display name is the default
"Meeting Room"
* Revert "feat(base/ui/native): Convert rem to px (#15934)"
This reverts commit 057dc0e4d2.
* Revert "fix(StageParticipantNameLabel): size"
This reverts commit a01f4468a0.
* Revert "fix(subtitles): position part1"
This reverts commit 6c6ed8d7a8.
* Revert "fix(ITypographyType): wrong type of fontSize and lineHeight props"
This reverts commit bffcc9092b.
* revert(Tokens): font sizes and line heights back to px from rem
Turns out there are many places that does not expect rem. Temporary reverting this change from commit 6fa94b0bb4. We should bring it back along with proper handling of rem everywhere.
In the 1st incarnation of local recordings we used to use VP8 as the
video encoder. Upon switching to MP4 that combiantion is not supported
for some reason, so I used VP9 instead.
Some anecdotal evidence suggests VP9 is behqaving more erratically, with
rendering errors and fixes.
Turns out Chrome also supports the Matroska container! And VP8 inside it
at that! The bonus we get from using it is that QuickTime on macOS won't
try to open it, thus avoiding some confusion with MP4 files, which it
recognizes, but cannot open due to the video codec.
Fixes an issue where StageParticipantNameLabel is smaller. This is caused because the font size and line height props are calculated to an invalid (NaN) value after we started using rem instead of px for lineHeight and fontSize in theme.
Reference: #15917
Fixes an issue where subtitles are displayed in the middle of the screen. This is caused because the bottom prop is calculated to an invalid (NaN) value after we started using rem instead of px for theme.spacing.
Reference: https://github.com/jitsi/jitsi-meet/pull/15934
Fixes an issue where subtitles are displayed in the middle of the screen. This is caused because the bottom prop is calculated to an invalid (NaN) value after we started using rem instead of px for lineHeight in theme.
Reference: https://github.com/jitsi/jitsi-meet/pull/15917
In a previous comit about accessibility we changed the fint size and line height to use rem (expressed as string) instead of numbers for px but the types for the interface were not updated.
Currently the clientWidth is not representing the window width but it is representing the available video space width since we are subtracting the width of the participants pane and chat area.
When turned on, the consent dialog won't be displayed for the users who
are already in the meeting, it will only be displayed to those who join
after the recording was started.
Flush the file after the 'stop' event is emitted, which happens _after_
the last 'dataavailable' has been emitted, and thus when the
MediaRecorder is really done.
In addition, lower the time slice as added precaution against crashes.
It's OK if we don't have any local audio track, we'll add it to the
mixer later.
The original bug / limitation that prompted the previous code no longer
applies since we always have a MediaStream (with audio tracks) which
we are recording.
Capture the tab audio, which will include all participants and sound
effects, YouTube videos, anything playing in the tab.
This requires the `suppressLocalAudioPlayback` constraint since
otherwise the shared tab won't keep playing audio.
Local audio still needs to be injected seprarately, since it's not
played back to the local user.
A given recording should only trigger a single consent request.
The mechanism to notify about recording status updates may fire multiple
times since it's tied to XMPP presence and may send updates such as when
the live stream view URL is set.
Rather than trying to handle all possible corner cases to make sure we
only show the consent dialog once, keep track of the recording session
IDs for which we _have_ asked for consent and skip the dialog in case we
have done it already.
Use the `showSaveFilePicker` File System Access API to pre-select the
file for download and stream the contents there. The browser uses a
temporary file as the buffer, thus not requiring us to buffer the
contents in memory.
Also change the container to MP4, since we have no way to fix the
seeking problem since we don't have the file in memory. Good news is
that it's supported since Chrome 126 and we can feature detect it!
Finally, add a helper `isSupprted` method which feature-detects
everything we need to make this work.
Ref: https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker
Ref: https://groups.google.com/a/chromium.org/g/blink-dev/c/p1OMVj1FrMI/m/6FdLk7rZAQAJ
We either expose those events in LJM or live with strings since they
match standard WebRTC states, but depending on the package just for 3
events is just not right.
If the desktop picker window is closed before we load the sources, a JS error is thrown. From there the app goes into a broken state where when the screen sharing button is pressed nothing happens. Explanation:
When the error from the _onCloseModal handler is thrown we don't reach the line to call the onSourceChoose callback. The result is that we never call the callback received by setDisplayMediaRequestHandler. It seems that when this happens on subsequent gDM calls electron won't call the setDisplayMediaRequestHandler and therefore we don't display the desktop picker.
* feat(tests): Simplifies display names and participant create.
Moves token creation only when needed.
* squash: Skip webhook check of user id for guest participants.
* squash: Waits for kick reason dialog.
* squash: Simplifies by matching participant name and display name.
* squash: Drop displayname field.
* style(general) Replaced font-size fixed units with rem
* style(general) Replaced font-size fixed units with rem in the tokens
* style(general) Replaced line-height fixed units with rem
When any of the backend is used 'anonymous', 'jitsi-anonymous', 'internal_hashed', 'internal_plain', 'cyrus' and a participant becomes a moderator, because of external module or because set from jicofo we send to client with the self-presence about becoming moderator a default set of permissions which can be controlled via prosody config.
If using 'token' authentication the above applies only if there is a token and the token does not contain context.features.
* feat(logging): Let ljm handle its logging to rtcStats.
* chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1919.0.0+d4a47d0e...v1922.0.0+25031534
* squash: Small gap between stopping screenshare and turning on video.
We see some FF failures and not sending video in p2p mode after enabling video back one shortly after switching off screenshare.
Mobile web browsers may not allow opening multiple cameras at the same
time, this is a limitation coming from the underlying paltform. As such,
avoid createing a new track before we have disposed the previous one.
This does introduce a _slight_ fade to back effect, but the alternative
is an exception, so I'll take it! To make matters worse, this is not
necessarily a problem with all devices. It has been observed in a
Samsung S24, at least.
* Add translation to audio, video, notifications and shortcuts
* Try fix linting errors
* Add space after colon in shortcuts entry in Arabic translation
* feat(jwt): Adds an option to match tenant.
There are cases where if tenant doesn't match features are ignore in the backend via prosody and session.jitsi_meet_tenant_mismatch.
* squash: add a comment explaining the change.
* squash: fix comments.
* squash: fix comments2.
* feat(tests): Fixes the checks when to use token.
We have few options:
- iframeAPI tests generating tokens via jwtPrivateKeyPath
- tests that just use provided JWT_ACCESS_TOKEN for the first participant to avoid deployments where initial authentication is required
- tests that does not use iframeAPI, but want to use the jwtPrivateKeyPath for a meeting (invite test as JWT_ACCESS_TOKEN does not satisfy some services)
* squash: Bump hangup wait, redirects may take a little bit more.
* squash: Rename forceGenerateToken to preferGenerateToken and fix logic when private key is missing.
* fix(breakout-rooms) fix processing commands
* squash: fix wrong var name.
* squash: fix move to breakout room.
It can be from breakout to main or from main to breakout.
---------
Co-authored-by: damencho <damencho@jitsi.org>
* fix: padding in the welcome page and overflow of meeting list
- Add padding to the header of the welcome page in small screens.
- Fix the tab content in the welcome page, because there was an ugly overflow.
- Create new color variables for welcome page button.
This includes interfaceConfig.SUPPORT_URL, interfaceConfig.LIVE_STREAMING_HELP_LINK, config.defaultLogoUrl, config.deploymentUrls, config.liveStreaming and config.customToolbarButtons.
* fix: Check for ICE connected as part of ensureXParticipants.
* squash: Move waitForIceConnected and waitForSendReceiveData to ensure methods.
* squash: Check ICE first, then "send receive data", then remote streams. Report the correct failure.
---------
Co-authored-by: damencho <damencho@jitsi.org>
Tests that take time (desktopSharing) before they use one of the browsers (the 4th one), by the time we use it backend may have timed out the websocket (60 seconds). Add every 20 second and execute a print to keep it alive.
LogCollector stops saving logs the moment we leave the room, although we take care to stop statistics from ljm and throw events so we can flush the logs.
Flush on conference failed.
If the notification disappears, we don't have any other indication about this.
We were not showing any notification if only video is allowed.
Adds option to unmute audio or video, depend on what was allowed.
In order to use gDM in Electron the flow is somewhat reversed. It starts
from the Electron main process, so we need an API in the external_api
that can trigger the builtin picker. The picker is still necessary.
Fixes the following: Warning: A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components
Detected due to failure while moving locked room test.
* do not show conference info in prejoin or lobby
Signed-off-by: Joshua Irmer <irmer@gonicus.de>
* fix typo
Signed-off-by: Joshua Irmer <irmer@gonicus.de>
---------
Signed-off-by: Joshua Irmer <irmer@gonicus.de>
Without it, we cannot detect what features to polyfill.
Some bundles have seen a size increase, this is due to necessary
polyfills now being included as usage was detected.
The proposal never passed stage 1 and was last updated 4 years ago,
which signals it won't make it into the language: https://github.com/tc39/proposal-export-default-from
The alternative is just a couple of characters longer.
webpack + babel-loader + core-js should've take care of it, but they
somehow don't and I couldn't finesse the webpack config enough.
This is a stop-gap.
Fixes: https://github.com/jitsi/jitsi-meet/issues/15539
Sometimes jicofo may leave before the disconnect iq reaches the visitor prosody, that will cause a reload for all visitors instead of a dialog for conference ended.
Fixes the case when someone enters a wrong password to access the meeting and then clicks back to continue knocking and not showing the knocking state, while still in the Lobby room.
The problem was introduced in 721bb4e, on access denied we are being kicked out of lobby room and then knocking state should be cleared.
Technically, on Android, the audio mode is configured but no audio is
played. Since the configured audio mode matches what we expect from a
calling app (what we support to coexist with) this is enough to not
create audio disruptions.
* fix(share-video): Hide element when not shown on large.
Fixes two issues:
- disabling mouse for all large video types, including local shared desktop that prevents clicking the link to show content
- as shared-video z-index is on top of everything, it local shared desktop to be seen when the thumbnail is clicked
* squash: Drop the video shared component from the dom when not playing.
If we are not requesting any transcription, `language` will be `null` so
take that into consideration when checking if we should stop processing
a transcription message after firing the API event.
Fixes: https://github.com/jitsi/docker-jitsi-meet/issues/1997
* Fixed exception for visibility state of mute all button
* Updated changes as per review: shifted conditional to the toggle
* chore: fix eslint warnings and errors
---------
Co-authored-by: Bhavik Arora <arorabhavik1001>
* fix(tests): Another attempt to fix Firefox excludes.
Drawback is that it will be a little bit slow.
* feat(tests): Adds chatPanel tests.
* feat(tests): Adds codec selection tests.
* feat(tests): Adds option to skip suite.
* fix(tests): Rename context to ctx to avoid clashing mocha's one.
* feat(tests): Moves room name generation in hooks.
Move also the proxy connection in the hooks.
* fix(tests): Avatar checks when using a token.
Token has its avatar so we skip the token for avatar tests.
* feat(tests): Renames avatars to drop Test from name.
* feat(tests): Updates dependencies.
* feat(tests): Fix end test log.
* feat(tests): AVModeration tests.
* fix(shared-video): Removes disable pointer for non moderators.
It fixes an issue where people can see ads from YouTube, allowing them to click the Skip Ad button. If you by mistake pause, the next time sync will unpuase it.
* squash: Remove unused.
Our SDK is only really tested with a single RN version, make sure to put
that in peerDependencies.
In addition, drop the peer dependency on @react-native/metro-config
since our project doesn't use it directly.
* fixtranscript results from whisper may have json.language="zh-TW" also requesting transcriptions language could be "zh-CN". Use _getPrimaryLanguageCode func to compare only the main lang code.
* fix: lint issue
* feat(prosody): extend jigasi kick endpoint to work for any participant
* apply review
* squash: Fix UI when there is no actor of the kick.
---------
Co-authored-by: damencho <damencho@jitsi.org>
* feat(tests): Adds join options.
* fix(tests): Fix opening tests by default with tenant.
* fix(tests): Renames a method.
* fix(tests): Moves a method from filmstrip to participants pane.
* fix(tests): Adds ok button to base dialog.
* fix(tests): Adds missing checks for using iframe API.
* feat(tests): Prettify the result html on error.
* fix(tests): Fixes checking when not in room.
* fix(tests): Adds profile button to toolbar.
* fix(tests): Adds avatar test.
* fix(tests): Fix all execute methods and await.
* fix(tests): Fix avatar checks.
* fix(tests): Fix include/excludes of tests based on participant count.
* feat(tests): Define context globally.
The context is being created on every new suite in before hook.
* feat(tests): Drop extra char in room name.
* feat(tests): Adds an option to load iframeAPI.
* feat(tests): Adds some ts types.
* fix(tests): Fix iframeAPI helper with events received too early.
* fix(tests): Fix iframeAPI helper detecting own role changed.
* feat(tests): Adds run script to start tests with local dev server.
* feat(tests): Adds participants iframeAPI tests.
* feat(tests): Updates wdio dependencies.
* feat: Adds grid config.
* feat: Simplify iframeAPI.
Drop URL params.
* feat: Adds tenant to iframeAPI.
* feat: Adds firefox target.
Certain tests are disable as not supported on FF. Missing upload file function for iframeAPI helper. Missing option to set audio file as a mic source.
* fix: Fix using tenant from baseUrl.
* feat: Adds audio only tests.
* feat: Adds option to generate tokens for the moderator.
* feat: Adds option to test and webhooks.
* fix: Improve error stack trace on error.
* fix: Address comments.
* fix: Fix test exclusion for FF.
* squash: Revert the strophe change and add a comment.
Make sure there are several connects before slowing down the visitor trying to join. This slow down is handling the case where the meeting was live few minutes ago, but ended.
We need to check whether the live field is defined ignoring its boolean value. When it is false we were ignoring it and still marking the room as live.
We cannot look up the name as the meeting is left and data has been cleaned up already.
The value is coming from ljm and the reported actor: JitsiParticipant.
- Run Android and iOS on macOS (same as our release process)
- Simplify checking for Podfile changes
- Simplify frontend actions
- Add CI for building the native Android and iOS SDK
If a non final transcript was displayed and then hidden and then we receive a final transcript we remove the part that has already been shown before. If the final transcript is the same as the non final that was already displayed we don't show the final.
* Adding sq translation
* Adding sq to languages.json
* Updating sq translation
* Fixing missing commas and updating string changes
* Fixing unclosed quotes
* Updating sq translation
* Updating sq translation
* Typo fixing; removing and adding commas to make the .json file valid
* Another comma missing fix
* Sorting entries aphabetically
* More sorting…
* More entry sorting
* Adding a missing space
* Adding spaces
* Get rid of an extra period
* Update for sq locale
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update for sq translation
* Adding missing separator
* Adding another missing separator
* Adding another separator
* Not tired of adding separators…
* Typo fixing
* Changing place for a string; translating a forgoten string
* Updating sq translation
* Deleting an extra space at the beggining of a string
* Update for sq translation
If you are in meeting and you want to join another meeting from an external link, it is not possible.
That is because Prejoin screen didn't get unmounted, isJoining remains true and button is unpressable.
Most probably because react navigation, where the screen only gets focused or blurred.
There seems to be an issue related to FlatList component. It was introduced after we updated to a newer version of React Native. Transitioning the app from background to foreground triggers re-renders that affect the visible remote participants, at least in tile view, by sometimes removing them from the list.
* feat(tests): First test from torture to meet.
* squash: Fixes logging as per comments.
* squash: Fixes some eslint errors.
* squash: Drop no needed await and async declarations.
* squash: Simplify syntax.
* squash: Disable blur everywhere not only FF.
* squash: Use allSettled.
* squash: Prettify intervals and timeouts.
* squash: Use uuids for torture rooms.
* squash: Introduce helper methods in Participant for toolbar and filmstrip.
* squash: Changes headless resolution to a standard 720p.
* squash: Adds env BASE_URL.
* squash: Fix some eslint errors.
* squash: Fix js error.
* squash: Fix participant logs.
* squash: Move bag to Promise.all.
* squash: More types thing.
* squash: Fix more ts errors.
* squash: Bumps version to include 6d146cd332
* squash: More ts stuff.
* squash: Fixes last ts errors.
* squash: Drop eslint rule.
* squash: Update default configs.
* squash: Drop and docs eslint.
* feat(noise-suppression): Add support for BVC model
* feat(noise-suppression): Add support for extended BVC devices list
This commit adds support for extending the list of allowed BVC devices in the noise suppression feature. It introduces a new file, `bvc-allowed-ext.txt`, which can be used to include additional BVC supported devices.
* fix(noise-suppression): reuse the existing audioStream for Krisp initialization
* update krisp configuration
* refactor(krisp): Update Krisp JS SDK version and noise suppression configuration
* refactor(config): update config default values, add the enabled flad in INoiseSuppressionConfig
- Do not throw the error. This results in unhandled rejection promise.
- Add proper logging so that we can figure out from which video element the error occured.
* Adding sq translation
* Adding sq to languages.json
* Updating sq translation
* Fixing missing commas and updating string changes
* Fixing unclosed quotes
* Updating sq translation
* Updating sq translation
* Typo fixing; removing and adding commas to make the .json file valid
* Another comma missing fix
* Sorting entries aphabetically
* More sorting…
* More entry sorting
* Adding a missing space
* Adding spaces
* Get rid of an extra period
* Update for sq locale
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update main-sq.json
* Update for sq translation
* Adding missing separator
* Adding another missing separator
* Adding another separator
* Not tired of adding separators…
* Typo fixing
* Changing place for a string; translating a forgoten string
* Updating sq translation
* Deleting an extra space at the beggining of a string
* fix(lobby): Inconsistent state after deny and then approve.
Fixes several issues:
- The error on lobby deny is not sticky
- When preJoin is not enabled we were showing conference UI and showing the error, while the participant is denied to enter the meeting.
- There was inconsistent state (after deny we were keeping membersOnly conference state) and when being approved on re-try while being in the meeting, no remote thumbnails are shown although media is flowing.
The scenario is enabling lobby and tryintg to join, denying the first attempt and approving the second one.
* squash: Drop extra hide lobby screen.
* squash: Finish action first before showing the notification.
* feat(rn,screen-sharing) allow sharing the screen and camera on mobile
With the advancements in layer suspension it should now be ok to do.
Users can still mute the camera themselves if they so desire.
Having the camera enabled while in the background is a separate effort.
The will-join event happens before we actually try to join and things
would go wrong, whereas join-in-progress happens when it's guaranteed
that joining will be successful.
* add: Missing keys in Turkish language file added with translations.
upd: Translations marked as "", which have not been translated, have been completed.
upd: Updated with "..." (ellipsis), which is the symbolic value for "..." (three dots).
fix: Wrong words in the dictionary in the source have been corrected.
* upd: Updated with "..." (ellipsis), which is the symbolic value for "..." (three dots) all languages.
It was possible that join can be executed before conference.init have even started or we haven't reached the point ot create the initialGUMPromise. This was causing the following issues:
- users stuck on the prejoin screen
- participants join 2+ times in the call (we have been creating more than 1 local participants from a single page).
* add the participants count to the aria label and fix the accessibility toggle for the participants button
---------
Co-authored-by: AHMAD KADRI <52747422+ahmadkadri@users.noreply.github.com>
Currently we add keyboard listeners on conference join but never remove them. In the cases where we have multiple join events during a call (visitors promotion, breakout rooms), there are multiple keyboard handlers added and the shortcuts are executed multiple times on a single press.
* fix(subtitles): Handle errors to revert to default state.
* fix(transcribing): Handle transcriber status changed.
Drops potential transcribers and hidden participant actions and handling. Expect ljm to detect transcriptions on and off.
* feat(transcriptions): Adds a notification if transcriber leaves abruptly.
* squash: Renames action.
* chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1869.0.0+5671c5d6...v1872.0.0+8940b5c9
The exception we see in jicofo: IllegalArgumentException: Value is not a list
We were encoding empty array for media types as {} where it should be [].
- large video does not adhere to the same restriction when it comes to the flip mode, it simply respects the last cached state or the doNotFlipLocalVideo flag if it was provided
* feat(visitors): Transcriptions for visitors.
* squash: Fixes filter iq.
* feat: Rewrites room name requests in rayo iq for visitors.
* squash: Handles visitors count that request transcriptions and the languages requested.
* fix(subtitles): Make sure we show captions button when no features but is transcribing.
* fix(transcriptions): Uses dial command to invite transcriber.
* fix(transcriptions,recording): Allows non moderators with features to dial, record or transcribe.
* sqaush: Make sure filtering works when only is a moderator.
It works now and without a token and no features, but being moderator.
* squash: Rename constant.
* squash: Checks features first before defaulting to moderator when filtering metadata service.
* squash: Checks features first before defaulting to moderator in UI.
* squash: Fixes lint and one other check.
* squash: Moves more logic to is_feature_allowed.
* squash: Drops unnecessary check.
* squash: Uses constant coming from ljm.
* squash: Toggles back captions button on error.
* squash: Fix comment.
* squash: Reverting back isLiveStreamingButtonVisible.
* squash: Fix imports.
Some parts of the ui still showed the setting for flipping the video, even if the flag indicated otherwise
Also fixes the case where setting a virtual background ignores the stored localFlipX setting
- Move the styles from css to tss-react ones
- Dynamic fontSize based on the visible area of the page
- Remove the gaps in the background when a line is wrapped.
- Change the text color to white.
- Remove transparency.
On mobile (React-Native) the sharedVideoAllowedURLDomains property from dynamic branding was filtered and therefore the allow list from the branding was not reaching redux and was ignored.
* feat(shared-video): Shows confirmation dialog before playing video.
* feat(shared-video/native): created ShareVideoConfirmDialog and unified actions
* squash: Simplifies state and fixes stop and then start scenario.
* squash: Use constants everywhere.
* squash: Use helper function.
* squash: Ignore any command with not matching video URL.
---------
Co-authored-by: Calin-Teodor <calin.chitu@8x8.com>
If the readyToClose event was fired there is no need to "leave" the
meeting, it just circles back to the app unnecessarily, potentially
creating another readyToClose event.
During authentication cycle the iceServers URL params are not passed through the various redirects. The result is that the when we finally return back to the conference page authenticated and with the JWT token the iceServers URL param is lost.
There is no point in ever setting lastN to anything other than 0 when in
the background because we are not rendering anything.
When in PiP mode, the app state is not background, which might have
deceived us into adding that check there way back when.
Just remain in the background. The ongoing notification can be used to
get back to the meeting.
NOTE: This behavior only affected the app, not the SDK.
* feat(invite) add email value in peopleSearchQueryTypes and peopleSearchToken config
* feat(invite) pass custom auth token in search directory (e. g. for email directory)
* feat(invite) autocomplete and invitations working with custom auth token (e. g. email invite type), invite icons updated
* feat(invite) remove newly documented config from undocumented settings list
* feat(invite) jwt are now passed in the invite requests headers
* feat(invite) linter-related formatting
* feat(invite) fix default user icon regression
* feat(invite) last lint issues
* feat(invite) pass alternate token in header, not in params
* Fixes lint error
---------
Co-authored-by: Raphaël Badawi <raphael.badawi@ceo-vision.com>
Co-authored-by: Дамян Минков <damencho@jitsi.org>
When the prejoin screen is disabled during the prosody login cycle the initial GUM tracks were lost causing the user to start the call without local media and audio/video mute buttons staying forever in pending state.
Some middleware functions are declared as async. This wraps next(action) in Promise which will delay the execution of actions and also dispatch will return the its result always as a Promise.
We are ending up in incorrect mute state (unmuted) if the initial press event is resulting in a new track creation and the release event happens before the track is created.
Come over for a fun story, dear reader!
Here is a not-so-fun difference in behavior, observed in macOS:
- The builtin keyboard doesn't seem to send the same key over and over
again while it's being held.
- On the contrary, a USB keyboard does.
That means that for some keyboards PTT has been broken. We get
keydown/keyup pairs in quick successing.
One would think that KeyboardEvent.repeat would solve that, but it
doesn't seem to, in practice. See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat
So, in order to solve this, delay handling the keyup event by 50ms. This
way, if a new keydown comes before the keyup has been handled we'll
cancel it and act as it never happened, restoring PTT functionality.
While we're at it, use window.addEventListener rather than
onkeyup/onkeydown, since it's 2024 :-)
* fix(visitors): Fixes going live when first moderator joins.
* squash(jwt): Drop unused field.
* squash(jwt): Fixes loading token_util for visitors component.
* squash(jwt): Validate nbf if it exists as it is optional.
* squash(visitors): Keep prefer visitor state for not live meetings.
* squash(visitors): Automatically go live only when there is a moderator in the meeting.
* squash(visitors): Automatically go live only when there is an occupant in the meeting.
* squash(visitors): Drops a debug log.
* squash(visitors): Makes sure we first disconnect before attempting a reconnect.
If the reconnect happens too quickly, before being disconnected and the conference is still not live we will detect that we are still connected and will skip connecting to visitors service, and in the next moment we will disconnect.
* squash(visitors): Slow down successful reconnects.
If a meeting was just live but was destroyed jicofo will return it is not live, but service will return that it just got live. Slows down reconnects and at some point the service will return that the meeting is not live. The drawback is that it will take some time to connect when the meeting is created and back live.
* squash(visitors): Randomize the delay up to the available value.
* feat(visitors): Handling of live conference and queue service.
* squash: Small refactor mobile code.
* squash: Drop debug log.
* chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1836.0.0+d05325f3...v1839.0.0+ea523fc6
* squash: Adds a count function.
* squash: Drop debug print.
* squash: Skip if queueService is not enabled.
* squash: Avoids double subscribing for visitorsWaiting.
* squash: Fixes lint error.
* squash: Fixes showing dialog.
- on iOS safari and chrome, in case we show eg a spinner until we get the videoConferenceJoined event, all `clientResize` are done with size 0 for width/height
- on iOS we never get a `clientResize` call with correct values, except if we force a call by eg opening/closing the chat window
getJwtDisabledButtons which is used as a selector will create a new array every time it is called. This will lead to unneccessary rerenders on every action where there is no difference in the result of getJwtDisabledButtons because the reference of the array will be different.
As part of the PR, it also fixes:
- Removes button aliases
- Unifies the keys in the object returned by getAllToolboxButtons and the button keys
- Makes sure that the number of buttons displayed are always the same as the number of buttons specified in the thresholds and removes the exception for not filling up the main toolbar with buttons from overflow menu when reactions button is disabled.
- Introduces a priority for buttons that will be used to fill empty spaces in the main toolbar.
Out build process does not actually require nodejs. We assume node/npm is installed on the machine. Dropping it so we can use just nvm to control the versions via .npmrc.
* feat: move jwt to URL hash from search parameters
* fix lint
* comments for future work
* comment format
* fix to use ts-ignore like previous parseURLParams case
- settings string contained a string saying "show / hide settings", but
we should match the english string saying only "show settings" as the
button is only used to show the settings (its a dialog you can't go out of, so
there is no way to go back to the settings button to close, the "hide" case
doesn't exist)
- use "Activer" instead of "Rétablir" and "Démarrer" for toggle on states,
as this wording is used accross lots of other buttons, it makes more sense
to use the same wording
- change the unmute/mute audio/video strings to tell the user its *their*
device they toggle. There are a few spots in this app where we label stuff
as "mute microphone", sometimes its for you, sometimes its for other people.
The idea here is to say "Mute your microphone" instead of "Mute microphone"
so that screen reader users fully understand what they do.
Before we were using setAudioMuted and setVideoMuted which was effectively using separate GUM calls for audio and video. This was problematic in the case where GUM permissions prompt was displayed because two separate prompts were displayed.
* feat: allow client JWT in Authorization header
* cleaner check for initial header
* better comment for the reason for sub(8
* allow query value to override authorization header
* fix(notifications): Adds a 60 secs timeout for bridge channel message.
Also indicates that audio might get disrupted in addition to video when ssrc-rewriting is enabled.
* squash: decrease the timeout to 15 secs if the data channel doesn't establish at all.
- Update project files
- Make sure CI uses Xcode 15.2
- Fix custom Xcode build scripts to depend on the Info.plist file
generation
- Combine 2 scripts related to Firebase into a single one
Fixes#14672.
When passing url param config.subject="Example%20Title" we will send config.subject%22%3A%22%2522Example%2520Title%2522%22 which is double quotes.
In certain cases (lib-unbound not found message from lua) we can detect that jvb account is not existing, and we will re-create causing jvb to not able to connect, as password is changed only in prosody.
Many of the events are not used at all or used only on one place. For the rest of them the listeners were added 2 times on promoted visitors and not cleaned at all.
We were using prosody,util.json and cjson at the same time, but the latter is more performant.
Adds some error handling which were missing with the prosody util json one.
In the case where we switch from jvb to p2p when we need to switch the p2p and jvb track, they will be with the same source name. In order to add the streaming status listener we need to check if the isP2P flag is different. Without this check we won't have the correct stream status listener for the track. Normally the Thumbnail and ConnectionIndicator components will update the streaming status the same way and this may mask the problem. But if for some reason the update from the Thumbnail and ConnectionIndicator components don't happen this may lead to showing the avatar instead of the video because of the old track inactive streaming status.
When screensharing source is the first source to be added with ssrc-rewriting enabled, constraints for the camera tile don't get updated when its pinned. Fixes https://github.com/jitsi/jitsi-meet/issues/14501
Fixes#14491.
When a screensharing participant leaves and is unmuted or sharing the tab audio, there is a dominant speaker changed event which stores wrong values in filmstrip state. And because we skip reordering when there is no filmstrip scroll and no screensharers to avoid reordering on every dominant speaker event for small meetings, we fail to evaluate that the screensharere is actually gone and we still show it.
This will not happen if the one sharing is not dominant speaker (muted) or if there are more participants in the meeting (there is a scroll).
There are cases when if you are kicked and the participant pane is
open, the getBreakoutRooms() call will return undefined and since
isBreakoutRoomRenameAllowed is used in useSelector and fails, all
execution will stop leaving us in a broken state.
This issue tracker is only for reporting bugs and tracking issues related to the source code.
**Before posting, please make sure to check if the same or similar bugs have already been reported.**
⚠️ General questions regarding usage, installation, etc. should be posted in our [community forum](https://community.jitsi.org).
- type:textarea
attributes:
label:What happened?
description:Please describe the problem. Be as detailed as possible.
validations:
required:true
- type:checkboxes
attributes:
label:Platform
description:Onwhat platforms can you reproduce the problem?
options:
- label:Chrome (or Chromium based)
- label:Firefox
- label:Safari
- label:Other desktop browser
- label:Android browser
- label:iOS browser
- label:Electron app
- label:Android mobile app
- label:iOS mobile app
- label:Custom app using a mobile SDK
- type:input
attributes:
label:Browser / app / sdk version
description:Please provide the version of the browser / app / sdk where the problem manifests.
validations:
required:true
- type:textarea
attributes:
label:Relevant log output
description:Please copy and paste any relevant log output. The browser console JS logs (if applicable) is a good start. This will be automatically formatted into code, so no need for backticks.
render:shell
- type:checkboxes
attributes:
label:Reproducibility
description:Does the problem reproduce on meet.jit.si using Chrome, Firefox or the official mobile apps?
options:
- label:The problem is reproducible on meet.jit.si
- type:textarea
attributes:
label:More details?
description:Please provide more details in case they apply (such as the Jitsi Meet version you are running, if you are hosting your own server).
We would love to have your help. Before you start working however, please read
and follow this short guide.
# Follow Our Updated Guide to See How You Can Contribute
# Reporting Issues
Provide as much information as possible. Mention the version of Jitsi Meet,
Jicofo and JVB you are using, and explain (as detailed as you can) how the
problem can be reproduced.
**Hello there! 👋**
# Code contributions
Found a bug and know how to fix it? Great! Please read on.
We're thrilled that you're eager to contribute to **Jitsi Meet! ❤️**
## Contributor License Agreement
While the Jitsi projects are released under the
[Apache License 2.0](https://github.com/jitsi/jitsi-meet/blob/master/LICENSE), the copyright
holder and principal creator is [8x8](https://www.8x8.com/). To
ensure that we can continue making these projects available under an Open Source license,
we need you to sign our Apache-based contributor
license agreement as either a [corporation](https://jitsi.org/ccla) or an
[individual](https://jitsi.org/icla). If you cannot accept the terms laid out
in the agreement, unfortunately, we cannot accept your contribution.
Your interest in improving our platform means a lot to us. To ensure your contributions align seamlessly with our goals and processes, we've recently updated our guide. This guide will provide you with clear instructions on how to get involved effectively.
## Creating Pull Requests
- Make sure your code passes the linter rules beforehand. The linter is executed
automatically when committing code.
- Perform **one** logical change per pull request.
- Maintain a clean list of commits, squash them if necessary.
- Rebase your topic branch on top of the master branch before creating the pull
request.
### 📖 Get Started
## Coding style
Ready to get started? Head over to our [Jitsi Meet Handbook](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-contributing/) and let's make **Jitsi Meet** even better together!
### Comments
### 💬 Join the Discussion
* Comments documenting the source code are required.
Have questions or need help? Join our community discussions on the [Jitsi Forum](https://community.jitsi.org/) where contributors and maintainers can assist you.
* Comments from which documentation is automatically generated are **not**
subject to case-by-case decisions. Such comments are used, for example, on
types and their members. Examples of tools which automatically generate
documentation from such comments include JSDoc, Javadoc, Doxygen.
### ❗️Additional Note
Before sending us your code, double-check that it meets our coding standards. You can do this by running a command: `npm run lint`. If there are any issues, don't worry! You can fix them by running: `npm run lint-fix`. Once your code passes these checks, feel free to submit your pull request.
* Comments which are not automatically processed are strongly encouraged. They
are subject to case-by-case decisions. Such comments are often observed in
function bodies.
* Comments should be formatted as proper English sentences. Such formatting pays
attention to, for example, capitalization and punctuation.
### Duplication
* Don't copy-paste source code. Reuse it.
### Formatting
* Line length is limited to 120 characters.
* Sort by alphabetical order in order to make the addition of new entities as
easy as looking a word up in a dictionary. Otherwise, one risks duplicate
entries (with conflicting values in the cases of key-value pairs). For
example:
* Within an `import` of multiple names from a module, sort the names in
alphabetical order. (Of course, the default name stays first as required by
the `import` syntax.)
````javascript
import {
DOMINANT_SPEAKER_CHANGED,
JITSI_CLIENT_CONNECTED,
JITSI_CLIENT_CREATED,
JITSI_CLIENT_DISCONNECTED,
JITSI_CLIENT_ERROR,
JITSI_CONFERENCE_JOINED,
MODERATOR_CHANGED,
PEER_JOINED,
PEER_LEFT,
RTC_ERROR
} from './actionTypes';
````
* Within a group of imports (e.g. groups of imports delimited by an empty line
may be: third-party modules, then project modules, and eventually the
private files of a module), sort the module names in alphabetical order.
````javascript
import React, { Component } from 'react';
import { connect } from 'react-redux';
````
### Indentation
* Align `switch` and `case`/`default`. Don't indent the `case`/`default` more
than its `switch`.
````javascript
switch (i) {
case 0:
...
break;
default:
...
}
````
### Naming
* An abstraction should have one name within the project and across multiple
projects. For example:
* The instance of lib-jitsi-meet's `JitsiConnection` type should be named
`connection` or `jitsiConnection` in jitsi-meet, not `client`.
* The class `ReducerRegistry` should be defined in ReducerRegistry.js and its
imports in other files should use the same name. Don't define the class
`Registry` in ReducerRegistry.js and then import it as `Reducers` in other
files.
* The names of global constants (including ES6 module-global constants) should
be written in uppercase with underscores to separate words. For example,
`BACKGROUND_COLOR`.
* The underscore character at the beginning of a name signals that the
respective variable, function, property is non-public i.e. private, protected,
or internal. In contrast, the lack of an underscore at the beginning of a name
signals public API.
### Feature layout
When adding a new feature, this would be the usual layout.
```
react/features/sample/
├── actionTypes.ts
├── actions.js
├── components
│ ├── AnotherComponent.js
│ ├── OneComponent.js
│ └── index.js
├── middleware.js
└── reducer.js
```
The middleware must be imported in `react/features/app/` specifically
in `middlewares.any.ts`, `middlewares.native.ts` or `middlewares.web.ts` where appropriate.
Likewise for the reducer.
An `index.js` file must not be provided for exporting actions, action types and
component. Features / files requiring those must import them explicitly.
This has not always been the case and the entire codebase hasn't been migrated to
this model but new features should follow this new layout.
When working on an old feature, adding the necessary changes to migrate to the new
model is encouraged.
### Avoiding bundle bloat
When adding a new feature it's possible that it triggers a build failure due to the increased bundle size. We have safeguards inplace to avoid bundles growing disproportionatelly. While there are legit reasons for increasing the limits, please analyze the bundle first to make sure no unintended dependencies have been included, causing the increase in size.
First, make a production build with bundle-analysis enabled:
We take security very seriously and develop all Jitsi projects to be secure and safe.
If you find (or simply suspect) a security issue in any of the Jitsi projects, please report it to us via [HackerOne](https://hackerone.com/8x8) or send us an email to security@jitsi.org.
If you find (or simply suspect) a security issue in any of the Jitsi projects, please report it to us via [HackerOne](https://hackerone.com/8x8-bounty) or send us an email to security@jitsi.org.
**We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.**
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.