Unable to enable Excalidraw whiteboard feature: Grey page when adding "room_metadata" to plugins

Hey everyone, I am trying to enable Excalidraw, but I have a grey screen when creating a room with the following kind of JS console errors:

[JitsiMeetJS.ts] <getGlobalOnErrorHandler>:  UnhandledError: TypeError: e is null Script: https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943 Line: 44 Column: 232592 StackTrace:  isVisible@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:44:232592
updateLargeVideoAudioLevel@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:44:232699
updateLargeVideoAudioLevel@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:575530
setAudioLevel@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:578236
9196/Bue.setAudioLevel@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:687696
9196/_setupListeners/<@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:669212
6857/r.prototype.emit@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:82372
5369/Zu.prototype._fireAudioLevelChangeEvent@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:764941
6857/r.prototype.emit@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:82372
setAudioLevel@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:595983
5369/li.prototype.start/this.intervalId<@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:326284
setInterval handler*5369/li.prototype.start@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:325909
5369/Pi.startLocalStats@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:338469
5369/createLocalTracks/<@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:817921
promise callback*createLocalTracks@https://[MYDOMAIN]/libs/lib-jitsi-meet.min.js?v=6943:2:817693
9196/IA/<@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:2:400035
promise callback*IA@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:2:399968
createInitialLocalTracks@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:654757
createInitialLocalTracksAndConnect@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:655775
init@https://[MYDOMAIN]/libs/app.bundle.min.js?v=6943:178:658082

I am on NixOS 23.05.

This is my Prosody config:

pidfile = "/run/prosody/prosody.pid"

log = "*syslog"

data_path = "/var/lib/prosody"
plugin_paths = {
  "/nix/store/zz476jc9ij9f8xx4vdq4ckw5y5nwlhzs-jitsi-meet-prosody-1.0.6943/share/prosody-plugins"
}



admins = {  }

-- we already build with libevent, so we can just enable it for a more performant server
use_libevent = true

modules_enabled = {

  
  
  
  "blocklist";
  "bookmarks";
  "bosh";
  "carbons";
  "cloud_notify";
  "csi";
  "dialback";
  "disco";
  
  "http_files";
  
  
  "mam";
  
  "pep";
  "ping";
  "private";
  "proxy65";
  "register";
  "roster";
  "saslauth";
  
  "smacks";
  "time";
  "tls";
  "uptime";
  
  "vcard_legacy";
  "version";
  
  "websocket";
  
  
  "pubsub";
"smacks";
"speakerstats";
"external_services";
"conference_duration";
"end_conference";
"muc_lobby_rooms";
"muc_breakout_rooms";
"av_moderation";
"room_metadata";
"muc_hide_all";
"muc_meeting_id";
"muc_domain_mapper";
"muc_rate_limit";
"limits_exception";
"persistent_lobby";
};

disco_items = {
{ "lobby.[MYDOMAIN]", "lobby.[MYDOMAIN] MUC endpoint"};
{ "internal.auth.[MYDOMAIN]", "internal.auth.[MYDOMAIN] MUC endpoint"};
{ "breakout.[MYDOMAIN]", "breakout.[MYDOMAIN] MUC endpoint"};
{ "conference.[MYDOMAIN]", "conference.[MYDOMAIN] MUC endpoint"};
};

allow_registration = false

c2s_require_encryption = true

s2s_require_encryption = true

s2s_secure_auth = false

s2s_insecure_domains = {  }

s2s_secure_domains = {  }

authentication = "internal_hashed"

http_interfaces = { "*", "::" }

https_interfaces = { "*", "::" }

http_ports = { 5280 }

https_ports = { 5281 }

cross_domain_websocket = true;
consider_websocket_secure = true;

unlimited_jids = {
  "focus@auth.[MYDOMAIN]",
  "jvb@auth.[MYDOMAIN]"
}

Component "focus.[MYDOMAIN]" "client_proxy"
  target_address = "focus@auth.[MYDOMAIN]"

