Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 51cc0b14fb | |||
| 063e8c25b7 | |||
| d9e2ae0f53 | |||
| 75c5d0d723 | |||
| 1a18788c32 | |||
| 37da378259 | |||
| 8a948a300b | |||
| c800016484 | |||
| 1330fcbba0 | |||
| 9c1561567f | |||
| 7016d6c742 | |||
| ef01424b36 |
@@ -11,7 +11,7 @@ for(let arg of process.argv){
|
|||||||
}
|
}
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
signallingURL: "ws://localhost:8889",
|
signallingURL: "ws://localhost:0000",
|
||||||
|
|
||||||
mediasoup: {
|
mediasoup: {
|
||||||
worker: {
|
worker: {
|
||||||
@@ -25,7 +25,7 @@ const config = {
|
|||||||
"rtp",
|
"rtp",
|
||||||
"srtp",
|
"srtp",
|
||||||
"rtcp",
|
"rtcp",
|
||||||
"sctp"
|
"sctp",
|
||||||
// 'rtx',
|
// 'rtx',
|
||||||
// 'bwe',
|
// 'bwe',
|
||||||
// 'score',
|
// 'score',
|
||||||
|
|||||||
Generated
+15
@@ -10,6 +10,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mediasoup_prebuilt": "^3.8.4",
|
"mediasoup_prebuilt": "^3.8.4",
|
||||||
"mediasoup-sdp-bridge": "file:mediasoup-sdp-bridge",
|
"mediasoup-sdp-bridge": "file:mediasoup-sdp-bridge",
|
||||||
|
"run-script-os": "^1.1.6",
|
||||||
"ws": "^7.1.2"
|
"ws": "^7.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -176,6 +177,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz",
|
||||||
"integrity": "sha512-ipG3kRCREi/YQpi2A5QGcvDz1KemohovWmH6qGfboVyyGdR2t/7zQz0vFxrfxpbHQgPPdtVlUDaks3aikD1Ljw=="
|
"integrity": "sha512-ipG3kRCREi/YQpi2A5QGcvDz1KemohovWmH6qGfboVyyGdR2t/7zQz0vFxrfxpbHQgPPdtVlUDaks3aikD1Ljw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/run-script-os": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==",
|
||||||
|
"bin": {
|
||||||
|
"run-os": "index.js",
|
||||||
|
"run-script-os": "index.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/sdp-transform": {
|
"node_modules/sdp-transform": {
|
||||||
"version": "2.14.1",
|
"version": "2.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz",
|
||||||
@@ -346,6 +356,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz",
|
||||||
"integrity": "sha512-ipG3kRCREi/YQpi2A5QGcvDz1KemohovWmH6qGfboVyyGdR2t/7zQz0vFxrfxpbHQgPPdtVlUDaks3aikD1Ljw=="
|
"integrity": "sha512-ipG3kRCREi/YQpi2A5QGcvDz1KemohovWmH6qGfboVyyGdR2t/7zQz0vFxrfxpbHQgPPdtVlUDaks3aikD1Ljw=="
|
||||||
},
|
},
|
||||||
|
"run-script-os": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw=="
|
||||||
|
},
|
||||||
"sdp-transform": {
|
"sdp-transform": {
|
||||||
"version": "2.14.1",
|
"version": "2.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz",
|
||||||
|
|||||||
@@ -1,4 +1,17 @@
|
|||||||
|
var server_settings = process.argv.slice(2)
|
||||||
|
if (!server_settings) {
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
server_settings = JSON.parse(server_settings)
|
||||||
|
} catch (err) {
|
||||||
|
console.log('can not process arguments')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
const config = require('./config');
|
const config = require('./config');
|
||||||
|
config.signallingURL = 'ws://localhost:' + server_settings.sfu_port
|
||||||
const WebSocket = require('ws');
|
const WebSocket = require('ws');
|
||||||
const mediasoup = require('mediasoup_prebuilt');
|
const mediasoup = require('mediasoup_prebuilt');
|
||||||
const mediasoupSdp = require('mediasoup-sdp-bridge');
|
const mediasoupSdp = require('mediasoup-sdp-bridge');
|
||||||
@@ -12,13 +25,17 @@ function connectSignalling(server) {
|
|||||||
console.log("Connecting to Signalling Server at %s", server);
|
console.log("Connecting to Signalling Server at %s", server);
|
||||||
signalServer = new WebSocket(server);
|
signalServer = new WebSocket(server);
|
||||||
signalServer.addEventListener("open", _ => { console.log(`Connected to signalling server`); });
|
signalServer.addEventListener("open", _ => { console.log(`Connected to signalling server`); });
|
||||||
signalServer.addEventListener("error", result => { console.log(`Error: ${result.message}`); });
|
signalServer.addEventListener("error", result => { console.log(`Error: ${result.message}`); process.exit()});
|
||||||
signalServer.addEventListener("message", result => onSignallingMessage(result.data));
|
signalServer.addEventListener("message", result => onSignallingMessage(result.data));
|
||||||
signalServer.addEventListener("close", result => {
|
signalServer.addEventListener("close", result => {
|
||||||
console.log(`Disconnected from signalling server: ${result.code} ${result.reason}`);
|
console.log(`Disconnected from signalling server: ${result.code} ${result.reason}`);
|
||||||
console.log("Attempting reconnect to signalling server...");
|
console.log("Attempting reconnect to signalling server...");
|
||||||
|
process.exit()
|
||||||
|
let death_count = 0
|
||||||
setTimeout(()=> {
|
setTimeout(()=> {
|
||||||
connectSignalling(server);
|
connectSignalling(server);
|
||||||
|
if ((++death_count) > 2)
|
||||||
|
process.exit()
|
||||||
}, 2000);
|
}, 2000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M54 35.9999L27.0001 53.9999L27.0001 18L54 35.9999Z" fill="white" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 241 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="106" height="106" viewBox="0 0 106 106" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="53" cy="53" r="53" fill="#454545"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 155 B |
@@ -1,20 +1,69 @@
|
|||||||
/*Copyright Epic Games, Inc. All Rights Reserved.*/
|
/*Copyright Epic Games, Inc. All Rights Reserved.*/
|
||||||
|
@import url(./fonts/fonts.css);
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
/*Using colour scheme https://color.adobe.com/TD-Colors---Option-3-color-theme-10394433/*/
|
/*Using colour scheme https://color.adobe.com/TD-Colors---Option-3-color-theme-10394433/*/
|
||||||
--colour1:#000000;
|
--colour1: #151619;
|
||||||
--colour2:#FFFFFF;
|
;
|
||||||
--colour3:#0585fe;
|
--colour2: #FFFFFF;
|
||||||
--colour4:#35b350;
|
--colour3: #0585fe;
|
||||||
--colour5:#ffab00;
|
--colour4: #35b350;
|
||||||
--colour6:#1e1d22;
|
--colour5: #ffab00;
|
||||||
--colour7:#3c3b40;
|
--colour6: #1e1d22;
|
||||||
|
--colour7: #3c3b40;
|
||||||
}
|
}
|
||||||
|
|
||||||
body{
|
#loader {
|
||||||
margin: 0px;
|
width: 106px;
|
||||||
background-color: black;
|
height: 106px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
background: conic-gradient(from 135deg at 50% 50%,
|
||||||
|
rgba(255, 255, 255, 0) -6.26deg,
|
||||||
|
#ffffff 314.83deg,
|
||||||
|
rgba(255, 255, 255, 0) 353.74deg,
|
||||||
|
#ffffff 674.83deg);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#loader::after {
|
||||||
|
content: "";
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #151619;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0px;
|
||||||
|
background-color: #151619;
|
||||||
|
|
||||||
font-family: 'Montserrat', sans-serif;
|
font-family: 'Montserrat', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-family: "GilroyWebRegular";
|
||||||
|
}
|
||||||
|
|
||||||
#playerUI {
|
#playerUI {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -22,8 +71,8 @@ body{
|
|||||||
}
|
}
|
||||||
|
|
||||||
canvas {
|
canvas {
|
||||||
image-rendering: crisp-edges;
|
image-rendering: crisp-edges;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
|
||||||
video {
|
video {
|
||||||
@@ -32,14 +81,13 @@ video {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#player{
|
#player {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: #000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#videoPlayOverlay{
|
#videoPlayOverlay {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -48,15 +96,14 @@ video {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* State for element to be clickable */
|
/* State for element to be clickable */
|
||||||
.clickableState{
|
.clickableState {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
cursor: pointer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* State for element to show text, this is for informational use*/
|
/* State for element to show text, this is for informational use*/
|
||||||
.textDisplayState{
|
.textDisplayState {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -64,21 +111,108 @@ video {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* State to hide overlay, WebRTC communication is in progress and or is playing */
|
/* State to hide overlay, WebRTC communication is in progress and or is playing */
|
||||||
.hiddenState{
|
.hiddenState {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#playButton{
|
#playButton {
|
||||||
display: inline-block;
|
display: block;
|
||||||
height: auto;
|
width: 88px;
|
||||||
|
height: 88px;
|
||||||
z-index: 30;
|
z-index: 30;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-radius: 112px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
img#playButton{
|
|
||||||
max-width: 241px;
|
|
||||||
width: 10%;
|
#container {
|
||||||
|
width: 400px;
|
||||||
|
height: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
/* Background */
|
||||||
|
background: transparent;
|
||||||
|
/* Button_1 */
|
||||||
|
border-width: 0px 2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #23242A;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 40px;
|
||||||
|
padding: 40px 56px;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 500px) {
|
||||||
|
#container {
|
||||||
|
width: 100%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#playButton:hover {
|
||||||
|
background: linear-gradient(180deg, #BC75FF 0%, #798FFF 100%);
|
||||||
|
backdrop-filter: blur(10px)
|
||||||
|
}
|
||||||
|
|
||||||
|
#title {
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 38px;
|
||||||
|
line-height: 100%;
|
||||||
|
/* or 38px */
|
||||||
|
/* White */
|
||||||
|
color: #F2F2F2;
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#caption {
|
||||||
|
font-family: 'Inter';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 140%;
|
||||||
|
/* or 22px */
|
||||||
|
text-align: center;
|
||||||
|
/* Inactive */
|
||||||
|
color: #C5C7CE;
|
||||||
|
margin: 0;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#link {
|
||||||
|
font-family: 'Inter';
|
||||||
|
cursor: pointer;
|
||||||
|
background: #1C1D21;
|
||||||
|
border-radius: 4px;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 8px 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
/* identical to box height, or 16px */
|
||||||
|
/* Inactive */
|
||||||
|
color: #C5C7CE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#link:hover {
|
||||||
|
background: #23242A;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#freezeFrameOverlay {
|
#freezeFrameOverlay {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
@@ -117,14 +251,14 @@ img#playButton{
|
|||||||
border: 3px solid var(--colour3);
|
border: 3px solid var(--colour3);
|
||||||
transition: 0.25s ease;
|
transition: 0.25s ease;
|
||||||
padding-left: 0.55rem;
|
padding-left: 0.55rem;
|
||||||
padding-top: 0.55rem;
|
padding-top: 0.55rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#overlay button:active {
|
#overlay button:active {
|
||||||
border: 3px solid var(--colour3);
|
border: 3px solid var(--colour3);
|
||||||
background-color: var(--colour7);
|
background-color: var(--colour7);
|
||||||
padding-left: 0.55rem;
|
padding-left: 0.55rem;
|
||||||
padding-top: 0.55rem;
|
padding-top: 0.55rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#overlay img {
|
#overlay img {
|
||||||
@@ -146,7 +280,7 @@ img#playButton{
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
transform: translateY(25%);
|
transform: translateY(25%);
|
||||||
left: 125%;
|
left: 125%;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,19 +292,19 @@ img#playButton{
|
|||||||
#connection .tooltiptext {
|
#connection .tooltiptext {
|
||||||
top: 125%;
|
top: 125%;
|
||||||
transform: translateX(-25%);
|
transform: translateX(-25%);
|
||||||
left: 0;
|
left: 0;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-panel .tooltiptext {
|
#settings-panel .tooltiptext {
|
||||||
display: block;
|
display: block;
|
||||||
top: 125%;
|
top: 125%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
left: 0;
|
left: 0;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
border: 3px solid var(--colour5);
|
border: 3px solid var(--colour5);
|
||||||
width: max-content;
|
width: max-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,10 +314,10 @@ img#playButton{
|
|||||||
left: 1%;
|
left: 1%;
|
||||||
font-family: 'Michroma', sans-serif;
|
font-family: 'Michroma', sans-serif;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
display: block;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#controls > * {
|
#controls>* {
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -203,6 +337,7 @@ img#playButton{
|
|||||||
right: 10%;
|
right: 10%;
|
||||||
font-family: 'Michroma', sans-serif;
|
font-family: 'Michroma', sans-serif;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
|
visibility: hidden;
|
||||||
width: min-content;
|
width: min-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,16 +353,23 @@ img#playButton{
|
|||||||
font-family: 'Michroma', sans-serif;
|
font-family: 'Michroma', sans-serif;
|
||||||
height: 3rem;
|
height: 3rem;
|
||||||
width: 3rem;
|
width: 3rem;
|
||||||
pointer-events: all;
|
pointer-events: none;
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.noselect {
|
.noselect {
|
||||||
-webkit-touch-callout: none; /* iOS Safari */
|
-webkit-touch-callout: none;
|
||||||
-webkit-user-select: none; /* Safari */
|
/* iOS Safari */
|
||||||
-khtml-user-select: none; /* Konqueror HTML */
|
-webkit-user-select: none;
|
||||||
-moz-user-select: none; /* Old versions of Firefox */
|
/* Safari */
|
||||||
-ms-user-select: none; /* Internet Explorer/Edge */
|
-khtml-user-select: none;
|
||||||
user-select: none; /* Non-prefixed version, currently
|
/* Konqueror HTML */
|
||||||
|
-moz-user-select: none;
|
||||||
|
/* Old versions of Firefox */
|
||||||
|
-ms-user-select: none;
|
||||||
|
/* Internet Explorer/Edge */
|
||||||
|
user-select: none;
|
||||||
|
/* Non-prefixed version, currently
|
||||||
supported by Chrome, Edge, Opera and Firefox */
|
supported by Chrome, Edge, Opera and Firefox */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,10 +403,10 @@ img#playButton{
|
|||||||
#heading {
|
#heading {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
margin-block-start: 0.67em;
|
margin-block-start: 0.67em;
|
||||||
margin-block-end: 0.67em;
|
margin-block-end: 0.67em;
|
||||||
margin-inline-start: 0px;
|
margin-inline-start: 0px;
|
||||||
margin-inline-end: 0px;
|
margin-inline-end: 0px;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 0 0 0 2rem;
|
padding: 0 0 0 2rem;
|
||||||
}
|
}
|
||||||
@@ -281,7 +423,8 @@ img#playButton{
|
|||||||
#close:after {
|
#close:after {
|
||||||
padding-left: 0.5rem;
|
padding-left: 0.5rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
content: "\00d7"; /* This will render the 'X' */
|
content: "\00d7";
|
||||||
|
/* This will render the 'X' */
|
||||||
}
|
}
|
||||||
|
|
||||||
#close:hover {
|
#close:hover {
|
||||||
@@ -301,7 +444,7 @@ img#playButton{
|
|||||||
margin: 0.5rem 0;
|
margin: 0.5rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-text{
|
.settings-text {
|
||||||
margin-right: 2rem;
|
margin-right: 2rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
@@ -310,24 +453,44 @@ img#playButton{
|
|||||||
.tgl-switch {
|
.tgl-switch {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-switch .tgl {
|
.tgl-switch .tgl {
|
||||||
display:none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl, .tgl:after, .tgl:before, .tgl *, .tgl *:after, .tgl *:before, .tgl + .tgl-slider {
|
.tgl,
|
||||||
|
.tgl:after,
|
||||||
|
.tgl:before,
|
||||||
|
.tgl *,
|
||||||
|
.tgl *:after,
|
||||||
|
.tgl *:before,
|
||||||
|
.tgl+.tgl-slider {
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.tgl::-moz-selection, .tgl:after::-moz-selection, .tgl:before::-moz-selection, .tgl *::-moz-selection, .tgl *:after::-moz-selection, .tgl *:before::-moz-selection, .tgl + .tgl-slider::-moz-selection {
|
|
||||||
|
.tgl::-moz-selection,
|
||||||
|
.tgl:after::-moz-selection,
|
||||||
|
.tgl:before::-moz-selection,
|
||||||
|
.tgl *::-moz-selection,
|
||||||
|
.tgl *:after::-moz-selection,
|
||||||
|
.tgl *:before::-moz-selection,
|
||||||
|
.tgl+.tgl-slider::-moz-selection {
|
||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
.tgl::selection, .tgl:after::selection, .tgl:before::selection, .tgl *::selection, .tgl *:after::selection, .tgl *:before::selection, .tgl + .tgl-slider::selection {
|
|
||||||
|
.tgl::selection,
|
||||||
|
.tgl:after::selection,
|
||||||
|
.tgl:before::selection,
|
||||||
|
.tgl *::selection,
|
||||||
|
.tgl *:after::selection,
|
||||||
|
.tgl *:before::selection,
|
||||||
|
.tgl+.tgl-slider::selection {
|
||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl + .tgl-slider {
|
.tgl+.tgl-slider {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
display: block;
|
display: block;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
@@ -335,50 +498,53 @@ img#playButton{
|
|||||||
position: relative;
|
position: relative;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl + .tgl-slider:after, .tgl + .tgl-slider:before {
|
.tgl+.tgl-slider:after,
|
||||||
|
.tgl+.tgl-slider:before {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: "";
|
||||||
width: 50%;
|
width: 50%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.tgl + .tgl-slider:after {
|
|
||||||
|
.tgl+.tgl-slider:after {
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
.tgl + .tgl-slider:before {
|
|
||||||
|
.tgl+.tgl-slider:before {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-flat + .tgl-slider {
|
.tgl-flat+.tgl-slider {
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
-webkit-transition: all .2s ease;
|
-webkit-transition: all .2s ease;
|
||||||
transition: all .2s ease;
|
transition: all .2s ease;
|
||||||
background: var(--colour6);
|
background: var(--colour6);
|
||||||
border: 3px solid var(--colour7);
|
border: 3px solid var(--colour7);
|
||||||
border-radius: 2em;
|
border-radius: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-flat + .tgl-slider:after {
|
.tgl-flat+.tgl-slider:after {
|
||||||
-webkit-transition: all .2s ease;
|
-webkit-transition: all .2s ease;
|
||||||
transition: all .2s ease;
|
transition: all .2s ease;
|
||||||
background: var(--colour7);
|
background: var(--colour7);
|
||||||
content: "";
|
content: "";
|
||||||
border-radius: 1em;
|
border-radius: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-flat:checked + .tgl-slider {
|
.tgl-flat:checked+.tgl-slider {
|
||||||
border: 3px solid var(--colour3);
|
border: 3px solid var(--colour3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-flat:checked + .tgl-slider:after {
|
.tgl-flat:checked+.tgl-slider:after {
|
||||||
left: 50%;
|
left: 50%;
|
||||||
background: var(--colour3);
|
background: var(--colour3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle-text {
|
.subtitle-text {
|
||||||
margin: 0 0 0 1rem;
|
margin: 0 0 0 1rem;
|
||||||
@@ -411,7 +577,8 @@ img#playButton{
|
|||||||
|
|
||||||
#hiddenInput {
|
#hiddenInput {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: -10%; /* Although invisible, push off-screen to prevent user interaction. */
|
left: -10%;
|
||||||
|
/* Although invisible, push off-screen to prevent user interaction. */
|
||||||
width: 0px;
|
width: 0px;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
@@ -428,47 +595,50 @@ img#playButton{
|
|||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
position: relative;
|
position: relative;
|
||||||
transform: scale(var(--ggs,1));
|
transform: scale(var(--ggs, 1));
|
||||||
width: 20px;
|
width: 20px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-radius: 40px;
|
border-radius: 40px;
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning::after,
|
.warning::after,
|
||||||
.warning::before {
|
.warning::before {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
width: 2px;
|
width: 2px;
|
||||||
background: currentColor;
|
background: currentColor;
|
||||||
left: 7px
|
left: 7px
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning::after {
|
.warning::after {
|
||||||
top: 2px;
|
top: 2px;
|
||||||
height: 8px
|
height: 8px
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning::before {
|
.warning::before {
|
||||||
height: 2px;
|
height: 2px;
|
||||||
bottom: 2px
|
bottom: 2px
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flat buttons */
|
/* Flat buttons */
|
||||||
input[type="button"] {
|
input[type="button"] {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: var(--colour2);
|
color: var(--colour2);
|
||||||
font-family: 'Montserrat';
|
font-family: 'Montserrat';
|
||||||
border: 3px solid var(--colour3);
|
border: 3px solid var(--colour3);
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
padding-left: 0.5rem;
|
padding-left: 0.5rem;
|
||||||
padding-right: 0.5rem;
|
padding-right: 0.5rem;
|
||||||
}
|
}
|
||||||
@@ -477,6 +647,7 @@ input[type="button"]:hover {
|
|||||||
background-color: var(--colour3);
|
background-color: var(--colour3);
|
||||||
transition: ease 0.3s;
|
transition: ease 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="button"]:active {
|
input[type="button"]:active {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
@@ -489,11 +660,11 @@ input[type="button"]:active {
|
|||||||
select,
|
select,
|
||||||
input[type="number"] {
|
input[type="number"] {
|
||||||
background-color: var(--colour7);
|
background-color: var(--colour7);
|
||||||
color: var(--colour2);
|
color: var(--colour2);
|
||||||
border: 1px solid var(--colour6);
|
border: 1px solid var(--colour6);
|
||||||
padding: 0.25rem;
|
padding: 0.25rem;
|
||||||
font-family: 'Montserrat';
|
font-family: 'Montserrat';
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=number]::-webkit-inner-spin-button {
|
input[type=number]::-webkit-inner-spin-button {
|
||||||
@@ -543,17 +714,17 @@ object {
|
|||||||
|
|
||||||
#afkOverlay {
|
#afkOverlay {
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
background-color: rgba(30, 29, 34, 0.5);
|
background-color: rgba(30, 29, 34, 0.5);
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
line-height: 100vh;
|
line-height: 100vh;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#afkOverlay center {
|
#afkOverlay center {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
|
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Michroma&family=Montserrat:wght@600&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter&display=swap" rel="stylesheet">
|
||||||
<link type="text/css" rel="stylesheet" href="player.css">
|
<link type="text/css" rel="stylesheet" href="player.css">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
// This horrible hack is to make Fippo's adapter-latest.js work with Firefox when not on https
|
// This horrible hack is to make Fippo's adapter-latest.js work with Firefox when not on https
|
||||||
@@ -27,6 +27,10 @@
|
|||||||
<script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
<script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
||||||
<script type="text/javascript" src="scripts/webRtcPlayer.js"></script>
|
<script type="text/javascript" src="scripts/webRtcPlayer.js"></script>
|
||||||
<script type="text/javascript" src="scripts/app.js"></script>
|
<script type="text/javascript" src="scripts/app.js"></script>
|
||||||
|
<script>
|
||||||
|
inputOptions.controlScheme = ControlSchemeType.HoveringMouse;
|
||||||
|
inputOptions.fakeMouseWithTouches = true;
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body onload="load()">
|
<body onload="load()">
|
||||||
@@ -47,35 +51,39 @@
|
|||||||
<object data="images/Info.svg" type="image/svg+xml"></object>
|
<object data="images/Info.svg" type="image/svg+xml"></object>
|
||||||
<span class="tooltiptext">Information</span>
|
<span class="tooltiptext">Information</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div id="unrealengine">
|
<div id="unrealengine">
|
||||||
<p></p>
|
<p></p>
|
||||||
<svg viewBox="0 0 1204.105 74.011" xmlns="http://www.w3.org/2000/svg">
|
<svg viewBox="0 0 1204.105 74.011" xmlns="http://www.w3.org/2000/svg">
|
||||||
<g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="9pt" stroke="#ffffff" stroke-width="0.25mm" fill="#ffffff" style="stroke:#ffffff;stroke-width:0.25mm;fill:#ffffff">
|
<g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="9pt" stroke="#ffffff"
|
||||||
<path d="M 894.605 74.006 L 921.305 74.006 C 942.427 74.006 953.413 73.292 956.313 60.527 A 37.848 37.848 0 0 0 957.105 52.206 L 957.105 31.606 L 907.305 31.606 L 907.305 46.606 L 934.905 46.606 L 934.905 48.706 C 934.905 53.442 932.251 55.385 928.738 56.147 A 26.156 26.156 0 0 1 923.305 56.606 L 899.605 56.606 A 39.408 39.408 0 0 1 894.638 56.344 C 888.593 55.565 886.231 52.853 885.654 45.747 A 52.88 52.88 0 0 1 885.505 41.506 L 885.505 32.506 A 48.028 48.028 0 0 1 885.738 27.377 C 886.556 19.865 889.695 17.689 897.793 17.433 A 57.321 57.321 0 0 1 899.605 17.406 L 923.705 17.406 A 38.323 38.323 0 0 1 927.889 17.588 C 932.328 18.085 934.835 19.818 934.904 25.273 A 18.461 18.461 0 0 1 934.905 25.506 L 956.705 25.506 L 956.705 23.206 A 36.235 36.235 0 0 0 955.47 12.587 C 953.178 5.214 946.987 0.624 931.363 0.064 A 93.813 93.813 0 0 0 928.005 0.006 L 894.605 0.006 C 874.839 0.006 862.985 4.89 862.71 25.469 A 55.259 55.259 0 0 0 862.705 26.206 L 862.705 47.806 A 39.6 39.6 0 0 0 863.741 57.358 C 866.906 70.059 877.192 73.722 892.685 73.99 A 111.289 111.289 0 0 0 894.605 74.006 Z M 323.405 73.206 L 403.905 73.206 L 403.905 55.806 L 345.605 55.806 L 345.605 44.206 L 399.605 44.206 L 399.605 29.206 L 345.605 29.206 L 345.605 17.606 L 402.605 17.606 L 402.605 0.806 L 323.405 0.806 L 323.405 73.206 Z M 656.905 73.206 L 737.405 73.206 L 737.405 55.806 L 679.105 55.806 L 679.105 44.206 L 733.105 44.206 L 733.105 29.206 L 679.105 29.206 L 679.105 17.606 L 736.105 17.606 L 736.105 0.806 L 656.905 0.806 L 656.905 73.206 Z M 1123.605 73.206 L 1204.105 73.206 L 1204.105 55.806 L 1145.805 55.806 L 1145.805 44.206 L 1199.805 44.206 L 1199.805 29.206 L 1145.805 29.206 L 1145.805 17.606 L 1202.805 17.606 L 1202.805 0.806 L 1123.605 0.806 L 1123.605 73.206 Z M 106.205 73.206 L 128.405 73.206 L 128.405 20.606 L 128.605 20.606 L 170.305 73.206 L 204.705 73.206 L 204.705 0.806 L 182.505 0.806 L 182.505 53.406 L 182.305 53.406 L 140.605 0.806 L 106.205 0.806 L 106.205 73.206 Z M 750.805 73.206 L 773.005 73.206 L 773.005 20.606 L 773.205 20.606 L 814.905 73.206 L 849.305 73.206 L 849.305 0.806 L 827.105 0.806 L 827.105 53.406 L 826.905 53.406 L 785.205 0.806 L 750.805 0.806 L 750.805 73.206 Z M 1010.105 73.206 L 1032.305 73.206 L 1032.305 20.606 L 1032.505 20.606 L 1074.205 73.206 L 1108.605 73.206 L 1108.605 0.806 L 1086.405 0.806 L 1086.405 53.406 L 1086.205 53.406 L 1044.505 0.806 L 1010.105 0.806 L 1010.105 73.206 Z M 29.705 74.006 L 61.505 74.006 A 51.732 51.732 0 0 0 72.484 72.955 C 82.691 70.728 88.531 64.939 90.473 55.381 A 40.134 40.134 0 0 0 91.205 47.406 L 91.205 0.806 L 69.005 0.806 L 69.005 42.606 C 69.005 51.405 65.987 55.082 57.762 55.385 A 31.364 31.364 0 0 1 56.605 55.406 L 34.605 55.406 A 22.943 22.943 0 0 1 30.082 55.013 C 24.736 53.93 22.488 50.538 22.231 43.95 A 34.441 34.441 0 0 1 22.205 42.606 L 22.205 0.806 L 0.005 0.806 L 0.005 47.406 C 0.005 64.841 8.73 73.457 27.816 73.981 A 68.853 68.853 0 0 0 29.705 74.006 Z M 219.705 73.206 L 241.905 73.206 L 241.905 54.406 L 276.805 54.406 A 18.122 18.122 0 0 1 280.084 54.663 C 284.425 55.469 285.905 58.272 285.905 64.506 L 285.905 73.206 L 308.105 73.206 L 308.105 60.906 C 308.105 49.006 302.605 46.106 296.005 44.906 L 296.005 44.706 A 22.978 22.978 0 0 0 300.937 43.003 C 305.503 40.745 307.44 37.183 308.108 32.151 A 40.124 40.124 0 0 0 308.405 26.906 L 308.405 22.306 A 33.46 33.46 0 0 0 307.248 12.853 C 305.018 5.341 299.196 0.806 286.705 0.806 L 219.705 0.806 L 219.705 73.206 Z M 410.205 73.206 L 435.005 73.206 L 441.505 60.406 L 486.505 60.406 L 493.405 73.206 L 518.105 73.206 L 478.305 0.806 L 449.405 0.806 L 410.205 73.206 Z M 526.005 73.206 L 598.105 73.206 L 598.105 54.606 L 548.205 54.606 L 548.205 0.806 L 526.005 0.806 L 526.005 73.206 Z M 971.705 73.206 L 993.905 73.206 L 993.905 0.806 L 971.705 0.806 L 971.705 73.206 Z M 241.905 18.806 L 276.605 18.806 A 34.237 34.237 0 0 1 280.146 18.959 C 283.795 19.344 285.876 20.558 286.556 23.711 A 12.861 12.861 0 0 1 286.805 26.406 L 286.805 28.806 A 12.128 12.128 0 0 1 286.485 31.774 C 285.685 34.926 283.316 36.406 278.605 36.406 L 241.905 36.406 L 241.905 18.806 Z M 463.805 17.606 L 478.205 44.806 L 449.805 44.806 L 463.805 17.606 Z"/>
|
stroke-width="0.25mm" fill="#ffffff" style="stroke:#ffffff;stroke-width:0.25mm;fill:#ffffff">
|
||||||
|
<path
|
||||||
|
d="M 894.605 74.006 L 921.305 74.006 C 942.427 74.006 953.413 73.292 956.313 60.527 A 37.848 37.848 0 0 0 957.105 52.206 L 957.105 31.606 L 907.305 31.606 L 907.305 46.606 L 934.905 46.606 L 934.905 48.706 C 934.905 53.442 932.251 55.385 928.738 56.147 A 26.156 26.156 0 0 1 923.305 56.606 L 899.605 56.606 A 39.408 39.408 0 0 1 894.638 56.344 C 888.593 55.565 886.231 52.853 885.654 45.747 A 52.88 52.88 0 0 1 885.505 41.506 L 885.505 32.506 A 48.028 48.028 0 0 1 885.738 27.377 C 886.556 19.865 889.695 17.689 897.793 17.433 A 57.321 57.321 0 0 1 899.605 17.406 L 923.705 17.406 A 38.323 38.323 0 0 1 927.889 17.588 C 932.328 18.085 934.835 19.818 934.904 25.273 A 18.461 18.461 0 0 1 934.905 25.506 L 956.705 25.506 L 956.705 23.206 A 36.235 36.235 0 0 0 955.47 12.587 C 953.178 5.214 946.987 0.624 931.363 0.064 A 93.813 93.813 0 0 0 928.005 0.006 L 894.605 0.006 C 874.839 0.006 862.985 4.89 862.71 25.469 A 55.259 55.259 0 0 0 862.705 26.206 L 862.705 47.806 A 39.6 39.6 0 0 0 863.741 57.358 C 866.906 70.059 877.192 73.722 892.685 73.99 A 111.289 111.289 0 0 0 894.605 74.006 Z M 323.405 73.206 L 403.905 73.206 L 403.905 55.806 L 345.605 55.806 L 345.605 44.206 L 399.605 44.206 L 399.605 29.206 L 345.605 29.206 L 345.605 17.606 L 402.605 17.606 L 402.605 0.806 L 323.405 0.806 L 323.405 73.206 Z M 656.905 73.206 L 737.405 73.206 L 737.405 55.806 L 679.105 55.806 L 679.105 44.206 L 733.105 44.206 L 733.105 29.206 L 679.105 29.206 L 679.105 17.606 L 736.105 17.606 L 736.105 0.806 L 656.905 0.806 L 656.905 73.206 Z M 1123.605 73.206 L 1204.105 73.206 L 1204.105 55.806 L 1145.805 55.806 L 1145.805 44.206 L 1199.805 44.206 L 1199.805 29.206 L 1145.805 29.206 L 1145.805 17.606 L 1202.805 17.606 L 1202.805 0.806 L 1123.605 0.806 L 1123.605 73.206 Z M 106.205 73.206 L 128.405 73.206 L 128.405 20.606 L 128.605 20.606 L 170.305 73.206 L 204.705 73.206 L 204.705 0.806 L 182.505 0.806 L 182.505 53.406 L 182.305 53.406 L 140.605 0.806 L 106.205 0.806 L 106.205 73.206 Z M 750.805 73.206 L 773.005 73.206 L 773.005 20.606 L 773.205 20.606 L 814.905 73.206 L 849.305 73.206 L 849.305 0.806 L 827.105 0.806 L 827.105 53.406 L 826.905 53.406 L 785.205 0.806 L 750.805 0.806 L 750.805 73.206 Z M 1010.105 73.206 L 1032.305 73.206 L 1032.305 20.606 L 1032.505 20.606 L 1074.205 73.206 L 1108.605 73.206 L 1108.605 0.806 L 1086.405 0.806 L 1086.405 53.406 L 1086.205 53.406 L 1044.505 0.806 L 1010.105 0.806 L 1010.105 73.206 Z M 29.705 74.006 L 61.505 74.006 A 51.732 51.732 0 0 0 72.484 72.955 C 82.691 70.728 88.531 64.939 90.473 55.381 A 40.134 40.134 0 0 0 91.205 47.406 L 91.205 0.806 L 69.005 0.806 L 69.005 42.606 C 69.005 51.405 65.987 55.082 57.762 55.385 A 31.364 31.364 0 0 1 56.605 55.406 L 34.605 55.406 A 22.943 22.943 0 0 1 30.082 55.013 C 24.736 53.93 22.488 50.538 22.231 43.95 A 34.441 34.441 0 0 1 22.205 42.606 L 22.205 0.806 L 0.005 0.806 L 0.005 47.406 C 0.005 64.841 8.73 73.457 27.816 73.981 A 68.853 68.853 0 0 0 29.705 74.006 Z M 219.705 73.206 L 241.905 73.206 L 241.905 54.406 L 276.805 54.406 A 18.122 18.122 0 0 1 280.084 54.663 C 284.425 55.469 285.905 58.272 285.905 64.506 L 285.905 73.206 L 308.105 73.206 L 308.105 60.906 C 308.105 49.006 302.605 46.106 296.005 44.906 L 296.005 44.706 A 22.978 22.978 0 0 0 300.937 43.003 C 305.503 40.745 307.44 37.183 308.108 32.151 A 40.124 40.124 0 0 0 308.405 26.906 L 308.405 22.306 A 33.46 33.46 0 0 0 307.248 12.853 C 305.018 5.341 299.196 0.806 286.705 0.806 L 219.705 0.806 L 219.705 73.206 Z M 410.205 73.206 L 435.005 73.206 L 441.505 60.406 L 486.505 60.406 L 493.405 73.206 L 518.105 73.206 L 478.305 0.806 L 449.405 0.806 L 410.205 73.206 Z M 526.005 73.206 L 598.105 73.206 L 598.105 54.606 L 548.205 54.606 L 548.205 0.806 L 526.005 0.806 L 526.005 73.206 Z M 971.705 73.206 L 993.905 73.206 L 993.905 0.806 L 971.705 0.806 L 971.705 73.206 Z M 241.905 18.806 L 276.605 18.806 A 34.237 34.237 0 0 1 280.146 18.959 C 283.795 19.344 285.876 20.558 286.556 23.711 A 12.861 12.861 0 0 1 286.805 26.406 L 286.805 28.806 A 12.128 12.128 0 0 1 286.485 31.774 C 285.685 34.926 283.316 36.406 278.605 36.406 L 241.905 36.406 L 241.905 18.806 Z M 463.805 17.606 L 478.205 44.806 L 449.805 44.806 L 463.805 17.606 Z" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div id="connection" class="tooltip">
|
<div id="connection" class="tooltip">
|
||||||
<svg version="1.1" id="connectionStrength" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
<svg version="1.1" id="connectionStrength" xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 494.45 494.45" style="enable-background:new 0 0 494.45 494.45;" xml:space="preserve">
|
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 494.45 494.45"
|
||||||
<circle id="dot" cx="247.125" cy="398.925" r="35.3"/>
|
style="enable-background:new 0 0 494.45 494.45;" xml:space="preserve">
|
||||||
|
<circle id="dot" cx="247.125" cy="398.925" r="35.3" />
|
||||||
|
|
||||||
<path id="middle" d="M395.225,277.325c-6.8,0-13.5-2.6-18.7-7.8c-71.4-71.3-187.4-71.3-258.8,0c-10.3,10.3-27.1,10.3-37.4,0
|
<path id="middle"
|
||||||
s-10.3-27.1,0-37.4c92-92,241.6-92,333.6,0c10.3,10.3,10.3,27.1,0,37.4C408.725,274.725,401.925,277.325,395.225,277.325z"/>
|
d="M395.225,277.325c-6.8,0-13.5-2.6-18.7-7.8c-71.4-71.3-187.4-71.3-258.8,0c-10.3,10.3-27.1,10.3-37.4,0
|
||||||
|
s-10.3-27.1,0-37.4c92-92,241.6-92,333.6,0c10.3,10.3,10.3,27.1,0,37.4C408.725,274.725,401.925,277.325,395.225,277.325z" />
|
||||||
|
|
||||||
<path id="outer" d="M467.925,204.625c-6.8,0-13.5-2.6-18.7-7.8c-111.5-111.4-292.7-111.4-404.1,0c-10.3,10.3-27.1,10.3-37.4,0
|
<path id="outer" d="M467.925,204.625c-6.8,0-13.5-2.6-18.7-7.8c-111.5-111.4-292.7-111.4-404.1,0c-10.3,10.3-27.1,10.3-37.4,0
|
||||||
s-10.3-27.1,0-37.4c64-64,149-99.2,239.5-99.2s175.5,35.2,239.5,99.2c10.3,10.3,10.3,27.1,0,37.4
|
s-10.3-27.1,0-37.4c64-64,149-99.2,239.5-99.2s175.5,35.2,239.5,99.2c10.3,10.3,10.3,27.1,0,37.4
|
||||||
C481.425,202.025,474.625,204.625,467.925,204.625z"/>
|
C481.425,202.025,474.625,204.625,467.925,204.625z" />
|
||||||
|
|
||||||
<path id="inner" d="M323.625,348.825c-6.8,0-13.5-2.6-18.7-7.8c-15.4-15.4-36-23.9-57.8-23.9s-42.4,8.5-57.8,23.9
|
<path id="inner" d="M323.625,348.825c-6.8,0-13.5-2.6-18.7-7.8c-15.4-15.4-36-23.9-57.8-23.9s-42.4,8.5-57.8,23.9
|
||||||
c-10.3,10.3-27.1,10.3-37.4,0c-10.3-10.3-10.3-27.1,0-37.4c25.4-25.4,59.2-39.4,95.2-39.4s69.8,14,95.2,39.5
|
c-10.3,10.3-27.1,10.3-37.4,0c-10.3-10.3-10.3-27.1,0-37.4c25.4-25.4,59.2-39.4,95.2-39.4s69.8,14,95.2,39.5
|
||||||
c10.3,10.3,10.3,27.1,0,37.4C337.225,346.225,330.425,348.825,323.625,348.825z"/>
|
c10.3,10.3,10.3,27.1,0,37.4C337.225,346.225,330.425,348.825,323.625,348.825z" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</svg>
|
</svg>
|
||||||
<span class="tooltiptext" id="qualityText">Not connected</span>
|
<span class="tooltiptext" id="qualityText">Not connected</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -158,19 +166,19 @@
|
|||||||
<div class="tgl-slider"></div>
|
<div class="tgl-slider"></div>
|
||||||
</label>
|
</label>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div id="showFPS" class="setting">
|
<div id="showFPS" class="setting">
|
||||||
<div class="settings-text">Show FPS</div>
|
<div class="settings-text">Show FPS</div>
|
||||||
<label class="btn-overlay">
|
<label class="btn-overlay">
|
||||||
<input type="button" id="show-fps-button" class="overlay-button btn-flat" value="Toggle">
|
<input type="button" id="show-fps-button" class="overlay-button btn-flat" value="Toggle">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div id="keyframeRequest" class="setting">
|
<div id="keyframeRequest" class="setting">
|
||||||
<div class="settings-text">Request KeyFrame</div>
|
<div class="settings-text">Request KeyFrame</div>
|
||||||
<label class="btn-overlay">
|
<label class="btn-overlay">
|
||||||
<input type="button" id="request-keyframe-button" class="overlay-button btn-flat" value="Request">
|
<input type="button" id="request-keyframe-button" class="overlay-button btn-flat" value="Request">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<section id="encoderSettings">
|
<section id="encoderSettings">
|
||||||
<div id="encoderSettingsHeader" class="settings-text">
|
<div id="encoderSettingsHeader" class="settings-text">
|
||||||
<div>Encoder Settings</div>
|
<div>Encoder Settings</div>
|
||||||
@@ -189,7 +197,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="webRTCSettings">
|
<section id="webRTCSettings">
|
||||||
<div id="webRTCSettingsHeader" class="settings-text">
|
<div id="webRTCSettingsHeader" class="settings-text">
|
||||||
<div>WebRTC Settings</div>
|
<div>WebRTC Settings</div>
|
||||||
@@ -211,7 +219,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="streamSettings">
|
<section id="streamSettings">
|
||||||
<div id="streamSettingsHeader" class="settings-text">
|
<div id="streamSettingsHeader" class="settings-text">
|
||||||
<div>Stream Settings</div>
|
<div>Stream Settings</div>
|
||||||
@@ -238,7 +246,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -246,7 +254,7 @@
|
|||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div id="heading">Information</div>
|
<div id="heading">Information</div>
|
||||||
<div id="close" onclick="statsClicked()"></div>
|
<div id="close" onclick="statsClicked()"></div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<section id="statsPanel">
|
<section id="statsPanel">
|
||||||
<div class="setting settings-text">
|
<div class="setting settings-text">
|
||||||
<div>Session Stats</div>
|
<div>Session Stats</div>
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-- Server side logic. Serves pixel streaming WebRTC-based page, proxies data back to Streamer --//
|
//-- Server side logic. Serves pixel streaming WebRTC-based page, proxies data back to Streamer --//
|
||||||
var server_settings = process.argv.slice(2)
|
var server_settings = process.argv.slice(2)
|
||||||
if (!server_settings) {
|
if (!server_settings) {
|
||||||
@@ -18,11 +16,13 @@ try {
|
|||||||
var express = require('express');
|
var express = require('express');
|
||||||
var app = express();
|
var app = express();
|
||||||
|
|
||||||
|
const {fork} = require('node:child_process')
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const querystring = require('querystring');
|
const querystring = require('querystring');
|
||||||
const bodyParser = require('body-parser');
|
const bodyParser = require('body-parser');
|
||||||
const logging = require('./modules/logging.js');
|
const logging = require('./modules/logging.js');
|
||||||
|
var request = require('request')
|
||||||
logging.RegisterConsoleLogger();
|
logging.RegisterConsoleLogger();
|
||||||
|
|
||||||
// Command line argument --configFile needs to be checked before loading the config, all other command line arguments are dealt with through the config object
|
// Command line argument --configFile needs to be checked before loading the config, all other command line arguments are dealt with through the config object
|
||||||
@@ -54,7 +54,33 @@ const config = require('./modules/config.js').init(configFile, defaultConfig);
|
|||||||
|
|
||||||
config.StreamerPort = server_settings.app_port
|
config.StreamerPort = server_settings.app_port
|
||||||
config.HttpPort = server_settings.webrtc_port
|
config.HttpPort = server_settings.webrtc_port
|
||||||
config.SFUPort = 0
|
config.SFUPort = server_settings.sfu_port
|
||||||
|
const session_server_url = server_settings.session_server_url
|
||||||
|
const session_id = server_settings.session_id
|
||||||
|
const useSFU = true
|
||||||
|
console.log('useSFU: ', useSFU)
|
||||||
|
|
||||||
|
function runSFU() {
|
||||||
|
const sfu_file_path = __dirname + '/../SFU/sfu_server.js'
|
||||||
|
if (!fs.existsSync(sfu_file_path)) {
|
||||||
|
console.logColor(logging.Red, 'can not run sfu: sfu file not exists!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
var sfu_proc_args = JSON.stringify({sfu_port:config.SFUPort})
|
||||||
|
fork(sfu_file_path, [sfu_proc_args], {
|
||||||
|
detached: true
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useSFU) {
|
||||||
|
runSFU()
|
||||||
|
}
|
||||||
|
|
||||||
if (config.LogToFile) {
|
if (config.LogToFile) {
|
||||||
logging.RegisterFileLogger('./logs/');
|
logging.RegisterFileLogger('./logs/');
|
||||||
@@ -275,9 +301,13 @@ if(config.EnableWebserver) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Setup http and https servers
|
//Setup http and https servers
|
||||||
http.listen(httpPort, function () {
|
var isHttpWorking = false
|
||||||
console.logColor(logging.Green, 'Http listening on *: ' + httpPort);
|
|
||||||
});
|
// http listen moved to streamer connection because webrtc server starts liten after application running
|
||||||
|
|
||||||
|
// http.listen(httpPort, function () {
|
||||||
|
// console.logColor(logging.Green, 'Http listening on *: ' + httpPort);
|
||||||
|
// });
|
||||||
|
|
||||||
if (config.UseHTTPS) {
|
if (config.UseHTTPS) {
|
||||||
https.listen(httpsPort, function () {
|
https.listen(httpsPort, function () {
|
||||||
@@ -343,6 +373,7 @@ function sendMessageToPlayer(playerId, msg) {
|
|||||||
|
|
||||||
let WebSocket = require('ws');
|
let WebSocket = require('ws');
|
||||||
const { URL } = require('url');
|
const { URL } = require('url');
|
||||||
|
const { exit } = require('process')
|
||||||
|
|
||||||
console.logColor(logging.Green, `WebSocket listening for Streamer connections on :${streamerPort}`)
|
console.logColor(logging.Green, `WebSocket listening for Streamer connections on :${streamerPort}`)
|
||||||
let streamerServer = new WebSocket.Server({ port: streamerPort, backlog: 1 });
|
let streamerServer = new WebSocket.Server({ port: streamerPort, backlog: 1 });
|
||||||
@@ -359,9 +390,17 @@ streamerServer.on('connection', function (ws, req) {
|
|||||||
console.logColor(logging.Green, `Streamer connected: ${req.connection.remoteAddress}`);
|
console.logColor(logging.Green, `Streamer connected: ${req.connection.remoteAddress}`);
|
||||||
sendStreamerConnectedToMatchmaker();
|
sendStreamerConnectedToMatchmaker();
|
||||||
|
|
||||||
|
if (!isHttpWorking) {
|
||||||
|
isHttpWorking = true
|
||||||
|
http.listen(httpPort, function () {
|
||||||
|
console.logColor(logging.Green, 'Http listening on *: ' + httpPort);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
ws.on('message', (msgRaw) => {
|
ws.on('message', (msgRaw) => {
|
||||||
|
|
||||||
var msg;
|
var msg;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
msg = JSON.parse(msgRaw);
|
msg = JSON.parse(msgRaw);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
@@ -526,9 +565,75 @@ sfuServer.on('connection', function (ws, req) {
|
|||||||
|
|
||||||
let playerCount = 0;
|
let playerCount = 0;
|
||||||
|
|
||||||
|
const get_time_in_seconds = () => {
|
||||||
|
return new Date().getTime() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
var session_start_time = get_time_in_seconds()
|
||||||
|
|
||||||
|
// timeouts
|
||||||
|
const first_connection_timeout = 40
|
||||||
|
const player_reconnection_timeout = 30
|
||||||
|
|
||||||
|
// players connection detection
|
||||||
|
var has_player_ever_connected = false
|
||||||
|
var last_player_connection_time
|
||||||
|
|
||||||
|
const check_players = () => {
|
||||||
|
// update player count on session server
|
||||||
|
try {
|
||||||
|
request.post(
|
||||||
|
session_server_url + '/cirrus/update_users_count',
|
||||||
|
{ json: { session_id: session_id, users_count: playerCount } },
|
||||||
|
function (error, response, body) {
|
||||||
|
if (!error && response.statusCode == 200) {
|
||||||
|
console.log(body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// if first player connection timeout reached destory session
|
||||||
|
if (!has_player_ever_connected) {
|
||||||
|
has_player_ever_connected = playerCount > 0
|
||||||
|
|
||||||
|
// if player never connected and timeout reached destroy session by exit
|
||||||
|
console.log('first connection time: ', (get_time_in_seconds() - session_start_time))
|
||||||
|
if ((get_time_in_seconds() - session_start_time) > first_connection_timeout) {
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
// if player never connected skip everything
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// if player not connected in reconnection timeout destory session
|
||||||
|
if (playerCount) {
|
||||||
|
last_player_connection_time = get_time_in_seconds()
|
||||||
|
} else {
|
||||||
|
if (!last_player_connection_time) {
|
||||||
|
last_player_connection_time = get_time_in_seconds()
|
||||||
|
}
|
||||||
|
console.log('reconnection time: ', (get_time_in_seconds() - last_player_connection_time))
|
||||||
|
if ((get_time_in_seconds() - last_player_connection_time) > player_reconnection_timeout) {
|
||||||
|
//console.log('should exit, but wont for debug')
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const start_players_check = () => {
|
||||||
|
check_players()
|
||||||
|
setTimeout(() => start_players_check(), 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
start_players_check()
|
||||||
|
|
||||||
console.logColor(logging.Green, `WebSocket listening for Players connections on :${httpPort}`);
|
console.logColor(logging.Green, `WebSocket listening for Players connections on :${httpPort}`);
|
||||||
let playerServer = new WebSocket.Server({ server: config.UseHTTPS ? https : http});
|
let playerServer = new WebSocket.Server({ server: config.UseHTTPS ? https : http});
|
||||||
playerServer.on('connection', function (ws, req) {
|
playerServer.on('connection', function (ws, req) {
|
||||||
|
|
||||||
// Reject connection if streamer is not connected
|
// Reject connection if streamer is not connected
|
||||||
if (!streamer || streamer.readyState != 1 /* OPEN */) {
|
if (!streamer || streamer.readyState != 1 /* OPEN */) {
|
||||||
ws.close(1013 /* Try again later */, 'Streamer is not connected');
|
ws.close(1013 /* Try again later */, 'Streamer is not connected');
|
||||||
@@ -538,7 +643,7 @@ playerServer.on('connection', function (ws, req) {
|
|||||||
var url = require('url');
|
var url = require('url');
|
||||||
const parsedUrl = url.parse(req.url);
|
const parsedUrl = url.parse(req.url);
|
||||||
const urlParams = new URLSearchParams(parsedUrl.search);
|
const urlParams = new URLSearchParams(parsedUrl.search);
|
||||||
const preferSFU = urlParams.has('preferSFU') && urlParams.get('preferSFU') !== 'false';
|
const preferSFU = useSFU//urlParams.has('preferSFU') && urlParams.get('preferSFU') !== 'false';
|
||||||
const skipSFU = !preferSFU;
|
const skipSFU = !preferSFU;
|
||||||
const skipStreamer = preferSFU && sfu;
|
const skipStreamer = preferSFU && sfu;
|
||||||
|
|
||||||
@@ -564,6 +669,13 @@ playerServer.on('connection', function (ws, req) {
|
|||||||
p.ws.send(playerCountMsg);
|
p.ws.send(playerCountMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendPlayersLastInputTime() {
|
||||||
|
let playerCountMsg = JSON.stringify({ type: 'lastOtherPlayerInput'});
|
||||||
|
for (let p of players.values()) {
|
||||||
|
p.ws.send(playerCountMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ws.on('message', (msgRaw) =>{
|
ws.on('message', (msgRaw) =>{
|
||||||
|
|
||||||
@@ -601,6 +713,9 @@ playerServer.on('connection', function (ws, req) {
|
|||||||
} else if (msg.type == "peerDataChannelsReady") {
|
} else if (msg.type == "peerDataChannelsReady") {
|
||||||
msg.playerId = playerId;
|
msg.playerId = playerId;
|
||||||
sendMessageToController(msg, skipSFU, true);
|
sendMessageToController(msg, skipSFU, true);
|
||||||
|
} else if (msg.type == "playerInput") {
|
||||||
|
//msg.playerId = playerId;
|
||||||
|
sendPlayersLastInputTime();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.error(`player ${playerId}: unsupported message type: ${msg.type}`);
|
console.error(`player ${playerId}: unsupported message type: ${msg.type}`);
|
||||||
|
|||||||
@@ -16,5 +16,6 @@
|
|||||||
"StreamerPort": 8888,
|
"StreamerPort": 8888,
|
||||||
"SFUPort": 8889,
|
"SFUPort": 8889,
|
||||||
"MaxPlayerCount": -1,
|
"MaxPlayerCount": -1,
|
||||||
"peerConnectionOptions": "{ \"iceServers\": [{\"urls\": [\"stun:stun1.l.google.com:19302\",\"stun:stun1.l.google.com:19302\"]}] }"
|
"peerConnectionOptions": "{\"iceServers\": [{\"urls\": [\"stun:stun1.l.google.com:19302\",\"stun:stun2.l.google.com:19302\",\"stun:stun3.l.google.com:19302\",\"stun:stun4.l.google.com:19302\"]},{\"urls\":[\"turn:13.250.13.83:3478?transport=udp\"],\"username\":\"YzYNCouZM1mhqhmseWk6\",\"credential\":\"YzYNCouZM1mhqhmseWk6\"},{\"urls\": [\"turn:192.158.29.39:3478?transport=tcp\"],\"credential\": \"JZEOEt2V3Qb0y27GRntt2u2PAYA=\",\"username\": \"28224511:1379330808\"}]}"
|
||||||
|
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,54 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: 'Inter';
|
||||||
|
src:
|
||||||
|
url('./inter-v12-latin_cyrillic-regular.woff2') format('woff2'),
|
||||||
|
url('./inter-v12-latin_cyrillic-regular.woff') format('woff');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Inter';
|
||||||
|
src:
|
||||||
|
url('./inter-v12-latin_cyrillic-300.woff2') format('woff2'),
|
||||||
|
url('./inter-v12-latin_cyrillic-300.woff') format('woff');
|
||||||
|
font-weight: 300;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Inter';
|
||||||
|
src:
|
||||||
|
url('./inter-v12-latin_cyrillic-500.woff2') format('woff2'),
|
||||||
|
url('./inter-v12-latin_cyrillic-500.woff') format('woff');
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Inter';
|
||||||
|
src:
|
||||||
|
url('./inter-v12-latin_cyrillic-600.woff2') format('woff2'),
|
||||||
|
url('./inter-v12-latin_cyrillic-600.woff') format('woff');
|
||||||
|
font-weight: 600;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Inter';
|
||||||
|
src:
|
||||||
|
url('./inter-v12-latin_cyrillic-700.woff2') format('woff2'),
|
||||||
|
url('./inter-v12-latin_cyrillic-700.woff') format('woff');
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'GilroyWebRegular';
|
||||||
|
src: url('./Gilroy_Regular.woff'),
|
||||||
|
url('./Gilroy_Regular.woff2');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 2.5 KiB |
+23
-9
@@ -12,8 +12,9 @@
|
|||||||
"express": "^4.16.2",
|
"express": "^4.16.2",
|
||||||
"express-session": "^1.15.6",
|
"express-session": "^1.15.6",
|
||||||
"helmet": "^3.21.3",
|
"helmet": "^3.21.3",
|
||||||
"passport": "^0.6.0",
|
"passport": "^0.4.0",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
|
"run-script-os": "^1.1.6",
|
||||||
"ws": "^7.1.2",
|
"ws": "^7.1.2",
|
||||||
"y18n": "^5.0.5",
|
"y18n": "^5.0.5",
|
||||||
"yargs": "^15.3.0"
|
"yargs": "^15.3.0"
|
||||||
@@ -676,13 +677,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/passport": {
|
"node_modules/passport": {
|
||||||
"version": "0.6.0",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
|
||||||
"integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
|
"integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"passport-strategy": "1.x.x",
|
"passport-strategy": "1.x.x",
|
||||||
"pause": "0.0.1",
|
"pause": "0.0.1"
|
||||||
"utils-merge": "^1.0.1"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4.0"
|
"node": ">= 0.4.0"
|
||||||
@@ -796,6 +796,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
||||||
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
||||||
},
|
},
|
||||||
|
"node_modules/run-script-os": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==",
|
||||||
|
"bin": {
|
||||||
|
"run-os": "index.js",
|
||||||
|
"run-script-os": "index.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/safe-buffer": {
|
"node_modules/safe-buffer": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
@@ -1526,9 +1535,9 @@
|
|||||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||||
},
|
},
|
||||||
"passport": {
|
"passport": {
|
||||||
"version": "0.6.0",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
|
||||||
"integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
|
"integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"passport-strategy": "1.x.x",
|
"passport-strategy": "1.x.x",
|
||||||
"pause": "0.0.1"
|
"pause": "0.0.1"
|
||||||
@@ -1612,6 +1621,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
||||||
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
||||||
},
|
},
|
||||||
|
"run-script-os": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw=="
|
||||||
|
},
|
||||||
"safe-buffer": {
|
"safe-buffer": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
|
|||||||
@@ -4,11 +4,13 @@
|
|||||||
* Class definitions
|
* Class definitions
|
||||||
* TODO: Move these to seperate files once we introduce a bundler
|
* TODO: Move these to seperate files once we introduce a bundler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
class TwoWayMap {
|
class TwoWayMap {
|
||||||
constructor(map = {}) {
|
constructor(map = {}) {
|
||||||
this.map = map;
|
this.map = map;
|
||||||
this.reverseMap = new Map();
|
this.reverseMap = new Map();
|
||||||
for(const key in map) {
|
for (const key in map) {
|
||||||
const value = map[key];
|
const value = map[key];
|
||||||
this.reverseMap[value] = key;
|
this.reverseMap[value] = key;
|
||||||
}
|
}
|
||||||
@@ -27,6 +29,51 @@ class TwoWayMap {
|
|||||||
delete this.reverseMap[value];
|
delete this.reverseMap[value];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// afk
|
||||||
|
const get_time_in_seconds = () => {
|
||||||
|
return new Date().getTime() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
let lastInputTime
|
||||||
|
let lastInputSendTime = 0
|
||||||
|
let inputSendTimeout = 3
|
||||||
|
let cirrusWebsocket = null
|
||||||
|
let lastOtherPlayerInput = get_time_in_seconds()
|
||||||
|
|
||||||
|
function getOveralLastPlayerInput() {
|
||||||
|
return lastOtherPlayerInput
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLastInputTime() {
|
||||||
|
lastInputTime = get_time_in_seconds()
|
||||||
|
}
|
||||||
|
updateLastInputTime()
|
||||||
|
|
||||||
|
function updateLastOtherPlayerInput() {
|
||||||
|
//console.log('last player input')
|
||||||
|
lastOtherPlayerInput = get_time_in_seconds()
|
||||||
|
}
|
||||||
|
|
||||||
|
const check_input = () => {
|
||||||
|
//console.log('time from last input: ', get_time_in_seconds() - getOveralLastPlayerInput())
|
||||||
|
if (!cirrusWebsocket)
|
||||||
|
return
|
||||||
|
if (lastInputSendTime == lastInputTime) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ((get_time_in_seconds() - lastInputSendTime) > inputSendTimeout) {
|
||||||
|
lastInputSendTime = lastInputTime
|
||||||
|
cirrusWebsocket.send(JSON.stringify({type:"playerInput"}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const start_check_input = () => {
|
||||||
|
check_input()
|
||||||
|
setTimeout(() => start_check_input(), 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
start_check_input()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frontend logic
|
* Frontend logic
|
||||||
@@ -76,7 +123,7 @@ let freezeFrame = {
|
|||||||
let file = {
|
let file = {
|
||||||
mimetype: "",
|
mimetype: "",
|
||||||
extension: "",
|
extension: "",
|
||||||
receiving: false,
|
receiving: false,
|
||||||
size: 0,
|
size: 0,
|
||||||
data: [],
|
data: [],
|
||||||
valid: false,
|
valid: false,
|
||||||
@@ -85,7 +132,7 @@ let file = {
|
|||||||
|
|
||||||
// Optionally detect if the user is not interacting (AFK) and disconnect them.
|
// Optionally detect if the user is not interacting (AFK) and disconnect them.
|
||||||
let afk = {
|
let afk = {
|
||||||
enabled: false, // Set to true to enable the AFK system.
|
enabled: true, // Set to true to enable the AFK system.
|
||||||
warnTimeout: 120, // The time to elapse before warning the user they are inactive.
|
warnTimeout: 120, // The time to elapse before warning the user they are inactive.
|
||||||
closeTimeout: 10, // The time after the warning when we disconnect the user.
|
closeTimeout: 10, // The time after the warning when we disconnect the user.
|
||||||
|
|
||||||
@@ -329,7 +376,7 @@ function registerMessageHandlers() {
|
|||||||
registerMessageHandler(MessageDirection.ToStreamer, "StopStreaming", sendMessageToStreamer);
|
registerMessageHandler(MessageDirection.ToStreamer, "StopStreaming", sendMessageToStreamer);
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "LatencyTest", sendMessageToStreamer);
|
registerMessageHandler(MessageDirection.ToStreamer, "LatencyTest", sendMessageToStreamer);
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "RequestInitialSettings", sendMessageToStreamer);
|
registerMessageHandler(MessageDirection.ToStreamer, "RequestInitialSettings", sendMessageToStreamer);
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "TestEcho", () => { /* Do nothing */});
|
registerMessageHandler(MessageDirection.ToStreamer, "TestEcho", () => { /* Do nothing */ });
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "UIInteraction", emitUIInteraction);
|
registerMessageHandler(MessageDirection.ToStreamer, "UIInteraction", emitUIInteraction);
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "Command", emitCommand);
|
registerMessageHandler(MessageDirection.ToStreamer, "Command", emitCommand);
|
||||||
registerMessageHandler(MessageDirection.ToStreamer, "KeyDown", sendMessageToStreamer);
|
registerMessageHandler(MessageDirection.ToStreamer, "KeyDown", sendMessageToStreamer);
|
||||||
@@ -470,7 +517,7 @@ function onProtocolMessage(data) {
|
|||||||
}
|
}
|
||||||
let direction = protocolJSON.Direction;
|
let direction = protocolJSON.Direction;
|
||||||
delete protocolJSON.Direction;
|
delete protocolJSON.Direction;
|
||||||
console.log(`Received new ${ direction == MessageDirection.FromStreamer ? "FromStreamer" : "ToStreamer" } protocol. Updating existing protocol...`);
|
console.log(`Received new ${direction == MessageDirection.FromStreamer ? "FromStreamer" : "ToStreamer"} protocol. Updating existing protocol...`);
|
||||||
Object.keys(protocolJSON).forEach((messageType) => {
|
Object.keys(protocolJSON).forEach((messageType) => {
|
||||||
let message = protocolJSON[messageType];
|
let message = protocolJSON[messageType];
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
@@ -482,7 +529,7 @@ function onProtocolMessage(data) {
|
|||||||
// return in a forEach is equivalent to a continue in a normal for loop
|
// return in a forEach is equivalent to a continue in a normal for loop
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message.byteLength > 0 && !message.hasOwnProperty("structure")) {
|
if (message.byteLength > 0 && !message.hasOwnProperty("structure")) {
|
||||||
// If we specify a bytelength, will must have a corresponding structure
|
// If we specify a bytelength, will must have a corresponding structure
|
||||||
console.error(`ToStreamer->${messageType} protocol definition was malformed as it specified a byteLength but no accompanying structure`);
|
console.error(`ToStreamer->${messageType} protocol definition was malformed as it specified a byteLength but no accompanying structure`);
|
||||||
// return in a forEach is equivalent to a continue in a normal for loop
|
// return in a forEach is equivalent to a continue in a normal for loop
|
||||||
@@ -632,72 +679,72 @@ function gamepadDisconnectHandler(e) {
|
|||||||
|
|
||||||
function fullscreen() {
|
function fullscreen() {
|
||||||
// if already full screen; exit
|
// if already full screen; exit
|
||||||
// else go fullscreen
|
// else go fullscreen
|
||||||
if (
|
if (
|
||||||
document.fullscreenElement ||
|
document.fullscreenElement ||
|
||||||
document.webkitFullscreenElement ||
|
document.webkitFullscreenElement ||
|
||||||
document.mozFullScreenElement ||
|
document.mozFullScreenElement ||
|
||||||
document.msFullscreenElement
|
document.msFullscreenElement
|
||||||
) {
|
) {
|
||||||
if (document.exitFullscreen) {
|
if (document.exitFullscreen) {
|
||||||
document.exitFullscreen();
|
document.exitFullscreen();
|
||||||
} else if (document.mozCancelFullScreen) {
|
} else if (document.mozCancelFullScreen) {
|
||||||
document.mozCancelFullScreen();
|
document.mozCancelFullScreen();
|
||||||
} else if (document.webkitExitFullscreen) {
|
} else if (document.webkitExitFullscreen) {
|
||||||
document.webkitExitFullscreen();
|
document.webkitExitFullscreen();
|
||||||
} else if (document.msExitFullscreen) {
|
} else if (document.msExitFullscreen) {
|
||||||
document.msExitFullscreen();
|
document.msExitFullscreen();
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
let element;
|
|
||||||
//HTML elements controls
|
|
||||||
if(!(document.fullscreenEnabled || document.webkitFullscreenEnabled)) {
|
|
||||||
// Chrome and FireFox on iOS can only fullscreen a <video>
|
|
||||||
element = document.getElementById("streamingVideo");
|
|
||||||
} else {
|
} else {
|
||||||
// Everywhere else can fullscreen a <div>
|
let element;
|
||||||
element = document.getElementById("playerUI");
|
//HTML elements controls
|
||||||
|
if (!(document.fullscreenEnabled || document.webkitFullscreenEnabled)) {
|
||||||
|
// Chrome and FireFox on iOS can only fullscreen a <video>
|
||||||
|
element = document.getElementById("streamingVideo");
|
||||||
|
} else {
|
||||||
|
// Everywhere else can fullscreen a <div>
|
||||||
|
element = document.getElementById("playerUI");
|
||||||
|
}
|
||||||
|
if (!element) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (element.requestFullscreen) {
|
||||||
|
element.requestFullscreen();
|
||||||
|
} else if (element.mozRequestFullScreen) {
|
||||||
|
element.mozRequestFullScreen();
|
||||||
|
} else if (element.webkitRequestFullscreen) {
|
||||||
|
element.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||||
|
} else if (element.msRequestFullscreen) {
|
||||||
|
element.msRequestFullscreen();
|
||||||
|
} else if (element.webkitEnterFullscreen) {
|
||||||
|
element.webkitEnterFullscreen(); //for iphone this code worked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!element) {
|
onFullscreenChange()
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (element.requestFullscreen) {
|
|
||||||
element.requestFullscreen();
|
|
||||||
} else if (element.mozRequestFullScreen) {
|
|
||||||
element.mozRequestFullScreen();
|
|
||||||
} else if (element.webkitRequestFullscreen) {
|
|
||||||
element.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
|
|
||||||
} else if (element.msRequestFullscreen) {
|
|
||||||
element.msRequestFullscreen();
|
|
||||||
} else if (element.webkitEnterFullscreen) {
|
|
||||||
element.webkitEnterFullscreen(); //for iphone this code worked
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onFullscreenChange()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function onFullscreenChange() {
|
function onFullscreenChange() {
|
||||||
isFullscreen = (document.webkitIsFullScreen
|
isFullscreen = (document.webkitIsFullScreen
|
||||||
|| document.mozFullScreen
|
|| document.mozFullScreen
|
||||||
|| (document.msFullscreenElement && document.msFullscreenElement !== null)
|
|| (document.msFullscreenElement && document.msFullscreenElement !== null)
|
||||||
|| (document.fullscreenElement && document.fullscreenElement !== null));
|
|| (document.fullscreenElement && document.fullscreenElement !== null));
|
||||||
|
|
||||||
let minimize = document.getElementById('minimize');
|
let minimize = document.getElementById('minimize');
|
||||||
let maximize = document.getElementById('maximize');
|
let maximize = document.getElementById('maximize');
|
||||||
if(minimize && maximize){
|
if (minimize && maximize) {
|
||||||
if(isFullscreen) {
|
if (isFullscreen) {
|
||||||
minimize.style.display = 'inline';
|
minimize.style.display = 'inline';
|
||||||
maximize.style.display = 'none';
|
maximize.style.display = 'none';
|
||||||
} else {
|
} else {
|
||||||
minimize.style.display = 'none';
|
minimize.style.display = 'none';
|
||||||
maximize.style.display = 'inline';
|
maximize.style.display = 'inline';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseURLParams() {
|
function parseURLParams() {
|
||||||
let urlParams = new URLSearchParams(window.location.search);
|
let urlParams = new URLSearchParams(window.location.search);
|
||||||
inputOptions.controlScheme = (urlParams.has('hoveringMouse') ? ControlSchemeType.HoveringMouse : ControlSchemeType.LockedMouse);
|
inputOptions.controlScheme = (urlParams.has('hoveringMouse') ? ControlSchemeType.HoveringMouse : ControlSchemeType.HoveringMouse);
|
||||||
let schemeToggle = document.getElementById("control-scheme-text");
|
let schemeToggle = document.getElementById("control-scheme-text");
|
||||||
switch (inputOptions.controlScheme) {
|
switch (inputOptions.controlScheme) {
|
||||||
case ControlSchemeType.HoveringMouse:
|
case ControlSchemeType.HoveringMouse:
|
||||||
@@ -712,12 +759,12 @@ function parseURLParams() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(urlParams.has('noWatermark')) {
|
if (urlParams.has('noWatermark')) {
|
||||||
let watermark = document.getElementById("unrealengine");
|
let watermark = document.getElementById("unrealengine");
|
||||||
watermark.style.display = 'none';
|
watermark.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
inputOptions.hideBrowserCursor = (urlParams.has('hideBrowserCursor') ? true : false);
|
inputOptions.hideBrowserCursor = (urlParams.has('hideBrowserCursor') ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -754,21 +801,21 @@ function setupHtmlEvents() {
|
|||||||
|
|
||||||
let resizeCheckBox = document.getElementById('enlarge-display-to-fill-window-tgl');
|
let resizeCheckBox = document.getElementById('enlarge-display-to-fill-window-tgl');
|
||||||
if (resizeCheckBox !== null) {
|
if (resizeCheckBox !== null) {
|
||||||
resizeCheckBox.onchange = function(event) {
|
resizeCheckBox.onchange = function (event) {
|
||||||
resizePlayerStyle();
|
resizePlayerStyle();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
qualityControlOwnershipCheckBox = document.getElementById('quality-control-ownership-tgl');
|
qualityControlOwnershipCheckBox = document.getElementById('quality-control-ownership-tgl');
|
||||||
if (qualityControlOwnershipCheckBox !== null) {
|
if (qualityControlOwnershipCheckBox !== null) {
|
||||||
qualityControlOwnershipCheckBox.onchange = function(event) {
|
qualityControlOwnershipCheckBox.onchange = function (event) {
|
||||||
requestQualityControl();
|
requestQualityControl();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let encoderParamsSubmit = document.getElementById('encoder-params-submit');
|
let encoderParamsSubmit = document.getElementById('encoder-params-submit');
|
||||||
if (encoderParamsSubmit !== null) {
|
if (encoderParamsSubmit !== null) {
|
||||||
encoderParamsSubmit.onclick = function(event) {
|
encoderParamsSubmit.onclick = function (event) {
|
||||||
|
|
||||||
let minQP = document.getElementById('encoder-min-qp-text').value;
|
let minQP = document.getElementById('encoder-min-qp-text').value;
|
||||||
let maxQP = document.getElementById('encoder-max-qp-text').value;
|
let maxQP = document.getElementById('encoder-max-qp-text').value;
|
||||||
@@ -780,7 +827,7 @@ function setupHtmlEvents() {
|
|||||||
|
|
||||||
let webrtcParamsSubmit = document.getElementById('webrtc-params-submit');
|
let webrtcParamsSubmit = document.getElementById('webrtc-params-submit');
|
||||||
if (webrtcParamsSubmit !== null) {
|
if (webrtcParamsSubmit !== null) {
|
||||||
webrtcParamsSubmit.onclick = function(event) {
|
webrtcParamsSubmit.onclick = function (event) {
|
||||||
let FPS = document.getElementById('webrtc-fps-text').value;
|
let FPS = document.getElementById('webrtc-fps-text').value;
|
||||||
let minBitrate = document.getElementById('webrtc-min-bitrate-text').value * 1000;
|
let minBitrate = document.getElementById('webrtc-min-bitrate-text').value * 1000;
|
||||||
let maxBitrate = document.getElementById('webrtc-max-bitrate-text').value * 1000;
|
let maxBitrate = document.getElementById('webrtc-max-bitrate-text').value * 1000;
|
||||||
@@ -822,7 +869,7 @@ function setupHtmlEvents() {
|
|||||||
|
|
||||||
let statsCheckBox = document.getElementById('show-stats-tgl');
|
let statsCheckBox = document.getElementById('show-stats-tgl');
|
||||||
if (statsCheckBox !== null) {
|
if (statsCheckBox !== null) {
|
||||||
statsCheckBox.onchange = function(event) {
|
statsCheckBox.onchange = function (event) {
|
||||||
let stats = document.getElementById('statsContainer');
|
let stats = document.getElementById('statsContainer');
|
||||||
stats.style.display = event.target.checked ? "block" : "none";
|
stats.style.display = event.target.checked ? "block" : "none";
|
||||||
};
|
};
|
||||||
@@ -836,19 +883,22 @@ function setupHtmlEvents() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup toggle and pair with some URL query string param.
|
// Setup toggle and pair with some URL query string param.
|
||||||
setupToggleWithUrlParams("prefer-sfu-tgl", "preferSFU");
|
//setupToggleWithUrlParams("prefer-sfu-tgl", "preferSFU");
|
||||||
setupToggleWithUrlParams("use-mic-tgl", "useMic");
|
setupToggleWithUrlParams("use-mic-tgl", "useMic");
|
||||||
setupToggleWithUrlParams("force-turn-tgl", "ForceTURN");
|
setupToggleWithUrlParams("force-turn-tgl", "ForceTURN");
|
||||||
setupToggleWithUrlParams("force-mono-tgl", "ForceMonoAudio");
|
setupToggleWithUrlParams("force-mono-tgl", "ForceMonoAudio");
|
||||||
setupToggleWithUrlParams("control-tgl", "hoveringMouse");
|
setupToggleWithUrlParams("control-tgl", "hoveringMouse");
|
||||||
setupToggleWithUrlParams("cursor-tgl", "hideBrowserCursor");
|
setupToggleWithUrlParams("control-tgl", "hoveringMouse");
|
||||||
setupToggleWithUrlParams("offer-receive-tgl", "offerToReceive");
|
setupToggleWithUrlParams("offer-receive-tgl", "offerToReceive");
|
||||||
|
setupToggleWithUrlParams("cursor-tgl", "hideBrowserCursor");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var streamSelector = document.getElementById('stream-select');
|
var streamSelector = document.getElementById('stream-select');
|
||||||
var trackSelector = document.getElementById('track-select');
|
var trackSelector = document.getElementById('track-select');
|
||||||
if (streamSelector) {
|
if (streamSelector) {
|
||||||
streamSelector.onchange = function(event) {
|
streamSelector.onchange = function (event) {
|
||||||
const stream = webRtcPlayerObj.availableVideoStreams.get(streamSelector.value);
|
const stream = webRtcPlayerObj.availableVideoStreams.get(streamSelector.value);
|
||||||
webRtcPlayerObj.video.srcObject = stream;
|
webRtcPlayerObj.video.srcObject = stream;
|
||||||
streamTrackSource = stream;
|
streamTrackSource = stream;
|
||||||
@@ -857,7 +907,7 @@ function setupHtmlEvents() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (trackSelector) {
|
if (trackSelector) {
|
||||||
trackSelector.onchange = function(event) {
|
trackSelector.onchange = function (event) {
|
||||||
if (!streamTrackSource) {
|
if (!streamTrackSource) {
|
||||||
streamTrackSource = webRtcPlayerObj.availableVideoStreams.get(streamSelector.value);
|
streamTrackSource = webRtcPlayerObj.availableVideoStreams.get(streamSelector.value);
|
||||||
}
|
}
|
||||||
@@ -876,9 +926,9 @@ function setupHtmlEvents() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupToggleWithUrlParams(toggleId, urlParameterKey){
|
function setupToggleWithUrlParams(toggleId, urlParameterKey) {
|
||||||
let toggleElem = document.getElementById(toggleId);
|
let toggleElem = document.getElementById(toggleId);
|
||||||
if(toggleElem) {
|
if (toggleElem) {
|
||||||
toggleElem.checked = new URLSearchParams(window.location.search).has(urlParameterKey);
|
toggleElem.checked = new URLSearchParams(window.location.search).has(urlParameterKey);
|
||||||
toggleElem.addEventListener('change', (event) => {
|
toggleElem.addEventListener('change', (event) => {
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
@@ -942,7 +992,7 @@ function sendStartLatencyTest() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let onTestStarted = function(StartTimeMs) {
|
let onTestStarted = function (StartTimeMs) {
|
||||||
let descriptor = {
|
let descriptor = {
|
||||||
StartTime: StartTimeMs
|
StartTime: StartTimeMs
|
||||||
};
|
};
|
||||||
@@ -987,8 +1037,28 @@ function setOverlay(htmlClass, htmlElement, onClickFunction) {
|
|||||||
|
|
||||||
function showConnectOverlay() {
|
function showConnectOverlay() {
|
||||||
let startText = document.createElement('div');
|
let startText = document.createElement('div');
|
||||||
startText.id = 'playButton';
|
startText.id = 'container'
|
||||||
startText.innerHTML = 'Click to start'.toUpperCase();
|
let title = document.createElement('h2')
|
||||||
|
title.id = "title"
|
||||||
|
title.innerHTML = 'Демонстрация начата'
|
||||||
|
let caption = document.createElement('p')
|
||||||
|
caption.id = 'caption'
|
||||||
|
caption.innerHTML = 'Нажмите, чтобы продолжить'
|
||||||
|
let headerContainer = document.createElement('div')
|
||||||
|
headerContainer.appendChild(title)
|
||||||
|
headerContainer.appendChild(caption)
|
||||||
|
startText.appendChild(headerContainer)
|
||||||
|
let playButton = document.createElement('img')
|
||||||
|
playButton.id = 'playButton'
|
||||||
|
playButton.src = './images/Play.png'
|
||||||
|
startText.appendChild(playButton)
|
||||||
|
let buttonBack = document.createElement('a')
|
||||||
|
let captionBack = document.createElement('div')
|
||||||
|
captionBack.innerHTML = 'Выбор жилого комплекса'
|
||||||
|
buttonBack.appendChild(captionBack)
|
||||||
|
buttonBack.id = 'link'
|
||||||
|
buttonBack.href = 'https://stream.graff.tech/'
|
||||||
|
startText.appendChild(buttonBack)
|
||||||
|
|
||||||
setOverlay('clickableState', startText, event => {
|
setOverlay('clickableState', startText, event => {
|
||||||
connect();
|
connect();
|
||||||
@@ -996,6 +1066,13 @@ function showConnectOverlay() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showLoader() {
|
||||||
|
let loader = document.createElement('span')
|
||||||
|
loader.id = 'loader'
|
||||||
|
setOverlay('textDisplayState', loader)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function showTextOverlay(text) {
|
function showTextOverlay(text) {
|
||||||
let textOverlay = document.createElement('div');
|
let textOverlay = document.createElement('div');
|
||||||
textOverlay.id = 'messageOverlay';
|
textOverlay.id = 'messageOverlay';
|
||||||
@@ -1004,8 +1081,8 @@ function showTextOverlay(text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function playStream() {
|
function playStream() {
|
||||||
if(webRtcPlayerObj && webRtcPlayerObj.video) {
|
if (webRtcPlayerObj && webRtcPlayerObj.video) {
|
||||||
if(webRtcPlayerObj.audio.srcObject && autoPlayAudio) {
|
if (webRtcPlayerObj.audio.srcObject && autoPlayAudio) {
|
||||||
// Video and Audio are seperate tracks
|
// Video and Audio are seperate tracks
|
||||||
webRtcPlayerObj.audio.play().then(() => {
|
webRtcPlayerObj.audio.play().then(() => {
|
||||||
// audio play has succeeded, start playing video
|
// audio play has succeeded, start playing video
|
||||||
@@ -1026,7 +1103,7 @@ function playStream() {
|
|||||||
|
|
||||||
function playVideo() {
|
function playVideo() {
|
||||||
webRtcPlayerObj.video.play().catch((onRejectedReason) => {
|
webRtcPlayerObj.video.play().catch((onRejectedReason) => {
|
||||||
if(webRtcPlayerObj.audio.srcObject) {
|
if (webRtcPlayerObj.audio.srcObject) {
|
||||||
webRtcPlayerObj.audio.stop();
|
webRtcPlayerObj.audio.stop();
|
||||||
}
|
}
|
||||||
console.error(onRejectedReason);
|
console.error(onRejectedReason);
|
||||||
@@ -1038,7 +1115,7 @@ function playVideo() {
|
|||||||
function showPlayOverlay() {
|
function showPlayOverlay() {
|
||||||
let img = document.createElement('img');
|
let img = document.createElement('img');
|
||||||
img.id = 'playButton';
|
img.id = 'playButton';
|
||||||
img.src = '/images/Play.png';
|
img.src = './images/Play.png';
|
||||||
img.alt = 'Start Streaming';
|
img.alt = 'Start Streaming';
|
||||||
setOverlay('clickableState', img, event => {
|
setOverlay('clickableState', img, event => {
|
||||||
playStream();
|
playStream();
|
||||||
@@ -1071,7 +1148,7 @@ function showAfkOverlay() {
|
|||||||
document.exitPointerLock();
|
document.exitPointerLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
afk.countdownTimer = setInterval(function() {
|
afk.countdownTimer = setInterval(function () {
|
||||||
afk.countdown--;
|
afk.countdown--;
|
||||||
if (afk.countdown == 0) {
|
if (afk.countdown == 0) {
|
||||||
// The user failed to click so disconnect them.
|
// The user failed to click so disconnect them.
|
||||||
@@ -1110,9 +1187,10 @@ function resetAfkWarningTimer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createWebRtcOffer() {
|
function createWebRtcOffer() {
|
||||||
|
console.log('loaderLOADER')
|
||||||
if (webRtcPlayerObj) {
|
if (webRtcPlayerObj) {
|
||||||
console.log('Creating offer');
|
console.log('Creating offer');
|
||||||
showTextOverlay('Starting connection to server, please wait');
|
showLoader();
|
||||||
webRtcPlayerObj.createOffer();
|
webRtcPlayerObj.createOffer();
|
||||||
} else {
|
} else {
|
||||||
console.log('WebRTC player not setup, cannot create offer');
|
console.log('WebRTC player not setup, cannot create offer');
|
||||||
@@ -1122,6 +1200,7 @@ function createWebRtcOffer() {
|
|||||||
|
|
||||||
function sendInputData(data) {
|
function sendInputData(data) {
|
||||||
if (webRtcPlayerObj) {
|
if (webRtcPlayerObj) {
|
||||||
|
updateLastInputTime();
|
||||||
resetAfkWarningTimer();
|
resetAfkWarningTimer();
|
||||||
webRtcPlayerObj.send(data);
|
webRtcPlayerObj.send(data);
|
||||||
}
|
}
|
||||||
@@ -1290,7 +1369,7 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
htmlElement.appendChild(webRtcPlayerObj.audio);
|
htmlElement.appendChild(webRtcPlayerObj.audio);
|
||||||
htmlElement.appendChild(freezeFrameOverlay);
|
htmlElement.appendChild(freezeFrameOverlay);
|
||||||
|
|
||||||
webRtcPlayerObj.onWebRtcOffer = function(offer) {
|
webRtcPlayerObj.onWebRtcOffer = function (offer) {
|
||||||
if (ws && ws.readyState === WS_OPEN_STATE) {
|
if (ws && ws.readyState === WS_OPEN_STATE) {
|
||||||
let offerStr = JSON.stringify(offer);
|
let offerStr = JSON.stringify(offer);
|
||||||
console.log("%c[Outbound SS message (offer)]", "background: lightgreen; color: black", offer);
|
console.log("%c[Outbound SS message (offer)]", "background: lightgreen; color: black", offer);
|
||||||
@@ -1298,7 +1377,7 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
webRtcPlayerObj.onWebRtcCandidate = function(candidate) {
|
webRtcPlayerObj.onWebRtcCandidate = function (candidate) {
|
||||||
if (ws && ws.readyState === WS_OPEN_STATE) {
|
if (ws && ws.readyState === WS_OPEN_STATE) {
|
||||||
ws.send(JSON.stringify({
|
ws.send(JSON.stringify({
|
||||||
type: 'iceCandidate',
|
type: 'iceCandidate',
|
||||||
@@ -1322,7 +1401,7 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
webRtcPlayerObj.onSFURecvDataChannelReady = function() {
|
webRtcPlayerObj.onSFURecvDataChannelReady = function () {
|
||||||
if (webRtcPlayerObj.sfu) {
|
if (webRtcPlayerObj.sfu) {
|
||||||
// Send SFU a message to let it know browser data channels are ready
|
// Send SFU a message to let it know browser data channels are ready
|
||||||
const requestMsg = { type: "peerDataChannelsReady" };
|
const requestMsg = { type: "peerDataChannelsReady" };
|
||||||
@@ -1331,7 +1410,7 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
webRtcPlayerObj.onVideoInitialised = function() {
|
webRtcPlayerObj.onVideoInitialised = function () {
|
||||||
if (ws && ws.readyState === WS_OPEN_STATE) {
|
if (ws && ws.readyState === WS_OPEN_STATE) {
|
||||||
if (shouldShowPlayOverlay) {
|
if (shouldShowPlayOverlay) {
|
||||||
showPlayOverlay();
|
showPlayOverlay();
|
||||||
@@ -1351,7 +1430,7 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
updateStreamList();
|
updateStreamList();
|
||||||
}
|
}
|
||||||
|
|
||||||
webRtcPlayerObj.onDataChannelMessage = function(data) {
|
webRtcPlayerObj.onDataChannelMessage = function (data) {
|
||||||
let view = new Uint8Array(data);
|
let view = new Uint8Array(data);
|
||||||
try {
|
try {
|
||||||
let messageType = fromStreamerMessages.getFromValue(view[0]);
|
let messageType = fromStreamerMessages.getFromValue(view[0]);
|
||||||
@@ -1375,8 +1454,8 @@ function setupWebRtcPlayer(htmlElement, config) {
|
|||||||
return webRtcPlayerObj.video;
|
return webRtcPlayerObj.video;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupStats(){
|
function setupStats() {
|
||||||
webRtcPlayerObj.aggregateStats(1 * 1000 /*Check every 1 second*/ );
|
webRtcPlayerObj.aggregateStats(1 * 1000 /*Check every 1 second*/);
|
||||||
|
|
||||||
let printInterval = 5 * 60 * 1000; /*Print every 5 minutes*/
|
let printInterval = 5 * 60 * 1000; /*Print every 5 minutes*/
|
||||||
let nextPrintDuration = printInterval;
|
let nextPrintDuration = printInterval;
|
||||||
@@ -1416,14 +1495,14 @@ function setupStats(){
|
|||||||
|
|
||||||
let qualityStatus = document.getElementById("connectionStrength");
|
let qualityStatus = document.getElementById("connectionStrength");
|
||||||
// "blinks" quality status element for 1 sec by making it transparent, speed = number of blinks
|
// "blinks" quality status element for 1 sec by making it transparent, speed = number of blinks
|
||||||
let blinkQualityStatus = function(speed) {
|
let blinkQualityStatus = function (speed) {
|
||||||
let iter = speed;
|
let iter = speed;
|
||||||
let opacity = 1; // [0..1]
|
let opacity = 1; // [0..1]
|
||||||
let tickId = setInterval(
|
let tickId = setInterval(
|
||||||
function() {
|
function () {
|
||||||
opacity -= 0.1;
|
opacity -= 0.1;
|
||||||
// map `opacity` to [-0.5..0.5] range, decrement by 0.2 per step and take `abs` to make it blink: 1 -> 0 -> 1
|
// map `opacity` to [-0.5..0.5] range, decrement by 0.2 per step and take `abs` to make it blink: 1 -> 0 -> 1
|
||||||
qualityStatus.style.opacity = `${Math.abs((opacity - 0.5) * 2)}`;
|
qualityStatus.style.opacity = `${Math.abs((opacity - 0.5) * 2)}`;
|
||||||
if (opacity <= 0.1) {
|
if (opacity <= 0.1) {
|
||||||
if (--iter == 0) {
|
if (--iter == 0) {
|
||||||
clearInterval(tickId);
|
clearInterval(tickId);
|
||||||
@@ -1479,11 +1558,10 @@ function setupStats(){
|
|||||||
|
|
||||||
statsText += `<div>Duration: ${timeFormat.format(runTimeHours)}:${timeFormat.format(runTimeMinutes)}:${timeFormat.format(runTimeSeconds)}</div>`;
|
statsText += `<div>Duration: ${timeFormat.format(runTimeHours)}:${timeFormat.format(runTimeMinutes)}:${timeFormat.format(runTimeSeconds)}</div>`;
|
||||||
statsText += `<div>Controls stream input: ${inputController === null ? "Not sent yet" : (inputController ? "true" : "false")}</div>`;
|
statsText += `<div>Controls stream input: ${inputController === null ? "Not sent yet" : (inputController ? "true" : "false")}</div>`;
|
||||||
statsText += `<div>Audio codec: ${aggregatedStats.hasOwnProperty('audioCodec') ? aggregatedStats.audioCodec : "Not set" }</div>`;
|
statsText += `<div>Audio codec: ${aggregatedStats.hasOwnProperty('audioCodec') ? aggregatedStats.audioCodec : "Not set"}</div>`;
|
||||||
statsText += `<div>Video codec: ${aggregatedStats.hasOwnProperty('videoCodec') ? aggregatedStats.videoCodec : "Not set" }</div>`;
|
statsText += `<div>Video codec: ${aggregatedStats.hasOwnProperty('videoCodec') ? aggregatedStats.videoCodec : "Not set"}</div>`;
|
||||||
statsText += `<div>Video Resolution: ${
|
statsText += `<div>Video Resolution: ${aggregatedStats.hasOwnProperty('frameWidth') && aggregatedStats.frameWidth && aggregatedStats.hasOwnProperty('frameHeight') && aggregatedStats.frameHeight ?
|
||||||
aggregatedStats.hasOwnProperty('frameWidth') && aggregatedStats.frameWidth && aggregatedStats.hasOwnProperty('frameHeight') && aggregatedStats.frameHeight ?
|
aggregatedStats.frameWidth + 'x' + aggregatedStats.frameHeight : 'Chrome only'
|
||||||
aggregatedStats.frameWidth + 'x' + aggregatedStats.frameHeight : 'Chrome only'
|
|
||||||
}</div>`;
|
}</div>`;
|
||||||
statsText += `<div>Received (${receivedBytesMeasurement}): ${numberFormat.format(receivedBytes)}</div>`;
|
statsText += `<div>Received (${receivedBytesMeasurement}): ${numberFormat.format(receivedBytes)}</div>`;
|
||||||
statsText += `<div>Frames Decoded: ${aggregatedStats.hasOwnProperty('framesDecoded') ? numberFormat.format(aggregatedStats.framesDecoded) : 'Chrome only'}</div>`;
|
statsText += `<div>Frames Decoded: ${aggregatedStats.hasOwnProperty('framesDecoded') ? numberFormat.format(aggregatedStats.framesDecoded) : 'Chrome only'}</div>`;
|
||||||
@@ -1515,7 +1593,7 @@ function setupStats(){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
webRtcPlayerObj.latencyTestTimings.OnAllLatencyTimingsReady = function(timings) {
|
webRtcPlayerObj.latencyTestTimings.OnAllLatencyTimingsReady = function (timings) {
|
||||||
|
|
||||||
if (!timings.BrowserReceiptTimeMs) {
|
if (!timings.BrowserReceiptTimeMs) {
|
||||||
return;
|
return;
|
||||||
@@ -1550,6 +1628,7 @@ function setupStats(){
|
|||||||
|
|
||||||
function onWebRtcOffer(webRTCData) {
|
function onWebRtcOffer(webRTCData) {
|
||||||
webRtcPlayerObj.receiveOffer(webRTCData);
|
webRtcPlayerObj.receiveOffer(webRTCData);
|
||||||
|
showLoader
|
||||||
setupStats();
|
setupStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1563,7 +1642,7 @@ function onWebRtcSFUPeerDatachannels(webRTCData) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onWebRtcIce(iceCandidate) {
|
function onWebRtcIce(iceCandidate) {
|
||||||
if (webRtcPlayerObj){
|
if (webRtcPlayerObj) {
|
||||||
webRtcPlayerObj.handleCandidateFromServer(iceCandidate);
|
webRtcPlayerObj.handleCandidateFromServer(iceCandidate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1600,7 +1679,7 @@ let inputOptions = {
|
|||||||
// user drags with their mouse. We may perform the reverse; a single finger
|
// user drags with their mouse. We may perform the reverse; a single finger
|
||||||
// touch may be converted into a mouse drag UE side. This allows a
|
// touch may be converted into a mouse drag UE side. This allows a
|
||||||
// non-touch application to be controlled partially via a touch device.
|
// non-touch application to be controlled partially via a touch device.
|
||||||
fakeMouseWithTouches: false,
|
fakeMouseWithTouches: true,
|
||||||
|
|
||||||
// Hiding the browser cursor enables the use of UE's inbuilt software cursor,
|
// Hiding the browser cursor enables the use of UE's inbuilt software cursor,
|
||||||
// without having the browser cursor display on top
|
// without having the browser cursor display on top
|
||||||
@@ -1689,7 +1768,7 @@ function invalidateFreezeFrameOverlay() {
|
|||||||
freezeFrame.valid = false;
|
freezeFrame.valid = false;
|
||||||
freezeFrameOverlay.classList.remove("freezeframeBackground");
|
freezeFrameOverlay.classList.remove("freezeframeBackground");
|
||||||
}, freezeFrameDelay);
|
}, freezeFrameDelay);
|
||||||
|
|
||||||
if (webRtcPlayerObj) {
|
if (webRtcPlayerObj) {
|
||||||
webRtcPlayerObj.setVideoEnabled(true);
|
webRtcPlayerObj.setVideoEnabled(true);
|
||||||
}
|
}
|
||||||
@@ -1796,7 +1875,7 @@ function updateVideoStreamSize() {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let descriptor = {
|
let descriptor = {
|
||||||
"Resolution.Width": playerElement.clientWidth,
|
"Resolution.Width": playerElement.clientWidth,
|
||||||
"Resolution.Height": playerElement.clientHeight
|
"Resolution.Height": playerElement.clientHeight
|
||||||
};
|
};
|
||||||
emitCommand(descriptor);
|
emitCommand(descriptor);
|
||||||
@@ -1815,14 +1894,14 @@ let _orientationChangeTimeout;
|
|||||||
|
|
||||||
function onOrientationChange(event) {
|
function onOrientationChange(event) {
|
||||||
clearTimeout(_orientationChangeTimeout);
|
clearTimeout(_orientationChangeTimeout);
|
||||||
_orientationChangeTimeout = setTimeout(function() {
|
_orientationChangeTimeout = setTimeout(function () {
|
||||||
resizePlayerStyle();
|
resizePlayerStyle();
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendMessageToStreamer(messageType, indata = []) {
|
function sendMessageToStreamer(messageType, indata = []) {
|
||||||
messageFormat = toStreamerMessages.getFromKey(messageType);
|
messageFormat = toStreamerMessages.getFromKey(messageType);
|
||||||
if(messageFormat === undefined) {
|
if (messageFormat === undefined) {
|
||||||
console.error(`Attempted to send a message to the streamer with message type: ${messageType}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);
|
console.error(`Attempted to send a message to the streamer with message type: ${messageType}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1864,7 +1943,7 @@ function emitDescriptor(messageType, descriptor) {
|
|||||||
// Convert the descriptor object into a JSON string.
|
// Convert the descriptor object into a JSON string.
|
||||||
let descriptorAsString = JSON.stringify(descriptor);
|
let descriptorAsString = JSON.stringify(descriptor);
|
||||||
let messageFormat = toStreamerMessages.getFromKey(messageType);
|
let messageFormat = toStreamerMessages.getFromKey(messageType);
|
||||||
if(messageFormat === undefined) {
|
if (messageFormat === undefined) {
|
||||||
console.error(`Attempted to emit descriptor with message type: ${messageType}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);
|
console.error(`Attempted to emit descriptor with message type: ${messageType}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);
|
||||||
}
|
}
|
||||||
// Add the UTF-16 JSON string to the array byte buffer, going two bytes at
|
// Add the UTF-16 JSON string to the array byte buffer, going two bytes at
|
||||||
@@ -2102,7 +2181,7 @@ function createOnScreenKeyboardHelpers(htmlElement) {
|
|||||||
// Hide the 'edit text' button.
|
// Hide the 'edit text' button.
|
||||||
editTextButton.classList.add('hiddenState');
|
editTextButton.classList.add('hiddenState');
|
||||||
|
|
||||||
editTextButton.addEventListener('click', function() {
|
editTextButton.addEventListener('click', function () {
|
||||||
// Show the on-screen keyboard.
|
// Show the on-screen keyboard.
|
||||||
hiddenInput.focus();
|
hiddenInput.focus();
|
||||||
});
|
});
|
||||||
@@ -2126,7 +2205,7 @@ function showOnScreenKeyboard(command) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function registerMouseEnterAndLeaveEvents(playerElement) {
|
function registerMouseEnterAndLeaveEvents(playerElement) {
|
||||||
playerElement.onmouseenter = function(e) {
|
playerElement.onmouseenter = function (e) {
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log('mouse enter');
|
console.log('mouse enter');
|
||||||
}
|
}
|
||||||
@@ -2134,7 +2213,7 @@ function registerMouseEnterAndLeaveEvents(playerElement) {
|
|||||||
playerElement.pressMouseButtons(e);
|
playerElement.pressMouseButtons(e);
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.onmouseleave = function(e) {
|
playerElement.onmouseleave = function (e) {
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log('mouse leave');
|
console.log('mouse leave');
|
||||||
}
|
}
|
||||||
@@ -2155,7 +2234,7 @@ function registerLockedMouseEvents(playerElement) {
|
|||||||
playerElement.requestPointerLock = playerElement.requestPointerLock || playerElement.mozRequestPointerLock;
|
playerElement.requestPointerLock = playerElement.requestPointerLock || playerElement.mozRequestPointerLock;
|
||||||
document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock;
|
document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock;
|
||||||
|
|
||||||
playerElement.onclick = function() {
|
playerElement.onclick = function () {
|
||||||
playerElement.requestPointerLock();
|
playerElement.requestPointerLock();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2221,11 +2300,11 @@ function registerLockedMouseEvents(playerElement) {
|
|||||||
toStreamerHandlers.MouseDown("MouseDouble", [e.button, coord.x, coord.y]);
|
toStreamerHandlers.MouseDown("MouseDouble", [e.button, coord.x, coord.y]);
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.pressMouseButtons = function(e) {
|
playerElement.pressMouseButtons = function (e) {
|
||||||
pressMouseButtons(e.buttons, x, y);
|
pressMouseButtons(e.buttons, x, y);
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.releaseMouseButtons = function(e) {
|
playerElement.releaseMouseButtons = function (e) {
|
||||||
releaseMouseButtons(e.buttons, x, y);
|
releaseMouseButtons(e.buttons, x, y);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -2277,11 +2356,11 @@ function registerHoveringMouseEvents(playerElement) {
|
|||||||
toStreamerHandlers.MouseDown("MouseDouble", [e.button, coord.x, coord.y]);
|
toStreamerHandlers.MouseDown("MouseDouble", [e.button, coord.x, coord.y]);
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.pressMouseButtons = function(e) {
|
playerElement.pressMouseButtons = function (e) {
|
||||||
pressMouseButtons(e.buttons, e.offsetX, e.offsetY);
|
pressMouseButtons(e.buttons, e.offsetX, e.offsetY);
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.releaseMouseButtons = function(e) {
|
playerElement.releaseMouseButtons = function (e) {
|
||||||
releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);
|
releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -2303,7 +2382,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
function forgetTouch(touch) {
|
function forgetTouch(touch) {
|
||||||
fingers.push(fingerIds[touch.identifier]);
|
fingers.push(fingerIds[touch.identifier]);
|
||||||
// Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop
|
// Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop
|
||||||
fingers.sort(function(a, b){return b - a});
|
fingers.sort(function (a, b) { return b - a });
|
||||||
delete fingerIds[touch.identifier];
|
delete fingerIds[touch.identifier];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2317,8 +2396,8 @@ function registerTouchEvents(playerElement) {
|
|||||||
console.log(`F${fingerIds[touch.identifier]}=(${x}, ${y})`);
|
console.log(`F${fingerIds[touch.identifier]}=(${x}, ${y})`);
|
||||||
}
|
}
|
||||||
let coord = normalizeAndQuantizeUnsigned(x, y);
|
let coord = normalizeAndQuantizeUnsigned(x, y);
|
||||||
|
|
||||||
switch(type) {
|
switch (type) {
|
||||||
case "TouchStart":
|
case "TouchStart":
|
||||||
toStreamerHandlers.TouchStart("TouchStart", [numTouches, coord.x, coord.y, fingerIds[touch.identifier], MaxByteValue * touch.force, coord.inRange ? 1 : 0]);
|
toStreamerHandlers.TouchStart("TouchStart", [numTouches, coord.x, coord.y, fingerIds[touch.identifier], MaxByteValue * touch.force, coord.inRange ? 1 : 0]);
|
||||||
break;
|
break;
|
||||||
@@ -2336,7 +2415,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
|
|
||||||
let finger = undefined;
|
let finger = undefined;
|
||||||
|
|
||||||
playerElement.ontouchstart = function(e) {
|
playerElement.ontouchstart = function (e) {
|
||||||
if (finger === undefined) {
|
if (finger === undefined) {
|
||||||
let firstTouch = e.changedTouches[0];
|
let firstTouch = e.changedTouches[0];
|
||||||
finger = {
|
finger = {
|
||||||
@@ -2354,7 +2433,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.ontouchend = function(e) {
|
playerElement.ontouchend = function (e) {
|
||||||
for (let t = 0; t < e.changedTouches.length; t++) {
|
for (let t = 0; t < e.changedTouches.length; t++) {
|
||||||
let touch = e.changedTouches[t];
|
let touch = e.changedTouches[t];
|
||||||
if (touch.identifier === finger.id) {
|
if (touch.identifier === finger.id) {
|
||||||
@@ -2371,7 +2450,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.ontouchmove = function(e) {
|
playerElement.ontouchmove = function (e) {
|
||||||
for (let t = 0; t < e.touches.length; t++) {
|
for (let t = 0; t < e.touches.length; t++) {
|
||||||
let touch = e.touches[t];
|
let touch = e.touches[t];
|
||||||
if (touch.identifier === finger.id) {
|
if (touch.identifier === finger.id) {
|
||||||
@@ -2388,7 +2467,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
playerElement.ontouchstart = function(e) {
|
playerElement.ontouchstart = function (e) {
|
||||||
// Assign a unique identifier to each touch.
|
// Assign a unique identifier to each touch.
|
||||||
for (let t = 0; t < e.changedTouches.length; t++) {
|
for (let t = 0; t < e.changedTouches.length; t++) {
|
||||||
rememberTouch(e.changedTouches[t]);
|
rememberTouch(e.changedTouches[t]);
|
||||||
@@ -2401,7 +2480,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.ontouchend = function(e) {
|
playerElement.ontouchend = function (e) {
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log('touch end');
|
console.log('touch end');
|
||||||
}
|
}
|
||||||
@@ -2414,7 +2493,7 @@ function registerTouchEvents(playerElement) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
playerElement.ontouchmove = function(e) {
|
playerElement.ontouchmove = function (e) {
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log('touch move');
|
console.log('touch move');
|
||||||
}
|
}
|
||||||
@@ -2556,9 +2635,9 @@ function getKeyCode(e) {
|
|||||||
|
|
||||||
// If we don't have keyCode property because browser API is deprecated then use KeyboardEvent.code instead.
|
// If we don't have keyCode property because browser API is deprecated then use KeyboardEvent.code instead.
|
||||||
// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value
|
// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value
|
||||||
if(!("keyCode" in e)) {
|
if (!("keyCode" in e)) {
|
||||||
// Convert KeyboardEvent.code string into integer-based key code for backwards compatibility reasons.
|
// Convert KeyboardEvent.code string into integer-based key code for backwards compatibility reasons.
|
||||||
if(e.code in CodeToKeyCode) {
|
if (e.code in CodeToKeyCode) {
|
||||||
return CodeToKeyCode[e.code];
|
return CodeToKeyCode[e.code];
|
||||||
} else {
|
} else {
|
||||||
console.warn(`Keyboard code of ${e.code} is not supported in our mapping, ignoring this key.`);
|
console.warn(`Keyboard code of ${e.code} is not supported in our mapping, ignoring this key.`);
|
||||||
@@ -2577,10 +2656,10 @@ function getKeyCode(e) {
|
|||||||
|
|
||||||
function registerKeyboardEvents() {
|
function registerKeyboardEvents() {
|
||||||
|
|
||||||
document.onkeydown = function(e) {
|
document.onkeydown = function (e) {
|
||||||
|
|
||||||
const keyCode = getKeyCode(e);
|
const keyCode = getKeyCode(e);
|
||||||
if(!keyCode) { return; }
|
if (!keyCode) { return; }
|
||||||
|
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log(`key down ${keyCode}, repeat = ${e.repeat}`);
|
console.log(`key down ${keyCode}, repeat = ${e.repeat}`);
|
||||||
@@ -2602,10 +2681,10 @@ function registerKeyboardEvents() {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
document.onkeyup = function(e) {
|
document.onkeyup = function (e) {
|
||||||
|
|
||||||
const keyCode = getKeyCode(e);
|
const keyCode = getKeyCode(e);
|
||||||
if(!keyCode) { return; }
|
if (!keyCode) { return; }
|
||||||
|
|
||||||
if (print_inputs) {
|
if (print_inputs) {
|
||||||
console.log(`key up ${keyCode}`);
|
console.log(`key up ${keyCode}`);
|
||||||
@@ -2618,8 +2697,8 @@ function registerKeyboardEvents() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
document.onkeypress = function(e){
|
document.onkeypress = function (e) {
|
||||||
if(!("charCode" in e)){
|
if (!("charCode" in e)) {
|
||||||
console.warn("KeyboardEvent.charCode is deprecated in this browser, cannot send key press.");
|
console.warn("KeyboardEvent.charCode is deprecated in this browser, cannot send key press.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2632,30 +2711,28 @@ function registerKeyboardEvents() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function settingsClicked( /* e */ ) {
|
function settingsClicked( /* e */) {
|
||||||
/**
|
/**
|
||||||
* Toggle settings panel. If stats panel is already open, close it and then open settings
|
* Toggle settings panel. If stats panel is already open, close it and then open settings
|
||||||
*/
|
*/
|
||||||
let settings = document.getElementById('settings-panel');
|
let settings = document.getElementById('settings-panel');
|
||||||
let stats = document.getElementById('stats-panel');
|
let stats = document.getElementById('stats-panel');
|
||||||
|
|
||||||
if(stats.classList.contains("panel-wrap-visible"))
|
if (stats.classList.contains("panel-wrap-visible")) {
|
||||||
{
|
|
||||||
stats.classList.toggle("panel-wrap-visible");
|
stats.classList.toggle("panel-wrap-visible");
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.classList.toggle("panel-wrap-visible");
|
settings.classList.toggle("panel-wrap-visible");
|
||||||
}
|
}
|
||||||
|
|
||||||
function statsClicked( /* e */ ) {
|
function statsClicked( /* e */) {
|
||||||
/**
|
/**
|
||||||
* Toggle stats panel. If settings panel is already open, close it and then open stats
|
* Toggle stats panel. If settings panel is already open, close it and then open stats
|
||||||
*/
|
*/
|
||||||
let settings = document.getElementById('settings-panel');
|
let settings = document.getElementById('settings-panel');
|
||||||
let stats = document.getElementById('stats-panel');
|
let stats = document.getElementById('stats-panel');
|
||||||
|
|
||||||
if(settings.classList.contains("panel-wrap-visible"))
|
if (settings.classList.contains("panel-wrap-visible")) {
|
||||||
{
|
|
||||||
settings.classList.toggle("panel-wrap-visible");
|
settings.classList.toggle("panel-wrap-visible");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2703,21 +2780,22 @@ function connect() {
|
|||||||
ws = new WebSocket(connectionUrl);
|
ws = new WebSocket(connectionUrl);
|
||||||
ws.attemptStreamReconnection = true;
|
ws.attemptStreamReconnection = true;
|
||||||
|
|
||||||
ws.onmessagebinary = function(event) {
|
ws.onmessagebinary = function (event) {
|
||||||
if(!event || !event.data) { return; }
|
if (!event || !event.data) { return; }
|
||||||
|
|
||||||
event.data.text().then(function(messageString){
|
event.data.text().then(function (messageString) {
|
||||||
// send the new stringified event back into `onmessage`
|
// send the new stringified event back into `onmessage`
|
||||||
ws.onmessage({ data: messageString });
|
ws.onmessage({ data: messageString });
|
||||||
}).catch(function(error){
|
}).catch(function (error) {
|
||||||
console.error(`Failed to parse binary blob from websocket, reason: ${error}`);
|
console.error(`Failed to parse binary blob from websocket, reason: ${error}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ws.onmessage = function(event) {
|
ws.onmessage = function (event) {
|
||||||
|
cirrusWebsocket = ws
|
||||||
|
|
||||||
// Check if websocket message is binary, if so, stringify it.
|
// Check if websocket message is binary, if so, stringify it.
|
||||||
if(event.data && event.data instanceof Blob) {
|
if (event.data && event.data instanceof Blob) {
|
||||||
ws.onmessagebinary(event);
|
ws.onmessagebinary(event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2738,36 +2816,38 @@ function connect() {
|
|||||||
onWebRtcAnswer(msg);
|
onWebRtcAnswer(msg);
|
||||||
} else if (msg.type === 'iceCandidate') {
|
} else if (msg.type === 'iceCandidate') {
|
||||||
onWebRtcIce(msg.candidate);
|
onWebRtcIce(msg.candidate);
|
||||||
} else if(msg.type === 'warning' && msg.warning) {
|
} else if (msg.type === 'warning' && msg.warning) {
|
||||||
console.warn(msg.warning);
|
console.warn(msg.warning);
|
||||||
} else if (msg.type === 'peerDataChannels') {
|
} else if (msg.type === 'peerDataChannels') {
|
||||||
onWebRtcSFUPeerDatachannels(msg);
|
onWebRtcSFUPeerDatachannels(msg);
|
||||||
|
} else if (msg.type === 'lastOtherPlayerInput') {
|
||||||
|
updateLastOtherPlayerInput();
|
||||||
} else {
|
} else {
|
||||||
console.error("Invalid SS message type", msg.type);
|
console.error("Invalid SS message type", msg.type);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onerror = function(event) {
|
ws.onerror = function (event) {
|
||||||
console.log(`WS error: ${JSON.stringify(event)}`);
|
console.log(`WS error: ${JSON.stringify(event)}`);
|
||||||
|
cirrusWebsocket = null
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onclose = function(event) {
|
ws.onclose = function (event) {
|
||||||
|
cirrusWebsocket = null
|
||||||
|
|
||||||
closeStream();
|
closeStream();
|
||||||
|
|
||||||
if(ws.attemptStreamReconnection === true){
|
if (ws.attemptStreamReconnection === true) {
|
||||||
console.log(`WS closed: ${JSON.stringify(event.code)} - ${event.reason}`);
|
console.log(`WS closed: ${JSON.stringify(event.code)} - ${event.reason}`);
|
||||||
if(event.reason !== "")
|
if (event.reason !== "") {
|
||||||
{
|
|
||||||
showTextOverlay(`DISCONNECTED: ${event.reason.toUpperCase()}`);
|
showTextOverlay(`DISCONNECTED: ${event.reason.toUpperCase()}`);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
showTextOverlay(`DISCONNECTED`);
|
showTextOverlay(`DISCONNECTED`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let reclickToStart = setTimeout(function(){
|
|
||||||
|
let reclickToStart = setTimeout(function () {
|
||||||
start(true)
|
start(true)
|
||||||
}, 4000);
|
}, 4000);
|
||||||
}
|
}
|
||||||
@@ -2815,7 +2895,7 @@ function clearMouseEvents(playerElement) {
|
|||||||
|
|
||||||
function toggleControlScheme() {
|
function toggleControlScheme() {
|
||||||
let schemeToggle = document.getElementById("control-scheme-text");
|
let schemeToggle = document.getElementById("control-scheme-text");
|
||||||
|
|
||||||
switch (inputOptions.controlScheme) {
|
switch (inputOptions.controlScheme) {
|
||||||
case ControlSchemeType.HoveringMouse:
|
case ControlSchemeType.HoveringMouse:
|
||||||
inputOptions.controlScheme = ControlSchemeType.LockedMouse;
|
inputOptions.controlScheme = ControlSchemeType.LockedMouse;
|
||||||
@@ -2833,8 +2913,7 @@ function toggleControlScheme() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log(`Updating control scheme to: ${inputOptions.controlScheme ? "Hovering Mouse" : "Locked Mouse"}`)
|
console.log(`Updating control scheme to: ${inputOptions.controlScheme ? "Hovering Mouse" : "Locked Mouse"}`)
|
||||||
if(webRtcPlayerObj && webRtcPlayerObj.video)
|
if (webRtcPlayerObj && webRtcPlayerObj.video) {
|
||||||
{
|
|
||||||
registerMouse(webRtcPlayerObj.video);
|
registerMouse(webRtcPlayerObj.video);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2847,14 +2926,14 @@ function toggleBrowserCursorVisibility() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function restartStream() {
|
function restartStream() {
|
||||||
if(!ws){
|
if (!ws) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ws.attemptStreamReconnection = false;
|
ws.attemptStreamReconnection = false;
|
||||||
|
|
||||||
let existingOnClose = ws.onclose;
|
let existingOnClose = ws.onclose;
|
||||||
|
|
||||||
ws.onclose = function(event) {
|
ws.onclose = function (event) {
|
||||||
existingOnClose(event);
|
existingOnClose(event);
|
||||||
// this is how we restart
|
// this is how we restart
|
||||||
connect_on_load = true;
|
connect_on_load = true;
|
||||||
@@ -2870,7 +2949,7 @@ function closeStream() {
|
|||||||
if (webRtcPlayerObj) {
|
if (webRtcPlayerObj) {
|
||||||
// Remove video element from the page.
|
// Remove video element from the page.
|
||||||
let playerDiv = document.getElementById('player');
|
let playerDiv = document.getElementById('player');
|
||||||
if(playerDiv){
|
if (playerDiv) {
|
||||||
playerDiv.removeChild(webRtcPlayerObj.video);
|
playerDiv.removeChild(webRtcPlayerObj.video);
|
||||||
}
|
}
|
||||||
let outer = document.getElementById("outer");
|
let outer = document.getElementById("outer");
|
||||||
@@ -2895,6 +2974,6 @@ function load() {
|
|||||||
setupFreezeFrameOverlay();
|
setupFreezeFrameOverlay();
|
||||||
registerKeyboardEvents();
|
registerKeyboardEvents();
|
||||||
// Example response event listener that logs to console
|
// Example response event listener that logs to console
|
||||||
addResponseEventListener('logListener', (response) => {console.log(`Received response message from streamer: "${response}"`)})
|
addResponseEventListener('logListener', (response) => { console.log(`Received response message from streamer: "${response}"`) })
|
||||||
start(false);
|
start(false);
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,8 @@ function webRtcPlayer(parOptions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prefer SFU or P2P connection
|
// Prefer SFU or P2P connection
|
||||||
this.preferSFU = urlParams.has('preferSFU');
|
this.preferSFU = true//urlParams.has('preferSFU');
|
||||||
|
console.log('USING SFU: ', this.preferSFU)
|
||||||
console.log(this.preferSFU ?
|
console.log(this.preferSFU ?
|
||||||
"The browser will signal it would prefer an SFU connection. Remove ?preferSFU from the url to signal for P2P usage." :
|
"The browser will signal it would prefer an SFU connection. Remove ?preferSFU from the url to signal for P2P usage." :
|
||||||
"The browser will signal for a P2P connection. Pass ?preferSFU in the url to signal for SFU usage.");
|
"The browser will signal for a P2P connection. Pass ?preferSFU in the url to signal for SFU usage.");
|
||||||
|
|||||||
Generated
+772
@@ -0,0 +1,772 @@
|
|||||||
|
{
|
||||||
|
"name": "WebServers",
|
||||||
|
"lockfileVersion": 2,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"dependencies": {
|
||||||
|
"request": "^2.88.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ajv": {
|
||||||
|
"version": "6.12.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
|
||||||
|
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.1",
|
||||||
|
"fast-json-stable-stringify": "^2.0.0",
|
||||||
|
"json-schema-traverse": "^0.4.1",
|
||||||
|
"uri-js": "^4.2.2"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/epoberezkin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/asn1": {
|
||||||
|
"version": "0.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
|
||||||
|
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"safer-buffer": "~2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/asynckit": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||||
|
},
|
||||||
|
"node_modules/aws-sign2": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||||
|
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/aws4": {
|
||||||
|
"version": "1.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
|
||||||
|
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
|
||||||
|
},
|
||||||
|
"node_modules/bcrypt-pbkdf": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
|
||||||
|
"dependencies": {
|
||||||
|
"tweetnacl": "^0.14.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/caseless": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||||
|
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
|
||||||
|
},
|
||||||
|
"node_modules/combined-stream": {
|
||||||
|
"version": "1.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||||
|
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||||
|
"dependencies": {
|
||||||
|
"delayed-stream": "~1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/core-util-is": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
|
||||||
|
},
|
||||||
|
"node_modules/dashdash": {
|
||||||
|
"version": "1.14.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||||
|
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/delayed-stream": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ecc-jsbn": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
|
||||||
|
"dependencies": {
|
||||||
|
"jsbn": "~0.1.0",
|
||||||
|
"safer-buffer": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/extend": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||||
|
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
|
||||||
|
},
|
||||||
|
"node_modules/extsprintf": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
|
||||||
|
"engines": [
|
||||||
|
"node >=0.6.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/fast-deep-equal": {
|
||||||
|
"version": "3.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
|
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
||||||
|
},
|
||||||
|
"node_modules/fast-json-stable-stringify": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
|
||||||
|
},
|
||||||
|
"node_modules/forever-agent": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
||||||
|
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/form-data": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
||||||
|
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"asynckit": "^0.4.0",
|
||||||
|
"combined-stream": "^1.0.6",
|
||||||
|
"mime-types": "^2.1.12"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/getpass": {
|
||||||
|
"version": "0.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||||
|
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/har-schema": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/har-validator": {
|
||||||
|
"version": "5.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
|
||||||
|
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
|
||||||
|
"deprecated": "this library is no longer supported",
|
||||||
|
"dependencies": {
|
||||||
|
"ajv": "^6.12.3",
|
||||||
|
"har-schema": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/http-signature": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"jsprim": "^1.2.2",
|
||||||
|
"sshpk": "^1.7.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8",
|
||||||
|
"npm": ">=1.3.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/is-typedarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
|
||||||
|
},
|
||||||
|
"node_modules/isstream": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
|
||||||
|
},
|
||||||
|
"node_modules/jsbn": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
|
||||||
|
},
|
||||||
|
"node_modules/json-schema": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
|
||||||
|
},
|
||||||
|
"node_modules/json-schema-traverse": {
|
||||||
|
"version": "0.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||||
|
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||||
|
},
|
||||||
|
"node_modules/json-stringify-safe": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
|
||||||
|
},
|
||||||
|
"node_modules/jsprim": {
|
||||||
|
"version": "1.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
|
||||||
|
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": "1.0.0",
|
||||||
|
"extsprintf": "1.3.0",
|
||||||
|
"json-schema": "0.4.0",
|
||||||
|
"verror": "1.10.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mime-db": {
|
||||||
|
"version": "1.52.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||||
|
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mime-types": {
|
||||||
|
"version": "2.1.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||||
|
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||||
|
"dependencies": {
|
||||||
|
"mime-db": "1.52.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/oauth-sign": {
|
||||||
|
"version": "0.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
||||||
|
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/performance-now": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
|
||||||
|
},
|
||||||
|
"node_modules/psl": {
|
||||||
|
"version": "1.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
||||||
|
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
|
||||||
|
},
|
||||||
|
"node_modules/punycode": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/qs": {
|
||||||
|
"version": "6.5.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
|
||||||
|
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/request": {
|
||||||
|
"version": "2.88.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
||||||
|
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
|
||||||
|
"deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
|
||||||
|
"dependencies": {
|
||||||
|
"aws-sign2": "~0.7.0",
|
||||||
|
"aws4": "^1.8.0",
|
||||||
|
"caseless": "~0.12.0",
|
||||||
|
"combined-stream": "~1.0.6",
|
||||||
|
"extend": "~3.0.2",
|
||||||
|
"forever-agent": "~0.6.1",
|
||||||
|
"form-data": "~2.3.2",
|
||||||
|
"har-validator": "~5.1.3",
|
||||||
|
"http-signature": "~1.2.0",
|
||||||
|
"is-typedarray": "~1.0.0",
|
||||||
|
"isstream": "~0.1.2",
|
||||||
|
"json-stringify-safe": "~5.0.1",
|
||||||
|
"mime-types": "~2.1.19",
|
||||||
|
"oauth-sign": "~0.9.0",
|
||||||
|
"performance-now": "^2.1.0",
|
||||||
|
"qs": "~6.5.2",
|
||||||
|
"safe-buffer": "^5.1.2",
|
||||||
|
"tough-cookie": "~2.5.0",
|
||||||
|
"tunnel-agent": "^0.6.0",
|
||||||
|
"uuid": "^3.3.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/safe-buffer": {
|
||||||
|
"version": "5.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||||
|
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/safer-buffer": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||||
|
},
|
||||||
|
"node_modules/sshpk": {
|
||||||
|
"version": "1.17.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
|
||||||
|
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"asn1": "~0.2.3",
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"bcrypt-pbkdf": "^1.0.0",
|
||||||
|
"dashdash": "^1.12.0",
|
||||||
|
"ecc-jsbn": "~0.1.1",
|
||||||
|
"getpass": "^0.1.1",
|
||||||
|
"jsbn": "~0.1.0",
|
||||||
|
"safer-buffer": "^2.0.2",
|
||||||
|
"tweetnacl": "~0.14.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"sshpk-conv": "bin/sshpk-conv",
|
||||||
|
"sshpk-sign": "bin/sshpk-sign",
|
||||||
|
"sshpk-verify": "bin/sshpk-verify"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tough-cookie": {
|
||||||
|
"version": "2.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||||
|
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||||
|
"dependencies": {
|
||||||
|
"psl": "^1.1.28",
|
||||||
|
"punycode": "^2.1.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tunnel-agent": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||||
|
"dependencies": {
|
||||||
|
"safe-buffer": "^5.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tweetnacl": {
|
||||||
|
"version": "0.14.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
||||||
|
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
|
||||||
|
},
|
||||||
|
"node_modules/uri-js": {
|
||||||
|
"version": "4.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
|
||||||
|
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
|
||||||
|
"dependencies": {
|
||||||
|
"punycode": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/uuid": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
||||||
|
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
|
||||||
|
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
|
||||||
|
"bin": {
|
||||||
|
"uuid": "bin/uuid"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/verror": {
|
||||||
|
"version": "1.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||||
|
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
|
||||||
|
"engines": [
|
||||||
|
"node >=0.6.0"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"core-util-is": "1.0.2",
|
||||||
|
"extsprintf": "^1.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ajv": {
|
||||||
|
"version": "6.12.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
|
||||||
|
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
||||||
|
"requires": {
|
||||||
|
"fast-deep-equal": "^3.1.1",
|
||||||
|
"fast-json-stable-stringify": "^2.0.0",
|
||||||
|
"json-schema-traverse": "^0.4.1",
|
||||||
|
"uri-js": "^4.2.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"asn1": {
|
||||||
|
"version": "0.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
|
||||||
|
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
|
||||||
|
"requires": {
|
||||||
|
"safer-buffer": "~2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
|
||||||
|
},
|
||||||
|
"asynckit": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||||
|
},
|
||||||
|
"aws-sign2": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||||
|
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
|
||||||
|
},
|
||||||
|
"aws4": {
|
||||||
|
"version": "1.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
|
||||||
|
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
|
||||||
|
},
|
||||||
|
"bcrypt-pbkdf": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
|
||||||
|
"requires": {
|
||||||
|
"tweetnacl": "^0.14.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"caseless": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||||
|
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
|
||||||
|
},
|
||||||
|
"combined-stream": {
|
||||||
|
"version": "1.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||||
|
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||||
|
"requires": {
|
||||||
|
"delayed-stream": "~1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"core-util-is": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
|
||||||
|
},
|
||||||
|
"dashdash": {
|
||||||
|
"version": "1.14.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||||
|
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"delayed-stream": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
|
||||||
|
},
|
||||||
|
"ecc-jsbn": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
|
||||||
|
"requires": {
|
||||||
|
"jsbn": "~0.1.0",
|
||||||
|
"safer-buffer": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extend": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||||
|
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
|
||||||
|
},
|
||||||
|
"extsprintf": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
|
||||||
|
},
|
||||||
|
"fast-deep-equal": {
|
||||||
|
"version": "3.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
|
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
||||||
|
},
|
||||||
|
"fast-json-stable-stringify": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
|
||||||
|
},
|
||||||
|
"forever-agent": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
||||||
|
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
|
||||||
|
},
|
||||||
|
"form-data": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
||||||
|
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
||||||
|
"requires": {
|
||||||
|
"asynckit": "^0.4.0",
|
||||||
|
"combined-stream": "^1.0.6",
|
||||||
|
"mime-types": "^2.1.12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getpass": {
|
||||||
|
"version": "0.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||||
|
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"har-schema": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
|
||||||
|
},
|
||||||
|
"har-validator": {
|
||||||
|
"version": "5.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
|
||||||
|
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
|
||||||
|
"requires": {
|
||||||
|
"ajv": "^6.12.3",
|
||||||
|
"har-schema": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"http-signature": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"jsprim": "^1.2.2",
|
||||||
|
"sshpk": "^1.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-typedarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
|
||||||
|
},
|
||||||
|
"isstream": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
|
||||||
|
},
|
||||||
|
"jsbn": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
|
||||||
|
},
|
||||||
|
"json-schema": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
|
||||||
|
},
|
||||||
|
"json-schema-traverse": {
|
||||||
|
"version": "0.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||||
|
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||||
|
},
|
||||||
|
"json-stringify-safe": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
|
||||||
|
},
|
||||||
|
"jsprim": {
|
||||||
|
"version": "1.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
|
||||||
|
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "1.0.0",
|
||||||
|
"extsprintf": "1.3.0",
|
||||||
|
"json-schema": "0.4.0",
|
||||||
|
"verror": "1.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mime-db": {
|
||||||
|
"version": "1.52.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||||
|
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
|
||||||
|
},
|
||||||
|
"mime-types": {
|
||||||
|
"version": "2.1.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||||
|
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||||
|
"requires": {
|
||||||
|
"mime-db": "1.52.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth-sign": {
|
||||||
|
"version": "0.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
||||||
|
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
|
||||||
|
},
|
||||||
|
"performance-now": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
|
||||||
|
},
|
||||||
|
"psl": {
|
||||||
|
"version": "1.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
||||||
|
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
|
||||||
|
},
|
||||||
|
"punycode": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
|
||||||
|
},
|
||||||
|
"qs": {
|
||||||
|
"version": "6.5.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
|
||||||
|
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
|
||||||
|
},
|
||||||
|
"request": {
|
||||||
|
"version": "2.88.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
||||||
|
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
|
||||||
|
"requires": {
|
||||||
|
"aws-sign2": "~0.7.0",
|
||||||
|
"aws4": "^1.8.0",
|
||||||
|
"caseless": "~0.12.0",
|
||||||
|
"combined-stream": "~1.0.6",
|
||||||
|
"extend": "~3.0.2",
|
||||||
|
"forever-agent": "~0.6.1",
|
||||||
|
"form-data": "~2.3.2",
|
||||||
|
"har-validator": "~5.1.3",
|
||||||
|
"http-signature": "~1.2.0",
|
||||||
|
"is-typedarray": "~1.0.0",
|
||||||
|
"isstream": "~0.1.2",
|
||||||
|
"json-stringify-safe": "~5.0.1",
|
||||||
|
"mime-types": "~2.1.19",
|
||||||
|
"oauth-sign": "~0.9.0",
|
||||||
|
"performance-now": "^2.1.0",
|
||||||
|
"qs": "~6.5.2",
|
||||||
|
"safe-buffer": "^5.1.2",
|
||||||
|
"tough-cookie": "~2.5.0",
|
||||||
|
"tunnel-agent": "^0.6.0",
|
||||||
|
"uuid": "^3.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||||
|
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
|
||||||
|
},
|
||||||
|
"safer-buffer": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||||
|
},
|
||||||
|
"sshpk": {
|
||||||
|
"version": "1.17.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
|
||||||
|
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
|
||||||
|
"requires": {
|
||||||
|
"asn1": "~0.2.3",
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"bcrypt-pbkdf": "^1.0.0",
|
||||||
|
"dashdash": "^1.12.0",
|
||||||
|
"ecc-jsbn": "~0.1.1",
|
||||||
|
"getpass": "^0.1.1",
|
||||||
|
"jsbn": "~0.1.0",
|
||||||
|
"safer-buffer": "^2.0.2",
|
||||||
|
"tweetnacl": "~0.14.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tough-cookie": {
|
||||||
|
"version": "2.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||||
|
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||||
|
"requires": {
|
||||||
|
"psl": "^1.1.28",
|
||||||
|
"punycode": "^2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tunnel-agent": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "^5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tweetnacl": {
|
||||||
|
"version": "0.14.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
||||||
|
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
|
||||||
|
},
|
||||||
|
"uri-js": {
|
||||||
|
"version": "4.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
|
||||||
|
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
|
||||||
|
"requires": {
|
||||||
|
"punycode": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
||||||
|
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
|
||||||
|
},
|
||||||
|
"verror": {
|
||||||
|
"version": "1.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||||
|
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "^1.0.0",
|
||||||
|
"core-util-is": "1.0.2",
|
||||||
|
"extsprintf": "^1.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"request": "^2.88.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user