@webex/plugin-meetings 3.0.0-beta.256 → 3.0.0-beta.258

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.
@@ -209,7 +209,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
209
209
  sessionId: this.sessionId
210
210
  });
211
211
  },
212
- version: "3.0.0-beta.256"
212
+ version: "3.0.0-beta.258"
213
213
  });
214
214
  var _default = Breakout;
215
215
  exports.default = _default;
@@ -1041,7 +1041,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1041
1041
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1042
1042
  }
1043
1043
  },
1044
- version: "3.0.0-beta.256"
1044
+ version: "3.0.0-beta.258"
1045
1045
  });
1046
1046
  var _default = Breakouts;
1047
1047
  exports.default = _default;
@@ -118,14 +118,14 @@ WebExMeetingsErrors[UserInLobbyError.CODE] = UserInLobbyError;
118
118
  * @classdesc Raised whenever the user passes Space ID as destination for create meeting.
119
119
  * @extends WebexMeetingsError
120
120
  * @property {number} code - 30105
121
- * @property {string} message - Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.'
121
+ * @property {string} message - Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.'
122
122
  */
123
123
  var SpaceIDDeprecatedError = /*#__PURE__*/function (_WebexMeetingsError5) {
124
124
  (0, _inherits2.default)(SpaceIDDeprecatedError, _WebexMeetingsError5);
125
125
  var _super5 = _createSuper(SpaceIDDeprecatedError);
126
126
  function SpaceIDDeprecatedError() {
127
127
  (0, _classCallCheck2.default)(this, SpaceIDDeprecatedError);
128
- return _super5.call(this, SpaceIDDeprecatedError.CODE, 'Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.');
128
+ return _super5.call(this, SpaceIDDeprecatedError.CODE, 'Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.');
129
129
  }
130
130
  return (0, _createClass2.default)(SpaceIDDeprecatedError);
131
131
  }(_webexMeetingsError.default);
