From b6ed607013797b406dc719e70708ee789a7f62dd Mon Sep 17 00:00:00 2001 From: Thomas Chung Date: Sun, 7 May 2023 22:47:08 +1000 Subject: [PATCH 1/4] Run eslint on html files as well --- .eslintrc.js | 5 ++++- .github/workflows/janus-ci.yml | 2 +- package.json | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 5bdead42a8..9d5a0a4ac2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,4 @@ -// eslint-disable-next-line no-undef +/* global module */ module.exports = { "env": { "browser": true, @@ -8,6 +8,9 @@ module.exports = { "parserOptions": { "ecmaVersion": 2017 }, + "plugins": [ + "html" + ], "extends": "eslint:recommended", "rules": { "no-console": "off", diff --git a/.github/workflows/janus-ci.yml b/.github/workflows/janus-ci.yml index ea69ad50b2..a7ea9ffab8 100644 --- a/.github/workflows/janus-ci.yml +++ b/.github/workflows/janus-ci.yml @@ -161,7 +161,7 @@ jobs: - name: Install modules run: npm install - name: Run ESLint - run: node_modules/.bin/eslint html + run: npm run lint javascript-rollup: runs-on: ubuntu-22.04 steps: diff --git a/package.json b/package.json index 179911ee5e..0448dfe13f 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,10 @@ "webrtc-adapter": "8.2.2" }, "devDependencies": { - "eslint": "8.35.0" + "eslint": "8.39.0", + "eslint-plugin-html": "7.1.0" + }, + "scripts": { + "lint": "eslint html --ext .js,.html" } } From d4013d74dafc20e0c789785af526a259854806b4 Mon Sep 17 00:00:00 2001 From: Thomas Chung Date: Sun, 7 May 2023 22:47:33 +1000 Subject: [PATCH 2/4] Use Maps in janus.js --- html/janus.js | 108 +++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/html/janus.js b/html/janus.js index 53d8c26251..055d5cb21c 100644 --- a/html/janus.js +++ b/html/janus.js @@ -647,10 +647,10 @@ function Janus(gatewayCallbacks) { let connected = false; let sessionId = null; - let pluginHandles = {}; + let pluginHandles = new Map(); let that = this; let retries = 0; - let transactions = {}; + let transactions = new Map(); createSession(gatewayCallbacks); // Public methods @@ -724,10 +724,10 @@ function Janus(gatewayCallbacks) { Janus.debug(json); const transaction = json["transaction"]; if(transaction) { - const reportSuccess = transactions[transaction]; + const reportSuccess = transactions.get(transaction); if(reportSuccess) reportSuccess(json); - delete transactions[transaction]; + transactions.delete(transaction); } return; } else if(json["janus"] === "ack") { @@ -736,10 +736,10 @@ function Janus(gatewayCallbacks) { Janus.debug(json); const transaction = json["transaction"]; if(transaction) { - const reportSuccess = transactions[transaction]; + const reportSuccess = transactions.get(transaction); if(reportSuccess) reportSuccess(json); - delete transactions[transaction]; + transactions.delete(transaction); } return; } else if(json["janus"] === "success") { @@ -748,10 +748,10 @@ function Janus(gatewayCallbacks) { Janus.debug(json); const transaction = json["transaction"]; if(transaction) { - const reportSuccess = transactions[transaction]; + const reportSuccess = transactions.get(transaction); if(reportSuccess) reportSuccess(json); - delete transactions[transaction]; + transactions.delete(transaction); } return; } else if(json["janus"] === "trickle") { @@ -761,7 +761,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.debug("This handle is not attached to this session"); return; @@ -797,7 +797,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.debug("This handle is not attached to this session"); return; @@ -813,7 +813,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.debug("This handle is not attached to this session"); return; @@ -829,7 +829,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { // Don't warn here because destroyHandle causes this situation. return; @@ -845,7 +845,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.debug("This handle is not attached to this session"); return; @@ -860,7 +860,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Missing sender..."); return; } - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.debug("This handle is not attached to this session"); return; @@ -872,11 +872,11 @@ function Janus(gatewayCallbacks) { Janus.debug(json); let transaction = json["transaction"]; if(transaction) { - let reportSuccess = transactions[transaction]; + let reportSuccess = transactions.get(transaction); if(reportSuccess) { reportSuccess(json); } - delete transactions[transaction]; + transactions.delete(transaction); } return; } else if(json["janus"] === "event") { @@ -895,7 +895,7 @@ function Janus(gatewayCallbacks) { Janus.debug(" -- Event is coming from " + sender + " (" + plugindata["plugin"] + ")"); let data = plugindata["data"]; Janus.debug(data); - const pluginHandle = pluginHandles[sender]; + const pluginHandle = pluginHandles.get(sender); if(!pluginHandle) { Janus.warn("This handle is not attached to this session"); return; @@ -999,7 +999,7 @@ function Janus(gatewayCallbacks) { 'open': function() { // We need to be notified about the success - transactions[transaction] = function(json) { + transactions.set(transaction, function(json) { Janus.debug(json); if(json["janus"] !== "success") { Janus.error("Ooops: " + json["error"].code + " " + json["error"].reason); // FIXME @@ -1016,7 +1016,7 @@ function Janus(gatewayCallbacks) { } Janus.sessions[sessionId] = that; callbacks.success(); - }; + }); ws.send(JSON.stringify(request)); }, @@ -1106,14 +1106,14 @@ function Janus(gatewayCallbacks) { if(apisecret) request["apisecret"] = apisecret; if(websockets) { - transactions[transaction] = function(json) { + transactions.set(transaction, function(json) { Janus.log("Server info:"); Janus.debug(json); if(json["janus"] !== "server_info") { Janus.error("Ooops: " + json["error"].code + " " + json["error"].reason); // FIXME } callbacks.success(json); - } + }); ws.send(JSON.stringify(request)); return; } @@ -1159,7 +1159,7 @@ function Janus(gatewayCallbacks) { return; } if(cleanupHandles) { - for(let handleId in pluginHandles) + for(const handleId of pluginHandles.keys()) destroyHandle(handleId, { noRequest: true }); } if(!connected) { @@ -1301,7 +1301,7 @@ function Janus(gatewayCallbacks) { if(apisecret) request["apisecret"] = apisecret; if(websockets) { - transactions[transaction] = function(json) { + transactions.set(transaction, function(json) { Janus.debug(json); if(json["janus"] !== "success") { Janus.error("Ooops: " + json["error"].code + " " + json["error"].reason); // FIXME @@ -1368,9 +1368,9 @@ function Janus(gatewayCallbacks) { hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true); }, detach : function(callbacks) { destroyHandle(handleId, callbacks); } }; - pluginHandles[handleId] = pluginHandle; + pluginHandles.set(handleId, pluginHandle); callbacks.success(pluginHandle); - }; + }); request["session_id"] = sessionId; ws.send(JSON.stringify(request)); return; @@ -1446,7 +1446,7 @@ function Janus(gatewayCallbacks) { hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true); }, detach : function(callbacks) { destroyHandle(handleId, callbacks); } } - pluginHandles[handleId] = pluginHandle; + pluginHandles.set(handleId, pluginHandle); callbacks.success(pluginHandle); }, error: function(textStatus, errorThrown) { @@ -1469,7 +1469,7 @@ function Janus(gatewayCallbacks) { callbacks.error("Is the server down? (connected=false)"); return; } - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); callbacks.error("Invalid handle"); @@ -1527,7 +1527,7 @@ function Janus(gatewayCallbacks) { if(websockets) { request["session_id"] = sessionId; request["handle_id"] = handleId; - transactions[transaction] = function(json) { + transactions.set(transaction, function(json) { Janus.debug("Message sent!"); Janus.debug(json); if(json["janus"] === "success") { @@ -1556,7 +1556,7 @@ function Janus(gatewayCallbacks) { } // If we got here, the plugin decided to handle the request asynchronously callbacks.success(); - }; + }); ws.send(JSON.stringify(request)); return; } @@ -1607,7 +1607,7 @@ function Janus(gatewayCallbacks) { Janus.warn("Is the server down? (connected=false)"); return; } - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); return; @@ -1645,7 +1645,7 @@ function Janus(gatewayCallbacks) { // Private method to create a data channel function createDataChannel(handleId, dclabel, dcprotocol, incoming, pendingData) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); return; @@ -1709,7 +1709,7 @@ function Janus(gatewayCallbacks) { callbacks = callbacks || {}; callbacks.success = (typeof callbacks.success == "function") ? callbacks.success : Janus.noop; callbacks.error = (typeof callbacks.error == "function") ? callbacks.error : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); callbacks.error("Invalid handle"); @@ -1745,7 +1745,7 @@ function Janus(gatewayCallbacks) { callbacks = callbacks || {}; callbacks.success = (typeof callbacks.success == "function") ? callbacks.success : Janus.noop; callbacks.error = (typeof callbacks.error == "function") ? callbacks.error : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); callbacks.error("Invalid handle"); @@ -1803,17 +1803,17 @@ function Janus(gatewayCallbacks) { let noRequest = (callbacks.noRequest === true); Janus.log("Destroying handle " + handleId + " (only-locally=" + noRequest + ")"); cleanupWebrtc(handleId); - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || pluginHandle.detached) { // Plugin was already detached by Janus, calling detach again will return a handle not found error, so just exit here - delete pluginHandles[handleId]; + pluginHandles.delete(handleId); callbacks.success(); return; } pluginHandle.detached = true; if(noRequest) { // We're only removing the handle locally - delete pluginHandles[handleId]; + pluginHandles.delete(handleId); callbacks.success(); return; } @@ -1831,7 +1831,7 @@ function Janus(gatewayCallbacks) { request["session_id"] = sessionId; request["handle_id"] = handleId; ws.send(JSON.stringify(request)); - delete pluginHandles[handleId]; + pluginHandles.delete(handleId); callbacks.success(); return; } @@ -1845,13 +1845,13 @@ function Janus(gatewayCallbacks) { if(json["janus"] !== "success") { Janus.error("Ooops: " + json["error"].code + " " + json["error"].reason); // FIXME } - delete pluginHandles[handleId]; + pluginHandles.delete(handleId); callbacks.success(); }, error: function(textStatus, errorThrown) { Janus.error(textStatus + ":", errorThrown); // FIXME // We cleanup anyway - delete pluginHandles[handleId]; + pluginHandles.delete(handleId); callbacks.success(); } }); @@ -1860,7 +1860,7 @@ function Janus(gatewayCallbacks) { // WebRTC stuff // Helper function to create a new PeerConnection, if we need one function createPeerconnectionIfNeeded(handleId, callbacks) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); throw "Invalid handle"; @@ -2046,7 +2046,7 @@ function Janus(gatewayCallbacks) { return; } // Get the plugin handle - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); callbacks.error("Invalid handle"); @@ -2102,7 +2102,7 @@ function Janus(gatewayCallbacks) { callbacks.error = (typeof callbacks.error == "function") ? callbacks.error : webrtcError; callbacks.customizeSdp = (typeof callbacks.customizeSdp == "function") ? callbacks.customizeSdp : Janus.noop; let jsep = callbacks.jsep; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); callbacks.error("Invalid handle"); @@ -2146,7 +2146,7 @@ function Janus(gatewayCallbacks) { async function createOffer(handleId, callbacks) { callbacks = callbacks || {}; callbacks.customizeSdp = (typeof callbacks.customizeSdp == "function") ? callbacks.customizeSdp : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); throw "Invalid handle"; @@ -2191,7 +2191,7 @@ function Janus(gatewayCallbacks) { async function createAnswer(handleId, callbacks) { callbacks = callbacks || {}; callbacks.customizeSdp = (typeof callbacks.customizeSdp == "function") ? callbacks.customizeSdp : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); throw "Invalid handle"; @@ -2229,7 +2229,7 @@ function Janus(gatewayCallbacks) { callbacks = callbacks || {}; callbacks.success = (typeof callbacks.success == "function") ? callbacks.success : Janus.noop; callbacks.error = (typeof callbacks.error == "function") ? callbacks.error : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle, not sending anything"); return; @@ -2276,7 +2276,7 @@ function Janus(gatewayCallbacks) { } async function captureDevices(handleId, callbacks) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn('Invalid handle, not sending anything'); throw 'Invalid handle'; @@ -2744,7 +2744,7 @@ function Janus(gatewayCallbacks) { } function getLocalTracks(handleId) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn('Invalid handle'); return null; @@ -2771,7 +2771,7 @@ function Janus(gatewayCallbacks) { } function getRemoteTracks(handleId) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn('Invalid handle'); return null; @@ -2799,7 +2799,7 @@ function Janus(gatewayCallbacks) { function getVolume(handleId, mid, remote, result) { result = (typeof result == "function") ? result : Janus.noop; - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); result(0); @@ -2855,7 +2855,7 @@ function Janus(gatewayCallbacks) { } function isMuted(handleId, mid, video) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); return true; @@ -2915,7 +2915,7 @@ function Janus(gatewayCallbacks) { } function mute(handleId, mid, video, mute) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); return false; @@ -2980,7 +2980,7 @@ function Janus(gatewayCallbacks) { } function getBitrate(handleId, mid) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn("Invalid handle"); return "Invalid handle"; @@ -3069,7 +3069,7 @@ function Janus(gatewayCallbacks) { } function setBitrate(handleId, mid, bitrate) { - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle || !pluginHandle.webrtcStuff) { Janus.warn('Invalid handle'); return; @@ -3107,7 +3107,7 @@ function Janus(gatewayCallbacks) { function cleanupWebrtc(handleId, hangupRequest) { Janus.log("Cleaning WebRTC stuff"); - let pluginHandle = pluginHandles[handleId]; + let pluginHandle = pluginHandles.get(handleId); if(!pluginHandle) { // Nothing to clean return; From 0e043d2b5062feef734a1e648d4db256ed0a5e54 Mon Sep 17 00:00:00 2001 From: Thomas Chung Date: Sun, 7 May 2023 22:47:35 +1000 Subject: [PATCH 3/4] Fix always false conditional --- html/janus.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/html/janus.js b/html/janus.js index 055d5cb21c..32245fcacb 100644 --- a/html/janus.js +++ b/html/janus.js @@ -2339,9 +2339,9 @@ function Janus(gatewayCallbacks) { }; continue; } - if((typeof track.add === 'undefined' && track.add === null) && - (typeof track.remove === 'undefined' && track.remove === null) && - (typeof track.replace === 'undefined' && track.replace === null)) { + if((typeof track.add === 'undefined' || track.add === null) && + (typeof track.remove === 'undefined' || track.remove === null) && + (typeof track.replace === 'undefined' || track.replace === null)) { // Let's default to 'add' track.add = true; } From 3d8f1fd53c8feab8e72b0acd4505bff7f2b35079 Mon Sep 17 00:00:00 2001 From: Thomas Chung Date: Sun, 7 May 2023 22:47:38 +1000 Subject: [PATCH 4/4] Use Maps for Janus.sessions in janus.js --- html/janus.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/html/janus.js b/html/janus.js index 32245fcacb..344ae52686 100644 --- a/html/janus.js +++ b/html/janus.js @@ -25,7 +25,7 @@ */ // List of sessions -Janus.sessions = {}; +Janus.sessions = new Map(); Janus.isExtensionEnabled = function() { if(navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) { @@ -478,10 +478,10 @@ Janus.init = function(options) { let oldOBF = window["on" + eventName]; window.addEventListener(eventName, function() { Janus.log("Closing window"); - for(let s in Janus.sessions) { - if(Janus.sessions[s] && Janus.sessions[s].destroyOnUnload) { - Janus.log("Destroying session " + s); - Janus.sessions[s].destroy({unload: true, notifyDestroyed: false}); + for(const [sessionId, session] of Janus.sessions) { + if(session && session.destroyOnUnload) { + Janus.log("Destroying session " + sessionId); + session.destroy({unload: true, notifyDestroyed: false}); } } if(oldOBF && typeof oldOBF == "function") { @@ -1014,7 +1014,7 @@ function Janus(gatewayCallbacks) { } else { Janus.log("Created session: " + sessionId); } - Janus.sessions[sessionId] = that; + Janus.sessions.set(sessionId, that); callbacks.success(); }); ws.send(JSON.stringify(request)); @@ -1058,7 +1058,7 @@ function Janus(gatewayCallbacks) { } else { Janus.log("Created session: " + sessionId); } - Janus.sessions[sessionId] = that; + Janus.sessions.set(sessionId, that); eventHandler(); callbacks.success(); },