Component "speakerstats.[MYDOMAIN]" "speakerstats_component"
  muc_component = "conference.[MYDOMAIN]"

Component "conferenceduration.[MYDOMAIN]" "conference_duration_component"
  muc_component = "conference.[MYDOMAIN]"

Component "endconference.[MYDOMAIN]" "end_conference"
  muc_component = "conference.[MYDOMAIN]"

Component "avmoderation.[MYDOMAIN]" "av_moderation_component"
  muc_component = "conference.[MYDOMAIN]"

Component "metadata.[MYDOMAIN]" "room_metadata_component"
  muc_component = "conference.[MYDOMAIN]"
  breakout_rooms_component = "breakout.[MYDOMAIN]"


Component "conference.[MYDOMAIN]" "muc"
    modules_enabled = { "muc_mam"; "vcard_muc"; }
    name = "Jitsi Meet MUC"
    restrict_room_creation = false
    max_history_messages = 20
    muc_room_locking = false
    muc_room_lock_timeout = 300
    muc_tombstones = true
    muc_tombstone_expiry = 2678400
    muc_room_default_public = true
    muc_room_default_members_only = false
    muc_room_default_moderated = false
    muc_room_default_public_jids = true
    muc_room_default_change_subject = false
    muc_room_default_history_length = 20
    muc_room_default_language = "en"
    restrict_room_creation = true
storage = "memory"
admins = { "focus@auth.[MYDOMAIN]" }

Component "breakout.[MYDOMAIN]" "muc"
    modules_enabled = { "muc_mam"; "vcard_muc"; }
    name = "Jitsi Meet Breakout MUC"
    restrict_room_creation = false
    max_history_messages = 20
    muc_room_locking = false
    muc_room_lock_timeout = 300
    muc_tombstones = true
    muc_tombstone_expiry = 2678400
    muc_room_default_public = true
    muc_room_default_members_only = false
    muc_room_default_moderated = false
    muc_room_default_public_jids = true
    muc_room_default_change_subject = false
    muc_room_default_history_length = 20
    muc_room_default_language = "en"
    restrict_room_creation = true
storage = "memory"
admins = { "focus@auth.[MYDOMAIN]" }

Component "internal.auth.[MYDOMAIN]" "muc"
    modules_enabled = { "muc_mam"; "vcard_muc"; }
    name = "Jitsi Meet Videobridge MUC"
    restrict_room_creation = false
    max_history_messages = 20
    muc_room_locking = false
    muc_room_lock_timeout = 300
    muc_tombstones = true
    muc_tombstone_expiry = 2678400
    muc_room_default_public = true
    muc_room_default_members_only = false
    muc_room_default_moderated = false
    muc_room_default_public_jids = true
    muc_room_default_change_subject = false
    muc_room_default_history_length = 20
    muc_room_default_language = "en"
    storage = "memory"
admins = { "focus@auth.[MYDOMAIN]", "jvb@auth.[MYDOMAIN]" }

Component "lobby.[MYDOMAIN]" "muc"
    modules_enabled = { "muc_mam"; "vcard_muc"; }
    name = "Jitsi Meet Lobby MUC"
    restrict_room_creation = false
    max_history_messages = 20
    muc_room_locking = false
    muc_room_lock_timeout = 300
    muc_tombstones = true
    muc_tombstone_expiry = 2678400
    muc_room_default_public = true
    muc_room_default_members_only = false
    muc_room_default_moderated = false
    muc_room_default_public_jids = true
    muc_room_default_change_subject = false
    muc_room_default_history_length = 20
    muc_room_default_language = "en"
    restrict_room_creation = true
storage = "memory"





VirtualHost "auth.[MYDOMAIN]"
  enabled = true;
  ssl = {
  cafile = "/etc/ssl/certs/ca-bundle.crt";
  key = "/var/lib/jitsi-meet/jitsi-meet.key";
  certificate = "/var/lib/jitsi-meet/jitsi-meet.crt";
  
};

  authentication = "internal_hashed"


