Video chat application is started
This commit is contained in:
parent
4ea478f042
commit
b7faee5618
275
ng6-seed/package-lock.json
generated
275
ng6-seed/package-lock.json
generated
@ -1551,7 +1551,6 @@
|
||||
"version": "1.3.7",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
||||
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mime-types": "~2.1.24",
|
||||
"negotiator": "0.6.2"
|
||||
@ -1590,8 +1589,7 @@
|
||||
"after": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
|
||||
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
|
||||
"dev": true
|
||||
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
|
||||
},
|
||||
"agent-base": {
|
||||
"version": "4.3.0",
|
||||
@ -1938,6 +1936,11 @@
|
||||
"resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
|
||||
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
|
||||
},
|
||||
"async-limiter": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
|
||||
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
@ -2151,8 +2154,7 @@
|
||||
"backo2": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
|
||||
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
|
||||
"dev": true
|
||||
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
@ -2217,8 +2219,7 @@
|
||||
"base64-arraybuffer": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
|
||||
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
|
||||
"dev": true
|
||||
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
|
||||
},
|
||||
"base64-js": {
|
||||
"version": "1.3.1",
|
||||
@ -2249,7 +2250,6 @@
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
|
||||
"integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"callsite": "1.0.0"
|
||||
}
|
||||
@ -2642,8 +2642,7 @@
|
||||
"callsite": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
|
||||
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
|
||||
"dev": true
|
||||
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
|
||||
},
|
||||
"callsites": {
|
||||
"version": "2.0.0",
|
||||
@ -2975,8 +2974,7 @@
|
||||
"component-bind": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
|
||||
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
|
||||
"dev": true
|
||||
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
|
||||
},
|
||||
"component-emitter": {
|
||||
"version": "1.3.0",
|
||||
@ -2987,8 +2985,7 @@
|
||||
"component-inherit": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
|
||||
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
|
||||
"dev": true
|
||||
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
|
||||
},
|
||||
"compressible": {
|
||||
"version": "2.0.18",
|
||||
@ -6342,11 +6339,25 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"has-binary2": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
|
||||
"integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
|
||||
"requires": {
|
||||
"isarray": "2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"isarray": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
|
||||
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
|
||||
}
|
||||
}
|
||||
},
|
||||
"has-cors": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
|
||||
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
|
||||
"dev": true
|
||||
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
@ -6758,8 +6769,7 @@
|
||||
"indexof": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
|
||||
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
|
||||
"dev": true
|
||||
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
@ -8552,8 +8562,7 @@
|
||||
"negotiator": {
|
||||
"version": "0.6.2",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
|
||||
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
|
||||
"dev": true
|
||||
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
|
||||
},
|
||||
"neo-async": {
|
||||
"version": "2.6.1",
|
||||
@ -8651,6 +8660,213 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ngx-socket-io": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ngx-socket-io/-/ngx-socket-io-3.0.1.tgz",
|
||||
"integrity": "sha512-6+99AULDEcdrsFSd9FVo5mUSpQMa2KL6twPbteoEv3qWO0Hh2kdrzTjvPdsC2jeTuEuqa8R9l5/3eGYdiLZyWQ==",
|
||||
"requires": {
|
||||
"core-js": "^3.0.0",
|
||||
"reflect-metadata": "^0.1.10",
|
||||
"socket.io": "^2.2.0",
|
||||
"socket.io-client": "^2.2.0",
|
||||
"tslib": "^1.9.0",
|
||||
"zone.js": "^0.10.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"arraybuffer.slice": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
|
||||
"integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
|
||||
},
|
||||
"base64id": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
|
||||
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
|
||||
},
|
||||
"blob": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
|
||||
"integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
|
||||
},
|
||||
"component-emitter": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
|
||||
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.6.5",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
|
||||
"integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
|
||||
},
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"engine.io": {
|
||||
"version": "3.4.1",
|
||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz",
|
||||
"integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==",
|
||||
"requires": {
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "2.0.0",
|
||||
"cookie": "0.3.1",
|
||||
"debug": "~4.1.0",
|
||||
"engine.io-parser": "~2.2.0",
|
||||
"ws": "^7.1.2"
|
||||
}
|
||||
},
|
||||
"engine.io-client": {
|
||||
"version": "3.4.1",
|
||||
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz",
|
||||
"integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"component-inherit": "0.0.3",
|
||||
"debug": "~4.1.0",
|
||||
"engine.io-parser": "~2.2.0",
|
||||
"has-cors": "1.1.0",
|
||||
"indexof": "0.0.1",
|
||||
"parseqs": "0.0.5",
|
||||
"parseuri": "0.0.5",
|
||||
"ws": "~6.1.0",
|
||||
"xmlhttprequest-ssl": "~1.5.4",
|
||||
"yeast": "0.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"ws": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
|
||||
"integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
|
||||
"requires": {
|
||||
"async-limiter": "~1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"engine.io-parser": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
|
||||
"integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
|
||||
"requires": {
|
||||
"after": "0.8.2",
|
||||
"arraybuffer.slice": "~0.0.7",
|
||||
"base64-arraybuffer": "0.1.5",
|
||||
"blob": "0.0.5",
|
||||
"has-binary2": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"isarray": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
|
||||
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"socket.io": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
|
||||
"integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
|
||||
"requires": {
|
||||
"debug": "~4.1.0",
|
||||
"engine.io": "~3.4.0",
|
||||
"has-binary2": "~1.0.2",
|
||||
"socket.io-adapter": "~1.1.0",
|
||||
"socket.io-client": "2.3.0",
|
||||
"socket.io-parser": "~3.4.0"
|
||||
}
|
||||
},
|
||||
"socket.io-adapter": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
|
||||
"integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
|
||||
},
|
||||
"socket.io-client": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
|
||||
"integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
|
||||
"requires": {
|
||||
"backo2": "1.0.2",
|
||||
"base64-arraybuffer": "0.1.5",
|
||||
"component-bind": "1.0.0",
|
||||
"component-emitter": "1.2.1",
|
||||
"debug": "~4.1.0",
|
||||
"engine.io-client": "~3.4.0",
|
||||
"has-binary2": "~1.0.2",
|
||||
"has-cors": "1.1.0",
|
||||
"indexof": "0.0.1",
|
||||
"object-component": "0.0.3",
|
||||
"parseqs": "0.0.5",
|
||||
"parseuri": "0.0.5",
|
||||
"socket.io-parser": "~3.3.0",
|
||||
"to-array": "0.1.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"socket.io-parser": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
|
||||
"integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"debug": "~3.1.0",
|
||||
"isarray": "2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"socket.io-parser": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz",
|
||||
"integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"debug": "~4.1.0",
|
||||
"isarray": "2.0.1"
|
||||
}
|
||||
},
|
||||
"ws": {
|
||||
"version": "7.2.5",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
|
||||
"integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA=="
|
||||
},
|
||||
"xmlhttprequest-ssl": {
|
||||
"version": "1.5.5",
|
||||
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
|
||||
"integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
|
||||
},
|
||||
"zone.js": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
|
||||
"integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"ngx-viewer": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/ngx-viewer/-/ngx-viewer-1.0.5.tgz",
|
||||
@ -9011,8 +9227,7 @@
|
||||
"object-component": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
|
||||
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
|
||||
"dev": true
|
||||
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
|
||||
},
|
||||
"object-copy": {
|
||||
"version": "0.1.0",
|
||||
@ -9522,7 +9737,6 @@
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
|
||||
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"better-assert": "~1.0.0"
|
||||
}
|
||||
@ -9531,7 +9745,6 @@
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
|
||||
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"better-assert": "~1.0.0"
|
||||
}
|
||||
@ -10253,6 +10466,11 @@
|
||||
"readable-stream": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"recordrtc": {
|
||||
"version": "5.5.9",
|
||||
"resolved": "https://registry.npmjs.org/recordrtc/-/recordrtc-5.5.9.tgz",
|
||||
"integrity": "sha512-6T1tn80nRfsXrAoYWINwz+hBKk+pB5Im4I0BS52Og1ruQvrEdV3IUcm+AKwLMHNyBAhJ2DaVa+9pukTRxMF/uA=="
|
||||
},
|
||||
"redent": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
|
||||
@ -10265,8 +10483,7 @@
|
||||
"reflect-metadata": {
|
||||
"version": "0.1.13",
|
||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
|
||||
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
|
||||
},
|
||||
"regenerate": {
|
||||
"version": "1.4.0",
|
||||
@ -12071,8 +12288,7 @@
|
||||
"to-array": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
|
||||
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
|
||||
"dev": true
|
||||
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
|
||||
},
|
||||
"to-arraybuffer": {
|
||||
"version": "1.0.1",
|
||||
@ -13311,8 +13527,7 @@
|
||||
"yeast": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
|
||||
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
|
||||
"dev": true
|
||||
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
|
||||
},
|
||||
"yn": {
|
||||
"version": "2.0.0",
|
||||
|
||||
@ -67,10 +67,12 @@
|
||||
"ngx-mat-daterange-picker": "^1.1.4",
|
||||
"ngx-mat-select-search": "^1.8.0",
|
||||
"ngx-perfect-scrollbar": "5.0.0-7",
|
||||
"ngx-socket-io": "^3.0.1",
|
||||
"ngx-viewer": "^1.0.5",
|
||||
"node-sass": "^4.13.0",
|
||||
"perfect-scrollbar": "^1.3.0",
|
||||
"quill": "^1.3.7",
|
||||
"recordrtc": "^5.5.9",
|
||||
"rxjs": "^6.5.4",
|
||||
"rxjs-compat": "^6.5.4",
|
||||
"screenfull": "^3.2.2",
|
||||
|
||||
@ -34,7 +34,7 @@ import {MatSelectModule} from '@angular/material/select';
|
||||
import {MatCardModule} from '@angular/material/card';
|
||||
import {MatBadgeModule} from '@angular/material/badge';
|
||||
import {ChangePasswordDialog} from './settings/users/user-profile/user-profile.component';
|
||||
import { MatFormFieldModule,MatProgressSpinnerModule } from '@angular/material';
|
||||
import { MatFormFieldModule,MatProgressSpinnerModule, MatDialogModule, MatTooltipModule, MatButtonModule } from '@angular/material';
|
||||
import { AppRoutes } from './app.routing';
|
||||
import { AppComponent } from './app.component';
|
||||
import { AdminLayoutComponent } from './layouts/admin/admin-layout.component';
|
||||
@ -58,7 +58,9 @@ import { AsyncPipe } from '../../node_modules/@angular/common';
|
||||
import { PdTrigerService } from './personal-discussion/pd-service/pd-triger.service';
|
||||
import { HttpLoaderComponent } from './layouts/http-loader/http-loader.component';
|
||||
import { LoaderService } from './shared/loaderService/loader.service';
|
||||
|
||||
import {SocketIoConfig, SocketIoModule} from 'ngx-socket-io';
|
||||
import { IncomingCallComponent } from './video-chat/incoming-call/incoming-call.component';
|
||||
import { VideoChatComponent } from './video-chat/video-chat.component'
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient) {
|
||||
return new TranslateHttpLoader(http);
|
||||
@ -72,14 +74,17 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||
suppressScrollX: true
|
||||
};
|
||||
|
||||
const socketConfig: SocketIoConfig = { url: environment.socketServerUrl, options: {} };
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
AppComponent,
|
||||
AdminLayoutComponent,
|
||||
AuthLayoutComponent,
|
||||
NewPasswordDialog,ForgotPass,ChangePasswordDialog, RoleMenuItemsPipe, HttpLoaderComponent
|
||||
NewPasswordDialog,ForgotPass,ChangePasswordDialog, RoleMenuItemsPipe, HttpLoaderComponent, IncomingCallComponent, VideoChatComponent
|
||||
],
|
||||
imports: [
|
||||
MatDialogModule,
|
||||
BrowserModule,
|
||||
BrowserAnimationsModule,
|
||||
SharedModule,
|
||||
@ -89,12 +94,15 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||
MatSidenavModule,
|
||||
MatInputModule,
|
||||
MatIconModule,
|
||||
MatButtonModule,
|
||||
MatListModule,
|
||||
MatMenuModule,
|
||||
MatToolbarModule,
|
||||
MatTabsModule,
|
||||
MatCheckboxModule,
|
||||
MatProgressBarModule,MatProgressSpinnerModule,
|
||||
MatTooltipModule,
|
||||
|
||||
MatSelectModule,
|
||||
MatCardModule,
|
||||
MatBadgeModule,
|
||||
@ -114,6 +122,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||
AngularFireAuthModule,
|
||||
AngularFireMessagingModule,
|
||||
AngularFireModule.initializeApp(environment.firebase),
|
||||
SocketIoModule.forRoot(socketConfig)
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
@ -134,7 +143,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||
},
|
||||
MessagingService, AsyncPipe,LoaderService
|
||||
],
|
||||
entryComponents: [NewPasswordDialog,ForgotPass,ChangePasswordDialog],
|
||||
entryComponents: [NewPasswordDialog,ForgotPass,ChangePasswordDialog,IncomingCallComponent,VideoChatComponent],
|
||||
bootstrap: [AppComponent]
|
||||
})
|
||||
export class AppModule { }
|
||||
|
||||
@ -15,6 +15,10 @@ import { AwsService } from '../../AwsService/aws.service';
|
||||
import { RoleMenuItemsPipe } from './../role-menu-items.pipe';
|
||||
import 'rxjs/add/observable/interval';
|
||||
import { MessagingService } from 'app/shared/messaging.service';
|
||||
import { IncomingCallComponent } from '../../video-chat/incoming-call/incoming-call.component';
|
||||
import { Socket } from 'ngx-socket-io';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import { VideoChatComponent } from 'app/video-chat/video-chat.component';
|
||||
|
||||
|
||||
|
||||
@ -59,8 +63,8 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
|
||||
permissionDeined : boolean = true;
|
||||
alertTAT: any;
|
||||
countTAT: number;
|
||||
|
||||
constructor(private router: Router, public menuItems: MenuItems, public horizontalMenuItems : HorizontalMenuItems, public translate: TranslateService,public aws:AwsService,public users:UserService,private _dashboardService: DashboardService,private messagingService:MessagingService) {
|
||||
incomingDialogOpened:boolean = false
|
||||
constructor(private router: Router, public menuItems: MenuItems, public horizontalMenuItems : HorizontalMenuItems, public translate: TranslateService,public aws:AwsService,public users:UserService,private _dashboardService: DashboardService,private messagingService:MessagingService,private socket:Socket,private matDialog:MatDialog) {
|
||||
|
||||
const browserLang: string = translate.getBrowserLang();
|
||||
translate.use(browserLang.match(/en|fr/) ? browserLang : 'en');
|
||||
@ -138,7 +142,8 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
|
||||
// Ps.update(elemContent);
|
||||
}
|
||||
});
|
||||
|
||||
this.listenForCalls()
|
||||
this.openIncomingDialog();
|
||||
}
|
||||
|
||||
@HostListener('click', ['$event'])
|
||||
@ -311,4 +316,51 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// FOR LISTENING TO RECIEVE CALLS FROM CALLER
|
||||
listenForCalls() {
|
||||
// this.socket.on('BackOffer', this.connectPeer)
|
||||
this.socket.fromEvent('BackOffer').subscribe(res=>{
|
||||
console.log(res)
|
||||
this.connectPeer(res);
|
||||
})
|
||||
}
|
||||
connectPeer(offer) {
|
||||
console.log(offer)
|
||||
// alert("Offer is listened");
|
||||
this.openIncomingDialog(offer);
|
||||
}
|
||||
openIncomingDialog(offer?) {
|
||||
if(this.incomingDialogOpened == true) {
|
||||
return;
|
||||
}
|
||||
this.incomingDialogOpened = true
|
||||
const dialogRef = this.matDialog.open(IncomingCallComponent,{
|
||||
// minWidth:'25%',
|
||||
// maxWidth:'30%',
|
||||
disableClose: true,
|
||||
backdropClass: 'incoming-call-background' ,
|
||||
panelClass:'incoming-call-background'
|
||||
})
|
||||
dialogRef.afterClosed().subscribe(data=>{
|
||||
console.log(data)
|
||||
if(data == 'decline'){
|
||||
this.incomingDialogOpened = false
|
||||
}
|
||||
else {
|
||||
this.incomingDialogOpened = false
|
||||
this.openVideoChatDialog(offer)
|
||||
}
|
||||
})
|
||||
}
|
||||
openVideoChatDialog(offer) {
|
||||
let dialogRef = this.matDialog.open(VideoChatComponent,{
|
||||
data:{chat_info:'call_recieving',JSON_to_connect:offer},
|
||||
maxWidth: '100vw',
|
||||
maxHeight: '100vh',
|
||||
height: '100%',
|
||||
width: '100%',
|
||||
disableClose: true,
|
||||
panelClass:'video-chat'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
<div fxLayout="column" fxLayoutGap="50px">
|
||||
<div class="label" fxLayoutAlign="center center">
|
||||
Incoming Call
|
||||
</div>
|
||||
<div class="call-animation">
|
||||
<div fxFlex="135px" fxLayout.xs ="100%">
|
||||
<img class="img-circle" src="../../assets/spinner/notfound_blue.png" alt="Image"/>
|
||||
</div>
|
||||
</div>
|
||||
<div fxLayout="row" class="user-name" fxLayoutAlign="center center">
|
||||
<!-- <div > -->
|
||||
<h6>User Name</h6>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
<div fxLayout="row" fxLayoutAlign="center center" fxLayoutGap="30px" fxLayoutGap.xs="5px">
|
||||
<div fxLayout="column">
|
||||
<button mat-raised-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Answer" matTooltipPosition="above" (click)="answer_call()"><mat-icon>call</mat-icon>
|
||||
Answer</button>
|
||||
</div>
|
||||
<div fxLayout="column">
|
||||
<button mat-raised-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Decline" matTooltipPosition="above" (click)="closeDialog()"><mat-icon>call_end</mat-icon>
|
||||
Decline</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -0,0 +1,56 @@
|
||||
::ng-deep { .incoming-call-background > mat-dialog-container {
|
||||
background: #71AFFF;
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
.label{
|
||||
margin-bottom: 5% !important;
|
||||
color: white
|
||||
}
|
||||
.user-name {
|
||||
margin: 8% !important;
|
||||
h6{
|
||||
font-weight: bold;
|
||||
}
|
||||
color: white
|
||||
}
|
||||
.call-animation {
|
||||
background: #fff;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
position: relative;
|
||||
margin: 0px auto !important;
|
||||
border-radius: 100%;
|
||||
border: solid 5px #fff;
|
||||
animation: play 2s ease infinite;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
|
||||
}
|
||||
img {
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
border-radius: 100%;
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
@keyframes play {
|
||||
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
15% {
|
||||
box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
25% {
|
||||
box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.4), 0 0 0 20px rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
25% {
|
||||
box-shadow: 0 0 0 15px rgba(255, 255, 255, 0.4), 0 0 0 30px rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { IncomingCallComponent } from './incoming-call.component';
|
||||
|
||||
describe('IncomingCallComponent', () => {
|
||||
let component: IncomingCallComponent;
|
||||
let fixture: ComponentFixture<IncomingCallComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ IncomingCallComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(IncomingCallComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,21 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { MatDialogRef } from '@angular/material';
|
||||
|
||||
@Component({
|
||||
selector: 'app-incoming-call',
|
||||
templateUrl: './incoming-call.component.html',
|
||||
styleUrls: ['./incoming-call.component.scss']
|
||||
})
|
||||
export class IncomingCallComponent implements OnInit {
|
||||
|
||||
constructor(private dialogRef:MatDialogRef<IncomingCallComponent>) { }
|
||||
|
||||
ngOnInit() {
|
||||
}
|
||||
closeDialog(){
|
||||
this.dialogRef.close('decline');
|
||||
}
|
||||
answer_call(){
|
||||
this.dialogRef.close('answered');
|
||||
}
|
||||
}
|
||||
71
ng6-seed/src/app/video-chat/video-chat.component.html
Normal file
71
ng6-seed/src/app/video-chat/video-chat.component.html
Normal file
@ -0,0 +1,71 @@
|
||||
<div fxLayout="column">
|
||||
<div align="end" style="float:right;padding: 10px !important;" fxLayoutAlign="flex-end">
|
||||
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Close"
|
||||
matTooltipPosition="right" (click)="close_all()">
|
||||
<mat-icon>close</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
<!-- <mat-dialog-content> -->
|
||||
<!-- <div fxLayout="row"> -->
|
||||
<div [style.visibility] ="is_video_enable? 'visible' : 'hidden'">
|
||||
<!-- <div class="my_video"> -->
|
||||
<video #myvideo id="myvideo" [style.visibility]="myVideoEnable? 'visible' : 'hidden'" muted></video>
|
||||
<!-- </div> -->
|
||||
<div class="peer_video" fxLayoutAlign="center" >
|
||||
<video id="peervideo" #peervideo [style.visibility]="peerVideoEnable? 'visible' : 'hidden'"></video>
|
||||
</div>
|
||||
<!-- <input type="text" ><br/> -->
|
||||
<!-- {{peerVideoEnable}} -->
|
||||
<!-- <div class="peer_message" *ngIf="peerVideoEnable == false">
|
||||
<p> Waiting for Connection</p>
|
||||
</div> -->
|
||||
<!-- <div class="input-group mb-3">
|
||||
<label>Paste the JSON String</label>
|
||||
<input type="text" class="form-control" [(ngModel)]="targetpeer" placeholder="JSON String" aria-label="Username" aria-describedby="basic-addon1">
|
||||
</div> -->
|
||||
<!-- <button type="button" class="btn btn-primary" (click)="connect()" >Connect</button> -->
|
||||
<!-- <button type="button" (click)="message()">Send Message</button> -->
|
||||
<div style="text-align: center;float:center" fxLayout="row" fxLayoutAlign="center" fxLayoutGap = "25px">
|
||||
<!-- <button type="button" style="width: 90px" (click)="switch_camera()" class="btn btn-primary btn-lg" disabled #camera_switch>Switch</button> -->
|
||||
<!-- <button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Switch Camera"
|
||||
matTooltipPosition="above" (click)="switch_camera()" disabled #camera_switch >
|
||||
<mat-icon>switch_camera</mat-icon>
|
||||
</button> -->
|
||||
<!-- <button type="button" style="width: 90px" (click)="start_Calling('init')" class="btn btn-primary btn-lg" *ngIf="!peerVideoEnable">Call</button><br/> -->
|
||||
<!-- <button type="button" style="width: 90px" (click)="start_Calling('notinit')" class="btn btn-primary btn-lg" *ngIf="!peerVideoEnable">Recieve</button><br/> -->
|
||||
<!-- <button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Disconnect"
|
||||
matTooltipPosition="above" *ngIf="peerVideoEnable"><mat-icon>call_end</mat-icon></button><br/> -->
|
||||
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Video Off / On"
|
||||
matTooltipPosition="above" (click)="videoHandling()" *ngIf="peerVideoEnable">
|
||||
<mat-icon *ngIf="video_mute">videocam_off</mat-icon>
|
||||
<mat-icon *ngIf="!video_mute">videocam</mat-icon>
|
||||
</button>
|
||||
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Mic Off / On"
|
||||
matTooltipPosition="above" (click)="micMuteHandling()" *ngIf="peerVideoEnable">
|
||||
<mat-icon *ngIf="mic_mute">mic_off</mat-icon>
|
||||
<mat-icon *ngIf="!mic_mute">mic</mat-icon>
|
||||
</button>
|
||||
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Disconnect"
|
||||
matTooltipPosition="above" (click)="disconnect()" *ngIf="peerVideoEnable">
|
||||
<mat-icon>call_end</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div fxLayoutAlign="center center" style="margin-top:10%" *ngIf="!is_video_enable">
|
||||
<div fxLayout="column" fxLayoutAlign="center center">
|
||||
<div fxLayout="row">
|
||||
<button mat-raised-button type="button" matTooltip="Start Video Chat" matTooltipPosition = "above">
|
||||
<mat-icon>videocam</mat-icon>
|
||||
Start Video Chat
|
||||
</button>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
<!-- <div fxLayout="column"> -->
|
||||
<div class="note-label">
|
||||
<p>Note : Make sure the Reciever is waiting for your call before start Calling</p>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
<!-- </mat-dialog-content> -->
|
||||
73
ng6-seed/src/app/video-chat/video-chat.component.scss
Normal file
73
ng6-seed/src/app/video-chat/video-chat.component.scss
Normal file
@ -0,0 +1,73 @@
|
||||
::ng-deep { .video-chat > mat-dialog-container {
|
||||
background: #71AFFF;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width:500px) {
|
||||
|
||||
video#myvideo {
|
||||
max-width: 32%;
|
||||
// min-width: 150px;
|
||||
position: absolute;
|
||||
border: 2px solid #9E9E9E;
|
||||
top:0;
|
||||
left: 0;
|
||||
// /* top: 20px;
|
||||
}
|
||||
|
||||
video#peervideo {
|
||||
/* height: 498px; */
|
||||
// position: relative;
|
||||
// margin-top: 126px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.peer_message{
|
||||
font-size: 20px;
|
||||
position: absolute;
|
||||
top: 11%;
|
||||
float: right;
|
||||
padding: 57px;
|
||||
/* border: 2px solid lavender; */
|
||||
left: 8%;
|
||||
p{
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media(min-width:500px) {
|
||||
.peer_video{
|
||||
max-height: 80vh;
|
||||
}
|
||||
video#myvideo {
|
||||
max-width: 22%;
|
||||
// min-width: 150px;
|
||||
position: absolute;
|
||||
border: 2px solid #9E9E9E;
|
||||
top:0;
|
||||
left: 0;
|
||||
// max-width: 45%;
|
||||
// text-align: center;
|
||||
// margin-left:3%;
|
||||
// margin-top:1%;
|
||||
// min-width: 150px;
|
||||
// position: absolute;
|
||||
// border: 2px solid #9E9E9E;
|
||||
// /* top: 20px;
|
||||
}
|
||||
|
||||
video#peervideo {
|
||||
/* height: 498px; */
|
||||
max-width: 100%;
|
||||
text-align: center;
|
||||
margin-left:3%;
|
||||
margin-top:1%;
|
||||
// position: relative;
|
||||
// margin-top: 126px;
|
||||
// width: 100%;
|
||||
}
|
||||
}
|
||||
body{
|
||||
margin:10px !important;
|
||||
}
|
||||
25
ng6-seed/src/app/video-chat/video-chat.component.spec.ts
Normal file
25
ng6-seed/src/app/video-chat/video-chat.component.spec.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { VideoChatComponent } from './video-chat.component';
|
||||
|
||||
describe('VideoChatComponent', () => {
|
||||
let component: VideoChatComponent;
|
||||
let fixture: ComponentFixture<VideoChatComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ VideoChatComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(VideoChatComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
421
ng6-seed/src/app/video-chat/video-chat.component.ts
Normal file
421
ng6-seed/src/app/video-chat/video-chat.component.ts
Normal file
@ -0,0 +1,421 @@
|
||||
import { Component, OnInit, ChangeDetectorRef, ViewChild, Inject } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { PushNotifyService } from 'app/shared/push-notify.service';
|
||||
import { Socket } from 'ngx-socket-io';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
|
||||
|
||||
@Component({
|
||||
selector: 'app-video-chat',
|
||||
templateUrl: './video-chat.component.html',
|
||||
styleUrls: ['./video-chat.component.scss']
|
||||
})
|
||||
export class VideoChatComponent implements OnInit {
|
||||
MediaStream
|
||||
title = 'simple-peer-video-chat';
|
||||
peer:any;
|
||||
targetpeer: string;
|
||||
enableBtn: boolean;
|
||||
@ViewChild('myvideo') myVideo: any;
|
||||
@ViewChild('peervideo') peervideo: any;
|
||||
@ViewChild('camera_switch') camereSwitchBtn: any;
|
||||
// @ViewChild('textToCopy',{static:true}) textCopyElement: any;
|
||||
n = <any>navigator.mediaDevices;
|
||||
// public textToCopy:any;
|
||||
myVideoEnable: boolean = false;
|
||||
peerVideoEnable: boolean = false;
|
||||
shouldFaceUser: boolean = true;
|
||||
userCallType: any;
|
||||
is_video_enable:boolean = false;
|
||||
mic_mute: boolean = true;
|
||||
video_mute: boolean = true;
|
||||
constructor(private _notificationService:PushNotifyService,
|
||||
private cdRef: ChangeDetectorRef,private socket: Socket,
|
||||
private dialogRef: MatDialogRef<VideoChatComponent>,
|
||||
@Inject(MAT_DIALOG_DATA) public chat_info:any) {
|
||||
this._notificationService.requestPermission();
|
||||
// this.notify('Approval','This is First Alert -- By Debasis Saha')
|
||||
console.log("Version #8")
|
||||
}
|
||||
notify(title,approval) {
|
||||
let data: Array < any >= [];
|
||||
data.push({
|
||||
'title': title,
|
||||
'body': approval
|
||||
});
|
||||
this._notificationService.generateNotification(data);
|
||||
}
|
||||
// ngOnInit() {
|
||||
// setTimeout(()=>{
|
||||
// console.log("ngOninti")
|
||||
// this.peer = new SimplePeer({
|
||||
// initiator: location.hash === '#init',
|
||||
// trickle: false
|
||||
// })
|
||||
// console.log(this.peer)
|
||||
// this.peer.on('signal', function(data) {
|
||||
// console.log(JSON.stringify(data));
|
||||
|
||||
// this.targetpeer = data;
|
||||
// })
|
||||
// this.peer.on('error', err => console.log('error', err))
|
||||
// this.peer.on('data', function(data) {
|
||||
// console.log('Recieved message:' + data);
|
||||
// this.notify('notify',data)
|
||||
// })
|
||||
// this.peer.on('connect', () => {
|
||||
// console.log('CONNECT')
|
||||
// this.peer.send('whatever' + Math.random())
|
||||
// })
|
||||
// setTimeout(()=>{
|
||||
// console.log("updated")
|
||||
// this.enableBtn=true
|
||||
// this.notify('notify','enabled')
|
||||
// },1000)
|
||||
// },3000)
|
||||
// }
|
||||
|
||||
ngOnInit() {
|
||||
console.log(this.chat_info);
|
||||
if(this.chat_info) {
|
||||
if(this.chat_info.chat_info == 'call_recieving' && this.chat_info.hasOwnProperty('JSON_to_connect') && this.chat_info.JSON_to_connect) {
|
||||
this.is_video_enable = true;
|
||||
this.start_Calling('receive')
|
||||
}
|
||||
}
|
||||
// this.start_Calling('receive')
|
||||
}
|
||||
start_Calling(option) {
|
||||
this.userCallType = option
|
||||
// let texk=this.textCopyElement.nativeElement
|
||||
let video = this.myVideo.nativeElement;
|
||||
let peerVideo = this.peervideo.nativeElement
|
||||
let peerx: any;
|
||||
let copyMessageText
|
||||
this.n.getUserMedia = (this.n.getUserMedia || this.n.webkitGetUserMedia || this.n.mozGetUserMedia || this.n.msGetUserMedia);
|
||||
if(this.n.getUserMedia == undefined || this.n.getUserMedia == null, this.n.getUserMedia == ''){
|
||||
alert("unable to get the camera access. please close the browser and come back again")
|
||||
}
|
||||
console.log(this.n)
|
||||
let defaultsOpts = { audio: true, video: {
|
||||
facingMode: this.shouldFaceUser ? 'user' : 'environment'
|
||||
}
|
||||
}
|
||||
this.n.getUserMedia(defaultsOpts).then(stream=> {
|
||||
this.socket.emit('NewClient')
|
||||
video.load();
|
||||
video.muted = true;
|
||||
this.fetchVideoAndPlay(stream,video);
|
||||
this.myVideoEnable = true
|
||||
this.MediaStream = stream
|
||||
// let switchCameraBtn= this.camereSwitchBtn.nativeElement
|
||||
let supports = navigator.mediaDevices.getSupportedConstraints();
|
||||
console.log(supports)
|
||||
if( supports['facingMode'] === true ) {
|
||||
// switchCameraBtn.disabled = false;
|
||||
}
|
||||
console.log("entered",stream);
|
||||
peerx = new SimplePeer ({
|
||||
initiator: option === 'init',
|
||||
stream: stream,
|
||||
reconnectTimer: 1000,
|
||||
iceTransportPolicy: 'relay',
|
||||
trickle: false,
|
||||
config: {
|
||||
iceServers: [
|
||||
{
|
||||
"urls": "stun:numb.viagenie.ca",
|
||||
"username": 'fairojm@gmail.com',
|
||||
"credential": 'fairojfai00'
|
||||
},
|
||||
{
|
||||
"urls": "turn:numb.viagenie.ca",
|
||||
"username": "fairojm@gmail.com",
|
||||
"credential": "fairojfai00"
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
// function InitPeer(type) {
|
||||
peerx.on('signal',(data)=> {
|
||||
|
||||
console.log(JSON.stringify(data));
|
||||
if(data.hasOwnProperty('type') && data.type == 'offer'){
|
||||
console.log("entered!!!!!!!!!!!!!!!!1");
|
||||
this.socket.emit('Offer', data)
|
||||
}
|
||||
else if(data.type == 'answer'){
|
||||
this.socket.emit('Answer', data)
|
||||
}
|
||||
// copyMessage(JSON.stringify(data))
|
||||
copyMessageText = JSON.stringify(data);
|
||||
// update()
|
||||
this.copyMessage(copyMessageText,data.type)
|
||||
// this.targetpeer = data;
|
||||
})
|
||||
// }
|
||||
peerx.on('data', function(data) {
|
||||
console.log('Recieved message:' + data);
|
||||
})
|
||||
peerx.on('close', (data) => {
|
||||
console.log("Peer Connection is closed ",data);
|
||||
this.disconnect();
|
||||
// alert("Peer Connection is closed " +JSON.stringify(data))
|
||||
this.notify("Connection Closed",'Peer Connection Closed'+JSON.stringify(data))
|
||||
})
|
||||
peerx.on('error', (err) => {
|
||||
console.log("Fatal Error ",err);
|
||||
|
||||
alert("Fatal Error" +JSON.stringify(err))
|
||||
})
|
||||
peerx.on('stream', (stream)=> {
|
||||
console.log("@##################33",stream)
|
||||
if ('srcObject' in peerVideo) {
|
||||
peerVideo.srcObject = stream
|
||||
} else {
|
||||
peerVideo.src = window.URL.createObjectURL(stream) // for older browsers
|
||||
}
|
||||
// video.play();
|
||||
|
||||
// console.log(this.peerVideoEnable);
|
||||
peerVideo.load();
|
||||
this. fetchVideoAndPlay(stream,peerVideo,true);
|
||||
// setTimeout(()=>{
|
||||
// // this.peerVideoEnable = true;
|
||||
// // console.log(this.peerVideoEnable)
|
||||
// },2000)
|
||||
// CreateVideo(stream)
|
||||
})
|
||||
// fetchVideoAndPlay(stream,videotype) {
|
||||
// fetch('')
|
||||
// .then(response => response.blob())
|
||||
// .then(blob => {
|
||||
// videotype.srcObject = stream;
|
||||
// return videotype.play();
|
||||
// })
|
||||
// .then(_ => {
|
||||
// // Video playback started ;)
|
||||
// })
|
||||
// .catch(e => {
|
||||
// // Video playback failed ;(
|
||||
// })
|
||||
// }
|
||||
|
||||
// function CreateVideo(stream) {
|
||||
// // CreateDiv()
|
||||
|
||||
// let video = document.createElement('video')
|
||||
// video.id = 'peerVideo'
|
||||
// video.srcObject = stream
|
||||
// video.setAttribute('class', 'embed-responsive-item')
|
||||
// document.querySelector('#peervideo').appendChild(video)
|
||||
// video.play()
|
||||
// //wait for 1 sec
|
||||
// }
|
||||
function connectPeer(answer) {
|
||||
console.log("$$$$$$$$$$$$$$44");
|
||||
console.log(answer);
|
||||
peerx.signal(answer);
|
||||
}
|
||||
function getPeer(){
|
||||
return JSON.stringify(copyMessageText)
|
||||
}
|
||||
// if(JSON.parse(copyMessageText).hasOwnProperty('type') && JSON.parse(copyMessageText).type == 'offer')
|
||||
// {
|
||||
// setTimeout(()=>{
|
||||
// this.socket.on('BackOffer', getPeer)
|
||||
// },2000)
|
||||
// }
|
||||
if(this.chat_info.chat_info == 'call_recieving' && this.chat_info.JSON_to_connect && this.chat_info.JSON_to_connect != undefined) {
|
||||
connectPeer(this.chat_info.JSON_to_connect)
|
||||
}
|
||||
let tt = this.socket.on('BackOffer', connectPeer)
|
||||
console.log(tt);
|
||||
this.socket.on('BackAnswer', connectPeer)
|
||||
}, err=>{
|
||||
console.log('Failed to get stream', err);
|
||||
alert('Failed to get stream '+err);
|
||||
});
|
||||
// function update(){
|
||||
// console.log(copyMessageText)
|
||||
// setTimeout(()=>{
|
||||
// // texk.value = copyMessageText
|
||||
// },2000)
|
||||
// }
|
||||
setTimeout(() => {
|
||||
this.peer = peerx;
|
||||
|
||||
// this.copyMessage(JSON.stringify(this.targetpeer))
|
||||
console.log(this.peer);
|
||||
// console.log(copyMessageText)
|
||||
// this.targetpeer = copyMessageText
|
||||
// this.textToCopy = copyMessageText
|
||||
// this.copyMessage(copyMessageText)
|
||||
}, 5000);
|
||||
|
||||
// socket.on('SessionActive', SessionActive)
|
||||
// socket.on('CreatePeer', MakePeer)
|
||||
// socket.on('Disconnect', RemovePeer)
|
||||
}
|
||||
fetchVideoAndPlay(stream,videotype,enablePeerVideo?) {
|
||||
console.log("12@@@@@@@@@2",enablePeerVideo)
|
||||
if(enablePeerVideo) {
|
||||
this.peerVideoEnable = enablePeerVideo
|
||||
// this.camereSwitchBtn.nativeElement.disabled = true;
|
||||
console.log(this.peerVideoEnable);
|
||||
this.cdRef.detectChanges();
|
||||
// this.startRecording(stream)
|
||||
}
|
||||
fetch('')
|
||||
.then(response => response.blob())
|
||||
.then(blob => {
|
||||
videotype.srcObject = stream;
|
||||
return videotype.play();
|
||||
})
|
||||
.then(_ => {
|
||||
// Video playback started ;)
|
||||
})
|
||||
.catch(e => {
|
||||
// Video playback failed ;(
|
||||
})
|
||||
}
|
||||
startRecording(stream) {
|
||||
let recorder = new RecordRTCPromisesHandler(stream, {
|
||||
type: 'video',
|
||||
mimeType: 'video/webm', // or video/webm\;codecs=h264 or video/webm\;codecs=vp9
|
||||
audioBitsPerSecond: 128000,
|
||||
videoBitsPerSecond: 128000,
|
||||
bitsPerSecond: 128000 // if this line is provided, skip above
|
||||
});
|
||||
recorder.startRecording();
|
||||
const sleep = m => new Promise(r => setTimeout(r, m));
|
||||
sleep(3000);
|
||||
setTimeout(()=>{
|
||||
recorder.stopRecording();
|
||||
console.log(recorder);
|
||||
let blob = recorder.getBlob();
|
||||
recorder.getDataURL().then(dataURL=>{
|
||||
console.log("@@@@@",dataURL)
|
||||
});
|
||||
// var file = new File([blob], 'video.mp4', {
|
||||
// type: 'video/mp4'
|
||||
// });
|
||||
// console.log(file)
|
||||
// const fileURL = window.URL.createObjectURL(file);
|
||||
// window.open(fileURL);
|
||||
// videotype.srcObject = null;
|
||||
// videotype.muted = false;
|
||||
// videotype.volume = 1;
|
||||
// videotype.srcObject = file;
|
||||
|
||||
|
||||
// recorder.camera.stop();
|
||||
// recorder.destroy();
|
||||
// recorder = null;
|
||||
// let recorder = RecordRTC(stream, {
|
||||
// type: 'video'
|
||||
// });
|
||||
// recorder.startRecording();
|
||||
|
||||
// const sleep = m => new Promise(r => setTimeout(r, m));
|
||||
// sleep(10000);
|
||||
|
||||
// recorder.stopRecording(function() {
|
||||
// let blob = recorder.getBlob();
|
||||
// // invokeSaveAsDialog(blob);
|
||||
// console.log(blob);
|
||||
// });
|
||||
|
||||
// blob.then(resul=>{
|
||||
// console.log(resul);
|
||||
// })
|
||||
// const fileURL = window.URL.createObjectURL(blob);
|
||||
// console.log(fileURL);
|
||||
// window.open(fileURL);
|
||||
},10000)
|
||||
// invokeSaveAsDialog(blob);
|
||||
}
|
||||
connect() {
|
||||
this.peer.signal(JSON.parse(this.targetpeer));
|
||||
}
|
||||
RemovePeer() {
|
||||
document.getElementById("peerVideo").remove();
|
||||
// document.getElementById("muteText").remove();
|
||||
// if (client.peer) {
|
||||
// client.peer.destroy()
|
||||
// }
|
||||
}
|
||||
|
||||
message() {
|
||||
this.peer.send('Hello world');
|
||||
}
|
||||
disconnect() {
|
||||
console.log(this.peer)
|
||||
this.peer.destroy();
|
||||
this.peerVideoEnable = false
|
||||
this.targetpeer = ''
|
||||
this.cdRef.detectChanges();
|
||||
this.peervideo.nativeElement.pause();
|
||||
console.log(this.MediaStream.getTracks())
|
||||
// this.MediaStream.stop()
|
||||
// var track = this.MediaStream.getTracks()[0]; // if only one media track
|
||||
// ...
|
||||
// track.stop();
|
||||
this.MediaStream.getTracks().forEach(function(track) {
|
||||
track.stop();
|
||||
});
|
||||
console.log(this.peervideo);
|
||||
// this.peervideo.nativeElement.videoWidth = 0
|
||||
// this.peervideo.nativeElement.videoHeight = 0
|
||||
this.is_video_enable = false
|
||||
this.cdRef.detectChanges();
|
||||
}
|
||||
copyMessage(val: string,message?){
|
||||
const selBox = document.createElement('textarea');
|
||||
selBox.style.position = 'fixed';
|
||||
selBox.style.left = '0';
|
||||
selBox.style.top = '0';
|
||||
selBox.style.opacity = '0';
|
||||
selBox.value = val;
|
||||
document.body.appendChild(selBox);
|
||||
selBox.focus();
|
||||
selBox.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(selBox);
|
||||
// alert(message+ " JSON is copied to clipboard. Paste the JSON to another window")
|
||||
this.notify("JSON copied to clipboard",message+ ' JSON');
|
||||
}
|
||||
switch_camera() {
|
||||
this.shouldFaceUser = !this.shouldFaceUser;
|
||||
console.log(this.userCallType);
|
||||
this.peer.destroy();
|
||||
this.start_Calling(this.userCallType)
|
||||
}
|
||||
close_all() {
|
||||
if(this.peer) {
|
||||
this.disconnect();
|
||||
}
|
||||
if(this.MediaStream && this.MediaStream.active) {
|
||||
console.log(this.MediaStream.getTracks())
|
||||
// this.MediaStream.stop()
|
||||
// var track = this.MediaStream.getTracks()[0]; // if only one media track
|
||||
// ...
|
||||
// track.stop();
|
||||
this.MediaStream.getTracks().forEach(function(track) {
|
||||
track.stop();
|
||||
});
|
||||
}
|
||||
this.dialogRef.close();
|
||||
}
|
||||
micMuteHandling(){
|
||||
this.mic_mute = !this.mic_mute
|
||||
this.cdRef.detectChanges();
|
||||
this.MediaStream.getAudioTracks()[0].enabled = this.mic_mute;
|
||||
}
|
||||
videoHandling(){
|
||||
this.video_mute = !this.video_mute
|
||||
this.cdRef.detectChanges();
|
||||
this.MediaStream.getVideoTracks()[0].enabled = this.video_mute;
|
||||
}
|
||||
|
||||
}
|
||||
BIN
ng6-seed/src/assets/spinner/notfound.jpg
Normal file
BIN
ng6-seed/src/assets/spinner/notfound.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
BIN
ng6-seed/src/assets/spinner/notfound2.jpg
Normal file
BIN
ng6-seed/src/assets/spinner/notfound2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
BIN
ng6-seed/src/assets/spinner/notfound_blue.png
Normal file
BIN
ng6-seed/src/assets/spinner/notfound_blue.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
@ -14,6 +14,7 @@ export const environment = {
|
||||
// apiEndpoint: 'https://demo.pdgenie.com/sparqapi/api/',
|
||||
apiEndpoint:'https://apitest.pdgenie.com/sparqtest/api/',
|
||||
// apiEndpoint:'http://localhost/sineEdge/sparqapi/api/',
|
||||
socketServerUrl:'https://morning-garden-90282.herokuapp.com',
|
||||
|
||||
authorization: 'sparqvenba2018',
|
||||
|
||||
|
||||
@ -9,6 +9,10 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<!-- For Video chat -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/simple-peer/9.7.0/simplepeer.min.js"></script>
|
||||
<!-- <script src="node_modules/recordrtc/RecordRTC.js"></script> -->
|
||||
<script src="https://www.WebRTC-Experiment.com/RecordRTC.js"></script>
|
||||
<!-- <title>Optima - Angular 6 Material Admin Template</title> -->
|
||||
<title> PD Genie </title>
|
||||
|
||||
|
||||
5
ng6-seed/src/typings.d.ts
vendored
5
ng6-seed/src/typings.d.ts
vendored
@ -6,4 +6,7 @@ interface NodeModule {
|
||||
declare module 'quill';
|
||||
declare module 'leaflet';
|
||||
declare module 'perfect-scrollbar';
|
||||
declare module 'screenfull';
|
||||
declare module 'screenfull';
|
||||
declare var SimplePeer: any;
|
||||
declare var RecordRTCPromisesHandler:any;
|
||||
declare var RecordRTC:any;
|
||||
Loading…
Reference in New Issue
Block a user