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.
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.