Added ux to vanilla client, rebuild server side
@@ -1,5 +0,0 @@
|
|||||||
[*.{js,jsx,ts,tsx,vue}]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
21
client/.gitignore
vendored
@@ -1,21 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
node_modules
|
|
||||||
/dist
|
|
||||||
|
|
||||||
# local env files
|
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
# Log files
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Editor directories and files
|
|
||||||
.idea
|
|
||||||
.vscode
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# client
|
|
||||||
|
|
||||||
## Project setup
|
|
||||||
```
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and hot-reloads for development
|
|
||||||
```
|
|
||||||
npm run serve
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and minifies for production
|
|
||||||
```
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Lints and fixes files
|
|
||||||
```
|
|
||||||
npm run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
### Customize configuration
|
|
||||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/cli-plugin-babel/preset'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
BIN
client/fonts/Lobster.otf
Normal file
BIN
client/fonts/materialdesignicons-webfont.woff2
Normal file
60
client/index.html
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||||
|
<link rel="stylesheet" href="ressources/style.css" />
|
||||||
|
<link rel="stylesheet" href="ressources/materialdesignicons.min.css" />
|
||||||
|
<title>Lil'Streamy</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 id="titleDiv">Lil' Streamy</h1>
|
||||||
|
|
||||||
|
<div id="loginDiv">
|
||||||
|
<h2>Entrez un nom d'utilisateur</h2>
|
||||||
|
<input class="input" id="loginInput" placeholder="username" type="text"/>
|
||||||
|
<button class="button" id="loginBt"><i class="mdi mdi-arrow-right-bold"></i></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="connectDiv">
|
||||||
|
<h2>Connectez vous</h2>
|
||||||
|
<input id="callInput" placeholder="user to call" type="text" list="callDatalist"/>
|
||||||
|
<datalist id="callDatalist">
|
||||||
|
</datalist>
|
||||||
|
<button id="callBt">Connect</button>
|
||||||
|
<hr>
|
||||||
|
<h2>Ou créer une salle</h2>
|
||||||
|
<h3>Local</h3>
|
||||||
|
<label for="videoInput">
|
||||||
|
<i class="mdi mdi-file-video"></i> Ajouter une vidéo
|
||||||
|
</label>
|
||||||
|
<input id="videoInput" type="file" accept="video/*"/>
|
||||||
|
<h3>Youtube</h3>
|
||||||
|
<input id="ytInput" placeholder="www.youtube.com/watch?v=4Hg1Kudd_x4" type="text"/>
|
||||||
|
<button id="ytBt"><i class="mdi mdi-play-circle"></i></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="videoDiv">
|
||||||
|
<h2 id="videoTitle"></h2>
|
||||||
|
<video autoplay controls id="video"></video>
|
||||||
|
<hr>
|
||||||
|
<button id="disconnectBt">Disconnect</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="ytDiv">
|
||||||
|
<h2 id="videoTitle"></h2>
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/4Hg1Kudd_x4?controls=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||||
|
<hr>
|
||||||
|
<button id="disconnectBt">Disconnect</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="loadDiv">
|
||||||
|
<div class="loader" style="display:block"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
||||||
|
<script src = "scripts/script.js"></script>
|
||||||
|
<script src = "scripts/rtc.js"></script>
|
||||||
|
<script src = "scripts/signal.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
12638
client/package-lock.json
generated
@@ -1,49 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "client",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"serve": "vue-cli-service serve",
|
|
||||||
"build": "vue-cli-service build",
|
|
||||||
"lint": "vue-cli-service lint"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"buefy": "^0.8.13",
|
|
||||||
"core-js": "^3.6.4",
|
|
||||||
"register-service-worker": "^1.6.2",
|
|
||||||
"vue": "^2.6.11"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@vue/cli-plugin-babel": "~4.2.0",
|
|
||||||
"@vue/cli-plugin-eslint": "~4.2.0",
|
|
||||||
"@vue/cli-plugin-pwa": "~4.2.0",
|
|
||||||
"@vue/cli-service": "~4.2.0",
|
|
||||||
"@vue/eslint-config-standard": "^5.1.0",
|
|
||||||
"babel-eslint": "^10.0.3",
|
|
||||||
"eslint": "^6.7.2",
|
|
||||||
"eslint-plugin-import": "^2.20.1",
|
|
||||||
"eslint-plugin-node": "^11.0.0",
|
|
||||||
"eslint-plugin-promise": "^4.2.1",
|
|
||||||
"eslint-plugin-standard": "^4.0.0",
|
|
||||||
"eslint-plugin-vue": "^6.1.2",
|
|
||||||
"vue-template-compiler": "^2.6.11"
|
|
||||||
},
|
|
||||||
"eslintConfig": {
|
|
||||||
"root": true,
|
|
||||||
"env": {
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": [
|
|
||||||
"plugin:vue/essential",
|
|
||||||
"@vue/standard"
|
|
||||||
],
|
|
||||||
"parserOptions": {
|
|
||||||
"parser": "babel-eslint"
|
|
||||||
},
|
|
||||||
"rules": {}
|
|
||||||
},
|
|
||||||
"browserslist": [
|
|
||||||
"> 1%",
|
|
||||||
"last 2 versions"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 799 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
@@ -1,149 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
|
||||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
|
||||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="16.000000pt" height="16.000000pt" viewBox="0 0 16.000000 16.000000"
|
|
||||||
preserveAspectRatio="xMidYMid meet">
|
|
||||||
<metadata>
|
|
||||||
Created by potrace 1.11, written by Peter Selinger 2001-2013
|
|
||||||
</metadata>
|
|
||||||
<g transform="translate(0.000000,16.000000) scale(0.000320,-0.000320)"
|
|
||||||
fill="#000000" stroke="none">
|
|
||||||
<path d="M18 46618 c45 -75 122 -207 122 -211 0 -2 25 -45 55 -95 30 -50 55
|
|
||||||
-96 55 -102 0 -5 5 -10 10 -10 6 0 10 -4 10 -9 0 -5 73 -135 161 -288 89 -153
|
|
||||||
173 -298 187 -323 14 -25 32 -57 41 -72 88 -149 187 -324 189 -335 2 -7 8 -13
|
|
||||||
13 -13 5 0 9 -4 9 -10 0 -5 46 -89 103 -187 175 -302 490 -846 507 -876 8 -16
|
|
||||||
20 -36 25 -45 28 -46 290 -498 339 -585 13 -23 74 -129 136 -236 61 -107 123
|
|
||||||
-215 137 -240 14 -25 29 -50 33 -56 5 -5 23 -37 40 -70 18 -33 38 -67 44 -75
|
|
||||||
11 -16 21 -33 63 -109 14 -25 29 -50 33 -56 4 -5 21 -35 38 -65 55 -100 261
|
|
||||||
-455 269 -465 4 -5 14 -21 20 -35 15 -29 41 -75 103 -180 24 -41 52 -88 60
|
|
||||||
-105 9 -16 57 -100 107 -185 112 -193 362 -626 380 -660 8 -14 23 -38 33 -55
|
|
||||||
11 -16 23 -37 27 -45 4 -8 26 -46 48 -85 23 -38 53 -90 67 -115 46 -81 64
|
|
||||||
-113 178 -310 62 -107 121 -210 132 -227 37 -67 56 -99 85 -148 16 -27 32 -57
|
|
||||||
36 -65 4 -8 15 -27 25 -42 9 -15 53 -89 96 -165 44 -76 177 -307 296 -513 120
|
|
||||||
-206 268 -463 330 -570 131 -227 117 -203 200 -348 36 -62 73 -125 82 -140 10
|
|
||||||
-15 21 -34 25 -42 4 -8 20 -37 36 -65 17 -27 38 -65 48 -82 49 -85 64 -111 87
|
|
||||||
-153 13 -25 28 -49 32 -55 4 -5 78 -134 165 -285 87 -151 166 -288 176 -305
|
|
||||||
10 -16 26 -43 35 -59 9 -17 125 -217 257 -445 132 -229 253 -441 270 -471 17
|
|
||||||
-30 45 -79 64 -108 18 -29 33 -54 33 -57 0 -2 20 -37 44 -77 24 -40 123 -212
|
|
||||||
221 -383 97 -170 190 -330 205 -355 16 -25 39 -65 53 -90 13 -25 81 -144 152
|
|
||||||
-265 70 -121 137 -238 150 -260 12 -22 37 -65 55 -95 18 -30 43 -73 55 -95 12
|
|
||||||
-22 48 -85 80 -140 77 -132 163 -280 190 -330 13 -22 71 -123 130 -225 59
|
|
||||||
-102 116 -199 126 -217 10 -17 29 -50 43 -72 15 -22 26 -43 26 -45 0 -2 27
|
|
||||||
-50 60 -106 33 -56 60 -103 60 -105 0 -2 55 -98 90 -155 8 -14 182 -316 239
|
|
||||||
-414 13 -22 45 -79 72 -124 27 -46 49 -86 49 -89 0 -2 14 -24 30 -48 16 -24
|
|
||||||
30 -46 30 -49 0 -5 74 -135 100 -176 5 -8 24 -42 43 -75 50 -88 58 -101 262
|
|
||||||
-455 104 -179 199 -345 213 -370 14 -25 28 -49 32 -55 4 -5 17 -26 28 -45 10
|
|
||||||
-19 62 -109 114 -200 114 -197 133 -230 170 -295 16 -27 33 -57 38 -65 17 -28
|
|
||||||
96 -165 103 -180 4 -8 16 -28 26 -45 10 -16 77 -131 148 -255 72 -124 181
|
|
||||||
-313 243 -420 62 -107 121 -209 131 -227 35 -62 323 -560 392 -678 38 -66 83
|
|
||||||
-145 100 -175 16 -30 33 -59 37 -65 4 -5 17 -27 29 -47 34 -61 56 -100 90
|
|
||||||
-156 17 -29 31 -55 31 -57 0 -2 17 -32 39 -67 21 -35 134 -229 251 -433 117
|
|
||||||
-203 235 -407 261 -451 27 -45 49 -85 49 -88 0 -4 8 -19 19 -34 15 -21 200
|
|
||||||
-341 309 -533 10 -19 33 -58 51 -87 17 -29 31 -54 31 -56 0 -2 25 -44 55 -94
|
|
||||||
30 -50 55 -95 55 -98 0 -4 6 -15 14 -23 7 -9 27 -41 43 -71 17 -30 170 -297
|
|
||||||
342 -594 171 -296 311 -542 311 -547 0 -5 5 -9 10 -9 6 0 10 -4 10 -10 0 -5
|
|
||||||
22 -47 49 -92 27 -46 58 -99 68 -118 24 -43 81 -140 93 -160 5 -8 66 -114 135
|
|
||||||
-235 69 -121 130 -227 135 -235 12 -21 259 -447 283 -490 10 -19 28 -47 38
|
|
||||||
-62 11 -14 19 -29 19 -32 0 -3 37 -69 83 -148 99 -170 305 -526 337 -583 13
|
|
||||||
-22 31 -53 41 -70 11 -16 22 -37 26 -45 7 -14 82 -146 103 -180 14 -24 181
|
|
||||||
-311 205 -355 13 -22 46 -80 75 -130 29 -49 64 -110 78 -135 14 -25 51 -88 82
|
|
||||||
-140 31 -52 59 -102 63 -110 4 -8 18 -33 31 -55 205 -353 284 -489 309 -535
|
|
||||||
17 -30 45 -78 62 -106 18 -28 36 -60 39 -72 4 -12 12 -22 17 -22 5 0 9 -4 9
|
|
||||||
-10 0 -5 109 -197 241 -427 133 -230 250 -431 259 -448 51 -90 222 -385 280
|
|
||||||
-485 37 -63 78 -135 92 -160 14 -25 67 -117 118 -205 51 -88 101 -175 111
|
|
||||||
-193 34 -58 55 -95 149 -257 51 -88 101 -173 110 -190 9 -16 76 -131 147 -255
|
|
||||||
72 -124 140 -241 151 -260 61 -108 281 -489 355 -615 38 -66 77 -133 87 -150
|
|
||||||
35 -63 91 -161 100 -175 14 -23 99 -169 128 -220 54 -97 135 -235 142 -245 4
|
|
||||||
-5 20 -32 35 -60 26 -48 238 -416 276 -480 10 -16 26 -46 37 -65 30 -53 382
|
|
||||||
-661 403 -695 10 -16 22 -37 26 -45 4 -8 26 -48 50 -88 24 -41 43 -75 43 -77
|
|
||||||
0 -2 22 -40 50 -85 27 -45 50 -84 50 -86 0 -3 38 -69 83 -147 84 -142 302
|
|
||||||
-520 340 -587 10 -19 34 -60 52 -90 18 -30 44 -75 57 -100 14 -25 45 -79 70
|
|
||||||
-120 25 -41 56 -96 70 -121 14 -25 77 -133 138 -240 62 -107 122 -210 132
|
|
||||||
-229 25 -43 310 -535 337 -581 11 -19 26 -45 34 -59 17 -32 238 -414 266 -460
|
|
||||||
11 -19 24 -41 28 -49 3 -7 75 -133 160 -278 84 -146 153 -269 153 -274 0 -5 5
|
|
||||||
-9 10 -9 6 0 10 -4 10 -10 0 -5 82 -150 181 -322 182 -314 201 -346 240 -415
|
|
||||||
12 -21 80 -139 152 -263 71 -124 141 -245 155 -270 14 -25 28 -49 32 -55 6 -8
|
|
||||||
145 -248 220 -380 37 -66 209 -362 229 -395 11 -19 24 -42 28 -49 4 -8 67
|
|
||||||
-118 140 -243 73 -125 133 -230 133 -233 0 -2 15 -28 33 -57 19 -29 47 -78 64
|
|
||||||
-108 17 -30 53 -93 79 -139 53 -90 82 -141 157 -272 82 -142 115 -199 381
|
|
||||||
-659 142 -245 268 -463 281 -485 12 -22 71 -125 132 -230 60 -104 172 -298
|
|
||||||
248 -430 76 -132 146 -253 156 -270 11 -16 22 -36 26 -44 3 -8 30 -54 60 -103
|
|
||||||
29 -49 53 -91 53 -93 0 -3 18 -34 40 -70 22 -36 40 -67 40 -69 0 -2 37 -66 81
|
|
||||||
-142 45 -77 98 -168 119 -204 20 -36 47 -81 58 -100 12 -19 27 -47 33 -62 6
|
|
||||||
-16 15 -28 20 -28 5 0 9 -4 9 -9 0 -6 63 -118 140 -251 77 -133 140 -243 140
|
|
||||||
-245 0 -2 18 -33 41 -70 22 -37 49 -83 60 -101 10 -19 29 -51 40 -71 25 -45
|
|
||||||
109 -189 126 -218 7 -11 17 -29 22 -40 6 -11 22 -38 35 -60 14 -22 37 -62 52
|
|
||||||
-90 14 -27 35 -62 45 -77 11 -14 19 -29 19 -32 0 -3 18 -35 40 -71 22 -36 40
|
|
||||||
-67 40 -69 0 -2 19 -35 42 -72 23 -38 55 -94 72 -124 26 -47 139 -244 171
|
|
||||||
-298 6 -9 21 -36 34 -60 28 -48 37 -51 51 -19 6 12 19 36 29 52 10 17 27 46
|
|
||||||
38 65 11 19 104 181 208 360 103 179 199 345 213 370 14 25 42 74 64 109 21
|
|
||||||
34 38 65 38 67 0 2 18 33 40 69 22 36 40 67 40 69 0 3 177 310 199 346 16 26
|
|
||||||
136 234 140 244 2 5 25 44 52 88 27 44 49 81 49 84 0 2 18 34 40 70 22 36 40
|
|
||||||
67 40 69 0 2 20 36 43 77 35 58 169 289 297 513 9 17 50 86 90 155 40 69 86
|
|
||||||
150 103 180 16 30 35 62 41 70 6 8 16 24 22 35 35 64 72 129 167 293 59 100
|
|
||||||
116 199 127 220 11 20 30 53 41 72 43 72 1070 1850 1121 1940 14 25 65 113
|
|
||||||
113 195 48 83 96 166 107 185 10 19 28 50 38 68 11 18 73 124 137 235 64 111
|
|
||||||
175 303 246 427 71 124 173 299 225 390 52 91 116 202 143 248 27 45 49 85 49
|
|
||||||
89 0 4 6 14 14 22 7 9 28 43 46 76 26 47 251 436 378 655 11 19 29 51 40 70
|
|
||||||
11 19 101 176 201 348 99 172 181 317 181 323 0 5 5 9 10 9 6 0 10 5 10 11 0
|
|
||||||
6 8 23 18 37 11 15 32 52 49 82 16 30 130 228 253 440 122 212 234 405 248
|
|
||||||
430 13 25 39 70 57 100 39 65 69 117 130 225 25 44 50 87 55 95 12 19 78 134
|
|
||||||
220 380 61 107 129 224 150 260 161 277 222 382 246 425 15 28 47 83 71 123
|
|
||||||
24 41 43 78 43 83 0 5 4 9 8 9 4 0 13 12 19 28 7 15 23 45 36 67 66 110 277
|
|
||||||
478 277 483 0 3 6 13 14 21 7 9 27 41 43 71 17 30 45 80 63 110 34 57 375 649
|
|
||||||
394 685 6 11 16 27 22 35 6 8 26 42 44 75 18 33 41 74 51 90 10 17 24 41 32
|
|
||||||
55 54 97 72 128 88 152 11 14 19 28 19 30 0 3 79 141 175 308 96 167 175 305
|
|
||||||
175 308 0 3 6 13 14 21 7 9 26 39 41 66 33 60 276 483 338 587 24 40 46 80 50
|
|
||||||
88 4 8 13 24 20 35 14 23 95 163 125 215 11 19 52 91 92 160 40 69 80 139 90
|
|
||||||
155 9 17 103 179 207 360 105 182 200 346 211 365 103 181 463 802 489 845 7
|
|
||||||
11 15 27 19 35 4 8 29 51 55 95 64 110 828 1433 848 1470 9 17 24 41 33 55 9
|
|
||||||
14 29 48 45 77 15 28 52 93 82 145 30 51 62 107 71 123 17 30 231 398 400 690
|
|
||||||
51 88 103 179 115 202 12 23 26 48 32 55 6 7 24 38 40 68 17 30 61 107 98 170
|
|
||||||
37 63 84 144 103 180 19 36 41 72 48 81 8 8 14 18 14 21 0 4 27 51 59 106 32
|
|
||||||
55 72 124 89 154 16 29 71 125 122 213 51 88 104 180 118 205 13 25 28 50 32
|
|
||||||
55 4 6 17 26 28 45 11 19 45 80 77 135 31 55 66 116 77 135 11 19 88 152 171
|
|
||||||
295 401 694 620 1072 650 1125 11 19 87 152 170 295 83 143 158 273 166 288 9
|
|
||||||
16 21 36 26 45 6 9 31 52 55 96 25 43 54 94 66 115 11 20 95 164 186 321 91
|
|
||||||
157 173 299 182 315 9 17 26 46 37 65 12 19 66 114 121 210 56 96 108 186 117
|
|
||||||
200 8 14 24 40 34 59 24 45 383 664 412 713 5 9 17 29 26 45 15 28 120 210
|
|
||||||
241 419 36 61 68 117 72 125 4 8 12 23 19 34 35 57 245 420 262 453 11 20 35
|
|
||||||
61 53 90 17 29 32 54 32 56 0 3 28 51 62 108 33 57 70 119 80 138 10 19 23 42
|
|
||||||
28 50 5 8 32 53 59 100 27 47 149 258 271 470 122 212 234 405 248 430 30 53
|
|
||||||
62 108 80 135 6 11 15 27 19 35 4 8 85 150 181 315 96 165 187 323 202 350 31
|
|
||||||
56 116 202 130 225 5 8 25 42 43 75 19 33 92 159 162 280 149 257 157 271 202
|
|
||||||
350 19 33 38 67 43 75 9 14 228 392 275 475 12 22 55 96 95 165 40 69 80 139
|
|
||||||
90 155 24 42 202 350 221 383 9 15 27 47 41 72 14 25 75 131 136 236 61 106
|
|
||||||
121 210 134 232 99 172 271 470 279 482 5 8 23 40 40 70 18 30 81 141 142 245
|
|
||||||
60 105 121 210 135 235 14 25 71 124 127 220 56 96 143 247 194 335 51 88 96
|
|
||||||
167 102 175 14 24 180 311 204 355 23 43 340 590 356 615 5 8 50 87 101 175
|
|
||||||
171 301 517 898 582 1008 25 43 46 81 46 83 0 2 12 23 27 47 14 23 40 67 56
|
|
||||||
97 16 30 35 62 42 70 7 8 15 22 18 30 4 8 20 38 37 65 16 28 33 57 37 65 6 12
|
|
||||||
111 196 143 250 5 8 55 95 112 193 57 98 113 195 126 215 12 20 27 46 32 57 6
|
|
||||||
11 14 27 20 35 5 8 76 130 156 270 80 140 165 287 187 325 23 39 52 90 66 115
|
|
||||||
13 25 30 52 37 61 8 8 14 18 14 21 0 4 41 77 92 165 50 87 175 302 276 478
|
|
||||||
101 176 208 360 236 408 28 49 67 117 86 152 19 35 41 70 48 77 6 6 12 15 12
|
|
||||||
19 0 7 124 224 167 291 12 21 23 40 23 42 0 2 21 40 46 83 26 43 55 92 64 109
|
|
||||||
54 95 327 568 354 614 19 30 45 75 59 100 71 128 82 145 89 148 4 2 8 8 8 13
|
|
||||||
0 5 42 82 94 172 311 538 496 858 518 897 14 25 40 70 58 100 18 30 42 71 53
|
|
||||||
90 10 19 79 139 152 265 73 127 142 246 153 265 10 19 43 76 72 125 29 50 63
|
|
||||||
108 75 130 65 116 80 140 87 143 4 2 8 8 8 12 0 8 114 212 140 250 6 8 14 24
|
|
||||||
20 35 5 11 54 97 108 190 l100 170 -9611 3 c-5286 1 -9614 -1 -9618 -5 -5 -6
|
|
||||||
-419 -719 -619 -1068 -89 -155 -267 -463 -323 -560 -38 -66 -81 -140 -95 -165
|
|
||||||
-31 -56 -263 -457 -526 -910 -110 -190 -224 -388 -254 -440 -29 -52 -61 -109
|
|
||||||
-71 -125 -23 -39 -243 -420 -268 -465 -11 -19 -204 -352 -428 -740 -224 -388
|
|
||||||
-477 -826 -563 -975 -85 -148 -185 -322 -222 -385 -37 -63 -120 -207 -185
|
|
||||||
-320 -65 -113 -177 -306 -248 -430 -72 -124 -172 -297 -222 -385 -51 -88 -142
|
|
||||||
-245 -202 -350 -131 -226 -247 -427 -408 -705 -65 -113 -249 -432 -410 -710
|
|
||||||
-160 -278 -388 -673 -506 -877 -118 -205 -216 -373 -219 -373 -3 0 -52 82
|
|
||||||
-109 183 -58 100 -144 250 -192 332 -95 164 -402 696 -647 1120 -85 149 -228
|
|
||||||
396 -317 550 -212 365 -982 1700 -1008 1745 -10 19 -43 76 -72 125 -29 50 -64
|
|
||||||
110 -77 135 -14 25 -63 110 -110 190 -47 80 -96 165 -110 190 -14 25 -99 171
|
|
||||||
-188 325 -89 154 -174 300 -188 325 -13 25 -64 113 -112 195 -48 83 -140 242
|
|
||||||
-205 355 -65 113 -183 317 -263 454 -79 137 -152 264 -163 282 -50 89 -335
|
|
||||||
583 -354 614 -12 19 -34 58 -50 85 -15 28 -129 226 -253 440 -124 215 -235
|
|
||||||
408 -247 430 -12 22 -69 121 -127 220 -58 99 -226 389 -373 645 -148 256 -324
|
|
||||||
561 -392 678 -67 117 -134 232 -147 255 -13 23 -33 59 -46 80 l-22 37 -9615 0
|
|
||||||
-9615 0 20 -32z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,17 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
|
||||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app"></div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
User-agent: *
|
|
||||||
Disallow:
|
|
||||||
3
client/ressources/materialdesignicons.min.css
vendored
Normal file
120
client/ressources/style.css
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
:root {
|
||||||
|
--main-bg-color: coral;
|
||||||
|
--main-color: #f1b70e;
|
||||||
|
--main-color-hover: #af8813;
|
||||||
|
--secondary-color: coral;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: lobster;
|
||||||
|
src: url(../fonts/Lobster.otf);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: #23232e;
|
||||||
|
font: 14px normal Arial, Helvetica, sans-serif;
|
||||||
|
z-index: -4;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 100px;
|
||||||
|
font-family: lobster;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: none;
|
||||||
|
margin: auto;
|
||||||
|
padding: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
video {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
background-color: var(--main-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid var(--main-color);
|
||||||
|
display: inline-block;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #ffffff;
|
||||||
|
font-family: Arial;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 7px 15px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
background-color: var(--main-color-hover);
|
||||||
|
border: 1px solid var(--main-color-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active {
|
||||||
|
position: relative;
|
||||||
|
top:1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
background-color: var(--main-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid var(--main-color);
|
||||||
|
display: inline-block;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #ffffff;
|
||||||
|
font-family: Arial;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 7px 15px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
label:hover {
|
||||||
|
background-color: var(--main-color-hover);
|
||||||
|
border: 1px solid var(--main-color-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=file] {
|
||||||
|
font-size: 100px;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
opacity: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loadDiv {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 1;
|
||||||
|
padding-top: 100px;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
background-color: rgb(0,0,0);
|
||||||
|
background-color: rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
margin: auto;
|
||||||
|
padding: 20px;
|
||||||
|
border: 16px solid #f3f3f3;
|
||||||
|
border-top: 16px solid #3498db;
|
||||||
|
border-bottom: 16px solid violet;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
animation: spin 0.5s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
@@ -95,6 +95,12 @@ async function handleOffer(offer, target) {
|
|||||||
answer: answer
|
answer: answer
|
||||||
})
|
})
|
||||||
|
|
||||||
|
for (let user of connections.keys()) {
|
||||||
|
console.log(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('CONNECTION SIZE ' + connections.size)
|
||||||
|
|
||||||
videoTitle.innerHTML = name + ' | ' + connections.size + ' users connected'
|
videoTitle.innerHTML = name + ' | ' + connections.size + ' users connected'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,11 +143,6 @@ function handleLeave() {
|
|||||||
remoteVideo.src = null
|
remoteVideo.src = null
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleUserlist(list) {
|
|
||||||
console.log('GOT USER LIST')
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleVideoOffer(sdp, target) {
|
async function handleVideoOffer(sdp, target) {
|
||||||
console.log('GOT VIDEO OFFER FROM ' + target)
|
console.log('GOT VIDEO OFFER FROM ' + target)
|
||||||
await createPeerConnection(target)
|
await createPeerConnection(target)
|
||||||
@@ -167,7 +168,7 @@ async function handleVideoOffer(sdp, target) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
//var keys = connections.keys().next().value
|
//var keys = connections.keys().next().value
|
||||||
videoTitle.innerHTML = name + ' | connected to '
|
videoTitle.innerHTML = name + ' | connected to ' + target
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleVideoAnswer(sdp, target) {
|
async function handleVideoAnswer(sdp, target) {
|
||||||
@@ -4,6 +4,7 @@ const loginBt = document.querySelector('#loginBt')
|
|||||||
|
|
||||||
const connectDiv = document.querySelector('#connectDiv')
|
const connectDiv = document.querySelector('#connectDiv')
|
||||||
const callInput = document.querySelector('#callInput')
|
const callInput = document.querySelector('#callInput')
|
||||||
|
const callDatalist = document.querySelector('#callDatalist')
|
||||||
const callBt = document.querySelector('#callBt')
|
const callBt = document.querySelector('#callBt')
|
||||||
const videoInput = document.querySelector('#videoInput')
|
const videoInput = document.querySelector('#videoInput')
|
||||||
|
|
||||||
@@ -13,8 +14,10 @@ const remoteVideo = document.querySelector('#video')
|
|||||||
const disconnectBt = document.querySelector('#disconnectBt')
|
const disconnectBt = document.querySelector('#disconnectBt')
|
||||||
|
|
||||||
const loadDiv = document.querySelector('#loadDiv')
|
const loadDiv = document.querySelector('#loadDiv')
|
||||||
|
const titleDiv = document.querySelector('#titleDiv')
|
||||||
|
|
||||||
var stream
|
var stream
|
||||||
|
var users
|
||||||
|
|
||||||
loginDiv.style.display = 'block'
|
loginDiv.style.display = 'block'
|
||||||
|
|
||||||
@@ -35,6 +38,7 @@ callBt.addEventListener('click', function () {
|
|||||||
if (callToUsername.length > 0) {
|
if (callToUsername.length > 0) {
|
||||||
makeOffer(callToUsername)
|
makeOffer(callToUsername)
|
||||||
loadDiv.style.display = 'block'
|
loadDiv.style.display = 'block'
|
||||||
|
titleDiv.style.display = 'none'
|
||||||
connectDiv.style.display = 'none'
|
connectDiv.style.display = 'none'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -47,6 +51,7 @@ disconnectBt.addEventListener('click', function () {
|
|||||||
handleLeave()
|
handleLeave()
|
||||||
videoDiv.style.display = 'none'
|
videoDiv.style.display = 'none'
|
||||||
loginDiv.style.display = 'block'
|
loginDiv.style.display = 'block'
|
||||||
|
titleDiv.style.display = 'block'
|
||||||
})
|
})
|
||||||
|
|
||||||
videoInput.addEventListener('change', function (event) {
|
videoInput.addEventListener('change', function (event) {
|
||||||
@@ -54,11 +59,32 @@ videoInput.addEventListener('change', function (event) {
|
|||||||
|
|
||||||
videoDiv.style.display = 'block'
|
videoDiv.style.display = 'block'
|
||||||
connectDiv.style.display = 'none'
|
connectDiv.style.display = 'none'
|
||||||
videoTitle.innerHTML = name + ' | ' + connections.size + ' user connected'
|
titleDiv.style.display = 'none'
|
||||||
|
videoTitle.innerHTML = name + ' | ' + connections.size + ' users connected'
|
||||||
})
|
})
|
||||||
|
|
||||||
remoteVideo.onplay = function () {
|
remoteVideo.onplay = function () {
|
||||||
console.log('ADD STREAM')
|
console.log('ADD STREAM')
|
||||||
if(remoteVideo.mozCaptureStream()) stream = remoteVideo.mozCaptureStream()
|
if (remoteVideo.mozCaptureStream()) stream = remoteVideo.mozCaptureStream()
|
||||||
else stream = remoteVideo.captureStream()
|
else stream = remoteVideo.captureStream()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleUserlist(list) {
|
||||||
|
console.log('GOT USER LIST '+list)
|
||||||
|
users = Array.from(list)
|
||||||
|
console.log(' users '+users)
|
||||||
|
console.log(typeof users)
|
||||||
|
console.log(' users '+users)
|
||||||
|
callDatalist.innerHTML = ''
|
||||||
|
users.forEach(user => {
|
||||||
|
if(user != name) callDatalist.innerHTML += '<option value="'+user+'"/>'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleError(message) {
|
||||||
|
console.log('Error '+message)
|
||||||
|
alert(
|
||||||
|
'AWWW FUCK \n\n'
|
||||||
|
+message
|
||||||
|
+'\n\nYou should probably reload the page')
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
const conn = new WebSocket('wss://gltronic.ovh/lilstreamy/')
|
//const conn = new WebSocket('wss://gltronic.ovh/lilstreamy/')
|
||||||
|
const conn = new WebSocket('wss://localhost:8080')
|
||||||
|
|
||||||
conn.onopen = function () {
|
conn.onopen = function () {
|
||||||
console.log('Connected to the signaling server')
|
console.log('Connected to the signaling server')
|
||||||
@@ -27,7 +28,7 @@ conn.onmessage = function (msg) {
|
|||||||
break
|
break
|
||||||
|
|
||||||
case 'userlist':
|
case 'userlist':
|
||||||
handleUserlist(data)
|
handleUserlist(data.users)
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'leave':
|
case 'leave':
|
||||||
@@ -42,6 +43,10 @@ conn.onmessage = function (msg) {
|
|||||||
handleVideoAnswer(data.sdp, data.name)
|
handleVideoAnswer(data.sdp, data.name)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case 'error':
|
||||||
|
handleError(data.message)
|
||||||
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div id="app">
|
|
||||||
<Video v-if="connection" v-bind:connection="connection"/>
|
|
||||||
<Configure v-else v-on:connect="offer"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
import Video from './components/video'
|
|
||||||
import Configure from './components/configure'
|
|
||||||
export default {
|
|
||||||
name: 'App',
|
|
||||||
components: {
|
|
||||||
Configure,
|
|
||||||
Video
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
connectedUsers: null,
|
|
||||||
connectedToName: null,
|
|
||||||
connection: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
#app {
|
|
||||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
text-align: center;
|
|
||||||
color: #2c3e50;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
Before Width: | Height: | Size: 6.7 KiB |
@@ -1,41 +0,0 @@
|
|||||||
<template>
|
|
||||||
<container>
|
|
||||||
<img alt="Vue logo" src="../assets/logo.png">
|
|
||||||
<h1 class="title">Lil' Streamy</h1>
|
|
||||||
<RoomSelector/>
|
|
||||||
<UsernameChooser/>
|
|
||||||
</container>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import RoomSelector from './roomSelector'
|
|
||||||
import UsernameChooser from './usernameChooser'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Video',
|
|
||||||
components: {
|
|
||||||
RoomSelector,
|
|
||||||
UsernameChooser
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isLoading: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async saveName (user) {
|
|
||||||
|
|
||||||
},
|
|
||||||
async saveConnection (connection) {
|
|
||||||
|
|
||||||
},
|
|
||||||
async connect () {
|
|
||||||
this.$emit('connect', this.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="container">
|
|
||||||
<section>
|
|
||||||
<h3>Choose a room</h3>
|
|
||||||
<b-field position="is-centered">
|
|
||||||
<b-select placeholder="Select a room">
|
|
||||||
<option>
|
|
||||||
</option>
|
|
||||||
</b-select>
|
|
||||||
<button class="button is-success" @click="connect">Connect</button>
|
|
||||||
</b-field>
|
|
||||||
</section>
|
|
||||||
<b-loading :active.sync="isLoading" :is-full-page=false />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'ClientSelector',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isLoading: false,
|
|
||||||
name: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async connect () {
|
|
||||||
this.$emit('connect', this.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<h3>Enter a username</h3>
|
|
||||||
<b-field position="is-centered">
|
|
||||||
<b-input :value="name" v-model="name" placeholder="..."></b-input>
|
|
||||||
<button class="button is-success" @click="sendName">Login</button>
|
|
||||||
</b-field>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'UsernameChooser',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
name: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async sendName () {
|
|
||||||
if (this.name.length > 0) {
|
|
||||||
this.$rtc.send({
|
|
||||||
type: "login",
|
|
||||||
name: this.name
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<template>
|
|
||||||
<container>
|
|
||||||
</container>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Video',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isLoading: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async connect () {
|
|
||||||
this.$emit('connect', this.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import Vue from 'vue'
|
|
||||||
import App from './App.vue'
|
|
||||||
import './registerServiceWorker'
|
|
||||||
import Buefy from 'buefy'
|
|
||||||
|
|
||||||
import Rtc from './scripts/rtc'
|
|
||||||
|
|
||||||
import 'buefy/dist/buefy.css'
|
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
|
||||||
Vue.use(Buefy)
|
|
||||||
|
|
||||||
Vue.$rtc = Rtc
|
|
||||||
|
|
||||||
new Vue({
|
|
||||||
render: h => h(App)
|
|
||||||
}).$mount('#app')
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
|
|
||||||
import { register } from 'register-service-worker'
|
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'production') {
|
|
||||||
register(`${process.env.BASE_URL}service-worker.js`, {
|
|
||||||
ready () {
|
|
||||||
console.log(
|
|
||||||
'App is being served from cache by a service worker.\n' +
|
|
||||||
'For more details, visit https://goo.gl/AFskqB'
|
|
||||||
)
|
|
||||||
},
|
|
||||||
registered () {
|
|
||||||
console.log('Service worker has been registered.')
|
|
||||||
},
|
|
||||||
cached () {
|
|
||||||
console.log('Content has been cached for offline use.')
|
|
||||||
},
|
|
||||||
updatefound () {
|
|
||||||
console.log('New content is downloading.')
|
|
||||||
},
|
|
||||||
updated () {
|
|
||||||
console.log('New content is available; please refresh.')
|
|
||||||
},
|
|
||||||
offline () {
|
|
||||||
console.log('No internet connection found. App is running in offline mode.')
|
|
||||||
},
|
|
||||||
error (error) {
|
|
||||||
console.error('Error during service worker registration:', error)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
var name
|
|
||||||
var connections = {}
|
|
||||||
var stream
|
|
||||||
|
|
||||||
const configuration = {
|
|
||||||
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
|
|
||||||
}
|
|
||||||
|
|
||||||
const offerOptions = {
|
|
||||||
offerToReceiveAudio: 1,
|
|
||||||
offerToReceiveVideo: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleLogin (success) {
|
|
||||||
if (success === false) {
|
|
||||||
alert('try a different username')
|
|
||||||
} else {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function createPeerConnection (target) {
|
|
||||||
console.log('CREATED PEER CONNECTION')
|
|
||||||
var connection = new RTCPeerConnection(configuration)
|
|
||||||
connections[target] = connection
|
|
||||||
|
|
||||||
connection.onicecandidate = function (event) {
|
|
||||||
if (event.candidate) {
|
|
||||||
send({
|
|
||||||
type: 'candidate',
|
|
||||||
name: name,
|
|
||||||
target: target,
|
|
||||||
candidate: event.candidate
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connection.onnegotiationneeded = function () { handleNegotiationNeededEvent(target) }
|
|
||||||
connection.ontrack = function (event) { handleTrackEvent(event) }
|
|
||||||
connection.onsignalingstatechange = function () { handleSignalingStateChangeEvent(connection) }
|
|
||||||
connection.oniceconnectionstatechange = function () { handleICEConnectionStateChangeEvent(connection) }
|
|
||||||
connection.onicegatheringstatechange = function () { handleICEGatheringStateChangeEvent(connection) }
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleICEConnectionStateChangeEvent (connection) {
|
|
||||||
console.log('ICE CONNECTION CHANGE ' + connection.iceConnectionState)
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleICEGatheringStateChangeEvent (connection) {
|
|
||||||
console.log('ICE GATHERING CHANGE ' + connection.iceGatheringState)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function makeOffer (target) {
|
|
||||||
createPeerConnection(target)
|
|
||||||
|
|
||||||
var connection = connections[target]
|
|
||||||
|
|
||||||
var offer = await connection.createOffer()
|
|
||||||
send({
|
|
||||||
type: 'offer',
|
|
||||||
name: name,
|
|
||||||
target: target,
|
|
||||||
offer: offer
|
|
||||||
})
|
|
||||||
await connection.setLocalDescription(offer)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleOffer (offer, target) {
|
|
||||||
console.log('GOT OFFER FROM ' + target)
|
|
||||||
await createPeerConnection(target)
|
|
||||||
|
|
||||||
var connection = connections[target]
|
|
||||||
|
|
||||||
await connection.setRemoteDescription(new RTCSessionDescription(offer))
|
|
||||||
|
|
||||||
if (stream) {
|
|
||||||
console.log('STREAM DETECTED')
|
|
||||||
stream.getTracks().forEach((track) => {
|
|
||||||
console.log('ADDED TRACK')
|
|
||||||
connection.addTrack(track, stream)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var answer = await connection.createAnswer()
|
|
||||||
|
|
||||||
await connection.setLocalDescription(answer)
|
|
||||||
|
|
||||||
send({
|
|
||||||
type: 'answer',
|
|
||||||
name: name,
|
|
||||||
target: target,
|
|
||||||
answer: answer
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleAnswer (answer, target) {
|
|
||||||
console.log('GOT ANSWER FROM ' + target)
|
|
||||||
var connection = connections[target]
|
|
||||||
await connection.setRemoteDescription(new RTCSessionDescription(answer))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleCandidate (candidate, target) {
|
|
||||||
console.log('GOT CANDIDATE FROM ' + target)
|
|
||||||
var connection = connections[target]
|
|
||||||
await connection.addIceCandidate(new RTCIceCandidate(candidate))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleNegotiationNeededEvent (target) {
|
|
||||||
console.log('NEGOTIATION NEEDED FROM ' + target)
|
|
||||||
|
|
||||||
var connection = connections[target]
|
|
||||||
var offer = await connection.createOffer(offerOptions)
|
|
||||||
|
|
||||||
await connection.setLocalDescription(offer)
|
|
||||||
|
|
||||||
send({
|
|
||||||
type: 'video-offer',
|
|
||||||
name: name,
|
|
||||||
target: target,
|
|
||||||
sdp: connection.localDescription
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleLeave () {
|
|
||||||
connections.foreach((connection) => {
|
|
||||||
connection.close()
|
|
||||||
connection.onicecandidate = null
|
|
||||||
// connection.onaddstream = null
|
|
||||||
connection = null
|
|
||||||
})
|
|
||||||
connections = {}
|
|
||||||
remoteVideo.src = null
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleUserlist (list) {
|
|
||||||
console.log('GOT USER LIST')
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleVideoOffer (sdp, target) {
|
|
||||||
console.log('GOT VIDEO OFFER FROM '+target)
|
|
||||||
await createPeerConnection(target)
|
|
||||||
var connection = connections[target]
|
|
||||||
await connection.setRemoteDescription(new RTCSessionDescription(sdp))
|
|
||||||
|
|
||||||
if (stream) {
|
|
||||||
console.log('STREAM DETECTED')
|
|
||||||
stream.getTracks().forEach((track) => {
|
|
||||||
console.log('ADDED TRACK')
|
|
||||||
connection.addTrack(track, stream)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var answer = await connection.createAnswer()
|
|
||||||
await connection.setLocalDescription(answer)
|
|
||||||
|
|
||||||
send({
|
|
||||||
type: 'video-answer',
|
|
||||||
name: name,
|
|
||||||
target: target,
|
|
||||||
sdp: answer
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleVideoAnswer (sdp, target) {
|
|
||||||
console.log('GOT VIDEO ANSWER FROM '+target)
|
|
||||||
|
|
||||||
var connection = connections[target]
|
|
||||||
await connection.setRemoteDescription(new RTCSessionDescription(sdp))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleSignalingStateChangeEvent (connection) {
|
|
||||||
console.log('STATE CHANGED TO : ' + connection.signalingState)
|
|
||||||
switch(connection.signalingState) {
|
|
||||||
case 'closed':
|
|
||||||
await connection.close()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleTrackEvent (event) {
|
|
||||||
console.log('GOT TRACK')
|
|
||||||
remoteVideo.srcObject = event.streams[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
//connecting to our signaling server
|
|
||||||
const conn = new WebSocket('ws://localhost:9090')
|
|
||||||
|
|
||||||
conn.onopen = function () {
|
|
||||||
console.log('Connected to the signaling server')
|
|
||||||
};
|
|
||||||
|
|
||||||
//when we got a message from a signaling server
|
|
||||||
conn.onmessage = function (msg) {
|
|
||||||
console.log('Got message', msg.data)
|
|
||||||
|
|
||||||
var data = JSON.parse(msg.data)
|
|
||||||
|
|
||||||
switch(data.type) {
|
|
||||||
case 'login':
|
|
||||||
handleLogin(data.success)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'offer':
|
|
||||||
handleOffer(data.offer, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'answer':
|
|
||||||
handleAnswer(data.answer, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'candidate':
|
|
||||||
handleCandidate(data.candidate, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'userlist':
|
|
||||||
handleUserlist(data)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'leave':
|
|
||||||
handleLeave()
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'video-offer':
|
|
||||||
handleVideoOffer(data.sdp, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'video-answer':
|
|
||||||
handleVideoAnswer(data.sdp, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
conn.onerror = function (err) {
|
|
||||||
console.log('Got error', err)
|
|
||||||
}
|
|
||||||
|
|
||||||
function send (message) {
|
|
||||||
console.log('Sended message', message)
|
|
||||||
conn.send(JSON.stringify(message))
|
|
||||||
}
|
|
||||||
|
|
||||||
export default{
|
|
||||||
conn,
|
|
||||||
send,
|
|
||||||
makeOffer
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
const connection = new WebSocket('ws://localhost:9090')
|
|
||||||
|
|
||||||
connection.onopen = function () {
|
|
||||||
console.log('connectionected to the signaling server')
|
|
||||||
};
|
|
||||||
|
|
||||||
//when we got a message from a signaling server
|
|
||||||
connection.onmessage = function (msg) {
|
|
||||||
console.log('Got message', msg.data)
|
|
||||||
|
|
||||||
var data = JSON.parse(msg.data)
|
|
||||||
|
|
||||||
switch(data.type) {
|
|
||||||
case 'login':
|
|
||||||
handleLogin(data.success)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'offer':
|
|
||||||
handleOffer(data.offer, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'answer':
|
|
||||||
handleAnswer(data.answer, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'candidate':
|
|
||||||
handleCandidate(data.candidate, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'userlist':
|
|
||||||
handleUserlist(data)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'leave':
|
|
||||||
handleLeave()
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'video-offer':
|
|
||||||
handleVideoOffer(data.sdp, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'video-answer':
|
|
||||||
handleVideoAnswer(data.sdp, data.name)
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connection.onerror = function (err) {
|
|
||||||
console.log('Got error', err)
|
|
||||||
}
|
|
||||||
|
|
||||||
function send (message) {
|
|
||||||
console.log('Sended message', message)
|
|
||||||
connection.send(JSON.stringify(message))
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
send
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="fr">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
|
||||||
<link rel="stylesheet" href="style.css" />
|
|
||||||
<title>Lil'Streamy</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="loginDiv">
|
|
||||||
<input class="input" id="loginInput" placeholder="username" type="text"/>
|
|
||||||
<button class="button" id="loginBt" >Login</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="connectDiv">
|
|
||||||
<input id="callInput" placeholder="user to call" type="text"/>
|
|
||||||
<button id="callBt" >Connect</button>
|
|
||||||
<hr>
|
|
||||||
<input id="videoInput" type="file" accept="video/*"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="videoDiv">
|
|
||||||
<h2 id="videoTitle"></h2>
|
|
||||||
<video autoplay controls id="video"></video>
|
|
||||||
<hr>
|
|
||||||
<button id="disconnectBt">Disconnect</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="loadDiv">
|
|
||||||
<div class="loader" style="display:block"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
|
||||||
<script src = "scripts/script.js"></script>
|
|
||||||
<script src = "scripts/rtc.js"></script>
|
|
||||||
<script src = "scripts/signal.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
body {
|
|
||||||
color: #ffffff;
|
|
||||||
background-color: #23232e;
|
|
||||||
font: 14px normal Arial, Helvetica, sans-serif;
|
|
||||||
z-index: -4;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
display: none;
|
|
||||||
margin: auto;
|
|
||||||
padding: 20px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
video {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loadDiv {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
z-index: 1;
|
|
||||||
padding-top: 100px;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
background-color: rgb(0,0,0);
|
|
||||||
background-color: rgba(0,0,0,0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.loader {
|
|
||||||
margin: auto;
|
|
||||||
padding: 20px;
|
|
||||||
border: 16px solid #f3f3f3;
|
|
||||||
border-top: 16px solid #3498db;
|
|
||||||
border-bottom: 16px solid violet;
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 120px;
|
|
||||||
height: 120px;
|
|
||||||
animation: spin 0.5s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% { transform: rotate(0deg); }
|
|
||||||
100% { transform: rotate(360deg); }
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@ const fs = require('fs')
|
|||||||
const bodyParser = require('body-parser')
|
const bodyParser = require('body-parser')
|
||||||
const cors = require('cors')
|
const cors = require('cors')
|
||||||
const config = require('../config.json')
|
const config = require('../config.json')
|
||||||
|
const signal = require('./signal')
|
||||||
const https = require('https')
|
const https = require('https')
|
||||||
const WebSocketServer = require('ws').Server
|
const WebSocketServer = require('ws').Server
|
||||||
|
|
||||||
@@ -18,109 +19,17 @@ app.use(cors())
|
|||||||
app.use(bodyParser.urlencoded({ extended: false }))
|
app.use(bodyParser.urlencoded({ extended: false }))
|
||||||
app.use(bodyParser.json())
|
app.use(bodyParser.json())
|
||||||
|
|
||||||
app.use(express.static('./client'))
|
app.use(express.static('../../client'))
|
||||||
|
|
||||||
server.listen(port, () => {
|
server.listen(port, () => {
|
||||||
console.log(`Launching Lil'Streamy on ${port}`)
|
console.log(`Launching Lil'Streamy on ${port}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var users = {}
|
|
||||||
|
|
||||||
wss.on('connection', function(connection) {
|
wss.on('connection', function(connection) {
|
||||||
console.log('User connected')
|
console.log('User connected')
|
||||||
|
|
||||||
connection.on('message', (message) => onMessage(connection, message))
|
connection.on('message', (message) => signal.onMessage(connection, message))
|
||||||
|
|
||||||
connection.on('close', () => onClose(connection))
|
connection.on('close', () => signal.onClose(connection))
|
||||||
})
|
})
|
||||||
|
|
||||||
function sendTo(connection, message) {
|
|
||||||
connection.send(JSON.stringify(message))
|
|
||||||
}
|
|
||||||
|
|
||||||
function onClose(connection) {
|
|
||||||
if(connection.name) {
|
|
||||||
delete users[connection.name]
|
|
||||||
|
|
||||||
if(connection.otherName) {
|
|
||||||
console.log('Disconnecting from ', connection.otherName)
|
|
||||||
var conn = users[connection.otherName]
|
|
||||||
conn.otherName = null
|
|
||||||
|
|
||||||
if(conn != null) {
|
|
||||||
sendTo(conn, {
|
|
||||||
type: 'leave'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function onMessage(connection, message) {
|
|
||||||
var data
|
|
||||||
|
|
||||||
try {
|
|
||||||
data = JSON.parse(message);
|
|
||||||
} catch (e) {
|
|
||||||
console.log('Invalid JSON')
|
|
||||||
data = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (data.type) {
|
|
||||||
case 'login' :
|
|
||||||
console.log('User logged', data.name);
|
|
||||||
if(users[data.name]) {
|
|
||||||
sendTo(connection, {
|
|
||||||
type: 'login',
|
|
||||||
success: false
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
users[data.name] = connection
|
|
||||||
connection.name = data.name
|
|
||||||
|
|
||||||
sendTo(connection, {
|
|
||||||
type: 'login',
|
|
||||||
success: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'leave' :
|
|
||||||
console.log('Disconnecting from', data.name)
|
|
||||||
var conn = users[data.name]
|
|
||||||
conn.otherName = null
|
|
||||||
|
|
||||||
//notify the other user so he can disconnect his peer connection
|
|
||||||
/*
|
|
||||||
if(conn != null) {
|
|
||||||
sendTo(conn, {
|
|
||||||
type: 'leave'
|
|
||||||
});
|
|
||||||
}*/
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'userlist' :
|
|
||||||
console.log('Send list to', data.name)
|
|
||||||
sendTo(connection, {
|
|
||||||
type: 'userlist',
|
|
||||||
list: users
|
|
||||||
});
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (data.target){
|
|
||||||
var targetConnection = users[data.target];
|
|
||||||
if(targetConnection){
|
|
||||||
console.log('Forward message from ' + data.name + ' to ' + data.target + ' (' + data.type + ')')
|
|
||||||
sendTo(targetConnection, data)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sendTo(connection, {
|
|
||||||
type: 'error',
|
|
||||||
message: 'Command not found: ' + data.type
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,21 +1,25 @@
|
|||||||
const WebSocketServer = require('ws').Server
|
var users = new Map()
|
||||||
|
|
||||||
var wss = new WebSocketServer({port: 9090})
|
|
||||||
|
|
||||||
var users = {}
|
|
||||||
|
|
||||||
wss.on('connection', function(connection) {
|
|
||||||
console.log('User connected')
|
|
||||||
|
|
||||||
connection.on('message', (message) => onMessage(connection, message))
|
|
||||||
|
|
||||||
connection.on('close', () => onClose(connection))
|
|
||||||
})
|
|
||||||
|
|
||||||
function sendTo(connection, message) {
|
function sendTo(connection, message) {
|
||||||
connection.send(JSON.stringify(message))
|
connection.send(JSON.stringify(message))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function broadcast(message) {
|
||||||
|
console.log('Broadcast '+message)
|
||||||
|
var jsonMessage = JSON.stringify(message)
|
||||||
|
Object.keys(users).forEach(function(key) {
|
||||||
|
users[key].send(jsonMessage)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUserlist(){
|
||||||
|
var usersArray = []
|
||||||
|
Object.keys(users).forEach(function(key) {
|
||||||
|
usersArray.push(key)
|
||||||
|
})
|
||||||
|
return usersArray
|
||||||
|
}
|
||||||
|
|
||||||
function onClose(connection) {
|
function onClose(connection) {
|
||||||
if(connection.name) {
|
if(connection.name) {
|
||||||
delete users[connection.name]
|
delete users[connection.name]
|
||||||
@@ -60,43 +64,67 @@ function onMessage(connection, message) {
|
|||||||
type: 'login',
|
type: 'login',
|
||||||
success: true
|
success: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
broadcast({
|
||||||
|
type: 'userlist',
|
||||||
|
users: getUserlist()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'leave' :
|
case 'leave' :
|
||||||
console.log('Disconnecting from', data.name)
|
console.log('Disconnecting from', data.name)
|
||||||
var conn = users[data.name]
|
users[data.name] = null
|
||||||
conn.otherName = null
|
|
||||||
|
|
||||||
//notify the other user so he can disconnect his peer connection
|
//notify the other
|
||||||
/*
|
/*
|
||||||
if(conn != null) {
|
if(conn != null) {
|
||||||
sendTo(conn, {
|
broadcast({
|
||||||
type: 'leave'
|
type: 'leave',
|
||||||
|
name: data.name
|
||||||
});
|
});
|
||||||
}*/
|
}*/
|
||||||
break;
|
break
|
||||||
|
|
||||||
case 'userlist' :
|
case 'userlist' :
|
||||||
console.log('Send list to', data.name)
|
console.log('Send list to', data.name)
|
||||||
sendTo(connection, {
|
sendTo(connection, {
|
||||||
type: 'userlist',
|
type: 'userlist',
|
||||||
list: users
|
users: getUserlist()
|
||||||
});
|
})
|
||||||
break
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (data.target){
|
if (data.target) {
|
||||||
var targetConnection = users[data.target];
|
if (data.target == data.name) {
|
||||||
if(targetConnection){
|
sendTo(connection, {
|
||||||
|
type: 'error',
|
||||||
|
message: 'No loopback'
|
||||||
|
})
|
||||||
|
break
|
||||||
|
}
|
||||||
|
var targetConnection = users[data.target]
|
||||||
|
if (targetConnection) {
|
||||||
console.log('Forward message from ' + data.name + ' to ' + data.target + ' (' + data.type + ')')
|
console.log('Forward message from ' + data.name + ' to ' + data.target + ' (' + data.type + ')')
|
||||||
sendTo(targetConnection, data)
|
sendTo(targetConnection, data)
|
||||||
|
} else {
|
||||||
|
sendTo(connection, {
|
||||||
|
type: 'error',
|
||||||
|
message: 'Peer not found'
|
||||||
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sendTo(connection, {
|
sendTo(connection, {
|
||||||
type: 'error',
|
type: 'error',
|
||||||
message: 'Command not found: ' + data.type
|
message: 'Command not found: ' + data.type
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
sendTo,
|
||||||
|
broadcast,
|
||||||
|
onClose,
|
||||||
|
onMessage
|
||||||
|
}
|
||||||