@@ -1 +1 @@
1
- {"version":3,"names":["WebExMeetingsErrors","createMeetingsError","code","message","WebexMeetingsError","MeetingNotActiveError","CODE","UserNotJoinedError","NoMediaEstablishedYetError","UserInLobbyError","SpaceIDDeprecatedError","IceGatheringFailed"],"sources":["webex-errors.ts"],"sourcesContent":["// The document would auto generate the doc for errors\n\n// 1) Error codes for Oauth, login, mercury should be separated out (Code range)\n// 2) Errors from the actual locus server or other server in case, we can use the same error code as locus and redirect it\n// 3) Any errors we generate from the SDK can be split into various categories\n// Parameter validation, user action, connection, media specific(They can have different range)\n\n// TODO: all the errors from the server need to be captured\n\n// add a way to log and send metrics if needed\nimport WebexMeetingsError from './webex-meetings-error';\n\nconst WebExMeetingsErrors = {};\n\n/**\n * Create a {@link WebexMeetingsError} for a given code and message.\n * @private\n * @param {number} [code] - Error code\n * @param {string} [message] - Error message\n * @returns {WebexMeetingsError}\n */\nexport function createMeetingsError(code?: number, message?: string) {\n code = typeof code === 'number' ? code : 0;\n message = typeof message === 'string' && message ? message : 'Unknown error';\n\n return WebExMeetingsErrors[code]\n ? new WebExMeetingsErrors[code]()\n : new WebexMeetingsError(code, message);\n}\n\n/**\n * @class MeetingNotActiveError\n * @classdesc Raised whenever Meeting has already ended and user tries to do a action.\n * @extends WebexMeetingsError\n * @property {number} code - 30101\n * @property {string} message - 'Meeting has already Ended or not Active'\n */\nclass MeetingNotActiveError extends WebexMeetingsError {\n static CODE = 30101;\n\n constructor() {\n super(MeetingNotActiveError.CODE, 'Meeting has already Ended or not Active');\n }\n}\n\nexport {MeetingNotActiveError};\nWebExMeetingsErrors[MeetingNotActiveError.CODE] = MeetingNotActiveError;\n\n/**\n * @class UserNotJoinedError\n * @classdesc Raised whenever the user has already left the meeting and user tries to do a action.\n * @extends WebexMeetingsError\n * @property {number} code - 30102\n * @property {string} message - 'User has already left the meeting'\n */\nclass UserNotJoinedError extends WebexMeetingsError {\n static CODE = 30102;\n\n constructor() {\n super(\n UserNotJoinedError.CODE,\n 'User currently not in meeting. Please join a meeting before adding media.'\n );\n }\n}\n\nexport {UserNotJoinedError};\nWebExMeetingsErrors[UserNotJoinedError.CODE] = UserNotJoinedError;\n\n/**\n * @class NoMediaEstablishedYetError\n * @classdesc Raised whenever the user has not established media yet.\n * @extends WebexMeetingsError\n * @property {number} code - 30103\n * @property {string} message - error message\n */\nclass NoMediaEstablishedYetError extends WebexMeetingsError {\n static CODE = 30103;\n\n // eslint-disable-next-line require-jsdoc\n constructor() {\n super(\n NoMediaEstablishedYetError.CODE,\n 'Webrtc media connection is missing, call addMedia() first'\n );\n }\n}\n\nexport {NoMediaEstablishedYetError};\nWebExMeetingsErrors[NoMediaEstablishedYetError.CODE] = NoMediaEstablishedYetError;\n\n/**\n * @class UserInLobbyError\n * @classdesc Raised whenever the user is in lobby and not joined yet.\n * @extends WebexMeetingsError\n * @property {number} code - 30104\n * @property {string} message - 'user is still in the lobby or not joined'\n */\nclass UserInLobbyError extends WebexMeetingsError {\n static CODE = 30104;\n\n constructor() {\n super(UserInLobbyError.CODE, 'user is still in the lobby or not joined');\n }\n}\n\nexport {UserInLobbyError};\nWebExMeetingsErrors[UserInLobbyError.CODE] = UserInLobbyError;\n\n/**\n * @class SpaceIDDeprecatedError\n * @classdesc Raised whenever the user passes Space ID as destination for create meeting.\n * @extends WebexMeetingsError\n * @property {number} code - 30105\n * @property {string} message - Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.'\n */\nclass SpaceIDDeprecatedError extends WebexMeetingsError {\n static CODE = 30105;\n\n constructor() {\n super(\n SpaceIDDeprecatedError.CODE,\n 'Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.'\n );\n }\n}\n\nexport {SpaceIDDeprecatedError};\nWebExMeetingsErrors[SpaceIDDeprecatedError.CODE] = SpaceIDDeprecatedError;\n\n/**\n * @class IceGatheringFailed\n * @classdesc Raised whenever ice gathering fails.\n * @extends WebexMeetingsError\n * @property {number} code - 30202\n * @property {string} message - 'user failed ice gathering check network/firewall'\n */\nclass IceGatheringFailed extends WebexMeetingsError {\n static CODE = 30202;\n\n constructor() {\n super(IceGatheringFailed.CODE, 'iceConnection: gethering ice candidate failed');\n }\n}\n\nexport {IceGatheringFailed};\nWebExMeetingsErrors[IceGatheringFailed.CODE] = IceGatheringFailed;\n"],"mappings":";;;;;;;;;;;;;;;;AAUA;AAAwD;AAAA;AAExD,IAAMA,mBAAmB,GAAG,CAAC,CAAC;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmB,CAACC,IAAa,EAAEC,OAAgB,EAAE;EACnED,IAAI,GAAG,OAAOA,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAG,CAAC;EAC1CC,OAAO,GAAG,OAAOA,OAAO,KAAK,QAAQ,IAAIA,OAAO,GAAGA,OAAO,GAAG,eAAe;EAE5E,OAAOH,mBAAmB,CAACE,IAAI,CAAC,GAC5B,IAAIF,mBAAmB,CAACE,IAAI,CAAC,EAAE,GAC/B,IAAIE,2BAAkB,CAACF,IAAI,EAAEC,OAAO,CAAC;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOME,qBAAqB;EAAA;EAAA;EAGzB,iCAAc;IAAA;IAAA,yBACNA,qBAAqB,CAACC,IAAI,EAAE,yCAAyC;EAC7E;EAAC;AAAA,EALiCF,2BAAkB;AAAA;AAAA,8BAAhDC,qBAAqB,UACX,KAAK;AAQrBL,mBAAmB,CAACK,qBAAqB,CAACC,IAAI,CAAC,GAAGD,qBAAqB;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOME,kBAAkB;EAAA;EAAA;EAGtB,8BAAc;IAAA;IAAA,0BAEVA,kBAAkB,CAACD,IAAI,EACvB,2EAA2E;EAE/E;EAAC;AAAA,EAR8BF,2BAAkB;AAAA;AAAA,8BAA7CG,kBAAkB,UACR,KAAK;AAWrBP,mBAAmB,CAACO,kBAAkB,CAACD,IAAI,CAAC,GAAGC,kBAAkB;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,0BAA0B;EAAA;EAAA;EAG9B;EACA,sCAAc;IAAA;IAAA,0BAEVA,0BAA0B,CAACF,IAAI,EAC/B,2DAA2D;EAE/D;EAAC;AAAA,EATsCF,2BAAkB;AAAA;AAAA,8BAArDI,0BAA0B,UAChB,KAAK;AAYrBR,mBAAmB,CAACQ,0BAA0B,CAACF,IAAI,CAAC,GAAGE,0BAA0B;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,gBAAgB;EAAA;EAAA;EAGpB,4BAAc;IAAA;IAAA,0BACNA,gBAAgB,CAACH,IAAI,EAAE,0CAA0C;EACzE;EAAC;AAAA,EAL4BF,2BAAkB;AAAA;AAAA,8BAA3CK,gBAAgB,UACN,KAAK;AAQrBT,mBAAmB,CAACS,gBAAgB,CAACH,IAAI,CAAC,GAAGG,gBAAgB;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,sBAAsB;EAAA;EAAA;EAG1B,kCAAc;IAAA;IAAA,0BAEVA,sBAAsB,CAACJ,IAAI,EAC3B,gOAAgO;EAEpO;EAAC;AAAA,EARkCF,2BAAkB;AAAA;AAAA,8BAAjDM,sBAAsB,UACZ,KAAK;AAWrBV,mBAAmB,CAACU,sBAAsB,CAACJ,IAAI,CAAC,GAAGI,sBAAsB;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,kBAAkB;EAAA;EAAA;EAGtB,8BAAc;IAAA;IAAA,0BACNA,kBAAkB,CAACL,IAAI,EAAE,+CAA+C;EAChF;EAAC;AAAA,EAL8BF,2BAAkB;AAAA;AAAA,8BAA7CO,kBAAkB,UACR,KAAK;AAQrBX,mBAAmB,CAACW,kBAAkB,CAACL,IAAI,CAAC,GAAGK,kBAAkB"}
1
+ {"version":3,"names":["WebExMeetingsErrors","createMeetingsError","code","message","WebexMeetingsError","MeetingNotActiveError","CODE","UserNotJoinedError","NoMediaEstablishedYetError","UserInLobbyError","SpaceIDDeprecatedError","IceGatheringFailed"],"sources":["webex-errors.ts"],"sourcesContent":["// The document would auto generate the doc for errors\n\n// 1) Error codes for Oauth, login, mercury should be separated out (Code range)\n// 2) Errors from the actual locus server or other server in case, we can use the same error code as locus and redirect it\n// 3) Any errors we generate from the SDK can be split into various categories\n// Parameter validation, user action, connection, media specific(They can have different range)\n\n// TODO: all the errors from the server need to be captured\n\n// add a way to log and send metrics if needed\nimport WebexMeetingsError from './webex-meetings-error';\n\nconst WebExMeetingsErrors = {};\n\n/**\n * Create a {@link WebexMeetingsError} for a given code and message.\n * @private\n * @param {number} [code] - Error code\n * @param {string} [message] - Error message\n * @returns {WebexMeetingsError}\n */\nexport function createMeetingsError(code?: number, message?: string) {\n code = typeof code === 'number' ? code : 0;\n message = typeof message === 'string' && message ? message : 'Unknown error';\n\n return WebExMeetingsErrors[code]\n ? new WebExMeetingsErrors[code]()\n : new WebexMeetingsError(code, message);\n}\n\n/**\n * @class MeetingNotActiveError\n * @classdesc Raised whenever Meeting has already ended and user tries to do a action.\n * @extends WebexMeetingsError\n * @property {number} code - 30101\n * @property {string} message - 'Meeting has already Ended or not Active'\n */\nclass MeetingNotActiveError extends WebexMeetingsError {\n static CODE = 30101;\n\n constructor() {\n super(MeetingNotActiveError.CODE, 'Meeting has already Ended or not Active');\n }\n}\n\nexport {MeetingNotActiveError};\nWebExMeetingsErrors[MeetingNotActiveError.CODE] = MeetingNotActiveError;\n\n/**\n * @class UserNotJoinedError\n * @classdesc Raised whenever the user has already left the meeting and user tries to do a action.\n * @extends WebexMeetingsError\n * @property {number} code - 30102\n * @property {string} message - 'User has already left the meeting'\n */\nclass UserNotJoinedError extends WebexMeetingsError {\n static CODE = 30102;\n\n constructor() {\n super(\n UserNotJoinedError.CODE,\n 'User currently not in meeting. Please join a meeting before adding media.'\n );\n }\n}\n\nexport {UserNotJoinedError};\nWebExMeetingsErrors[UserNotJoinedError.CODE] = UserNotJoinedError;\n\n/**\n * @class NoMediaEstablishedYetError\n * @classdesc Raised whenever the user has not established media yet.\n * @extends WebexMeetingsError\n * @property {number} code - 30103\n * @property {string} message - error message\n */\nclass NoMediaEstablishedYetError extends WebexMeetingsError {\n static CODE = 30103;\n\n // eslint-disable-next-line require-jsdoc\n constructor() {\n super(\n NoMediaEstablishedYetError.CODE,\n 'Webrtc media connection is missing, call addMedia() first'\n );\n }\n}\n\nexport {NoMediaEstablishedYetError};\nWebExMeetingsErrors[NoMediaEstablishedYetError.CODE] = NoMediaEstablishedYetError;\n\n/**\n * @class UserInLobbyError\n * @classdesc Raised whenever the user is in lobby and not joined yet.\n * @extends WebexMeetingsError\n * @property {number} code - 30104\n * @property {string} message - 'user is still in the lobby or not joined'\n */\nclass UserInLobbyError extends WebexMeetingsError {\n static CODE = 30104;\n\n constructor() {\n super(UserInLobbyError.CODE, 'user is still in the lobby or not joined');\n }\n}\n\nexport {UserInLobbyError};\nWebExMeetingsErrors[UserInLobbyError.CODE] = UserInLobbyError;\n\n/**\n * @class SpaceIDDeprecatedError\n * @classdesc Raised whenever the user passes Space ID as destination for create meeting.\n * @extends WebexMeetingsError\n * @property {number} code - 30105\n * @property {string} message - Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.'\n */\nclass SpaceIDDeprecatedError extends WebexMeetingsError {\n static CODE = 30105;\n\n constructor() {\n super(\n SpaceIDDeprecatedError.CODE,\n 'Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.'\n );\n }\n}\n\nexport {SpaceIDDeprecatedError};\nWebExMeetingsErrors[SpaceIDDeprecatedError.CODE] = SpaceIDDeprecatedError;\n\n/**\n * @class IceGatheringFailed\n * @classdesc Raised whenever ice gathering fails.\n * @extends WebexMeetingsError\n * @property {number} code - 30202\n * @property {string} message - 'user failed ice gathering check network/firewall'\n */\nclass IceGatheringFailed extends WebexMeetingsError {\n static CODE = 30202;\n\n constructor() {\n super(IceGatheringFailed.CODE, 'iceConnection: gethering ice candidate failed');\n }\n}\n\nexport {IceGatheringFailed};\nWebExMeetingsErrors[IceGatheringFailed.CODE] = IceGatheringFailed;\n"],"mappings":";;;;;;;;;;;;;;;;AAUA;AAAwD;AAAA;AAExD,IAAMA,mBAAmB,GAAG,CAAC,CAAC;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmB,CAACC,IAAa,EAAEC,OAAgB,EAAE;EACnED,IAAI,GAAG,OAAOA,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAG,CAAC;EAC1CC,OAAO,GAAG,OAAOA,OAAO,KAAK,QAAQ,IAAIA,OAAO,GAAGA,OAAO,GAAG,eAAe;EAE5E,OAAOH,mBAAmB,CAACE,IAAI,CAAC,GAC5B,IAAIF,mBAAmB,CAACE,IAAI,CAAC,EAAE,GAC/B,IAAIE,2BAAkB,CAACF,IAAI,EAAEC,OAAO,CAAC;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOME,qBAAqB;EAAA;EAAA;EAGzB,iCAAc;IAAA;IAAA,yBACNA,qBAAqB,CAACC,IAAI,EAAE,yCAAyC;EAC7E;EAAC;AAAA,EALiCF,2BAAkB;AAAA;AAAA,8BAAhDC,qBAAqB,UACX,KAAK;AAQrBL,mBAAmB,CAACK,qBAAqB,CAACC,IAAI,CAAC,GAAGD,qBAAqB;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOME,kBAAkB;EAAA;EAAA;EAGtB,8BAAc;IAAA;IAAA,0BAEVA,kBAAkB,CAACD,IAAI,EACvB,2EAA2E;EAE/E;EAAC;AAAA,EAR8BF,2BAAkB;AAAA;AAAA,8BAA7CG,kBAAkB,UACR,KAAK;AAWrBP,mBAAmB,CAACO,kBAAkB,CAACD,IAAI,CAAC,GAAGC,kBAAkB;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,0BAA0B;EAAA;EAAA;EAG9B;EACA,sCAAc;IAAA;IAAA,0BAEVA,0BAA0B,CAACF,IAAI,EAC/B,2DAA2D;EAE/D;EAAC;AAAA,EATsCF,2BAAkB;AAAA;AAAA,8BAArDI,0BAA0B,UAChB,KAAK;AAYrBR,mBAAmB,CAACQ,0BAA0B,CAACF,IAAI,CAAC,GAAGE,0BAA0B;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,gBAAgB;EAAA;EAAA;EAGpB,4BAAc;IAAA;IAAA,0BACNA,gBAAgB,CAACH,IAAI,EAAE,0CAA0C;EACzE;EAAC;AAAA,EAL4BF,2BAAkB;AAAA;AAAA,8BAA3CK,gBAAgB,UACN,KAAK;AAQrBT,mBAAmB,CAACS,gBAAgB,CAACH,IAAI,CAAC,GAAGG,gBAAgB;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,sBAAsB;EAAA;EAAA;EAG1B,kCAAc;IAAA;IAAA,0BAEVA,sBAAsB,CAACJ,IAAI,EAC3B,oOAAoO;EAExO;EAAC;AAAA,EARkCF,2BAAkB;AAAA;AAAA,8BAAjDM,sBAAsB,UACZ,KAAK;AAWrBV,mBAAmB,CAACU,sBAAsB,CAACJ,IAAI,CAAC,GAAGI,sBAAsB;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOMC,kBAAkB;EAAA;EAAA;EAGtB,8BAAc;IAAA;IAAA,0BACNA,kBAAkB,CAACL,IAAI,EAAE,+CAA+C;EAChF;EAAC;AAAA,EAL8BF,2BAAkB;AAAA;AAAA,8BAA7CO,kBAAkB,UACR,KAAK;AAQrBX,mBAAmB,CAACW,kBAAkB,CAACL,IAAI,CAAC,GAAGK,kBAAkB"}
@@ -359,7 +359,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
359
359
  throw error;
360
360
  });
361
361
  },
362
- version: "3.0.0-beta.256"
362
+ version: "3.0.0-beta.258"
363
363
  });
364
364
  var _default = SimultaneousInterpretation;
365
365
  exports.default = _default;
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.0.0-beta.256"
21
+ version: "3.0.0-beta.258"
22
22
  });
23
23
  var _default = SILanguage;
24
24
  exports.default = _default;
@@ -213,7 +213,7 @@ MeetingInfoUtil.getDestinationType = /*#__PURE__*/function () {
213
213
  _context.next = 50;
214
214
  break;
215
215
  }
216
- _loggerProxy.default.logger.error("Meeting-info:util#getDestinationType --> Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.");
216
+ _loggerProxy.default.logger.error("Meeting-info:util#getDestinationType --> Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.");
217
217
  // Error code 30105 added as Space ID deprecated as of beta, Please refer migration guide.
218
218
  throw new _webexErrors.SpaceIDDeprecatedError();
219
219
  case 50:
@@ -1 +1 @@
1
- {"version":3,"names":["MeetingInfoUtil","meetingInfoError","getParsedUrl","link","parsedUrl","url","parse","protocol","HTTPS_PROTOCOL","error","LoggerProxy","logger","warn","isMeetingLink","value","hostNameBool","hostname","includes","WEBEX_DOT_COM","pathNameBool","pathname","MEET","MEET_M","JOIN","isConversationUrl","webex","clusterId","internal","services","getClusterId","endsWith","CONVERSATION_SERVICE","isSipUri","sipString","sipUri","DIALER_REGEX","SIP_ADDRESS","exec","isPhoneNumber","phoneNumber","isValidNumber","PHONE_NUMBER","test","getHydraId","destination","deconstructHydraId","type","id","cluster","UUID_REG","_ROOM_","room","_PEOPLE_","people","getSipUriFromHydraPersonId","get","then","res","emails","length","ParameterError","catch","err","getDestinationType","from","_PERSONAL_ROOM_","userId","device","orgId","options","VALID_EMAIL_ADDRESS","email","list","items","hydraId","_MEETING_LINK_","_SIP_URI_","_CONVERSATION_URL_","wasHydraPerson","resolve","SpaceIDDeprecatedError","getRequestBody","password","captchaInfo","installedOrgID","locusId","extraParams","body","DEFAULT_MEETING_INFO_REQUEST_BODY","sipUrl","_MEETING_ID_","meetingKey","conversationUrl","_LOCUS_ID_","info","webExMeetingId","meetingUrl","_MEETING_UUID_","meetingUUID","captchaID","captchaVerifyCode","code","getWebexSite","uri","exceptedDomains","site","match","getDirectMeetingInfoURI","preferredWebexSite","webExSite"],"sources":["utilv2.ts"],"sourcesContent":["import url from 'url';\n\nimport {\n // @ts-ignore\n deconstructHydraId,\n} from '@webex/common';\n\nimport {\n _SIP_URI_,\n _PERSONAL_ROOM_,\n _MEETING_ID_,\n _CONVERSATION_URL_,\n _LOCUS_ID_,\n _MEETING_LINK_,\n _PEOPLE_,\n _ROOM_,\n _MEETING_UUID_,\n DIALER_REGEX,\n WEBEX_DOT_COM,\n CONVERSATION_SERVICE,\n JOIN,\n MEET,\n MEET_M,\n HTTPS_PROTOCOL,\n UUID_REG,\n VALID_EMAIL_ADDRESS,\n DEFAULT_MEETING_INFO_REQUEST_BODY,\n} from '../constants';\nimport ParameterError from '../common/errors/parameter';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {SpaceIDDeprecatedError} from '../common/errors/webex-errors';\n\nconst MeetingInfoUtil: any = {};\nconst meetingInfoError =\n 'MeetingInfo is fetched with the meeting link, SIP URI, phone number, Hydra people ID, or a conversation URL.';\n\nMeetingInfoUtil.getParsedUrl = (link) => {\n try {\n let parsedUrl = url.parse(link);\n\n if (!parsedUrl) {\n return false;\n }\n // hack for links such as <company>.webex.com/meet/<user> without a protocol\n if (!parsedUrl.protocol) {\n parsedUrl = url.parse(`${HTTPS_PROTOCOL}${link}`);\n }\n\n return parsedUrl;\n } catch (error) {\n LoggerProxy.logger.warn(\n `Meeting-info:util#getParsedUrl --> unable to parse the URL, error: ${error}`\n );\n\n return null;\n }\n};\n\n/**\n * Helper function to check if a string matches a known meeting link pattern\n * @param {String} value string to parse and see if it matches a meeting link\n * @returns {Boolean}\n */\nMeetingInfoUtil.isMeetingLink = (value: string) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n const hostNameBool = parsedUrl.hostname && parsedUrl.hostname.includes(WEBEX_DOT_COM);\n const pathNameBool =\n parsedUrl.pathname &&\n (parsedUrl.pathname.includes(`/${MEET}`) ||\n parsedUrl.pathname.includes(`/${MEET_M}`) ||\n parsedUrl.pathname.includes(`/${JOIN}`));\n\n return hostNameBool && pathNameBool;\n};\n\nMeetingInfoUtil.isConversationUrl = (value, webex) => {\n const clusterId = webex.internal.services.getClusterId(value);\n\n if (clusterId) {\n return clusterId.endsWith(CONVERSATION_SERVICE);\n }\n\n return false;\n};\n\nMeetingInfoUtil.isSipUri = (sipString) => {\n // TODO: lets remove regex from this equation and user URI matchers and such\n // have not found a great sip uri parser library as of now\n const sipUri = DIALER_REGEX.SIP_ADDRESS.exec(sipString);\n\n return sipUri;\n};\n\nMeetingInfoUtil.isPhoneNumber = (phoneNumber) => {\n const isValidNumber = DIALER_REGEX.PHONE_NUMBER.test(phoneNumber);\n\n return isValidNumber;\n};\n\nMeetingInfoUtil.getHydraId = (destination) => {\n const {type, id, cluster} = deconstructHydraId(destination);\n\n if (id && UUID_REG.test(id)) {\n if (type === _ROOM_) {\n return {room: true, destination: id, cluster};\n }\n if (type === _PEOPLE_) {\n return {people: true, destination: id, cluster};\n }\n\n return {};\n }\n\n return {};\n};\n\nMeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) =>\n webex.people\n .get(destination)\n .then((res) => {\n if (res.emails && res.emails.length) {\n return res.emails[0];\n }\n throw new ParameterError('Hydra Id Lookup was an invalid hydra person id.');\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting-info:util#MeetingInfoUtil.getSipUriFromHydraPersonId --> getSipUriFromHydraPersonId ${err} `\n );\n throw err;\n });\n\nMeetingInfoUtil.getDestinationType = async (from) => {\n const {type, webex} = from;\n let {destination} = from;\n\n if (type === _PERSONAL_ROOM_) {\n // this case checks if your type is personal room\n if (!destination) {\n // if we are not getting anything in desination we fetch org and user ids from webex instance\n destination = {\n userId: webex.internal.device.userId,\n orgId: webex.internal.device.orgId,\n };\n } else {\n const options = VALID_EMAIL_ADDRESS.test(destination)\n ? {email: destination}\n : {id: destination}; // we are assuming userId as default\n const res = await webex.people.list(options);\n\n let {orgId, id: userId} = res.items[0];\n\n userId = deconstructHydraId(userId).id;\n orgId = deconstructHydraId(orgId).id;\n destination = {userId, orgId};\n }\n }\n if (type) {\n return {\n destination,\n type,\n };\n }\n const options: any = {};\n const hydraId = MeetingInfoUtil.getHydraId(destination);\n\n if (MeetingInfoUtil.isMeetingLink(destination)) {\n LoggerProxy.logger.warn(\n 'Meeting-info:util#generateOptions --> WARN, use of Meeting Link is deprecated, please use a SIP URI instead'\n );\n\n options.type = _MEETING_LINK_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isSipUri(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isPhoneNumber(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {\n options.type = _CONVERSATION_URL_;\n options.destination = destination;\n } else if (hydraId.people) {\n options.type = _SIP_URI_;\n\n return MeetingInfoUtil.getSipUriFromHydraPersonId(hydraId.destination, webex).then((res) => {\n options.destination = res;\n\n // Since hydra person ids require a unique case in which they are\n // entirely converted to a SIP URI, we need to set a flag for detecting\n // this type of destination.\n options.wasHydraPerson = true;\n\n return Promise.resolve(options);\n });\n } else if (hydraId.room) {\n LoggerProxy.logger.error(\n `Meeting-info:util#getDestinationType --> Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-guide-for-USM-meeting) to migrate to use the meeting ID or SIP address.`\n );\n // Error code 30105 added as Space ID deprecated as of beta, Please refer migration guide.\n throw new SpaceIDDeprecatedError();\n } else {\n LoggerProxy.logger.warn(`Meeting-info:util#getDestinationType --> ${meetingInfoError}`);\n throw new ParameterError(`${meetingInfoError}`);\n }\n\n return Promise.resolve(options);\n};\n\n/**\n * Helper function to build up a correct locus url depending on the value passed\n * @param {Object} options type and value to fetch meeting info\n * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {String} options.installedOrgID org ID of user's machine\n * @param {Object} options.destination ?? value.value\n * @returns {Object} returns an object with {resource, method}\n */\nMeetingInfoUtil.getRequestBody = (options: {type: string; destination: object} | any) => {\n const {type, destination, password, captchaInfo, installedOrgID, locusId, extraParams} = options;\n const body: any = {\n ...DEFAULT_MEETING_INFO_REQUEST_BODY,\n ...extraParams,\n };\n\n switch (type) {\n case _SIP_URI_:\n body.sipUrl = destination;\n break;\n case _PERSONAL_ROOM_:\n body.userId = destination.userId;\n body.orgId = destination.orgId;\n break;\n case _MEETING_ID_:\n body.meetingKey = destination;\n break;\n case _CONVERSATION_URL_:\n body.conversationUrl = destination;\n break;\n case _LOCUS_ID_:\n // use meetingID for the completer meeting info for the already started meeting\n if (destination.info?.webExMeetingId) {\n body.meetingKey = destination.info.webExMeetingId;\n } else if (destination.info?.sipUri) {\n body.sipUrl = destination.info.sipUri;\n }\n break;\n case _MEETING_LINK_:\n body.meetingUrl = destination;\n break;\n case _MEETING_UUID_: {\n body.meetingUUID = destination;\n break;\n }\n default:\n }\n\n if (password) {\n body.password = password;\n }\n\n if (captchaInfo) {\n body.captchaID = captchaInfo.id;\n body.captchaVerifyCode = captchaInfo.code;\n }\n\n if (installedOrgID) {\n body.installedOrgID = installedOrgID;\n }\n\n if (locusId) {\n body.locusId = locusId;\n }\n\n return body;\n};\n\n/**\n * Helper function to parse the webex site/host from a URI string.\n * @param {String} uri string (e.g. '10019857020@convergedats.webex.com')\n * @returns {String} the site/host part of the URI string (e.g. 'convergedats.webex.com')\n */\nMeetingInfoUtil.getWebexSite = (uri: string) => {\n const exceptedDomains = ['meet.webex.com', 'meetup.webex.com', 'ciscospark.com'];\n const site = uri?.match(/.+@([^.]+\\.[^.]+\\.[^.]+)$/)?.[1];\n\n return exceptedDomains.includes(site) ? null : site;\n};\n\n/**\n * Helper function to return the direct URI for fetching meeting info (to avoid a redirect).\n * @param {Object} options type and value to fetch meeting info\n * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {Object} options.destination ?? value.value\n * @returns {String} returns a URI string or null of there is no direct URI\n */\nMeetingInfoUtil.getDirectMeetingInfoURI = (options: {type: string; destination: any}) => {\n const {type, destination} = options;\n\n let preferredWebexSite = null;\n\n switch (type) {\n case _SIP_URI_:\n preferredWebexSite = MeetingInfoUtil.getWebexSite(destination);\n break;\n case _LOCUS_ID_:\n preferredWebexSite = destination.info?.webExSite;\n break;\n default:\n }\n\n return preferredWebexSite ? `https://${preferredWebexSite}/wbxappapi/v1/meetingInfo` : null;\n};\n\nexport default MeetingInfoUtil;\n"],"mappings":"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"}
1
+ {"version":3,"names":["MeetingInfoUtil","meetingInfoError","getParsedUrl","link","parsedUrl","url","parse","protocol","HTTPS_PROTOCOL","error","LoggerProxy","logger","warn","isMeetingLink","value","hostNameBool","hostname","includes","WEBEX_DOT_COM","pathNameBool","pathname","MEET","MEET_M","JOIN","isConversationUrl","webex","clusterId","internal","services","getClusterId","endsWith","CONVERSATION_SERVICE","isSipUri","sipString","sipUri","DIALER_REGEX","SIP_ADDRESS","exec","isPhoneNumber","phoneNumber","isValidNumber","PHONE_NUMBER","test","getHydraId","destination","deconstructHydraId","type","id","cluster","UUID_REG","_ROOM_","room","_PEOPLE_","people","getSipUriFromHydraPersonId","get","then","res","emails","length","ParameterError","catch","err","getDestinationType","from","_PERSONAL_ROOM_","userId","device","orgId","options","VALID_EMAIL_ADDRESS","email","list","items","hydraId","_MEETING_LINK_","_SIP_URI_","_CONVERSATION_URL_","wasHydraPerson","resolve","SpaceIDDeprecatedError","getRequestBody","password","captchaInfo","installedOrgID","locusId","extraParams","body","DEFAULT_MEETING_INFO_REQUEST_BODY","sipUrl","_MEETING_ID_","meetingKey","conversationUrl","_LOCUS_ID_","info","webExMeetingId","meetingUrl","_MEETING_UUID_","meetingUUID","captchaID","captchaVerifyCode","code","getWebexSite","uri","exceptedDomains","site","match","getDirectMeetingInfoURI","preferredWebexSite","webExSite"],"sources":["utilv2.ts"],"sourcesContent":["import url from 'url';\n\nimport {\n // @ts-ignore\n deconstructHydraId,\n} from '@webex/common';\n\nimport {\n _SIP_URI_,\n _PERSONAL_ROOM_,\n _MEETING_ID_,\n _CONVERSATION_URL_,\n _LOCUS_ID_,\n _MEETING_LINK_,\n _PEOPLE_,\n _ROOM_,\n _MEETING_UUID_,\n DIALER_REGEX,\n WEBEX_DOT_COM,\n CONVERSATION_SERVICE,\n JOIN,\n MEET,\n MEET_M,\n HTTPS_PROTOCOL,\n UUID_REG,\n VALID_EMAIL_ADDRESS,\n DEFAULT_MEETING_INFO_REQUEST_BODY,\n} from '../constants';\nimport ParameterError from '../common/errors/parameter';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {SpaceIDDeprecatedError} from '../common/errors/webex-errors';\n\nconst MeetingInfoUtil: any = {};\nconst meetingInfoError =\n 'MeetingInfo is fetched with the meeting link, SIP URI, phone number, Hydra people ID, or a conversation URL.';\n\nMeetingInfoUtil.getParsedUrl = (link) => {\n try {\n let parsedUrl = url.parse(link);\n\n if (!parsedUrl) {\n return false;\n }\n // hack for links such as <company>.webex.com/meet/<user> without a protocol\n if (!parsedUrl.protocol) {\n parsedUrl = url.parse(`${HTTPS_PROTOCOL}${link}`);\n }\n\n return parsedUrl;\n } catch (error) {\n LoggerProxy.logger.warn(\n `Meeting-info:util#getParsedUrl --> unable to parse the URL, error: ${error}`\n );\n\n return null;\n }\n};\n\n/**\n * Helper function to check if a string matches a known meeting link pattern\n * @param {String} value string to parse and see if it matches a meeting link\n * @returns {Boolean}\n */\nMeetingInfoUtil.isMeetingLink = (value: string) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n const hostNameBool = parsedUrl.hostname && parsedUrl.hostname.includes(WEBEX_DOT_COM);\n const pathNameBool =\n parsedUrl.pathname &&\n (parsedUrl.pathname.includes(`/${MEET}`) ||\n parsedUrl.pathname.includes(`/${MEET_M}`) ||\n parsedUrl.pathname.includes(`/${JOIN}`));\n\n return hostNameBool && pathNameBool;\n};\n\nMeetingInfoUtil.isConversationUrl = (value, webex) => {\n const clusterId = webex.internal.services.getClusterId(value);\n\n if (clusterId) {\n return clusterId.endsWith(CONVERSATION_SERVICE);\n }\n\n return false;\n};\n\nMeetingInfoUtil.isSipUri = (sipString) => {\n // TODO: lets remove regex from this equation and user URI matchers and such\n // have not found a great sip uri parser library as of now\n const sipUri = DIALER_REGEX.SIP_ADDRESS.exec(sipString);\n\n return sipUri;\n};\n\nMeetingInfoUtil.isPhoneNumber = (phoneNumber) => {\n const isValidNumber = DIALER_REGEX.PHONE_NUMBER.test(phoneNumber);\n\n return isValidNumber;\n};\n\nMeetingInfoUtil.getHydraId = (destination) => {\n const {type, id, cluster} = deconstructHydraId(destination);\n\n if (id && UUID_REG.test(id)) {\n if (type === _ROOM_) {\n return {room: true, destination: id, cluster};\n }\n if (type === _PEOPLE_) {\n return {people: true, destination: id, cluster};\n }\n\n return {};\n }\n\n return {};\n};\n\nMeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) =>\n webex.people\n .get(destination)\n .then((res) => {\n if (res.emails && res.emails.length) {\n return res.emails[0];\n }\n throw new ParameterError('Hydra Id Lookup was an invalid hydra person id.');\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting-info:util#MeetingInfoUtil.getSipUriFromHydraPersonId --> getSipUriFromHydraPersonId ${err} `\n );\n throw err;\n });\n\nMeetingInfoUtil.getDestinationType = async (from) => {\n const {type, webex} = from;\n let {destination} = from;\n\n if (type === _PERSONAL_ROOM_) {\n // this case checks if your type is personal room\n if (!destination) {\n // if we are not getting anything in desination we fetch org and user ids from webex instance\n destination = {\n userId: webex.internal.device.userId,\n orgId: webex.internal.device.orgId,\n };\n } else {\n const options = VALID_EMAIL_ADDRESS.test(destination)\n ? {email: destination}\n : {id: destination}; // we are assuming userId as default\n const res = await webex.people.list(options);\n\n let {orgId, id: userId} = res.items[0];\n\n userId = deconstructHydraId(userId).id;\n orgId = deconstructHydraId(orgId).id;\n destination = {userId, orgId};\n }\n }\n if (type) {\n return {\n destination,\n type,\n };\n }\n const options: any = {};\n const hydraId = MeetingInfoUtil.getHydraId(destination);\n\n if (MeetingInfoUtil.isMeetingLink(destination)) {\n LoggerProxy.logger.warn(\n 'Meeting-info:util#generateOptions --> WARN, use of Meeting Link is deprecated, please use a SIP URI instead'\n );\n\n options.type = _MEETING_LINK_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isSipUri(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isPhoneNumber(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n } else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {\n options.type = _CONVERSATION_URL_;\n options.destination = destination;\n } else if (hydraId.people) {\n options.type = _SIP_URI_;\n\n return MeetingInfoUtil.getSipUriFromHydraPersonId(hydraId.destination, webex).then((res) => {\n options.destination = res;\n\n // Since hydra person ids require a unique case in which they are\n // entirely converted to a SIP URI, we need to set a flag for detecting\n // this type of destination.\n options.wasHydraPerson = true;\n\n return Promise.resolve(options);\n });\n } else if (hydraId.room) {\n LoggerProxy.logger.error(\n `Meeting-info:util#getDestinationType --> Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.`\n );\n // Error code 30105 added as Space ID deprecated as of beta, Please refer migration guide.\n throw new SpaceIDDeprecatedError();\n } else {\n LoggerProxy.logger.warn(`Meeting-info:util#getDestinationType --> ${meetingInfoError}`);\n throw new ParameterError(`${meetingInfoError}`);\n }\n\n return Promise.resolve(options);\n};\n\n/**\n * Helper function to build up a correct locus url depending on the value passed\n * @param {Object} options type and value to fetch meeting info\n * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {String} options.installedOrgID org ID of user's machine\n * @param {Object} options.destination ?? value.value\n * @returns {Object} returns an object with {resource, method}\n */\nMeetingInfoUtil.getRequestBody = (options: {type: string; destination: object} | any) => {\n const {type, destination, password, captchaInfo, installedOrgID, locusId, extraParams} = options;\n const body: any = {\n ...DEFAULT_MEETING_INFO_REQUEST_BODY,\n ...extraParams,\n };\n\n switch (type) {\n case _SIP_URI_:\n body.sipUrl = destination;\n break;\n case _PERSONAL_ROOM_:\n body.userId = destination.userId;\n body.orgId = destination.orgId;\n break;\n case _MEETING_ID_:\n body.meetingKey = destination;\n break;\n case _CONVERSATION_URL_:\n body.conversationUrl = destination;\n break;\n case _LOCUS_ID_:\n // use meetingID for the completer meeting info for the already started meeting\n if (destination.info?.webExMeetingId) {\n body.meetingKey = destination.info.webExMeetingId;\n } else if (destination.info?.sipUri) {\n body.sipUrl = destination.info.sipUri;\n }\n break;\n case _MEETING_LINK_:\n body.meetingUrl = destination;\n break;\n case _MEETING_UUID_: {\n body.meetingUUID = destination;\n break;\n }\n default:\n }\n\n if (password) {\n body.password = password;\n }\n\n if (captchaInfo) {\n body.captchaID = captchaInfo.id;\n body.captchaVerifyCode = captchaInfo.code;\n }\n\n if (installedOrgID) {\n body.installedOrgID = installedOrgID;\n }\n\n if (locusId) {\n body.locusId = locusId;\n }\n\n return body;\n};\n\n/**\n * Helper function to parse the webex site/host from a URI string.\n * @param {String} uri string (e.g. '10019857020@convergedats.webex.com')\n * @returns {String} the site/host part of the URI string (e.g. 'convergedats.webex.com')\n */\nMeetingInfoUtil.getWebexSite = (uri: string) => {\n const exceptedDomains = ['meet.webex.com', 'meetup.webex.com', 'ciscospark.com'];\n const site = uri?.match(/.+@([^.]+\\.[^.]+\\.[^.]+)$/)?.[1];\n\n return exceptedDomains.includes(site) ? null : site;\n};\n\n/**\n * Helper function to return the direct URI for fetching meeting info (to avoid a redirect).\n * @param {Object} options type and value to fetch meeting info\n * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {Object} options.destination ?? value.value\n * @returns {String} returns a URI string or null of there is no direct URI\n */\nMeetingInfoUtil.getDirectMeetingInfoURI = (options: {type: string; destination: any}) => {\n const {type, destination} = options;\n\n let preferredWebexSite = null;\n\n switch (type) {\n case _SIP_URI_:\n preferredWebexSite = MeetingInfoUtil.getWebexSite(destination);\n break;\n case _LOCUS_ID_:\n preferredWebexSite = destination.info?.webExSite;\n break;\n default:\n }\n\n return preferredWebexSite ? `https://${preferredWebexSite}/wbxappapi/v1/meetingInfo` : null;\n};\n\nexport default MeetingInfoUtil;\n"],"mappings":"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"}
@@ -18,6 +18,8 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/
18
18
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
19
19
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
20
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
21
+ var _pick2 = _interopRequireDefault(require("lodash/pick"));
22
+ var _mapValues2 = _interopRequireDefault(require("lodash/mapValues"));
21
23
  var _uniq2 = _interopRequireDefault(require("lodash/uniq"));
22
24
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
23
25
  var _util = _interopRequireDefault(require("../meeting/util"));
@@ -25,6 +27,8 @@ var _constants = require("../constants");
25
27
  var _request = _interopRequireDefault(require("./request"));
26
28
  var DEFAULT_TIMEOUT = 3000;
27
29
  var VIDEO_MESH_TIMEOUT = 1000;
30
+
31
+ // result for a specific transport protocol (like udp or tcp)
28
32
  /**
29
33
  * @class Reachability
30
34
  * @export
@@ -122,6 +126,50 @@ var Reachability = /*#__PURE__*/function () {
122
126
  }
123
127
  return gatherReachability;
124
128
  }()
129
+ /**
130
+ * Reachability results as an object in the format that backend expects
131
+ *
132
+ * @returns {any} reachability results that need to be sent to the backend
133
+ */
134
+ }, {
135
+ key: "getReachabilityResults",
136
+ value: function () {
137
+ var _getReachabilityResults = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
138
+ var results, reachabilityResultsProps, resultsJson, internalResults;
139
+ return _regenerator.default.wrap(function _callee2$(_context2) {
140
+ while (1) switch (_context2.prev = _context2.next) {
141
+ case 0:
142
+ // these are the only props that backend needs in the reachability results:
143
+ reachabilityResultsProps = ['udp', 'tcp', 'xtls'];
144
+ _context2.prev = 1;
145
+ _context2.next = 4;
146
+ return this.webex.boundedStorage.get(_constants.REACHABILITY.namespace, _constants.REACHABILITY.localStorageResult);
147
+ case 4:
148
+ resultsJson = _context2.sent;
149
+ internalResults = JSON.parse(resultsJson);
150
+ results = (0, _mapValues2.default)(internalResults, function (result) {
151
+ return (0, _pick2.default)(result, reachabilityResultsProps);
152
+ });
153
+ _context2.next = 12;
154
+ break;
155
+ case 9:
156
+ _context2.prev = 9;
157
+ _context2.t0 = _context2["catch"](1);
158
+ // empty storage, that's ok
159
+ _loggerProxy.default.logger.warn('Roap:request#attachReachabilityData --> Error parsing reachability data: ', _context2.t0);
160
+ case 12:
161
+ return _context2.abrupt("return", results);
162
+ case 13:
163
+ case "end":
164
+ return _context2.stop();
165
+ }
166
+ }, _callee2, this, [[1, 9]]);
167
+ }));
168
+ function getReachabilityResults() {
169
+ return _getReachabilityResults.apply(this, arguments);
170
+ }
171
+ return getReachabilityResults;
172
+ }()
125
173
  /**
126
174
  * fetches reachability data and checks for cluster reachability
127
175
  * @returns {boolean}
@@ -129,40 +177,40 @@ var Reachability = /*#__PURE__*/function () {
129
177
  * @memberof Reachability
130
178
  */
131
179
  }, {
132
- key: "isAnyClusterReachable",
180
+ key: "isAnyPublicClusterReachable",
133
181
  value: function () {
134
- var _isAnyClusterReachable = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
182
+ var _isAnyPublicClusterReachable = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
135
183
  var reachable, reachabilityData, reachabilityResults;
136
- return _regenerator.default.wrap(function _callee2$(_context2) {
137
- while (1) switch (_context2.prev = _context2.next) {
184
+ return _regenerator.default.wrap(function _callee3$(_context3) {
185
+ while (1) switch (_context3.prev = _context3.next) {
138
186
  case 0:
139
187
  reachable = false; // @ts-ignore
140
- _context2.next = 3;
188
+ _context3.next = 3;
141
189
  return this.webex.boundedStorage.get(this.namespace, _constants.REACHABILITY.localStorageResult).catch(function () {});
142
190
  case 3:
143
- reachabilityData = _context2.sent;
191
+ reachabilityData = _context3.sent;
144
192
  if (reachabilityData) {
145
193
  try {
146
194
  reachabilityResults = JSON.parse(reachabilityData);
147
195
  reachable = (0, _values.default)(reachabilityResults).some(function (result) {
148
196
  var _result$udp, _result$tcp;
149
- return ((_result$udp = result.udp) === null || _result$udp === void 0 ? void 0 : _result$udp.reachable) === 'true' || ((_result$tcp = result.tcp) === null || _result$tcp === void 0 ? void 0 : _result$tcp.reachable) === 'true';
197
+ return !result.isVideoMesh && (((_result$udp = result.udp) === null || _result$udp === void 0 ? void 0 : _result$udp.reachable) === 'true' || ((_result$tcp = result.tcp) === null || _result$tcp === void 0 ? void 0 : _result$tcp.reachable) === 'true');
150
198
  });
151
199
  } catch (e) {
152
200
  _loggerProxy.default.logger.error("Roap:request#attachReachabilityData --> Error in parsing reachability data: ".concat(e));
153
201
  }
154
202
  }
155
- return _context2.abrupt("return", reachable);
203
+ return _context3.abrupt("return", reachable);
156
204
  case 6:
157
205
  case "end":
158
- return _context2.stop();
206
+ return _context3.stop();
159
207
  }
160
- }, _callee2, this);
208
+ }, _callee3, this);
161
209
  }));
162
- function isAnyClusterReachable() {
163
- return _isAnyClusterReachable.apply(this, arguments);
210
+ function isAnyPublicClusterReachable() {
211
+ return _isAnyPublicClusterReachable.apply(this, arguments);
164
212
  }
165
- return isAnyClusterReachable;
213
+ return isAnyPublicClusterReachable;
166
214
  }()
167
215
  /**
168
216
  * Generate peerConnection config settings
@@ -240,10 +288,10 @@ var Reachability = /*#__PURE__*/function () {
240
288
  var _this = this;
241
289
  var clusters = (0, _toConsumableArray2.default)((0, _keys.default)(clusterList));
242
290
  clusters = clusters.map( /*#__PURE__*/function () {
243
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(key) {
291
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(key) {
244
292
  var cluster, config, peerConnection, description;
245
- return _regenerator.default.wrap(function _callee3$(_context3) {
246
- while (1) switch (_context3.prev = _context3.next) {
293
+ return _regenerator.default.wrap(function _callee4$(_context4) {
294
+ while (1) switch (_context4.prev = _context4.next) {
247
295
  case 0:
248
296
  cluster = clusterList[key];
249
297
  config = _this.buildPeerConnectionConfig(cluster);
@@ -251,29 +299,29 @@ var Reachability = /*#__PURE__*/function () {
251
299
  key: key,
252
300
  config: config
253
301
  });
254
- _context3.next = 5;
302
+ _context4.next = 5;
255
303
  return peerConnection.createOffer({
256
304
  offerToReceiveAudio: true
257
305
  });
258
306
  case 5:
259
- description = _context3.sent;
307
+ description = _context4.sent;
260
308
  // @ts-ignore
261
309
  peerConnection.begin = (0, _now.default)();
262
310
  peerConnection.setLocalDescription(description);
263
- return _context3.abrupt("return", _this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT).catch(function (iceGatheringStateError) {
311
+ return _context4.abrupt("return", _this.iceGatheringState(peerConnection, cluster.isVideoMesh).catch(function (iceGatheringStateError) {
264
312
  _loggerProxy.default.logger.log("Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ".concat(iceGatheringStateError));
265
313
  }));
266
314
  case 9:
267
315
  case "end":
268
- return _context3.stop();
316
+ return _context4.stop();
269
317
  }
270
- }, _callee3);
318
+ }, _callee4);
271
319
  }));
272
320
  return function (_x) {
273
321
  return _ref.apply(this, arguments);
274
322
  };
275
323
  }());
276
- return _promise.default.all(clusters).then(this.parseIceResultsToReachabilityResults).then(function (reachabilityLatencyResults) {
324
+ return _promise.default.all(clusters).then(this.parseIceResultsToInternalReachabilityResults).then(function (reachabilityLatencyResults) {
277
325
  _this.logUnreachableClusters();
278
326
 
279
327
  // return results
@@ -357,14 +405,15 @@ var Reachability = /*#__PURE__*/function () {
357
405
  * speed.
358
406
  * @private
359
407
  * @param {RTCPeerConnection} peerConnection
360
- * @param {number} timeout
408
+ * @param {boolean} isVideoMesh
361
409
  * @returns {Promise}
362
410
  */
363
411
  }, {
364
412
  key: "iceGatheringState",
365
- value: function iceGatheringState(peerConnection, timeout) {
413
+ value: function iceGatheringState(peerConnection, isVideoMesh) {
366
414
  var _this4 = this;
367
415
  var ELAPSED = 'elapsed';
416
+ var timeout = isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT;
368
417
  return new _promise.default(function (resolve) {
369
418
  var peerConnectionProxy = new window.Proxy(peerConnection, {
370
419
  // eslint-disable-next-line require-jsdoc
@@ -378,9 +427,11 @@ var Reachability = /*#__PURE__*/function () {
378
427
  set: function set(target, property, value) {
379
428
  // only intercept elapsed property
380
429
  if (property === ELAPSED) {
381
- // @ts-ignore
382
430
  resolve({
431
+ // @ts-ignore
383
432
  clusterId: peerConnection.key,
433
+ isVideoMesh: isVideoMesh,
434
+ // @ts-ignore
384
435
  publicIPs: target.publicIPs,
385
436
  elapsed: value
386
437
  });
@@ -434,11 +485,12 @@ var Reachability = /*#__PURE__*/function () {
434
485
  * @memberof Reachability
435
486
  */
436
487
  }, {
437
- key: "parseIceResultsToReachabilityResults",
438
- value: function parseIceResultsToReachabilityResults(iceResults) {
488
+ key: "parseIceResultsToInternalReachabilityResults",
489
+ value: function parseIceResultsToInternalReachabilityResults(iceResults) {
439
490
  var reachabilityMap = {};
440
491
  iceResults.forEach(function (_ref2) {
441
492
  var clusterId = _ref2.clusterId,
493
+ isVideoMesh = _ref2.isVideoMesh,
442
494
  elapsed = _ref2.elapsed,
443
495
  publicIPs = _ref2.publicIPs;
444
496
  var latencyResult = {};
@@ -464,7 +516,8 @@ var Reachability = /*#__PURE__*/function () {
464
516
  },
465
517
  xtls: {
466
518
  untested: 'true'
467
- }
519
+ },
520
+ isVideoMesh: isVideoMesh
468
521
  };
469
522
  });
470
523
  return reachabilityMap;
@@ -473,7 +526,7 @@ var Reachability = /*#__PURE__*/function () {
473
526
  /**
474
527
  * fetches reachability data
475
528
  * @param {object} clusterList
476
- * @returns {Promise<localSDPData>} reachability check results
529
+ * @returns {Promise<InternalReachabilityResults>} reachability check results
477
530
  * @private
478
531
  * @memberof Reachability
479
532
  */
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","boundedStorage","del","localStorageResult","localStorageJoinCookie","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityCheck","results","put","LoggerProxy","logger","log","error","reachable","get","catch","reachabilityData","reachabilityResults","JSON","parse","some","result","udp","tcp","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","window","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","isVideoMesh","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","addPublicIP","address","timeout","ELAPSED","resolve","peerConnectionProxy","Proxy","target","property","targetMember","bind","set","value","clusterId","publicIPs","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","clientMediaIPs","untested","xtls","length","getLocalSDPForClusters","localSDPData","publicIP","modifiedPeerConnection","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\nexport type ICECandidateResult = {clusterId: string; elapsed?: string | null; publicIPs?: string[]};\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: any;\n clusterLatencyResults: any;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n public async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);\n\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (getClusterError) {\n LoggerProxy.logger.error(\n `Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`\n );\n\n return {};\n }\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true'\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n private buildPeerConnectionConfig(cluster: any) {\n const iceServers = _.uniq(cluster.udp).map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n return {\n iceServers: [...iceServers],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n private createPeerConnection(cluster: any) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n // @ts-ignore\n peerConnection.key = key;\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.log(\n `Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`\n );\n\n return null;\n }\n }\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n private getElapsedTime(peerConnection: any) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n private getLocalSDPForClusters(clusterList: object) {\n let clusters: any[] = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n // @ts-ignore\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(\n peerConnection,\n cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT\n ).catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(\n `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`\n );\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleOnIceCandidate(peerConnection: RTCPeerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n // order is important\n this.addPublicIP(peerConnection, e.candidate.address);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {number} timeout\n * @returns {Promise}\n */\n private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {\n const ELAPSED = 'elapsed';\n\n return new Promise<ICECandidateResult>((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n // eslint-disable-next-line require-jsdoc\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof targetMember === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n // @ts-ignore\n resolve({clusterId: peerConnection.key, publicIPs: target.publicIPs, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n },\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n // order is important\n this.addPublicIP(peerConnectionProxy, null);\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`\n );\n });\n }\n\n /**\n * Calculates time to establish connection\n * @param {Array<ICECandidateResult>} iceResults iceResults\n * @returns {object} reachabilityMap\n * @protected\n * @memberof Reachability\n */\n protected parseIceResultsToReachabilityResults(iceResults: Array<ICECandidateResult>) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed, publicIPs}) => {\n const latencyResult = {};\n\n if (!elapsed) {\n Object.assign(latencyResult, {reachable: 'false'});\n } else {\n Object.assign(latencyResult, {\n reachable: 'true',\n latencyInMilliseconds: elapsed.toString(),\n });\n }\n\n if (publicIPs) {\n Object.assign(latencyResult, {\n clientMediaIPs: publicIPs,\n });\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: {untested: 'true'},\n xtls: {untested: 'true'},\n };\n });\n\n return reachabilityMap;\n }\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n private performReachabilityCheck(clusterList: object) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log(\n 'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'\n );\n resolve({});\n } else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`\n );\n resolve({});\n });\n });\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {RTCPeerConnection} peerConnection\n * @param {string} publicIP\n * @returns {void}\n */\n protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {\n const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;\n const {CLOSED} = CONNECTION_STATE;\n\n if (modifiedPeerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`\n );\n }\n\n if (publicIP) {\n if (modifiedPeerConnection.publicIPs) {\n modifiedPeerConnection.publicIPs.push(publicIP);\n } else {\n modifiedPeerConnection.publicIPs = [publicIP];\n }\n } else {\n modifiedPeerConnection.publicIPs = null;\n }\n }\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n // @ts-ignore\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`\n );\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n // @ts-ignore\n peerConnection.elapsed = elapsed;\n }\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA;AACA;AAEA;AAEA;AAEA,IAAMA,eAAe,GAAG,IAAI;AAC5B,IAAMC,kBAAkB,GAAG,IAAI;AAG/B;AACA;AACA;AACA;AAHA,IAIqBC,YAAY;EAM/B;AACF;AACA;AACA;AACA;EACE,sBAAYC,KAAa,EAAE;IAAA;IAAA,iDAVfC,uBAAY,CAACC,SAAS;IAAA;IAAA;IAAA;IAWhC,IAAI,CAACF,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACG,mBAAmB,GAAG,IAAIC,gBAAmB,CAAC,IAAI,CAACJ,KAAK,CAAC;;IAE9D;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACK,qBAAqB,GAAG,CAAC,CAAC;EACjC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA;MAAA,kGAOA;QAAA;QAAA;UAAA;YAAA;cACE,IAAI,CAACC,KAAK,EAAE;;cAEZ;cACA;cAAA;cAAA,OACM,IAAI,CAACN,KAAK,CAACO,cAAc,CAACC,GAAG,CAAC,IAAI,CAACN,SAAS,EAAED,uBAAY,CAACQ,kBAAkB,CAAC;YAAA;cAAA;cAAA,OAE9E,IAAI,CAACT,KAAK,CAACO,cAAc,CAACC,GAAG,CAAC,IAAI,CAACN,SAAS,EAAED,uBAAY,CAACS,sBAAsB,CAAC;YAAA;cAAA;cAAA;cAAA,OAIjD,IAAI,CAACP,mBAAmB,CAACQ,WAAW,CACvEC,aAAW,CAACC,YAAY,CAAC,IAAI,CAACb,KAAK,CAAC,CACrC;YAAA;cAAA;cAFMc,QAAQ,yBAARA,QAAQ;cAAEC,UAAU,yBAAVA,UAAU;cAAA;cAAA,OAKL,IAAI,CAACC,wBAAwB,CAACF,QAAQ,CAAC;YAAA;cAAvDG,OAAO;cAAA;cAAA,OAGP,IAAI,CAACjB,KAAK,CAACO,cAAc,CAACW,GAAG,CACjC,IAAI,CAAChB,SAAS,EACdD,uBAAY,CAACQ,kBAAkB,EAC/B,wBAAeQ,OAAO,CAAC,CACxB;YAAA;cAAA;cAAA,OAEK,IAAI,CAACjB,KAAK,CAACO,cAAc,CAACW,GAAG,CACjC,IAAI,CAAChB,SAAS,EACdD,uBAAY,CAACS,sBAAsB,EACnC,wBAAeK,UAAU,CAAC,CAC3B;YAAA;cAEDI,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,yEAAyE,CAC1E;cAAC,iCAEKJ,OAAO;YAAA;cAAA;cAAA;cAEdE,oBAAW,CAACC,MAAM,CAACE,KAAK,kGAEvB;cAAC,iCAEK,CAAC,CAAC;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAEZ;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA;MAAA,qGAMA;QAAA;QAAA;UAAA;YAAA;cACMC,SAAS,GAAG,KAAK,EACrB;cAAA;cAAA,OAC+B,IAAI,CAACvB,KAAK,CAACO,cAAc,CACrDiB,GAAG,CAAC,IAAI,CAACtB,SAAS,EAAED,uBAAY,CAACQ,kBAAkB,CAAC,CACpDgB,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZC,gBAAgB;cAItB,IAAIA,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAmB,GAAGC,IAAI,CAACC,KAAK,CAACH,gBAAgB,CAAC;kBAExDH,SAAS,GAAG,qBAAcI,mBAAmB,CAAC,CAACG,IAAI,CACjD,UAACC,MAAW;oBAAA;oBAAA,OAAK,gBAAAA,MAAM,CAACC,GAAG,gDAAV,YAAYT,SAAS,MAAK,MAAM,IAAI,gBAAAQ,MAAM,CAACE,GAAG,gDAAV,YAAYV,SAAS,MAAK,MAAM;kBAAA,EACtF;gBACH,CAAC,CAAC,OAAOW,CAAC,EAAE;kBACVf,oBAAW,CAACC,MAAM,CAACE,KAAK,uFACyDY,CAAC,EACjF;gBACH;cACF;cAAC,kCAEMX,SAAS;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACjB;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,mCAAkCY,OAAY,EAAE;MAC9C,IAAMC,UAAU,GAAG,oBAAOD,OAAO,CAACH,GAAG,CAAC,CAACK,GAAG,CAAC,UAACC,GAAG;QAAA,OAAM;UACnDC,QAAQ,EAAE,EAAE;UACZC,UAAU,EAAE,EAAE;UACdC,IAAI,EAAE,CAACH,GAAG;QACZ,CAAC;MAAA,CAAC,CAAC;MAEH,OAAO;QACLF,UAAU,mCAAMA,UAAU,CAAC;QAC3BM,oBAAoB,EAAE,GAAG;QACzBC,kBAAkB,EAAE;MACtB,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8BAA6BR,OAAY,EAAE;MACzC,IAAOS,GAAG,GAAYT,OAAO,CAAtBS,GAAG;QAAEC,MAAM,GAAIV,OAAO,CAAjBU,MAAM;MAElB,IAAI;QACF,IAAMC,cAAc,GAAG,IAAIC,MAAM,CAACC,iBAAiB,CAACH,MAAM,CAAC;;QAE3D;QACAC,cAAc,CAACF,GAAG,GAAGA,GAAG;QAExB,OAAOE,cAAc;MACvB,CAAC,CAAC,OAAOG,mBAAmB,EAAE;QAC5B9B,oBAAW,CAACC,MAAM,CAACC,GAAG,sFAC0D4B,mBAAmB,EAClG;QAED,OAAO,IAAI;MACb;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,wBAAuBH,cAAmB,EAAE;MAC1C,IAAMI,SAAS,GAAGJ,cAAc,CAACK,KAAK;MAEtC,OAAOL,cAAc,CAACK,KAAK;MAE3B,OAAO,mBAAU,GAAGD,SAAS;IAC/B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,gCAA+BE,WAAmB,EAAE;MAAA;MAClD,IAAItC,QAAe,oCAAO,mBAAYsC,WAAW,CAAC,CAAC;MAEnDtC,QAAQ,GAAGA,QAAQ,CAACuB,GAAG;QAAA,mFAAC,kBAAOO,GAAG;UAAA;UAAA;YAAA;cAAA;gBAC1BT,OAAO,GAAGiB,WAAW,CAACR,GAAG,CAAC;gBAC1BC,MAAM,GAAG,KAAI,CAACQ,yBAAyB,CAAClB,OAAO,CAAC;gBAChDW,cAAc,GAAG,KAAI,CAACQ,oBAAoB,CAAC;kBAACV,GAAG,EAAHA,GAAG;kBAAEC,MAAM,EAANA;gBAAM,CAAC,CAAC;gBAAA;gBAAA,OACrCC,cAAc,CAACS,WAAW,CAAC;kBAACC,mBAAmB,EAAE;gBAAI,CAAC,CAAC;cAAA;gBAA3EC,WAAW;gBAEjB;gBACAX,cAAc,CAACK,KAAK,GAAG,mBAAU;gBACjCL,cAAc,CAACY,mBAAmB,CAACD,WAAW,CAAC;gBAAC,kCAEzC,KAAI,CAACE,iBAAiB,CAC3Bb,cAAc,EACdX,OAAO,CAACyB,WAAW,GAAG9D,kBAAkB,GAAGD,eAAe,CAC3D,CAAC4B,KAAK,CAAC,UAACoC,sBAAsB,EAAK;kBAClC1C,oBAAW,CAACC,MAAM,CAACC,GAAG,gFACoDwC,sBAAsB,EAC/F;gBACH,CAAC,CAAC;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA,CACH;QAAA;UAAA;QAAA;MAAA,IAAC;MAEF,OAAO,iBAAQC,GAAG,CAAChD,QAAQ,CAAC,CACzBiD,IAAI,CAAC,IAAI,CAACC,oCAAoC,CAAC,CAC/CD,IAAI,CAAC,UAACE,0BAA0B,EAAK;QACpC,KAAI,CAACC,sBAAsB,EAAE;;QAE7B;QACA,OAAOD,0BAA0B;MACnC,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,iCAAgC;MAC9B,IAAME,eAAe,GAAG,EAAE;MAC1B,IAAMrD,QAAQ,GAAG,IAAI,CAACT,qBAAqB;MAE3C,mBAAYS,QAAQ,CAAC,CAACsD,OAAO,CAAC,UAACxB,GAAG,EAAK;QACrC,IAAMT,OAAO,GAAGrB,QAAQ,CAAC8B,GAAG,CAAC;QAE7B,IAAIT,OAAO,CAACkC,WAAW,IAAI,CAAClC,OAAO,CAACZ,SAAS,EAAE;UAC7C4C,eAAe,CAACG,IAAI,CAAC1B,GAAG,CAAC;QAC3B;MACF,CAAC,CAAC;MAEF,OAAOuB,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,uCAAsCrB,cAAiC,EAAE;MAAA;MACvEA,cAAc,CAACyB,yBAAyB,GAAG,YAAM;QAC/C,IAAOC,QAAQ,GAAIC,8BAAmB,CAA/BD,QAAQ;QAEf,IAAI1B,cAAc,CAAC4B,kBAAkB,KAAKF,QAAQ,EAAE;UAClD,IAAMG,OAAO,GAAG,MAAI,CAACC,cAAc,CAAC9B,cAAc,CAAC;;UAEnD;UACA3B,oBAAW,CAACC,MAAM,CAACC,GAAG,EACpB;UAAA,+EACwEyB,cAAc,CAACF,GAAG,QAC1F+B,OAAO,CACR;UACD,MAAI,CAACE,kBAAkB,CAAC/B,cAAc,EAAE6B,OAAO,CAAC;QAClD;MACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,8BAA6B7B,cAAiC,EAAE;MAAA;MAC9DA,cAAc,CAACgC,cAAc,GAAG,UAAC5C,CAAC,EAAK;QACrC,IAAM6C,gBAAgB,GAAG,OAAO;QAEhC,IAAI7C,CAAC,CAAC8C,SAAS,IAAIC,MAAM,CAAC/C,CAAC,CAAC8C,SAAS,CAACE,IAAI,CAAC,CAACC,WAAW,EAAE,KAAKJ,gBAAgB,EAAE;UAC9E,IAAMJ,OAAO,GAAG,MAAI,CAACC,cAAc,CAAC9B,cAAc,CAAC;UAEnD3B,oBAAW,CAACC,MAAM,CAACC,GAAG,EACpB;UAAA,oEAC6DyB,cAAc,CAACF,GAAG,QAC/E+B,OAAO,CACR;UACD;UACA,MAAI,CAACS,WAAW,CAACtC,cAAc,EAAEZ,CAAC,CAAC8C,SAAS,CAACK,OAAO,CAAC;UACrD,MAAI,CAACR,kBAAkB,CAAC/B,cAAc,EAAE6B,OAAO,CAAC;QAClD;MACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,2BAA0B7B,cAAiC,EAAEwC,OAAe,EAAE;MAAA;MAC5E,IAAMC,OAAO,GAAG,SAAS;MAEzB,OAAO,qBAAgC,UAACC,OAAO,EAAK;QAClD,IAAMC,mBAAmB,GAAG,IAAI1C,MAAM,CAAC2C,KAAK,CAAC5C,cAAc,EAAE;UAC3D;UACAtB,GAAG,eAACmE,MAAM,EAAEC,QAAQ,EAAE;YACpB,IAAMC,YAAY,GAAGF,MAAM,CAACC,QAAQ,CAAC;YAErC,IAAI,OAAOC,YAAY,KAAK,UAAU,EAAE;cACtC,OAAOA,YAAY,CAACC,IAAI,CAACH,MAAM,CAAC;YAClC;YAEA,OAAOE,YAAY;UACrB,CAAC;UACDE,GAAG,EAAE,aAACJ,MAAM,EAAEC,QAAQ,EAAEI,KAAK,EAAK;YAChC;YACA,IAAIJ,QAAQ,KAAKL,OAAO,EAAE;cACxB;cACAC,OAAO,CAAC;gBAACS,SAAS,EAAEnD,cAAc,CAACF,GAAG;gBAAEsD,SAAS,EAAEP,MAAM,CAACO,SAAS;gBAAEvB,OAAO,EAAEqB;cAAK,CAAC,CAAC;cAErF,OAAO,IAAI;YACb;;YAEA;YACA,OAAOjD,MAAM,CAACoD,OAAO,CAACJ,GAAG,CAACJ,MAAM,EAAEC,QAAQ,EAAEI,KAAK,CAAC;UACpD;QACF,CAAC,CAAC;;QAEF;QACA;QACA,MAAI,CAACI,6BAA6B,CAACX,mBAAmB,CAAC;QACvD,MAAI,CAACY,oBAAoB,CAACZ,mBAAmB,CAAC;;QAE9C;QACA1C,MAAM,CAACuD,UAAU,CAAC,YAAM;UACtB,IAAOC,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;;UAEb;UACA,IAAId,mBAAmB,CAACgB,eAAe,KAAKF,MAAM,EAAE;YAClD;YACA,MAAI,CAACnB,WAAW,CAACK,mBAAmB,EAAE,IAAI,CAAC;YAC3C,MAAI,CAACZ,kBAAkB,CAACY,mBAAmB,EAAE,IAAI,CAAC;UACpD;QACF,CAAC,EAAEH,OAAO,CAAC;MACb,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,kCAAiC;MAC/B,IAAMoB,IAAI,GAAG,IAAI,CAACC,qBAAqB,EAAE;MAEzCD,IAAI,CAACtC,OAAO,CAAC,UAACjC,OAAO,EAAK;QACxBhB,oBAAW,CAACC,MAAM,CAACC,GAAG,8EACkDc,OAAO,OAC9E;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8CAA+CyE,UAAqC,EAAE;MACpF,IAAMC,eAAe,GAAG,CAAC,CAAC;MAE1BD,UAAU,CAACxC,OAAO,CAAC,iBAAqC;QAAA,IAAnC6B,SAAS,SAATA,SAAS;UAAEtB,OAAO,SAAPA,OAAO;UAAEuB,SAAS,SAATA,SAAS;QAChD,IAAMY,aAAa,GAAG,CAAC,CAAC;QAExB,IAAI,CAACnC,OAAO,EAAE;UACZ,qBAAcmC,aAAa,EAAE;YAACvF,SAAS,EAAE;UAAO,CAAC,CAAC;QACpD,CAAC,MAAM;UACL,qBAAcuF,aAAa,EAAE;YAC3BvF,SAAS,EAAE,MAAM;YACjBwF,qBAAqB,EAAEpC,OAAO,CAACqC,QAAQ;UACzC,CAAC,CAAC;QACJ;QAEA,IAAId,SAAS,EAAE;UACb,qBAAcY,aAAa,EAAE;YAC3BG,cAAc,EAAEf;UAClB,CAAC,CAAC;QACJ;QAEAW,eAAe,CAACZ,SAAS,CAAC,GAAG;UAC3BjE,GAAG,EAAE8E,aAAa;UAClB7E,GAAG,EAAE;YAACiF,QAAQ,EAAE;UAAM,CAAC;UACvBC,IAAI,EAAE;YAACD,QAAQ,EAAE;UAAM;QACzB,CAAC;MACH,CAAC,CAAC;MAEF,OAAOL,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,kCAAiCzD,WAAmB,EAAE;MAAA;MACpD,IAAI,CAACA,WAAW,IAAI,CAAC,mBAAYA,WAAW,CAAC,CAACgE,MAAM,EAAE;QACpD,OAAO,iBAAQ5B,OAAO,CAAC,CAAC,CAAC,CAAC;MAC5B;MAEA,OAAO,qBAAY,UAACA,OAAO,EAAK;QAC9B,MAAI,CAAC6B,sBAAsB,CAACjE,WAAW,CAAC,CACrCW,IAAI,CAAC,UAACuD,YAAY,EAAK;UACtB,IAAI,CAACA,YAAY,IAAI,CAAC,mBAAYA,YAAY,CAAC,CAACF,MAAM,EAAE;YACtD;YACAjG,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,uGAAuG,CACxG;YACDmE,OAAO,CAAC,CAAC,CAAC,CAAC;UACb,CAAC,MAAM;YACLA,OAAO,CAAC8B,YAAY,CAAC;UACvB;QACF,CAAC,CAAC,CACD7F,KAAK,CAAC,UAACH,KAAK,EAAK;UAChBH,oBAAW,CAACC,MAAM,CAACE,KAAK,4FAC8DA,KAAK,EAC1F;UACDkE,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;MACN,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,qBAAsB1C,cAAiC,EAAEyE,QAAwB,EAAE;MACjF,IAAMC,sBAAkE,GAAG1E,cAAc;MACzF,IAAOyD,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;MAEb,IAAIiB,sBAAsB,CAACf,eAAe,KAAKF,MAAM,EAAE;QACrDpF,oBAAW,CAACC,MAAM,CAACC,GAAG,4EACgDkG,QAAQ,gCAC7E;MACH;MAEA,IAAIA,QAAQ,EAAE;QACZ,IAAIC,sBAAsB,CAACtB,SAAS,EAAE;UACpCsB,sBAAsB,CAACtB,SAAS,CAAC5B,IAAI,CAACiD,QAAQ,CAAC;QACjD,CAAC,MAAM;UACLC,sBAAsB,CAACtB,SAAS,GAAG,CAACqB,QAAQ,CAAC;QAC/C;MACF,CAAC,MAAM;QACLC,sBAAsB,CAACtB,SAAS,GAAG,IAAI;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,4BAA2BpD,cAAiC,EAAE6B,OAAe,EAAE;MAAA;MAC7E,IAAM8C,SAAS,GAAG,WAAW;MAC7B,IAAMC,WAAW,GAAG,aAAa;MACjC,IAAOnB,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;MACb;MACA,IAAO3D,GAAG,GAAIE,cAAc,CAArBF,GAAG;MACV,IAAM+E,SAAS,GAAGhD,OAAO,KAAK,IAAI,GAAG+C,WAAW,GAAGD,SAAS;MAC5D,IAAMG,WAAW,mEAAKH,SAAS,EAAG,CAAC,+CAAGC,WAAW,EAAG,CAAC,gBAAC;MAEtD,IAAI5E,cAAc,CAAC2D,eAAe,KAAKF,MAAM,EAAE;QAC7CpF,oBAAW,CAACC,MAAM,CAACC,GAAG,kFACsDsD,OAAO,gCAClF;QAED;MACF;MAEA,IAAI,CAACtE,qBAAqB,CAACuC,GAAG,CAAC,GAAG,IAAI,CAACvC,qBAAqB,CAACuC,GAAG,CAAC,IAAIgF,WAAW;MAChF,IAAI,CAACvH,qBAAqB,CAACuC,GAAG,CAAC,CAAC+E,SAAS,CAAC,IAAI,CAAC;;MAE/C;MACA;MACA7E,cAAc,CAACgC,cAAc,GAAG,IAAI;MACpChC,cAAc,CAAC+E,KAAK,EAAE;MACtB;MACA/E,cAAc,CAAC6B,OAAO,GAAGA,OAAO;IAClC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,iBAAgB;MACd,IAAI,CAACtE,qBAAqB,GAAG,CAAC,CAAC;IACjC;EAAC;EAAA;AAAA;AAAA"}
1
+ {"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","boundedStorage","del","localStorageResult","localStorageJoinCookie","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityCheck","results","put","LoggerProxy","logger","log","error","reachabilityResultsProps","get","resultsJson","internalResults","JSON","parse","result","warn","reachable","catch","reachabilityData","reachabilityResults","some","isVideoMesh","udp","tcp","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","window","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","iceGatheringStateError","all","then","parseIceResultsToInternalReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","addPublicIP","address","ELAPSED","timeout","resolve","peerConnectionProxy","Proxy","target","property","targetMember","bind","set","value","clusterId","publicIPs","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","clientMediaIPs","untested","xtls","length","getLocalSDPForClusters","localSDPData","publicIP","modifiedPeerConnection","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport {uniq, mapValues, pick} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n reachable: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\n// reachability result for a specifc media cluster\ntype ReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: {\n untested: 'true';\n };\n};\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResults = Record<string, ReachabilityResult>;\n\n// this is the type used by Reachability class internally and stored in local storage\ntype InternalReachabilityResults = Record<\n string,\n ReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ICECandidateResult = {\n clusterId: string;\n isVideoMesh: boolean;\n elapsed?: string | null;\n publicIPs?: string[];\n};\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: any;\n clusterLatencyResults: any;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<InternalReachabilityResults> {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);\n\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (getClusterError) {\n LoggerProxy.logger.error(\n `Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`\n );\n\n return {};\n }\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResults | undefined> {\n let results: ReachabilityResults;\n\n // these are the only props that backend needs in the reachability results:\n const reachabilityResultsProps: Array<keyof ReachabilityResult> = ['udp', 'tcp', 'xtls'];\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(internalResults, (result) => pick(result, reachabilityResultsProps));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: InternalReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.reachable === 'true' || result.tcp?.reachable === 'true')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n private buildPeerConnectionConfig(cluster: any) {\n const iceServers = uniq(cluster.udp).map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n return {\n iceServers: [...iceServers],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n private createPeerConnection(cluster: any) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n // @ts-ignore\n peerConnection.key = key;\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.log(\n `Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`\n );\n\n return null;\n }\n }\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n private getElapsedTime(peerConnection: any) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n private getLocalSDPForClusters(clusterList: object): Promise<InternalReachabilityResults> {\n let clusters: any[] = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n // @ts-ignore\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection, cluster.isVideoMesh).catch(\n (iceGatheringStateError) => {\n LoggerProxy.logger.log(\n `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`\n );\n }\n );\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToInternalReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleOnIceCandidate(peerConnection: RTCPeerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n // order is important\n this.addPublicIP(peerConnection, e.candidate.address);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {boolean} isVideoMesh\n * @returns {Promise}\n */\n private iceGatheringState(peerConnection: RTCPeerConnection, isVideoMesh: boolean) {\n const ELAPSED = 'elapsed';\n\n const timeout = isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT;\n\n return new Promise<ICECandidateResult>((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n // eslint-disable-next-line require-jsdoc\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof targetMember === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({\n // @ts-ignore\n clusterId: peerConnection.key,\n isVideoMesh,\n // @ts-ignore\n publicIPs: target.publicIPs,\n elapsed: value,\n });\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n },\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n // order is important\n this.addPublicIP(peerConnectionProxy, null);\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`\n );\n });\n }\n\n /**\n * Calculates time to establish connection\n * @param {Array<ICECandidateResult>} iceResults iceResults\n * @returns {object} reachabilityMap\n * @protected\n * @memberof Reachability\n */\n protected parseIceResultsToInternalReachabilityResults(\n iceResults: Array<ICECandidateResult>\n ): InternalReachabilityResults {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, isVideoMesh, elapsed, publicIPs}) => {\n const latencyResult = {};\n\n if (!elapsed) {\n Object.assign(latencyResult, {reachable: 'false'});\n } else {\n Object.assign(latencyResult, {\n reachable: 'true',\n latencyInMilliseconds: elapsed.toString(),\n });\n }\n\n if (publicIPs) {\n Object.assign(latencyResult, {\n clientMediaIPs: publicIPs,\n });\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: {untested: 'true'},\n xtls: {untested: 'true'},\n isVideoMesh,\n };\n });\n\n return reachabilityMap;\n }\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<InternalReachabilityResults>} reachability check results\n * @private\n * @memberof Reachability\n */\n private performReachabilityCheck(clusterList: object): Promise<InternalReachabilityResults> {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log(\n 'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'\n );\n resolve({});\n } else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`\n );\n resolve({});\n });\n });\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {RTCPeerConnection} peerConnection\n * @param {string} publicIP\n * @returns {void}\n */\n protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {\n const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;\n const {CLOSED} = CONNECTION_STATE;\n\n if (modifiedPeerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`\n );\n }\n\n if (publicIP) {\n if (modifiedPeerConnection.publicIPs) {\n modifiedPeerConnection.publicIPs.push(publicIP);\n } else {\n modifiedPeerConnection.publicIPs = [publicIP];\n }\n } else {\n modifiedPeerConnection.publicIPs = null;\n }\n }\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n // @ts-ignore\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`\n );\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n // @ts-ignore\n peerConnection.elapsed = elapsed;\n }\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
@@ -42,7 +42,7 @@ function ReachabilityRequest(webex) {
42
42
  joinCookie = _res$body.joinCookie;
43
43
  (0, _keys.default)(clusters).forEach(function (key) {
44
44
  var _res$body$clusterClas, _res$body$clusterClas2;
45
- clusters[key].isVideoMesh = (_res$body$clusterClas = res.body.clusterClasses) === null || _res$body$clusterClas === void 0 ? void 0 : (_res$body$clusterClas2 = _res$body$clusterClas.hybridMedia) === null || _res$body$clusterClas2 === void 0 ? void 0 : _res$body$clusterClas2.includes(key);
45
+ clusters[key].isVideoMesh = !!((_res$body$clusterClas = res.body.clusterClasses) !== null && _res$body$clusterClas !== void 0 && (_res$body$clusterClas2 = _res$body$clusterClas.hybridMedia) !== null && _res$body$clusterClas2 !== void 0 && _res$body$clusterClas2.includes(key));
46
46
  });
47
47
  _loggerProxy.default.logger.log("Reachability:request#getClusters --> get clusters (ipver=".concat(ipVersion, ") successful:").concat((0, _stringify.default)(clusters)));
48
48
  return {