|
179 | 179 | })(window); |
180 | 180 |
|
181 | 181 | var urlParams = new URLSearchParams(window.location.search); |
| 182 | +var SERVER_EXCLUSIVE_TRANSPORT_VERSION = "3.52.0"; |
| 183 | +// Transport migration guard: only pages with full server parity may skip the legacy bridge. |
| 184 | +var TRANSPORT_CAPABILITIES = { |
| 185 | + serverFeed: true, |
| 186 | + serverTargeted: false, |
| 187 | + upstreamCommands: false, |
| 188 | + customChannel: false, |
| 189 | + legacyBridgeRequired: false, |
| 190 | + exclusiveServerParams: { server: true, server2: true, server3: false } |
| 191 | +}; |
| 192 | +function versionAtLeast(value, minimum) { |
| 193 | + var a = String(value || "").split("."); |
| 194 | + var b = String(minimum || "").split("."); |
| 195 | + var len = Math.max(a.length, b.length); |
| 196 | + for (var i = 0; i < len; i++) { |
| 197 | + var av = parseInt(a[i], 10) || 0; |
| 198 | + var bv = parseInt(b[i], 10) || 0; |
| 199 | + if (av > bv) return true; |
| 200 | + if (av < bv) return false; |
| 201 | + } |
| 202 | + return true; |
| 203 | +} |
| 204 | +// Only feed-carrying server params listed by this page may disable the bridge; server3 alone is command-only. |
| 205 | +function hasExclusiveServerTransport(caps) { |
| 206 | + var params = caps && typeof caps.exclusiveServerParams === "object" ? caps.exclusiveServerParams : { server2: true }; |
| 207 | + return (params.server === true && urlParams.has("server")) || |
| 208 | + (params.server2 !== false && urlParams.has("server2")) || |
| 209 | + (params.server3 === true && urlParams.has("server2") && urlParams.has("server3")); |
| 210 | +} |
| 211 | +function useServerOnlyTransport() { |
| 212 | + var caps = (typeof TRANSPORT_CAPABILITIES === "object" && TRANSPORT_CAPABILITIES) ? TRANSPORT_CAPABILITIES : {}; |
| 213 | + return hasExclusiveServerTransport(caps) && |
| 214 | + versionAtLeast(urlParams.get("v"), SERVER_EXCLUSIVE_TRANSPORT_VERSION) && |
| 215 | + caps.serverFeed === true && |
| 216 | + caps.legacyBridgeRequired !== true && |
| 217 | + caps.upstreamCommands !== true && |
| 218 | + caps.customChannel !== true; |
| 219 | +} |
182 | 220 |
|
183 | 221 | try { |
184 | 222 | if ((window.ninjafy || window.electronApi)){ // fix for electron dragging. |
|
429 | 467 | } |
430 | 468 | } |
431 | 469 |
|
432 | | -var iframe = document.createElement("iframe"); // we can leave it called "dock", as it will get all the same messages the dock gets. This could be optimized of course.. |
433 | | -iframe.src = "https://vdo.socialstream.ninja/?ln&salt=vdo.ninja¬mobile¬mobile&password="+encodeURIComponent(password)+lanonly+"&solo&view="+roomID+"&novideo&noaudio&label=dock&cleanoutput&room="+roomID; // view only connection (data two way of course) |
434 | | -iframe.style.width = "0px"; |
435 | | -iframe.style.height = "0px"; |
436 | | -iframe.style.position = "fixed"; |
437 | | -iframe.style.left = "-100px"; |
438 | | -iframe.style.top = "-100px"; |
439 | | -iframe.id = "frame1" |
440 | | -document.body.appendChild(iframe); |
441 | | - |
442 | | -var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; |
443 | | -var eventer = window[eventMethod]; |
444 | | -var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message"; |
445 | | - |
446 | | -eventer(messageEvent, function (e) { |
447 | | - if (e.source != iframe.contentWindow){return} // reject messages send from other iframes |
448 | | - if (e.data && typeof e.data === "object" && e.data.dataReceived && typeof e.data.dataReceived === "object"){ // raw data |
449 | | - if ("overlayNinja" in e.data.dataReceived){ |
450 | | - processInput(e.data.dataReceived.overlayNinja); |
| 470 | +var iframe = null; |
| 471 | +if (!useServerOnlyTransport()) { |
| 472 | + iframe = document.createElement("iframe"); // we can leave it called "dock", as it will get all the same messages the dock gets. This could be optimized of course.. |
| 473 | + iframe.src = "https://vdo.socialstream.ninja/?ln&salt=vdo.ninja¬mobile¬mobile&password="+encodeURIComponent(password)+lanonly+"&solo&view="+roomID+"&novideo&noaudio&label=dock&cleanoutput&room="+roomID; // view only connection (data two way of course) |
| 474 | + iframe.style.width = "0px"; |
| 475 | + iframe.style.height = "0px"; |
| 476 | + iframe.style.position = "fixed"; |
| 477 | + iframe.style.left = "-100px"; |
| 478 | + iframe.style.top = "-100px"; |
| 479 | + iframe.id = "frame1" |
| 480 | + document.body.appendChild(iframe); |
| 481 | + |
| 482 | + var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; |
| 483 | + var eventer = window[eventMethod]; |
| 484 | + var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message"; |
| 485 | + |
| 486 | + eventer(messageEvent, function (e) { |
| 487 | + if (e.source != iframe.contentWindow){return} // reject messages send from other iframes |
| 488 | + if (e.data && typeof e.data === "object" && e.data.dataReceived && typeof e.data.dataReceived === "object"){ // raw data |
| 489 | + if ("overlayNinja" in e.data.dataReceived){ |
| 490 | + processInput(e.data.dataReceived.overlayNinja); |
| 491 | + } |
451 | 492 | } |
452 | | - } |
453 | | -}); |
| 493 | + }); |
| 494 | +} |
454 | 495 |
|
455 | 496 |
|
456 | 497 | var conCon = 1; |
|
0 commit comments