@webex/widgets 1.22.2 → 1.22.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -12704,7 +12704,113 @@ performance.now || performance.mozNow || performance.msNow || performance.oNow |
12704
12704
  return new Date().getTime();
12705
12705
  }; // generate timestamp or delta
12706
12706
 
12707
+ /**
12708
+ * Custom rxjs operator for chaining dependent observables.
12709
+ * Usage:
12710
+ ```js
12711
+ obs.pipe(
12712
+ chainWith((lastMessage) => createDependentObservable(lastMessage),
12713
+ );
12714
+ ```
12715
+ *
12716
+ * @param {function(lastMessage): Observable} createDependentObservable Function that is passed the last message emitted by the source observable and returns a new observable
12717
+ * @returns {Observable} observable
12718
+ */
12719
+
12720
+
12721
+ function chainWith(createDependentObservable) {
12722
+ return source => new Observable(subscriber => {
12723
+ let lastValue;
12724
+ let subscription;
12725
+ subscription = source.subscribe(value => {
12726
+ subscriber.next(value);
12727
+ lastValue = value;
12728
+ }, error => subscriber.error(error), () => {
12729
+ subscription = createDependentObservable(lastValue).subscribe(value => subscriber.next(value), error => subscriber.error(error), () => subscriber.complete());
12730
+ });
12731
+ return () => {
12732
+ if (subscription) {
12733
+ subscription.unsubscribe();
12734
+ }
12735
+ };
12736
+ });
12737
+ }
12738
+ /**
12739
+ * Custom rxjs operator that works like combineLatest, but emits even if some of the source observables haven't emitted yet.
12740
+ * Usage:
12741
+ ```js
12742
+ combineLatestImmediate(obs1, obs2, ...);
12743
+ ```
12744
+ *
12745
+ * @param {ObservableInput} [observables] An array of input Observables to combine with each other.
12746
+ * @returns {Observable} Observable that emits arrays containing the last emitted value from each of the observables defined above.
12747
+ */
12748
+
12749
+
12750
+ function combineLatestImmediate() {
12751
+ for (var _len = arguments.length, observables = new Array(_len), _key = 0; _key < _len; _key++) {
12752
+ observables[_key] = arguments[_key];
12753
+ }
12754
+
12755
+ return combineLatest(observables.map(obs => obs.pipe(startWith(undefined))));
12756
+ }
12757
+ /**
12758
+ * Helper function for deep merge on objects.
12759
+ *
12760
+ * @param {object} dest - The destination object.
12761
+ * @param {object} src - The source object.
12762
+ */
12763
+
12764
+
12765
+ function deepMerge(dest, src) {
12766
+ const result = dest;
12767
+
12768
+ for (const [key, val] of Object.entries(src || {})) {
12769
+ if (val && val.constructor === Object) {
12770
+ deepMerge(result[key], val);
12771
+ } else {
12772
+ result[key] = val;
12773
+ }
12774
+ }
12775
+ }
12776
+ /**
12777
+ * Safe JSON stringifier that:
12778
+ * - replaces circular references with the text [circular-reference]
12779
+ * - catches any JSON.stringify error and returns [error-stringifying:<ERROR-MESSAGE>]
12780
+ *
12781
+ * @param {any} data Data to be stringified
12782
+ * @param {function} [replacer] JSON.stringify() replacer parameter
12783
+ * @param {string|number} [space] JSON.stringify() space parameter
12784
+ * @returns {string} The string result
12785
+ */
12786
+
12787
+
12788
+ function safeJsonStringify(data, replacer, space) {
12789
+ const seen = new WeakSet();
12790
+ let str;
12791
+
12792
+ try {
12793
+ str = JSON.stringify(data, (key, value) => {
12794
+ let replaced = replacer ? replacer(key, value) : value;
12795
+
12796
+ if (typeof replaced === 'object' && replaced !== null) {
12797
+ if (seen.has(replaced)) {
12798
+ replaced = '[circular-reference]';
12799
+ } else {
12800
+ seen.add(replaced);
12801
+ }
12802
+ }
12803
+
12804
+ return replaced;
12805
+ }, space);
12806
+ } catch (error) {
12807
+ str = `[error-stringifying:${error.message}]`;
12808
+ }
12809
+
12810
+ return str;
12811
+ }
12707
12812
 
