Merge pull request #7709 from antobinary/logging-structure
Logging structure - add extraInfo: {}
This commit is contained in:
commit
ed264351d0
@ -11,7 +11,14 @@ const GLOBAL_AUDIO_PREFIX = 'GLOBAL_AUDIO_';
|
|||||||
const logFunc = (type, message, options) => {
|
const logFunc = (type, message, options) => {
|
||||||
const topic = options.topic || 'audio';
|
const topic = options.topic || 'audio';
|
||||||
|
|
||||||
logger[type](`[${topic}] ${JSON.stringify(message)} options:${JSON.stringify(options)}`);
|
logger[type]({
|
||||||
|
logCode: 'TODO_kurento_audio',
|
||||||
|
extraInfo: {
|
||||||
|
topic,
|
||||||
|
message,
|
||||||
|
options,
|
||||||
|
},
|
||||||
|
}, options && options.message && options.message.id ? options.message.id : 'kurento audio');
|
||||||
};
|
};
|
||||||
|
|
||||||
const modLogger = {
|
const modLogger = {
|
||||||
@ -126,7 +133,8 @@ export default class KurentoAudioBridge extends BaseAudioBridge {
|
|||||||
await audioContext.setSinkId(value);
|
await audioContext.setSinkId(value);
|
||||||
this.media.outputDeviceId = value;
|
this.media.outputDeviceId = value;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error({ logCode: 'audio_kurento_changeoutputdevice_error' }, err);
|
logFunc('error', 'SFU audio bridge failed to fetch STUN/TURN info, using default',
|
||||||
|
{ logCode: 'audio_kurento_changeoutputdevice_error', err });
|
||||||
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
|
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,10 @@ class SIPSession {
|
|||||||
// There will sometimes we erroneous errors put out like timeouts and improper shutdowns,
|
// There will sometimes we erroneous errors put out like timeouts and improper shutdowns,
|
||||||
// but only the first error ever matters
|
// but only the first error ever matters
|
||||||
if (this.alreadyErrored) {
|
if (this.alreadyErrored) {
|
||||||
logger.info({ logCode: 'sip_js_absorbing_callback_message' }, `Absorbing a redundant callback message. ${JSON.stringify(message)}`);
|
logger.info({
|
||||||
|
logCode: 'sip_js_absorbing_callback_message',
|
||||||
|
extraInfo: { message },
|
||||||
|
}, 'Absorbing a redundant callback message.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +100,7 @@ class SIPSession {
|
|||||||
|
|
||||||
const timeout = setInterval(() => {
|
const timeout = setInterval(() => {
|
||||||
clearInterval(timeout);
|
clearInterval(timeout);
|
||||||
logger.error({ logCode: 'sip_js_transfer_timed_out' }, 'Timeout on transfering from echo test to conference');
|
logger.error({ logCode: 'sip_js_transfer_timed_out' }, 'Timeout on transferring from echo test to conference');
|
||||||
this.callback({
|
this.callback({
|
||||||
status: this.baseCallStates.failed,
|
status: this.baseCallStates.failed,
|
||||||
error: 1008,
|
error: 1008,
|
||||||
@ -188,15 +191,15 @@ class SIPSession {
|
|||||||
// translation
|
// translation
|
||||||
const isSafari = browser().name === 'safari';
|
const isSafari = browser().name === 'safari';
|
||||||
|
|
||||||
logger.debug('Creating the user agent');
|
logger.debug({ logCode: 'sip_js_creating_user_agent' }, 'Creating the user agent');
|
||||||
|
|
||||||
if (this.userAgent && this.userAgent.isConnected()) {
|
if (this.userAgent && this.userAgent.isConnected()) {
|
||||||
if (this.userAgent.configuration.hostPortParams === this.hostname) {
|
if (this.userAgent.configuration.hostPortParams === this.hostname) {
|
||||||
logger.debug('Reusing the user agent');
|
logger.debug({ logCode: 'sip_js_reusing_user_agent' }, 'Reusing the user agent');
|
||||||
resolve(this.userAgent);
|
resolve(this.userAgent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logger.debug('different host name. need to kill');
|
logger.debug({ logCode: 'sip_js_different_host_name' }, 'Different host name. need to kill');
|
||||||
}
|
}
|
||||||
|
|
||||||
let userAgentConnected = false;
|
let userAgentConnected = false;
|
||||||
@ -348,7 +351,10 @@ class SIPSession {
|
|||||||
currentSession.on('progress', handleSessionProgress);
|
currentSession.on('progress', handleSessionProgress);
|
||||||
|
|
||||||
const handleConnectionCompleted = (peer) => {
|
const handleConnectionCompleted = (peer) => {
|
||||||
logger.info({ logCode: 'sip_js_ice_connection_success' }, `ICE connection success. Current state - ${peer.iceConnectionState}`);
|
logger.info({
|
||||||
|
logCode: 'sip_js_ice_connection_success',
|
||||||
|
extraInfo: { currentState: peer.iceConnectionState },
|
||||||
|
}, `ICE connection success. Current state - ${peer.iceConnectionState}`);
|
||||||
clearTimeout(callTimeout);
|
clearTimeout(callTimeout);
|
||||||
clearTimeout(iceNegotiationTimeout);
|
clearTimeout(iceNegotiationTimeout);
|
||||||
connectionCompletedEvents.forEach(e => mediaHandler.off(e, handleConnectionCompleted));
|
connectionCompletedEvents.forEach(e => mediaHandler.off(e, handleConnectionCompleted));
|
||||||
@ -369,7 +375,10 @@ class SIPSession {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.error({ logCode: 'sip_js_call_terminated' }, `Audio call terminated. cause=${cause}`);
|
logger.error({
|
||||||
|
logCode: 'sip_js_call_terminated',
|
||||||
|
extraInfo: { cause },
|
||||||
|
}, `Audio call terminated. cause=${cause}`);
|
||||||
|
|
||||||
let mappedCause;
|
let mappedCause;
|
||||||
if (!iceCompleted) {
|
if (!iceCompleted) {
|
||||||
@ -592,7 +601,10 @@ export default class SIPBridge extends BaseAudioBridge {
|
|||||||
await audioContext.setSinkId(value);
|
await audioContext.setSinkId(value);
|
||||||
this.media.outputDeviceId = value;
|
this.media.outputDeviceId = value;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error({ logCode: 'audio_sip_changeoutputdevice_error' }, err);
|
logger.error({
|
||||||
|
logCode: 'audio_sip_changeoutputdevice_error',
|
||||||
|
extraInfo: { error: err },
|
||||||
|
}, 'Change Output Device error');
|
||||||
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
|
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,30 @@
|
|||||||
import Logger from '/imports/startup/server/logger';
|
import Logger from '/imports/startup/server/logger';
|
||||||
import Users from '/imports/api/users';
|
import Users from '/imports/api/users';
|
||||||
|
|
||||||
const logClient = function (type, log, fullInfo = {}) {
|
const logClient = function (type, logDescription, logCode = 'was_not_provided', extraInfo, userInfo = {}) {
|
||||||
const SERVER_CONN_ID = this.connection.id;
|
const SERVER_CONN_ID = this.connection.id;
|
||||||
const User = Users.findOne({ connectionId: SERVER_CONN_ID });
|
const User = Users.findOne({ connectionId: SERVER_CONN_ID });
|
||||||
const logContents = { fullInfo };
|
const logContents = {
|
||||||
|
logCode,
|
||||||
|
logDescription,
|
||||||
|
extraInfo,
|
||||||
|
userInfo,
|
||||||
|
};
|
||||||
|
|
||||||
if (User) {
|
if (User) {
|
||||||
if ((fullInfo.credentials && User.meetingId === fullInfo.credentials.meetingId)
|
if ((userInfo.credentials && User.meetingId === userInfo.credentials.meetingId)
|
||||||
|| ((fullInfo.meetingId && User.meetingId === fullInfo.meetingId))) {
|
|| ((userInfo.meetingId && User.meetingId === userInfo.meetingId))) {
|
||||||
logContents.validUser = 'valid';
|
logContents.extraInfo.validUser = 'valid';
|
||||||
} else {
|
} else {
|
||||||
logContents.validUser = 'invalid';
|
logContents.extraInfo.validUser = 'invalid';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logContents.validUser = 'notFound';
|
logContents.extraInfo.validUser = 'notFound';
|
||||||
}
|
}
|
||||||
|
|
||||||
const topic = typeof logContents === 'Object' ? logContents.topic : null;
|
// If I don't pass message, logs will start with `undefined`
|
||||||
|
Logger.log({ message: JSON.stringify(logContents), level: type });
|
||||||
if (typeof log === 'string' || log instanceof String) {
|
// Logger.log({ message: 'client->server', level: type, logContents });
|
||||||
Logger.log({
|
|
||||||
level: type,
|
|
||||||
message: `${topic || 'CLIENT'} LOG: ${log} `,
|
|
||||||
meta: logContents,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Logger.log({
|
|
||||||
level: type,
|
|
||||||
message: `${topic || 'CLIENT'} LOG: ${JSON.stringify(log)} `,
|
|
||||||
meta: logContents,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default logClient;
|
export default logClient;
|
||||||
|
@ -25,7 +25,7 @@ class ServerLoggerStream extends ServerStream {
|
|||||||
|
|
||||||
this.rec = rec;
|
this.rec = rec;
|
||||||
if (fullInfo.meetingId != null) {
|
if (fullInfo.meetingId != null) {
|
||||||
this.rec.clientInfo = fullInfo;
|
this.rec.userInfo = fullInfo;
|
||||||
}
|
}
|
||||||
this.rec.clientBuild = Meteor.settings.public.app.html5ClientBuild;
|
this.rec.clientBuild = Meteor.settings.public.app.html5ClientBuild;
|
||||||
return super.write(this.rec);
|
return super.write(this.rec);
|
||||||
@ -39,7 +39,14 @@ class MeteorStream {
|
|||||||
|
|
||||||
this.rec = rec;
|
this.rec = rec;
|
||||||
if (fullInfo.meetingId != null) {
|
if (fullInfo.meetingId != null) {
|
||||||
Meteor.call('logClient', nameFromLevel[this.rec.level], this.rec.msg, fullInfo);
|
Meteor.call(
|
||||||
|
'logClient',
|
||||||
|
nameFromLevel[this.rec.level],
|
||||||
|
this.rec.msg,
|
||||||
|
this.rec.logCode,
|
||||||
|
this.rec.extraInfo || {},
|
||||||
|
fullInfo,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
Meteor.call('logClient', nameFromLevel[this.rec.level], this.rec.msg);
|
Meteor.call('logClient', nameFromLevel[this.rec.level], this.rec.msg);
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,12 @@ const DesktopShare = ({
|
|||||||
notify(intl.formatMessage(intlMessages.iceConnectionStateError), 'error', 'desktop');
|
notify(intl.formatMessage(intlMessages.iceConnectionStateError), 'error', 'desktop');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
logger.error({ logCode: 'desktopshare_default_error' }, error || 'Default error handler');
|
logger.error({
|
||||||
|
logCode: 'desktopshare_default_error',
|
||||||
|
extraInfo: {
|
||||||
|
maybeError: error || 'Default error handler',
|
||||||
|
},
|
||||||
|
}, 'Default error handler for screenshare');
|
||||||
}
|
}
|
||||||
screenShareEndAlert();
|
screenShareEndAlert();
|
||||||
};
|
};
|
||||||
|
@ -3,8 +3,8 @@ import _ from 'lodash';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import cx from 'classnames';
|
import cx from 'classnames';
|
||||||
import logger from '/imports/startup/client/logger';
|
import logger from '/imports/startup/client/logger';
|
||||||
import { styles } from '../audio-modal/styles';
|
|
||||||
import browser from 'browser-detect';
|
import browser from 'browser-detect';
|
||||||
|
import { styles } from '../audio-modal/styles';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
kind: PropTypes.oneOf(['audioinput', 'audiooutput', 'videoinput']),
|
kind: PropTypes.oneOf(['audioinput', 'audiooutput', 'videoinput']),
|
||||||
@ -33,13 +33,20 @@ class DeviceSelector extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
const { kind } = this.props;
|
||||||
const handleEnumerateDevicesSuccess = (deviceInfos) => {
|
const handleEnumerateDevicesSuccess = (deviceInfos) => {
|
||||||
const devices = deviceInfos.filter(d => d.kind === this.props.kind);
|
const devices = deviceInfos.filter(d => d.kind === kind);
|
||||||
logger.info({ logCode: 'audiodeviceselector_component_enumeratedevices_success' }, `Success on enumerateDevices() for ${this.props.kind}: ${JSON.stringify(devices)}`);
|
logger.info({
|
||||||
|
logCode: 'audiodeviceselector_component_enumeratedevices_success',
|
||||||
|
extraInfo: {
|
||||||
|
deviceKind: kind,
|
||||||
|
devices,
|
||||||
|
},
|
||||||
|
}, 'Success on enumerateDevices() for audio');
|
||||||
this.setState({
|
this.setState({
|
||||||
devices,
|
devices,
|
||||||
options: devices.map((d, i) => ({
|
options: devices.map((d, i) => ({
|
||||||
label: d.label || `${this.props.kind} - ${i}`,
|
label: d.label || `${kind} - ${i}`,
|
||||||
value: d.deviceId,
|
value: d.deviceId,
|
||||||
key: _.uniqueId('device-option-'),
|
key: _.uniqueId('device-option-'),
|
||||||
})),
|
})),
|
||||||
@ -50,15 +57,20 @@ class DeviceSelector extends Component {
|
|||||||
.enumerateDevices()
|
.enumerateDevices()
|
||||||
.then(handleEnumerateDevicesSuccess)
|
.then(handleEnumerateDevicesSuccess)
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
logger.error({ logCode: 'audiodeviceselector_component_enumeratedevices_error' }, `Error on enumerateDevices(): ${JSON.stringify(err)}`);
|
logger.error({
|
||||||
|
logCode: 'audiodeviceselector_component_enumeratedevices_error',
|
||||||
|
extraInfo: {
|
||||||
|
deviceKind: kind,
|
||||||
|
},
|
||||||
|
}, 'Error on enumerateDevices(): ');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSelectChange(event) {
|
handleSelectChange(event) {
|
||||||
const { value } = event.target;
|
const { value } = event.target;
|
||||||
const { onChange } = this.props;
|
const { onChange, devices } = this.props;
|
||||||
this.setState({ value }, () => {
|
this.setState({ value }, () => {
|
||||||
const selectedDevice = this.state.devices.find(d => d.deviceId === value);
|
const selectedDevice = devices.find(d => d.deviceId === value);
|
||||||
onChange(selectedDevice.deviceId, selectedDevice, event);
|
onChange(selectedDevice.deviceId, selectedDevice, event);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -79,20 +91,19 @@ class DeviceSelector extends Component {
|
|||||||
className={cx(styles.select, className)}
|
className={cx(styles.select, className)}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
options.length ?
|
options.length
|
||||||
options.map(option => (
|
? options.map(option => (
|
||||||
<option
|
<option
|
||||||
key={option.key}
|
key={option.key}
|
||||||
value={option.value}
|
value={option.value}
|
||||||
>
|
>
|
||||||
{option.label}
|
{option.label}
|
||||||
</option>
|
</option>
|
||||||
)) :
|
))
|
||||||
(
|
: (
|
||||||
(kind == 'audiooutput' && browser().name == 'safari') ?
|
(kind == 'audiooutput' && browser().name == 'safari')
|
||||||
<option value="not-found">Default</option>
|
? <option value="not-found">Default</option>
|
||||||
:
|
: <option value="not-found">{`no ${kind} found`}</option>
|
||||||
<option value="not-found">{`no ${kind} found`}</option>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
|
@ -157,7 +157,10 @@ class Pad extends PureComponent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.recognition.onerror = (event) => {
|
this.recognition.onerror = (event) => {
|
||||||
logger.error({ logCode: 'captions_recognition' }, event.error);
|
logger.error({
|
||||||
|
logCode: 'captions_recognition',
|
||||||
|
extraInfo: { error: event.error },
|
||||||
|
}, 'Captions pad error on recognition');
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,12 +135,22 @@ class VideoPlayer extends Component {
|
|||||||
|
|
||||||
if (data.rate !== this.player.getPlaybackRate()) {
|
if (data.rate !== this.player.getPlaybackRate()) {
|
||||||
this.player.setPlaybackRate(data.rate);
|
this.player.setPlaybackRate(data.rate);
|
||||||
logger.debug({ logCode: 'external_video_client_update_rate' }, 'Change external video playback rate to:', data.rate);
|
logger.debug({
|
||||||
|
logCode: 'external_video_client_update_rate',
|
||||||
|
extraInfo: {
|
||||||
|
newRate: data.rate,
|
||||||
|
},
|
||||||
|
}, 'Change external video playback rate.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.abs(this.player.getCurrentTime() - data.time) > SYNC_INTERVAL_SECONDS) {
|
if (Math.abs(this.player.getCurrentTime() - data.time) > SYNC_INTERVAL_SECONDS) {
|
||||||
this.player.seekTo(data.time, true);
|
this.player.seekTo(data.time, true);
|
||||||
logger.debug({ logCode: 'external_video_client_update_seek' }, 'Seek external video to:', data.time);
|
logger.debug({
|
||||||
|
logCode: 'external_video_client_update_seek',
|
||||||
|
extraInfo: {
|
||||||
|
time: data.time,
|
||||||
|
},
|
||||||
|
}, 'Seek external video to:');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.playerState !== data.state) {
|
if (this.playerState !== data.state) {
|
||||||
|
@ -66,7 +66,11 @@ class JoinHandler extends Component {
|
|||||||
location: window.location.href,
|
location: window.location.href,
|
||||||
};
|
};
|
||||||
|
|
||||||
logger.info({ logCode: 'joinhandler_component_clientinfo' }, clientInfo);
|
logger.info({
|
||||||
|
logCode: 'joinhandler_component_clientinfo',
|
||||||
|
extraInfo: { clientInfo },
|
||||||
|
},
|
||||||
|
'Log informatin about the client');
|
||||||
};
|
};
|
||||||
|
|
||||||
const setAuth = (resp) => {
|
const setAuth = (resp) => {
|
||||||
@ -135,11 +139,22 @@ class JoinHandler extends Component {
|
|||||||
Session.set('openPanel', '');
|
Session.set('openPanel', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info({ logCode: 'joinhandler_component_joinroutehandler_success' }, `User successfully went through main.joinRouteHandler with [${JSON.stringify(response)}].`);
|
logger.info({
|
||||||
|
logCode: 'joinhandler_component_joinroutehandler_success',
|
||||||
|
extraInfo: {
|
||||||
|
response,
|
||||||
|
},
|
||||||
|
}, 'User successfully went through main.joinRouteHandler');
|
||||||
} else {
|
} else {
|
||||||
const e = new Error(response.message);
|
const e = new Error(response.message);
|
||||||
if (!Session.get('codeError')) Session.set('errorMessageDescription', response.message);
|
if (!Session.get('codeError')) Session.set('errorMessageDescription', response.message);
|
||||||
logger.error({ logCode: 'joinhandler_component_joinroutehandler_error' }, `User faced [${e}] on main.joinRouteHandler. Error was:`, JSON.stringify(response));
|
logger.error({
|
||||||
|
logCode: 'joinhandler_component_joinroutehandler_error',
|
||||||
|
extraInfo: {
|
||||||
|
response,
|
||||||
|
error: e,
|
||||||
|
},
|
||||||
|
}, 'User faced an error on main.joinRouteHandler.');
|
||||||
}
|
}
|
||||||
this.changeToJoin(true);
|
this.changeToJoin(true);
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ class MeetingEnded extends React.PureComponent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// client logger
|
// client logger
|
||||||
logger.info({ feedback: message, logCode: 'feedback' }, 'Feedback');
|
logger.info({ logCode: 'feedback_functionality', extraInfo: { feedback: message } }, 'Feedback component');
|
||||||
|
|
||||||
const FEEDBACK_WAIT_TIME = 500;
|
const FEEDBACK_WAIT_TIME = 500;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@ -164,7 +164,7 @@ class MeetingEnded extends React.PureComponent {
|
|||||||
|
|
||||||
const noRating = selected <= 0;
|
const noRating = selected <= 0;
|
||||||
|
|
||||||
logger.info({ endedCode: code, logCode: 'meeting_ended_code' }, code);
|
logger.info({ logCode: 'meeting_ended_code', extraInfo: { endedCode: code } }, 'Meeting ended component');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.parent}>
|
<div className={styles.parent}>
|
||||||
|
@ -294,7 +294,10 @@ class PresentationUploader extends Component {
|
|||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
notify(intl.formatMessage(intlMessages.genericError), 'error');
|
notify(intl.formatMessage(intlMessages.genericError), 'error');
|
||||||
logger.error({ logCode: 'presentationuploader_component_save_error' }, error);
|
logger.error({
|
||||||
|
logCode: 'presentationuploader_component_save_error',
|
||||||
|
extraInfo: { error },
|
||||||
|
}, 'Presentation uploader catch error on confirm');
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
disableActions: false,
|
disableActions: false,
|
||||||
|
@ -43,7 +43,10 @@ export default withTracker(() => {
|
|||||||
}
|
}
|
||||||
const subscriptionErrorHandler = {
|
const subscriptionErrorHandler = {
|
||||||
onError: (error) => {
|
onError: (error) => {
|
||||||
logger.error({ logCode: 'startup_client_subscription_error' }, error);
|
logger.error({
|
||||||
|
logCode: 'startup_client_subscription_error',
|
||||||
|
extraInfo: { error },
|
||||||
|
}, 'Error while subscribing to collections');
|
||||||
Session.set('codeError', error.error);
|
Session.set('codeError', error.error);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -220,7 +220,13 @@ class VideoPreview extends Component {
|
|||||||
if (!this._isMounted) return;
|
if (!this._isMounted) return;
|
||||||
|
|
||||||
// webcam might no longer exist or be available
|
// webcam might no longer exist or be available
|
||||||
logger.debug(`Error with profile: ${CAMERA_PROFILES[currNum].name}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_check_webcam',
|
||||||
|
extraInfo: {
|
||||||
|
camProfile: CAMERA_PROFILES[currNum],
|
||||||
|
currNum,
|
||||||
|
},
|
||||||
|
}, 'Error with camera profile');
|
||||||
|
|
||||||
this.handleGUMError(error);
|
this.handleGUMError(error);
|
||||||
|
|
||||||
@ -234,13 +240,27 @@ class VideoPreview extends Component {
|
|||||||
this.doGUM(deviceId, CAMERA_PROFILES[currNum]).then((stream) => {
|
this.doGUM(deviceId, CAMERA_PROFILES[currNum]).then((stream) => {
|
||||||
if (!this._isMounted) return;
|
if (!this._isMounted) return;
|
||||||
|
|
||||||
logger.debug(`Display preview came back for profile: ${CAMERA_PROFILES[currNum].name}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_next_profile',
|
||||||
|
extraInfo: {
|
||||||
|
camProfile: CAMERA_PROFILES[currNum],
|
||||||
|
currNum,
|
||||||
|
},
|
||||||
|
}, 'Display preview came back');
|
||||||
|
|
||||||
this.video.srcObject = stream;
|
this.video.srcObject = stream;
|
||||||
this.deviceStream = stream;
|
this.deviceStream = stream;
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
if (!this._isMounted) return;
|
if (!this._isMounted) return;
|
||||||
|
|
||||||
logger.debug(`Error with fetching profile {${CAMERA_PROFILES[currNum].name}} skipping to next profile. Error is {${error.name}}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_next_profile',
|
||||||
|
extraInfo: {
|
||||||
|
camProfile: CAMERA_PROFILES[currNum],
|
||||||
|
currNum,
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}, 'Error with fetching profile, skipping to next');
|
||||||
currNum++;
|
currNum++;
|
||||||
nextProfile();
|
nextProfile();
|
||||||
});
|
});
|
||||||
@ -260,10 +280,22 @@ class VideoPreview extends Component {
|
|||||||
if (this.video.videoWidth !== previousWidth || this.video.videoHeight !== previousHeight) {
|
if (this.video.videoWidth !== previousWidth || this.video.videoHeight !== previousHeight) {
|
||||||
previousWidth = this.video.videoWidth;
|
previousWidth = this.video.videoWidth;
|
||||||
previousHeight = this.video.videoHeight;
|
previousHeight = this.video.videoHeight;
|
||||||
logger.debug(`Found profile ${CAMERA_PROFILES[currNum].name}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_found_profile',
|
||||||
|
extraInfo: {
|
||||||
|
camProfile: CAMERA_PROFILES[currNum],
|
||||||
|
currNum,
|
||||||
|
},
|
||||||
|
}, 'Found profile');
|
||||||
availableProfiles.push(CAMERA_PROFILES[currNum]);
|
availableProfiles.push(CAMERA_PROFILES[currNum]);
|
||||||
} else {
|
} else {
|
||||||
logger.debug(`Not including profile ${CAMERA_PROFILES[currNum].name}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_not_including_profile',
|
||||||
|
extraInfo: {
|
||||||
|
camProfile: CAMERA_PROFILES[currNum],
|
||||||
|
currNum,
|
||||||
|
},
|
||||||
|
}, 'Not including profile');
|
||||||
}
|
}
|
||||||
|
|
||||||
currNum++;
|
currNum++;
|
||||||
@ -276,7 +308,12 @@ class VideoPreview extends Component {
|
|||||||
if (availableProfiles.length > 0) {
|
if (availableProfiles.length > 0) {
|
||||||
const defaultProfile = availableProfiles.find(profile => profile.default)
|
const defaultProfile = availableProfiles.find(profile => profile.default)
|
||||||
|| availableProfiles[0];
|
|| availableProfiles[0];
|
||||||
logger.debug(`Found default profile: ${JSON.stringify(defaultProfile)}`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_found_default_profile',
|
||||||
|
extraInfo: {
|
||||||
|
defaultProfile,
|
||||||
|
},
|
||||||
|
}, 'Found default profile');
|
||||||
|
|
||||||
this.displayPreview(deviceId, defaultProfile);
|
this.displayPreview(deviceId, defaultProfile);
|
||||||
}
|
}
|
||||||
@ -321,8 +358,12 @@ class VideoPreview extends Component {
|
|||||||
this.video.srcObject = stream;
|
this.video.srcObject = stream;
|
||||||
this.deviceStream = stream;
|
this.deviceStream = stream;
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
logger.warning({ logCode: 'video_preview_error' }, `Error displaying final selection. name: [${error.name}] message: [${error.message}]`);
|
logger.warn({
|
||||||
// logger.debug(error);
|
logCode: 'video_preview_do_gum_preview_error',
|
||||||
|
extraInfo: {
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}, 'Error displaying final selection.');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +394,14 @@ class VideoPreview extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.debug(`Enumerate devices came back. There are ${devices.length} devices and ${webcams.length} are video inputs`);
|
logger.debug({
|
||||||
|
logCode: 'video_preview_enumerate_devices',
|
||||||
|
extraInfo: {
|
||||||
|
devices,
|
||||||
|
webcams,
|
||||||
|
},
|
||||||
|
}, `Enumerate devices came back. There are ${devices.length} devices and ${webcams.length} are video inputs`);
|
||||||
|
|
||||||
|
|
||||||
if (initialDeviceId) {
|
if (initialDeviceId) {
|
||||||
this.setState({
|
this.setState({
|
||||||
@ -364,13 +412,23 @@ class VideoPreview extends Component {
|
|||||||
}
|
}
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
// CHANGE THIS TO SOMETHING USEFUL
|
// CHANGE THIS TO SOMETHING USEFUL
|
||||||
logger.warning(`Error enumerating devices. name: [${error.name}] message: [${error.message}]`);
|
logger.warn({
|
||||||
|
logCode: 'video_preview_enumerate_error',
|
||||||
|
extraInfo: {
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}, 'Error enumerating devices');
|
||||||
this.handleGUMError(error);
|
this.handleGUMError(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// CHANGE THIS TO SOMETHING USEFUL
|
// CHANGE THIS TO SOMETHING USEFUL
|
||||||
logger.warning(`Error grabbing initial video stream. name: [${error.name}] message: [${error.message}]`);
|
logger.warn({
|
||||||
|
logCode: 'video_preview_grabbing_error',
|
||||||
|
extraInfo: {
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}, 'Error grabbing initial video stream');
|
||||||
this.handleGUMError(error);
|
this.handleGUMError(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,7 +281,10 @@ class VideoProvider extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onWsClose() {
|
onWsClose() {
|
||||||
this.logger('debug', '------ Websocket connection closed.', 'video_provider_onwsclose', { topic: 'ws' });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_onwsclose',
|
||||||
|
extraInfo: { topic: 'ws' },
|
||||||
|
}, '------ Websocket connection closed.');
|
||||||
|
|
||||||
clearInterval(this.pingInterval);
|
clearInterval(this.pingInterval);
|
||||||
|
|
||||||
@ -293,7 +296,10 @@ class VideoProvider extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onWsOpen() {
|
onWsOpen() {
|
||||||
this.logger('debug', '------ Websocket connection opened.', 'video_provider_onwsopen', { topic: 'ws' });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_onwsopen',
|
||||||
|
extraInfo: { topic: 'ws' },
|
||||||
|
}, '------ Websocket connection opened.');
|
||||||
|
|
||||||
// -- Resend queued messages that happened when socket was not connected
|
// -- Resend queued messages that happened when socket was not connected
|
||||||
while (this.wsQueue.length > 0) {
|
while (this.wsQueue.length > 0) {
|
||||||
@ -333,14 +339,6 @@ class VideoProvider extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger(type, message, logCode, options = {}) {
|
|
||||||
const { userId, userName } = this.props;
|
|
||||||
const topic = options.topic || 'video';
|
|
||||||
logger[type](`${JSON.stringify(Object.assign(options, {
|
|
||||||
userId, userName, topic, logCode,
|
|
||||||
}))}, [${topic}] ${message}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
_sendPauseStream(id, role, state) {
|
_sendPauseStream(id, role, state) {
|
||||||
this.sendMessage({
|
this.sendMessage({
|
||||||
cameraId: id,
|
cameraId: id,
|
||||||
@ -353,10 +351,15 @@ class VideoProvider extends Component {
|
|||||||
|
|
||||||
pauseViewers() {
|
pauseViewers() {
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
this.logger('debug', 'Calling pause in viewer streams', 'video_provider_pause_viewers');
|
logger.debug({
|
||||||
|
logCode: 'video_provider_pause_viewers',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, 'Calling pause in viewer streams');
|
||||||
|
|
||||||
Object.keys(this.webRtcPeers).forEach((id) => {
|
Object.keys(this.webRtcPeers).forEach((id) => {
|
||||||
if (userId !== id && this.webRtcPeers[id].started) {
|
if (userId !== id && this.webRtcPeers[id] && this.webRtcPeers[id].started) {
|
||||||
this._sendPauseStream(id, 'viewer', true);
|
this._sendPauseStream(id, 'viewer', true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -364,10 +367,15 @@ class VideoProvider extends Component {
|
|||||||
|
|
||||||
unpauseViewers() {
|
unpauseViewers() {
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
this.logger('debug', 'Calling un-pause in viewer streams', 'video_provider_unpause_viewers');
|
logger.debug({
|
||||||
|
logCode: 'video_provider_unpause_viewers',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, 'Calling un-pause in viewer streams');
|
||||||
|
|
||||||
Object.keys(this.webRtcPeers).forEach((id) => {
|
Object.keys(this.webRtcPeers).forEach((id) => {
|
||||||
if (id !== userId && this.webRtcPeers[id].started) {
|
if (id !== userId && this.webRtcPeers[id] && this.webRtcPeers[id].started) {
|
||||||
this._sendPauseStream(id, 'viewer', false);
|
this._sendPauseStream(id, 'viewer', false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -387,7 +395,14 @@ class VideoProvider extends Component {
|
|||||||
const jsonMessage = JSON.stringify(message);
|
const jsonMessage = JSON.stringify(message);
|
||||||
ws.send(jsonMessage, (error) => {
|
ws.send(jsonMessage, (error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
this.logger('error', `client: Websocket error '${error}' on message '${message.id}'`, 'video_provider_ws_error', { topic: 'ws' });
|
logger.error({
|
||||||
|
logCode: 'video_provider_ws_error',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ws',
|
||||||
|
error,
|
||||||
|
message,
|
||||||
|
},
|
||||||
|
}, 'client: Websocket error');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (message.id !== 'stop') {
|
} else if (message.id !== 'stop') {
|
||||||
@ -404,13 +419,26 @@ class VideoProvider extends Component {
|
|||||||
const id = message.cameraId;
|
const id = message.cameraId;
|
||||||
const peer = this.webRtcPeers[id];
|
const peer = this.webRtcPeers[id];
|
||||||
|
|
||||||
this.logger('debug', 'SDP answer received from server. Processing ...', 'video_provider_sdp_received',
|
logger.debug({
|
||||||
{ cameraId: id, sdpAnswer: message.sdpAnswer });
|
logCode: 'video_provider_sdp_received',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
sdpAnswer: message.sdpAnswer,
|
||||||
|
},
|
||||||
|
}, 'SDP answer received from server. Processing ...');
|
||||||
|
|
||||||
if (peer) {
|
if (peer) {
|
||||||
peer.processAnswer(message.sdpAnswer, (error) => {
|
peer.processAnswer(message.sdpAnswer, (error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
return this.logger('debug', JSON.stringify(error), 'video_provider_peer_process_answer', { cameraId: id });
|
return logger.debug({
|
||||||
|
logCode: 'video_provider_peer_process_answer',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
error,
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, 'Processing answer...');
|
||||||
}
|
}
|
||||||
|
|
||||||
peer.didSDPAnswered = true;
|
peer.didSDPAnswered = true;
|
||||||
@ -418,20 +446,38 @@ class VideoProvider extends Component {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.logger('warn', '[startResponse] Message arrived after the peer was already thrown out, discarding it...', 'video_provider_no_peer');
|
logger.warn({
|
||||||
|
logCode: 'video_provider_no_peer',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, '[startResponse] Message arrived after the peer was already thrown out, discarding it...');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleIceCandidate(message) {
|
handleIceCandidate(message) {
|
||||||
const webRtcPeer = this.webRtcPeers[message.cameraId];
|
const webRtcPeer = this.webRtcPeers[message.cameraId];
|
||||||
|
|
||||||
this.logger('debug', 'Received remote ice candidate', 'video_provider_ice_candidate_received', { topic: 'ice', candidate: message.candidate });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_ice_candidate_received',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
candidate: message.candidate,
|
||||||
|
},
|
||||||
|
}, 'Received remote ice candidate');
|
||||||
|
|
||||||
if (webRtcPeer) {
|
if (webRtcPeer) {
|
||||||
if (webRtcPeer.didSDPAnswered) {
|
if (webRtcPeer.didSDPAnswered) {
|
||||||
webRtcPeer.addIceCandidate(message.candidate, (err) => {
|
webRtcPeer.addIceCandidate(message.candidate, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
return this.logger('error', `Error adding candidate: ${err}`, 'video_provider_ice_candidate_cant_add', { cameraId: message.cameraId });
|
return logger.error({
|
||||||
|
logCode: 'video_provider_ice_candidate_cant_add',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
error: err,
|
||||||
|
cameraId: message.cameraId,
|
||||||
|
},
|
||||||
|
}, 'Error adding candidate');
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@ -442,12 +488,25 @@ class VideoProvider extends Component {
|
|||||||
webRtcPeer.iceQueue.push(message.candidate);
|
webRtcPeer.iceQueue.push(message.candidate);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.logger('warn', ' [iceCandidate] Message arrived after the peer was already thrown out, discarding it...', 'video_provider_ice_candidate_arrived_late', { cameraId: message.cameraId });
|
logger.warn({
|
||||||
|
logCode: 'video_provider_ice_candidate_arrived_late',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
cameraId: message.cameraId,
|
||||||
|
},
|
||||||
|
}, 'Message arrived after the peer was already thrown out, discarding it...');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stopWebRTCPeer(id, restarting = false) {
|
stopWebRTCPeer(id, restarting = false) {
|
||||||
this.logger('info', 'Stopping webcam', 'video_provider_stopping_webcam', { cameraId: id });
|
logger.info({
|
||||||
|
logCode: 'video_provider_stopping_webcam',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, 'Stopping webcam');
|
||||||
|
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
const shareWebcam = id === userId;
|
const shareWebcam = id === userId;
|
||||||
|
|
||||||
@ -485,7 +544,13 @@ class VideoProvider extends Component {
|
|||||||
destroyWebRTCPeer(id) {
|
destroyWebRTCPeer(id) {
|
||||||
const webRtcPeer = this.webRtcPeers[id];
|
const webRtcPeer = this.webRtcPeers[id];
|
||||||
if (webRtcPeer) {
|
if (webRtcPeer) {
|
||||||
this.logger('info', 'Stopping WebRTC peer', 'video_provider_destroy_webrtc_peers', { cameraId: id });
|
logger.info({
|
||||||
|
logCode: 'video_provider_destroy_webrtc_peers',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, 'Stopping WebRTC peer');
|
||||||
if (typeof webRtcPeer.dispose === 'function') {
|
if (typeof webRtcPeer.dispose === 'function') {
|
||||||
webRtcPeer.dispose();
|
webRtcPeer.dispose();
|
||||||
}
|
}
|
||||||
@ -495,7 +560,13 @@ class VideoProvider extends Component {
|
|||||||
updateCurrentWebcamsConnection(this.webRtcPeers);
|
updateCurrentWebcamsConnection(this.webRtcPeers);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.logger('warn', 'No WebRTC peer to stop (not an error)', 'video_provider_no_peer_to_destroy', { cameraId: id });
|
logger.warn({
|
||||||
|
logCode: 'video_provider_no_peer_to_destroy',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, 'No WebRTC peer to stop (not an error)');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,7 +584,13 @@ class VideoProvider extends Component {
|
|||||||
try {
|
try {
|
||||||
iceServers = await fetchWebRTCMappedStunTurnServers(sessionToken);
|
iceServers = await fetchWebRTCMappedStunTurnServers(sessionToken);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger('error', 'Video provider failed to fetch ice servers, using default', 'video_provider_missing_ice_servers');
|
logger.error({
|
||||||
|
logCode: 'video_provider_missing_ice_servers',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}, 'Video provider failed to fetch ice servers, using default');
|
||||||
} finally {
|
} finally {
|
||||||
const profileId = Session.get('WebcamProfileId') || '';
|
const profileId = Session.get('WebcamProfileId') || '';
|
||||||
const cameraProfile = CAMERA_PROFILES.find(profile => profile.id === profileId)
|
const cameraProfile = CAMERA_PROFILES.find(profile => profile.id === profileId)
|
||||||
@ -563,7 +640,14 @@ class VideoProvider extends Component {
|
|||||||
return this._webRTCOnError(errorGenOffer, id, shareWebcam);
|
return this._webRTCOnError(errorGenOffer, id, shareWebcam);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger('debug', `Invoking SDP offer callback function ${window.location.host}`, 'video_provider_sdp_offer_callback', { cameraId: id, offerSdp });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_sdp_offer_callback',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
offerSdp,
|
||||||
|
},
|
||||||
|
}, `Invoking SDP offer callback function ${window.location.host}`);
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
type: 'video',
|
type: 'video',
|
||||||
@ -596,7 +680,13 @@ class VideoProvider extends Component {
|
|||||||
const { intl, userId } = this.props;
|
const { intl, userId } = this.props;
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
this.logger('error', `Camera share has not succeeded in ${CAMERA_SHARE_FAILED_WAIT_TIME}`, 'video_provider_cam_timeout', { cameraId: id });
|
logger.error({
|
||||||
|
logCode: 'video_provider_cam_timeout',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, `Camera share has not succeeded in ${CAMERA_SHARE_FAILED_WAIT_TIME}`);
|
||||||
|
|
||||||
if (userId === id) {
|
if (userId === id) {
|
||||||
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.mediaFlowTimeout));
|
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.mediaFlowTimeout));
|
||||||
@ -612,7 +702,14 @@ class VideoProvider extends Component {
|
|||||||
this.restartTimer[id] = Math
|
this.restartTimer[id] = Math
|
||||||
.min(2 * this.restartTimer[id], MAX_CAMERA_SHARE_FAILED_WAIT_TIME);
|
.min(2 * this.restartTimer[id], MAX_CAMERA_SHARE_FAILED_WAIT_TIME);
|
||||||
|
|
||||||
this.logger('info', `Reconnecting peer ${id} with timer`, 'video_provider_reconnecting_peer', this.restartTimer);
|
logger.info({
|
||||||
|
logCode: 'video_provider_reconnecting_peer',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
restartTimer: this.restartTimer,
|
||||||
|
peerId: id,
|
||||||
|
},
|
||||||
|
}, `Reconnecting peer ${id} with timer`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -625,7 +722,14 @@ class VideoProvider extends Component {
|
|||||||
peer.addIceCandidate(candidate, (err) => {
|
peer.addIceCandidate(candidate, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceCandidateError));
|
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceCandidateError));
|
||||||
return this.logger('error', `Error adding candidate: ${err}`, 'video_provider_cant_add_candidate', { cameraId });
|
return logger.error({
|
||||||
|
logCode: 'video_provider_cant_add_candidate',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
err,
|
||||||
|
cameraId,
|
||||||
|
},
|
||||||
|
}, 'Error adding candidate.');
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@ -643,13 +747,28 @@ class VideoProvider extends Component {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger('error', ' WebRTC peerObj create error', 'video_provider_webrtc_error_before', { id, error });
|
logger.error({
|
||||||
|
logCode: 'video_provider_webrtc_error_before',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
error,
|
||||||
|
id,
|
||||||
|
},
|
||||||
|
}, 'WebRTC peerObj create error');
|
||||||
|
|
||||||
const errorMessage = intlClientErrors[error.name]
|
const errorMessage = intlClientErrors[error.name]
|
||||||
|| intlSFUErrors[error] || intlClientErrors.permissionError;
|
|| intlSFUErrors[error] || intlClientErrors.permissionError;
|
||||||
VideoProvider.notifyError(intl.formatMessage(errorMessage));
|
VideoProvider.notifyError(intl.formatMessage(errorMessage));
|
||||||
this.stopWebRTCPeer(id);
|
this.stopWebRTCPeer(id);
|
||||||
|
|
||||||
this.logger('error', errorMessage, 'video_provider_webrtc_error_after', { cameraId: id, errorMessage });
|
logger.error({
|
||||||
|
logCode: 'video_provider_webrtc_error_after',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
errorMessage,
|
||||||
|
},
|
||||||
|
}, '_webRTCOnError');
|
||||||
}
|
}
|
||||||
|
|
||||||
_getOnIceCandidateCallback(id, shareWebcam) {
|
_getOnIceCandidateCallback(id, shareWebcam) {
|
||||||
@ -665,12 +784,25 @@ class VideoProvider extends Component {
|
|||||||
if (shouldSetReconnectionTimeout) {
|
if (shouldSetReconnectionTimeout) {
|
||||||
this.restartTimer[id] = this.restartTimer[id] || CAMERA_SHARE_FAILED_WAIT_TIME;
|
this.restartTimer[id] = this.restartTimer[id] || CAMERA_SHARE_FAILED_WAIT_TIME;
|
||||||
|
|
||||||
this.logger('debug', `Setting a camera connection restart in ${this.restartTimer[id]}`, 'video_provider_cam_restart', { cameraId: id });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_cam_restart',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
time: this.restartTimer[id],
|
||||||
|
},
|
||||||
|
}, `Setting a camera connection restart in ${this.restartTimer[id]}`);
|
||||||
this.restartTimeout[id] = setTimeout(this._getWebRTCStartTimeout(id, shareWebcam),
|
this.restartTimeout[id] = setTimeout(this._getWebRTCStartTimeout(id, shareWebcam),
|
||||||
this.restartTimer[id]);
|
this.restartTimer[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger('debug', 'Generated local ice candidate', 'video_provider_generated_local_ice', { topic: 'ice', candidate });
|
logger.debug({
|
||||||
|
logCode: 'video_provider_generated_local_ice',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
candidate,
|
||||||
|
},
|
||||||
|
}, 'Generated local ice candidate');
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
type: 'video',
|
type: 'video',
|
||||||
@ -693,7 +825,14 @@ class VideoProvider extends Component {
|
|||||||
// prevent the same error from being detected multiple times
|
// prevent the same error from being detected multiple times
|
||||||
peer.peerConnection.oniceconnectionstatechange = null;
|
peer.peerConnection.oniceconnectionstatechange = null;
|
||||||
|
|
||||||
this.logger('error', `ICE connection state id:${id}, connectionState:${connectionState}`, 'video_provider_ice_connection_failed_state');
|
logger.error({
|
||||||
|
logCode: 'video_provider_ice_connection_failed_state',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'ice',
|
||||||
|
id,
|
||||||
|
connectionState,
|
||||||
|
},
|
||||||
|
}, 'ICE connection state change');
|
||||||
|
|
||||||
this.stopWebRTCPeer(id);
|
this.stopWebRTCPeer(id);
|
||||||
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceConnectionStateError));
|
VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceConnectionStateError));
|
||||||
@ -705,7 +844,14 @@ class VideoProvider extends Component {
|
|||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
const video = this.videoTags[id];
|
const video = this.videoTags[id];
|
||||||
if (video == null) {
|
if (video == null) {
|
||||||
this.logger('warn', `Peer ${id} ${userId} has not been started yet`, 'video_provider_attach_video_stream');
|
logger.warn({
|
||||||
|
logCode: 'video_provider_attach_video_stream',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
id,
|
||||||
|
userId,
|
||||||
|
},
|
||||||
|
}, `Peer ${id} ${userId} has not been started yet`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -879,14 +1025,27 @@ class VideoProvider extends Component {
|
|||||||
|
|
||||||
callback(result);
|
callback(result);
|
||||||
}, (exception) => {
|
}, (exception) => {
|
||||||
this.logger('error', `customGetStats() Promise rejected: ${exception.message}`, 'video_provider_get_stats_exception');
|
logger.error({
|
||||||
|
logCode: 'video_provider_get_stats_exception',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
exception,
|
||||||
|
},
|
||||||
|
}, 'customGetStats() Promise rejected');
|
||||||
|
|
||||||
callback(null);
|
callback(null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
monitorTrackStart(peer, track, local, callback) {
|
monitorTrackStart(peer, track, local, callback) {
|
||||||
const that = this;
|
const that = this;
|
||||||
this.logger('info', 'Starting stats monitoring on', 'video_provider_monitor_track_start', { cameraId: track.id });
|
logger.info({
|
||||||
|
logCode: 'video_provider_monitor_track_start',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: track.id,
|
||||||
|
},
|
||||||
|
}, 'Starting stats monitoring.');
|
||||||
const getStatsInterval = 2000;
|
const getStatsInterval = 2000;
|
||||||
|
|
||||||
const callGetStats = () => {
|
const callGetStats = () => {
|
||||||
@ -911,7 +1070,12 @@ class VideoProvider extends Component {
|
|||||||
getStatsInterval,
|
getStatsInterval,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
this.logger('info', 'Already monitoring this track', 'video_provider_already_monitoring_track');
|
logger.info({
|
||||||
|
logCode: 'video_provider_already_monitoring_track',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, 'Already monitoring this track');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -919,9 +1083,21 @@ class VideoProvider extends Component {
|
|||||||
if (this.monitoredTracks[trackId]) {
|
if (this.monitoredTracks[trackId]) {
|
||||||
clearInterval(this.monitoredTracks[trackId]);
|
clearInterval(this.monitoredTracks[trackId]);
|
||||||
delete this.monitoredTracks[trackId];
|
delete this.monitoredTracks[trackId];
|
||||||
this.logger('debug', `Track ${trackId} removed`, 'video_provider_stop_monitoring');
|
logger.debug({
|
||||||
|
logCode: 'video_provider_stop_monitoring',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
trackId,
|
||||||
|
},
|
||||||
|
}, `Track ${trackId} removed`);
|
||||||
} else {
|
} else {
|
||||||
this.logger('debug', `Track ${trackId} is not monitored`, 'video_provider_already_stopped_monitoring');
|
logger.debug({
|
||||||
|
logCode: 'video_provider_already_stopped_monitoring',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
trackId,
|
||||||
|
},
|
||||||
|
}, `Track ${trackId} is not monitored`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,7 +1119,13 @@ class VideoProvider extends Component {
|
|||||||
handlePlayStop(message) {
|
handlePlayStop(message) {
|
||||||
const { cameraId } = message;
|
const { cameraId } = message;
|
||||||
|
|
||||||
this.logger('info', 'Handle play stop for camera', 'video_provider_handle_play_stop', { cameraId });
|
logger.info({
|
||||||
|
logCode: 'video_provider_handle_play_stop',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId,
|
||||||
|
},
|
||||||
|
}, 'Handle play stop for camera');
|
||||||
this.stopWebRTCPeer(cameraId);
|
this.stopWebRTCPeer(cameraId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -953,7 +1135,13 @@ class VideoProvider extends Component {
|
|||||||
|
|
||||||
if (peer) {
|
if (peer) {
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
this.logger('info', 'Handle play start for camera', 'video_provider_handle_play_start', { cameraId: id });
|
logger.info({
|
||||||
|
logCode: 'video_provider_handle_play_start',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, 'Handle play start for camera');
|
||||||
|
|
||||||
peer.started = true;
|
peer.started = true;
|
||||||
|
|
||||||
@ -971,7 +1159,13 @@ class VideoProvider extends Component {
|
|||||||
VideoService.joinedVideo();
|
VideoService.joinedVideo();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.logger('warn', '[playStart] Message arrived after the peer was already thrown out, discarding it...', 'video_provider_play_start_discarding');
|
logger.warn({
|
||||||
|
logCode: 'video_provider_play_start_discarding',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
cameraId: id,
|
||||||
|
},
|
||||||
|
}, '[playStart] Message arrived after the peer was already thrown out, discarding it...');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -979,9 +1173,17 @@ class VideoProvider extends Component {
|
|||||||
const { intl } = this.props;
|
const { intl } = this.props;
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
const { code, reason } = message;
|
const { code, reason } = message;
|
||||||
this.logger('error', 'Received error from SFU:', 'video_provider_sfu_error', {
|
logger.error({
|
||||||
code, reason, streamId: message.streamId, userId,
|
logCode: 'video_provider_sfu_error',
|
||||||
});
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
code,
|
||||||
|
reason,
|
||||||
|
streamId: message.streamId,
|
||||||
|
userId,
|
||||||
|
},
|
||||||
|
}, 'Received error from SFU');
|
||||||
|
|
||||||
if (message.streamId === userId) {
|
if (message.streamId === userId) {
|
||||||
this.unshareWebcam();
|
this.unshareWebcam();
|
||||||
VideoProvider.notifyError(intl.formatMessage(intlSFUErrors[code]
|
VideoProvider.notifyError(intl.formatMessage(intlSFUErrors[code]
|
||||||
@ -990,12 +1192,23 @@ class VideoProvider extends Component {
|
|||||||
this.stopWebRTCPeer(message.cameraId);
|
this.stopWebRTCPeer(message.cameraId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger('error', `Handle error ---------------------> ${message.message}`, 'video_provider_handle_sfu_error', { message });
|
logger.error({
|
||||||
|
logCode: 'video_provider_handle_sfu_error',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
message,
|
||||||
|
},
|
||||||
|
}, 'Handle error');
|
||||||
}
|
}
|
||||||
|
|
||||||
shareWebcam() {
|
shareWebcam() {
|
||||||
if (this.connectedToMediaServer()) {
|
if (this.connectedToMediaServer()) {
|
||||||
this.logger('info', 'Sharing webcam', 'video_provider_share_webcam');
|
logger.info({
|
||||||
|
logCode: 'video_provider_share_webcam',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, 'Sharing webcam');
|
||||||
this.sharedWebcam = true;
|
this.sharedWebcam = true;
|
||||||
VideoService.joiningVideo();
|
VideoService.joiningVideo();
|
||||||
}
|
}
|
||||||
@ -1003,7 +1216,12 @@ class VideoProvider extends Component {
|
|||||||
|
|
||||||
unshareWebcam() {
|
unshareWebcam() {
|
||||||
const { userId } = this.props;
|
const { userId } = this.props;
|
||||||
this.logger('info', 'Unsharing webcam', 'video_provider_unshare_webcam');
|
logger.info({
|
||||||
|
logCode: 'video_provider_unshare_webcam',
|
||||||
|
extraInfo: {
|
||||||
|
topic: 'video',
|
||||||
|
},
|
||||||
|
}, 'Unsharing webcam');
|
||||||
|
|
||||||
VideoService.sendUserUnshareWebcam(userId);
|
VideoService.sendUserUnshareWebcam(userId);
|
||||||
VideoService.exitedVideo();
|
VideoService.exitedVideo();
|
||||||
|
@ -53,10 +53,10 @@ class VideoListItem extends Component {
|
|||||||
if (p && (typeof Promise !== 'undefined') && (p instanceof Promise)) {
|
if (p && (typeof Promise !== 'undefined') && (p instanceof Promise)) {
|
||||||
// Catch exception when playing video
|
// Catch exception when playing video
|
||||||
p.catch((e) => {
|
p.catch((e) => {
|
||||||
logger.warn(
|
logger.warn({
|
||||||
{ logCode: 'videolistitem_component_play_error' },
|
logCode: 'videolistitem_component_play_error',
|
||||||
`Could not play video: ${JSON.stringify(e)}`,
|
extraInfo: { error: e },
|
||||||
);
|
}, 'Could not play video');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,8 @@ function handleAddedAnnotation({
|
|||||||
Annotations.update(fakeAnnotation._id, {
|
Annotations.update(fakeAnnotation._id, {
|
||||||
$set: {
|
$set: {
|
||||||
position: annotation.position,
|
position: annotation.position,
|
||||||
'annotationInfo.color': isEqual(fakePoints, lastPoints) || annotation.status === DRAW_END ?
|
'annotationInfo.color': isEqual(fakePoints, lastPoints) || annotation.status === DRAW_END
|
||||||
annotation.annotationInfo.color : fakeAnnotation.annotationInfo.color,
|
? annotation.annotationInfo.color : fakeAnnotation.annotationInfo.color,
|
||||||
},
|
},
|
||||||
$inc: { version: 1 }, // TODO: Remove all this version stuff
|
$inc: { version: 1 }, // TODO: Remove all this version stuff
|
||||||
});
|
});
|
||||||
@ -54,7 +54,10 @@ function handleAddedAnnotation({
|
|||||||
|
|
||||||
Annotations.upsert(query.selector, query.modifier, (err) => {
|
Annotations.upsert(query.selector, query.modifier, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
logger.error({ logCode: 'whiteboard_annotation_upsert_error' }, err);
|
logger.error({
|
||||||
|
logCode: 'whiteboard_annotation_upsert_error',
|
||||||
|
extraInfo: { error: err },
|
||||||
|
}, 'Error on adding an annotation');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,9 +120,9 @@ function increaseBrightness(realHex, percent) {
|
|||||||
const b = parseInt(hex.substr(4, 2), 16);
|
const b = parseInt(hex.substr(4, 2), 16);
|
||||||
|
|
||||||
/* eslint-disable no-bitwise, no-mixed-operators */
|
/* eslint-disable no-bitwise, no-mixed-operators */
|
||||||
return parseInt(((0 | (1 << 8) + r + ((256 - r) * percent) / 100).toString(16)).substr(1) +
|
return parseInt(((0 | (1 << 8) + r + ((256 - r) * percent) / 100).toString(16)).substr(1)
|
||||||
((0 | (1 << 8) + g + ((256 - g) * percent) / 100).toString(16)).substr(1) +
|
+ ((0 | (1 << 8) + g + ((256 - g) * percent) / 100).toString(16)).substr(1)
|
||||||
((0 | (1 << 8) + b + ((256 - b) * percent) / 100).toString(16)).substr(1), 16);
|
+ ((0 | (1 << 8) + b + ((256 - b) * percent) / 100).toString(16)).substr(1), 16);
|
||||||
/* eslint-enable no-bitwise, no-mixed-operators */
|
/* eslint-enable no-bitwise, no-mixed-operators */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,11 +147,10 @@ const proccessAnnotationsQueue = async () => {
|
|||||||
const annotations = annotationsQueue.splice(0, queueSize);
|
const annotations = annotationsQueue.splice(0, queueSize);
|
||||||
|
|
||||||
// console.log('annotationQueue.length', annotationsQueue, annotationsQueue.length);
|
// console.log('annotationQueue.length', annotationsQueue, annotationsQueue.length);
|
||||||
await makeCall('sendBulkAnnotations', annotations.filter(({ id }) => !discardedList.includes(id)))
|
await makeCall('sendBulkAnnotations', annotations.filter(({ id }) => !discardedList.includes(id)));
|
||||||
|
|
||||||
// ask tiago
|
// ask tiago
|
||||||
const delayPerc =
|
const delayPerc = Math.min(annotationsMaxDelayQueueSize, queueSize) / annotationsMaxDelayQueueSize;
|
||||||
Math.min(annotationsMaxDelayQueueSize, queueSize) / annotationsMaxDelayQueueSize;
|
|
||||||
const delayDelta = annotationsBufferTimeMax - annotationsBufferTimeMin;
|
const delayDelta = annotationsBufferTimeMax - annotationsBufferTimeMin;
|
||||||
const delayTime = annotationsBufferTimeMin + (delayDelta * delayPerc);
|
const delayTime = annotationsBufferTimeMin + (delayDelta * delayPerc);
|
||||||
setTimeout(proccessAnnotationsQueue, delayTime);
|
setTimeout(proccessAnnotationsQueue, delayTime);
|
||||||
|
@ -184,7 +184,13 @@ class AudioManager {
|
|||||||
clearTimeout(iceGatheringTimeout);
|
clearTimeout(iceGatheringTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.error({ logCode: 'audiomanager_listenonly_error' }, `Listen only error:${JSON.stringify(err)} on try ${retries}`);
|
logger.error({
|
||||||
|
logCode: 'audiomanager_listenonly_error',
|
||||||
|
extraInfo: {
|
||||||
|
error: err,
|
||||||
|
retries,
|
||||||
|
},
|
||||||
|
}, 'Listen only error');
|
||||||
throw {
|
throw {
|
||||||
type: 'MEDIA_ERROR',
|
type: 'MEDIA_ERROR',
|
||||||
message: this.messages.error.MEDIA_ERROR,
|
message: this.messages.error.MEDIA_ERROR,
|
||||||
@ -331,7 +337,13 @@ class AudioManager {
|
|||||||
const errorKey = this.messages.error[error] || this.messages.error.GENERIC_ERROR;
|
const errorKey = this.messages.error[error] || this.messages.error.GENERIC_ERROR;
|
||||||
const errorMsg = this.intl.formatMessage(errorKey, { 0: bridgeError });
|
const errorMsg = this.intl.formatMessage(errorKey, { 0: bridgeError });
|
||||||
this.error = !!error;
|
this.error = !!error;
|
||||||
logger.error({ logCode: 'audio_failure', error, cause: bridgeError }, `Audio Error ${JSON.stringify(errorMsg)}`);
|
logger.error({
|
||||||
|
logCode: 'audio_failure',
|
||||||
|
extraInfo: {
|
||||||
|
error,
|
||||||
|
cause: bridgeError,
|
||||||
|
},
|
||||||
|
}, 'Audio Error');
|
||||||
if (silenceNotifications !== true) {
|
if (silenceNotifications !== true) {
|
||||||
this.notify(errorMsg, true);
|
this.notify(errorMsg, true);
|
||||||
this.exitAudio();
|
this.exitAudio();
|
||||||
@ -362,7 +374,10 @@ class AudioManager {
|
|||||||
audio.src = 'resources/sounds/silence.mp3';
|
audio.src = 'resources/sounds/silence.mp3';
|
||||||
|
|
||||||
audio.play().catch((e) => {
|
audio.play().catch((e) => {
|
||||||
logger.warn({ logCode: 'audiomanager_error_test_audio' }, 'Error on playing test audio:', e);
|
logger.warn({
|
||||||
|
logCode: 'audiomanager_error_test_audio',
|
||||||
|
extraInfo: { error: e },
|
||||||
|
}, 'Error on playing test audio');
|
||||||
});
|
});
|
||||||
|
|
||||||
return dest.stream;
|
return dest.stream;
|
||||||
|
@ -135,6 +135,7 @@ class Auth {
|
|||||||
fullname: this.fullname,
|
fullname: this.fullname,
|
||||||
confname: this.confname,
|
confname: this.confname,
|
||||||
externUserID: this.externUserID,
|
externUserID: this.externUserID,
|
||||||
|
uniqueClientSession: this.uniqueClientSession,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,6 +169,7 @@ class Auth {
|
|||||||
this.fullname = null;
|
this.fullname = null;
|
||||||
this.externUserID = null;
|
this.externUserID = null;
|
||||||
this.confname = null;
|
this.confname = null;
|
||||||
|
this.uniqueClientSession = null;
|
||||||
return Promise.resolve(...args);
|
return Promise.resolve(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +195,10 @@ class Auth {
|
|||||||
|
|
||||||
this.loggedIn = false;
|
this.loggedIn = false;
|
||||||
return this.validateAuthToken()
|
return this.validateAuthToken()
|
||||||
.then(() => { this.loggedIn = true; });
|
.then(() => {
|
||||||
|
this.loggedIn = true;
|
||||||
|
this.uniqueClientSession = Math.random().toString(36).substring(6);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
validateAuthToken() {
|
validateAuthToken() {
|
||||||
|
@ -150,7 +150,12 @@ export const startBandwidthMonitoring = () => {
|
|||||||
|
|
||||||
if (lastEffectiveConnectionType
|
if (lastEffectiveConnectionType
|
||||||
&& lastEffectiveConnectionType.effectiveConnectionType !== effectiveType) {
|
&& lastEffectiveConnectionType.effectiveConnectionType !== effectiveType) {
|
||||||
logger.info({ logCode: 'user_connection_instability' }, `User ${Auth.userID} effective connection is now ${effectiveType}`);
|
logger.info({
|
||||||
|
logCode: 'user_connection_instability',
|
||||||
|
extraInfo: {
|
||||||
|
effectiveType,
|
||||||
|
},
|
||||||
|
}, `User ${Auth.userID} effective connection is now ${effectiveType}`);
|
||||||
makeCall('setUserEffectiveConnectionType', effectiveType);
|
makeCall('setUserEffectiveConnectionType', effectiveType);
|
||||||
}
|
}
|
||||||
}, 5000);
|
}, 5000);
|
||||||
|
Loading…
Reference in New Issue
Block a user