@webex/plugin-meetings 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -6
- package/dist/constants.js +12 -10
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/index.js +6 -2
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +54 -19
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/selfUtils.js +18 -5
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +32 -26
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +18 -39
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +24 -26
- package/dist/meeting/util.js.map +1 -1
- package/dist/metrics/index.js +3 -2
- package/dist/metrics/index.js.map +1 -1
- package/package.json +6 -6
- package/src/constants.js +9 -7
- package/src/locus-info/index.js +4 -4
- package/src/locus-info/infoUtils.js +30 -22
- package/src/locus-info/selfUtils.js +10 -1
- package/src/meeting/in-meeting-actions.js +25 -16
- package/src/meeting/index.js +25 -48
- package/src/meeting/util.js +18 -29
- package/src/metrics/index.js +3 -2
- package/test/unit/spec/locus-info/index.js +87 -1
- package/test/unit/spec/locus-info/infoUtils.js +122 -0
- package/test/unit/spec/locus-info/selfUtils.js +43 -0
- package/test/unit/spec/meeting/in-meeting-actions.js +55 -0
- package/test/unit/spec/meeting/index.js +120 -0
- package/test/unit/spec/meeting/utils.js +187 -0
- package/test/unit/spec/metrics/index.js +2 -2
package/dist/meeting/util.js
CHANGED
|
@@ -451,42 +451,40 @@ MeetingUtil.getPolicyFromLocusInfo = function (locusInfo) {
|
|
|
451
451
|
return locusInfo && locusInfo.parsedLocus && locusInfo.parsedLocus.info && locusInfo.parsedLocus.info && locusInfo.parsedLocus.info.policy;
|
|
452
452
|
};
|
|
453
453
|
|
|
454
|
-
MeetingUtil.
|
|
455
|
-
|
|
456
|
-
return true;
|
|
457
|
-
}
|
|
454
|
+
MeetingUtil.getUserDisplayHintsFromLocusInfo = function (locusInfo) {
|
|
455
|
+
var _locusInfo$parsedLocu7, _locusInfo$parsedLocu8;
|
|
458
456
|
|
|
459
|
-
return
|
|
457
|
+
return (locusInfo === null || locusInfo === void 0 ? void 0 : (_locusInfo$parsedLocu7 = locusInfo.parsedLocus) === null || _locusInfo$parsedLocu7 === void 0 ? void 0 : (_locusInfo$parsedLocu8 = _locusInfo$parsedLocu7.info) === null || _locusInfo$parsedLocu8 === void 0 ? void 0 : _locusInfo$parsedLocu8.userDisplayHints) || [];
|
|
460
458
|
};
|
|
461
459
|
|
|
462
|
-
MeetingUtil.
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
}
|
|
460
|
+
MeetingUtil.canUserLock = function (displayHints) {
|
|
461
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(_constants.DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);
|
|
462
|
+
};
|
|
466
463
|
|
|
467
|
-
|
|
464
|
+
MeetingUtil.canUserUnlock = function (displayHints) {
|
|
465
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(_constants.DISPLAY_HINTS.LOCK_STATUS_LOCKED);
|
|
468
466
|
};
|
|
469
467
|
|
|
470
|
-
MeetingUtil.canUserRecord = function (
|
|
471
|
-
return
|
|
468
|
+
MeetingUtil.canUserRecord = function (displayHints) {
|
|
469
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_START);
|
|
472
470
|
};
|
|
473
471
|
|
|
474
|
-
MeetingUtil.canUserPause = function (
|
|
475
|
-
return
|
|
472
|
+
MeetingUtil.canUserPause = function (displayHints) {
|
|
473
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
|
|
476
474
|
};
|
|
477
475
|
|
|
478
|
-
MeetingUtil.canUserResume = function (
|
|
479
|
-
return
|
|
476
|
+
MeetingUtil.canUserResume = function (displayHints) {
|
|
477
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
|
|
480
478
|
};
|
|
481
479
|
|
|
482
|
-
MeetingUtil.canUserStop = function (
|
|
483
|
-
return
|
|
480
|
+
MeetingUtil.canUserStop = function (displayHints) {
|
|
481
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_STOP);
|
|
484
482
|
};
|
|
485
483
|
|
|
486
484
|
MeetingUtil.startRecording = function (request, locusUrl, locusInfo) {
|
|
487
|
-
var
|
|
485
|
+
var displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
|
|
488
486
|
|
|
489
|
-
if (
|
|
487
|
+
if (MeetingUtil.canUserRecord(displayHints)) {
|
|
490
488
|
return request.recordMeeting({
|
|
491
489
|
locusUrl: locusUrl,
|
|
492
490
|
recording: true,
|
|
@@ -498,9 +496,9 @@ MeetingUtil.startRecording = function (request, locusUrl, locusInfo) {
|
|
|
498
496
|
};
|
|
499
497
|
|
|
500
498
|
MeetingUtil.pauseRecording = function (request, locusUrl, locusInfo) {
|
|
501
|
-
var
|
|
499
|
+
var displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
|
|
502
500
|
|
|
503
|
-
if (
|
|
501
|
+
if (MeetingUtil.canUserPause(displayHints)) {
|
|
504
502
|
return request.recordMeeting({
|
|
505
503
|
locusUrl: locusUrl,
|
|
506
504
|
recording: true,
|
|
@@ -512,9 +510,9 @@ MeetingUtil.pauseRecording = function (request, locusUrl, locusInfo) {
|
|
|
512
510
|
};
|
|
513
511
|
|
|
514
512
|
MeetingUtil.resumeRecording = function (request, locusUrl, locusInfo) {
|
|
515
|
-
var
|
|
513
|
+
var displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
|
|
516
514
|
|
|
517
|
-
if (
|
|
515
|
+
if (MeetingUtil.canUserResume(displayHints)) {
|
|
518
516
|
return request.recordMeeting({
|
|
519
517
|
locusUrl: locusUrl,
|
|
520
518
|
recording: true,
|
|
@@ -526,9 +524,9 @@ MeetingUtil.resumeRecording = function (request, locusUrl, locusInfo) {
|
|
|
526
524
|
};
|
|
527
525
|
|
|
528
526
|
MeetingUtil.stopRecording = function (request, locusUrl, locusInfo) {
|
|
529
|
-
var
|
|
527
|
+
var displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
|
|
530
528
|
|
|
531
|
-
if (
|
|
529
|
+
if (MeetingUtil.canUserStop(displayHints)) {
|
|
532
530
|
return request.recordMeeting({
|
|
533
531
|
locusUrl: locusUrl,
|
|
534
532
|
recording: false,
|
package/dist/meeting/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","canUserLock","joined","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions"],"sources":["util.js"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n FULL_STATE,\n PASSWORD_STATUS,\n} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n};\n\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl\n };\n\n return meeting.meetingRequest\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\n// by default will leave on meeting's resourceId\n// if you explicity want it not to leave on resource id, pass\n// {resourceId: null}\n// TODO: chris, you can modify this however you want\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n};\n\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.getTrack = (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n};\n\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.canUserLock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_LOCK && joined.LOCK_STATUS_UNLOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserUnlock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_UNLOCK && joined.LOCK_STATUS_LOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserRecord = (moderator) => moderator.RECORDING_CONTROL_START;\n\nMeetingUtil.canUserPause = (moderator) => moderator.RECORDING_CONTROL_PAUSE;\n\nMeetingUtil.canUserResume = (moderator) => moderator.RECORDING_CONTROL_RESUME;\n\nMeetingUtil.canUserStop = (moderator) => moderator.RECORDING_CONTROL_STOP;\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserRecord(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserPause(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserResume(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserStop(moderator)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.lockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n};\n\nMeetingUtil.unlockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n};\n\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nMeetingUtil.endMeetingForAll = (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nexport default MeetingUtil;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","userDisplayHints","canUserLock","displayHints","DISPLAY_HINTS","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions"],"sources":["util.js"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n};\n\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl\n };\n\n return meeting.meetingRequest\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\n// by default will leave on meeting's resourceId\n// if you explicity want it not to leave on resource id, pass\n// {resourceId: null}\n// TODO: chris, you can modify this however you want\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n};\n\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.getTrack = (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n};\n\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) => locusInfo?.parsedLocus?.info?.userDisplayHints || [];\n\nMeetingUtil.canUserLock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);\n\nMeetingUtil.canUserUnlock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);\n\nMeetingUtil.canUserRecord = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nMeetingUtil.canUserPause = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nMeetingUtil.canUserResume = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nMeetingUtil.canUserStop = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserRecord(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserPause(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserResume(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserStop(displayHints)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.lockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n};\n\nMeetingUtil.unlockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n};\n\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nMeetingUtil.endMeetingForAll = (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nexport default MeetingUtil;\n"],"mappings":"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"}
|
package/dist/metrics/index.js
CHANGED
|
@@ -50,11 +50,12 @@ var _BrowserDetection = (0, _browserDetection.default)(),
|
|
|
50
50
|
getOSName = _BrowserDetection.getOSName,
|
|
51
51
|
getOSVersion = _BrowserDetection.getOSVersion,
|
|
52
52
|
getBrowserName = _BrowserDetection.getBrowserName,
|
|
53
|
-
getBrowserVersion = _BrowserDetection.getBrowserVersion; // Apply a CIDR /28 format to the
|
|
53
|
+
getBrowserVersion = _BrowserDetection.getBrowserVersion; // Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
|
|
54
|
+
// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
|
|
54
55
|
|
|
55
56
|
|
|
56
57
|
var anonymizeIPAddress = function anonymizeIPAddress(localIp) {
|
|
57
|
-
return (0, _ipAnonymize.default)(localIp);
|
|
58
|
+
return (0, _ipAnonymize.default)(localIp, 28, 96);
|
|
58
59
|
};
|
|
59
60
|
|
|
60
61
|
var triggerTimers = function triggerTimers(_ref) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IP address\nconst anonymizeIPAddress = (localIp) => anonymize(localIp);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n }\n else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n }\n else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,19 +24,19 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "2.
|
|
28
|
-
"@webex/internal-plugin-mercury": "2.
|
|
29
|
-
"@webex/internal-plugin-conversation": "2.
|
|
27
|
+
"@webex/webex-core": "2.3.0",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.3.0",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.3.0",
|
|
30
30
|
"webrtc-adapter": "^7.7.0",
|
|
31
31
|
"lodash": "^4.17.21",
|
|
32
32
|
"uuid": "^3.3.2",
|
|
33
33
|
"global": "^4.4.0",
|
|
34
34
|
"ip-anonymize": "^0.1.0",
|
|
35
|
-
"@webex/common": "2.
|
|
35
|
+
"@webex/common": "2.3.0",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"sdp-transform": "^2.12.0",
|
|
38
38
|
"readable-stream": "^3.6.0",
|
|
39
|
-
"@webex/common-timers": "2.
|
|
39
|
+
"@webex/common-timers": "2.3.0",
|
|
40
40
|
"btoa": "^1.2.1",
|
|
41
41
|
"javascript-state-machine": "^3.1.0",
|
|
42
42
|
"envify": "^4.1.0"
|
package/src/constants.js
CHANGED
|
@@ -617,11 +617,6 @@ export const CONNECTION_STATE = {
|
|
|
617
617
|
DISCONNECTED: 'disconnected'
|
|
618
618
|
};
|
|
619
619
|
|
|
620
|
-
export const JOIN_HINTS = {
|
|
621
|
-
LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
|
|
622
|
-
LOCK_STATUS_UNLOCKED: 'LOCK_STATUS_UNLOCKED'
|
|
623
|
-
};
|
|
624
|
-
|
|
625
620
|
export const LOCUS = {
|
|
626
621
|
STATE: {
|
|
627
622
|
INACTIVE: 'INACTIVE',
|
|
@@ -817,13 +812,20 @@ export const MEETING_END_REASON = {
|
|
|
817
812
|
MEDIA_RELEASED: 'MEDIA_RELEASED'
|
|
818
813
|
};
|
|
819
814
|
|
|
820
|
-
export const
|
|
815
|
+
export const DISPLAY_HINTS = {
|
|
821
816
|
RECORDING_CONTROL_START: 'RECORDING_CONTROL_START',
|
|
822
817
|
RECORDING_CONTROL_PAUSE: 'RECORDING_CONTROL_PAUSE',
|
|
823
818
|
RECORDING_CONTROL_STOP: 'RECORDING_CONTROL_STOP',
|
|
824
819
|
RECORDING_CONTROL_RESUME: 'RECORDING_CONTROL_RESUME',
|
|
825
820
|
LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
|
|
826
|
-
LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK'
|
|
821
|
+
LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
|
|
822
|
+
LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
|
|
823
|
+
LOCK_STATUS_UNLOCKED: 'LOCK_STATUS_UNLOCKED'
|
|
824
|
+
};
|
|
825
|
+
|
|
826
|
+
export const SELF_ROLES = {
|
|
827
|
+
COHOST: 'COHOST',
|
|
828
|
+
MODERATOR: 'MODERATOR'
|
|
827
829
|
};
|
|
828
830
|
|
|
829
831
|
export const MEETING_STATE = {
|
package/src/locus-info/index.js
CHANGED
|
@@ -783,10 +783,10 @@ export default class LocusInfo extends EventsScope {
|
|
|
783
783
|
* @memberof LocusInfo
|
|
784
784
|
*/
|
|
785
785
|
updateMeetingInfo(info, self) {
|
|
786
|
-
if (info && (!isEqual(this.info, info)
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info);
|
|
786
|
+
if (info && (!isEqual(this.info, info))) {
|
|
787
|
+
const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
|
|
788
|
+
|
|
789
|
+
const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles);
|
|
790
790
|
|
|
791
791
|
this.emitScoped(
|
|
792
792
|
{
|