From 421fcb115f22668320c101efcc7f5915e85ee0f6 Mon Sep 17 00:00:00 2001
From: David Baker <dave@matrix.org>
Date: Wed, 1 Apr 2020 10:38:49 +0100
Subject: [PATCH] Give the jitsi wrapper its own external api script

---
 config.sample.json          | 3 +--
 docs/config.md              | 3 ---
 package.json                | 5 +++--
 src/vector/jitsi/index.html | 2 ++
 src/vector/jitsi/index.ts   | 9 ---------
 5 files changed, 6 insertions(+), 16 deletions(-)

diff --git a/config.sample.json b/config.sample.json
index b8dc2fbb..87fc63de 100644
--- a/config.sample.json
+++ b/config.sample.json
@@ -53,7 +53,6 @@
         "breadcrumbs": true
     },
     "jitsi": {
-        "preferredDomain": "jitsi.riot.im",
-        "externalApiUrl": "https://jitsi.riot.im/libs/external_api.min.js"
+        "preferredDomain": "jitsi.riot.im"
     }
 }
diff --git a/docs/config.md b/docs/config.md
index 40e71361..1471faf9 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -88,9 +88,6 @@ For a good example, see https://riot.im/develop/config.json.
     1. `preferredDomain`: The domain name of the preferred Jitsi instance. Defaults
        to `jitsi.riot.im`. This is used whenever a user clicks on the voice/video
        call buttons - integration managers may use a different domain.
-    1. `externalApiUrl`: The URL to the Jitsi Meet API script. This is required
-       for showing any Jitsi widgets, no matter the source. Defaults to
-       `https://jitsi.riot.im/libs/external_api.min.js`.
 
 Note that `index.html` also has an og:image meta tag that is set to an image
 hosted on riot.im. This is the image used if links to your copy of Riot
diff --git a/package.json b/package.json
index 50f6808e..81813fcf 100644
--- a/package.json
+++ b/package.json
@@ -38,8 +38,9 @@
     "clean": "rimraf lib webapp electron_app/dist",
     "build": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle",
     "build-stats": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle-stats",
+    "build:jitsi": "curl -s https://jitsi.riot.im/libs/external_api.min.js > ./webapp/jitsi_external_api.min.js",
     "build:res": "node scripts/copy-res.js",
-    "build:genfiles": "yarn reskindex && yarn build:res",
+    "build:genfiles": "yarn reskindex && yarn build:res && yarn build:jitsi",
     "build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
     "build:compile": "babel -d lib --verbose --extensions \".ts,.js,.tsx\" src",
     "build:bundle": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production",
@@ -52,7 +53,7 @@
     "install:electron": "electron-builder install-app-deps",
     "dist": "scripts/package.sh",
     "start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,riot-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"",
-    "start:res": "node scripts/copy-res.js -w",
+    "start:res": "yarn build:jitsi && node scripts/copy-res.js -w",
     "start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development",
     "electron": "yarn build && yarn install:electron && electron .",
     "lint": "yarn lint:types && yarn lint:ts && yarn lint:js && yarn lint:style",
diff --git a/src/vector/jitsi/index.html b/src/vector/jitsi/index.html
index 58184e0a..b9fc950e 100644
--- a/src/vector/jitsi/index.html
+++ b/src/vector/jitsi/index.html
@@ -15,5 +15,7 @@
         </div>
     </div>
 </div>
+<!-- This script is not webpacked, and the script is downloaded at build time -->
+<script src="./jitsi_external_api.min.js"></script>
 </body>
 </html>
diff --git a/src/vector/jitsi/index.ts b/src/vector/jitsi/index.ts
index 75b017a2..1108e70c 100644
--- a/src/vector/jitsi/index.ts
+++ b/src/vector/jitsi/index.ts
@@ -52,7 +52,6 @@ let widgetApi: WidgetApi;
         // Set this up as early as possible because Riot will be hitting it almost immediately.
         widgetApi = new WidgetApi(qsParam('parentUrl'), qsParam('widgetId'), [
             Capability.AlwaysOnScreen,
-            Capability.GetRiotWebConfig,
         ]);
         widgetApi.expectingExplicitReady = true;
 
@@ -66,14 +65,6 @@ let widgetApi: WidgetApi;
         await widgetApi.waitReady();
         await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen
 
-        const riotConfig = await widgetApi.getRiotConfig();
-
-        // Get the Jitsi Meet API loaded up as fast as possible, but ensure that the widget's postMessage
-        // receiver (WidgetApi) is up and running first.
-        const scriptTag = document.createElement("script");
-        scriptTag.src = riotConfig['jitsi']['externalApiUrl'];
-        document.body.appendChild(scriptTag);
-
         // TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795)
 
         document.getElementById("joinButton").onclick = () => joinConference();