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.
* fix(visitors): Fixes replacing visitor domain.
Constructing the visitor room jid instead of doing a risky replacement.
The problem is having a room like:
[meet-jit-si-shard]someroomname@conference.meet.jit.si and replacing with 'meet.jit.si', the dots match the -.
* feat: Introduces new rate limit setting.
No can have two different values per ip that is used to limit session creation and one that is used when that stanza rate limit is exceeded.
* feat: Introduces unthrottle logic.
* fix: Bumps default iq rate limits.
* feat: Prints how many times a session hits the rates.
* Update resources/prosody-plugins/mod_rate_limit.lua
Co-authored-by: Aaron van Meerten <aaron.van.meerten@8x8.com>
---------
Co-authored-by: Aaron van Meerten <aaron.van.meerten@8x8.com>
Filters the toolbarButtons in redux depending on the visitor state instead of filtering them every time in mapStateToProps. This will prevent unnecessary rerenders of the toolbar.
Additionally:
- Moves visitor buttons const from features/config in features/toolbox.
- Removes dublicate functions isButtonEnabled and isToolbarButtonEnabled.
- Adds more buttons to the visitor allowed buttons which functionality has been any way accessible trough shortcuts or somewhere else.
- Enables customButtons to be visible for visitors.
The previous version of getToolbarButtons function was actually adding the custom buttons on every call to the config toolbarButtons array, effectively creating dublicates of every custom button. The PR fixes this issue.
Also now we will be running the getToolbarButtons calculation only when needed.
Until this commit we didn't make difference between transcriptions from the recording dialog and subtitles. Now subtitles are not considered recording anymore and only the transcriptions started from recording dialog are considered recording.
Deprecates current component for conference duration. Will wait a bit for mobile to catch up and then we can delete the code.
chore(deps) lib-jitsi-meet@latest
jitsi/lib-jitsi-meet@v1767.0.0+178f9bbf...v1769.0.0+ff9f57c5
It wasn't related to transcriptions but to subtitles, really.
Since we are not going to show subtitles just because transcriptions are
enabled, this setting no longer makes sense.
As we have the jitsi-meet-electron app, lets allow deployments to use it.
Allow deployments to enable desktop deeplinking without the need to re-implement _openDesktopApp()
Disable it by default to keep the current behaviour (deeplinking on mobile on, on desktop off)
This feature is meant as purely opt-in.
Signed-off-by: Christoph Settgast <csett86_git@quicksands.de>
* fix: Fixes leaving the visitor's meeting on promotion.
This was resulting some colibri websockets reconnects as the state of the previous JitsiConference was not cleaned up.
* squash: Update jsdocs, lint error.
Updates the remoteVideoSources set only when neccessary when participant is leaving . This fixes an endless recursion when visitor is promoted or left and there is a screen sharing.
* fix: Fixes wrong warning message.
* fix: Detect enables/disables visitors for a room.
* fix: We need customusername in all cases of auto-allow setting.
* feat: Sends promotion-request to all moderators.
* feat(visitors): Implements request promotion.
* feat(visitors): Implements single moderator and vpass cases for moderators.
* fix: Fixes clearing request instances from UI.
* feat: Implements visitors approval for mobile.
* squash: Drops unused and wrong report for auto allow promotion.
* squash: Returns early based on count.
* squash: Moves translation to common key.
* squash: Adds dependencies for useCallback.
* squash: comments.
* squash: Refactor 1 to unify with native.
* squash: Rename some styles.
* squash: Fixes error dew to fewer hooks error.
* squash: Renames VISITOR_PROMOTION_REQUEST_DENIED.
* squash: Fix renaming component.
* squash: Suggestions.
Events such as "mouse-move", "mouse-leave" and "face-landmark-detected"
reach this code and pollute the logs. It's probably worth investigating
why this is the case and fixing it if necessary, but for now just remove
the log message.
* feat: Adds detection of occupants with no connection.
We saw recently two occasions with rooms with participants but no prosody.full_sessions for those participants and when everyone leaves the meeting it never ends.
* squash: Updates counting.
* ref(transcriptions): refactor transcriptions api
* ref(transcriptions): refactor usage of translation label
Extend IFrame API to allow adding a transcriber in the room without the subtitles needing to be visible.
Allow transcription chunk messages to be passed through the IFrame API if a transcriber is present.
Clean-up transcription messages sent through the IFrame API to not include timeout field and possible conflicting states (stable / unstable /final)
* fix linting
* code review: extend api message to match webhook format
- on 3rd party prejoin, we did not setup the initial devices, resulting in always creating tracks for default device for camera and mic regardless of settings, and for both meeting and 3rd party prejoin to not set the audio output device at all
In the jitsi web app, the poll creator is displayed
for all published votes whereas in the native app
the current username of the participant has been
displayed for all polls regardless of the creator
Currently we are waiting for the user to submit feedback dialog in
order to leave the room. Now the leave and showing the dialog are
executed in parallel.
* fix: Adds check for jitsi_meet_room not being string.
Oct 20 12:22:50 mod_bosh error Traceback[bosh]: /usr/share/jitsi-meet/prosody-plugins/token/util.lib.lua:336: bad argument #1 to 'lower' (string expected, got userdata)
stack traceback:
[C]: in function 'lower'
/usr/share/jitsi-meet/prosody-plugins/token/util.lib.lua:336: in function 'verify_room'
...re/jitsi-meet/prosody-plugins/mod_token_verification.lua:78: in function 'verify_user'
* fix: Adds check for missing speaker stats for occupant.
error Traceback[c2s]: ...itsi-meet/prosody-plugins/mod_speakerstats_component.lua:124: attempt to index field '?' (a nil value)
stack traceback:
...itsi-meet/prosody-plugins/mod_speakerstats_component.lua:124: in function '?'
* fix: Nil check for breakout_rooms.
c2saaaad95a16c0 error Traceback[c2s]: ...re/jitsi-meet/prosody-plugins/mod_muc_breakout_rooms.lua:345: attempt to index local 'main_room' (a nil value)
stack traceback:
...re/jitsi-meet/prosody-plugins/mod_muc_breakout_rooms.lua:345: in function '?'
/usr/share/lua/5.2/prosody/util/events.lua:81: in function </usr/share/lua/5.2/prosody/util/events.lua:77>
(...tail calls...)
/usr/lib/prosody/modules/muc/muc.lib.lua:496: in function </usr/lib/prosody/modules/muc/muc.lib.lua:492>
* fix: Adds nil check in allowners.
c2saaaae3024810 error Traceback[c2s]: /usr/share/jitsi-meet/prosody-plugins/mod_muc_allowners.lua:171: attempt to index local 'room' (a nil value)
stack traceback:
/usr/share/jitsi-meet/prosody-plugins/mod_muc_allowners.lua:171: in function '?'
/usr/share/lua/5.2/prosody/util/events.lua:81: in function </usr/share/lua/5.2/prosody/util/events.lua:77>
* fix: Adds nil check in lobby.
mod_bosh error Traceback[bosh]: ...share/jitsi-meet/prosody-plugins/mod_muc_lobby_rooms.lua:168: attempt to index local 'lobby_room' (a nil value)
stack traceback:
...share/jitsi-meet/prosody-plugins/mod_muc_lobby_rooms.lua:168: in function '?'
/usr/share/lua/5.2/prosody/util/filters.lua:25: in function 'filter'
/usr/lib/prosody/modules/mod_bosh.lua:361: in function 'send'
/usr/lib/prosody/modules/muc/mod_muc.lua:495: in function '?'
* fix: Fixes nil error in fmuc.
s2sinaaaaf2817260 error Traceback[s2s]: /usr/share/jitsi-meet/prosody-plugins/mod_fmuc.lua:295: attempt to index local 'occupant' (a nil value)
stack traceback:
/usr/share/jitsi-meet/prosody-plugins/mod_fmuc.lua:295: in function '?'
/usr/share/lua/5.2/prosody/util/events.lua:81: in function </usr/share/lua/5.2/prosody/util/events.lua:77>
(...tail calls...)
/usr/lib/prosody/modules/muc/muc.lib.lua:1201: in function </usr/lib/prosody/modules/muc/muc.lib.lua:1194>
* fix: Fixes nil occupant.
c2s55f4d5411dd0 error Traceback[c2s]: /usr/share/jitsi-meet/prosody-plugins/mod_muc_flip.lua:120: attempt to index local 'kicked_occupant' (a nil value)
stack traceback:
/usr/share/jitsi-meet/prosody-plugins/mod_muc_flip.lua:120: in function '?'
/usr/share/lua/5.2/prosody/util/events.lua:81: in function </usr/share/lua/5.2/prosody/util/events.lua:77>
(...tail calls...)
/usr/lib/prosody/modules/muc/muc.lib.lua:791: in function </usr/lib/prosody/modules/muc/muc.lib.lua:616>
* fix: Fixes caching main room.
Objects should not be set in room._data as this field is being serialized and we see errors like.
error Traceback[c2s]: /usr/share/lua/5.2/prosody/util/serialization.lua:34: Can't serialize userdata
stack traceback:
[C]: in function 'error'
/usr/share/lua/5.2/prosody/util/serialization.lua:34: in function </usr/share/lua/5.2/prosody/util/serialization.lua:33>
(...tail calls...)
/usr/share/lua/5.2/prosody/util/serialization.lua:199: in function 'serialize_table'
/usr/share/lua/5.2/prosody/util/serialization.lua:197: in function 'serialize_table'
/usr/share/lua/5.2/prosody/util/serialization.lua:197: in function 'serialize_table'
/usr/share/lua/5.2/prosody/util/serialization.lua:219: in function </usr/share/lua/5.2/prosody/util/serialization.lua:217>
(...tail calls...)
/usr/lib/prosody/modules/mod_storage_memory.lua:42: in function </usr/lib/prosody/modules/mod_storage_memory.lua:40>
(...tail calls...)
...re/jitsi-meet/prosody-plugins/mod_muc_breakout_rooms.lua:207: in function 'create_breakout_room'
* fix: Fixes calling save_occupant after changing its role.
* squash: Fixed passed value to type.
It's fired when the API is ready, and it signals the embedder that they
can reveal the meeting from behind an overlay, for example.
The astute reader might notice we are currently sending a
'browser-support' event roughly at the same time. The reason for this
new event is plain simply semantics.
In addition the 'onload' handler is faked by calling it when the new
ready event fires. The original onload event is unreliable. It will be
called even when nothing was ever loaded (try loading a page without
internet and be amused).
On Android we support RestrictionManager, but that already sets it, so
make sure we always save it on the settings.
Editing will be restricted in the Settings dialog if changing it is
restricted anyway.
Fixes: https://github.com/jitsi/jitsi-meet/issues/13994
Sep 22 22:06:01 mod_bosh error Traceback[bosh]: /usr/share/jitsi-meet/prosody-plugins/mod_visitors.lua:305: attempt to index field '?' (a nil value)
stack traceback:
/usr/share/jitsi-meet/prosody-plugins/mod_visitors.lua:305: in function '?'
/usr/share/lua/5.2/prosody/util/events.lua:81: in function </usr/share/lua/5.2/prosody/util/events.lua:77>
* fix(visitors): informs visitor nodes when a participant is kicked.
* remove hooking muc-broadcast-presence event and create a stanza in muc-occupant-left event.
* feat: Check jwt expiration and redirects to auth url if any.
It may happen that the jwt had expired while being in the meeting and there is a network issue requiring to reload.
* squash: Fixes lint error.
* squash: Fixes comments.
Should fix this error:
~~~
Fatal Exception: java.lang.IllegalArgumentException: org.jitsi.meet: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags(PendingIntent.java:402)
at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:485)
at android.app.PendingIntent.getActivity(PendingIntent.java:471)
at android.app.PendingIntent.getActivity(PendingIntent.java:435)
at com.google.android.gms.common.GoogleApiAvailabilityLight.getErrorResolutionPendingIntent(com.google.android.gms:play-services-basement@@17.5.0:25)
at com.google.android.gms.common.GoogleApiAvailabilityLight.getErrorResolutionPendingIntent(com.google.android.gms:play-services-basement@@17.5.0:21)
at com.google.android.gms.common.GoogleApiAvailability.getErrorResolutionPendingIntent(com.google.android.gms:play-services-base@@17.5.0:170)
at com.google.android.gms.common.GoogleApiAvailability.getErrorResolutionPendingIntent(com.google.android.gms:play-services-base@@17.5.0:173)
at com.google.android.gms.common.GoogleApiAvailability.zaa(com.google.android.gms:play-services-base@@17.5.0:112)
at com.google.android.gms.common.api.internal.GoogleApiManager.zaa(com.google.android.gms:play-services-base@@17.5.0:252)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.5.0:109)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnectionFailed(com.google.android.gms:play-services-base@@17.5.0:75)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zai(com.google.android.gms:play-services-base@@17.5.0:263)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.5.0:133)
at com.google.android.gms.common.api.internal.GoogleApiManager.handleMessage(com.google.android.gms:play-services-base@@17.5.0:164)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loopOnce(Looper.java:240)
at android.os.Looper.loop(Looper.java:351)
at android.os.HandlerThread.run(HandlerThread.java:67)
~~~
If the conference mapper return an error we show it on deeplinking page. In case the conf mapper receives non authenticated request it may return an error and this is normal so hide it from that page.
* added option to use rtctstats from lib-jitsi-meet
* Addressed review feedback:
- moved rtcstats function into JitsiMeetJS.rtcstats
- changed from callbacks to events
* moved rtcstatsUseLibJitsi from analytics to testing
* fixed linting errors
* use ljm rtcstats
* remove debug logs, additional dependencies
* fix ts and dependency
* address code review
---------
Co-authored-by: Nils Ohlmeier <github@ohlmeier.org>
* fix(video-select): remove video preview from device selection and fix video switch on android browsers
* simplify if statement
* add for all mobile devices the stop stream
* move mobile check to middleware
* code review
* feat: Moves redirected event to connection events.
* feat: Pass room name when connecting.
We need the room name we will join to be able to send the http conference request from ljm.
* squash: Drops dispatching redirected action.
* squash: Updates ljm.
- fixed case when localFlipX was taken from store on it`s value update, before the new value was set into store - so always taking the previous value instead of updated one
- added command for setting the camera facing mode remotely
- enhanced toggleVideo command to optionally accept the facing mode
- fix(startSilent) do not create audio track when start silent
When using useHostPageLocalStorage on the iframe api and local storage
is not throwing error we were writting the passed data to the original
local storage and then switching to the dummy local storage from
jitsiLocalStorage.
It's really the same as the default language at this point with the
caveat that we need to remember to update it in unison with main.json,
so it adds no value.
- Create the tracks early, or there will be on audio on iOS on the first
unmute this includes the unsafe room name screen
- Skip the unsafe room screen if prejoin is disabled, like web
While the host arrives all other participants are waiting in lobby and once the host arrives lobby is destroyed and the participants join the call.
Adds reading some other fields in jwt to extract email.
Introduces tokenLogoutUrl to be used for logout.
The URL is a link to a json file having a mapping kid -> public key.
The mapping can contain also certificates, which will be used to get the public key.
The list is being updated before the cache-control max-age header value is reached, if such a header is returned from the server.
Skip any lobby check when the occupant is jicofo.
In case of serverside turn on lobby on room creation we do not check and allow jicofo to join.
We check for resource and no is_admin as in default configuration admins is set only for the main muc component.
Parsing the API ID happens at import time, which is not great because it
also runs when loading the external API file.
In sites with weird URL patterns, such as Angular this will throw an
exception.
Ignore parsing errors so it's left undefined. When modules/ is
refactored we should look into making this a getter of some sort.
Fixes: https://github.com/jitsi/jitsi-meet/issues/11565
* feat: Returns an error on join request with no display name.
When someone tries to join a room with lobby enabled and display name is not set returns an error.
* squash: Fixes handling DISPLAY_NAME_REQUIRED with preJoin disabled.
* squash: Fixes mobile build.
* squash: Move isDisplayNameRequired redux state in lobby and introduces isDisplayNameRequiredError.
* squash: Drops unused isDisplayNameRequired.
This was used on showing prejoin when connection was established on showing prejoin. We no longer establish it at that time, so it is not possible to hit it and act on it.
- Now when integrated with a host app, sound files will be copied as a part of gradle (build)process. Just a copy from `android/sdk/build.gradle` `mergeAssetsTask` subtask
Fix for this crash:
~~~
Fatal Exception: java.lang.IllegalArgumentException: org.jitsi.meet: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags(PendingIntent.java:377)
at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:460)
at android.app.PendingIntent.getActivity(PendingIntent.java:446)
at android.app.PendingIntent.getActivity(PendingIntent.java:410)
at com.google.android.gms.common.GoogleApiAvailabilityLight.getErrorResolutionPendingIntent(GoogleApiAvailabilityLight.java:25)
at com.google.android.gms.common.GoogleApiAvailabilityLight.getErrorResolutionPendingIntent(GoogleApiAvailabilityLight.java:21)
at com.google.android.gms.common.GoogleApiAvailability.getErrorResolutionPendingIntent(GoogleApiAvailability.java:97)
at com.google.android.gms.common.GoogleApiAvailability.getErrorResolutionPendingIntent(GoogleApiAvailability.java:100)
at com.google.android.gms.common.GoogleApiAvailability.zaa(GoogleApiAvailability.java:41)
at com.google.android.gms.common.api.internal.GoogleApiManager.zac(GoogleApiManager.java:214)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnectionFailed(GoogleApiManager.java:86)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.connect(GoogleApiManager.java:219)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(GoogleApiManager.java:112)
at com.google.android.gms.common.api.internal.GoogleApiManager.handleMessage(GoogleApiManager.java:145)
at android.os.Handler.dispatchMessage(Handler.java:107)
at com.google.android.gms.internal.base.zap.dispatchMessage(zap.java:8)
at android.os.Looper.loopOnce(Looper.java:238)
at android.os.Looper.loop(Looper.java:357)
at android.os.HandlerThread.run(HandlerThread.java:67)
~~~
* feat: Drops connection on prejoin screen.
Refactors connection logic to reuse already existing logic from mobile. Connection is now established just before joining the room.
Fixes some authentication logic with Login and Logout button in Profile tab.
* squash: Drops createInitialLocalTracksAndConnect as it no longer connects.
* squash: Shows an error on mobile and redirects to default.
* squash: Fixes review comments.
* squash: Fixes joining with prejoin disabled.
* squash: Fixes adding initial local tracks.
* squash: Fixes comments.
* squash: Drop no longer used method.
* squash: Fixes old web code imported into mobile builds.
* squash: Drop unused prop.
* squash: Drops recoverable flag on REDIRECT.
* squash: Drops unused variable and fix connection access.
* squash: Xmpp connect returns promise again.
* squash: Execute xmpp connect and creating local tracks in parallel.
* squash: Moves notification about problem jwt.
* squash: Moves startConference to conference.js for the no prejoin case.
And move the startConference in prejoin feature for the prejoin case.
* squash: Fix passing filtered tracks when starting conference with no prejoin.
* squash: Fix clearing listeners on connection established.
Keeps mobile behaviour after merging web and mobile.
* squash: Drops unused code.
The same as username and password but ignoring the username. Useful for jigasi and jibri where the instances can use different usernames, but the same shared secret/password.
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
validations:
required:true
- type:input
attributes:
label:Browser / app / sdk version
description:Please provice 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.
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!
## Coding style
### ❗️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
* Comments documenting the source code are required.
* 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.
* 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:
Using Jitsi Meet is straightforward, as it's browser based. Head over to [meet.jit.si](https://meet.jit.si) and give it a try. It's anonymous, scalable and free to use. All browsers are supported!
Using Jitsi Meet is straightforward, as it's browser based. Head over to [meet.jit.si](https://meet.jit.si) and give it a try. It's scalable and free to use. All you need is a Google, Facebook or GitHub account in order to start a meeting. All browsers are supported!
Using mobile? No problem, you can either use your mobile web browser or our fully-featured
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.