From 69798848c0f49f322ff55bf8789603853aa4fd4e Mon Sep 17 00:00:00 2001 From: yanas Date: Thu, 2 Jun 2016 11:30:45 -0500 Subject: [PATCH 1/3] Handle recording errors --- conference.js | 5 ++-- lang/main.json | 6 ++-- modules/UI/UI.js | 4 +-- modules/UI/recording/Recording.js | 46 ++++++++++++++++++++++--------- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/conference.js b/conference.js index 858093133..66fd87c0c 100644 --- a/conference.js +++ b/conference.js @@ -21,6 +21,8 @@ const ConferenceErrors = JitsiMeetJS.errors.conference; const TrackEvents = JitsiMeetJS.events.track; const TrackErrors = JitsiMeetJS.errors.track; +const RecorderErrors = JitsiMeetJS.errors.recorder; + let room, connection, localAudio, localVideo, roomLocker; let currentAudioInputDevices, currentVideoInputDevices; @@ -356,7 +358,6 @@ export default { if(JitsiMeetJS.getGlobalOnErrorHandler){ var oldOnErrorHandler = window.onerror; window.onerror = function (message, source, lineno, colno, error) { - JitsiMeetJS.getGlobalOnErrorHandler( message, source, lineno, colno, error); @@ -1152,7 +1153,7 @@ export default { room.on(ConferenceEvents.RECORDER_STATE_CHANGED, (status, error) => { console.log("Received recorder status change: ", status, error); - APP.UI.updateRecordingState(status); + APP.UI.updateRecordingState(status, error); }); room.on(ConferenceEvents.USER_STATUS_CHANGED, function (id, status) { diff --git a/lang/main.json b/lang/main.json index 62539cad0..a982a5c58 100644 --- a/lang/main.json +++ b/lang/main.json @@ -275,7 +275,8 @@ "off": "Recording stopped", "failedToStart": "Recording failed to start", "buttonTooltip": "Start / stop recording", - "error": "Recording failed. Please try again." + "error": "Recording failed. Please try again.", + "unavailable": "The recording service is currently unavailable. Please try again later." }, "liveStreaming": { @@ -286,6 +287,7 @@ "failedToStart": "Live streaming failed to start", "buttonTooltip": "Start / stop live stream", "streamIdRequired": "Please fill in the stream id in order to launch the live streaming.", - "error": "Live streaming failed. Please try again" + "error": "Live streaming failed. Please try again.", + "busy": "All recorders are currently busy. Please try again later." } } diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 612f407c8..c62afb2c6 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -1006,8 +1006,8 @@ UI.requestFeedback = function () { }); }; -UI.updateRecordingState = function (state) { - Recording.updateRecordingState(state); +UI.updateRecordingState = function (state, error) { + Recording.updateRecordingState(state, error); }; UI.notifyTokenAuthFailed = function () { diff --git a/modules/UI/recording/Recording.js b/modules/UI/recording/Recording.js index 051aeda1a..308eedd6c 100644 --- a/modules/UI/recording/Recording.js +++ b/modules/UI/recording/Recording.js @@ -206,7 +206,9 @@ var Status = { AVAILABLE: "available", UNAVAILABLE: "unavailable", PENDING: "pending", - ERROR: "error" + ERROR: "error", + FAILED: "failed", + BUSY: "busy" }; /** @@ -245,21 +247,27 @@ var Recording = { if (recordingType === 'jibri') { this.baseClass = "fa fa-play-circle"; + this.recordingTitle = "dialog.liveStreaming"; this.recordingOnKey = "liveStreaming.on"; this.recordingOffKey = "liveStreaming.off"; this.recordingPendingKey = "liveStreaming.pending"; this.failedToStartKey = "liveStreaming.failedToStart"; this.recordingErrorKey = "liveStreaming.error"; this.recordingButtonTooltip = "liveStreaming.buttonTooltip"; + this.recordingUnavailable = "liveStreaming.unavailable"; + this.recordingBusy = "liveStreaming.busy"; } else { this.baseClass = "icon-recEnable"; + this.recordingTitle = "dialog.recording"; this.recordingOnKey = "recording.on"; this.recordingOffKey = "recording.off"; this.recordingPendingKey = "recording.pending"; this.failedToStartKey = "recording.failedToStart"; this.recordingErrorKey = "recording.error"; this.recordingButtonTooltip = "recording.buttonTooltip"; + this.recordingUnavailable = "recording.unavailable"; + this.recordingBusy = "liveStreaming.busy"; } selector.addClass(this.baseClass); @@ -307,10 +315,17 @@ var Recording = { } break; } + case Status.BUSY: { + APP.UI.messageHandler.openMessageDialog( + self.recordingTitle, + self.recordingBusy + ); + break; + } default: { APP.UI.messageHandler.openMessageDialog( - "dialog.liveStreaming", - "liveStreaming.unavailable" + self.recordingTitle, + self.recordingUnavailable ); } } @@ -333,7 +348,7 @@ var Recording = { * Updates the recording state UI. * @param recordingState gives us the current recording state */ - updateRecordingState(recordingState) { + updateRecordingState(recordingState, error) { // I'm the recorder, so I don't want to see any UI related to states. if (config.iAmRecorder) return; @@ -342,16 +357,19 @@ var Recording = { if (!recordingState || this.currentState === recordingState) return; - this.updateRecordingUI(recordingState); + this.updateRecordingUI(recordingState, error); }, /** * Sets the state of the recording button. * @param recordingState gives us the current recording state */ - updateRecordingUI (recordingState) { + updateRecordingUI (recordingState, error) { let buttonSelector = $('#toolbar_button_record'); + let oldState = this.currentState; + this.currentState = recordingState; + // TODO: handle recording state=available if (recordingState === Status.ON) { @@ -361,19 +379,21 @@ var Recording = { this._updateStatusLabel(this.recordingOnKey, false); } else if (recordingState === Status.OFF - || recordingState === Status.UNAVAILABLE) { + || recordingState === Status.UNAVAILABLE + || recordingState === Status.BUSY + || recordingState === Status.FAILED) { // We don't want to do any changes if this is // an availability change. - if (this.currentState !== Status.ON - && this.currentState !== Status.PENDING) + if (oldState !== Status.ON + && oldState !== Status.PENDING) return; buttonSelector.removeClass(this.baseClass + " active"); buttonSelector.addClass(this.baseClass); let messageKey; - if (this.currentState === Status.PENDING) + if (oldState === Status.PENDING) messageKey = this.failedToStartKey; else messageKey = this.recordingOffKey; @@ -391,15 +411,15 @@ var Recording = { this._updateStatusLabel(this.recordingPendingKey, true); } - else if (recordingState === Status.ERROR) { + else if (recordingState === Status.ERROR + || recordingState === Status.FAILED) { buttonSelector.removeClass(this.baseClass + " active"); buttonSelector.addClass(this.baseClass); this._updateStatusLabel(this.recordingErrorKey, true); + console.log("Recording failed for the following reason: ", error); } - this.currentState = recordingState; - let labelSelector = $('#recordingLabel'); // We don't show the label for available state. From 7e4b13fb44f55e129e5cae923c2b7ba9e7f7e0ef Mon Sep 17 00:00:00 2001 From: yanas Date: Thu, 2 Jun 2016 15:41:28 -0500 Subject: [PATCH 2/3] Remove recorder errors import --- conference.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/conference.js b/conference.js index 66fd87c0c..2e40c431c 100644 --- a/conference.js +++ b/conference.js @@ -21,8 +21,6 @@ const ConferenceErrors = JitsiMeetJS.errors.conference; const TrackEvents = JitsiMeetJS.events.track; const TrackErrors = JitsiMeetJS.errors.track; -const RecorderErrors = JitsiMeetJS.errors.recorder; - let room, connection, localAudio, localVideo, roomLocker; let currentAudioInputDevices, currentVideoInputDevices; From 07c2e91ae27fcbac38ab0d009c9613df20c9cc93 Mon Sep 17 00:00:00 2001 From: yanas Date: Thu, 2 Jun 2016 17:12:40 -0500 Subject: [PATCH 3/3] Do not handle the actual error message yet --- conference.js | 2 +- modules/UI/UI.js | 4 ++-- modules/UI/recording/Recording.js | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/conference.js b/conference.js index 2e40c431c..951ec2e79 100644 --- a/conference.js +++ b/conference.js @@ -1151,7 +1151,7 @@ export default { room.on(ConferenceEvents.RECORDER_STATE_CHANGED, (status, error) => { console.log("Received recorder status change: ", status, error); - APP.UI.updateRecordingState(status, error); + APP.UI.updateRecordingState(status); }); room.on(ConferenceEvents.USER_STATUS_CHANGED, function (id, status) { diff --git a/modules/UI/UI.js b/modules/UI/UI.js index c62afb2c6..612f407c8 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -1006,8 +1006,8 @@ UI.requestFeedback = function () { }); }; -UI.updateRecordingState = function (state, error) { - Recording.updateRecordingState(state, error); +UI.updateRecordingState = function (state) { + Recording.updateRecordingState(state); }; UI.notifyTokenAuthFailed = function () { diff --git a/modules/UI/recording/Recording.js b/modules/UI/recording/Recording.js index 308eedd6c..8929d1be7 100644 --- a/modules/UI/recording/Recording.js +++ b/modules/UI/recording/Recording.js @@ -348,7 +348,7 @@ var Recording = { * Updates the recording state UI. * @param recordingState gives us the current recording state */ - updateRecordingState(recordingState, error) { + updateRecordingState(recordingState) { // I'm the recorder, so I don't want to see any UI related to states. if (config.iAmRecorder) return; @@ -357,14 +357,14 @@ var Recording = { if (!recordingState || this.currentState === recordingState) return; - this.updateRecordingUI(recordingState, error); + this.updateRecordingUI(recordingState); }, /** * Sets the state of the recording button. * @param recordingState gives us the current recording state */ - updateRecordingUI (recordingState, error) { + updateRecordingUI (recordingState) { let buttonSelector = $('#toolbar_button_record'); let oldState = this.currentState; @@ -417,7 +417,6 @@ var Recording = { buttonSelector.addClass(this.baseClass); this._updateStatusLabel(this.recordingErrorKey, true); - console.log("Recording failed for the following reason: ", error); } let labelSelector = $('#recordingLabel');