VirtualHost "guest.[MYDOMAIN]"
  enabled = true;
  
  authentication = "anonymous"
c2s_require_encryption = false


VirtualHost "[MYDOMAIN]"
  enabled = true;
  ssl = {
  cafile = "/etc/ssl/certs/ca-bundle.crt";
  key = "/var/lib/jitsi-meet/jitsi-meet.key";
  certificate = "/var/lib/jitsi-meet/jitsi-meet.crt";
  
};

  authentication = "jitsi-anonymous"
c2s_require_encryption = false
admins = { "focus@auth.[MYDOMAIN]" }
smacks_max_unacked_stanzas = 5
smacks_hibernation_time = 60
smacks_max_hibernated_sessions = 1
smacks_max_old_sessions = 1

av_moderation_component = "avmoderation.[MYDOMAIN]"
speakerstats_component = "speakerstats.[MYDOMAIN]"
conference_duration_component = "conferenceduration.[MYDOMAIN]"
end_conference_component = "endconference.[MYDOMAIN]"


c2s_require_encryption = false
lobby_muc = "lobby.[MYDOMAIN]"
breakout_rooms_muc = "breakout.[MYDOMAIN]"
room_metadata_component = "metadata.[MYDOMAIN]"
main_muc = "conference.[MYDOMAIN]"

authentication = "internal_hashed"


VirtualHost "recorder.[MYDOMAIN]"
  enabled = true;
  
  authentication = "internal_plain"
c2s_require_encryption = false

And this is my Jitsi-Meet config.js:

var config = 
{
  "hosts": {
    "domain": "[MYDOMAIN]",
    "muc": "conference.[MYDOMAIN]",
    "anonymousdomain": "guest.[MYDOMAIN]",
    "focus": "focus.[MYDOMAIN]"
  },
  "bosh": "//[MYDOMAIN]/http-bind",
  "testing": {},
  "enableNoAudioDetection": true,
  "enableNoisyMicDetection": true,
  "channelLastN": -1,
  "p2p": {
    "enabled": true,
    "stunServers": [
      {
        "urls": "stun:meet-jit-si-turnrelay.jitsi.net:443"
      }
    ]
  },
  "analytics": {},
  "mouseMoveCallbackInterval": 1000,
  "flags": {
    "sourceNameSignaling": true,
    "sendMultipleVideoStreams": true,
    "receiveMultipleVideoStreams": true
  },
  "fileRecordingsEnabled": true,
  "hiddenDomain": "recorder.[MYDOMAIN]",
  "liveStreamingEnabled": true,
  "toolbarButtons": [
    "camera",
    "chat",
    "closedcaptions",
    "desktop",
    "dock-iframe",
    "download",
    "embedmeeting",
    "etherpad",
    "feedback",
    "filmstrip",
    "fullscreen",
    "hangup",
    "help",
    "highlight",
    "invite",
    "linktosalesforce",
    "livestreaming",
    "microphone",
    "noisesuppression",
    "participants-pane",
    "profile",
    "raisehand",
    "recording",
    "security",
    "select-background",
    "settings",
    "shareaudio",
    "sharedvideo",
    "shortcuts",
    "stats",
    "tileview",
    "toggle-camera",
    "undock-iframe",
    "videoquality",
    "whiteboard"
  ],
  "websocket": "wss://[MYDOMAIN]/xmpp-websocket",
  "whiteboard": {
    "collabServerBaseUrl": "[MYDOMAIN]",
    "enabled": true
  }
}
;

I don’t know if I need to configure something in JVB or Jicofo for it to work.
When removing “room_metadata”, and with everything else identical, I can enter the room as moderator, but then I don’t have the whiteboard button.

Thank you in advance for your help!

Hey there,

It would be good to see where the error is produced in our code. Are you able to check in the developer console? Your installation should have source maps.

Hi, thank you for your answer, would this be what you are looking for?

