diff --git a/Guardfile b/Guardfile index 8378c587..030bc7ab 100644 --- a/Guardfile +++ b/Guardfile @@ -35,7 +35,7 @@ guard :bundler do files.each { |file| watch(helper.real_path(file)) } end -guard 'rails', host: '0.0.0.0', port: 9913 do +guard 'rails', host: '0.0.0.0', port: 9914 do watch('Gemfile.lock') watch(%r{^(config|lib)/.*}) end diff --git a/app/assets/javascripts/bundle.js b/app/assets/javascripts/bundle.js index 7f44ccc0..c0d9abff 100644 --- a/app/assets/javascripts/bundle.js +++ b/app/assets/javascripts/bundle.js @@ -26,7 +26,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _video_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./video_util.js */ \"./frontend/components/video_util.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\nvar VideoCall = /*#__PURE__*/function (_React$Component) {\n _inherits(VideoCall, _React$Component);\n var _super = _createSuper(VideoCall);\n function VideoCall(props) {\n var _this;\n _classCallCheck(this, VideoCall);\n _this = _super.call(this, props);\n _this.pcPeers = {};\n _this.userId = Math.floor(Math.random() * 10000);\n _this.joinCall = _this.joinCall.bind(_assertThisInitialized(_this));\n _this.leaveCall = _this.leaveCall.bind(_assertThisInitialized(_this));\n return _this;\n }\n _createClass(VideoCall, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n this.remoteVideoContainer = document.getElementById(\"remote-video-container\");\n navigator.mediaDevices.getUserMedia({\n audio: false,\n video: true\n }).then(function (stream) {\n _this2.localStream = stream;\n document.getElementById(\"local-video\").srcObject = stream;\n })[\"catch\"](function (error) {\n console.log(error);\n });\n }\n }, {\n key: \"join\",\n value: function join(data) {\n this.createPC(data.from, true);\n }\n }, {\n key: \"joinCall\",\n value: function joinCall(e) {\n var _this3 = this;\n console.log(\"Hello from joinCall\");\n console.log(e);\n App.cable.subscriptions.create({\n channel: \"CallChannel\"\n }, {\n connected: function connected() {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.JOIN_CALL,\n from: _this3.userId\n });\n },\n received: function received(data) {\n console.log(\"RECEIVED: \", data);\n if (data.from === _this3.userId) return;\n switch (data.type) {\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.JOIN_CALL:\n return _this3.join(data);\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE:\n if (data.to !== _this3.userId) return;\n return _this3.exchange(data);\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL:\n return _this3.removeUser(data);\n default:\n return;\n }\n }\n });\n }\n }, {\n key: \"createPC\",\n value: function createPC(userId, offerBool) {\n var _this4 = this;\n var pc = new RTCPeerConnection(_video_util_js__WEBPACK_IMPORTED_MODULE_1__.ice);\n this.pcPeers[userId] = pc;\n this.localStream.getTracks().forEach(function (track) {\n return pc.addTrack(track, _this4.localStream);\n });\n if (offerBool) {\n pc.createOffer().then(function (offer) {\n pc.setLocalDescription(offer).then(function () {\n setTimeout(function () {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this4.userId,\n to: userId,\n sdp: JSON.stringify(pc.localDescription)\n });\n }, 0);\n });\n });\n }\n pc.onicecandidate = function (e) {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this4.userId,\n to: userId,\n sdp: JSON.stringify(e.candidate)\n });\n };\n pc.ontrack = function (e) {\n var remoteVid = document.createElement(\"video\");\n remoteVid.id = \"remoteVideoContainer+\".concat(userId);\n remoteVid.autoplay = \"autoplay\";\n remoteVid.srcObject = e.streams[0];\n _this4.remoteVideoContainer.appendChild(remoteVid);\n };\n pc.oniceconnectionstatechange = function (e) {\n if (pc.iceConnectionState === 'disconnected') {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL,\n from: userId\n });\n }\n };\n return pc;\n }\n }, {\n key: \"exchange\",\n value: function exchange(data) {\n var _this5 = this;\n var pc;\n if (this.pcPeers[data.from]) {\n pc = this.pcPeers[data.from];\n } else {\n pc = this.createPC(data.from, false);\n }\n if (data.candidate) {\n var candidate = JSON.parse(data.candidate);\n pc.addIceCandidate(new RTCIceCandidate(candidate));\n }\n if (data.sdp) {\n var sdp = JSON.parse(data.sdp);\n if (sdp && !sdp.candidate) {\n pc.setRemoteDescription(sdp).then(function () {\n if (sdp.type === 'offer') {\n pc.createAnswer().then(function (answer) {\n pc.setLocalDescription(answer).then(function () {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this5.userId,\n to: data.from,\n sdp: JSON.stringify(pc.localDescription)\n });\n });\n });\n }\n });\n }\n }\n }\n }, {\n key: \"leaveCall\",\n value: function leaveCall(e) {\n var pcKeys = Object.keys(this.pcPeers);\n for (var i = 0; i < pcKeys.length; i++) {\n this.pcPeers[pcKeys[i]].close();\n }\n this.pcPeers = {};\n this.localVideo.srcObject.getTracks().forEach(function (track) {\n track.stop();\n });\n this.localVideo.srcObject = null;\n App.cable.subscriptions.subscriptions = [];\n this.remoteVideoContainer.innerHTML = \"\";\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL,\n from: this.userId\n });\n }\n }, {\n key: \"removeUser\",\n value: function removeUser(data) {\n var video = document.getElementById(\"remoteVideoContainer+\".concat(data.from));\n video && video.remove();\n var peers = this.pcPeers;\n delete peers[data.from];\n }\n }, {\n key: \"render\",\n value: function render() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"VideoCall\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"remote-video-container\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"video\", {\n id: \"local-video\",\n autoPlay: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: this.joinCall\n }, \"Join Call\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: this.leaveCall\n }, \"Leave Call\"));\n }\n }]);\n return VideoCall;\n}((react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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eEQ7RUFBQztJQUFBUyxHQUFBO0lBQUFDLEtBQUEsRUFDRCxTQUFBa0MsV0FBV2YsSUFBSSxFQUFDO01BQ2QsSUFBSVQsS0FBSyxHQUFZTixRQUFRLENBQUNDLGNBQWMseUJBQUFvRCxNQUFBLENBQXlCdEMsSUFBSSxDQUFDRSxJQUFJLENBQUUsQ0FBQztNQUNqRlgsS0FBSyxJQUFJQSxLQUFLLENBQUNxRSxNQUFNLENBQUMsQ0FBQztNQUN2QixJQUFJQyxLQUFLLEdBQUcsSUFBSSxDQUFDM0YsT0FBTztNQUN4QixPQUFPMkYsS0FBSyxDQUFDN0QsSUFBSSxDQUFDRSxJQUFJLENBQUM7SUFDekI7RUFBQztJQUFBdEIsR0FBQTtJQUFBQyxLQUFBLEVBQ0QsU0FBQWlGLE9BQUEsRUFBUTtNQUNOLG9CQUNBM0csMERBQUE7UUFBSzRHLFNBQVMsRUFBQztNQUFXLGdCQUN6QjVHLDBEQUFBO1FBQUtrRixFQUFFLEVBQUM7TUFBd0IsQ0FBTSxDQUFDLGVBQ3ZDbEYsMERBQUE7UUFBT2tGLEVBQUUsRUFBQyxhQUFhO1FBQUMyQixRQUFRO01BQUEsQ0FBUSxDQUFDLGVBQ3pDN0csMERBQUE7UUFBUThHLE9BQU8sRUFBRSxJQUFJLENBQUMxRjtNQUFTLEdBQUMsV0FBaUIsQ0FBQyxlQUNsRHBCLDBEQUFBO1FBQVE4RyxPQUFPLEVBQUUsSUFBSSxDQUFDdkY7TUFBVSxHQUFDLFlBQWtCLENBQy9DLENBQUM7SUFDUjtFQUFDO0VBQUEsT0FBQWpCLFNBQUE7QUFBQSxFQW5KcUJOLHdEQUFlO0FBcUp2QyxpRUFBZWtELEdBQUciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90aGlydGVlbi10aWVuLWxlbi8uL2Zyb250ZW5kL2NvbXBvbmVudHMvVmlkZW9DYWxsLmpzeD8xZmJkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBicm9hZGNhc3REYXRhLCBKT0lOX0NBTEwsIExFQVZFX0NBTEwsIEVYQ0hBTkdFLCBpY2UgfSBmcm9tICcuL3ZpZGVvX3V0aWwuanMnO1xuXG5jbGFzcyBWaWRlb0NhbGwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnR7XG4gIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5wY1BlZXJzID0ge307XG4gICAgdGhpcy51c2VySWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMCk7XG4gICAgdGhpcy5qb2luQ2FsbCA9IHRoaXMuam9pbkNhbGwuYmluZCh0aGlzKTtcbiAgICB0aGlzLmxlYXZlQ2FsbCA9IHRoaXMubGVhdmVDYWxsLmJpbmQodGhpcyk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKXtcbiAgICB0aGlzLnJlbW90ZVZpZGVvQ29udGFpbmVyID0gXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlbW90ZS12aWRlby1jb250YWluZXJcIilcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7YXVkaW86IGZhbHNlLCB2aWRlbzogdHJ1ZX0pXG4gICAgICAudGhlbihzdHJlYW0gPT4ge1xuICAgICAgICB0aGlzLmxvY2FsU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvY2FsLXZpZGVvXCIpLnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgIH0pLmNhdGNoKGVycm9yID0+IHsgY29uc29sZS5sb2coZXJyb3IpfSk7XG4gIH1cbiAgam9pbihkYXRhKXsgdGhpcy5jcmVhdGVQQyhkYXRhLmZyb20sIHRydWUpIH1cbiAgam9pbkNhbGwoZSl7XG4gICAgY29uc29sZS5sb2coXCJIZWxsbyBmcm9tIGpvaW5DYWxsXCIpO1xuICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIEFwcC5jYWJsZS5zdWJzY3JpcHRpb25zLmNyZWF0ZShcbiAgICAgIHsgY2hhbm5lbDogXCJDYWxsQ2hhbm5lbFwiIH0sXG4gICAgICB7IFxuICAgICAgICBjb25uZWN0ZWQ6ICgpID0+IHtcbiAgICAgICAgICBicm9hZGNhc3REYXRhKHsgdHlwZTogSk9JTl9DQUxMLCBmcm9tOiB0aGlzLnVzZXJJZH0pO1xuICAgICAgICB9LFxuICAgICAgICByZWNlaXZlZDogZGF0YSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJSRUNFSVZFRDogXCIsIGRhdGEpO1xuICAgICAgICAgIGlmIChkYXRhLmZyb20gPT09IHRoaXMudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgc3dpdGNoKGRhdGEudHlwZSl7XG4gICAgICAgICAgICBjYXNlIEpPSU5fQ0FMTDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuam9pbihkYXRhKTtcbiAgICAgICAgICAgIGNhc2UgRVhDSEFOR0U6XG4gICAgICAgICAgICAgIGlmIChkYXRhLnRvICE9PSB0aGlzLnVzZXJJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGNoYW5nZShkYXRhKTtcbiAgICAgICAgICAgIGNhc2UgTEVBVkVfQ0FMTDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlVXNlcihkYXRhKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gIGNyZWF0ZVBDKHVzZXJJZCwgb2ZmZXJCb29sKXtcbiAgICBjb25zdCBwYyA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihpY2UpO1xuICAgIHRoaXMucGNQZWVyc1t1c2VySWRdID0gcGM7XG4gICAgdGhpcy5sb2NhbFN0cmVhbS5nZXRUcmFja3MoKVxuICAgICAgLmZvckVhY2godHJhY2sgPT4gcGMuYWRkVHJhY2sodHJhY2ssIHRoaXMubG9jYWxTdHJlYW0pKTtcbiAgICBpZiAob2ZmZXJCb29sKSB7XG4gICAgICBwYy5jcmVhdGVPZmZlcigpLnRoZW4ob2ZmZXIgPT4ge1xuICAgICAgICBwYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgICBicm9hZGNhc3REYXRhKHtcbiAgICAgICAgICAgICAgdHlwZTogRVhDSEFOR0UsXG4gICAgICAgICAgICAgIGZyb206IHRoaXMudXNlcklkLFxuICAgICAgICAgICAgICB0bzogdXNlcklkLFxuICAgICAgICAgICAgICBzZHA6IEpTT04uc3RyaW5naWZ5KHBjLmxvY2FsRGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHBjLm9uaWNlY2FuZGlkYXRlID0gKGUpID0+IHtcbiAgICAgIGJyb2FkY2FzdERhdGEoe1xuICAgICAgICB0eXBlOiBFWENIQU5HRSxcbiAgICAgICAgZnJvbTogdGhpcy51c2VySWQsXG4gICAgICAgIHRvOiB1c2VySWQsXG4gICAgICAgIHNkcDogSlNPTi5zdHJpbmdpZnkoZS5jYW5kaWRhdGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBwYy5vbnRyYWNrID0gKGUpID0+IHtcbiAgICAgIGNvbnN0IHJlbW90ZVZpZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtcbiAgICAgIHJlbW90ZVZpZC5pZCA9IGByZW1vdGVWaWRlb0NvbnRhaW5lciske3VzZXJJZH1gO1xuICAgICAgcmVtb3RlVmlkLmF1dG9wbGF5ID0gXCJhdXRvcGxheVwiO1xuICAgICAgcmVtb3RlVmlkLnNyY09iamVjdCA9IGUuc3RyZWFtc1swXTtcbiAgICAgIHRoaXMucmVtb3RlVmlkZW9Db250YWluZXIuYXBwZW5kQ2hpbGQocmVtb3RlVmlkKTtcbiAgICB9XG4gICAgcGMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgaWYgKHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpe1xuICAgICAgICBicm9hZGNhc3REYXRhKHsgdHlwZTogTEVBVkVfQ0FMTCwgZnJvbTogdXNlcklkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGM7XG4gIH0gXG5cbiAgZXhjaGFuZ2UoZGF0YSl7XG4gICAgbGV0IHBjO1xuICAgIGlmKHRoaXMucGNQZWVyc1tkYXRhLmZyb21dKXtcbiAgICAgIHBjID0gdGhpcy5wY1BlZXJzW2RhdGEuZnJvbV07XG4gICAgfSBlbHNle1xuICAgICAgcGMgPSB0aGlzLmNyZWF0ZVBDKGRhdGEuZnJvbSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jYW5kaWRhdGUpe1xuICAgICAgbGV0IGNhbmRpZGF0ZSA9IEpTT04ucGFyc2UoZGF0YS5jYW5kaWRhdGUpXG4gICAgICBwYy5hZGRJY2VDYW5kaWRhdGUobmV3IFJUQ0ljZUNhbmRpZGF0ZShjYW5kaWRhdGUpKVxuICAgIH1cbiAgICBpZihkYXRhLnNkcCl7XG4gICAgICBjb25zdCBzZHAgPSBKU09OLnBhcnNlKGRhdGEuc2RwKTtcbiAgICAgIGlmKHNkcCAmJiAhc2RwLmNhbmRpZGF0ZSl7XG4gICAgICAgIHBjLnNldFJlbW90ZURlc2NyaXB0aW9uKHNkcCkudGhlbiggKCkgPT57XG4gICAgICAgICAgaWYgKHNkcC50eXBlID09PSAnb2ZmZXInKXtcbiAgICAgICAgICAgIHBjLmNyZWF0ZUFuc3dlcigpLnRoZW4oYW5zd2VyID0+IHtcbiAgICAgICAgICAgICAgcGMuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpXG4gICAgICAgICAgICAgICAgLnRoZW4oICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdERhdGEoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBFWENIQU5HRSxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBkYXRhLmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHNkcDogSlNPTi5zdHJpbmdpZnkocGMubG9jYWxEZXNjcmlwdGlvbilcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZWF2ZUNhbGwoZSl7XG4gICAgY29uc3QgcGNLZXlzID0gT2JqZWN0LmtleXModGhpcy5wY1BlZXJzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wY1BlZXJzW3BjS2V5c1tpXV0uY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5wY1BlZXJzID0ge307ICAgIFxuICAgIHRoaXMubG9jYWxWaWRlby5zcmNPYmplY3QuZ2V0VHJhY2tzKClcbiAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyB0cmFjay5zdG9wKCk7IH0pXG5cbiAgICB0aGlzLmxvY2FsVmlkZW8uc3JjT2JqZWN0ID0gbnVsbDtcbiAgICBBcHAuY2FibGUuc3Vic2NyaXB0aW9ucy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgdGhpcy5yZW1vdGVWaWRlb0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGJyb2FkY2FzdERhdGEoeyB0eXBlOiBMRUFWRV9DQUxMLCBmcm9tOiB0aGlzLnVzZXJJZCB9KTtcbiAgfVxuICByZW1vdmVVc2VyKGRhdGEpe1xuICAgIGxldCB2aWRlbyA9ICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGByZW1vdGVWaWRlb0NvbnRhaW5lciske2RhdGEuZnJvbX1gKTtcbiAgICB2aWRlbyAmJiB2aWRlby5yZW1vdmUoKTtcbiAgICBsZXQgcGVlcnMgPSB0aGlzLnBjUGVlcnNcbiAgICBkZWxldGUgcGVlcnNbZGF0YS5mcm9tXVxuICB9XG4gIHJlbmRlcigpe1xuICAgIHJldHVybihcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIlZpZGVvQ2FsbFwiPlxuICAgICA8ZGl2IGlkPVwicmVtb3RlLXZpZGVvLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICA8dmlkZW8gaWQ9XCJsb2NhbC12aWRlb1wiIGF1dG9QbGF5PjwvdmlkZW8+XG4gICAgIDxidXR0b24gb25DbGljaz17dGhpcy5qb2luQ2FsbH0+Sm9pbiBDYWxsPC9idXR0b24+XG4gICAgIDxidXR0b24gb25DbGljaz17dGhpcy5sZWF2ZUNhbGx9PkxlYXZlIENhbGw8L2J1dHRvbj5cbiAgICA8L2Rpdj4pXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdLCJuYW1lcyI6WyJSZWFjdCIsImJyb2FkY2FzdERhdGEiLCJKT0lOX0NBTEwiLCJMRUFWRV9DQUxMIiwiRVhDSEFOR0UiLCJpY2UiLCJWaWRlb0NhbGwiLCJfUmVhY3QkQ29tcG9uZW50IiwiX2luaGVyaXRzIiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsImNhbGwiLCJwY1BlZXJzIiwidXNlcklkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiam9pbkNhbGwiLCJiaW5kIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsImxlYXZlQ2FsbCIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdGhpczIiLCJyZW1vdGVWaWRlb0NvbnRhaW5lciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJuYXZpZ2F0b3IiLCJtZWRpYURldmljZXMiLCJnZXRVc2VyTWVkaWEiLCJhdWRpbyIsInZpZGVvIiwidGhlbiIsInN0cmVhbSIsImxvY2FsU3RyZWFtIiwic3JjT2JqZWN0IiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwiam9pbiIsImRhdGEiLCJjcmVhdGVQQyIsImZyb20iLCJlIiwiX3RoaXMzIiwiQXBwIiwiY2FibGUiLCJzdWJzY3JpcHRpb25zIiwiY3JlYXRlIiwiY2hhbm5lbCIsImNvbm5lY3RlZCIsInR5cGUiLCJyZWNlaXZlZCIsInRvIiwiZXhjaGFuZ2UiLCJyZW1vdmVVc2VyIiwib2ZmZXJCb29sIiwiX3RoaXM0IiwicGMiLCJSVENQZWVyQ29ubmVjdGlvbiIsImdldFRyYWNrcyIsImZvckVhY2giLCJ0cmFjayIsImFkZFRyYWNrIiwiY3JlYXRlT2ZmZXIiLCJvZmZlciIsInNldExvY2FsRGVzY3JpcHRpb24iLCJzZXRUaW1lb3V0Iiwic2RwIiwiSlNPTiIsInN0cmluZ2lmeSIsImxvY2FsRGVzY3JpcHRpb24iLCJvbmljZWNhbmRpZGF0ZSIsImNhbmRpZGF0ZSIsIm9udHJhY2siLCJyZW1vdGVWaWQiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJjb25jYXQiLCJhdXRvcGxheSIsInN0cmVhbXMiLCJhcHBlbmRDaGlsZCIsIm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlIiwiaWNlQ29ubmVjdGlvblN0YXRlIiwiX3RoaXM1IiwicGFyc2UiLCJhZGRJY2VDYW5kaWRhdGUiLCJSVENJY2VDYW5kaWRhdGUiLCJzZXRSZW1vdGVEZXNjcmlwdGlvbiIsImNyZWF0ZUFuc3dlciIsImFuc3dlciIsInBjS2V5cyIsIk9iamVjdCIsImtleXMiLCJpIiwibGVuZ3RoIiwiY2xvc2UiLCJsb2NhbFZpZGVvIiwic3RvcCIsImlubmVySFRNTCIsInJlbW92ZSIsInBlZXJzIiwicmVuZGVyIiwiY2xhc3NOYW1lIiwiYXV0b1BsYXkiLCJvbkNsaWNrIiwiQ29tcG9uZW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./frontend/components/VideoCall.jsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _video_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./video_util.js */ \"./frontend/components/video_util.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\nvar VideoCall = /*#__PURE__*/function (_React$Component) {\n _inherits(VideoCall, _React$Component);\n var _super = _createSuper(VideoCall);\n function VideoCall(props) {\n var _this;\n _classCallCheck(this, VideoCall);\n _this = _super.call(this, props);\n _this.pcPeers = {};\n _this.userId = Math.floor(Math.random() * 10000);\n _this.joinCall = _this.joinCall.bind(_assertThisInitialized(_this));\n _this.leaveCall = _this.leaveCall.bind(_assertThisInitialized(_this));\n return _this;\n }\n _createClass(VideoCall, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n this.remoteVideoContainer = document.getElementById(\"remote-video-container\");\n navigator.mediaDevices.getUserMedia({\n audio: false,\n video: true\n }).then(function (stream) {\n _this2.localStream = stream;\n document.getElementById(\"local-video\").srcObject = stream;\n })[\"catch\"](function (error) {\n console.log(error);\n });\n }\n }, {\n key: \"join\",\n value: function join(data) {\n this.createPC(data.from, true);\n }\n }, {\n key: \"joinCall\",\n value: function joinCall(e) {\n var _this3 = this;\n console.log(\"Hello from joinCall\");\n console.log(e);\n VideoCall.cable.subscriptions.create({\n channel: \"CallChannel\"\n }, {\n connected: function connected() {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.JOIN_CALL,\n from: _this3.userId\n });\n },\n received: function received(data) {\n console.log(\"RECEIVED: \", data);\n if (data.from === _this3.userId) return;\n switch (data.type) {\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.JOIN_CALL:\n return _this3.join(data);\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE:\n if (data.to !== _this3.userId) return;\n return _this3.exchange(data);\n case _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL:\n return _this3.removeUser(data);\n default:\n return;\n }\n }\n });\n }\n }, {\n key: \"createPC\",\n value: function createPC(userId, offerBool) {\n var _this4 = this;\n var pc = new RTCPeerConnection(_video_util_js__WEBPACK_IMPORTED_MODULE_1__.ice);\n this.pcPeers[userId] = pc;\n this.localStream.getTracks().forEach(function (track) {\n return pc.addTrack(track, _this4.localStream);\n });\n if (offerBool) {\n pc.createOffer().then(function (offer) {\n pc.setLocalDescription(offer).then(function () {\n setTimeout(function () {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this4.userId,\n to: userId,\n sdp: JSON.stringify(pc.localDescription)\n });\n }, 0);\n });\n });\n }\n pc.onicecandidate = function (e) {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this4.userId,\n to: userId,\n sdp: JSON.stringify(e.candidate)\n });\n };\n pc.ontrack = function (e) {\n var remoteVid = document.createElement(\"video\");\n remoteVid.id = \"remoteVideoContainer+\".concat(userId);\n remoteVid.autoplay = \"autoplay\";\n remoteVid.srcObject = e.streams[0];\n _this4.remoteVideoContainer.appendChild(remoteVid);\n };\n pc.oniceconnectionstatechange = function (e) {\n if (pc.iceConnectionState === 'disconnected') {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL,\n from: userId\n });\n }\n };\n return pc;\n }\n }, {\n key: \"exchange\",\n value: function exchange(data) {\n var _this5 = this;\n var pc;\n if (this.pcPeers[data.from]) {\n pc = this.pcPeers[data.from];\n } else {\n pc = this.createPC(data.from, false);\n }\n if (data.candidate) {\n var candidate = JSON.parse(data.candidate);\n pc.addIceCandidate(new RTCIceCandidate(candidate));\n }\n if (data.sdp) {\n var sdp = JSON.parse(data.sdp);\n if (sdp && !sdp.candidate) {\n pc.setRemoteDescription(sdp).then(function () {\n if (sdp.type === 'offer') {\n pc.createAnswer().then(function (answer) {\n pc.setLocalDescription(answer).then(function () {\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.EXCHANGE,\n from: _this5.userId,\n to: data.from,\n sdp: JSON.stringify(pc.localDescription)\n });\n });\n });\n }\n });\n }\n }\n }\n }, {\n key: \"leaveCall\",\n value: function leaveCall(e) {\n var pcKeys = Object.keys(this.pcPeers);\n for (var i = 0; i < pcKeys.length; i++) {\n this.pcPeers[pcKeys[i]].close();\n }\n this.pcPeers = {};\n this.localVideo.srcObject.getTracks().forEach(function (track) {\n track.stop();\n });\n this.localVideo.srcObject = null;\n VideoCall.cable.subscriptions.subscriptions = [];\n this.remoteVideoContainer.innerHTML = \"\";\n (0,_video_util_js__WEBPACK_IMPORTED_MODULE_1__.broadcastData)({\n type: _video_util_js__WEBPACK_IMPORTED_MODULE_1__.LEAVE_CALL,\n from: this.userId\n });\n }\n }, {\n key: \"removeUser\",\n value: function removeUser(data) {\n var video = document.getElementById(\"remoteVideoContainer+\".concat(data.from));\n video && video.remove();\n var peers = this.pcPeers;\n delete peers[data.from];\n }\n }, {\n key: \"render\",\n value: function render() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"VideoCall\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"remote-video-container\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"video\", {\n id: \"local-video\",\n autoPlay: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: this.joinCall\n }, \"Join Call\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: this.leaveCall\n }, \"Leave Call\"));\n }\n }]);\n return VideoCall;\n}((react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VideoCall);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUN4RDtFQUFDO0lBQUFTLEdBQUE7SUFBQUMsS0FBQSxFQUNELFNBQUFpQyxXQUFXZCxJQUFJLEVBQUM7TUFDZCxJQUFJVCxLQUFLLEdBQVlOLFFBQVEsQ0FBQ0MsY0FBYyx5QkFBQW1ELE1BQUEsQ0FBeUJyQyxJQUFJLENBQUNFLElBQUksQ0FBRSxDQUFDO01BQ2pGWCxLQUFLLElBQUlBLEtBQUssQ0FBQ29FLE1BQU0sQ0FBQyxDQUFDO01BQ3ZCLElBQUlDLEtBQUssR0FBRyxJQUFJLENBQUMxRixPQUFPO01BQ3hCLE9BQU8wRixLQUFLLENBQUM1RCxJQUFJLENBQUNFLElBQUksQ0FBQztJQUN6QjtFQUFDO0lBQUF0QixHQUFBO0lBQUFDLEtBQUEsRUFDRCxTQUFBZ0YsT0FBQSxFQUFRO01BQ04sb0JBQ0ExRywwREFBQTtRQUFLMkcsU0FBUyxFQUFDO01BQVcsZ0JBQ3pCM0csMERBQUE7UUFBS2lGLEVBQUUsRUFBQztNQUF3QixDQUFNLENBQUMsZUFDdkNqRiwwREFBQTtRQUFPaUYsRUFBRSxFQUFDLGFBQWE7UUFBQzJCLFFBQVE7TUFBQSxDQUFRLENBQUMsZUFDekM1RywwREFBQTtRQUFRNkcsT0FBTyxFQUFFLElBQUksQ0FBQ3pGO01BQVMsR0FBQyxXQUFpQixDQUFDLGVBQ2xEcEIsMERBQUE7UUFBUTZHLE9BQU8sRUFBRSxJQUFJLENBQUN0RjtNQUFVLEdBQUMsWUFBa0IsQ0FDL0MsQ0FBQztJQUNSO0VBQUM7RUFBQSxPQUFBakIsU0FBQTtBQUFBLEVBbkpxQk4sd0RBQWU7QUFxSnZDLGlFQUFlTSxTQUFTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGhpcnRlZW4tdGllbi1sZW4vLi9mcm9udGVuZC9jb21wb25lbnRzL1ZpZGVvQ2FsbC5qc3g/MWZiZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYnJvYWRjYXN0RGF0YSwgSk9JTl9DQUxMLCBMRUFWRV9DQUxMLCBFWENIQU5HRSwgaWNlIH0gZnJvbSAnLi92aWRlb191dGlsLmpzJztcblxuY2xhc3MgVmlkZW9DYWxsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50e1xuICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucGNQZWVycyA9IHt9O1xuICAgIHRoaXMudXNlcklkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDApO1xuICAgIHRoaXMuam9pbkNhbGwgPSB0aGlzLmpvaW5DYWxsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5sZWF2ZUNhbGwgPSB0aGlzLmxlYXZlQ2FsbC5iaW5kKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCl7XG4gICAgdGhpcy5yZW1vdGVWaWRlb0NvbnRhaW5lciA9IFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZW1vdGUtdmlkZW8tY29udGFpbmVyXCIpXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe2F1ZGlvOiBmYWxzZSwgdmlkZW86IHRydWV9KVxuICAgICAgLnRoZW4oc3RyZWFtID0+IHtcbiAgICAgICAgdGhpcy5sb2NhbFN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsb2NhbC12aWRlb1wiKS5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICB9KS5jYXRjaChlcnJvciA9PiB7IGNvbnNvbGUubG9nKGVycm9yKX0pO1xuICB9XG4gIGpvaW4oZGF0YSl7IHRoaXMuY3JlYXRlUEMoZGF0YS5mcm9tLCB0cnVlKSB9XG4gIGpvaW5DYWxsKGUpe1xuICAgIGNvbnNvbGUubG9nKFwiSGVsbG8gZnJvbSBqb2luQ2FsbFwiKTtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICBWaWRlb0NhbGwuY2FibGUuc3Vic2NyaXB0aW9ucy5jcmVhdGUoXG4gICAgICB7IGNoYW5uZWw6IFwiQ2FsbENoYW5uZWxcIiB9LFxuICAgICAgeyBcbiAgICAgICAgY29ubmVjdGVkOiAoKSA9PiB7XG4gICAgICAgICAgYnJvYWRjYXN0RGF0YSh7IHR5cGU6IEpPSU5fQ0FMTCwgZnJvbTogdGhpcy51c2VySWR9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVjZWl2ZWQ6IGRhdGEgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUkVDRUlWRUQ6IFwiLCBkYXRhKTtcbiAgICAgICAgICBpZiAoZGF0YS5mcm9tID09PSB0aGlzLnVzZXJJZCkgcmV0dXJuO1xuICAgICAgICAgIHN3aXRjaChkYXRhLnR5cGUpe1xuICAgICAgICAgICAgY2FzZSBKT0lOX0NBTEw6XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmpvaW4oZGF0YSk7XG4gICAgICAgICAgICBjYXNlIEVYQ0hBTkdFOlxuICAgICAgICAgICAgICBpZiAoZGF0YS50byAhPT0gdGhpcy51c2VySWQpIHJldHVybjtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhjaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgICBjYXNlIExFQVZFX0NBTEw6XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVVzZXIoZGF0YSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICBjcmVhdGVQQyh1c2VySWQsIG9mZmVyQm9vbCl7XG4gICAgY29uc3QgcGMgPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24oaWNlKTtcbiAgICB0aGlzLnBjUGVlcnNbdXNlcklkXSA9IHBjO1xuICAgIHRoaXMubG9jYWxTdHJlYW0uZ2V0VHJhY2tzKClcbiAgICAgIC5mb3JFYWNoKHRyYWNrID0+IHBjLmFkZFRyYWNrKHRyYWNrLCB0aGlzLmxvY2FsU3RyZWFtKSk7XG4gICAgaWYgKG9mZmVyQm9vbCkge1xuICAgICAgcGMuY3JlYXRlT2ZmZXIoKS50aGVuKG9mZmVyID0+IHtcbiAgICAgICAgcGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgYnJvYWRjYXN0RGF0YSh7XG4gICAgICAgICAgICAgIHR5cGU6IEVYQ0hBTkdFLFxuICAgICAgICAgICAgICBmcm9tOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICAgICAgdG86IHVzZXJJZCxcbiAgICAgICAgICAgICAgc2RwOiBKU09OLnN0cmluZ2lmeShwYy5sb2NhbERlc2NyaXB0aW9uKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBwYy5vbmljZWNhbmRpZGF0ZSA9IChlKSA9PiB7XG4gICAgICBicm9hZGNhc3REYXRhKHtcbiAgICAgICAgdHlwZTogRVhDSEFOR0UsXG4gICAgICAgIGZyb206IHRoaXMudXNlcklkLFxuICAgICAgICB0bzogdXNlcklkLFxuICAgICAgICBzZHA6IEpTT04uc3RyaW5naWZ5KGUuY2FuZGlkYXRlKVxuICAgICAgfSlcbiAgICB9XG4gICAgcGMub250cmFjayA9IChlKSA9PiB7XG4gICAgICBjb25zdCByZW1vdGVWaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7XG4gICAgICByZW1vdGVWaWQuaWQgPSBgcmVtb3RlVmlkZW9Db250YWluZXIrJHt1c2VySWR9YDtcbiAgICAgIHJlbW90ZVZpZC5hdXRvcGxheSA9IFwiYXV0b3BsYXlcIjtcbiAgICAgIHJlbW90ZVZpZC5zcmNPYmplY3QgPSBlLnN0cmVhbXNbMF07XG4gICAgICB0aGlzLnJlbW90ZVZpZGVvQ29udGFpbmVyLmFwcGVuZENoaWxkKHJlbW90ZVZpZCk7XG4gICAgfVxuICAgIHBjLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gKGUpID0+IHtcbiAgICAgIGlmIChwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKXtcbiAgICAgICAgYnJvYWRjYXN0RGF0YSh7IHR5cGU6IExFQVZFX0NBTEwsIGZyb206IHVzZXJJZCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBjO1xuICB9IFxuXG4gIGV4Y2hhbmdlKGRhdGEpe1xuICAgIGxldCBwYztcbiAgICBpZih0aGlzLnBjUGVlcnNbZGF0YS5mcm9tXSl7XG4gICAgICBwYyA9IHRoaXMucGNQZWVyc1tkYXRhLmZyb21dO1xuICAgIH0gZWxzZXtcbiAgICAgIHBjID0gdGhpcy5jcmVhdGVQQyhkYXRhLmZyb20sIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuY2FuZGlkYXRlKXtcbiAgICAgIGxldCBjYW5kaWRhdGUgPSBKU09OLnBhcnNlKGRhdGEuY2FuZGlkYXRlKVxuICAgICAgcGMuYWRkSWNlQ2FuZGlkYXRlKG5ldyBSVENJY2VDYW5kaWRhdGUoY2FuZGlkYXRlKSlcbiAgICB9XG4gICAgaWYoZGF0YS5zZHApe1xuICAgICAgY29uc3Qgc2RwID0gSlNPTi5wYXJzZShkYXRhLnNkcCk7XG4gICAgICBpZihzZHAgJiYgIXNkcC5jYW5kaWRhdGUpe1xuICAgICAgICBwYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihzZHApLnRoZW4oICgpID0+e1xuICAgICAgICAgIGlmIChzZHAudHlwZSA9PT0gJ29mZmVyJyl7XG4gICAgICAgICAgICBwYy5jcmVhdGVBbnN3ZXIoKS50aGVuKGFuc3dlciA9PiB7XG4gICAgICAgICAgICAgIHBjLnNldExvY2FsRGVzY3JpcHRpb24oYW5zd2VyKVxuICAgICAgICAgICAgICAgIC50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBicm9hZGNhc3REYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRVhDSEFOR0UsXG4gICAgICAgICAgICAgICAgICAgIGZyb206IHRoaXMudXNlcklkLFxuICAgICAgICAgICAgICAgICAgICB0bzogZGF0YS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBzZHA6IEpTT04uc3RyaW5naWZ5KHBjLmxvY2FsRGVzY3JpcHRpb24pXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGVhdmVDYWxsKGUpe1xuICAgIGNvbnN0IHBjS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMucGNQZWVycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGNQZWVyc1twY0tleXNbaV1dLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMucGNQZWVycyA9IHt9OyAgICBcbiAgICB0aGlzLmxvY2FsVmlkZW8uc3JjT2JqZWN0LmdldFRyYWNrcygpXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHsgdHJhY2suc3RvcCgpOyB9KVxuXG4gICAgdGhpcy5sb2NhbFZpZGVvLnNyY09iamVjdCA9IG51bGw7XG4gICAgVmlkZW9DYWxsLmNhYmxlLnN1YnNjcmlwdGlvbnMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMucmVtb3RlVmlkZW9Db250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBicm9hZGNhc3REYXRhKHsgdHlwZTogTEVBVkVfQ0FMTCwgZnJvbTogdGhpcy51c2VySWQgfSk7XG4gIH1cbiAgcmVtb3ZlVXNlcihkYXRhKXtcbiAgICBsZXQgdmlkZW8gPSAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVtb3RlVmlkZW9Db250YWluZXIrJHtkYXRhLmZyb219YCk7XG4gICAgdmlkZW8gJiYgdmlkZW8ucmVtb3ZlKCk7XG4gICAgbGV0IHBlZXJzID0gdGhpcy5wY1BlZXJzXG4gICAgZGVsZXRlIHBlZXJzW2RhdGEuZnJvbV1cbiAgfVxuICByZW5kZXIoKXtcbiAgICByZXR1cm4oXG4gICAgPGRpdiBjbGFzc05hbWU9XCJWaWRlb0NhbGxcIj5cbiAgICAgPGRpdiBpZD1cInJlbW90ZS12aWRlby1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgPHZpZGVvIGlkPVwibG9jYWwtdmlkZW9cIiBhdXRvUGxheT48L3ZpZGVvPlxuICAgICA8YnV0dG9uIG9uQ2xpY2s9e3RoaXMuam9pbkNhbGx9PkpvaW4gQ2FsbDwvYnV0dG9uPlxuICAgICA8YnV0dG9uIG9uQ2xpY2s9e3RoaXMubGVhdmVDYWxsfT5MZWF2ZSBDYWxsPC9idXR0b24+XG4gICAgPC9kaXY+KVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCBWaWRlb0NhbGw7XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJicm9hZGNhc3REYXRhIiwiSk9JTl9DQUxMIiwiTEVBVkVfQ0FMTCIsIkVYQ0hBTkdFIiwiaWNlIiwiVmlkZW9DYWxsIiwiX1JlYWN0JENvbXBvbmVudCIsIl9pbmhlcml0cyIsIl9zdXBlciIsIl9jcmVhdGVTdXBlciIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJjYWxsIiwicGNQZWVycyIsInVzZXJJZCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImpvaW5DYWxsIiwiYmluZCIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJsZWF2ZUNhbGwiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMyIiwicmVtb3RlVmlkZW9Db250YWluZXIiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwibmF2aWdhdG9yIiwibWVkaWFEZXZpY2VzIiwiZ2V0VXNlck1lZGlhIiwiYXVkaW8iLCJ2aWRlbyIsInRoZW4iLCJzdHJlYW0iLCJsb2NhbFN0cmVhbSIsInNyY09iamVjdCIsImVycm9yIiwiY29uc29sZSIsImxvZyIsImpvaW4iLCJkYXRhIiwiY3JlYXRlUEMiLCJmcm9tIiwiZSIsIl90aGlzMyIsImNhYmxlIiwic3Vic2NyaXB0aW9ucyIsImNyZWF0ZSIsImNoYW5uZWwiLCJjb25uZWN0ZWQiLCJ0eXBlIiwicmVjZWl2ZWQiLCJ0byIsImV4Y2hhbmdlIiwicmVtb3ZlVXNlciIsIm9mZmVyQm9vbCIsIl90aGlzNCIsInBjIiwiUlRDUGVlckNvbm5lY3Rpb24iLCJnZXRUcmFja3MiLCJmb3JFYWNoIiwidHJhY2siLCJhZGRUcmFjayIsImNyZWF0ZU9mZmVyIiwib2ZmZXIiLCJzZXRMb2NhbERlc2NyaXB0aW9uIiwic2V0VGltZW91dCIsInNkcCIsIkpTT04iLCJzdHJpbmdpZnkiLCJsb2NhbERlc2NyaXB0aW9uIiwib25pY2VjYW5kaWRhdGUiLCJjYW5kaWRhdGUiLCJvbnRyYWNrIiwicmVtb3RlVmlkIiwiY3JlYXRlRWxlbWVudCIsImlkIiwiY29uY2F0IiwiYXV0b3BsYXkiLCJzdHJlYW1zIiwiYXBwZW5kQ2hpbGQiLCJvbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSIsImljZUNvbm5lY3Rpb25TdGF0ZSIsIl90aGlzNSIsInBhcnNlIiwiYWRkSWNlQ2FuZGlkYXRlIiwiUlRDSWNlQ2FuZGlkYXRlIiwic2V0UmVtb3RlRGVzY3JpcHRpb24iLCJjcmVhdGVBbnN3ZXIiLCJhbnN3ZXIiLCJwY0tleXMiLCJPYmplY3QiLCJrZXlzIiwiaSIsImxlbmd0aCIsImNsb3NlIiwibG9jYWxWaWRlbyIsInN0b3AiLCJpbm5lckhUTUwiLCJyZW1vdmUiLCJwZWVycyIsInJlbmRlciIsImNsYXNzTmFtZSIsImF1dG9QbGF5Iiwib25DbGljayIsIkNvbXBvbmVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./frontend/components/VideoCall.jsx\n"); /***/ }), diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js index 739aa5f0..392c2398 100644 --- a/app/assets/javascripts/cable.js +++ b/app/assets/javascripts/cable.js @@ -6,8 +6,8 @@ //= require_tree ./channels (function() { - this.App || (this.App = {}); + this.VideoCall || (this.VideoCall = {}); - App.cable = ActionCable.createConsumer(); + VideoCall.cable = ActionCable.createConsumer(); }).call(this); diff --git a/app/views/calls/root.html.haml b/app/views/calls/root.html.haml index c987e31b..4357b676 100644 --- a/app/views/calls/root.html.haml +++ b/app/views/calls/root.html.haml @@ -1,3 +1,3 @@ %main#root - %h1 If you're seeing this, something broke + %h1 react component failed to load -# , props = {id: @game.id, current_user: current_user}, html_options = {id: "game-component-container"} diff --git a/frontend/components/VideoCall.jsx b/frontend/components/VideoCall.jsx index 47396097..2b2bf559 100644 --- a/frontend/components/VideoCall.jsx +++ b/frontend/components/VideoCall.jsx @@ -22,7 +22,7 @@ class VideoCall extends React.Component{ joinCall(e){ console.log("Hello from joinCall"); console.log(e); - App.cable.subscriptions.create( + VideoCall.cable.subscriptions.create( { channel: "CallChannel" }, { connected: () => { @@ -130,7 +130,7 @@ class VideoCall extends React.Component{ .forEach(function (track) { track.stop(); }) this.localVideo.srcObject = null; - App.cable.subscriptions.subscriptions = []; + VideoCall.cable.subscriptions.subscriptions = []; this.remoteVideoContainer.innerHTML = ""; broadcastData({ type: LEAVE_CALL, from: this.userId }); } @@ -150,4 +150,4 @@ class VideoCall extends React.Component{ ) } } -export default App; +export default VideoCall;