12813
+ const isSpeakerSupported = !!document.createElement('audio').setSinkId;
12708
12814
  const logFormat = format.printf(_ref => {
12709
12815
  let {
12710
12816
  timestamp,
@@ -12718,7 +12824,7 @@ const logFormat = format.printf(_ref => {
12718
12824
  let msgString = message;
12719
12825
 
12720
12826
  if (Array.isArray(message)) {
12721
- msgString = message.map(item => typeof item === 'string' && item || JSON.stringify(item, (key, value) => value instanceof MediaStream && `MediaStream([${value.getTracks().map(track => track.kind)}])` || value, 2)).join(' ');
12827
+ msgString = message.map(item => typeof item === 'string' && item || safeJsonStringify(item, (key, value) => value instanceof MediaStream && `MediaStream([${value.getTracks().map(track => track.kind)}])` || value, 2)).join(' ');
12722
12828
  }
12723
12829
 
12724
12830
  return `${timestamp} ${level} ${resourceType} ${resourceID} ${action} ${msgString} ${error ? ` ${error.stack || error}` : ''}`;
@@ -13396,77 +13502,6 @@ class ShareControl extends MeetingControl {
13396
13502
  }
13397
13503
 
13398
13504
  }
13399
- /**
13400
- * Custom rxjs operator for chaining dependent observables.
13401
- * Usage:
13402
- ```js
13403
- obs.pipe(
13404
- chainWith((lastMessage) => createDependentObservable(lastMessage),
13405
- );
13406
- ```
13407
- *
13408
- * @param {function(lastMessage): Observable} createDependentObservable Function that is passed the last message emitted by the source observable and returns a new observable
13409
- * @returns {Observable} observable
13410
- */
13411
-
13412
-
13413
- function chainWith(createDependentObservable) {
13414
- return source => new Observable(subscriber => {
13415
- let lastValue;
13416
- let subscription;
13417
- subscription = source.subscribe(value => {
13418
- subscriber.next(value);
13419
- lastValue = value;
13420
- }, error => subscriber.error(error), () => {
13421
- subscription = createDependentObservable(lastValue).subscribe(value => subscriber.next(value), error => subscriber.error(error), () => subscriber.complete());
13422
- });
13423
- return () => {
13424
- if (subscription) {
13425
- subscription.unsubscribe();
13426
- }
13427
- };
13428
- });
13429
- }
13430
- /**
13431
- * Custom rxjs operator that works like combineLatest, but emits even if some of the source observables haven't emitted yet.
13432
- * Usage:
13433
- ```js
13434
- combineLatestImmediate(obs1, obs2, ...);
13435
- ```
13436
- *
13437
- * @param {ObservableInput} [observables] An array of input Observables to combine with each other.
13438
- * @returns {Observable} Observable that emits arrays containing the last emitted value from each of the observables defined above.
13439
- */
13440
-
13441
-
13442
- function combineLatestImmediate() {
13443
- for (var _len = arguments.length, observables = new Array(_len), _key = 0; _key < _len; _key++) {
13444
- observables[_key] = arguments[_key];
13445
- }
13446
-
13447
- return combineLatest(observables.map(obs => obs.pipe(startWith(undefined))));
13448
- }
13449
- /**
13450
- * Helper function for deep merge on objects.
13451
- *
13452
- * @param {object} dest - The destination object.
13453
- * @param {object} src - The source object.
13454
- */
13455
-
13456
-
13457
- function deepMerge(dest, src) {
13458
- const result = dest;
13459
-
13460
- for (const [key, val] of Object.entries(src || {})) {
13461
- if (val && val.constructor === Object) {
13462
- deepMerge(result[key], val);
13463
- } else {
13464
- result[key] = val;
13465
- }
13466
- }
13467
- }
13468
-
13469
- const isSpeakerSupported = !!document.createElement('audio').setSinkId;
13470
13505
  /**
13471
13506
  * Display options of a meeting control.
13472
13507
  *
@@ -13474,6 +13509,7 @@ const isSpeakerSupported = !!document.createElement('audio').setSinkId;
13474
13509
  * @see {@link https://github.com/webex/component-adapter-interfaces/blob/master/src/MeetingsAdapter.js#L58}
13475
13510
  */
13476
13511
 
13512
+
13477
13513
  class SwitchCameraControl extends MeetingControl {
13478
13514
  /**
13479
13515
  * Calls the action of the switch camera control.
@@ -13500,7 +13536,7 @@ class SwitchCameraControl extends MeetingControl {
13500
13536
  meetingID
13501
13537
  }]);
13502
13538
  const cameraID$ = this.adapter.getMeeting(meetingID).pipe(map(meeting => meeting.cameraID), distinctUntilChanged());
13503
- const options$ = defer(() => this.adapter.getAvailableDevices(meetingID, 'videoinput')).pipe(map(availableCameras => availableCameras.map(camera => ({
13539
+ const options$ = this.adapter.getAvailableDevices(meetingID, 'videoinput').pipe(map(availableCameras => availableCameras.map(camera => ({
13504
13540
  value: camera.deviceId,
13505
13541
  label: camera.label
13506
13542
  }))));
@@ -13553,7 +13589,7 @@ class SwitchMicrophoneControl extends MeetingControl {
13553
13589
  meetingID
13554
13590
  }]);
13555
13591
  const microphoneID$ = this.adapter.getMeeting(meetingID).pipe(map(meeting => meeting.microphoneID), distinctUntilChanged());
13556
- const options$ = defer(() => this.adapter.getAvailableDevices(meetingID, 'audioinput')).pipe(map(availableMicrophones => availableMicrophones.map(microphone => ({
13592
+ const options$ = this.adapter.getAvailableDevices(meetingID, 'audioinput').pipe(map(availableMicrophones => availableMicrophones.map(microphone => ({
13557
13593
  value: microphone.deviceId,
13558
13594
  label: microphone.label
13559
13595
  }))));
@@ -13606,7 +13642,7 @@ class SwitchSpeakerControl extends MeetingControl {
13606
13642
  meetingID
13607
13643
  }]);
13608
13644
  const speakerID$ = this.adapter.getMeeting(meetingID).pipe(map(meeting => meeting.speakerID), distinctUntilChanged());
13609
- const options$ = defer(() => this.adapter.getAvailableDevices(meetingID, 'audiooutput')).pipe(map(availableSpeakers => availableSpeakers.map(speaker => ({
13645
+ const options$ = this.adapter.getAvailableDevices(meetingID, 'audiooutput').pipe(map(availableSpeakers => availableSpeakers.map(speaker => ({
13610
13646
  value: speaker.deviceId,
13611
13647
  label: speaker.label
13612
13648
  }))), map(options => [{
@@ -13930,7 +13966,7 @@ class MeetingsSDKAdapter extends d {
13930
13966
  }
13931
13967
  }, 2000);
13932
13968
  const [localStream] = await sdkMeeting.getMediaStreams(mediaDirection, audioVideo);
13933
- const availableDevices = await this.getAvailableDevices(ID);
13969
+ const availableDevices = await navigator.mediaDevices.enumerateDevices();
13934
13970
  const [{
13935
13971
  label: deviceLabel
13936
13972
  }] = localStream.getTracks();
@@ -13962,10 +13998,7 @@ class MeetingsSDKAdapter extends d {
13962
13998
  if (!ignored) {
13963
13999
  let perm;
13964
14000
  const ee = error.error;
13965
- logger.error('MEETING', ID, 'getStream()', ['Unable to retrieve local media stream', {
13966
- mediaDirection,
13967
- audioVideo
13968
- }], ee);
14001
+ logger.error('MEETING', ID, 'getStream()', 'Unable to retrieve local media stream', ee || error);
13969
14002
 
13970
14003
  if (ee instanceof DOMException) {
13971
14004
  if (ee.name === 'NotAllowedError') {
@@ -14019,35 +14052,38 @@ class MeetingsSDKAdapter extends d {
14019
14052
  });
14020
14053
  }
14021
14054
  /**
14022
- * Returns available media devices.
14055
+ * Emits available media devices.
14056
+ * If the user did no grant access to media (browser and OS), the returned observable
14057
+ * will emit an empty array.
14023
14058
  *
14024
- * @param {string} ID ID of the meeting
14025
- * @param {'videoinput'|'audioinput'|'audiooutput'} [type] String specifying the device type.
14059
+ * @param {string} ID Id of the meeting
14060
+ * @param {'videoinput'|'audioinput'|'audiooutput'} type String specifying the device type.
14026
14061
  * See {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo/kind|MDN}
14027
- * @returns {MediaDeviceInfo[]} Array containing media devices.
14062
+ * @returns {Observable<MediaDeviceInfo[]>} Observable that emits arrays containing media devices.
14028
14063
  * @private
14029
14064
  */
14030
- // eslint-disable-next-line class-methods-use-this
14031
14065
 
14032
14066
 
14033
- async getAvailableDevices(ID, type) {
14067
+ getAvailableDevices(ID, type) {
14034
14068
  logger.debug('MEETING', ID, 'getAvailableDevices()', ['called with', {
14035
14069
  ID,
14036
14070
  type
14037
14071
  }]);
14038
- let devices;
14039
14072
 
14040
- try {
14041
- const sdkMeeting = this.fetchMeeting(ID);
14042
- devices = await sdkMeeting.getDevices();
14043
- devices = devices.filter(device => !type || device.kind === type && device.deviceId);
14044
- } catch (error) {
14045
- logger.error('MEETING', ID, 'getAvailableDevices()', 'Unable to retrieve devices', error);
14046
- devices = [];
14047
- }
14073
+ const getDevices = async () => {
14074
+ let devices = [];
14075
+
14076
+ try {
14077
+ devices = await this.fetchMeeting(ID).getDevices();
14078
+ devices = devices.filter(device => !type || device.kind === type && device.deviceId);
14079
+ } catch (error) {
14080
+ logger.error('MEETING', ID, 'getAvailableDevices()', 'Unable to retrieve devices', error);
14081
+ }
14082
+
14083
+ return devices;
14084
+ };
14048
14085
 
14049
- logger.debug('MEETING', ID, 'getAvailabelDevices()', ['return', devices]);
14050
- return devices;
14086
+ return this.getMeeting(ID).pipe(map(meeting => type !== 'videoinput' && type !== 'audioinput' || type === 'videoinput' && meeting.localVideo.permission === 'ALLOWED' || type === 'audioinput' && meeting.localAudio.permission === 'ALLOWED'), distinctUntilChanged(), concatMap(allowed => from(allowed ? getDevices() : [[]])), tap(devices => logger.debug('MEETING', ID, 'getAvailabelDevices()', ['emitting', devices])));
14051
14087
  }
14052
14088
  /**
14053
14089
  * Update the meeting object with media attached based on a given event type.
@@ -14111,21 +14147,24 @@ class MeetingsSDKAdapter extends d {
14111
14147
 
14112
14148
  case MEDIA_TYPE_REMOTE_SHARE:
14113
14149
  this.meetings[ID] = { ...meeting,
14114
- remoteShareStream: stream
14150
+ remoteShareStream: stream,
14151
+ remoteShare: meeting.remoteSharing ? stream : null
14115
14152
  };
14116
14153
  break;
14117
14154
 
14118
14155
  case EVENT_REMOTE_SHARE_START:
14119
14156
  // Only activate the remote stream when get get the start notification
14120
14157
  this.meetings[ID] = { ...meeting,
14121
- remoteShare: meeting.remoteShareStream
14158
+ remoteShare: meeting.remoteShareStream || null,
14159
+ remoteSharing: true
14122
14160
  };
14123
14161
  break;
14124
14162
 
14125
14163
  case EVENT_REMOTE_SHARE_STOP:
14126
14164
  // Remove remote share on stop event
14127
14165
  this.meetings[ID] = { ...meeting,
14128
- remoteShare: null
14166
+ remoteShare: null,
14167
+ remoteSharing: false
14129
14168
  };
14130
14169
  break;
14131
14170
  }
@@ -15529,7 +15568,7 @@ var defineProperty = defineProperty$1;
15529
15568
  })(constants);
15530
15569
 
15531
15570
  var name = "@webex/sdk-component-adapter";
15532
- var version = "1.95.0";
15571
+ var version = "1.97.1";
15533
15572
  const LOG_ARGS$1 = ['SDK-MEMBERSHIPS', `${name}-${version}`]; // max parameter value must be greater than 0 and less than or equal to 1000
15534
15573
 
15535
15574
  const MAX_MEMBERSHIPS = 1000; // TODO: Figure out how to import JS Doc definitions and remove duplication.
@@ -16571,7 +16610,7 @@ var WebexMeetings = si(ai(WebexMeetingsWidget), function (props) {
16571
16610
  },
16572
16611
  config: {
16573
16612
  appName: appName,
16574
- appVersion: "1.22.1"
16613
+ appVersion: "1.22.2"
16575
16614
  }
16576
16615
  });
16577
16616
  return new WebexSDKAdapter(webex);