From 7348a5a1bf65db273b0ddee654d4f8aec20db60a Mon Sep 17 00:00:00 2001 From: "Jesse C. Fisher" Date: Mon, 18 Sep 2023 17:33:47 +0000 Subject: [PATCH] Add redis gem --- Gemfile | 1 + Gemfile.lock | 2 ++ app/assets/javascripts/bundle.js | 2 +- config/cable.yml | 4 ++++ config/environments/production.rb | 1 + frontend/components/VideoCall.jsx | 2 +- 6 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 config/cable.yml diff --git a/Gemfile b/Gemfile index 607842aa..2827e4b2 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,7 @@ source 'https://rubygems.org' ruby '2.7.7' gem 'rails', '5.2.2' # TODO Upgrade sprockets +gem 'redis', '~> 4.0' gem 'sprockets', '~> 3.7' gem 'sass-rails' #, '~> 4.0.3' gem 'uglifier' #, '>= 1.3.0' diff --git a/Gemfile.lock b/Gemfile.lock index e64fbdc4..29addef9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -326,6 +326,7 @@ GEM execjs railties (>= 3.2) tilt + redis (4.8.1) regexp_parser (2.1.1) responders (3.0.1) actionpack (>= 5.0) @@ -491,6 +492,7 @@ DEPENDENCIES rbnacl (~> 3.4) rbnacl-libsodium react-rails + redis (~> 4.0) rspec-rails rubocop sass-rails diff --git a/app/assets/javascripts/bundle.js b/app/assets/javascripts/bundle.js index 2f756d8e..606116ab 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__ = (VideoCall);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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eEQ7RUFBQztJQUFBUyxHQUFBO0lBQUFDLEtBQUEsRUFDRCxTQUFBa0MsV0FBV2YsSUFBSSxFQUFDO01BQ2QsSUFBSVQsS0FBSyxHQUFZTixRQUFRLENBQUNDLGNBQWMseUJBQUFvRCxNQUFBLENBQXlCdEMsSUFBSSxDQUFDRSxJQUFJLENBQUUsQ0FBQztNQUNqRlgsS0FBSyxJQUFJQSxLQUFLLENBQUNxRSxNQUFNLENBQUMsQ0FBQztNQUN2QixJQUFJQyxLQUFLLEdBQUcsSUFBSSxDQUFDM0YsT0FBTztNQUN4QixPQUFPMkYsS0FBSyxDQUFDN0QsSUFBSSxDQUFDRSxJQUFJLENBQUM7SUFDekI7RUFBQztJQUFBdEIsR0FBQTtJQUFBQyxLQUFBLEVBQ0QsU0FBQWlGLE9BQUEsRUFBUTtNQUNOLG9CQUNBM0csMERBQUE7UUFBSzRHLFNBQVMsRUFBQztNQUFXLGdCQUN6QjVHLDBEQUFBO1FBQUtrRixFQUFFLEVBQUM7TUFBd0IsQ0FBTSxDQUFDLGVBQ3ZDbEYsMERBQUE7UUFBT2tGLEVBQUUsRUFBQyxhQUFhO1FBQUMyQixRQUFRO01BQUEsQ0FBUSxDQUFDLGVBQ3pDN0csMERBQUE7UUFBUThHLE9BQU8sRUFBRSxJQUFJLENBQUMxRjtNQUFTLEdBQUMsV0FBaUIsQ0FBQyxlQUNsRHBCLDBEQUFBO1FBQVE4RyxPQUFPLEVBQUUsSUFBSSxDQUFDdkY7TUFBVSxHQUFDLFlBQWtCLENBQy9DLENBQUM7SUFDUjtFQUFDO0VBQUEsT0FBQWpCLFNBQUE7QUFBQSxFQW5KcUJOLHdEQUFlO0FBcUp2QyxpRUFBZU0sU0FBUyIsInNvdXJjZXMiOlsid2VicGFjazovL3RoaXJ0ZWVuLXRpZW4tbGVuLy4vZnJvbnRlbmQvY29tcG9uZW50cy9WaWRlb0NhbGwuanN4PzFmYmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGJyb2FkY2FzdERhdGEsIEpPSU5fQ0FMTCwgTEVBVkVfQ0FMTCwgRVhDSEFOR0UsIGljZSB9IGZyb20gJy4vdmlkZW9fdXRpbC5qcyc7XG5cbmNsYXNzIFZpZGVvQ2FsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudHtcbiAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnBjUGVlcnMgPSB7fTtcbiAgICB0aGlzLnVzZXJJZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwKTtcbiAgICB0aGlzLmpvaW5DYWxsID0gdGhpcy5qb2luQ2FsbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubGVhdmVDYWxsID0gdGhpcy5sZWF2ZUNhbGwuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgIHRoaXMucmVtb3RlVmlkZW9Db250YWluZXIgPSBcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVtb3RlLXZpZGVvLWNvbnRhaW5lclwiKVxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHthdWRpbzogZmFsc2UsIHZpZGVvOiB0cnVlfSlcbiAgICAgIC50aGVuKHN0cmVhbSA9PiB7XG4gICAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibG9jYWwtdmlkZW9cIikuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgfSkuY2F0Y2goZXJyb3IgPT4geyBjb25zb2xlLmxvZyhlcnJvcil9KTtcbiAgfVxuICBqb2luKGRhdGEpeyB0aGlzLmNyZWF0ZVBDKGRhdGEuZnJvbSwgdHJ1ZSkgfVxuICBqb2luQ2FsbChlKXtcbiAgICBjb25zb2xlLmxvZyhcIkhlbGxvIGZyb20gam9pbkNhbGxcIik7XG4gICAgY29uc29sZS5sb2coZSk7XG4gICAgQXBwLmNhYmxlLnN1YnNjcmlwdGlvbnMuY3JlYXRlKFxuICAgICAgeyBjaGFubmVsOiBcIkNhbGxDaGFubmVsXCIgfSxcbiAgICAgIHsgXG4gICAgICAgIGNvbm5lY3RlZDogKCkgPT4ge1xuICAgICAgICAgIGJyb2FkY2FzdERhdGEoeyB0eXBlOiBKT0lOX0NBTEwsIGZyb206IHRoaXMudXNlcklkfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY2VpdmVkOiBkYXRhID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJFQ0VJVkVEOiBcIiwgZGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEuZnJvbSA9PT0gdGhpcy51c2VySWQpIHJldHVybjtcbiAgICAgICAgICBzd2l0Y2goZGF0YS50eXBlKXtcbiAgICAgICAgICAgIGNhc2UgSk9JTl9DQUxMOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qb2luKGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBFWENIQU5HRTpcbiAgICAgICAgICAgICAgaWYgKGRhdGEudG8gIT09IHRoaXMudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2hhbmdlKGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBMRUFWRV9DQUxMOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVVc2VyKGRhdGEpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgY3JlYXRlUEModXNlcklkLCBvZmZlckJvb2wpe1xuICAgIGNvbnN0IHBjID0gbmV3IFJUQ1BlZXJDb25uZWN0aW9uKGljZSk7XG4gICAgdGhpcy5wY1BlZXJzW3VzZXJJZF0gPSBwYztcbiAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpXG4gICAgICAuZm9yRWFjaCh0cmFjayA9PiBwYy5hZGRUcmFjayh0cmFjaywgdGhpcy5sb2NhbFN0cmVhbSkpO1xuICAgIGlmIChvZmZlckJvb2wpIHtcbiAgICAgIHBjLmNyZWF0ZU9mZmVyKCkudGhlbihvZmZlciA9PiB7XG4gICAgICAgIHBjLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgICAgICAgIGJyb2FkY2FzdERhdGEoe1xuICAgICAgICAgICAgICB0eXBlOiBFWENIQU5HRSxcbiAgICAgICAgICAgICAgZnJvbTogdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgIHRvOiB1c2VySWQsXG4gICAgICAgICAgICAgIHNkcDogSlNPTi5zdHJpbmdpZnkocGMubG9jYWxEZXNjcmlwdGlvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcGMub25pY2VjYW5kaWRhdGUgPSAoZSkgPT4ge1xuICAgICAgYnJvYWRjYXN0RGF0YSh7XG4gICAgICAgIHR5cGU6IEVYQ0hBTkdFLFxuICAgICAgICBmcm9tOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgdG86IHVzZXJJZCxcbiAgICAgICAgc2RwOiBKU09OLnN0cmluZ2lmeShlLmNhbmRpZGF0ZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHBjLm9udHJhY2sgPSAoZSkgPT4ge1xuICAgICAgY29uc3QgcmVtb3RlVmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgICAgcmVtb3RlVmlkLmlkID0gYHJlbW90ZVZpZGVvQ29udGFpbmVyKyR7dXNlcklkfWA7XG4gICAgICByZW1vdGVWaWQuYXV0b3BsYXkgPSBcImF1dG9wbGF5XCI7XG4gICAgICByZW1vdGVWaWQuc3JjT2JqZWN0ID0gZS5zdHJlYW1zWzBdO1xuICAgICAgdGhpcy5yZW1vdGVWaWRlb0NvbnRhaW5lci5hcHBlbmRDaGlsZChyZW1vdGVWaWQpO1xuICAgIH1cbiAgICBwYy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IChlKSA9PiB7XG4gICAgICBpZiAocGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGVkJyl7XG4gICAgICAgIGJyb2FkY2FzdERhdGEoeyB0eXBlOiBMRUFWRV9DQUxMLCBmcm9tOiB1c2VySWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYztcbiAgfSBcblxuICBleGNoYW5nZShkYXRhKXtcbiAgICBsZXQgcGM7XG4gICAgaWYodGhpcy5wY1BlZXJzW2RhdGEuZnJvbV0pe1xuICAgICAgcGMgPSB0aGlzLnBjUGVlcnNbZGF0YS5mcm9tXTtcbiAgICB9IGVsc2V7XG4gICAgICBwYyA9IHRoaXMuY3JlYXRlUEMoZGF0YS5mcm9tLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkYXRhLmNhbmRpZGF0ZSl7XG4gICAgICBsZXQgY2FuZGlkYXRlID0gSlNPTi5wYXJzZShkYXRhLmNhbmRpZGF0ZSlcbiAgICAgIHBjLmFkZEljZUNhbmRpZGF0ZShuZXcgUlRDSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkpXG4gICAgfVxuICAgIGlmKGRhdGEuc2RwKXtcbiAgICAgIGNvbnN0IHNkcCA9IEpTT04ucGFyc2UoZGF0YS5zZHApO1xuICAgICAgaWYoc2RwICYmICFzZHAuY2FuZGlkYXRlKXtcbiAgICAgICAgcGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oc2RwKS50aGVuKCAoKSA9PntcbiAgICAgICAgICBpZiAoc2RwLnR5cGUgPT09ICdvZmZlcicpe1xuICAgICAgICAgICAgcGMuY3JlYXRlQW5zd2VyKCkudGhlbihhbnN3ZXIgPT4ge1xuICAgICAgICAgICAgICBwYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcilcbiAgICAgICAgICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEVYQ0hBTkdFLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdG86IGRhdGEuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgc2RwOiBKU09OLnN0cmluZ2lmeShwYy5sb2NhbERlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxlYXZlQ2FsbChlKXtcbiAgICBjb25zdCBwY0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLnBjUGVlcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBjUGVlcnNbcGNLZXlzW2ldXS5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLnBjUGVlcnMgPSB7fTsgICAgXG4gICAgdGhpcy5sb2NhbFZpZGVvLnNyY09iamVjdC5nZXRUcmFja3MoKVxuICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7IHRyYWNrLnN0b3AoKTsgfSlcblxuICAgIHRoaXMubG9jYWxWaWRlby5zcmNPYmplY3QgPSBudWxsO1xuICAgIEFwcC5jYWJsZS5zdWJzY3JpcHRpb25zLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLnJlbW90ZVZpZGVvQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgYnJvYWRjYXN0RGF0YSh7IHR5cGU6IExFQVZFX0NBTEwsIGZyb206IHRoaXMudXNlcklkIH0pO1xuICB9XG4gIHJlbW92ZVVzZXIoZGF0YSl7XG4gICAgbGV0IHZpZGVvID0gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlbW90ZVZpZGVvQ29udGFpbmVyKyR7ZGF0YS5mcm9tfWApO1xuICAgIHZpZGVvICYmIHZpZGVvLnJlbW92ZSgpO1xuICAgIGxldCBwZWVycyA9IHRoaXMucGNQZWVyc1xuICAgIGRlbGV0ZSBwZWVyc1tkYXRhLmZyb21dXG4gIH1cbiAgcmVuZGVyKCl7XG4gICAgcmV0dXJuKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiVmlkZW9DYWxsXCI+XG4gICAgIDxkaXYgaWQ9XCJyZW1vdGUtdmlkZW8tY29udGFpbmVyXCI+PC9kaXY+XG4gICAgIDx2aWRlbyBpZD1cImxvY2FsLXZpZGVvXCIgYXV0b1BsYXk+PC92aWRlbz5cbiAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLmpvaW5DYWxsfT5Kb2luIENhbGw8L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLmxlYXZlQ2FsbH0+TGVhdmUgQ2FsbDwvYnV0dG9uPlxuICAgIDwvZGl2PilcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgVmlkZW9DYWxsO1xuIl0sIm5hbWVzIjpbIlJlYWN0IiwiYnJvYWRjYXN0RGF0YSIsIkpPSU5fQ0FMTCIsIkxFQVZFX0NBTEwiLCJFWENIQU5HRSIsImljZSIsIlZpZGVvQ2FsbCIsIl9SZWFjdCRDb21wb25lbnQiLCJfaW5oZXJpdHMiLCJfc3VwZXIiLCJfY3JlYXRlU3VwZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiY2FsbCIsInBjUGVlcnMiLCJ1c2VySWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJqb2luQ2FsbCIsImJpbmQiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwibGVhdmVDYWxsIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJjb21wb25lbnREaWRNb3VudCIsIl90aGlzMiIsInJlbW90ZVZpZGVvQ29udGFpbmVyIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldFVzZXJNZWRpYSIsImF1ZGlvIiwidmlkZW8iLCJ0aGVuIiwic3RyZWFtIiwibG9jYWxTdHJlYW0iLCJzcmNPYmplY3QiLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJqb2luIiwiZGF0YSIsImNyZWF0ZVBDIiwiZnJvbSIsImUiLCJfdGhpczMiLCJBcHAiLCJjYWJsZSIsInN1YnNjcmlwdGlvbnMiLCJjcmVhdGUiLCJjaGFubmVsIiwiY29ubmVjdGVkIiwidHlwZSIsInJlY2VpdmVkIiwidG8iLCJleGNoYW5nZSIsInJlbW92ZVVzZXIiLCJvZmZlckJvb2wiLCJfdGhpczQiLCJwYyIsIlJUQ1BlZXJDb25uZWN0aW9uIiwiZ2V0VHJhY2tzIiwiZm9yRWFjaCIsInRyYWNrIiwiYWRkVHJhY2siLCJjcmVhdGVPZmZlciIsIm9mZmVyIiwic2V0TG9jYWxEZXNjcmlwdGlvbiIsInNldFRpbWVvdXQiLCJzZHAiLCJKU09OIiwic3RyaW5naWZ5IiwibG9jYWxEZXNjcmlwdGlvbiIsIm9uaWNlY2FuZGlkYXRlIiwiY2FuZGlkYXRlIiwib250cmFjayIsInJlbW90ZVZpZCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsImNvbmNhdCIsImF1dG9wbGF5Iiwic3RyZWFtcyIsImFwcGVuZENoaWxkIiwib25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UiLCJpY2VDb25uZWN0aW9uU3RhdGUiLCJfdGhpczUiLCJwYXJzZSIsImFkZEljZUNhbmRpZGF0ZSIsIlJUQ0ljZUNhbmRpZGF0ZSIsInNldFJlbW90ZURlc2NyaXB0aW9uIiwiY3JlYXRlQW5zd2VyIiwiYW5zd2VyIiwicGNLZXlzIiwiT2JqZWN0Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJjbG9zZSIsImxvY2FsVmlkZW8iLCJzdG9wIiwiaW5uZXJIVE1MIiwicmVtb3ZlIiwicGVlcnMiLCJyZW5kZXIiLCJjbGFzc05hbWUiLCJhdXRvUGxheSIsIm9uQ2xpY2siLCJDb21wb25lbnQiXSwic291cmNlUm9vdCI6IiJ9\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 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__ = (VideoCall);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RCxTQUFBa0MsV0FBV2YsSUFBSSxFQUFDO01BQ2QsSUFBSVQsS0FBSyxHQUFZTixRQUFRLENBQUNDLGNBQWMseUJBQUFvRCxNQUFBLENBQXlCdEMsSUFBSSxDQUFDRSxJQUFJLENBQUUsQ0FBQztNQUNqRlgsS0FBSyxJQUFJQSxLQUFLLENBQUNxRSxNQUFNLENBQUMsQ0FBQztNQUN2QixJQUFJQyxLQUFLLEdBQUcsSUFBSSxDQUFDM0YsT0FBTztNQUN4QixPQUFPMkYsS0FBSyxDQUFDN0QsSUFBSSxDQUFDRSxJQUFJLENBQUM7SUFDekI7RUFBQztJQUFBdEIsR0FBQTtJQUFBQyxLQUFBLEVBQ0QsU0FBQWlGLE9BQUEsRUFBUTtNQUNOLG9CQUNBM0csMERBQUE7UUFBSzRHLFNBQVMsRUFBQztNQUFXLGdCQUN6QjVHLDBEQUFBO1FBQUtrRixFQUFFLEVBQUM7TUFBd0IsQ0FBTSxDQUFDLGVBQ3ZDbEYsMERBQUE7UUFBT2tGLEVBQUUsRUFBQyxhQUFhO1FBQUMyQixRQUFRO01BQUEsQ0FBUSxDQUFDLGVBQ3pDN0csMERBQUE7UUFBUThHLE9BQU8sRUFBRSxJQUFJLENBQUMxRjtNQUFTLEdBQUMsV0FBaUIsQ0FBQyxlQUNsRHBCLDBEQUFBO1FBQVE4RyxPQUFPLEVBQUUsSUFBSSxDQUFDdkY7TUFBVSxHQUFDLFlBQWtCLENBQy9DLENBQUM7SUFDUjtFQUFDO0VBQUEsT0FBQWpCLFNBQUE7QUFBQSxFQW5KcUJOLHdEQUFlO0FBcUp2QyxpRUFBZU0sU0FBUyIsInNvdXJjZXMiOlsid2VicGFjazovL3RoaXJ0ZWVuLXRpZW4tbGVuLy4vZnJvbnRlbmQvY29tcG9uZW50cy9WaWRlb0NhbGwuanN4PzFmYmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGJyb2FkY2FzdERhdGEsIEpPSU5fQ0FMTCwgTEVBVkVfQ0FMTCwgRVhDSEFOR0UsIGljZSB9IGZyb20gJy4vdmlkZW9fdXRpbC5qcyc7XG5cbmNsYXNzIFZpZGVvQ2FsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudHtcbiAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnBjUGVlcnMgPSB7fTtcbiAgICB0aGlzLnVzZXJJZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwKTtcbiAgICB0aGlzLmpvaW5DYWxsID0gdGhpcy5qb2luQ2FsbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubGVhdmVDYWxsID0gdGhpcy5sZWF2ZUNhbGwuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgIHRoaXMucmVtb3RlVmlkZW9Db250YWluZXIgPSBcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVtb3RlLXZpZGVvLWNvbnRhaW5lclwiKVxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHthdWRpbzogZmFsc2UsIHZpZGVvOiB0cnVlfSlcbiAgICAgIC50aGVuKHN0cmVhbSA9PiB7XG4gICAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibG9jYWwtdmlkZW9cIikuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgfSkuY2F0Y2goZXJyb3IgPT4geyBjb25zb2xlLmxvZyhlcnJvcil9KTtcbiAgfVxuICBqb2luKGRhdGEpeyB0aGlzLmNyZWF0ZVBDKGRhdGEuZnJvbSwgdHJ1ZSkgfVxuICBqb2luQ2FsbChlKXtcbiAgICBjb25zb2xlLmxvZyhcIkhlbGxvIGZyb20gam9pbkNhbGxcIik7XG4gICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgQXBwLmNhYmxlLnN1YnNjcmlwdGlvbnMuY3JlYXRlKFxuICAgICAgeyBjaGFubmVsOiBcIkNhbGxDaGFubmVsXCIgfSxcbiAgICAgIHsgXG4gICAgICAgIGNvbm5lY3RlZDogKCkgPT4ge1xuICAgICAgICAgIGJyb2FkY2FzdERhdGEoeyB0eXBlOiBKT0lOX0NBTEwsIGZyb206IHRoaXMudXNlcklkfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY2VpdmVkOiBkYXRhID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJFQ0VJVkVEOiBcIiwgZGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEuZnJvbSA9PT0gdGhpcy51c2VySWQpIHJldHVybjtcbiAgICAgICAgICBzd2l0Y2goZGF0YS50eXBlKXtcbiAgICAgICAgICAgIGNhc2UgSk9JTl9DQUxMOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qb2luKGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBFWENIQU5HRTpcbiAgICAgICAgICAgICAgaWYgKGRhdGEudG8gIT09IHRoaXMudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2hhbmdlKGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBMRUFWRV9DQUxMOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVVc2VyKGRhdGEpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgY3JlYXRlUEModXNlcklkLCBvZmZlckJvb2wpe1xuICAgIGNvbnN0IHBjID0gbmV3IFJUQ1BlZXJDb25uZWN0aW9uKGljZSk7XG4gICAgdGhpcy5wY1BlZXJzW3VzZXJJZF0gPSBwYztcbiAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpXG4gICAgICAuZm9yRWFjaCh0cmFjayA9PiBwYy5hZGRUcmFjayh0cmFjaywgdGhpcy5sb2NhbFN0cmVhbSkpO1xuICAgIGlmIChvZmZlckJvb2wpIHtcbiAgICAgIHBjLmNyZWF0ZU9mZmVyKCkudGhlbihvZmZlciA9PiB7XG4gICAgICAgIHBjLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgICAgICAgIGJyb2FkY2FzdERhdGEoe1xuICAgICAgICAgICAgICB0eXBlOiBFWENIQU5HRSxcbiAgICAgICAgICAgICAgZnJvbTogdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgIHRvOiB1c2VySWQsXG4gICAgICAgICAgICAgIHNkcDogSlNPTi5zdHJpbmdpZnkocGMubG9jYWxEZXNjcmlwdGlvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcGMub25pY2VjYW5kaWRhdGUgPSAoZSkgPT4ge1xuICAgICAgYnJvYWRjYXN0RGF0YSh7XG4gICAgICAgIHR5cGU6IEVYQ0hBTkdFLFxuICAgICAgICBmcm9tOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgdG86IHVzZXJJZCxcbiAgICAgICAgc2RwOiBKU09OLnN0cmluZ2lmeShlLmNhbmRpZGF0ZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHBjLm9udHJhY2sgPSAoZSkgPT4ge1xuICAgICAgY29uc3QgcmVtb3RlVmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgICAgcmVtb3RlVmlkLmlkID0gYHJlbW90ZVZpZGVvQ29udGFpbmVyKyR7dXNlcklkfWA7XG4gICAgICByZW1vdGVWaWQuYXV0b3BsYXkgPSBcImF1dG9wbGF5XCI7XG4gICAgICByZW1vdGVWaWQuc3JjT2JqZWN0ID0gZS5zdHJlYW1zWzBdO1xuICAgICAgdGhpcy5yZW1vdGVWaWRlb0NvbnRhaW5lci5hcHBlbmRDaGlsZChyZW1vdGVWaWQpO1xuICAgIH1cbiAgICBwYy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IChlKSA9PiB7XG4gICAgICBpZiAocGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGVkJyl7XG4gICAgICAgIGJyb2FkY2FzdERhdGEoeyB0eXBlOiBMRUFWRV9DQUxMLCBmcm9tOiB1c2VySWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYztcbiAgfSBcblxuICBleGNoYW5nZShkYXRhKXtcbiAgICBsZXQgcGM7XG4gICAgaWYodGhpcy5wY1BlZXJzW2RhdGEuZnJvbV0pe1xuICAgICAgcGMgPSB0aGlzLnBjUGVlcnNbZGF0YS5mcm9tXTtcbiAgICB9IGVsc2V7XG4gICAgICBwYyA9IHRoaXMuY3JlYXRlUEMoZGF0YS5mcm9tLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkYXRhLmNhbmRpZGF0ZSl7XG4gICAgICBsZXQgY2FuZGlkYXRlID0gSlNPTi5wYXJzZShkYXRhLmNhbmRpZGF0ZSlcbiAgICAgIHBjLmFkZEljZUNhbmRpZGF0ZShuZXcgUlRDSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkpXG4gICAgfVxuICAgIGlmKGRhdGEuc2RwKXtcbiAgICAgIGNvbnN0IHNkcCA9IEpTT04ucGFyc2UoZGF0YS5zZHApO1xuICAgICAgaWYoc2RwICYmICFzZHAuY2FuZGlkYXRlKXtcbiAgICAgICAgcGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oc2RwKS50aGVuKCAoKSA9PntcbiAgICAgICAgICBpZiAoc2RwLnR5cGUgPT09ICdvZmZlcicpe1xuICAgICAgICAgICAgcGMuY3JlYXRlQW5zd2VyKCkudGhlbihhbnN3ZXIgPT4ge1xuICAgICAgICAgICAgICBwYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcilcbiAgICAgICAgICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEVYQ0hBTkdFLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdG86IGRhdGEuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgc2RwOiBKU09OLnN0cmluZ2lmeShwYy5sb2NhbERlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxlYXZlQ2FsbChlKXtcbiAgICBjb25zdCBwY0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLnBjUGVlcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBjUGVlcnNbcGNLZXlzW2ldXS5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLnBjUGVlcnMgPSB7fTsgICAgXG4gICAgdGhpcy5sb2NhbFZpZGVvLnNyY09iamVjdC5nZXRUcmFja3MoKVxuICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7IHRyYWNrLnN0b3AoKTsgfSlcblxuICAgIHRoaXMubG9jYWxWaWRlby5zcmNPYmplY3QgPSBudWxsO1xuICAgIEFwcC5jYWJsZS5zdWJzY3JpcHRpb25zLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLnJlbW90ZVZpZGVvQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgYnJvYWRjYXN0RGF0YSh7IHR5cGU6IExFQVZFX0NBTEwsIGZyb206IHRoaXMudXNlcklkIH0pO1xuICB9XG4gIHJlbW92ZVVzZXIoZGF0YSl7XG4gICAgbGV0IHZpZGVvID0gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlbW90ZVZpZGVvQ29udGFpbmVyKyR7ZGF0YS5mcm9tfWApO1xuICAgIHZpZGVvICYmIHZpZGVvLnJlbW92ZSgpO1xuICAgIGxldCBwZWVycyA9IHRoaXMucGNQZWVyc1xuICAgIGRlbGV0ZSBwZWVyc1tkYXRhLmZyb21dXG4gIH1cbiAgcmVuZGVyKCl7XG4gICAgcmV0dXJuKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiVmlkZW9DYWxsXCI+XG4gICAgIDxkaXYgaWQ9XCJyZW1vdGUtdmlkZW8tY29udGFpbmVyXCI+PC9kaXY+XG4gICAgIDx2aWRlbyBpZD1cImxvY2FsLXZpZGVvXCIgYXV0b1BsYXk+PC92aWRlbz5cbiAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLmpvaW5DYWxsfT5Kb2luIENhbGw8L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLmxlYXZlQ2FsbH0+TGVhdmUgQ2FsbDwvYnV0dG9uPlxuICAgIDwvZGl2PilcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgVmlkZW9DYWxsO1xuIl0sIm5hbWVzIjpbIlJlYWN0IiwiYnJvYWRjYXN0RGF0YSIsIkpPSU5fQ0FMTCIsIkxFQVZFX0NBTEwiLCJFWENIQU5HRSIsImljZSIsIlZpZGVvQ2FsbCIsIl9SZWFjdCRDb21wb25lbnQiLCJfaW5oZXJpdHMiLCJfc3VwZXIiLCJfY3JlYXRlU3VwZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiY2FsbCIsInBjUGVlcnMiLCJ1c2VySWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJqb2luQ2FsbCIsImJpbmQiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwibGVhdmVDYWxsIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJjb21wb25lbnREaWRNb3VudCIsIl90aGlzMiIsInJlbW90ZVZpZGVvQ29udGFpbmVyIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldFVzZXJNZWRpYSIsImF1ZGlvIiwidmlkZW8iLCJ0aGVuIiwic3RyZWFtIiwibG9jYWxTdHJlYW0iLCJzcmNPYmplY3QiLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJqb2luIiwiZGF0YSIsImNyZWF0ZVBDIiwiZnJvbSIsImUiLCJfdGhpczMiLCJBcHAiLCJjYWJsZSIsInN1YnNjcmlwdGlvbnMiLCJjcmVhdGUiLCJjaGFubmVsIiwiY29ubmVjdGVkIiwidHlwZSIsInJlY2VpdmVkIiwidG8iLCJleGNoYW5nZSIsInJlbW92ZVVzZXIiLCJvZmZlckJvb2wiLCJfdGhpczQiLCJwYyIsIlJUQ1BlZXJDb25uZWN0aW9uIiwiZ2V0VHJhY2tzIiwiZm9yRWFjaCIsInRyYWNrIiwiYWRkVHJhY2siLCJjcmVhdGVPZmZlciIsIm9mZmVyIiwic2V0TG9jYWxEZXNjcmlwdGlvbiIsInNldFRpbWVvdXQiLCJzZHAiLCJKU09OIiwic3RyaW5naWZ5IiwibG9jYWxEZXNjcmlwdGlvbiIsIm9uaWNlY2FuZGlkYXRlIiwiY2FuZGlkYXRlIiwib250cmFjayIsInJlbW90ZVZpZCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsImNvbmNhdCIsImF1dG9wbGF5Iiwic3RyZWFtcyIsImFwcGVuZENoaWxkIiwib25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UiLCJpY2VDb25uZWN0aW9uU3RhdGUiLCJfdGhpczUiLCJwYXJzZSIsImFkZEljZUNhbmRpZGF0ZSIsIlJUQ0ljZUNhbmRpZGF0ZSIsInNldFJlbW90ZURlc2NyaXB0aW9uIiwiY3JlYXRlQW5zd2VyIiwiYW5zd2VyIiwicGNLZXlzIiwiT2JqZWN0Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJjbG9zZSIsImxvY2FsVmlkZW8iLCJzdG9wIiwiaW5uZXJIVE1MIiwicmVtb3ZlIiwicGVlcnMiLCJyZW5kZXIiLCJjbGFzc05hbWUiLCJhdXRvUGxheSIsIm9uQ2xpY2siLCJDb21wb25lbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./frontend/components/VideoCall.jsx\n"); /***/ }), diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 00000000..c60d2876 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,4 @@ +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL", "redis://localhost:6379/0") %> + channel_prefix: app_production diff --git a/config/environments/production.rb b/config/environments/production.rb index cdd6c39b..a7018946 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -100,5 +100,6 @@ Rails.application.configure do # config.action_controller.relative_url_root = '/13' config.action_cable.allowed_request_origins =['my.tendy.zone'] # all origins in array will be allowed through config.action_cable.disable_request_forgery_protection = true + config.cache_store = :redis_cache_store, { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0") } end diff --git a/frontend/components/VideoCall.jsx b/frontend/components/VideoCall.jsx index 040eb08b..11e5395b 100644 --- a/frontend/components/VideoCall.jsx +++ b/frontend/components/VideoCall.jsx @@ -21,7 +21,7 @@ class VideoCall extends React.Component{ join(data){ this.createPC(data.from, true) } joinCall(e){ console.log("Hello from joinCall"); - console.log(e); + // console.log(e); App.cable.subscriptions.create( { channel: "CallChannel" }, {