Uncaught TypeError: e is null
    isVisible UIUtil.js:67
    updateLargeVideoAudioLevel AudioLevels.js:17
    updateLargeVideoAudioLevel LargeVideoManager.js:521
    setAudioLevel VideoLayout.js:65
    setAudioLevel UI.js:349
    _setupListeners conference.js:1856
    emit events.js:158
    _fireAudioLevelChangeEvent JitsiConference.js:1181
    emit events.js:158
    setAudioLevel JitsiTrack.js:444
    intervalId LocalStatsCollector.js:118
    setInterval handler*5369/li.prototype.start LocalStatsCollector.js:106
    startLocalStats statistics.js:286
    createLocalTracks JitsiMeetJS.ts:312
    promise callback*createLocalTracks JitsiMeetJS.ts:297
    IA functions.web.ts:50
    promise callback*IA functions.web.ts:46
    createInitialLocalTracks conference.js:565
    createInitialLocalTracksAndConnect conference.js:702
    init conference.js:855
    _start actions.web.ts:16
    promise callback*9196/_start/< actions.web.ts:95
    spe Redux
    9196 middleware.js:30
    9196 middleware.ts:19
    9196 middleware.ts:14
    9196 middleware.web.ts:23
    9196 middleware.any.ts:34
    9196 middleware.ts:60
    9196 middleware.ts:48
    9196 middleware.ts:55
    9196 middleware.ts:162
    9196 middleware.ts:52
    s middleware.ts:55
    9196 middleware.ts:7
    9196 middleware.ts:226
    9196 middleware.ts:28
    9196 middleware.ts:155
    9196 middleware.ts:44
    9196 middleware.ts:22
    9196 middleware.ts:50
    9196 middleware.ts:47
    o middleware.web.ts:44
    9196 middleware.web.ts:7
    9196 middleware.web.ts:44
    9196 middleware.web.ts:19
    9196 middleware.any.ts:53
    9196 middleware.ts:62
    9196 middleware.web.ts:260

These files seem to be from the source code.

Also it seems there’s no server-side error in Nginx, Jicofo, JVB and Prosody.

I don’t think this error is causing the problem, though you should be able to avoid it temporarily by setting disableAudioDlevels to true in config.js

Do you get any other errors?

1 Like

Thank you sooo much! Setting disableAudioDlevels allowed me to get other errors: the problem was simply that I had set:
"collabServerBaseUrl": "[MYDOMAIN]"
instead of
"collabServerBaseUrl": "https://[MYDOMAIN]"

Now I can remove disableAudioDlevels and I don’t have errors anymore.

Also, I saw an error in Prosody logs:

endconference.[MYDOMAIN]:end_conference: No room found found for /challenginggrinsindicateobnoxiously

when I click on “End meeting for all” which does not work. Am I missing something in my config? Or maybe a DNS/Nginx record?

Good to hear it now works for you!

Do you have the end conference Prosody plugin enabled?

Thank you for your answer! I think it is, since I have "end_conference"; in my Prosody config? (see original post)

Did you configure it as indicated at the top of this file? jitsi-meet/mod_end_conference.lua at master · jitsi/jitsi-meet · GitHub

Yes. To be sure though could you check my config in my first post? Thank you!

Oh, I had missed it’s the full config. It does look correct.

Any chance you are using your setup from a subdirectory? Not sure we support those very well here.

You mean like www.example.com/subdirectory? In that case no, I’m not using subdirectories. But do I need some Nginx/DNS config for endconference? The domain endconference.[MYDOMAIN] does not point to my IP.

So you are using a dedicated domain then, good.

That’s not necessary, that’s a Prosody virtual host.

I’m a bit out of ideas here. @damencho any ideas?

A possible stab in the dark, but I don’t see muc_mapper_domain_base set in your config.

I’m wondering it that might impact the room lookup since that config sets the value for the muc_domain when lookup up room by name.

1 Like

Great! Works wonders now. Thank you to everyone.

Good call @shawn ! :hear_no_evil: