diff --git a/type/__bird_radv/man.rst b/type/__bird_radv/man.rst index 27362aa..819b213 100644 --- a/type/__bird_radv/man.rst +++ b/type/__bird_radv/man.rst @@ -26,18 +26,6 @@ OPTIONAL PARAMETERS mtu An optional MTU setting to include in the router advertisements. -default-preference - This option specifies the Default Router Preference value to advertise to - hosts. Default: medium. - -route-preference - This option specifies the default value of advertised route preference for - specific routes. Default: medium. - -default-lifetime - This option specifies the time (in seconds) how long (since the receipt of RA) - hosts may use the router as a default router. 0 means do not use as a default - router. Default: 3. OPTIONAL MULTIPLE PARAMETERS ---------------------------- diff --git a/type/__bird_radv/manifest b/type/__bird_radv/manifest index ed04028..aee8690 100755 --- a/type/__bird_radv/manifest +++ b/type/__bird_radv/manifest @@ -58,48 +58,27 @@ fi MTU= if [ -f "${__object:?}/parameter/mtu" ]; then - MTU="link mtu $(cat "${__object:?}/parameter/mtu");" -fi - -DEFAULT_PREFERENCE= -if [ -f "${__object:?}/parameter/default-preference" ]; -then - DEFAULT_PREFERENCE="default preference $(cat "${__object:?}/parameter/default-preference");" -fi - -ROUTE_PREFERENCE= -if [ -f "${__object:?}/parameter/route-preference" ]; -then - ROUTE_PREFERENCE="route preference $(cat "${__object:?}/parameter/route-preference");" -fi - -DEFAULT_LIFETIME= -if [ -f "${__object:?}/parameter/default-lifetime" ]; -then - DEFAULT_LIFETIME="default lifetime $(cat "${__object:?}/parameter/default-lifetime");" + MTU="link mtu $(cat "${__object:?}/parameter/mtu")" fi __file "${confdir:?}/radv-${__object_id:?}.conf" \ --mode 0640 --owner root --group bird \ --source - << EOF -ipv6 table radv_routes_${__object_id}; +ipv6 table radv_routes; protocol static { description "Routes advertised via RAs"; - ipv6 { table radv_routes_${__object_id}; }; + ipv6 { table radv_routes; }; $(sed -e 's/^/\troute /' -e 's/$/ unreachable;/' "${__object:?}/parameter/route") } protocol radv ${__object_id:?} { propagate routes ${have_routes:?}; - ipv6 { table radv_routes_${__object_id}; export all; }; + ipv6 { table radv_routes; export all; }; interface "$(cat "${__object:?}/parameter/interface")" { $MTU - $DEFAULT_LIFETIME - $DEFAULT_PREFERENCE - $ROUTE_PREFERENCE }; $RDNS diff --git a/type/__bird_radv/parameter/optional b/type/__bird_radv/parameter/optional index 51058a7..ee48c5c 100644 --- a/type/__bird_radv/parameter/optional +++ b/type/__bird_radv/parameter/optional @@ -1,4 +1 @@ mtu -default-preference -route-preference -default-lifetime diff --git a/type/__jitsi_meet/explorer/configured-memory b/type/__jitsi_meet/explorer/configured-memory deleted file mode 100755 index 658f94b..0000000 --- a/type/__jitsi_meet/explorer/configured-memory +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -eu - -JICOFO="/usr/share/jicofo/jicofo.sh" -VIDEOBRIDGE="/usr/share/jitsi-videobridge/lib/videobridge.rc" - -if [ -f "${JICOFO:?}" ]; then - jicofo_memory="$(grep JICOFO_MAX_MEMORY= "${JICOFO:?}" | cut -d= -f 2 | cut -d ";" -f 1)" -fi -if [ -f "${VIDEOBRIDGE:?}" ]; then - vb_memory="$(grep VIDEOBRIDGE_MAX_MEMORY= "${VIDEOBRIDGE:?}" | cut -d= -f 2)" -fi -cat < COPYING ------- -Copyright \(C) 2022 Evilham. +Copyright \(C) 2021 Evilham. diff --git a/type/__jitsi_meet/manifest b/type/__jitsi_meet/manifest index 0c210a3..599af18 100755 --- a/type/__jitsi_meet/manifest +++ b/type/__jitsi_meet/manifest @@ -1,6 +1,7 @@ #!/bin/sh -e os="$(cat "${__global}/explorer/os")" +init="$(cat "${__global}/explorer/init")" case "${os}" in devuan|debian) ;; @@ -10,37 +11,10 @@ case "${os}" in ;; esac -current_conferences="$(cat "${__object}/explorer/jitsi-status" | grep -E "^jitsi_conferences[[:space:]]" | cut -d ' ' -f 2)" - -JICOFO_AUTHPASSWORD="$(cat "${__object}/explorer/jicofo-authpassword")" -if [ -z "${JICOFO_AUTHPASSWORD}" ]; then - # This is probably a first time installation, we'll generate the - # password which will be set in debconf by this type - # https://github.com/jitsi/jicofo/blob/aafb61b5363a1c4abdbf08e1444a6276b807993e/debian/postinst#L43 - JICOFO_AUTHPASSWORD="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 16)" -fi - -ABORT_CONFERENCE_COUNT="$(cat "${__object}/parameter/abort-conference-count")" - -if [ -n "${current_conferences}" ] && [ -n "${ABORT_CONFERENCE_COUNT}" ] && \ - [ "${ABORT_CONFERENCE_COUNT}" -le "${current_conferences}" ]; then - cat <<-EOF -Early bail out was requested when at least ${ABORT_CONFERENCE_COUNT} conferences are taking place. -There are currently ${current_conferences} active conferences. - -Try again at a later time or remove or increase --abort-conference-count - EOF - exit 1 -fi JITSI_HOST="${__target_host}" -if [ -f "${__object}/parameter/jitsi-version" ]; then - # This has been deprecated and will be removed 'soon' - JITSI_VERSION="$(cat "${__object}/parameter/jitsi-version")" -else - # Note this won't be a parameter anymore, we won't let users stay behind - JITSI_VERSION="$(cat "${__type}/files/jitsi-version")" -fi +# Currently unused, see below +# JITSI_VERSION="$(cat "${__object}/parameter/jitsi-version")" TURN_SERVER="$(cat "${__object}/parameter/turn-server")" TURN_SECRET="$(cat "${__object}/parameter/turn-secret")" @@ -48,6 +22,8 @@ if [ -z "${TURN_SERVER}" ]; then TURN_SERVER="${JITSI_HOST}" fi +PROMETHEUS_JITSI_EXPORTER_IS_VERSION="$(cat "${__object}/explorer/prometheus-jitsi-meet-explorer-version")" + # The rest is loosely based on Jitsi's documentation # https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart @@ -79,12 +55,11 @@ __debconf_set_selections jitsi_meet --line "${DEBCONF_SETTINGS}" export require="${require} __debconf_set_selections/jitsi_meet" # Install and upgrade packages as needed -# NOTE: we are doing version pinning again, but it breaks sometimes when -# the version is not the latest. -# This happens because dependencies might not be properly resolved. -# To avoid this, this type must be maintained up to date. -# If we don't use this, keeping Jitsi's up to date is very difficult. -__package_apt jitsi-meet --version "${JITSI_VERSION}" +__package_apt jitsi-meet +# We are not doing version pinning anymore because it breaks when +# the version is not the latest. +# This happens because dependencies cannot be properly resolved. +# --version "${JITSI_VERSION}" # Proceed only after installation/upgrade has finished export require="__package_apt/jitsi-meet" @@ -149,9 +124,8 @@ require="__directory${NGINX_ETC}/sites-available" __file "${NGINX_ETC}/sites-ava server_names_hash_bucket_size 64; types { -# nginx's default mime.types doesn't include a mapping for wasm or wav. +# nginx's default mime.types doesn't include a mapping for wasm application/wasm wasm; - audio/wav wav; } server { @@ -175,157 +149,95 @@ server { } EOF -# Starting from 2.0.7210, jitsi defines following nginx upstreams -__directory "${NGINX_ETC}/conf.d" --state present -require="__directory${NGINX_ETC}/conf.d" __file "${NGINX_ETC}/conf.d/prosody.conf" \ - --mode 644 \ - --source - << EOF -upstream prosody { - zone upstreams 64K; - server 127.0.0.1:5280; - keepalive 2; -} -EOF -require="__directory${NGINX_ETC}/conf.d" __file "${NGINX_ETC}/conf.d/jvb1.conf" \ - --mode 644 \ - --source - << EOF -upstream jvb1 { - zone upstreams 64K; - server 127.0.0.1:9090; - keepalive 2; -} -EOF -require="__directory${NGINX_ETC}/conf.d" __file "${NGINX_ETC}/conf.d/jicofo.conf" \ - --mode 644 \ - --source - << EOF -upstream jicofo { - zone upstreams 64K; - server 127.0.0.1:8888; - keepalive 2; -} -EOF - if [ -f "${__object}/parameter/secured-domains" ]; then SECURED_DOMAINS_STATE='present' + SECURED_DOMAINS_STATE_JICOFO='present' else SECURED_DOMAINS_STATE='absent' + SECURED_DOMAINS_STATE_JICOFO='absent' fi -# This is the main host config -PROSODY_MAIN_CONFIG="YES" -# Prosody settings for common components (jvb, focus, ...) -# shellcheck source=type/__jitsi_meet/files/prosody.cfg.lua.sh -. "${__type}/files/prosody.cfg.lua.sh" # This defines PROSODY_CONFIG -__file "/etc/prosody/conf.d/00_jitsi_base.cfg.lua" \ - --group prosody \ - --mode 0440 \ - --source - < +__block jitsi_jicofo_secured_domains \ + --prefix "// begin cdist: jicofo_secured_domains" \ + --suffix "// end cdist: jicofo_secured_domains" \ + --file /etc/jitsi/jicofo/jicofo.conf \ + --state "${SECURED_DOMAINS_STATE_JICOFO}" \ + --text '-' <]*(/external_api.js).!src='\1'!" \ - -e "s!

[^<]*

!

Jitsi Meetings with interpreter

!" \ - -e "s!https://meet.mayfirst.org!/!" \ - -e "s!(style.css|jsi.js)([^?])!\1?v=${jsi_updated_on:?}\2!" \ - /opt/jsi/static/index.html.sample +PROMETHEUS_JITSI_EXPORTER_SHOULD_VERSION="1.1.5" +PROMETHEUS_JITSI_EXPORTER_CHECKSUM="sha256:3ddf43a48d9a2f62be1bc6db9e7ba75d61994f9423e5c5b28be019f41f06f745" +PROMETHEUS_JITSI_EXPORTER_URL="https://github.com/systemli/prometheus-jitsi-meet-exporter/releases/download/${PROMETHEUS_JITSI_EXPORTER_SHOULD_VERSION}/prometheus-jitsi-meet-exporter-linux-amd64" +PROMETHEUS_JITSI_EXPORTER_VERSION_FILE="/usr/local/bin/.prometheus-jitsi-meet-exporter.cdist.version" +if [ ! -f "${__object}/parameter/disable-prometheus-exporter" ]; then + case "${init}" in + init|sysvinit) + __runit + require="__runit" __runit_service \ + prometheus-jitsi-meet-exporter --log --source - <&1 EOF -)" + + export require="__runit_service/prometheus-jitsi-meet-exporter" + JITSI_MEET_EXPORTER_SERVICE="sv %s prometheus-jitsi-meet-exporter" + ;; + systemd) + __systemd_unit prometheus-jitsi-meet-exporter.service \ + --source "-" \ + --enablement-state "enabled" < jitsi-version diff --git a/type/__jitsi_meet_domain/files/config.js.sh b/type/__jitsi_meet_domain/files/config.js.sh index 7555b68..58df3fc 100644 --- a/type/__jitsi_meet_domain/files/config.js.sh +++ b/type/__jitsi_meet_domain/files/config.js.sh @@ -2,31 +2,7 @@ # shellcheck disable=SC2034 # This is intended to be included JITSI_CONFIG_JS="$(cat <. - // NOTE [cdist]: if we use '${DOMAIN}', jicofo won't start the meeting - authdomain: '${JITSI_HOST}', + // authdomain: '${JITSI_HOST}', // Focus component domain. Defaults to focus.. - focus: 'focus.${JITSI_HOST}', + // focus: 'focus.${JITSI_HOST}', // XMPP MUC domain. FIXME: use XEP-0030 to discover it. - muc: 'conference.${DOMAIN}' + muc: 'conference.${JITSI_HOST}' }, // BOSH URL. FIXME: use XEP-0156 to discover it. // useful for multidomain scenario -> src https://community.jitsi.org/t/same-jitsi-meet-instance-with-multiple-domain-names/17391/2 - bosh: 'https:///http-bind', + bosh: '///http-bind', - // Websocket URL (XMPP) - websocket: 'wss://${DOMAIN}/' + subdir + 'xmpp-websocket', - - // websocketKeepAliveUrl: 'https://${DOMAIN}/' + subdir + '_unlock', - - // Whether BOSH should be preferred over WebSocket if both are configured. - // preferBosh: false, + // Websocket URL + // websocket: 'wss://${JITSI_HOST}/xmpp-websocket', // The real JID of focus participant - can be overridden here // Do not change username - FIXME: Make focus username configurable // https://github.com/jitsi/jitsi-meet/issues/7376 - focusUserJid: 'focus@auth.${JITSI_HOST}', + // focusUserJid: 'focus@auth.${JITSI_HOST}', - // Option to send conference requests to jicofo over http (requires nginx rule for it) - // conferenceRequestUrl: - // 'https:///' + subdir + 'conference-request/v1', - - // Options related to the bridge (colibri) data channel - bridgeChannel: { - // If the backend advertises multiple colibri websockets, this options allows - // to filter some of them out based on the domain name. We use the first URL - // which does not match ignoreDomain, falling back to the first one that matches - // ignoreDomain. Has no effect if undefined. - // ignoreDomain: 'example.com', - - // Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket. - // If SCTP is available in the backend it will be used instead of a WS. Defaults to - // false (SCTP is used only if available and no WS are available). - // preferSctp: false - }, // Testing / experimental features. // testing: { - // Allows the setting of a custom bandwidth value from the UI. - // assumeBandwidth: true, + // Disables the End to End Encryption feature. Useful for debugging + // issues related to insertable streams. + // disableE2EE: false, - // Enables use of getDisplayMedia in electron - // electronUseGetDisplayMedia: false, + // Enables/disables thumbnail reordering in the filmstrip. It is enabled by default unless explicitly + // disabled by the below option. + // enableThumbnailReordering: true, - // Enables AV1 codec for FF. Note: By default it is disabled. - // enableAV1ForFF: false, - - // Enables the use of the codec selection API supported by the browsers . - // enableCodecSelectionAPI: false, + // Enables XMPP WebSocket (as opposed to BOSH) for the given amount of users. + // mobileXmppWsThreshold: 10 // enable XMPP WebSockets on mobile for 10% of the users // P2P test mode disables automatic switching to P2P when there are 2 // participants in the conference. // p2pTestMode: false, // Enables the test specific features consumed by jitsi-meet-torture - // testMode: false, + // testMode: false // Disables the auto-play behavior of *all* newly created video element. // This is useful when the client runs on a host with limited resources. - // noAutoPlayVideo: false, + // noAutoPlayVideo: false - // Experiment: Whether to skip interim transcriptions. - // skipInterimTranscriptions: false, + // Enable / disable 500 Kbps bitrate cap on desktop tracks. When enabled, + // simulcast is turned off for the desktop share. If presenter is turned + // on while screensharing is in progress, the max bitrate is automatically + // adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines + // the probability for this to be enabled. This setting has been deprecated. + // desktopSharingFrameRate.max now determines whether simulcast will be enabled + // or disabled for the screenshare. + // capScreenshareBitrate: 1 // 0 to disable - deprecated. - // Dump transcripts to a element for debugging. - // dumpTranscript: false, + // Enable callstats only for a percentage of users. + // This takes a value between 0 and 100 which determines the probability for + // the callstats to be enabled. + // callStatsThreshold: 5 // enable callstats for 5% of the users. + }, - // Log the audio levels. - // debugAudioLevels: true, - - // Will replace ice candidates IPs with invalid ones in order to fail ice. - // failICE: true, - - // When running on Spot TV, this controls whether to show the recording consent dialog. - // If false (default), Spot instances will not show the recording consent dialog. - // If true, Spot instances will show the recording consent dialog like regular clients. - // showSpotConsentDialog: false, + // Feature Flags. + flags: { + // Enables source names in the signaling. + // sourceNameSignaling: false, }, // Disables moderator indicators. @@ -140,15 +101,9 @@ var config = { // Disables the reactions moderation feature. // disableReactionsModeration: false, - // Disables the reactions in chat feature. - disableReactionsInChat: true, // This has been annoying =D - // Disables polls feature. // disablePolls: false, - // Disables demote button from self-view - // disableSelfDemote: false, - // Disables self-view tile. (hides it from tile view and from filmstrip) // disableSelfView: false, @@ -163,7 +118,7 @@ var config = { // Can be either 'recording' - screensharing screenshots are taken // only when the recording is also on, // or 'always' - screensharing screenshots are always taken. - // mode: 'recording', + // mode: 'recording' // } // Disables ICE/UDP by filtering out local and remote UDP candidates in @@ -178,11 +133,13 @@ var config = { // Media // + // Enable unified plan implementation support on Chromium based browsers. + // enableUnifiedOnChrome: false, + // Audio // Disable measuring of audio levels. disableAudioLevels: $(if [ -n "${DISABLE_AUDIO_LEVELS}" ]; then printf "true"; else printf "false"; fi), - // audioLevelsInterval: 200, // Enabling this will run the lib-jitsi-meet no audio detection module which @@ -218,125 +175,35 @@ var config = { // Enabling it (with #params) will disable local audio output of remote // participants and to enable it back a reload is needed. - // startSilent: false, + // startSilent: false // Enables support for opus-red (redundancy for Opus). // enableOpusRed: false, // Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio. // Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC. - // Specify enableOpusDtx to enable support for opus-dtx where - // audio packets won’t be transmitted while participant is silent or muted. // audioQuality: { // stereo: false, - // opusMaxAverageBitrate: null, // Value to fit the 6000 to 510000 range. - // enableOpusDtx: false, - // }, - - // Noise suppression configuration. By default rnnoise is used. Optionally Krisp - // can be used by enabling it below, but the Krisp JS SDK files must be supplied in your - // installation. Specifically, these files are needed: - // - https://meet.example.com/libs/krisp/krisp.mjs - // - https://meet.example.com/libs/krisp/models/model_8.kw - // - https://meet.example.com/libs/krisp/models/model_nc.kw - // - https://meet.example.com/libs/krisp/models/model_bvc.kw - // - https://meet.example.com/libs/krisp/assets/bvc-allowed.txt - // In case when you have known BVC supported devices and you want to extend allowed devices list - // - https://meet.example.com/libs/krisp/assets/bvc-allowed-ext.txt - // In case when you have known BVC supported devices and you want to extend allowed devices list - // - https://meet.example.com/libs/krisp/models/model_inbound_8.kw - // - https://meet.example.com/libs/krisp/models/model_inbound_16.kw - // In case when you want to use inbound noise suppression models - // NOTE: Krisp JS SDK v2.0.0 was tested. - // noiseSuppression: { - // krisp: { - // enabled: false, - // logProcessStats: false, - // debugLogs: false, - // useBVC: false, - // bufferOverflowMS: 1000, - // inboundModels: { - // modelInbound8: 'model_inbound_8.kef', - // modelInbound16: 'model_inbound_16.kef', - // }, - // preloadInboundModels: { - // modelInbound8: 'model_inbound_8.kef', - // modelInbound16: 'model_inbound_16.kef', - // }, - // preloadModels: { - // modelBVC: 'model_bvc.kef', - // model8: 'model_8.kef', - // modelNC: 'model_nc_mq.kef', - // }, - // models: { - // modelBVC: 'model_bvc.kef', - // model8: 'model_8.kef', - // modelNV: 'model_nc_mq.kef', - // }, - // bvc: { - // allowedDevices: 'bvc-allowed.txt', - // allowedDevicesExt: 'bvc-allowed-ext.txt', - // } - // }, + // opusMaxAverageBitrate: null // Value to fit the 6000 to 510000 range. // }, // Video - // Sets the default camera facing mode. - // cameraFacingMode: 'user', - // Sets the preferred resolution (height) for local video. Defaults to 720. // resolution: 720, - // DEPRECATED. Please use raisedHands.disableRemoveRaisedHandOnFocus instead. // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not // disableRemoveRaisedHandOnFocus: false, - // Specifies which raised hand related config should be set. - // raisedHands: { - // // Specifies whether the raised hand can be lowered by moderator. - // disableLowerHandByModerator: false, - - // // Specifies whether there is a notification before hiding the raised hand - // // when someone becomes the dominant speaker. - // disableLowerHandNotification: true, - - // // Specifies whether there is a notification when you are the next speaker in line. - // disableNextSpeakerNotification: false, - - // // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not. - // disableRemoveRaisedHandOnFocus: false, - // }, - - // speakerStats: { - // // Specifies whether the speaker stats is enable or not. - // disabled: false, - - // // Specifies whether there will be a search field in speaker stats or not. - // disableSearch: false, - - // // Specifies whether participants in speaker stats should be ordered or not, and with what priority. - // // 'role', <- Moderators on top. - // // 'name', <- Alphabetically by name. - // // 'hasLeft', <- The ones that have left in the bottom. - // order: [ - // 'role', - // 'name', - // 'hasLeft', - // ], - // }, - - // DEPRECATED. Please use speakerStats.disableSearch instead. // Specifies whether there will be a search field in speaker stats or not // disableSpeakerStatsSearch: false, - // DEPRECATED. Please use speakerStats.order . // Specifies whether participants in speaker stats should be ordered or not, and with what priority // speakerStatsOrder: [ // 'role', <- Moderators on top // 'name', <- Alphabetically by name // 'hasLeft', <- The ones that have left in the bottom - // ], <- the order of the array elements determines priority + // ] <- the order of the array elements determines priority // How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD. // Use -1 to disable. @@ -352,15 +219,21 @@ var config = { // height: { // ideal: 720, // max: 720, - // min: 240, - // }, - // }, + // min: 240 + // } + // } // }, $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Enable / disable simulcast support. // disableSimulcast: false, + // Enable / disable layer suspension. If enabled, endpoints whose HD layers are not in use will be suspended + // (no longer sent) until they are requested again. This is enabled by default. This must be enabled for screen + // sharing to work as expected on Chrome. Disabling this might result in low resolution screenshare being sent + // by the client. + // enableLayerSuspension: false, + // Every participant after the Nth will start video muted. startVideoMuted: ${START_VIDEO_MUTED}, @@ -368,167 +241,77 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // applied locally. FIXME: having these 2 options is confusing. // startWithVideoMuted: false, + // If set to true, prefer to use the H.264 video codec (if supported). + // Note that it's not recommended to do this because simulcast is not + // supported when using H.264. For 1-to-1 calls this setting is enabled by + // default and can be toggled in the p2p section. + // This option has been deprecated, use preferredCodec under videoQuality section instead. + // preferH264: true, + + // If set to true, disable H.264 video codec by stripping it out of the + // SDP. + // disableH264: false, + // Desktop sharing // Optional desktop sharing frame rate options. Default value: min:5, max:5. // desktopSharingFrameRate: { // min: 5, - // max: 5, + // max: 5 // }, - // Optional screenshare settings that give more control over screen capture in the browser. - // screenShareSettings: { - // // Show users the current tab is the preferred capture source, default: false. - // desktopPreferCurrentTab: false, - // // Allow users to select system audio, default: include. - // desktopSystemAudio: 'include', - // // Allow users to seamlessly switch which tab they are sharing without having to select the tab again. - // desktopSurfaceSwitching: 'include', - // // Allow a user to be shown a preference for what screen is to be captured, default: unset. - // desktopDisplaySurface: undefined, - // // Allow users to select the current tab as a capture source, default: exclude. - // desktopSelfBrowserSurface: 'exclude' - // }, + // This option has been deprecated since it is no longer supported as per the w3c spec. + // https://w3c.github.io/mediacapture-screen-share/#dom-mediadevices-getdisplaymedia. If the user has not + // interacted with the webpage before the getDisplayMedia call, the promise will be rejected by the browser. This + // has already been implemented in Firefox and Safari and will be implemented in Chrome soon. + // https://bugs.chromium.org/p/chromium/issues/detail?id=1198918 + // startScreenSharing: false, // Recording + // Whether to enable file recording or not. + // fileRecordingsEnabled: false, // Enable the dropbox integration. // dropbox: { - // appKey: '', // Specify your app key here. + // appKey: '' // Specify your app key here. // // A URL to redirect the user to, after authenticating // // by default uses: - // // 'https://${DOMAIN}/static/oauth.html' + // // 'https://${JITSI_HOST}/static/oauth.html' // redirectURI: - // 'https://${DOMAIN}/subfolder/static/oauth.html', + // 'https://${JITSI_HOST}/subfolder/static/oauth.html' // }, - - // configuration for all things recording related. Existing settings will be migrated here in the future. - // recordings: { - // // IF true (default) recording audio and video is selected by default in the recording dialog. - // // recordAudioAndVideo: true, - // // If true, shows a notification at the start of the meeting with a call to action button - // // to start recording (for users who can do so). - // // suggestRecording: true, - // // If true, shows a warning label in the prejoin screen to point out the possibility that - // // the call you're joining might be recorded. - // // showPrejoinWarning: true, - // // If true, the notification for recording start will display a link to download the cloud recording. - // // showRecordingLink: true, - // // If true, mutes audio and video when a recording begins and displays a dialog - // // explaining the effect of unmuting. - // // requireConsent: true, - // // If true consent will be skipped for users who are already in the meeting. - // // skipConsentInMeeting: true, - // // Link for the recording consent dialog's "Learn more" link. - // // consentLearnMoreLink: 'https://jitsi.org/meet/consent', - // }, - - // recordingService: { - // // When integrations like dropbox are enabled only that will be shown, - // // by enabling fileRecordingsServiceEnabled, we show both the integrations - // // and the generic recording service (its configuration and storage type - // // depends on jibri configuration) - // enabled: false, - - // // Whether to show the possibility to share file recording with other people - // // (e.g. meeting participants), based on the actual implementation - // // on the backend. - // sharingEnabled: false, - - // // Hide the warning that says we only store the recording for 24 hours. - // hideStorageWarning: false, - // }, - - // DEPRECATED. Use recordingService.enabled instead. + // When integrations like dropbox are enabled only that will be shown, + // by enabling fileRecordingsServiceEnabled, we show both the integrations + // and the generic recording service (its configuration and storage type + // depends on jibri configuration) // fileRecordingsServiceEnabled: false, - - // DEPRECATED. Use recordingService.sharingEnabled instead. + // Whether to show the possibility to share file recording with other people + // (e.g. meeting participants), based on the actual implementation + // on the backend. // fileRecordingsServiceSharingEnabled: false, - // Local recording configuration. - // localRecording: { - // // Whether to disable local recording or not. - // disable: false, - - // // Whether to notify all participants when a participant is recording locally. - // notifyAllParticipants: false, - - // // Whether to disable the self recording feature (only local participant streams). - // disableSelfRecording: false, - // }, - - // Customize the Live Streaming dialog. Can be modified for a non-YouTube provider. - // liveStreaming: { - // // Whether to enable live streaming or not. - // enabled: false, - // // Terms link - // termsLink: 'https://www.youtube.com/t/terms', - // // Data privacy link - // dataPrivacyLink: 'https://policies.google.com/privacy', - // // RegExp string that validates the stream key input field - // validatorRegExpString: '^(?:[a-zA-Z0-9]{4}(?:-(?!$)|$)){4}', - // // Documentation reference for the live streaming feature. - // helpLink: 'https://jitsi.org/live' - // }, - - // DEPRECATED. Use liveStreaming.enabled instead. + // Whether to enable live streaming or not. // liveStreamingEnabled: false, - // DEPRECATED. Use transcription.enabled instead. + // Transcription (in interface_config, + // subtitles and buttons can be configured) // transcribingEnabled: false, - // DEPRECATED. Use transcription.useAppLanguage instead. + // If true transcriber will use the application language. + // The application language is either explicitly set by participants in their settings or automatically + // detected based on the environment, e.g. if the app is opened in a chrome instance which is using french as its + // default language then transcriptions for that participant will be in french. + // Defaults to true. // transcribeWithAppLanguage: true, - // DEPRECATED. Use transcription.preferredLanguage instead. + // Transcriber language. This settings will only work if "transcribeWithAppLanguage" is explicitly set to false. + // Available languages can be found in + // ./src/react/features/transcribing/transcriber-langs.json. // preferredTranscribeLanguage: 'en-US', - // DEPRECATED. Use transcription.autoTranscribeOnRecord instead. + // Enables automatic turning on captions when recording is started // autoCaptionOnRecord: false, - // Transcription options. - // transcription: { - // // Whether the feature should be enabled or not. - // enabled: false, - - // // Translation languages. - // // Available languages can be found in - // // ./lang/translation-languages.json. - // translationLanguages: ['en', 'es', 'fr', 'ro'], - - // // Important languages to show on the top of the language list. - // translationLanguagesHead: ['en'], - - // // If true transcriber will use the application language. - // // The application language is either explicitly set by participants in their settings or automatically - // // detected based on the environment, e.g. if the app is opened in a chrome instance which - // // is using french as its default language then transcriptions for that participant will be in french. - // // Defaults to true. - // useAppLanguage: true, - - // // Transcriber language. This settings will only work if "useAppLanguage" - // // is explicitly set to false. - // // Available languages can be found in - // // ./src/react/features/transcribing/transcriber-langs.json. - // preferredLanguage: 'en-US', - - // // Enables automatic turning on transcribing when recording is started - // autoTranscribeOnRecord: false, - - // // Enables automatic request of subtitles when transcriber is present in the meeting, uses the default - // // language that is set - // autoCaptionOnTranscribe: false, - // - // // Disables everything related to closed captions - the tab in the chat area, the button in the menu, - // // subtitles on stage and the "Show subtitles on stage" checkbox in the settings. - // // Note: Starting transcriptions from the recording dialog will still work. - // disableClosedCaptions: false, - - // // Whether to invite jigasi when backend transcriptions are enabled (asyncTranscription is true in metadata). - // // By default, we invite it. - // inviteJigasiOnBackendTranscribing: true, - // }, - // Misc // Default value for the channel "last N" attribute. -1 for unlimited. @@ -548,69 +331,71 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // value will be used when the quality level is selected using "Manage Video Quality" slider. // startLastN: 1, + // Provides a way to use different "last N" values based on the number of participants in the conference. + // The keys in an Object represent number of participants and the values are "last N" to be used when number of + // participants gets to or above the number. + // + // For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than + // 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN' + // will be used as default until the first threshold is reached. + // + // lastNLimits: { + // 5: 20, + // 30: 15, + // 50: 10, + // 70: 5, + // 90: 2 + // }, + + // Provides a way to translate the legacy bridge signaling messages, 'LastNChangedEvent', + // 'SelectedEndpointsChangedEvent' and 'ReceiverVideoConstraint' into the new 'ReceiverVideoConstraints' message + // that invokes the new bandwidth allocation algorithm in the bridge which is described here + // - https://github.com/jitsi/jitsi-videobridge/blob/master/doc/allocation.md. + // useNewBandwidthAllocationStrategy: false, + // Specify the settings for video quality optimizations on the client. // videoQuality: { + // // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified + // // here will be removed from the list of codecs present in the SDP answer generated by the client. If the + // // same codec is specified for both the disabled and preferred option, the disable settings will prevail. + // // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case. + // disabledCodec: 'H264', // - // // Provides a way to set the codec preference on desktop based endpoints. - // codecPreferenceOrder: [ 'AV1', 'VP9', 'VP8', 'H264' ], + // // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here, + // // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only + // // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the + // // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this + // // to take effect. + // preferredCodec: 'VP8', // - // // Provides a way to set the codec for screenshare. - // screenshareCodec: 'AV1', - // mobileScreenshareCodec: 'VP8', + // // Provides a way to enforce the preferred codec for the conference even when the conference has endpoints + // // that do not support the preferred codec. For example, older versions of Safari do not support VP9 yet. + // // This will result in Safari not being able to decode video from endpoints sending VP9 video. + // // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the + // // preferred codec and goes back to the preferred codec when that endpoint leaves. + // // enforcePreferredCodec: false, // - // // Enables the adaptive mode in the client that will make runtime adjustments to selected codecs and received - // // videos for a better user experience. This mode will kick in only when CPU overuse is reported in the - // // WebRTC statistics for the outbound video streams. - // enableAdaptiveMode: false, - // - // // Codec specific settings for scalability modes and max bitrates. - // av1: { - // maxBitratesVideo: { - // low: 100000, - // standard: 300000, - // high: 1000000, - // fullHd: 2000000, - // ultraHd: 4000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true, - // useSimulcast: false, - // useKSVC: true - // }, - // h264: { - // maxBitratesVideo: { - // low: 200000, - // standard: 500000, - // high: 1500000, - // fullHd: 3000000, - // ultraHd: 6000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true - // }, - // vp8: { - // maxBitratesVideo: { - // low: 200000, - // standard: 500000, - // high: 1500000, - // fullHd: 3000000, - // ultraHd: 6000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: false - // }, - // vp9: { - // maxBitratesVideo: { - // low: 100000, - // standard: 300000, - // high: 1200000, - // fullHd: 2500000, - // ultraHd: 5000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true, - // useSimulcast: false, - // useKSVC: true + // // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for + // // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values + // // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on + // // the available bandwidth calculated by the browser, but it will be capped by the values specified here. + // // This is currently not implemented on app based clients on mobile. + // maxBitratesVideo: { + // H264: { + // low: 200000, + // standard: 500000, + // high: 1500000 + // }, + // VP8 : { + // low: 200000, + // standard: 500000, + // high: 1500000 + // }, + // VP9: { + // low: 100000, + // standard: 300000, + // high: 1200000 + // } // }, // // // The options can be used to override default thresholds of video thumbnail heights corresponding to @@ -625,20 +410,19 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // // the high quality. // minHeightForQualityLvl: { // 360: 'standard', - // 720: 'high', + // 720: 'high' // }, // - // // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based endpoint - // mobileCodecPreferenceOrder: [ 'VP8', 'VP9', 'H264', 'AV1' ], + // // Provides a way to resize the desktop track to 720p (if it is greater than 720p) before creating a canvas + // // for the presenter mode (camera picture-in-picture mode with screenshare). + // resizeDesktopForPresenter: false // }, // Notification timeouts // notificationTimeouts: { // short: 2500, // medium: 5000, - // long: 10000, - // extraLong: 60000, - // sticky: 0, + // long: 10000 // }, // // Options for the recording limit notification. @@ -653,7 +437,7 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // appName: 'Unlimited recordings APP', // // // The URL of the app with unlimited recordings. - // appURL: 'https://unlimited.recordings.app.com/', + // appURL: 'https://unlimited.recordings.app.com/' // }, // Disables or enables RTX (RFC 4588) (defaults to false). @@ -668,6 +452,14 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Disables or enables REMB support in this client (default: enabled). // enableRemb: true, + // Enables ICE restart logic in LJM and displays the page reload overlay on + // ICE failure. Current disabled by default because it's causing issues with + // signaling when Octo is enabled. Also when we do an "ICE restart"(which is + // not a real ICE restart), the client maintains the TCC sequence number + // counter, but the bridge resets it. The bridge sends media packets with + // TCC sequence numbers starting from 0. + // enableIceRestart: false, + // Enables forced reload of the client when the call is migrated as a result of // the bridge going down. // enableForcedReload: true, @@ -688,18 +480,12 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Disables responsive tiles. // disableResponsiveTiles: false, - // DEPRECATED. Please use \`securityUi?.hideLobbyButton\` instead. - // Hides lobby button. + // Hides lobby button // hideLobbyButton: false, - // DEPRECATED. Please use \`lobby?.autoKnock\` instead. // If Lobby is enabled starts knocking automatically. // autoKnockLobby: false, - // DEPRECATED. Please use \`lobby?.enableChat\` instead. - // Enable lobby chat. - // enableLobbyChat: true, - // DEPRECATED! Use \`breakoutRooms.hideAddRoomButton\` instead. // Hides add breakout room button // hideAddRoomButton: false, @@ -707,38 +493,9 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Require users to always specify a display name. // requireDisplayName: true, - // Enables webhid functionality for Audio. - // enableWebHIDFeature: false, - - // DEPRECATED! Use 'welcomePage.disabled' instead. // Whether to use a welcome page or not. In case it's false a random room // will be joined when no room is specified. - // enableWelcomePage: true, - - // Configs for welcome page. - // welcomePage: { - // // Whether to disable welcome page. In case it's disabled a random room - // // will be joined when no room is specified. - // disabled: false, - // // If set, landing page will redirect to this URL. - // customUrl: '' - // }, - - // Configs for the lobby screen. - // lobby: { - // // If Lobby is enabled, it starts knocking automatically. Replaces \`autoKnockLobby\`. - // autoKnock: false, - // // Enables the lobby chat. Replaces \`enableLobbyChat\`. - // enableChat: true, - // }, - - // Configs for the security related UI elements. - // securityUi: { - // // Hides the lobby button. Replaces \`hideLobbyButton\`. - // hideLobbyButton: false, - // // Hides the possibility to set and enter a lobby password. - // disableLobbyPassword: false, - // }, + enableWelcomePage: true, // Disable app shortcuts that are registered upon joining a conference // disableShortcuts: false, @@ -768,8 +525,7 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Hides the dominant speaker name badge that hovers above the toolbox // hideDominantSpeakerBadge: false, - // Default language for the user interface. Cannot be overwritten. - // DEPRECATED! Use the \`lang\` iframe option directly instead. + // Default language for the user interface. defaultLanguage: '${DEFAULT_LANGUAGE}', // Disables profile and the edit of all fields from the profile settings (display name and email) @@ -778,9 +534,12 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // Hides the email section under profile settings. // hideEmailInSettings: false, + // Whether or not some features are checked based on token. + // enableFeaturesBasedOnToken: false, + // When enabled the password used for locking a room is restricted to up to the number of digits specified - // default: roomPasswordNumberOfDigits: false, // roomPasswordNumberOfDigits: 10, + // default: roomPasswordNumberOfDigits: false, // Message to show the users. Example: 'The service will be down for // maintenance at 01:00 AM GMT, @@ -790,32 +549,17 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // and microsoftApiApplicationClientID // enableCalendarIntegration: false, - // Whether to notify when the conference is terminated because it was destroyed. - // notifyOnConferenceDestruction: true, - - // The client id for the google APIs used for the calendar integration, youtube livestreaming, etc. - // googleApiApplicationClientID: '', - // Configs for prejoin page. // prejoinConfig: { // // When 'true', it shows an intermediate page before joining, where the user can configure their devices. - // // This replaces \`prejoinPageEnabled\`. Defaults to true. + // // This replaces \`prejoinPageEnabled\`. // enabled: true, - // // Hides the participant name editing field in the prejoin screen. - // // If requireDisplayName is also set as true, a name should still be provided through - // // either the jwt or the userInfo from the iframe api init object in order for this to have an effect. - // hideDisplayName: false, // // List of buttons to hide from the extra join options dropdown. - // hideExtraJoinButtons: ['no-audio', 'by-phone'], - // // Configuration for pre-call test - // // By setting preCallTestEnabled, you enable the pre-call test in the prejoin page. - // // ICE server credentials need to be provided over the preCallTestICEUrl - // preCallTestEnabled: false, - // preCallTestICEUrl: '' + // hideExtraJoinButtons: ['no-audio', 'by-phone'] // }, // When 'true', the user cannot edit the display name. - // (Mainly useful when used in conjunction with the JWT so the JWT name becomes read only.) + // (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.) // readOnlyName: false, // If etherpad integration is enabled, setting this to true will @@ -830,20 +574,15 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // set or the lobby is not enabled. // enableInsecureRoomNameWarning: false, + // Whether to automatically copy invitation URL after creating a room. + // Document should be focused for this option to work + // enableAutomaticUrlCopy: false, + // Array with avatar URL prefixes that need to use CORS. // corsAvatarURLs: [ 'https://www.gravatar.com/avatar/' ], - // Base URL for a Gravatar-compatible service. Defaults to Gravatar. - // DEPRECATED! Use \`gravatar.baseUrl\` instead. - // gravatarBaseURL: 'https://www.gravatar.com/avatar/', - - // Setup for Gravatar-compatible services. - // gravatar: { - // // Defaults to Gravatar. - // baseUrl: 'https://www.gravatar.com/avatar/', - // // True if Gravatar should be disabled. - // disabled: false, - // }, + // Base URL for a Gravatar-compatible service. Defaults to libravatar. + // gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/', // App name to be displayed in the invitation email subject, as an alternative to // interfaceConfig.APP_NAME. @@ -856,7 +595,8 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // some other values in config.js to be enabled. Also, the "profile" button will // not display for users with a JWT. // Notes: - // - it's possible to reorder the buttons in the maintoolbar by changing the order of the mainToolbarButtons + // - it's impossible to choose which buttons go in the "More actions" menu + // - it's impossible to control the placement of buttons // - 'desktop' controls the "Share your screen" button // - if \`toolbarButtons\` is undefined, we fallback to enabling all buttons on the UI // toolbarButtons: [ @@ -872,12 +612,11 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // 'fullscreen', // 'hangup', // 'help', - // 'highlight', // 'invite', - // 'linktosalesforce', // 'livestreaming', // 'microphone', - // 'noisesuppression', + // 'mute-everyone', + // 'mute-video-everyone', // 'participants-pane', // 'profile', // 'raisehand', @@ -892,40 +631,22 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // 'tileview', // 'toggle-camera', // 'videoquality', - // 'whiteboard', + // '__end' // ], // Holds values related to toolbar visibility control. // toolbarConfig: { // // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT - // // The initial number of milliseconds for the toolbar buttons to be visible on screen. + // // The initial numer of miliseconds for the toolbar buttons to be visible on screen. // initialTimeout: 20000, // // Moved from interfaceConfig.TOOLBAR_TIMEOUT - // // Number of milliseconds for the toolbar buttons to be visible on screen. + // // Number of miliseconds for the toolbar buttons to be visible on screen. // timeout: 4000, // // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE - // // Whether toolbar should be always visible or should hide after x milliseconds. - // alwaysVisible: false, - // // Indicates whether the toolbar should still autohide when chat is open - // autoHideWhileChatIsOpen: false, + // // Whether toolbar should be always visible or should hide after x miliseconds. + // alwaysVisible: false // }, - // Overrides the buttons displayed in the main toolbar. Depending on the screen size the number of displayed - // buttons varies from 2 buttons to 8 buttons. Every array in the mainToolbarButtons array will replace the - // corresponding default buttons configuration matched by the number of buttons specified in the array. Arrays with - // more than 8 buttons or less then 2 buttons will be ignored. When there there isn't an override for a certain - // configuration (for example when 3 buttons are displayed) the default jitsi-meet configuration will be used. - // The order of the buttons in the array is preserved. - // mainToolbarButtons: [ - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'reactions', 'participants-pane', 'tileview' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane', 'tileview' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'participants-pane' ], - // [ 'microphone', 'camera', 'chat', 'participants-pane' ], - // [ 'microphone', 'camera', 'chat' ], - // [ 'microphone', 'camera' ] - // ], - // Toolbar buttons which have their click/tap event exposed through the API on // \`toolbarButtonClicked\`. Passing a string for the button key will // prevent execution of the click/tap routine; passing an object with \`key\` and @@ -944,13 +665,11 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // 'desktop', // 'download', // 'embedmeeting', - // 'end-meeting', // 'etherpad', // 'feedback', // 'filmstrip', // 'fullscreen', // 'hangup', - // 'hangup-menu', // 'help', // { // key: 'invite', @@ -960,7 +679,6 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // 'microphone', // 'mute-everyone', // 'mute-video-everyone', - // 'noisesuppression', // 'participants-pane', // 'profile', // { @@ -982,58 +700,14 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // { // key: 'add-passcode', // preventExecution: false - // }, - // 'whiteboard', - // ], - - // Participant context menu buttons which have their click/tap event exposed through the API on - // \`participantMenuButtonClick\`. Passing a string for the button key will - // prevent execution of the click/tap routine; passing an object with \`key\` and - // \`preventExecution\` flag on false will not prevent execution of the click/tap - // routine. Below array with mixed mode for passing the buttons. - // participantMenuButtonsWithNotifyClick: [ - // 'allow-video', - // { - // key: 'ask-unmute', - // preventExecution: false - // }, - // 'conn-status', - // 'flip-local-video', - // 'grant-moderator', - // { - // key: 'kick', - // preventExecution: true - // }, - // { - // key: 'hide-self-view', - // preventExecution: false - // }, - // 'mute', - // 'mute-others', - // 'mute-others-video', - // 'mute-video', - // 'pinToStage', - // 'privateMessage', - // { - // key: 'remote-control', - // preventExecution: false - // }, - // 'send-participant-to-room', - // 'verify', + // } + // '__end' // ], // List of pre meeting screens buttons to hide. The values must be one or more of the 5 allowed buttons: // 'microphone', 'camera', 'select-background', 'invite', 'settings' // hiddenPremeetingButtons: [], - // An array with custom option buttons for the participant context menu - // type: Array<{ icon: string; id: string; text: string; }> - // customParticipantMenuButtons: [], - - // An array with custom option buttons for the toolbar - // type: Array<{ icon: string; id: string; text: string; backgroundColor?: string; }> - // customToolbarButtons: [], - // Stats // @@ -1046,33 +720,46 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // The interval at which PeerConnection.getStats() is called. Defaults to 10000 // pcStatsInterval: 10000, - // Enables sending participants' display names to stats - // enableDisplayNameInStats: false, + // To enable sending statistics to callstats.io you must provide the + // Application ID and Secret. + // callStatsID: '', + // callStatsSecret: '', - // Enables sending participants' emails (if available) to stats and other analytics - // enableEmailInStats: false, - - // faceLandmarks: { - // // Enables sharing your face coordinates. Used for centering faces within a video. - // enableFaceCentering: false, - - // // Enables detecting face expressions and sharing data with other participants - // enableFaceExpressionsDetection: false, - - // // Enables displaying face expressions in speaker stats - // enableDisplayFaceExpressions: false, - - // // Enable rtc stats for face landmarks - // enableRTCStats: false, - - // // Minimum required face movement percentage threshold for sending new face centering coordinates data. - // faceCenteringThreshold: 10, - - // // Milliseconds for processing a new image capture in order to detect face coordinates if they exist. - // captureInterval: 1000, + // The callstats initialize config params as described in the API: + // https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret + // callStatsConfigParams: { + // disableBeforeUnloadHandler: true, // disables callstats.js's window.onbeforeunload parameter. + // applicationVersion: "app_version", // Application version specified by the developer. + // disablePrecalltest: true, // disables the pre-call test, it is enabled by default. + // siteID: "siteID", // The name/ID of the site/campus from where the call/pre-call test is made. + // additionalIDs: { // additionalIDs object, contains application related IDs. + // customerID: "Customer Identifier. Example, walmart.", + // tenantID: "Tenant Identifier. Example, monster.", + // productName: "Product Name. Example, Jitsi.", + // meetingsName: "Meeting Name. Example, Jitsi loves callstats.", + // serverName: "Server/MiddleBox Name. Example, jvb-prod-us-east-mlkncws12.", + // pbxID: "PBX Identifier. Example, walmart.", + // pbxExtensionID: "PBX Extension Identifier. Example, 5625.", + // fqExtensionID: "Fully qualified Extension Identifier. Example, +71 (US) +5625.", + // sessionID: "Session Identifier. Example, session-12-34" + // }, + // collectLegacyStats: true, //enables the collection of legacy stats in chrome browser + // collectIP: true //enables the collection localIP address // }, - // Controls the percentage of automatic feedback shown to participants. + // Enables sending participants' display names to callstats + // enableDisplayNameInStats: false, + + // Enables sending participants' emails (if available) to callstats and other analytics + // enableEmailInStats: false, + + // Enables detecting faces of participants and get their expression and send it to other participants + // enableFacialRecognition: true, + + // Enables displaying facial expressions in speaker stats + // enableDisplayFacialExpressions: true, + + // Controls the percentage of automatic feedback shown to participants when callstats is enabled. // The default value is 100%. If set to 0, no automatic feedback will be requested // feedbackPercentage: 100, @@ -1080,7 +767,7 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // // If third party requests are disabled, no other server will be contacted. - // This means avatars will be locally generated and external stats integration + // This means avatars will be locally generated and callstats integration // will not function. disableThirdPartyRequests: $(if [ -z "${ENABLE_THIRD_PARTY_REQUESTS}" ]; then printf "true"; else printf "false"; fi), @@ -1097,6 +784,9 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // connection. enabled: true, + // Enable unified plan implementation support on Chromium for p2p connection. + // enableUnifiedOnChrome: false, + // Sets the ICE transport policy for the p2p connection. At the time // of this writing the list of possible values are 'all' and 'relay', // but that is subject to change in the future. The enum is defined in @@ -1105,16 +795,20 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) // If not set, the effective value is 'all'. // iceTransportPolicy: 'all', - // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based - // endpoints. - // mobileCodecPreferenceOrder: [ 'H264', 'VP8', 'VP9', 'AV1' ], - // - // Provides a way to set the codec preference on desktop based endpoints. - // codecPreferenceOrder: [ 'AV1', 'VP9', 'VP8', 'H264 ], + // If set to true, it will prefer to use H.264 for P2P calls (if H.264 + // is supported). This setting is deprecated, use preferredCodec instead. + // preferH264: true, - // Provides a way to set the codec for screenshare. - // screenshareCodec: 'AV1', - // mobileScreenshareCodec: 'VP8', + // Provides a way to set the video codec preference on the p2p connection. Acceptable + // codec values are 'VP8', 'VP9' and 'H264'. + // preferredCodec: 'H264', + + // If set to true, disable H.264 video codec by stripping it out of the + // SDP. This setting is deprecated, use disabledCodec instead. + // disableH264: false, + + // Provides a way to prevent a video codec from being negotiated on the p2p connection. + // disabledCodec: '', // How long we're going to wait, before going back to P2P after the 3rd // participant has left the conference (to filter out page reload). @@ -1124,25 +818,23 @@ $(if [ -n "${VIDEO_CONSTRAINTS}" ]; then echo "${VIDEO_CONSTRAINTS},"; fi) stunServers: [ // { urls: 'stun:jitsi-meet.example.com:3478' }, - { urls: 'stun:${TURN_SERVER}:443' }, - ], + { urls: 'stun:${TURN_SERVER}:443' } + ] }, analytics: { -${ANALYTICS_SETTINGS} // True if the analytics should be disabled // disabled: false, + // The Google Analytics Tracking ID: + // googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1' + // Matomo configuration: // matomoEndpoint: 'https://your-matomo-endpoint/', // matomoSiteID: '42', // The Amplitude APP Key: - // amplitudeAPPKey: '', - - // Obfuscates room name sent to analytics (amplitude, rtcstats) - // Default value is false. - // obfuscateRoomName: false, + // amplitudeAPPKey: '' // Configuration for the rtcstats server: // By enabling rtcstats server every time a conference is joined the rtcstats @@ -1150,29 +842,20 @@ ${ANALYTICS_SETTINGS} // PeerConnection states along with getStats metrics polled at the specified // interval. // rtcstatsEnabled: false, - // rtcstatsStoreLogs: false, // In order to enable rtcstats one needs to provide a endpoint url. // rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/, - // The interval at which rtcstats will poll getStats, defaults to 10000ms. + // The interval at which rtcstats will poll getStats, defaults to 1000ms. // If the value is set to 0 getStats won't be polled and the rtcstats client // will only send data related to RTCPeerConnection events. - // rtcstatsPollInterval: 10000, - - // This determines if rtcstats sends the SDP to the rtcstats server or replaces - // all SDPs with an empty string instead. - // rtcstatsSendSdp: false, + // rtcstatsPolIInterval: 1000, // Array of script URLs to load as lib-jitsi-meet "analytics handlers". // scriptURLs: [ - // "https://example.com/my-custom-analytics.js", + // "libs/analytics-ga.min.js", // google-analytics + // "https://example.com/my-custom-analytics.js" // ], - - // By enabling watchRTCEnabled option you would want to use watchRTC feature - // This would also require to configure watchRTCConfigParams. - // Please remember to keep rtcstatsEnabled disabled for watchRTC to work. - // watchRTCEnabled: false, }, // Logs that should go be passed through the 'log' event if a handler is defined for it @@ -1180,11 +863,11 @@ ${ANALYTICS_SETTINGS} // Information about the jitsi-meet instance we are connecting to, including // the user region as seen by the server. - // deploymentInfo: { - // shard: "shard1", - // region: "europe", - // userRegion: "asia", - // }, + deploymentInfo: { + // shard: "shard1", + // region: "europe", + // userRegion: "asia" + }, // Array of disabled sounds. // Possible values: @@ -1208,7 +891,7 @@ ${ANALYTICS_SETTINGS} // - 'RECORDING_OFF_SOUND' // - 'RECORDING_ON_SOUND' // - 'TALK_WHILE_MUTED_SOUND' - disabledSounds: ['REACTION_SOUND'], // This is actually intrusive + // disabledSounds: [], // DEPRECATED! Use \`disabledSounds\` instead. // Decides whether the start/stop recording audio notifications should play on record. @@ -1227,48 +910,49 @@ ${ANALYTICS_SETTINGS} // chromeExtensionBanner: { // // The chrome extension to be installed address // url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb', - // edgeUrl: 'https://microsoftedge.microsoft.com/addons/detail/jitsi-meetings/eeecajlpbgjppibfledfihobcabccihn', // // Extensions info which allows checking if they are installed or not // chromeExtensionsInfo: [ // { // id: 'kglhbbefdnlheedjiejgomgmfplipfeb', - // path: 'jitsi-logo-48x48.png', - // }, - // // Edge extension info - // { - // id: 'eeecajlpbgjppibfledfihobcabccihn', - // path: 'jitsi-logo-48x48.png', - // }, + // path: 'jitsi-logo-48x48.png' + // } // ] // }, + // Local Recording + // + + // localRecording: { + // Enables local recording. + // Additionally, 'localrecording' (all lowercase) needs to be added to + // the \`toolbarButtons\`-array for the Local Recording button to show up + // on the toolbar. + // + // enabled: true, + // + + // The recording format, can be one of 'ogg', 'flac' or 'wav'. + // format: 'flac' + // + + // }, // e2ee: { - // labels: { - // description: '', - // label: '', - // tooltip: '', - // warning: '', - // }, - // externallyManagedKey: false, - // disabled: false, + // labels, + // externallyManagedKey: false // }, // Options related to end-to-end (participant to participant) ping. // e2eping: { - // // Whether ene-to-end pings should be enabled. - // enabled: false, + // // The interval in milliseconds at which pings will be sent. + // // Defaults to 10000, set to <= 0 to disable. + // pingInterval: 10000, // - // // The number of responses to wait for. - // numRequests: 5, - // - // // The max conference size in which e2e pings will be sent. - // maxConferenceSize: 200, - // - // // The maximum number of e2e ping messages per second for the whole conference to aim for. - // // This is used to control the pacing of messages in order to reduce the load on the backend. - // maxMessagesPerSecond: 250, - // }, + // // The interval in milliseconds at which analytics events + // // with the measured RTT will be sent. Defaults to 60000, set + // // to <= 0 to disable. + // analyticsInterval: 60000, + // }, // If set, will attempt to use the provided video input device label when // triggering a screenshare, instead of proceeding through the normal flow @@ -1277,66 +961,10 @@ ${ANALYTICS_SETTINGS} // use only. // _desktopSharingSourceDevice: 'sample-id-or-label', - // DEPRECATED! Use deeplinking.disabled instead. // If true, any checks to handoff to another application will be prevented // and instead the app will continue to display in the current browser. // disableDeepLinking: false, - // The deeplinking config. - // deeplinking: { - // - // // The desktop deeplinking config, disabled by default. - // desktop: { - // appName: 'Jitsi Meet', - // appScheme: 'jitsi-meet, - // download: { - // linux: - // 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet-x86_64.AppImage', - // macos: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg', - // windows: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe' - // }, - // enabled: false - // }, - // // If true, any checks to handoff to another application will be prevented - // // and instead the app will continue to display in the current browser. - // disabled: false, - - // // whether to hide the logo on the deep linking pages. - // hideLogo: false, - - // // The ios deeplinking config. - // ios: { - // appName: 'Jitsi Meet', - // // Specify mobile app scheme for opening the app from the mobile browser. - // appScheme: 'org.jitsi.meet', - // // Custom URL for downloading ios mobile app. - // downloadLink: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905', - // }, - - // // The android deeplinking config. - // android: { - // appName: 'Jitsi Meet', - // // Specify mobile app scheme for opening the app from the mobile browser. - // appScheme: 'org.jitsi.meet', - // // Custom URL for downloading android mobile app. - // downloadLink: 'https://play.google.com/store/apps/details?id=org.jitsi.meet', - // // Android app package name. - // appPackage: 'org.jitsi.meet', - // fDroidUrl: 'https://f-droid.org/en/packages/org.jitsi.meet/', - // } - // }, - - // // The terms, privacy and help centre URL's. - // // TODO: Check and set these up - legalUrls: { - helpCentre: '', - privacy: '', - terms: '' - // helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html', - // privacy: 'https://jitsi.org/meet/privacy', - // terms: 'https://jitsi.org/meet/terms' - }, - // A property to disable the right click context menu for localVideo // the menu has option to flip the locally seen video for local presentations // disableLocalVideoFlip: false, @@ -1350,8 +978,7 @@ ${ANALYTICS_SETTINGS} // Disables all invite functions from the app (share, invite, dial out...etc) // disableInviteFunctions: true, - // Disables storing the room name to the recents list. When in an iframe this is ignored and - // the room is never stored in the recents list. + // Disables storing the room name to the recents list // doNotStoreRoom: true, // Deployment specific URLs. @@ -1361,40 +988,31 @@ ${ANALYTICS_SETTINGS} // userDocumentationURL: 'https://docs.example.com/video-meetings.html', // // If specified a 'Download our apps' button will be displayed in the overflow menu with a link // // to the specified URL for an app download page. - // downloadAppsUrl: 'https://docs.example.com/our-apps.html', + // downloadAppsUrl: 'https://docs.example.com/our-apps.html' // }, // Options related to the remote participant menu. // remoteVideoMenu: { - // // Whether the remote video context menu to be rendered or not. - // disabled: true, - // // If set to true the 'Switch to visitor' button will be disabled. - // disableDemote: true, // // If set to true the 'Kick out' button will be disabled. // disableKick: true, // // If set to true the 'Grant moderator' button will be disabled. - // disableGrantModerator: true, - // // If set to 'all' the 'Private chat' button will be disabled for all participants. - // // If set to 'allow-moderator-chat' the 'Private chat' button will be available for chats with moderators. - // disablePrivateChat: 'all' | 'allow-moderator-chat', + // disableGrantModerator: true // }, - // If set to true all muting operations of remote participants will be disabled. // disableRemoteMute: true, + // Enables support for lip-sync for this client (if the browser supports it). + // enableLipSync: false + /** External API url used to receive branding specific information. If there is no url set or there are missing fields, the defaults are applied. The config file should be in JSON. None of the fields are mandatory and the response must have the shape: { - // Whether participant can only send group chat message if \`send-groupchat\` feature is enabled in jwt. - groupChatRequiresPermission: false, - // Whether participant can only create polls if \`create-polls\` feature is enabled in jwt. - pollCreationRequiresPermission: false, // The domain url to apply (will replace the domain in the sharing conference link/embed section) - inviteDomain: 'example-company.org', + inviteDomain: 'example-company.org, // The hex value for the colour used as background backgroundColor: '#fff', // The url for the image used as background @@ -1403,13 +1021,6 @@ ${ANALYTICS_SETTINGS} logoClickUrl: 'https://example-company.org', // The url used for the image used as logo logoImageUrl: 'https://example.com/logo-img.png', - // Endpoint that enables support for salesforce integration with in-meeting resource linking - // This is required for: - // listing the most recent records - salesforceUrl/records/recents - // searching records - salesforceUrl/records?text=${text} - // retrieving record details - salesforceUrl/records/${id}?type=${type} - // and linking the meeting - salesforceUrl/sessions/${sessionId}/records/${id} - // salesforceUrl: 'https://api.example.com/', // Overwrite for pool of background images for avatars avatarBackgrounds: ['url(https://example.com/avatar-background-1.png)', '#FFF'], // The lobby/prejoin screen background @@ -1417,21 +1028,11 @@ ${ANALYTICS_SETTINGS} // A list of images that can be used as video backgrounds. // When this field is present, the default images will be replaced with those provided. virtualBackgrounds: ['https://example.com/img.jpg'], - // Object containing customized icons that should replace the default ones. - // The keys need to be the exact same icon names used in here: - // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/icons/svg/index.ts - // To avoid having the icons trimmed or displayed in an unexpected way, please provide svg - // files containing svg xml icons in the size that the default icons come in. - customIcons: { - IconArrowUp: 'https://example.com/arrow-up.svg', - IconDownload: 'https://example.com/download.svg', - IconRemoteControlStart: 'https://example.com/remote-start.svg', - }, // Object containing a theme's properties. It also supports partial overwrites of the main theme. // For a list of all possible theme tokens and their current defaults, please check: // https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json // For a short explanations on each of the tokens, please check: - // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.ts + // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.js // IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code // or they are partially applied. customTheme: { @@ -1442,17 +1043,18 @@ ${ANALYTICS_SETTINGS} ui03: "violet", ui04: "magenta", ui05: "blueviolet", + field02Hover: 'red', action01: 'green', action01Hover: 'lightgreen', - disabled01: 'beige', + action02Disabled: 'beige', success02: 'cadetblue', - action02Hover: 'aliceblue', + action02Hover: 'aliceblue' }, typography: { labelRegular: { fontSize: 25, lineHeight: 30, - fontWeight: 500, + fontWeight: 500 } } } @@ -1460,42 +1062,21 @@ ${ANALYTICS_SETTINGS} */ dynamicBrandingUrl: "${DYNAMIC_BRANDING_URL}", - // A list of allowed URL domains for shared video. - // - // NOTE: - // '*' is allowed value and it will allow any URL to be used for shared video. We do not recommend using '*', - // use it at your own risk! - // sharedVideoAllowedURLDomains: [ ], - - // Options related to the participants pane. - // participantsPane: { - // // Enables feature - // enabled: true, - // // Hides the moderator settings tab. - // hideModeratorSettingsTab: false, - // // Hides the more actions button. - // hideMoreActionsButton: false, - // // Hides the mute all button. - // hideMuteAllButton: false, - // }, - // Options related to the breakout rooms feature. // breakoutRooms: { // // Hides the add breakout room button. This replaces \`hideAddRoomButton\`. // hideAddRoomButton: false, - // // Hides the auto assign participants button. - // hideAutoAssignButton: false, // // Hides the join breakout room button. - // hideJoinRoomButton: false, + // hideJoinRoomButton: false // }, - // When true, virtual background feature will be disabled. - // disableVirtualBackground: false, - // When true the user cannot add more images to be used as virtual background. // Only the default ones from will be available. // disableAddingBackgroundImages: false, + // Disables using screensharing as virtual background. + // disableScreensharingVirtualBackground: false, + // Sets the background transparency level. '0' is fully transparent, '1' is opaque. // backgroundAlpha: 1, @@ -1515,17 +1096,16 @@ ${ANALYTICS_SETTINGS} // If a label's id is not in any of the 2 arrays, it will not be visible at all on the header. // conferenceInfo: { // // those labels will not be hidden in tandem with the toolbox. - // alwaysVisible: ['recording', 'raised-hands-count'], + // alwaysVisible: ['recording', 'local-recording', 'raised-hands-count'], // // those labels will be auto-hidden in tandem with the toolbox buttons. // autoHide: [ // 'subject', // 'conference-timer', // 'participants-count', // 'e2ee', + // 'transcribing', // 'video-quality', - // 'insecure-room', - // 'highlight-moment', - // 'top-panel-toggle', + // 'insecure-room' // ] // }, @@ -1552,104 +1132,36 @@ ${ANALYTICS_SETTINGS} // is not persisting the local storage inside the iframe. // useHostPageLocalStorage: true, - // Etherpad ("shared document") integration. + // etherpad ("shared document") integration. // + // If set, add a "Open shared document" link to the bottom right menu that // will open an etherpad document. // etherpad_base: 'https://your-etherpad-installati.on/p/', - // To enable information about dial-in access to meetings you need to provide - // dialInNumbersUrl and dialInConfCodeUrl. - // dialInNumbersUrl returns a json array of numbers that can be used for dial-in. - // {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"} - // dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in - // or the other way around (more info in resources/cloud-api.swagger) - - // You can use external service for authentication that will redirect back passing a jwt token - // You can use tokenAuthUrl config to point to a URL of such service. - // The URL for the service supports few params which will be filled in by the code. - // tokenAuthUrl: - // 'https://myservice.com/auth/{room}?code_challenge_method=S256&code_challenge={code_challenge}&state={state}' - // Supported parameters in tokenAuthUrl: - // {room} - will be replaced with the room name - // {code_challenge} - (A web only). A oauth 2.0 code challenge that will be sent to the service. See: - // https://datatracker.ietf.org/doc/html/rfc7636. The code verifier will be saved in the sessionStorage - // under key: 'code_verifier'. - // {state} - A json with the current state before redirecting. Keys that are included in the state: - // - room (The current room name as shown in the address bar) - // - roomSafe (the backend safe room name to use (lowercase), that is passed to the backend) - // - tenant (The tenant if any) - // - config.xxx (all config overrides) - // - interfaceConfig.xxx (all interfaceConfig overrides) - // - ios=true (in case ios mobile app is used) - // - android=true (in case android mobile app is used) - // - electron=true (when web is loaded in electron app) - // If there is a logout service you can specify its URL with: - // tokenLogoutUrl: 'https://myservice.com/logout' - // You can enable tokenAuthUrlAutoRedirect which will detect that you have logged in successfully before - // and will automatically redirect to the token service to get the token for the meeting. - // tokenAuthUrlAutoRedirect: false - // An option to respect the context.tenant jwt field compared to the current tenant from the url - // tokenRespectTenant: false, - // An option to get for user info (name, picture, email) in the token outside the user context. - // Can be used with Firebase tokens. - // tokenGetUserInfoOutOfContext: false, - - // You can put an array of values to target different entity types in the invite dialog. - // Valid values are "phone", "room", "sip", "user", "videosipgw" and "email" - // peopleSearchQueryTypes: ["user", "email"], - // Directory endpoint which is called for invite dialog autocomplete - // peopleSearchUrl: "https://myservice.com/api/people", - // Endpoint which is called to send invitation requests - // inviteServiceUrl: "https://myservice.com/api/invite", - - // For external entities (e. g. email), the localStorage key holding the token value for directory authentication - // peopleSearchTokenLocation: "mytoken", - - - // Options related to visitors. - // visitors: { - // // Starts audio/video when the participant is promoted from visitor. - // enableMediaOnPromote: { - // audio: true, - // video: true - // }, - // }, - // The default type of desktop sharing sources that will be used in the electron app. - // desktopSharingSources: ['screen', 'window'], - - // Disables the echo cancelation for local audio tracks. - // disableAEC: true, - - // Disables the auto gain control for local audio tracks. - // disableAGC: true, - - // Disables the audio processing (echo cancelation, auto gain control and noise suppression) for local audio tracks. - // disableAP: true, - - // Disables the anoise suppression for local audio tracks. - // disableNS: true, - - // Replaces the display name with the JID of the participants. - // displayJids: true, - - // Enables disables talk while muted detection. - // enableTalkWhileMuted: true, - - // Sets the peer connection ICE transport policy to "relay". - // forceTurnRelay: true, - // List of undocumented settings used in jitsi-meet /** _immediateReloadThreshold + debug + debugAudioLevels deploymentInfo + dialInConfCodeUrl + dialInNumbersUrl dialOutAuthUrl dialOutCodesUrl - dialOutRegionUrl disableRemoteControl + displayJids + externalConnectUrl + e2eeLabels + firefox_fake_device + googleApiApplicationClientID iAmRecorder iAmSipGateway microsoftApiApplicationClientID + peopleSearchQueryTypes + peopleSearchUrl + requireDisplayName + tokenAuthUrl */ /** @@ -1663,9 +1175,19 @@ ${ANALYTICS_SETTINGS} /** _peerConnStatusOutOfLastNTimeout _peerConnStatusRtcMuteTimeout + abTesting avgRtpStatsN + callStatsConfIDNamespace + callStatsCustomScriptUrl desktopSharingSources - disableLocalStats + disableAEC + disableAGC + disableAP + disableHPF + disableNS + enableTalkWhileMuted + forceJVB121Ratio + forceTurnRelay hiddenDomain hiddenFromRecorderFeatureEnabled ignoreStartMuted @@ -1688,7 +1210,6 @@ ${ANALYTICS_SETTINGS} */ // notifications: [ // 'connection.CONNFAIL', // shown when the connection fails, - // 'dialog.cameraConstraintFailedError', // shown when the camera failed // 'dialog.cameraNotSendingData', // shown when there's no feed from user's camera // 'dialog.kickTitle', // shown when user has been kicked // 'dialog.liveStreaming', // livestreaming notifications (pending, on, off, limits) @@ -1699,12 +1220,10 @@ ${ANALYTICS_SETTINGS} // 'dialog.recording', // recording notifications (pending, on, off, limits) // 'dialog.remoteControlTitle', // remote control notifications (allowed, denied, start, stop, error) // 'dialog.reservationError', - // 'dialog.screenSharingFailedTitle', // shown when the screen sharing failed // 'dialog.serviceUnavailable', // shown when server is not reachable // 'dialog.sessTerminated', // shown when there is a failed conference session // 'dialog.sessionRestarted', // show when a client reload is initiated because of bridge migration // 'dialog.tokenAuthFailed', // show when an invalid jwt is used - // 'dialog.tokenAuthFailedWithReasons', // show when an invalid jwt is used with the reason behind the error // 'dialog.transcribing', // transcribing notifications (pending, off) // 'dialOut.statusMessage', // shown when dial out status is updated. // 'liveStreaming.busy', // shown when livestreaming service is busy @@ -1712,45 +1231,35 @@ ${ANALYTICS_SETTINGS} // 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable // 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected // 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied - // 'notify.audioUnmuteBlockedTitle', // shown when mic unmute blocked + // 'localRecording.localRecording', // shown when a local recording is started // 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed + // 'notify.disconnected', // shown when a participant has left // 'notify.connectedOneMember', // show when a participant joined - // 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously // 'notify.connectedTwoMembers', // show when two participants joined simultaneously - // 'notify.dataChannelClosed', // shown when the bridge channel has been disconnected - // 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute + // 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously + // 'notify.leftOneMember', // show when a participant left + // 'notify.leftTwoMembers', // show when two participants left simultaneously + // 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously + // 'notify.grantedTo', // shown when moderator rights were granted to a participant // 'notify.invitedOneMember', // shown when 1 participant has been invited // 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited // 'notify.invitedTwoMembers', // shown when 2 participants have been invited // 'notify.kickParticipant', // shown when a participant is kicked - // 'notify.leftOneMember', // show when a participant left - // 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously - // 'notify.leftTwoMembers', // show when two participants left simultaneously - // 'notify.linkToSalesforce', // shown when joining a meeting with salesforce integration - // 'notify.localRecordingStarted', // shown when the local recording has been started - // 'notify.localRecordingStopped', // shown when the local recording has been stopped - // 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation + // 'notify.moderationStartedTitle', // shown when AV moderation is activated + // 'notify.moderationStoppedTitle', // shown when AV moderation is deactivated // 'notify.moderationInEffectTitle', // shown when user attempts to unmute audio during AV moderation // 'notify.moderationInEffectVideoTitle', // shown when user attempts to enable video during AV moderation - // 'notify.moderator', // shown when user gets moderator privilege + // 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation // 'notify.mutedRemotelyTitle', // shown when user is muted by a remote party // 'notify.mutedTitle', // shown when user has been muted upon joining, // 'notify.newDeviceAudioTitle', // prompts the user to use a newly detected audio device // 'notify.newDeviceCameraTitle', // prompts the user to use a newly detected camera - // 'notify.noiseSuppressionFailedTitle', // shown when failed to start noise suppression // 'notify.participantWantsToJoin', // shown when lobby is enabled and participant requests to join meeting - // 'notify.participantsWantToJoin', // shown when lobby is enabled and participants request to join meeting // 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely // 'notify.passwordSetRemotely', // shown when a password has been set remotely - // 'notify.raisedHand', // shown when a participant used raise hand, - // 'notify.screenShareNoAudio', // shown when the audio could not be shared for the selected screen - // 'notify.screenSharingAudioOnlyTitle', // shown when the best performance has been affected by screen sharing - // 'notify.selfViewTitle', // show "You can always un-hide the self-view from settings" + // 'notify.raisedHand', // shown when a partcipant used raise hand, // 'notify.startSilentTitle', // shown when user joined with no audio - // 'notify.suboptimalExperienceTitle', // show the browser warning // 'notify.unmute', // shown to moderator when user raises hand during AV moderation - // 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party, - // 'notify.videoUnmuteBlockedTitle', // shown when camera unmute and desktop sharing are blocked // 'prejoin.errorDialOut', // 'prejoin.errorDialOutDisconnected', // 'prejoin.errorDialOutFailed', @@ -1763,161 +1272,29 @@ ${ANALYTICS_SETTINGS} // 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected // 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone // 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted - // 'transcribing.failed', // shown when transcribing fails + // 'transcribing.failedToStart' // shown when transcribing fails to start // ], - // List of notifications to be disabled. Works in tandem with the above setting. - // disabledNotifications: [], - // Prevent the filmstrip from autohiding when screen width is under a certain threshold // disableFilmstripAutohiding: false, // filmstrip: { - // // Disable the vertical/horizontal filmstrip. - // disabled: false, // // Disables user resizable filmstrip. Also, allows configuration of the filmstrip // // (width, tiles aspect ratios) through the interfaceConfig options. // disableResizable: false, + // } - // // Disables the stage filmstrip - // // (displaying multiple participants on stage besides the vertical filmstrip) - // disableStageFilmstrip: false, - - // // Default number of participants that can be displayed on stage. - // // The user can change this in settings. Number must be between 1 and 6. - // stageFilmstripParticipants: 1, - - // // Disables the top panel (only shown when a user is sharing their screen). - // disableTopPanel: false, - - // // The minimum number of participants that must be in the call for - // // the top panel layout to be used. - // minParticipantCountForTopPanel: 50, - - // // The width of the filmstrip on joining meeting. Can be resized afterwards. - // initialWidth: 400, - - // // Whether the draggable resize bar of the filmstrip is always visible. Setting this to true will make - // // the filmstrip always visible in case \`disableResizable\` is false. - // alwaysShowResizeBar: true, - // }, - - // Tile view related config options. - // tileView: { - // // Whether tileview should be disabled. - // disabled: false, - // // The optimal number of tiles that are going to be shown in tile view. Depending on the screen size it may - // // not be possible to show the exact number of participants specified here. - // numberOfVisibleTiles: 25, - // }, // Specifies whether the chat emoticons are disabled or not // disableChatSmileys: false, - // Settings for the GIPHY integration. - // giphy: { - // // Whether the feature is enabled or not. - // enabled: false, - // // SDK API Key from Giphy. - // sdkKey: '', - // // Display mode can be one of: - // // - tile: show the GIF on the tile of the participant that sent it. - // // - chat: show the GIF as a message in chat - // // - all: all of the above. This is the default option - // displayMode: 'all', - // // How long the GIF should be displayed on the tile (in milliseconds). - // tileTime: 5000, - // // Limit results by rating: g, pg, pg-13, r. Default value: g. - // rating: 'pg', - // }, + // Allow all above example options to include a trailing comma and + // prevent fear when commenting out the last value. + makeJsonParserHappy: 'even if last key had a trailing comma' - // Logging - // logging: { - // // Default log level for the app and lib-jitsi-meet. - // defaultLogLevel: 'trace', - // // Option to disable LogCollector. - // //disableLogCollector: true, - // // Individual loggers are customizable. - // loggers: { - // // The following are too verbose in their logging with the default level. - // 'modules/RTC/TraceablePeerConnection.js': 'info', - // 'modules/xmpp/strophe.util.js': 'log', - // }, - // }, - - // Application logo url - // defaultLogoUrl: 'images/watermark.svg', - - // Settings for the Excalidraw whiteboard integration. - // whiteboard: { - // // Whether the feature is enabled or not. - // enabled: true, - // // The server used to support whiteboard collaboration. - // // https://github.com/jitsi/excalidraw-backend - // collabServerBaseUrl: 'https://excalidraw-backend.example.com', - // // The user access limit to the whiteboard, introduced as a means - // // to control the performance. - // userLimit: 25, - // // The url for more info about the whiteboard and its usage limitations. - // limitUrl: 'https://example.com/blog/whiteboard-limits', - // }, - - // The watchRTC initialize config params as described : - // https://testrtc.com/docs/installing-the-watchrtc-javascript-sdk/#h-set-up-the-sdk - // https://www.npmjs.com/package/@testrtc/watchrtc-sdk - // watchRTCConfigParams: { - // /** Watchrtc api key */ - // rtcApiKey: string; - // /** Identifier for the session */ - // rtcRoomId?: string; - // /** Identifier for the current peer */ - // rtcPeerId?: string; - // /** - // * ["tag1", "tag2", "tag3"] - // * @deprecated use 'keys' instead - // */ - // rtcTags?: string[]; - // /** { "key1": "value1", "key2": "value2"} */ - // keys?: any; - // /** Enables additional logging */ - // debug?: boolean; - // rtcToken?: string; - // /** - // * @deprecated No longer needed. Use "proxyUrl" instead. - // */ - // wsUrl?: string; - // proxyUrl?: string; - // console?: { - // level: string; - // override: boolean; - // }; - // allowBrowserLogCollection?: boolean; - // collectionInterval?: number; - // logGetStats?: boolean; - // }, - - // Hide login button on auth dialog, you may want to enable this if you are using JWT tokens to authenticate users - // hideLoginButton: true, - - // If true remove the tint foreground on focused user camera in filmstrip - // disableCameraTintForeground: false, - - // File sharign service. - // fileSharing: { - // // The URL of the file sharing service API. See resources/file-sharing.yaml for more details. - // apiUrl: 'https://example.com', - // // Whether the file sharing service is enabled or not. - // enabled: true, - // // Maximum file size limit (-1 value disables any file size limit check) - // maxFileSize: 50, - // }, + // no configuration value should follow this line. }; -// Set the default values for JaaS customers -if (enableJaaS) { - config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids'; - config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access'; - config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment) -} +/* eslint-enable no-unused-vars, no-var */ EOF )" diff --git a/type/__jitsi_meet_domain/files/config.js.sh.orig b/type/__jitsi_meet_domain/files/config.js.sh.orig index 23f7df6..0976642 100644 --- a/type/__jitsi_meet_domain/files/config.js.sh.orig +++ b/type/__jitsi_meet_domain/files/config.js.sh.orig @@ -1,28 +1,4 @@ -/* eslint-disable comma-dangle, no-unused-vars, no-var, prefer-template, vars-on-top */ - -/* - * NOTE: If you add a new option please remember to document it here: - * https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration - */ - -var subdir = ''; -var subdomain = ''; - -if (subdomain) { - subdomain = subdomain.substr(0, subdomain.length - 1).split('.') - .join('_') - .toLowerCase() + '.'; -} - -// In case of no ssi provided by the webserver, use empty strings -if (subdir.startsWith('/' + subdir + 'conference-request/v1', - - // Options related to the bridge (colibri) data channel - bridgeChannel: { - // If the backend advertises multiple colibri websockets, this options allows - // to filter some of them out based on the domain name. We use the first URL - // which does not match ignoreDomain, falling back to the first one that matches - // ignoreDomain. Has no effect if undefined. - // ignoreDomain: 'example.com', - - // Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket. - // If SCTP is available in the backend it will be used instead of a WS. Defaults to - // false (SCTP is used only if available and no WS are available). - // preferSctp: false - }, // Testing / experimental features. // testing: { - // Allows the setting of a custom bandwidth value from the UI. - // assumeBandwidth: true, + // Disables the End to End Encryption feature. Useful for debugging + // issues related to insertable streams. + // disableE2EE: false, - // Enables use of getDisplayMedia in electron - // electronUseGetDisplayMedia: false, + // Enables/disables thumbnail reordering in the filmstrip. It is enabled by default unless explicitly + // disabled by the below option. + // enableThumbnailReordering: true, - // Enables AV1 codec for FF. Note: By default it is disabled. - // enableAV1ForFF: false, - - // Enables the use of the codec selection API supported by the browsers . - // enableCodecSelectionAPI: false, + // Enables XMPP WebSocket (as opposed to BOSH) for the given amount of users. + // mobileXmppWsThreshold: 10 // enable XMPP WebSockets on mobile for 10% of the users // P2P test mode disables automatic switching to P2P when there are 2 // participants in the conference. // p2pTestMode: false, // Enables the test specific features consumed by jitsi-meet-torture - // testMode: false, + // testMode: false // Disables the auto-play behavior of *all* newly created video element. // This is useful when the client runs on a host with limited resources. - // noAutoPlayVideo: false, + // noAutoPlayVideo: false - // Experiment: Whether to skip interim transcriptions. - // skipInterimTranscriptions: false, + // Enable / disable 500 Kbps bitrate cap on desktop tracks. When enabled, + // simulcast is turned off for the desktop share. If presenter is turned + // on while screensharing is in progress, the max bitrate is automatically + // adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines + // the probability for this to be enabled. This setting has been deprecated. + // desktopSharingFrameRate.max now determines whether simulcast will be enabled + // or disabled for the screenshare. + // capScreenshareBitrate: 1 // 0 to disable - deprecated. - // Dump transcripts to a element for debugging. - // dumpTranscript: false, + // Enable callstats only for a percentage of users. + // This takes a value between 0 and 100 which determines the probability for + // the callstats to be enabled. + // callStatsThreshold: 5 // enable callstats for 5% of the users. + }, - // Log the audio levels. - // debugAudioLevels: true, - - // Will replace ice candidates IPs with invalid ones in order to fail ice. - // failICE: true, - - // When running on Spot TV, this controls whether to show the recording consent dialog. - // If false (default), Spot instances will not show the recording consent dialog. - // If true, Spot instances will show the recording consent dialog like regular clients. - // showSpotConsentDialog: false, + // Feature Flags. + flags: { + // Enables source names in the signaling. + // sourceNameSignaling: false, }, // Disables moderator indicators. @@ -133,15 +89,9 @@ var config = { // Disables the reactions moderation feature. // disableReactionsModeration: false, - // Disables the reactions in chat feature. - // disableReactionsInChat: false, - // Disables polls feature. // disablePolls: false, - // Disables demote button from self-view - // disableSelfDemote: false, - // Disables self-view tile. (hides it from tile view and from filmstrip) // disableSelfView: false, @@ -156,7 +106,7 @@ var config = { // Can be either 'recording' - screensharing screenshots are taken // only when the recording is also on, // or 'always' - screensharing screenshots are always taken. - // mode: 'recording', + // mode: 'recording' // } // Disables ICE/UDP by filtering out local and remote UDP candidates in @@ -171,11 +121,13 @@ var config = { // Media // + // Enable unified plan implementation support on Chromium based browsers. + // enableUnifiedOnChrome: false, + // Audio // Disable measuring of audio levels. // disableAudioLevels: false, - // audioLevelsInterval: 200, // Enabling this will run the lib-jitsi-meet no audio detection module which @@ -211,125 +163,35 @@ var config = { // Enabling it (with #params) will disable local audio output of remote // participants and to enable it back a reload is needed. - // startSilent: false, + // startSilent: false // Enables support for opus-red (redundancy for Opus). // enableOpusRed: false, // Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio. // Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC. - // Specify enableOpusDtx to enable support for opus-dtx where - // audio packets won’t be transmitted while participant is silent or muted. // audioQuality: { // stereo: false, - // opusMaxAverageBitrate: null, // Value to fit the 6000 to 510000 range. - // enableOpusDtx: false, - // }, - - // Noise suppression configuration. By default rnnoise is used. Optionally Krisp - // can be used by enabling it below, but the Krisp JS SDK files must be supplied in your - // installation. Specifically, these files are needed: - // - https://meet.example.com/libs/krisp/krisp.mjs - // - https://meet.example.com/libs/krisp/models/model_8.kw - // - https://meet.example.com/libs/krisp/models/model_nc.kw - // - https://meet.example.com/libs/krisp/models/model_bvc.kw - // - https://meet.example.com/libs/krisp/assets/bvc-allowed.txt - // In case when you have known BVC supported devices and you want to extend allowed devices list - // - https://meet.example.com/libs/krisp/assets/bvc-allowed-ext.txt - // In case when you have known BVC supported devices and you want to extend allowed devices list - // - https://meet.example.com/libs/krisp/models/model_inbound_8.kw - // - https://meet.example.com/libs/krisp/models/model_inbound_16.kw - // In case when you want to use inbound noise suppression models - // NOTE: Krisp JS SDK v2.0.0 was tested. - // noiseSuppression: { - // krisp: { - // enabled: false, - // logProcessStats: false, - // debugLogs: false, - // useBVC: false, - // bufferOverflowMS: 1000, - // inboundModels: { - // modelInbound8: 'model_inbound_8.kef', - // modelInbound16: 'model_inbound_16.kef', - // }, - // preloadInboundModels: { - // modelInbound8: 'model_inbound_8.kef', - // modelInbound16: 'model_inbound_16.kef', - // }, - // preloadModels: { - // modelBVC: 'model_bvc.kef', - // model8: 'model_8.kef', - // modelNC: 'model_nc_mq.kef', - // }, - // models: { - // modelBVC: 'model_bvc.kef', - // model8: 'model_8.kef', - // modelNV: 'model_nc_mq.kef', - // }, - // bvc: { - // allowedDevices: 'bvc-allowed.txt', - // allowedDevicesExt: 'bvc-allowed-ext.txt', - // } - // }, + // opusMaxAverageBitrate: null // Value to fit the 6000 to 510000 range. // }, // Video - // Sets the default camera facing mode. - // cameraFacingMode: 'user', - // Sets the preferred resolution (height) for local video. Defaults to 720. // resolution: 720, - // DEPRECATED. Please use raisedHands.disableRemoveRaisedHandOnFocus instead. // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not // disableRemoveRaisedHandOnFocus: false, - // Specifies which raised hand related config should be set. - // raisedHands: { - // // Specifies whether the raised hand can be lowered by moderator. - // disableLowerHandByModerator: false, - - // // Specifies whether there is a notification before hiding the raised hand - // // when someone becomes the dominant speaker. - // disableLowerHandNotification: true, - - // // Specifies whether there is a notification when you are the next speaker in line. - // disableNextSpeakerNotification: false, - - // // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not. - // disableRemoveRaisedHandOnFocus: false, - // }, - - // speakerStats: { - // // Specifies whether the speaker stats is enable or not. - // disabled: false, - - // // Specifies whether there will be a search field in speaker stats or not. - // disableSearch: false, - - // // Specifies whether participants in speaker stats should be ordered or not, and with what priority. - // // 'role', <- Moderators on top. - // // 'name', <- Alphabetically by name. - // // 'hasLeft', <- The ones that have left in the bottom. - // order: [ - // 'role', - // 'name', - // 'hasLeft', - // ], - // }, - - // DEPRECATED. Please use speakerStats.disableSearch instead. // Specifies whether there will be a search field in speaker stats or not // disableSpeakerStatsSearch: false, - // DEPRECATED. Please use speakerStats.order . // Specifies whether participants in speaker stats should be ordered or not, and with what priority // speakerStatsOrder: [ // 'role', <- Moderators on top // 'name', <- Alphabetically by name // 'hasLeft', <- The ones that have left in the bottom - // ], <- the order of the array elements determines priority + // ] <- the order of the array elements determines priority // How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD. // Use -1 to disable. @@ -345,14 +207,20 @@ var config = { // height: { // ideal: 720, // max: 720, - // min: 240, - // }, - // }, + // min: 240 + // } + // } // }, // Enable / disable simulcast support. // disableSimulcast: false, + // Enable / disable layer suspension. If enabled, endpoints whose HD layers are not in use will be suspended + // (no longer sent) until they are requested again. This is enabled by default. This must be enabled for screen + // sharing to work as expected on Chrome. Disabling this might result in low resolution screenshare being sent + // by the client. + // enableLayerSuspension: false, + // Every participant after the Nth will start video muted. // startVideoMuted: 10, @@ -360,167 +228,77 @@ var config = { // applied locally. FIXME: having these 2 options is confusing. // startWithVideoMuted: false, + // If set to true, prefer to use the H.264 video codec (if supported). + // Note that it's not recommended to do this because simulcast is not + // supported when using H.264. For 1-to-1 calls this setting is enabled by + // default and can be toggled in the p2p section. + // This option has been deprecated, use preferredCodec under videoQuality section instead. + // preferH264: true, + + // If set to true, disable H.264 video codec by stripping it out of the + // SDP. + // disableH264: false, + // Desktop sharing // Optional desktop sharing frame rate options. Default value: min:5, max:5. // desktopSharingFrameRate: { // min: 5, - // max: 5, + // max: 5 // }, - // Optional screenshare settings that give more control over screen capture in the browser. - // screenShareSettings: { - // // Show users the current tab is the preferred capture source, default: false. - // desktopPreferCurrentTab: false, - // // Allow users to select system audio, default: include. - // desktopSystemAudio: 'include', - // // Allow users to seamlessly switch which tab they are sharing without having to select the tab again. - // desktopSurfaceSwitching: 'include', - // // Allow a user to be shown a preference for what screen is to be captured, default: unset. - // desktopDisplaySurface: undefined, - // // Allow users to select the current tab as a capture source, default: exclude. - // desktopSelfBrowserSurface: 'exclude' - // }, + // This option has been deprecated since it is no longer supported as per the w3c spec. + // https://w3c.github.io/mediacapture-screen-share/#dom-mediadevices-getdisplaymedia. If the user has not + // interacted with the webpage before the getDisplayMedia call, the promise will be rejected by the browser. This + // has already been implemented in Firefox and Safari and will be implemented in Chrome soon. + // https://bugs.chromium.org/p/chromium/issues/detail?id=1198918 + // startScreenSharing: false, // Recording + // Whether to enable file recording or not. + // fileRecordingsEnabled: false, // Enable the dropbox integration. // dropbox: { - // appKey: '', // Specify your app key here. + // appKey: '' // Specify your app key here. // // A URL to redirect the user to, after authenticating // // by default uses: // // 'https://jitsi-meet.example.com/static/oauth.html' // redirectURI: - // 'https://jitsi-meet.example.com/subfolder/static/oauth.html', + // 'https://jitsi-meet.example.com/subfolder/static/oauth.html' // }, - - // configuration for all things recording related. Existing settings will be migrated here in the future. - // recordings: { - // // IF true (default) recording audio and video is selected by default in the recording dialog. - // // recordAudioAndVideo: true, - // // If true, shows a notification at the start of the meeting with a call to action button - // // to start recording (for users who can do so). - // // suggestRecording: true, - // // If true, shows a warning label in the prejoin screen to point out the possibility that - // // the call you're joining might be recorded. - // // showPrejoinWarning: true, - // // If true, the notification for recording start will display a link to download the cloud recording. - // // showRecordingLink: true, - // // If true, mutes audio and video when a recording begins and displays a dialog - // // explaining the effect of unmuting. - // // requireConsent: true, - // // If true consent will be skipped for users who are already in the meeting. - // // skipConsentInMeeting: true, - // // Link for the recording consent dialog's "Learn more" link. - // // consentLearnMoreLink: 'https://jitsi.org/meet/consent', - // }, - - // recordingService: { - // // When integrations like dropbox are enabled only that will be shown, - // // by enabling fileRecordingsServiceEnabled, we show both the integrations - // // and the generic recording service (its configuration and storage type - // // depends on jibri configuration) - // enabled: false, - - // // Whether to show the possibility to share file recording with other people - // // (e.g. meeting participants), based on the actual implementation - // // on the backend. - // sharingEnabled: false, - - // // Hide the warning that says we only store the recording for 24 hours. - // hideStorageWarning: false, - // }, - - // DEPRECATED. Use recordingService.enabled instead. + // When integrations like dropbox are enabled only that will be shown, + // by enabling fileRecordingsServiceEnabled, we show both the integrations + // and the generic recording service (its configuration and storage type + // depends on jibri configuration) // fileRecordingsServiceEnabled: false, - - // DEPRECATED. Use recordingService.sharingEnabled instead. + // Whether to show the possibility to share file recording with other people + // (e.g. meeting participants), based on the actual implementation + // on the backend. // fileRecordingsServiceSharingEnabled: false, - // Local recording configuration. - // localRecording: { - // // Whether to disable local recording or not. - // disable: false, - - // // Whether to notify all participants when a participant is recording locally. - // notifyAllParticipants: false, - - // // Whether to disable the self recording feature (only local participant streams). - // disableSelfRecording: false, - // }, - - // Customize the Live Streaming dialog. Can be modified for a non-YouTube provider. - // liveStreaming: { - // // Whether to enable live streaming or not. - // enabled: false, - // // Terms link - // termsLink: 'https://www.youtube.com/t/terms', - // // Data privacy link - // dataPrivacyLink: 'https://policies.google.com/privacy', - // // RegExp string that validates the stream key input field - // validatorRegExpString: '^(?:[a-zA-Z0-9]{4}(?:-(?!$)|$)){4}', - // // Documentation reference for the live streaming feature. - // helpLink: 'https://jitsi.org/live' - // }, - - // DEPRECATED. Use liveStreaming.enabled instead. + // Whether to enable live streaming or not. // liveStreamingEnabled: false, - // DEPRECATED. Use transcription.enabled instead. + // Transcription (in interface_config, + // subtitles and buttons can be configured) // transcribingEnabled: false, - // DEPRECATED. Use transcription.useAppLanguage instead. + // If true transcriber will use the application language. + // The application language is either explicitly set by participants in their settings or automatically + // detected based on the environment, e.g. if the app is opened in a chrome instance which is using french as its + // default language then transcriptions for that participant will be in french. + // Defaults to true. // transcribeWithAppLanguage: true, - // DEPRECATED. Use transcription.preferredLanguage instead. + // Transcriber language. This settings will only work if "transcribeWithAppLanguage" is explicitly set to false. + // Available languages can be found in + // ./src/react/features/transcribing/transcriber-langs.json. // preferredTranscribeLanguage: 'en-US', - // DEPRECATED. Use transcription.autoTranscribeOnRecord instead. + // Enables automatic turning on captions when recording is started // autoCaptionOnRecord: false, - // Transcription options. - // transcription: { - // // Whether the feature should be enabled or not. - // enabled: false, - - // // Translation languages. - // // Available languages can be found in - // // ./lang/translation-languages.json. - // translationLanguages: ['en', 'es', 'fr', 'ro'], - - // // Important languages to show on the top of the language list. - // translationLanguagesHead: ['en'], - - // // If true transcriber will use the application language. - // // The application language is either explicitly set by participants in their settings or automatically - // // detected based on the environment, e.g. if the app is opened in a chrome instance which - // // is using french as its default language then transcriptions for that participant will be in french. - // // Defaults to true. - // useAppLanguage: true, - - // // Transcriber language. This settings will only work if "useAppLanguage" - // // is explicitly set to false. - // // Available languages can be found in - // // ./src/react/features/transcribing/transcriber-langs.json. - // preferredLanguage: 'en-US', - - // // Enables automatic turning on transcribing when recording is started - // autoTranscribeOnRecord: false, - - // // Enables automatic request of subtitles when transcriber is present in the meeting, uses the default - // // language that is set - // autoCaptionOnTranscribe: false, - // - // // Disables everything related to closed captions - the tab in the chat area, the button in the menu, - // // subtitles on stage and the "Show subtitles on stage" checkbox in the settings. - // // Note: Starting transcriptions from the recording dialog will still work. - // disableClosedCaptions: false, - - // // Whether to invite jigasi when backend transcriptions are enabled (asyncTranscription is true in metadata). - // // By default, we invite it. - // inviteJigasiOnBackendTranscribing: true, - // }, - // Misc // Default value for the channel "last N" attribute. -1 for unlimited. @@ -540,69 +318,71 @@ var config = { // value will be used when the quality level is selected using "Manage Video Quality" slider. // startLastN: 1, + // Provides a way to use different "last N" values based on the number of participants in the conference. + // The keys in an Object represent number of participants and the values are "last N" to be used when number of + // participants gets to or above the number. + // + // For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than + // 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN' + // will be used as default until the first threshold is reached. + // + // lastNLimits: { + // 5: 20, + // 30: 15, + // 50: 10, + // 70: 5, + // 90: 2 + // }, + + // Provides a way to translate the legacy bridge signaling messages, 'LastNChangedEvent', + // 'SelectedEndpointsChangedEvent' and 'ReceiverVideoConstraint' into the new 'ReceiverVideoConstraints' message + // that invokes the new bandwidth allocation algorithm in the bridge which is described here + // - https://github.com/jitsi/jitsi-videobridge/blob/master/doc/allocation.md. + // useNewBandwidthAllocationStrategy: false, + // Specify the settings for video quality optimizations on the client. // videoQuality: { + // // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified + // // here will be removed from the list of codecs present in the SDP answer generated by the client. If the + // // same codec is specified for both the disabled and preferred option, the disable settings will prevail. + // // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case. + // disabledCodec: 'H264', // - // // Provides a way to set the codec preference on desktop based endpoints. - // codecPreferenceOrder: [ 'AV1', 'VP9', 'VP8', 'H264' ], + // // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here, + // // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only + // // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the + // // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this + // // to take effect. + // preferredCodec: 'VP8', // - // // Provides a way to set the codec for screenshare. - // screenshareCodec: 'AV1', - // mobileScreenshareCodec: 'VP8', + // // Provides a way to enforce the preferred codec for the conference even when the conference has endpoints + // // that do not support the preferred codec. For example, older versions of Safari do not support VP9 yet. + // // This will result in Safari not being able to decode video from endpoints sending VP9 video. + // // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the + // // preferred codec and goes back to the preferred codec when that endpoint leaves. + // // enforcePreferredCodec: false, // - // // Enables the adaptive mode in the client that will make runtime adjustments to selected codecs and received - // // videos for a better user experience. This mode will kick in only when CPU overuse is reported in the - // // WebRTC statistics for the outbound video streams. - // enableAdaptiveMode: false, - // - // // Codec specific settings for scalability modes and max bitrates. - // av1: { - // maxBitratesVideo: { - // low: 100000, - // standard: 300000, - // high: 1000000, - // fullHd: 2000000, - // ultraHd: 4000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true, - // useSimulcast: false, - // useKSVC: true - // }, - // h264: { - // maxBitratesVideo: { - // low: 200000, - // standard: 500000, - // high: 1500000, - // fullHd: 3000000, - // ultraHd: 6000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true - // }, - // vp8: { - // maxBitratesVideo: { - // low: 200000, - // standard: 500000, - // high: 1500000, - // fullHd: 3000000, - // ultraHd: 6000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: false - // }, - // vp9: { - // maxBitratesVideo: { - // low: 100000, - // standard: 300000, - // high: 1200000, - // fullHd: 2500000, - // ultraHd: 5000000, - // ssHigh: 2500000 - // }, - // scalabilityModeEnabled: true, - // useSimulcast: false, - // useKSVC: true + // // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for + // // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values + // // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on + // // the available bandwidth calculated by the browser, but it will be capped by the values specified here. + // // This is currently not implemented on app based clients on mobile. + // maxBitratesVideo: { + // H264: { + // low: 200000, + // standard: 500000, + // high: 1500000 + // }, + // VP8 : { + // low: 200000, + // standard: 500000, + // high: 1500000 + // }, + // VP9: { + // low: 100000, + // standard: 300000, + // high: 1200000 + // } // }, // // // The options can be used to override default thresholds of video thumbnail heights corresponding to @@ -617,20 +397,19 @@ var config = { // // the high quality. // minHeightForQualityLvl: { // 360: 'standard', - // 720: 'high', + // 720: 'high' // }, // - // // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based endpoint - // mobileCodecPreferenceOrder: [ 'VP8', 'VP9', 'H264', 'AV1' ], + // // Provides a way to resize the desktop track to 720p (if it is greater than 720p) before creating a canvas + // // for the presenter mode (camera picture-in-picture mode with screenshare). + // resizeDesktopForPresenter: false // }, // Notification timeouts // notificationTimeouts: { // short: 2500, // medium: 5000, - // long: 10000, - // extraLong: 60000, - // sticky: 0, + // long: 10000 // }, // // Options for the recording limit notification. @@ -645,7 +424,7 @@ var config = { // appName: 'Unlimited recordings APP', // // // The URL of the app with unlimited recordings. - // appURL: 'https://unlimited.recordings.app.com/', + // appURL: 'https://unlimited.recordings.app.com/' // }, // Disables or enables RTX (RFC 4588) (defaults to false). @@ -660,6 +439,14 @@ var config = { // Disables or enables REMB support in this client (default: enabled). // enableRemb: true, + // Enables ICE restart logic in LJM and displays the page reload overlay on + // ICE failure. Current disabled by default because it's causing issues with + // signaling when Octo is enabled. Also when we do an "ICE restart"(which is + // not a real ICE restart), the client maintains the TCC sequence number + // counter, but the bridge resets it. The bridge sends media packets with + // TCC sequence numbers starting from 0. + // enableIceRestart: false, + // Enables forced reload of the client when the call is migrated as a result of // the bridge going down. // enableForcedReload: true, @@ -680,18 +467,12 @@ var config = { // Disables responsive tiles. // disableResponsiveTiles: false, - // DEPRECATED. Please use `securityUi?.hideLobbyButton` instead. - // Hides lobby button. + // Hides lobby button // hideLobbyButton: false, - // DEPRECATED. Please use `lobby?.autoKnock` instead. // If Lobby is enabled starts knocking automatically. // autoKnockLobby: false, - // DEPRECATED. Please use `lobby?.enableChat` instead. - // Enable lobby chat. - // enableLobbyChat: true, - // DEPRECATED! Use `breakoutRooms.hideAddRoomButton` instead. // Hides add breakout room button // hideAddRoomButton: false, @@ -699,38 +480,9 @@ var config = { // Require users to always specify a display name. // requireDisplayName: true, - // Enables webhid functionality for Audio. - // enableWebHIDFeature: false, - - // DEPRECATED! Use 'welcomePage.disabled' instead. // Whether to use a welcome page or not. In case it's false a random room // will be joined when no room is specified. - // enableWelcomePage: true, - - // Configs for welcome page. - // welcomePage: { - // // Whether to disable welcome page. In case it's disabled a random room - // // will be joined when no room is specified. - // disabled: false, - // // If set, landing page will redirect to this URL. - // customUrl: '' - // }, - - // Configs for the lobby screen. - // lobby: { - // // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`. - // autoKnock: false, - // // Enables the lobby chat. Replaces `enableLobbyChat`. - // enableChat: true, - // }, - - // Configs for the security related UI elements. - // securityUi: { - // // Hides the lobby button. Replaces `hideLobbyButton`. - // hideLobbyButton: false, - // // Hides the possibility to set and enter a lobby password. - // disableLobbyPassword: false, - // }, + enableWelcomePage: true, // Disable app shortcuts that are registered upon joining a conference // disableShortcuts: false, @@ -760,8 +512,7 @@ var config = { // Hides the dominant speaker name badge that hovers above the toolbox // hideDominantSpeakerBadge: false, - // Default language for the user interface. Cannot be overwritten. - // DEPRECATED! Use the `lang` iframe option directly instead. + // Default language for the user interface. // defaultLanguage: 'en', // Disables profile and the edit of all fields from the profile settings (display name and email) @@ -770,9 +521,12 @@ var config = { // Hides the email section under profile settings. // hideEmailInSettings: false, + // Whether or not some features are checked based on token. + // enableFeaturesBasedOnToken: false, + // When enabled the password used for locking a room is restricted to up to the number of digits specified - // default: roomPasswordNumberOfDigits: false, // roomPasswordNumberOfDigits: 10, + // default: roomPasswordNumberOfDigits: false, // Message to show the users. Example: 'The service will be down for // maintenance at 01:00 AM GMT, @@ -782,32 +536,17 @@ var config = { // and microsoftApiApplicationClientID // enableCalendarIntegration: false, - // Whether to notify when the conference is terminated because it was destroyed. - // notifyOnConferenceDestruction: true, - - // The client id for the google APIs used for the calendar integration, youtube livestreaming, etc. - // googleApiApplicationClientID: '', - // Configs for prejoin page. // prejoinConfig: { // // When 'true', it shows an intermediate page before joining, where the user can configure their devices. - // // This replaces `prejoinPageEnabled`. Defaults to true. + // // This replaces `prejoinPageEnabled`. // enabled: true, - // // Hides the participant name editing field in the prejoin screen. - // // If requireDisplayName is also set as true, a name should still be provided through - // // either the jwt or the userInfo from the iframe api init object in order for this to have an effect. - // hideDisplayName: false, // // List of buttons to hide from the extra join options dropdown. - // hideExtraJoinButtons: ['no-audio', 'by-phone'], - // // Configuration for pre-call test - // // By setting preCallTestEnabled, you enable the pre-call test in the prejoin page. - // // ICE server credentials need to be provided over the preCallTestICEUrl - // preCallTestEnabled: false, - // preCallTestICEUrl: '' + // hideExtraJoinButtons: ['no-audio', 'by-phone'] // }, // When 'true', the user cannot edit the display name. - // (Mainly useful when used in conjunction with the JWT so the JWT name becomes read only.) + // (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.) // readOnlyName: false, // If etherpad integration is enabled, setting this to true will @@ -822,20 +561,15 @@ var config = { // set or the lobby is not enabled. // enableInsecureRoomNameWarning: false, + // Whether to automatically copy invitation URL after creating a room. + // Document should be focused for this option to work + // enableAutomaticUrlCopy: false, + // Array with avatar URL prefixes that need to use CORS. // corsAvatarURLs: [ 'https://www.gravatar.com/avatar/' ], - // Base URL for a Gravatar-compatible service. Defaults to Gravatar. - // DEPRECATED! Use `gravatar.baseUrl` instead. - // gravatarBaseURL: 'https://www.gravatar.com/avatar/', - - // Setup for Gravatar-compatible services. - // gravatar: { - // // Defaults to Gravatar. - // baseUrl: 'https://www.gravatar.com/avatar/', - // // True if Gravatar should be disabled. - // disabled: false, - // }, + // Base URL for a Gravatar-compatible service. Defaults to libravatar. + // gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/', // App name to be displayed in the invitation email subject, as an alternative to // interfaceConfig.APP_NAME. @@ -848,7 +582,8 @@ var config = { // some other values in config.js to be enabled. Also, the "profile" button will // not display for users with a JWT. // Notes: - // - it's possible to reorder the buttons in the maintoolbar by changing the order of the mainToolbarButtons + // - it's impossible to choose which buttons go in the "More actions" menu + // - it's impossible to control the placement of buttons // - 'desktop' controls the "Share your screen" button // - if `toolbarButtons` is undefined, we fallback to enabling all buttons on the UI // toolbarButtons: [ @@ -864,12 +599,11 @@ var config = { // 'fullscreen', // 'hangup', // 'help', - // 'highlight', // 'invite', - // 'linktosalesforce', // 'livestreaming', // 'microphone', - // 'noisesuppression', + // 'mute-everyone', + // 'mute-video-everyone', // 'participants-pane', // 'profile', // 'raisehand', @@ -884,40 +618,22 @@ var config = { // 'tileview', // 'toggle-camera', // 'videoquality', - // 'whiteboard', + // '__end' // ], // Holds values related to toolbar visibility control. // toolbarConfig: { // // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT - // // The initial number of milliseconds for the toolbar buttons to be visible on screen. + // // The initial numer of miliseconds for the toolbar buttons to be visible on screen. // initialTimeout: 20000, // // Moved from interfaceConfig.TOOLBAR_TIMEOUT - // // Number of milliseconds for the toolbar buttons to be visible on screen. + // // Number of miliseconds for the toolbar buttons to be visible on screen. // timeout: 4000, // // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE - // // Whether toolbar should be always visible or should hide after x milliseconds. - // alwaysVisible: false, - // // Indicates whether the toolbar should still autohide when chat is open - // autoHideWhileChatIsOpen: false, + // // Whether toolbar should be always visible or should hide after x miliseconds. + // alwaysVisible: false // }, - // Overrides the buttons displayed in the main toolbar. Depending on the screen size the number of displayed - // buttons varies from 2 buttons to 8 buttons. Every array in the mainToolbarButtons array will replace the - // corresponding default buttons configuration matched by the number of buttons specified in the array. Arrays with - // more than 8 buttons or less then 2 buttons will be ignored. When there there isn't an override for a certain - // configuration (for example when 3 buttons are displayed) the default jitsi-meet configuration will be used. - // The order of the buttons in the array is preserved. - // mainToolbarButtons: [ - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'reactions', 'participants-pane', 'tileview' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane', 'tileview' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane' ], - // [ 'microphone', 'camera', 'desktop', 'chat', 'participants-pane' ], - // [ 'microphone', 'camera', 'chat', 'participants-pane' ], - // [ 'microphone', 'camera', 'chat' ], - // [ 'microphone', 'camera' ] - // ], - // Toolbar buttons which have their click/tap event exposed through the API on // `toolbarButtonClicked`. Passing a string for the button key will // prevent execution of the click/tap routine; passing an object with `key` and @@ -936,13 +652,11 @@ var config = { // 'desktop', // 'download', // 'embedmeeting', - // 'end-meeting', // 'etherpad', // 'feedback', // 'filmstrip', // 'fullscreen', // 'hangup', - // 'hangup-menu', // 'help', // { // key: 'invite', @@ -952,7 +666,6 @@ var config = { // 'microphone', // 'mute-everyone', // 'mute-video-everyone', - // 'noisesuppression', // 'participants-pane', // 'profile', // { @@ -974,58 +687,14 @@ var config = { // { // key: 'add-passcode', // preventExecution: false - // }, - // 'whiteboard', - // ], - - // Participant context menu buttons which have their click/tap event exposed through the API on - // `participantMenuButtonClick`. Passing a string for the button key will - // prevent execution of the click/tap routine; passing an object with `key` and - // `preventExecution` flag on false will not prevent execution of the click/tap - // routine. Below array with mixed mode for passing the buttons. - // participantMenuButtonsWithNotifyClick: [ - // 'allow-video', - // { - // key: 'ask-unmute', - // preventExecution: false - // }, - // 'conn-status', - // 'flip-local-video', - // 'grant-moderator', - // { - // key: 'kick', - // preventExecution: true - // }, - // { - // key: 'hide-self-view', - // preventExecution: false - // }, - // 'mute', - // 'mute-others', - // 'mute-others-video', - // 'mute-video', - // 'pinToStage', - // 'privateMessage', - // { - // key: 'remote-control', - // preventExecution: false - // }, - // 'send-participant-to-room', - // 'verify', + // } + // '__end' // ], // List of pre meeting screens buttons to hide. The values must be one or more of the 5 allowed buttons: // 'microphone', 'camera', 'select-background', 'invite', 'settings' // hiddenPremeetingButtons: [], - // An array with custom option buttons for the participant context menu - // type: Array<{ icon: string; id: string; text: string; }> - // customParticipantMenuButtons: [], - - // An array with custom option buttons for the toolbar - // type: Array<{ icon: string; id: string; text: string; backgroundColor?: string; }> - // customToolbarButtons: [], - // Stats // @@ -1038,33 +707,46 @@ var config = { // The interval at which PeerConnection.getStats() is called. Defaults to 10000 // pcStatsInterval: 10000, - // Enables sending participants' display names to stats - // enableDisplayNameInStats: false, + // To enable sending statistics to callstats.io you must provide the + // Application ID and Secret. + // callStatsID: '', + // callStatsSecret: '', - // Enables sending participants' emails (if available) to stats and other analytics - // enableEmailInStats: false, - - // faceLandmarks: { - // // Enables sharing your face coordinates. Used for centering faces within a video. - // enableFaceCentering: false, - - // // Enables detecting face expressions and sharing data with other participants - // enableFaceExpressionsDetection: false, - - // // Enables displaying face expressions in speaker stats - // enableDisplayFaceExpressions: false, - - // // Enable rtc stats for face landmarks - // enableRTCStats: false, - - // // Minimum required face movement percentage threshold for sending new face centering coordinates data. - // faceCenteringThreshold: 10, - - // // Milliseconds for processing a new image capture in order to detect face coordinates if they exist. - // captureInterval: 1000, + // The callstats initialize config params as described in the API: + // https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret + // callStatsConfigParams: { + // disableBeforeUnloadHandler: true, // disables callstats.js's window.onbeforeunload parameter. + // applicationVersion: "app_version", // Application version specified by the developer. + // disablePrecalltest: true, // disables the pre-call test, it is enabled by default. + // siteID: "siteID", // The name/ID of the site/campus from where the call/pre-call test is made. + // additionalIDs: { // additionalIDs object, contains application related IDs. + // customerID: "Customer Identifier. Example, walmart.", + // tenantID: "Tenant Identifier. Example, monster.", + // productName: "Product Name. Example, Jitsi.", + // meetingsName: "Meeting Name. Example, Jitsi loves callstats.", + // serverName: "Server/MiddleBox Name. Example, jvb-prod-us-east-mlkncws12.", + // pbxID: "PBX Identifier. Example, walmart.", + // pbxExtensionID: "PBX Extension Identifier. Example, 5625.", + // fqExtensionID: "Fully qualified Extension Identifier. Example, +71 (US) +5625.", + // sessionID: "Session Identifier. Example, session-12-34" + // }, + // collectLegacyStats: true, //enables the collection of legacy stats in chrome browser + // collectIP: true //enables the collection localIP address // }, - // Controls the percentage of automatic feedback shown to participants. + // Enables sending participants' display names to callstats + // enableDisplayNameInStats: false, + + // Enables sending participants' emails (if available) to callstats and other analytics + // enableEmailInStats: false, + + // Enables detecting faces of participants and get their expression and send it to other participants + // enableFacialRecognition: true, + + // Enables displaying facial expressions in speaker stats + // enableDisplayFacialExpressions: true, + + // Controls the percentage of automatic feedback shown to participants when callstats is enabled. // The default value is 100%. If set to 0, no automatic feedback will be requested // feedbackPercentage: 100, @@ -1072,7 +754,7 @@ var config = { // // If third party requests are disabled, no other server will be contacted. - // This means avatars will be locally generated and external stats integration + // This means avatars will be locally generated and callstats integration // will not function. // disableThirdPartyRequests: false, @@ -1089,6 +771,9 @@ var config = { // connection. enabled: true, + // Enable unified plan implementation support on Chromium for p2p connection. + // enableUnifiedOnChrome: false, + // Sets the ICE transport policy for the p2p connection. At the time // of this writing the list of possible values are 'all' and 'relay', // but that is subject to change in the future. The enum is defined in @@ -1097,16 +782,20 @@ var config = { // If not set, the effective value is 'all'. // iceTransportPolicy: 'all', - // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based - // endpoints. - // mobileCodecPreferenceOrder: [ 'H264', 'VP8', 'VP9', 'AV1' ], - // - // Provides a way to set the codec preference on desktop based endpoints. - // codecPreferenceOrder: [ 'AV1', 'VP9', 'VP8', 'H264 ], + // If set to true, it will prefer to use H.264 for P2P calls (if H.264 + // is supported). This setting is deprecated, use preferredCodec instead. + // preferH264: true, - // Provides a way to set the codec for screenshare. - // screenshareCodec: 'AV1', - // mobileScreenshareCodec: 'VP8', + // Provides a way to set the video codec preference on the p2p connection. Acceptable + // codec values are 'VP8', 'VP9' and 'H264'. + // preferredCodec: 'H264', + + // If set to true, disable H.264 video codec by stripping it out of the + // SDP. This setting is deprecated, use disabledCodec instead. + // disableH264: false, + + // Provides a way to prevent a video codec from being negotiated on the p2p connection. + // disabledCodec: '', // How long we're going to wait, before going back to P2P after the 3rd // participant has left the conference (to filter out page reload). @@ -1116,24 +805,23 @@ var config = { stunServers: [ // { urls: 'stun:jitsi-meet.example.com:3478' }, - { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }, - ], + { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' } + ] }, analytics: { // True if the analytics should be disabled // disabled: false, + // The Google Analytics Tracking ID: + // googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1' + // Matomo configuration: // matomoEndpoint: 'https://your-matomo-endpoint/', // matomoSiteID: '42', // The Amplitude APP Key: - // amplitudeAPPKey: '', - - // Obfuscates room name sent to analytics (amplitude, rtcstats) - // Default value is false. - // obfuscateRoomName: false, + // amplitudeAPPKey: '' // Configuration for the rtcstats server: // By enabling rtcstats server every time a conference is joined the rtcstats @@ -1141,29 +829,20 @@ var config = { // PeerConnection states along with getStats metrics polled at the specified // interval. // rtcstatsEnabled: false, - // rtcstatsStoreLogs: false, // In order to enable rtcstats one needs to provide a endpoint url. // rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/, - // The interval at which rtcstats will poll getStats, defaults to 10000ms. + // The interval at which rtcstats will poll getStats, defaults to 1000ms. // If the value is set to 0 getStats won't be polled and the rtcstats client // will only send data related to RTCPeerConnection events. - // rtcstatsPollInterval: 10000, - - // This determines if rtcstats sends the SDP to the rtcstats server or replaces - // all SDPs with an empty string instead. - // rtcstatsSendSdp: false, + // rtcstatsPolIInterval: 1000, // Array of script URLs to load as lib-jitsi-meet "analytics handlers". // scriptURLs: [ - // "https://example.com/my-custom-analytics.js", + // "libs/analytics-ga.min.js", // google-analytics + // "https://example.com/my-custom-analytics.js" // ], - - // By enabling watchRTCEnabled option you would want to use watchRTC feature - // This would also require to configure watchRTCConfigParams. - // Please remember to keep rtcstatsEnabled disabled for watchRTC to work. - // watchRTCEnabled: false, }, // Logs that should go be passed through the 'log' event if a handler is defined for it @@ -1171,11 +850,11 @@ var config = { // Information about the jitsi-meet instance we are connecting to, including // the user region as seen by the server. - // deploymentInfo: { - // shard: "shard1", - // region: "europe", - // userRegion: "asia", - // }, + deploymentInfo: { + // shard: "shard1", + // region: "europe", + // userRegion: "asia" + }, // Array of disabled sounds. // Possible values: @@ -1218,48 +897,49 @@ var config = { // chromeExtensionBanner: { // // The chrome extension to be installed address // url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb', - // edgeUrl: 'https://microsoftedge.microsoft.com/addons/detail/jitsi-meetings/eeecajlpbgjppibfledfihobcabccihn', // // Extensions info which allows checking if they are installed or not // chromeExtensionsInfo: [ // { // id: 'kglhbbefdnlheedjiejgomgmfplipfeb', - // path: 'jitsi-logo-48x48.png', - // }, - // // Edge extension info - // { - // id: 'eeecajlpbgjppibfledfihobcabccihn', - // path: 'jitsi-logo-48x48.png', - // }, + // path: 'jitsi-logo-48x48.png' + // } // ] // }, + // Local Recording + // + + // localRecording: { + // Enables local recording. + // Additionally, 'localrecording' (all lowercase) needs to be added to + // the `toolbarButtons`-array for the Local Recording button to show up + // on the toolbar. + // + // enabled: true, + // + + // The recording format, can be one of 'ogg', 'flac' or 'wav'. + // format: 'flac' + // + + // }, // e2ee: { - // labels: { - // description: '', - // label: '', - // tooltip: '', - // warning: '', - // }, - // externallyManagedKey: false, - // disabled: false, + // labels, + // externallyManagedKey: false // }, // Options related to end-to-end (participant to participant) ping. // e2eping: { - // // Whether ene-to-end pings should be enabled. - // enabled: false, + // // The interval in milliseconds at which pings will be sent. + // // Defaults to 10000, set to <= 0 to disable. + // pingInterval: 10000, // - // // The number of responses to wait for. - // numRequests: 5, - // - // // The max conference size in which e2e pings will be sent. - // maxConferenceSize: 200, - // - // // The maximum number of e2e ping messages per second for the whole conference to aim for. - // // This is used to control the pacing of messages in order to reduce the load on the backend. - // maxMessagesPerSecond: 250, - // }, + // // The interval in milliseconds at which analytics events + // // with the measured RTT will be sent. Defaults to 60000, set + // // to <= 0 to disable. + // analyticsInterval: 60000, + // }, // If set, will attempt to use the provided video input device label when // triggering a screenshare, instead of proceeding through the normal flow @@ -1268,62 +948,10 @@ var config = { // use only. // _desktopSharingSourceDevice: 'sample-id-or-label', - // DEPRECATED! Use deeplinking.disabled instead. // If true, any checks to handoff to another application will be prevented // and instead the app will continue to display in the current browser. // disableDeepLinking: false, - // The deeplinking config. - // deeplinking: { - // - // // The desktop deeplinking config, disabled by default. - // desktop: { - // appName: 'Jitsi Meet', - // appScheme: 'jitsi-meet, - // download: { - // linux: - // 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet-x86_64.AppImage', - // macos: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg', - // windows: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe' - // }, - // enabled: false - // }, - // // If true, any checks to handoff to another application will be prevented - // // and instead the app will continue to display in the current browser. - // disabled: false, - - // // whether to hide the logo on the deep linking pages. - // hideLogo: false, - - // // The ios deeplinking config. - // ios: { - // appName: 'Jitsi Meet', - // // Specify mobile app scheme for opening the app from the mobile browser. - // appScheme: 'org.jitsi.meet', - // // Custom URL for downloading ios mobile app. - // downloadLink: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905', - // }, - - // // The android deeplinking config. - // android: { - // appName: 'Jitsi Meet', - // // Specify mobile app scheme for opening the app from the mobile browser. - // appScheme: 'org.jitsi.meet', - // // Custom URL for downloading android mobile app. - // downloadLink: 'https://play.google.com/store/apps/details?id=org.jitsi.meet', - // // Android app package name. - // appPackage: 'org.jitsi.meet', - // fDroidUrl: 'https://f-droid.org/en/packages/org.jitsi.meet/', - // } - // }, - - // // The terms, privacy and help centre URL's. - // legalUrls: { - // helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html', - // privacy: 'https://jitsi.org/meet/privacy', - // terms: 'https://jitsi.org/meet/terms' - // }, - // A property to disable the right click context menu for localVideo // the menu has option to flip the locally seen video for local presentations // disableLocalVideoFlip: false, @@ -1337,8 +965,7 @@ var config = { // Disables all invite functions from the app (share, invite, dial out...etc) // disableInviteFunctions: true, - // Disables storing the room name to the recents list. When in an iframe this is ignored and - // the room is never stored in the recents list. + // Disables storing the room name to the recents list // doNotStoreRoom: true, // Deployment specific URLs. @@ -1348,40 +975,31 @@ var config = { // userDocumentationURL: 'https://docs.example.com/video-meetings.html', // // If specified a 'Download our apps' button will be displayed in the overflow menu with a link // // to the specified URL for an app download page. - // downloadAppsUrl: 'https://docs.example.com/our-apps.html', + // downloadAppsUrl: 'https://docs.example.com/our-apps.html' // }, // Options related to the remote participant menu. // remoteVideoMenu: { - // // Whether the remote video context menu to be rendered or not. - // disabled: true, - // // If set to true the 'Switch to visitor' button will be disabled. - // disableDemote: true, // // If set to true the 'Kick out' button will be disabled. // disableKick: true, // // If set to true the 'Grant moderator' button will be disabled. - // disableGrantModerator: true, - // // If set to 'all' the 'Private chat' button will be disabled for all participants. - // // If set to 'allow-moderator-chat' the 'Private chat' button will be available for chats with moderators. - // disablePrivateChat: 'all' | 'allow-moderator-chat', + // disableGrantModerator: true // }, - // If set to true all muting operations of remote participants will be disabled. // disableRemoteMute: true, + // Enables support for lip-sync for this client (if the browser supports it). + // enableLipSync: false + /** External API url used to receive branding specific information. If there is no url set or there are missing fields, the defaults are applied. The config file should be in JSON. None of the fields are mandatory and the response must have the shape: { - // Whether participant can only send group chat message if `send-groupchat` feature is enabled in jwt. - groupChatRequiresPermission: false, - // Whether participant can only create polls if `create-polls` feature is enabled in jwt. - pollCreationRequiresPermission: false, // The domain url to apply (will replace the domain in the sharing conference link/embed section) - inviteDomain: 'example-company.org', + inviteDomain: 'example-company.org, // The hex value for the colour used as background backgroundColor: '#fff', // The url for the image used as background @@ -1390,13 +1008,6 @@ var config = { logoClickUrl: 'https://example-company.org', // The url used for the image used as logo logoImageUrl: 'https://example.com/logo-img.png', - // Endpoint that enables support for salesforce integration with in-meeting resource linking - // This is required for: - // listing the most recent records - salesforceUrl/records/recents - // searching records - salesforceUrl/records?text=${text} - // retrieving record details - salesforceUrl/records/${id}?type=${type} - // and linking the meeting - salesforceUrl/sessions/${sessionId}/records/${id} - // salesforceUrl: 'https://api.example.com/', // Overwrite for pool of background images for avatars avatarBackgrounds: ['url(https://example.com/avatar-background-1.png)', '#FFF'], // The lobby/prejoin screen background @@ -1404,21 +1015,11 @@ var config = { // A list of images that can be used as video backgrounds. // When this field is present, the default images will be replaced with those provided. virtualBackgrounds: ['https://example.com/img.jpg'], - // Object containing customized icons that should replace the default ones. - // The keys need to be the exact same icon names used in here: - // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/icons/svg/index.ts - // To avoid having the icons trimmed or displayed in an unexpected way, please provide svg - // files containing svg xml icons in the size that the default icons come in. - customIcons: { - IconArrowUp: 'https://example.com/arrow-up.svg', - IconDownload: 'https://example.com/download.svg', - IconRemoteControlStart: 'https://example.com/remote-start.svg', - }, // Object containing a theme's properties. It also supports partial overwrites of the main theme. // For a list of all possible theme tokens and their current defaults, please check: // https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json // For a short explanations on each of the tokens, please check: - // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.ts + // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.js // IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code // or they are partially applied. customTheme: { @@ -1429,17 +1030,18 @@ var config = { ui03: "violet", ui04: "magenta", ui05: "blueviolet", + field02Hover: 'red', action01: 'green', action01Hover: 'lightgreen', - disabled01: 'beige', + action02Disabled: 'beige', success02: 'cadetblue', - action02Hover: 'aliceblue', + action02Hover: 'aliceblue' }, typography: { labelRegular: { fontSize: 25, lineHeight: 30, - fontWeight: 500, + fontWeight: 500 } } } @@ -1447,42 +1049,21 @@ var config = { */ // dynamicBrandingUrl: '', - // A list of allowed URL domains for shared video. - // - // NOTE: - // '*' is allowed value and it will allow any URL to be used for shared video. We do not recommend using '*', - // use it at your own risk! - // sharedVideoAllowedURLDomains: [ ], - - // Options related to the participants pane. - // participantsPane: { - // // Enables feature - // enabled: true, - // // Hides the moderator settings tab. - // hideModeratorSettingsTab: false, - // // Hides the more actions button. - // hideMoreActionsButton: false, - // // Hides the mute all button. - // hideMuteAllButton: false, - // }, - // Options related to the breakout rooms feature. // breakoutRooms: { // // Hides the add breakout room button. This replaces `hideAddRoomButton`. // hideAddRoomButton: false, - // // Hides the auto assign participants button. - // hideAutoAssignButton: false, // // Hides the join breakout room button. - // hideJoinRoomButton: false, + // hideJoinRoomButton: false // }, - // When true, virtual background feature will be disabled. - // disableVirtualBackground: false, - // When true the user cannot add more images to be used as virtual background. // Only the default ones from will be available. // disableAddingBackgroundImages: false, + // Disables using screensharing as virtual background. + // disableScreensharingVirtualBackground: false, + // Sets the background transparency level. '0' is fully transparent, '1' is opaque. // backgroundAlpha: 1, @@ -1502,17 +1083,16 @@ var config = { // If a label's id is not in any of the 2 arrays, it will not be visible at all on the header. // conferenceInfo: { // // those labels will not be hidden in tandem with the toolbox. - // alwaysVisible: ['recording', 'raised-hands-count'], + // alwaysVisible: ['recording', 'local-recording', 'raised-hands-count'], // // those labels will be auto-hidden in tandem with the toolbox buttons. // autoHide: [ // 'subject', // 'conference-timer', // 'participants-count', // 'e2ee', + // 'transcribing', // 'video-quality', - // 'insecure-room', - // 'highlight-moment', - // 'top-panel-toggle', + // 'insecure-room' // ] // }, @@ -1539,104 +1119,36 @@ var config = { // is not persisting the local storage inside the iframe. // useHostPageLocalStorage: true, - // Etherpad ("shared document") integration. + // etherpad ("shared document") integration. // + // If set, add a "Open shared document" link to the bottom right menu that // will open an etherpad document. // etherpad_base: 'https://your-etherpad-installati.on/p/', - // To enable information about dial-in access to meetings you need to provide - // dialInNumbersUrl and dialInConfCodeUrl. - // dialInNumbersUrl returns a json array of numbers that can be used for dial-in. - // {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"} - // dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in - // or the other way around (more info in resources/cloud-api.swagger) - - // You can use external service for authentication that will redirect back passing a jwt token - // You can use tokenAuthUrl config to point to a URL of such service. - // The URL for the service supports few params which will be filled in by the code. - // tokenAuthUrl: - // 'https://myservice.com/auth/{room}?code_challenge_method=S256&code_challenge={code_challenge}&state={state}' - // Supported parameters in tokenAuthUrl: - // {room} - will be replaced with the room name - // {code_challenge} - (A web only). A oauth 2.0 code challenge that will be sent to the service. See: - // https://datatracker.ietf.org/doc/html/rfc7636. The code verifier will be saved in the sessionStorage - // under key: 'code_verifier'. - // {state} - A json with the current state before redirecting. Keys that are included in the state: - // - room (The current room name as shown in the address bar) - // - roomSafe (the backend safe room name to use (lowercase), that is passed to the backend) - // - tenant (The tenant if any) - // - config.xxx (all config overrides) - // - interfaceConfig.xxx (all interfaceConfig overrides) - // - ios=true (in case ios mobile app is used) - // - android=true (in case android mobile app is used) - // - electron=true (when web is loaded in electron app) - // If there is a logout service you can specify its URL with: - // tokenLogoutUrl: 'https://myservice.com/logout' - // You can enable tokenAuthUrlAutoRedirect which will detect that you have logged in successfully before - // and will automatically redirect to the token service to get the token for the meeting. - // tokenAuthUrlAutoRedirect: false - // An option to respect the context.tenant jwt field compared to the current tenant from the url - // tokenRespectTenant: false, - // An option to get for user info (name, picture, email) in the token outside the user context. - // Can be used with Firebase tokens. - // tokenGetUserInfoOutOfContext: false, - - // You can put an array of values to target different entity types in the invite dialog. - // Valid values are "phone", "room", "sip", "user", "videosipgw" and "email" - // peopleSearchQueryTypes: ["user", "email"], - // Directory endpoint which is called for invite dialog autocomplete - // peopleSearchUrl: "https://myservice.com/api/people", - // Endpoint which is called to send invitation requests - // inviteServiceUrl: "https://myservice.com/api/invite", - - // For external entities (e. g. email), the localStorage key holding the token value for directory authentication - // peopleSearchTokenLocation: "mytoken", - - - // Options related to visitors. - // visitors: { - // // Starts audio/video when the participant is promoted from visitor. - // enableMediaOnPromote: { - // audio: true, - // video: true - // }, - // }, - // The default type of desktop sharing sources that will be used in the electron app. - // desktopSharingSources: ['screen', 'window'], - - // Disables the echo cancelation for local audio tracks. - // disableAEC: true, - - // Disables the auto gain control for local audio tracks. - // disableAGC: true, - - // Disables the audio processing (echo cancelation, auto gain control and noise suppression) for local audio tracks. - // disableAP: true, - - // Disables the anoise suppression for local audio tracks. - // disableNS: true, - - // Replaces the display name with the JID of the participants. - // displayJids: true, - - // Enables disables talk while muted detection. - // enableTalkWhileMuted: true, - - // Sets the peer connection ICE transport policy to "relay". - // forceTurnRelay: true, - // List of undocumented settings used in jitsi-meet /** _immediateReloadThreshold + debug + debugAudioLevels deploymentInfo + dialInConfCodeUrl + dialInNumbersUrl dialOutAuthUrl dialOutCodesUrl - dialOutRegionUrl disableRemoteControl + displayJids + externalConnectUrl + e2eeLabels + firefox_fake_device + googleApiApplicationClientID iAmRecorder iAmSipGateway microsoftApiApplicationClientID + peopleSearchQueryTypes + peopleSearchUrl + requireDisplayName + tokenAuthUrl */ /** @@ -1650,9 +1162,19 @@ var config = { /** _peerConnStatusOutOfLastNTimeout _peerConnStatusRtcMuteTimeout + abTesting avgRtpStatsN + callStatsConfIDNamespace + callStatsCustomScriptUrl desktopSharingSources - disableLocalStats + disableAEC + disableAGC + disableAP + disableHPF + disableNS + enableTalkWhileMuted + forceJVB121Ratio + forceTurnRelay hiddenDomain hiddenFromRecorderFeatureEnabled ignoreStartMuted @@ -1675,7 +1197,6 @@ var config = { */ // notifications: [ // 'connection.CONNFAIL', // shown when the connection fails, - // 'dialog.cameraConstraintFailedError', // shown when the camera failed // 'dialog.cameraNotSendingData', // shown when there's no feed from user's camera // 'dialog.kickTitle', // shown when user has been kicked // 'dialog.liveStreaming', // livestreaming notifications (pending, on, off, limits) @@ -1686,12 +1207,10 @@ var config = { // 'dialog.recording', // recording notifications (pending, on, off, limits) // 'dialog.remoteControlTitle', // remote control notifications (allowed, denied, start, stop, error) // 'dialog.reservationError', - // 'dialog.screenSharingFailedTitle', // shown when the screen sharing failed // 'dialog.serviceUnavailable', // shown when server is not reachable // 'dialog.sessTerminated', // shown when there is a failed conference session // 'dialog.sessionRestarted', // show when a client reload is initiated because of bridge migration // 'dialog.tokenAuthFailed', // show when an invalid jwt is used - // 'dialog.tokenAuthFailedWithReasons', // show when an invalid jwt is used with the reason behind the error // 'dialog.transcribing', // transcribing notifications (pending, off) // 'dialOut.statusMessage', // shown when dial out status is updated. // 'liveStreaming.busy', // shown when livestreaming service is busy @@ -1699,45 +1218,35 @@ var config = { // 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable // 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected // 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied - // 'notify.audioUnmuteBlockedTitle', // shown when mic unmute blocked + // 'localRecording.localRecording', // shown when a local recording is started // 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed + // 'notify.disconnected', // shown when a participant has left // 'notify.connectedOneMember', // show when a participant joined - // 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously // 'notify.connectedTwoMembers', // show when two participants joined simultaneously - // 'notify.dataChannelClosed', // shown when the bridge channel has been disconnected - // 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute + // 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously + // 'notify.leftOneMember', // show when a participant left + // 'notify.leftTwoMembers', // show when two participants left simultaneously + // 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously + // 'notify.grantedTo', // shown when moderator rights were granted to a participant // 'notify.invitedOneMember', // shown when 1 participant has been invited // 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited // 'notify.invitedTwoMembers', // shown when 2 participants have been invited // 'notify.kickParticipant', // shown when a participant is kicked - // 'notify.leftOneMember', // show when a participant left - // 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously - // 'notify.leftTwoMembers', // show when two participants left simultaneously - // 'notify.linkToSalesforce', // shown when joining a meeting with salesforce integration - // 'notify.localRecordingStarted', // shown when the local recording has been started - // 'notify.localRecordingStopped', // shown when the local recording has been stopped - // 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation + // 'notify.moderationStartedTitle', // shown when AV moderation is activated + // 'notify.moderationStoppedTitle', // shown when AV moderation is deactivated // 'notify.moderationInEffectTitle', // shown when user attempts to unmute audio during AV moderation // 'notify.moderationInEffectVideoTitle', // shown when user attempts to enable video during AV moderation - // 'notify.moderator', // shown when user gets moderator privilege + // 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation // 'notify.mutedRemotelyTitle', // shown when user is muted by a remote party // 'notify.mutedTitle', // shown when user has been muted upon joining, // 'notify.newDeviceAudioTitle', // prompts the user to use a newly detected audio device // 'notify.newDeviceCameraTitle', // prompts the user to use a newly detected camera - // 'notify.noiseSuppressionFailedTitle', // shown when failed to start noise suppression // 'notify.participantWantsToJoin', // shown when lobby is enabled and participant requests to join meeting - // 'notify.participantsWantToJoin', // shown when lobby is enabled and participants request to join meeting // 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely // 'notify.passwordSetRemotely', // shown when a password has been set remotely - // 'notify.raisedHand', // shown when a participant used raise hand, - // 'notify.screenShareNoAudio', // shown when the audio could not be shared for the selected screen - // 'notify.screenSharingAudioOnlyTitle', // shown when the best performance has been affected by screen sharing - // 'notify.selfViewTitle', // show "You can always un-hide the self-view from settings" + // 'notify.raisedHand', // shown when a partcipant used raise hand, // 'notify.startSilentTitle', // shown when user joined with no audio - // 'notify.suboptimalExperienceTitle', // show the browser warning // 'notify.unmute', // shown to moderator when user raises hand during AV moderation - // 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party, - // 'notify.videoUnmuteBlockedTitle', // shown when camera unmute and desktop sharing are blocked // 'prejoin.errorDialOut', // 'prejoin.errorDialOutDisconnected', // 'prejoin.errorDialOutFailed', @@ -1750,159 +1259,27 @@ var config = { // 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected // 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone // 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted - // 'transcribing.failed', // shown when transcribing fails + // 'transcribing.failedToStart' // shown when transcribing fails to start // ], - // List of notifications to be disabled. Works in tandem with the above setting. - // disabledNotifications: [], - // Prevent the filmstrip from autohiding when screen width is under a certain threshold // disableFilmstripAutohiding: false, // filmstrip: { - // // Disable the vertical/horizontal filmstrip. - // disabled: false, // // Disables user resizable filmstrip. Also, allows configuration of the filmstrip // // (width, tiles aspect ratios) through the interfaceConfig options. // disableResizable: false, + // } - // // Disables the stage filmstrip - // // (displaying multiple participants on stage besides the vertical filmstrip) - // disableStageFilmstrip: false, - - // // Default number of participants that can be displayed on stage. - // // The user can change this in settings. Number must be between 1 and 6. - // stageFilmstripParticipants: 1, - - // // Disables the top panel (only shown when a user is sharing their screen). - // disableTopPanel: false, - - // // The minimum number of participants that must be in the call for - // // the top panel layout to be used. - // minParticipantCountForTopPanel: 50, - - // // The width of the filmstrip on joining meeting. Can be resized afterwards. - // initialWidth: 400, - - // // Whether the draggable resize bar of the filmstrip is always visible. Setting this to true will make - // // the filmstrip always visible in case `disableResizable` is false. - // alwaysShowResizeBar: true, - // }, - - // Tile view related config options. - // tileView: { - // // Whether tileview should be disabled. - // disabled: false, - // // The optimal number of tiles that are going to be shown in tile view. Depending on the screen size it may - // // not be possible to show the exact number of participants specified here. - // numberOfVisibleTiles: 25, - // }, // Specifies whether the chat emoticons are disabled or not // disableChatSmileys: false, - // Settings for the GIPHY integration. - // giphy: { - // // Whether the feature is enabled or not. - // enabled: false, - // // SDK API Key from Giphy. - // sdkKey: '', - // // Display mode can be one of: - // // - tile: show the GIF on the tile of the participant that sent it. - // // - chat: show the GIF as a message in chat - // // - all: all of the above. This is the default option - // displayMode: 'all', - // // How long the GIF should be displayed on the tile (in milliseconds). - // tileTime: 5000, - // // Limit results by rating: g, pg, pg-13, r. Default value: g. - // rating: 'pg', - // }, + // Allow all above example options to include a trailing comma and + // prevent fear when commenting out the last value. + makeJsonParserHappy: 'even if last key had a trailing comma' - // Logging - // logging: { - // // Default log level for the app and lib-jitsi-meet. - // defaultLogLevel: 'trace', - // // Option to disable LogCollector. - // //disableLogCollector: true, - // // Individual loggers are customizable. - // loggers: { - // // The following are too verbose in their logging with the default level. - // 'modules/RTC/TraceablePeerConnection.js': 'info', - // 'modules/xmpp/strophe.util.js': 'log', - // }, - // }, - - // Application logo url - // defaultLogoUrl: 'images/watermark.svg', - - // Settings for the Excalidraw whiteboard integration. - // whiteboard: { - // // Whether the feature is enabled or not. - // enabled: true, - // // The server used to support whiteboard collaboration. - // // https://github.com/jitsi/excalidraw-backend - // collabServerBaseUrl: 'https://excalidraw-backend.example.com', - // // The user access limit to the whiteboard, introduced as a means - // // to control the performance. - // userLimit: 25, - // // The url for more info about the whiteboard and its usage limitations. - // limitUrl: 'https://example.com/blog/whiteboard-limits', - // }, - - // The watchRTC initialize config params as described : - // https://testrtc.com/docs/installing-the-watchrtc-javascript-sdk/#h-set-up-the-sdk - // https://www.npmjs.com/package/@testrtc/watchrtc-sdk - // watchRTCConfigParams: { - // /** Watchrtc api key */ - // rtcApiKey: string; - // /** Identifier for the session */ - // rtcRoomId?: string; - // /** Identifier for the current peer */ - // rtcPeerId?: string; - // /** - // * ["tag1", "tag2", "tag3"] - // * @deprecated use 'keys' instead - // */ - // rtcTags?: string[]; - // /** { "key1": "value1", "key2": "value2"} */ - // keys?: any; - // /** Enables additional logging */ - // debug?: boolean; - // rtcToken?: string; - // /** - // * @deprecated No longer needed. Use "proxyUrl" instead. - // */ - // wsUrl?: string; - // proxyUrl?: string; - // console?: { - // level: string; - // override: boolean; - // }; - // allowBrowserLogCollection?: boolean; - // collectionInterval?: number; - // logGetStats?: boolean; - // }, - - // Hide login button on auth dialog, you may want to enable this if you are using JWT tokens to authenticate users - // hideLoginButton: true, - - // If true remove the tint foreground on focused user camera in filmstrip - // disableCameraTintForeground: false, - - // File sharign service. - // fileSharing: { - // // The URL of the file sharing service API. See resources/file-sharing.yaml for more details. - // apiUrl: 'https://example.com', - // // Whether the file sharing service is enabled or not. - // enabled: true, - // // Maximum file size limit (-1 value disables any file size limit check) - // maxFileSize: 50, - // }, + // no configuration value should follow this line. }; -// Set the default values for JaaS customers -if (enableJaaS) { - config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids'; - config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access'; - config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment) -} +/* eslint-enable no-unused-vars, no-var */ diff --git a/type/__jitsi_meet_domain/files/interface_config.js.sh b/type/__jitsi_meet_domain/files/interface_config.js.sh index d2ebaa3..094cc6e 100644 --- a/type/__jitsi_meet_domain/files/interface_config.js.sh +++ b/type/__jitsi_meet_domain/files/interface_config.js.sh @@ -20,7 +20,7 @@ JITSI_INTERFACE_CONFIG_JS="$(cat <&2 @@ -91,11 +90,7 @@ fi require="__package/opendkim" __file "$target_file" \ --source "$source_file" --mode 0644 -# Due to the way rc.conf works on *BSD, we find ourselves in the awkward -# situation, where a service's name can contain a '-' symbol, but the -# rc.conf setting to enable a service at boot cannot. -# Unless start_service has been defined before, these two match. -require="__package/opendkim" __start_on_boot "${start_service:-${service}}" +require="__package/opendkim" __start_on_boot "${service}" # Ensure Key and Signing tables exist and have proper permissions key_table="${CFG_DIR}/KeyTable" @@ -110,7 +105,7 @@ require="__package/opendkim" \ --mode 444 require="__file${target_file} __file${key_table} - __file${signing_table} __start_on_boot/${start_service:-${service}}" \ + __file${signing_table} __start_on_boot/${service}" \ __check_messages opendkim \ --pattern "^__file${target_file}" \ --execute "service ${service} restart" diff --git a/type/__opendkim/parameter/deprecated/userid b/type/__opendkim/parameter/deprecated/userid deleted file mode 100644 index 1815a0a..0000000 --- a/type/__opendkim/parameter/deprecated/userid +++ /dev/null @@ -1,2 +0,0 @@ -This can cause inconsistencies with permissions and will stop being supported. -If you still need this, you can use --custom-config 'UserId $USERID'. diff --git a/type/__opendkim_genkey/explorer/key-state b/type/__opendkim_genkey/explorer/key-state deleted file mode 100755 index 75998f9..0000000 --- a/type/__opendkim_genkey/explorer/key-state +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -e -DIRECTORY="/var/db/dkim/" -if [ -f "${__object:?}/parameter/directory" ]; -then - # Be forgiving about a lack of trailing slash - DIRECTORY="$(sed -E 's!([^/])$!\1/!' < "${__object:?}/parameter/directory")" -fi - - -KEY_ID="$(echo "${__object_id:?)}" | tr '/' '_')" -DEFAULT_PATH="${DIRECTORY:?}${KEY_ID:?}.private" -if [ -s "${DEFAULT_PATH}" ]; then - # This is the main location for the key - FOUND_PATH="${DEFAULT_PATH}" -else - # This is a backwards-compatible location for the key - # Keys generated post March 2022 should not land here - if [ -f "${__object:?}/parameter/selector" ]; then - SELECTOR="$(cat "${__object:?}/parameter/selector")" - if [ -s "${DIRECTORY}${SELECTOR:?}.private" ]; then - FOUND_PATH="${DIRECTORY}${SELECTOR:?}.private" - fi - fi -fi - -if [ -n "${FOUND_PATH}" ]; then - printf "present\t%s" "${FOUND_PATH}" -else - # We didn't find the key - # We pass the default path here, to easen logic in the rest of the type - printf "absent\t%s" "${DEFAULT_PATH}" -fi diff --git a/type/__opendkim_genkey/gencode-remote b/type/__opendkim_genkey/gencode-remote index d2bea50..d8dfb4d 100755 --- a/type/__opendkim_genkey/gencode-remote +++ b/type/__opendkim_genkey/gencode-remote @@ -19,8 +19,8 @@ # # Required parameters -DOMAIN="$(cat "${__object:?}/domain")" -SELECTOR="$(cat "${__object:?}/selector")" +DOMAIN="$(cat "${__object:?}/parameter/domain")" +SELECTOR="$(cat "${__object:?}/parameter/selector")" # Optional parameters BITS= @@ -28,6 +28,12 @@ if [ -f "${__object:?}/parameter/bits" ]; then BITS="-b $(cat "${__object:?}/parameter/bits")" fi +DIRECTORY="/var/db/dkim/" +if [ -f "${__object:?}/parameter/directory" ]; then + # Be forgiving about a lack of trailing slash + DIRECTORY="$(sed -E 's!([^/])$!\1/!' < "${__object:?}/parameter/directory")" +fi + # Boolean parameters SUBDOMAINS= if [ -f "${__object:?}/parameter/no-subdomains" ]; then @@ -42,24 +48,9 @@ fi user="$(cat "${__object:?}/user")" group="$(cat "${__object:?}/group")" -KEY_STATE="$(cut -f 1 "${__object:?}/explorer/key-state")" -KEY_LOCATION="$(cut -f 2- "${__object:?}/explorer/key-state")" - -if [ "${KEY_STATE:?}" = "absent" ]; then - # opendkim-genkey(8) does not allow specifying the file name. - # To err on the safe side (and avoid potentially killing other keys) - # we operate on a temporary directory first, then move the resulting key - cat <<-EOF - tmp_dir="\$(mktemp -d cdist-dkim.XXXXXXXXXXX)" - opendkim-genkey $BITS --domain=${DOMAIN:?} --directory=\${tmp_dir:?} $RESTRICTED --selector=${SELECTOR:?} $SUBDOMAINS - # Relocate and ensure permissions - mv "\${tmp_dir:?}/${SELECTOR:?}.private" '${KEY_LOCATION:?}' - chown ${user}:${group} '${KEY_LOCATION}' - chmod 0600 '${KEY_LOCATION}' +if ! [ -f "${DIRECTORY}${SELECTOR}.private" ]; then + echo "opendkim-genkey $BITS --domain=$DOMAIN --directory=$DIRECTORY $RESTRICTED --selector=$SELECTOR $SUBDOMAINS" + echo "chown ${user}:${group} ${DIRECTORY}${SELECTOR}.private" # This is usually generated, if it weren't we do not want to fail - mv "\${tmp_dir:?}/${SELECTOR:?}.txt" '${KEY_LOCATION%.private}.txt' || true - chown ${user}:${group} '${KEY_LOCATION%.private}.txt' || true - # Cleanup after ourselves - rmdir "\${tmp_dir:?}" || true - EOF + echo "chown ${user}:${group} ${DIRECTORY}${SELECTOR}.txt || true" fi diff --git a/type/__opendkim_genkey/man.rst b/type/__opendkim_genkey/man.rst index 0d52ca3..b3fd013 100644 --- a/type/__opendkim_genkey/man.rst +++ b/type/__opendkim_genkey/man.rst @@ -10,27 +10,23 @@ DESCRIPTION ----------- This type uses the `opendkim-genkey(8)` to generate signing keys suitable for -usage by `opendkim(8)` to sign outgoing emails. - -It also manages the key, identified by its `$__object_id` in OpenDKIM's -KeyTable and sets its `s=` and `d=` parameters (see: `--selector` and -`--sigdomain` respectively). - -This type will also manage the entries in the OpenDKIM's SigningTable by -associating any given `sigkey` values to this key. - -Take into account that if you use this type without the `--domain` and -`--selector` parameters, the `$__object_id` must be in form `$domain/$selector`. +usage by `opendkim(8)` to sign outgoing emails. Then, a line with the domain, +selector and keyname in the `$selector._domainkey.$domain` format will be added +to the OpenDKIM key table located at `/etc/opendkim/KeyTable`. Finally, a line +will be added to the OpenDKIM signing table, using either the domain or the +provided key for the `domain:selector:keyfile` value in the table. An existing +key will not be overwritten. Currently, this type is only implemented for Alpine Linux and FreeBSD. Please contribute an implementation if you can. -NOTE: the name of the key file under `--directory` will default to -`$__object_id.private`, but if that fails and `--selector` is used, -`SELECTOR.private` will be considered. -Take care when using unrelated keys that might collide this way. -For more information see: -https://code.ungleich.ch/ungleich-public/cdist-contrib/issues/20 +REQUIRED PARAMETERS +------------------- +domain + The domain to generate the key for. + +selector + The DKIM selector to generate the key for. OPTIONAL PARAMETERS @@ -42,36 +38,10 @@ bits directory The directory in which to generate the key, `/var/db/dkim/` by default. -domain - The domain to generate the key for. - If omitted, `--selector` must be omitted as well and `$__object_id` must be - in form: `$domain/$selector`. - -selector - The DKIM selector to generate the key for. - If omitted, `--domain` must be omitted as well and `$__object_id` must be - in form: `$domain/$selector`. - -sigdomain - Specified in the KeyTable, the domain to use in the signature's "d=" value. - Defaults to the specified domain. If `%`, it will be replaced by the apparent - domain of the sender when generating a signature. - Note you probably don't want to set both `--sigdomain` and `--sigkey` to `%`. - See `KeyTable` in `opendkim.conf(5)` for more information. - - -OPTIONAL MULTIPLE PARAMETERS ----------------------------- sigkey - The key used in the `SigningTable` for this signing key. Defaults to the + The key used in the SigningTable for this signing key. Defaults to the specified domain. If `%`, OpenDKIM will replace it with the domain found in the `From:` header. See `opendkim.conf(5)` for more options. - Note you probably don't want to set both `--sigdomain` and `--sigkey` to `%`. - This can be passed multiple times, resulting in multiple lines in the - SigningTable, which can be used to support signing of subdomains or multiple - domains with the same key; in that case, you probably want to set - `--sigdomain` to `%`, else the domains will not be aligned. - BOOLEAN PARAMETERS ------------------ @@ -87,7 +57,6 @@ EXAMPLES .. code-block:: sh - # Setup the OpenDKIM service __opendkim \ --socket inet:8891@localhost \ --basedir /var/lib/opendkim \ @@ -96,24 +65,14 @@ EXAMPLES --umask 002 \ --syslog - # Continue only after the service has been set up - export require="__opendkim" + require='__opendkim' \ + __opendkim_genkey default \ + --domain example.com \ + --selector default - # Generate a key for 'example.com' with selector 'default' - __opendkim_genkey default \ - --domain example.com \ - --selector default - - # Generate a key for 'foo.com' with selector 'backup' - __opendkim_genkey 'foo.com/backup' - - # Generate a key for 'example.org' with selector 'main' - # that can also sign 'cdi.st' and subdomains of 'example.org' - __opendkim_genkey 'example.org/main' \ - --sigdomain '%' \ - --sigkey 'example.org' \ - --sigkey '.example.org' \ - --sigkey 'cdi.st' + __opendkim_genkey myfoo \ + --domain foo.com \ + --selector backup SEE ALSO diff --git a/type/__opendkim_genkey/manifest b/type/__opendkim_genkey/manifest index 58e9b06..50dcee5 100755 --- a/type/__opendkim_genkey/manifest +++ b/type/__opendkim_genkey/manifest @@ -35,48 +35,17 @@ case "$os" in ;; *) cat <<- EOF >&2 - __opendkim_genkey currently only supports Alpine Linux and FreeBSD. - Please contribute an implementation for $os if you can. + __opendkim_genkey currently only supports Alpine Linux. Please + contribute an implementation for $os if you can. EOF - exit 1 ;; esac +# Persist user and group for gencode-remote +printf '%s' "${user}" > "${__object:?}/user" +printf '%s' "${group}" > "${__object:?}/group" -# Logic to simplify the type as documented in -# https://code.ungleich.ch/ungleich-public/cdist-contrib/issues/20#issuecomment-14711 -DOMAIN="$(cat "${__object:?}/parameter/domain" 2>/dev/null || true)" -SELECTOR="$(cat "${__object:?}/parameter/selector" 2>/dev/null || true)" -if [ -z "${DOMAIN}${SELECTOR}" ]; then - # Neither SELECTOR nor DOMAIN were passed, try to use __object_id - if echo "${__object_id:?}" | \ - grep -qE '^[^/[:space:]]+/[^/[:space:]]+$'; then - # __object_id matches, let's get the data - DOMAIN="$(echo "${__object_id:?}" | cut -d '/' -f 1)" - SELECTOR="$(echo "${__object_id:?}" | cut -d '/' -f 2)" - else - # It doesn't match the pattern, this is sad - cat <<- EOF >&2 - The arguments --domain and --selector were not used. - So __object_id must match DOMAIN/SELECTOR. - But instead the type got: ${__object_id:?} - EOF - exit 1 - fi -elif [ -z "${DOMAIN}" ] || [ -z "${SELECTOR}" ]; then - # Only one was passed, this is sad :-( - cat <<- EOF >&2 - You must pass either both --selector and --domain or none of them. - If these arguments are absent, __object_id must match: DOMAIN/SELECTOR. - EOF - exit 1 -# else: both were passed -fi - -# Persist data for gencode-remote -printf '%s' "${user:?}" > "${__object:?}/user" -printf '%s' "${group:?}" > "${__object:?}/group" -printf '%s' "${DOMAIN:?}" > "${__object:?}/domain" -printf '%s' "${SELECTOR:?}" > "${__object:?}/selector" +SELECTOR="$(cat "${__object:?}/parameter/selector")" +DOMAIN="$(cat "${__object:?}/parameter/domain")" DIRECTORY="/var/db/dkim/" if [ -f "${__object:?}/parameter/directory" ]; @@ -90,11 +59,6 @@ if [ -f "${__object:?}/parameter/sigkey" ]; then SIGKEY="$(cat "${__object:?}/parameter/sigkey")" fi -SIGDOMAIN="${DOMAIN:?}" -if [ -f "${__object:?}/parameter/sigdomain" ]; -then - SIGDOMAIN="$(cat "${__object:?}/parameter/sigdomain")" -fi # Ensure the key-container directory exists with the proper permissions __directory "${DIRECTORY}" \ @@ -112,28 +76,10 @@ esac key_table="${CFG_DIR}/KeyTable" signing_table="${CFG_DIR}/SigningTable" -KEY_STATE="$(cut -f 1 "${__object:?}/explorer/key-state")" -KEY_LOCATION="$(cut -f 2- "${__object:?}/explorer/key-state")" - -__line "__opendkim_genkey/${__object_id:?}" \ +__line "line-key-${__object_id:?}" \ --file "${key_table}" \ - --line "${__object_id:?} ${SIGDOMAIN:?}:${SELECTOR:?}:${KEY_LOCATION:?}" \ - --regex "^${__object_id:?}[[:space:]]" \ - --state 'replace' + --line "${SELECTOR:?}._domainkey.${DOMAIN:?} ${DOMAIN:?}:${SELECTOR:?}:${DIRECTORY:?}${SELECTOR:?}.private" -sigtable_block() { - for sigkey in ${SIGKEY:?}; do - echo "${sigkey:?} ${__object_id:?}" - done -} -__block "__opendkim_genkey/${__object_id:?}" \ +__line "line-sig-${__object_id:?}" \ --file "${signing_table}" \ - --text "$(sigtable_block)" - -if [ "${KEY_STATE:?}" = "present" ]; then - # Ensure proper permissions for the key file - __file "${KEY_LOCATION}" \ - --owner "${user}" \ - --group "${group}" \ - --mode 0600 -fi + --line "${SIGKEY:?} ${SELECTOR:?}._domainkey.${DOMAIN:?}" diff --git a/type/__opendkim_genkey/parameter/optional b/type/__opendkim_genkey/parameter/optional index 9d9b6d1..e44793f 100644 --- a/type/__opendkim_genkey/parameter/optional +++ b/type/__opendkim_genkey/parameter/optional @@ -1,6 +1,4 @@ bits directory -domain unrestricted -selector -sigdomain +sigkey diff --git a/type/__opendkim_genkey/parameter/optional_multiple b/type/__opendkim_genkey/parameter/optional_multiple deleted file mode 100644 index 35978a9..0000000 --- a/type/__opendkim_genkey/parameter/optional_multiple +++ /dev/null @@ -1 +0,0 @@ -sigkey diff --git a/type/__opendkim_genkey/parameter/required b/type/__opendkim_genkey/parameter/required new file mode 100644 index 0000000..4dacb77 --- /dev/null +++ b/type/__opendkim_genkey/parameter/required @@ -0,0 +1,2 @@ +domain +selector diff --git a/type/__php_fpm/files/php.ini.sh b/type/__php_fpm/files/php.ini.sh index ec7e446..8fbc4ac 100755 --- a/type/__php_fpm/files/php.ini.sh +++ b/type/__php_fpm/files/php.ini.sh @@ -20,7 +20,7 @@ variables_order = "GPCS" zend.assertions = -1 ; Local custom variations -include_path = ".:${PHP_INCLUDEDIR}" +include_path = ".:/usr/share/php${PHPVER:?}" memory_limit = ${MEMORY_LIMIT:?} post_max_size = ${UPLOAD_MAX_FILESIZE:?} upload_max_filesize = ${UPLOAD_MAX_FILESIZE:?} diff --git a/type/__php_fpm/man.rst b/type/__php_fpm/man.rst index 4306687..08b479e 100644 --- a/type/__php_fpm/man.rst +++ b/type/__php_fpm/man.rst @@ -12,7 +12,8 @@ This type installs and configures PHP-FPM for a given version of PHP. It is expected to be used in combination with cdist-type__php_fpm_pool, which configures specific pools. -This type supports Debian, Ubuntu and Alpine Linux. +Note that currently, this type is only implemented for Alpine Linux. + REQUIRED PARAMETERS ------------------- diff --git a/type/__php_fpm/manifest b/type/__php_fpm/manifest index 9c32716..84c4383 100644 --- a/type/__php_fpm/manifest +++ b/type/__php_fpm/manifest @@ -6,39 +6,18 @@ PHPVER=$(cat "${__object:?}/parameter/php-version") export PHPVER case "$os" in - 'alpine') - # Alpine packages looks like php81-fpm - we make sure to remove dots from user - # input. - PHPVER=$(echo "$PHPVER" | tr -d '.') - - package="php${PHPVER}-fpm" - opcache_package="php${PHPVER}-opcache" - apcu_package="php${PHPVER}-pecl-apcu" - - service="php-fpm${PHPVER}" - php_confdir="/etc/php${PHPVER}" - php_ini="${php_confdir:?}/php.ini" - - PHP_INCLUDEDIR="/usr/share/php${PHPVER:?}" - export PHP_INCLUDEDIR +'alpine') + package="php${PHPVER}-fpm" + service="php-fpm${PHPVER}" + opcache_package="php${PHPVER}-opcache" + apcu_package="php${PHPVER}-pecl-apcu" ;; - 'debian'|'ubuntu') - package="php${PHPVER}-fpm" - opcache_package="php${PHPVER}-opcache" - apcu_package="php${PHPVER}-apcu" - service="php${PHPVER}-fpm" - php_confdir="/etc/php/${PHPVER}" - php_ini="${php_confdir:?}/fpm/php.ini" - - PHP_INCLUDEDIR="/usr/share/php/${PHPVER:?}" - export PHP_INCLUDEDIR +*) + printf "Your operating system is currently not supported by this type\n" >&2 + printf "Please contribute an implementation for it if you can.\n" >&2 + exit 1 ;; - *) - printf "Your operating system is currently not supported by this type\n" >&2 - printf "Please contribute an implementation for it if you can.\n" >&2 - exit 1 - ;; esac __package "$package" @@ -61,8 +40,8 @@ export UPLOAD_MAX_FILESIZE mkdir -p "${__object:?}/files" "${__type:?}/files/php.ini.sh" >"${__object:?}/files/php.ini" -require="__package/$package" __file "${php_ini:?}" \ +require="__package/$package" __file "/etc/php${PHPVER}/php.ini" \ --mode 644 --source "${__object:?}/files/php.ini" \ --onchange "service $service restart" -require="__file/${php_ini:?}" __service "$service" --action start +require="__file/etc/php${PHPVER}/php.ini" __service "$service" --action start diff --git a/type/__php_fpm_pool/man.rst b/type/__php_fpm_pool/man.rst index da6dd3a..cd96175 100644 --- a/type/__php_fpm_pool/man.rst +++ b/type/__php_fpm_pool/man.rst @@ -13,7 +13,7 @@ This type configures a pool named after the `__object_id` for a specified PHP version. Note that this types expects a same-version cdist-type__php_fpm type to have been run first: the user is responsible for doing so. -This type supports Debian, Ubuntu and Alpine Linux. +Note that currently, this type is only implemented for Alpine Linux. REQUIRED PARAMETERS diff --git a/type/__php_fpm_pool/manifest b/type/__php_fpm_pool/manifest index 3c8491a..b090c9d 100644 --- a/type/__php_fpm_pool/manifest +++ b/type/__php_fpm_pool/manifest @@ -1,5 +1,8 @@ #!/bin/sh +# XXX: this type does not configure or install php-fpm: it expects the +# __recycledcloud_php_fpm type to be used first before pools are configured. + os=$(cat "${__global:?}/explorer/os") name=${__object_id:?} @@ -7,22 +10,16 @@ PHPVER=$(cat "${__object:?}/parameter/php-version") export PHPVER case "$os" in - 'alpine') - PHPVER=$(echo "$PHP_VERSION" | tr -d '.') - service="php-fpm${PHPVER}" - php_confdir="/etc/php${PHPVER}" - php_pooldir="${php_confdir:?}/php-fpm.d" +'alpine') + service="php-fpm${PHPVER}" + : ;; - 'debian'|'ubuntu') - service="php${PHPVER}-fpm" - php_confdir="/etc/php/${PHPVER}" - php_pooldir="${php_confdir:?}/fpm/pool.d" + +*) + printf "Your operating system is currently not supported by this type\n" >&2 + printf "Please contribute an implementation for it if you can.\n" >&2 + exit 1 ;; - *) - printf "Your operating system is currently not supported by this type\n" >&2 - printf "Please contribute an implementation for it if you can.\n" >&2 - exit 1 - ;; esac POOL_NAME="$name" @@ -35,6 +32,6 @@ export POOL_USER POOL_GROUP POOL_LISTEN_ADDR POOL_LISTEN_OWNER POOL_NAME mkdir -p "${__object:?}/files" "${__type:?}/files/www.conf.sh" >"${__object:?}/files/www.conf" -__file "${php_pooldir:?}/${name}.conf" \ +__file "/etc/php${PHPVER:?}/php-fpm.d/${name}.conf" \ --mode 644 --source "${__object:?}/files/www.conf" \ --onchange "service $service reload" diff --git a/type/__runit/manifest b/type/__runit/manifest index 6e5feca..6ba174c 100755 --- a/type/__runit/manifest +++ b/type/__runit/manifest @@ -6,14 +6,7 @@ os="$(cat "${__global}/explorer/os")" case "${os}" in debian|devuan) # zero-config sysvinit and systemd compatibility - os_version="$(cat "${__global}/explorer/os_version")" - debian_package="runit-run" - case "${os_version}" in - beowulf) - debian_package="runit" - ;; - esac - __package "${debian_package}" + __package runit-run ;; freebsd) __key_value \ diff --git a/type/__runit_service/manifest b/type/__runit_service/manifest index 548a1de..83114fd 100755 --- a/type/__runit_service/manifest +++ b/type/__runit_service/manifest @@ -33,25 +33,18 @@ if [ "${state}" != "present" ]; then exit fi -# Setup run file -__file --state "${state}" --mode 0550 --source "${source}" \ - --onchange "sv restart '${sv}' || true" \ - "${run_file}" -export require="${require} __file${run_file}" - if [ -f "${__object}/parameter/log" ]; then # Setup logger if requested - logdir="/var/log/runit" - __directory --parents "${svdir}/${sv}/log" - __directory --state absent "${svdir}/${sv}/log/main" # Remove lingering old fashioned log - __directory --parents "${logdir}/${sv}" - export require="${require} __directory${svdir}/${sv}/log __directory${logdir}/${sv}" + __directory --parents "${svdir}/${sv}/log/main" + export require="${require} __directory${svdir}/${sv}/log/main" __file "${svdir}/${sv}/log/run" \ --state "${state}" \ --mode 0755 \ - --onchange "sv restart '${sv}/log' || true" \ --source "-" < - - -COPYING -------- -Copyright \(C) 2022 Evilham. diff --git a/type/__single_binary_service/manifest b/type/__single_binary_service/manifest deleted file mode 100755 index f46d62e..0000000 --- a/type/__single_binary_service/manifest +++ /dev/null @@ -1,358 +0,0 @@ -#!/bin/sh -eu -SERVICE_NAME="${__object_id}" - -OS="$(cat "${__global}/explorer/os")" - -case "${OS}" in - debian|devuan) - SUPER_USER_GROUP=root - ETC_DIR="/etc" - ;; - *bsd) - SUPER_USER_GROUP=wheel - ETC_DIR="/usr/local/etc" - ;; - *) - echo "Your OS '${OS}' is currently not supported." >&2 - exit 1 - ;; -esac -INIT="$(cat "${__global}/explorer/init")" - -case "${INIT}" in - systemd) - service_definition_require="__systemd_unit/${SERVICE_NAME}.service" - service_command="service ${SERVICE_NAME} %s" - ;; - runit|sysvinit) - # We will use runit to manage these services - __runit - export require="__runit" - service_definition_require="__runit_service/${SERVICE_NAME}" - service_command="sv %s ${SERVICE_NAME}" - ;; - *) - echo "Init system '${INIT}' is currently not supported." >&2 - exit 1 - ;; -esac - -BIN_DIR="/usr/local/bin" - -# Ensure the target bin dir exists -# Care, we never want to remove it :-D -__directory "${BIN_DIR}" \ - --state "exists" \ - --mode 0755 -export require="${require:-} __directory${BIN_DIR}" - -STATE="$(cat "${__object}/parameter/state")" -USER="$(cat "${__object}/parameter/user")" -GROUP="$(cat "${__object}/parameter/group" 2>/dev/null || true)" -if [ -z "${GROUP}" ]; then - if [ "${USER}" != "root" ]; then - GROUP="${USER}" - else - GROUP="${SUPER_USER_GROUP}" - fi -fi - - -BINARY="$(cat "${__object}/parameter/binary" 2>/dev/null || true)" -if [ -z "${BINARY}" ]; then - BINARY="${SERVICE_NAME}" -fi -EXTRA_BINARIES="$(cat "${__object}/parameter/extra-binary" 2>/dev/null || true)" -# This only makes sense for file archives -if [ -n "${EXTRA_BINARIES}" ] && [ -f "${__object}/parameter/unpack" ]; then - cat >&2 <<-EOF - You cannot specify extra binaries without the --unpack argument. - Make sure that the --url argument points to a file archive. -EOF -fi - -SERVICE_EXEC="$(cat "${__object}/parameter/service-exec" 2>/dev/null || true)" -if [ -z "${SERVICE_EXEC}" ]; then - SERVICE_EXEC="${BIN_DIR}/${BINARY}" -fi -SERVICE_ARGS="$(cat "${__object}/parameter/service-args")" -SERVICE_EXEC="${SERVICE_EXEC} ${SERVICE_ARGS}" - -SERVICE_DESCRIPTION="$(cat "${__object}/parameter/service-description" \ - 2>/dev/null || true)" -if [ -z "${SERVICE_DESCRIPTION}" ]; then - SERVICE_DESCRIPTION="cdist-managed '${SERVICE_NAME}' service" -fi - -SERVICE_DEFINITION="$(cat "${__object}/parameter/service-definition" 2>/dev/null || true)" - -CHECKSUM="$(cat "${__object}/parameter/checksum")" -SHOULD_VERSION="$(cat "${__object}/parameter/version" 2>/dev/null || true)" -DOWNLOAD_URL="$(cat "${__object}/parameter/url")" -LOCAL_SOURCE="$(cat "${__object}/parameter/local-source")" -if [ "${STATE}" = "present" ] && [ -z "${SHOULD_VERSION}" ]; then - cat >&1 <<-EOM - When installing a service, --version must be specified. - EOM - exit 1 -fi -if [ "${STATE}" = "present" ] && [ -z "${DOWNLOAD_URL}${LOCAL_SOURCE}" ]; then - cat >&1 <<-EOM - Exactly one of --url or --local-source must be specified. - EOM - exit 1 -fi -if [ -n "${DOWNLOAD_URL}" ] && [ -z "${CHECKSUM}" ]; then - cat >&1 <<-EOM - You must specify --checksum when using --url. - EOM - exit 1 -fi -if [ "${LOCAL_SOURCE}" = "-" ]; then - LOCAL_SOURCE="${__object}/stdin" -fi - -# Create a user for the service if it is not root -USER_HOME_DIR="/root" -require_user_created="" -service_require="" -if [ "${USER}" != "root" ] && \ - [ ! -f "${__object}/parameter/do-not-manage-user" ]; then - if [ "${STATE}" = "absent" ]; then - # When removing, ensure user is not being used - user_require="${service_definition_require}" - fi - USER_HOME_DIR="$(cat "${__object}/parameter/user-home-dir")" - if [ "${USER_HOME_DIR}" != "/nonexistent" ]; then - USER_CREATE_HOME="--create-home" - fi - require="${require} ${user_require:-}" __user "${USER}" \ - --system \ - --state "${STATE}" \ - --home "${USER_HOME_DIR}" \ - --comment "cdist-managed service user" \ - ${USER_CREATE_HOME} - require_user_created="__user/${USER}" - # Track dependencies - service_require="${service_require} ${require_user_created}" -fi - -# Adapt directory permissions when necessary -WORKING_DIRECTORY_PERMISSIONS="$(cat "${__object}/parameter/working-directory-permissions")" -WORKING_DIRECTORY_PATH="$(cat "${__object}/parameter/working-directory" 2>/dev/null || true)" -if [ -n "${WORKING_DIRECTORY_PATH}" ]; then - WORKING_DIRECTORY_SYSTEMD="WorkingDirectory=${WORKING_DIRECTORY_PATH}" - WORKING_DIRECTORY_RUNIT="cd '${WORKING_DIRECTORY_PATH}'" - require="${require_user_created}" __directory \ - "${WORKING_DIRECTORY_PATH}" --state present \ - --mode "${WORKING_DIRECTORY_PERMISSIONS}" \ - --owner "${USER}" --group "${GROUP}" -fi - -# Place config file if necessary -CONFIG_FILE_DEST="$(cat "${__object}/parameter/config-file-destination" 2>/dev/null || true)" -if [ -z "${CONFIG_FILE_DEST}" ]; then - CONFIG_FILE_DEST="${ETC_DIR}/${SERVICE_NAME}.conf" -else - require="${require_user_created}" __directory \ - "$(dirname "${WORKING_DIRECTORY_PATH}")" --state present \ - --mode "${WORKING_DIRECTORY_PERMISSIONS}" \ - --owner "${USER}" --group "${GROUP}" -fi -CONFIG_FILE_SOURCE="$(cat "${__object}/parameter/config-file-source" 2>/dev/null || true)" -if [ "${CONFIG_FILE_SOURCE}" = "-" ]; then - CONFIG_FILE_SOURCE="${__object}/stdin" -fi -if [ -n "${CONFIG_FILE_SOURCE}" ] && [ "${STATE}" = "present" ]; then - require="${require} ${require_user_created}" __file \ - "${CONFIG_FILE_DEST}" \ - --owner "${USER}" \ - --group "${GROUP}" \ - --mode "0440" \ - --source "${CONFIG_FILE_SOURCE}" - service_require="${service_require} __file${CONFIG_FILE_DEST}" -fi - - - -# These messages will trigger a service restart (overridden for systemd) -service_config_reload_pattern="^__file${CONFIG_FILE_DEST}" - -# This should setup the object in $service_definition_require -# See above. -case "${INIT}" in - systemd) - if [ -z "${SERVICE_DEFINITION}" ]; then - SYSTEMD_ENV_FILE="/etc/systemd/system/${SERVICE_NAME}.env" - __file "${SYSTEMD_ENV_FILE}" \ - --mode 0400 \ - --source "${__object}/parameter/env" - # We need to take into account the envionment file for systemd too - service_config_reload_pattern="(${service_config_reload_pattern}|^__file${SYSTEMD_ENV_FILE})" - - SERVICE_DEFINITION="$(cat <&1 -exec chpst -u "${USER}:${GROUP}" ${SERVICE_EXEC} -EOF -)" - fi - __runit_service "${SERVICE_NAME}" \ - --state "${STATE}" \ - --log \ - --source - </dev/null || true)" - # Place packed file - if [ -n "${DOWNLOAD_URL}" ]; then - __download "${TMP_PATH}${UNPACK_EXTENSION}" \ - --url "${DOWNLOAD_URL}" \ - --download remote \ - --sum "${CHECKSUM}" - require_place_file="__download${TMP_PATH}${UNPACK_EXTENSION}" - else - # TODO: this doesn't use CHECKSUM - __file "${TMP_PATH}${UNPACK_EXTENSION}" \ - --source "${LOCAL_SOURCE}" - require_place_file="__file${TMP_PATH}${UNPACK_EXTENSION}" - fi - - # Unpack file and also perform service upgrade - # shellcheck disable=SC2086 - require="${require_place_file}" \ - __unpack "${TMP_PATH}${UNPACK_EXTENSION}" \ - ${UNPACK_ARGS} \ - --destination "${TMP_PATH}" - version_bump_require="__unpack${TMP_PATH}${UNPACK_EXTENSION}" - else - # Create temp directory - __directory "${TMP_PATH}" - # Place in temp directory with the specified binary name - if [ -n "${DOWNLOAD_URL}" ]; then - require="__directory${TMP_PATH}" __download \ - "${TMP_PATH}/${BINARY}" \ - --url "${DOWNLOAD_URL}" \ - --download remote \ - --sum "${CHECKSUM}" - version_bump_require="__download${TMP_PATH}/${BINARY}" - else - require="__directory${TMP_PATH}" __file \ - "${TMP_PATH}/${BINARY}" \ - --source "${LOCAL_SOURCE}" - version_bump_require="__file${TMP_PATH}/${BINARY}" - fi - fi - - # Perform update of cdist-managed version file - # And also perform service upgrade - # This is a bug if service_upgrade fails >,< - printf "%s" "${SHOULD_VERSION}" | \ - require="${version_bump_require}" __file \ - "${VERSION_FILE}" \ - --onchange "${perform_service_upgrade}" \ - --source "-" -else - # We only restart here if there was a config or env change - # but there was not a version change - require="${service_require}" __check_messages \ - "single_binary_service_${__object_id}" \ - --pattern "${service_config_reload_pattern}" \ - --execute "$(sv_cmd restart)" -fi diff --git a/type/__single_binary_service/parameter/boolean b/type/__single_binary_service/parameter/boolean deleted file mode 100644 index a779fd5..0000000 --- a/type/__single_binary_service/parameter/boolean +++ /dev/null @@ -1,2 +0,0 @@ -do-not-manage-user -unpack diff --git a/type/__single_binary_service/parameter/default/checksum b/type/__single_binary_service/parameter/default/checksum deleted file mode 100644 index e69de29..0000000 diff --git a/type/__single_binary_service/parameter/default/env b/type/__single_binary_service/parameter/default/env deleted file mode 100644 index e69de29..0000000 diff --git a/type/__single_binary_service/parameter/default/local-source b/type/__single_binary_service/parameter/default/local-source deleted file mode 100644 index e69de29..0000000 diff --git a/type/__single_binary_service/parameter/default/service-args b/type/__single_binary_service/parameter/default/service-args deleted file mode 100644 index e69de29..0000000 diff --git a/type/__single_binary_service/parameter/default/state b/type/__single_binary_service/parameter/default/state deleted file mode 100644 index e7f6134..0000000 --- a/type/__single_binary_service/parameter/default/state +++ /dev/null @@ -1 +0,0 @@ -present diff --git a/type/__single_binary_service/parameter/default/unpack-extension b/type/__single_binary_service/parameter/default/unpack-extension deleted file mode 100644 index c95e2e9..0000000 --- a/type/__single_binary_service/parameter/default/unpack-extension +++ /dev/null @@ -1 +0,0 @@ -.tar.gz \ No newline at end of file diff --git a/type/__single_binary_service/parameter/default/url b/type/__single_binary_service/parameter/default/url deleted file mode 100644 index e69de29..0000000 diff --git a/type/__single_binary_service/parameter/default/user b/type/__single_binary_service/parameter/default/user deleted file mode 100644 index d8649da..0000000 --- a/type/__single_binary_service/parameter/default/user +++ /dev/null @@ -1 +0,0 @@ -root diff --git a/type/__single_binary_service/parameter/default/user-home-dir b/type/__single_binary_service/parameter/default/user-home-dir deleted file mode 100644 index 4d21ca6..0000000 --- a/type/__single_binary_service/parameter/default/user-home-dir +++ /dev/null @@ -1 +0,0 @@ -/nonexistent diff --git a/type/__single_binary_service/parameter/default/working-directory-permissions b/type/__single_binary_service/parameter/default/working-directory-permissions deleted file mode 100644 index 4cd9d53..0000000 --- a/type/__single_binary_service/parameter/default/working-directory-permissions +++ /dev/null @@ -1 +0,0 @@ -0750 diff --git a/type/__single_binary_service/parameter/optional b/type/__single_binary_service/parameter/optional deleted file mode 100644 index aaed0ac..0000000 --- a/type/__single_binary_service/parameter/optional +++ /dev/null @@ -1,20 +0,0 @@ -checksum -config-file-source -config-file-destination -env -user -group -state -binary -local-source -service-args -service-exec -service-description -service-definition -unpack-extension -unpack-args -url -user-home-dir -version -working-directory -working-directory-permissions diff --git a/type/__single_binary_service/parameter/optional_multiple b/type/__single_binary_service/parameter/optional_multiple deleted file mode 100644 index e1ca562..0000000 --- a/type/__single_binary_service/parameter/optional_multiple +++ /dev/null @@ -1 +0,0 @@ -extra-binary diff --git a/type/__uacme_obtain/man.rst b/type/__uacme_obtain/man.rst index 16ebe87..f1db899 100644 --- a/type/__uacme_obtain/man.rst +++ b/type/__uacme_obtain/man.rst @@ -38,8 +38,7 @@ install-key-to Installation path of the certificate's private key. renew-hook - Renew hook executed on certificate renewal (e.g. `service nginx reload`, `-` - for the standard input). + Renew hook executed on certificate renewal (e.g. `service nginx reload`). force-cert-ownership-to Override default ownership for TLS certificate, passed as argument to chown. diff --git a/type/__uacme_obtain/manifest b/type/__uacme_obtain/manifest index a40119b..b41ddde 100644 --- a/type/__uacme_obtain/manifest +++ b/type/__uacme_obtain/manifest @@ -109,11 +109,7 @@ export CERT_TARGET RENEW_HOOK= if [ -f "${__object:?}/parameter/renew-hook" ]; then - if [ "$(cat "${__object:?}/parameter/renew-hook")" = "-" ]; then - RENEW_HOOK="$(cat ${__object:?}/stdin)" - else - RENEW_HOOK="$(cat "${__object:?}/parameter/renew-hook")" - fi + RENEW_HOOK="$(cat "${__object:?}/parameter/renew-hook")" fi export RENEW_HOOK