@webex/plugin-meetings 3.11.0-next.3 → 3.11.0-next.30

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.
Files changed (99) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +5 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/hashTree/hashTree.js +18 -0
  6. package/dist/hashTree/hashTree.js.map +1 -1
  7. package/dist/hashTree/hashTreeParser.js +603 -266
  8. package/dist/hashTree/hashTreeParser.js.map +1 -1
  9. package/dist/hashTree/types.js +4 -2
  10. package/dist/hashTree/types.js.map +1 -1
  11. package/dist/hashTree/utils.js +10 -0
  12. package/dist/hashTree/utils.js.map +1 -1
  13. package/dist/index.js +2 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/interceptors/constant.js +12 -0
  16. package/dist/interceptors/constant.js.map +1 -0
  17. package/dist/interceptors/dataChannelAuthToken.js +233 -0
  18. package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
  19. package/dist/interceptors/index.js +7 -0
  20. package/dist/interceptors/index.js.map +1 -1
  21. package/dist/interpretation/index.js +1 -1
  22. package/dist/interpretation/siLanguage.js +1 -1
  23. package/dist/locus-info/index.js +80 -44
  24. package/dist/locus-info/index.js.map +1 -1
  25. package/dist/locus-info/types.js.map +1 -1
  26. package/dist/media/MediaConnectionAwaiter.js +57 -1
  27. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  28. package/dist/media/properties.js +4 -2
  29. package/dist/media/properties.js.map +1 -1
  30. package/dist/meeting/index.js +134 -40
  31. package/dist/meeting/index.js.map +1 -1
  32. package/dist/meeting/request.js +50 -0
  33. package/dist/meeting/request.js.map +1 -1
  34. package/dist/meeting/request.type.js.map +1 -1
  35. package/dist/meeting/util.js +108 -2
  36. package/dist/meeting/util.js.map +1 -1
  37. package/dist/meetings/index.js +76 -34
  38. package/dist/meetings/index.js.map +1 -1
  39. package/dist/metrics/constants.js +2 -1
  40. package/dist/metrics/constants.js.map +1 -1
  41. package/dist/multistream/mediaRequestManager.js +1 -1
  42. package/dist/multistream/mediaRequestManager.js.map +1 -1
  43. package/dist/multistream/remoteMediaManager.js +11 -0
  44. package/dist/multistream/remoteMediaManager.js.map +1 -1
  45. package/dist/reactions/reactions.type.js.map +1 -1
  46. package/dist/types/config.d.ts +3 -0
  47. package/dist/types/hashTree/hashTree.d.ts +7 -0
  48. package/dist/types/hashTree/hashTreeParser.d.ts +83 -12
  49. package/dist/types/hashTree/types.d.ts +3 -0
  50. package/dist/types/hashTree/utils.d.ts +6 -0
  51. package/dist/types/interceptors/constant.d.ts +5 -0
  52. package/dist/types/interceptors/dataChannelAuthToken.d.ts +35 -0
  53. package/dist/types/interceptors/index.d.ts +2 -1
  54. package/dist/types/locus-info/index.d.ts +9 -2
  55. package/dist/types/locus-info/types.d.ts +1 -0
  56. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  57. package/dist/types/media/properties.d.ts +2 -1
  58. package/dist/types/meeting/index.d.ts +27 -5
  59. package/dist/types/meeting/request.d.ts +16 -1
  60. package/dist/types/meeting/request.type.d.ts +5 -0
  61. package/dist/types/meeting/util.d.ts +28 -0
  62. package/dist/types/meetings/index.d.ts +3 -1
  63. package/dist/types/metrics/constants.d.ts +1 -0
  64. package/dist/types/reactions/reactions.type.d.ts +1 -0
  65. package/dist/webinar/index.js +1 -1
  66. package/package.json +22 -22
  67. package/src/config.ts +3 -0
  68. package/src/hashTree/hashTree.ts +17 -0
  69. package/src/hashTree/hashTreeParser.ts +525 -188
  70. package/src/hashTree/types.ts +4 -0
  71. package/src/hashTree/utils.ts +9 -0
  72. package/src/index.ts +6 -1
  73. package/src/interceptors/constant.ts +6 -0
  74. package/src/interceptors/dataChannelAuthToken.ts +142 -0
  75. package/src/interceptors/index.ts +2 -1
  76. package/src/locus-info/index.ts +110 -35
  77. package/src/locus-info/types.ts +1 -0
  78. package/src/media/MediaConnectionAwaiter.ts +41 -1
  79. package/src/media/properties.ts +3 -1
  80. package/src/meeting/index.ts +101 -22
  81. package/src/meeting/request.ts +42 -0
  82. package/src/meeting/request.type.ts +6 -0
  83. package/src/meeting/util.ts +132 -1
  84. package/src/meetings/index.ts +88 -7
  85. package/src/metrics/constants.ts +1 -0
  86. package/src/multistream/mediaRequestManager.ts +1 -1
  87. package/src/multistream/remoteMediaManager.ts +13 -0
  88. package/src/reactions/reactions.type.ts +1 -0
  89. package/test/unit/spec/hashTree/hashTree.ts +66 -0
  90. package/test/unit/spec/hashTree/hashTreeParser.ts +1594 -162
  91. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +141 -0
  92. package/test/unit/spec/locus-info/index.js +173 -45
  93. package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
  94. package/test/unit/spec/media/properties.ts +12 -3
  95. package/test/unit/spec/meeting/index.js +414 -62
  96. package/test/unit/spec/meeting/request.js +64 -0
  97. package/test/unit/spec/meeting/utils.js +294 -22
  98. package/test/unit/spec/meetings/index.js +550 -10
  99. package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.RETRY_KEY = exports.RETRY_INTERVAL = exports.MAX_RETRY = exports.DATA_CHANNEL_AUTH_HEADER = void 0;
8
+ var DATA_CHANNEL_AUTH_HEADER = exports.DATA_CHANNEL_AUTH_HEADER = 'Data-Channel-Auth-Token';
9
+ var MAX_RETRY = exports.MAX_RETRY = 1;
10
+ var RETRY_INTERVAL = exports.RETRY_INTERVAL = 2000;
11
+ var RETRY_KEY = exports.RETRY_KEY = '_dcRetryKey';
12
+ //# sourceMappingURL=constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DATA_CHANNEL_AUTH_HEADER","exports","MAX_RETRY","RETRY_INTERVAL","RETRY_KEY"],"sources":["constant.ts"],"sourcesContent":["const DATA_CHANNEL_AUTH_HEADER = 'Data-Channel-Auth-Token';\nconst MAX_RETRY = 1;\nconst RETRY_INTERVAL = 2000;\nconst RETRY_KEY = '_dcRetryKey';\n\nexport {DATA_CHANNEL_AUTH_HEADER, MAX_RETRY, RETRY_INTERVAL, RETRY_KEY};\n"],"mappings":";;;;;;;AAAA,IAAMA,wBAAwB,GAAAC,OAAA,CAAAD,wBAAA,GAAG,yBAAyB;AAC1D,IAAME,SAAS,GAAAD,OAAA,CAAAC,SAAA,GAAG,CAAC;AACnB,IAAMC,cAAc,GAAAF,OAAA,CAAAE,cAAA,GAAG,IAAI;AAC3B,IAAMC,SAAS,GAAAH,OAAA,CAAAG,SAAA,GAAG,aAAa","ignoreList":[]}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
13
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
14
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
15
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
17
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
18
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
19
+ var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
20
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
21
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
22
+ var _httpCore = require("@webex/http-core");
23
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
24
+ var _constant = require("./constant");
25
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
26
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*!
27
+ * Copyright (c) 2015-2026 Cisco Systems, Inc. See LICENSE file.
28
+ */
29
+ /*!
30
+ * Copyright (c) 2015-2026 Cisco Systems, Inc. See LICENSE file.
31
+ */
32
+
33
+ var retryCountMap = new _map.default();
34
+ /**
35
+ * @class
36
+ */
37
+ var DataChannelAuthTokenInterceptor = exports.default = /*#__PURE__*/function (_Interceptor) {
38
+ function DataChannelAuthTokenInterceptor(options) {
39
+ var _this;
40
+ (0, _classCallCheck2.default)(this, DataChannelAuthTokenInterceptor);
41
+ _this = _callSuper(this, DataChannelAuthTokenInterceptor, [options]);
42
+ (0, _defineProperty2.default)(_this, "_refreshDataChannelToken", void 0);
43
+ (0, _defineProperty2.default)(_this, "_isDataChannelTokenEnabled", void 0);
44
+ _this._refreshDataChannelToken = options.refreshDataChannelToken;
45
+ _this._isDataChannelTokenEnabled = options.isDataChannelTokenEnabled;
46
+ return _this;
47
+ }
48
+
49
+ /**
50
+ * @returns {DataChannelAuthTokenInterceptor}
51
+ */
52
+ (0, _inherits2.default)(DataChannelAuthTokenInterceptor, _Interceptor);
53
+ return (0, _createClass2.default)(DataChannelAuthTokenInterceptor, [{
54
+ key: "getRetryKey",
55
+ value: function getRetryKey(options) {
56
+ if (!options[_constant.RETRY_KEY]) {
57
+ options[_constant.RETRY_KEY] = "".concat((0, _now.default)(), "-").concat(Math.random());
58
+ }
59
+ return options[_constant.RETRY_KEY];
60
+ }
61
+
62
+ // Helper function to get header value case insensitively
63
+ }, {
64
+ key: "getHeader",
65
+ value: function getHeader(headers, name) {
66
+ var key = (0, _keys.default)(headers).find(function (k) {
67
+ return k.toLowerCase() === name.toLowerCase();
68
+ });
69
+ return key ? headers[key] : undefined;
70
+ }
71
+
72
+ /**
73
+ * Intercept responses and, on 401/403 with `Data-Channel-Auth-Token` header,
74
+ * attempt to refresh the data channel token and retry the original request once.
75
+ *
76
+ * @param {Object} options
77
+ * @param {Object} reason
78
+ * @returns {Promise<HttpResponse>}
79
+ */
80
+ }, {
81
+ key: "onResponseError",
82
+ value: (function () {
83
+ var _onResponseError = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(options, reason) {
84
+ var token, enabled, key, retryCount;
85
+ return _regenerator.default.wrap(function (_context) {
86
+ while (1) switch (_context.prev = _context.next) {
87
+ case 0:
88
+ token = this.getHeader(options.headers, _constant.DATA_CHANNEL_AUTH_HEADER);
89
+ _context.next = 1;
90
+ return this._isDataChannelTokenEnabled();
91
+ case 1:
92
+ enabled = _context.sent;
93
+ if (!(!token || !enabled)) {
94
+ _context.next = 2;
95
+ break;
96
+ }
97
+ return _context.abrupt("return", _promise.default.reject(reason));
98
+ case 2:
99
+ if (!(reason.statusCode !== 401 && reason.statusCode !== 403)) {
100
+ _context.next = 3;
101
+ break;
102
+ }
103
+ return _context.abrupt("return", _promise.default.reject(reason));
104
+ case 3:
105
+ key = this.getRetryKey(options);
106
+ retryCount = retryCountMap.get(key) || 0;
107
+ if (!(retryCount >= _constant.MAX_RETRY)) {
108
+ _context.next = 4;
109
+ break;
110
+ }
111
+ _loggerProxy.default.logger.error("data channel token refresh exceeded max retry (".concat(_constant.MAX_RETRY, ")"));
112
+ retryCountMap.delete(key);
113
+ return _context.abrupt("return", _promise.default.reject(reason));
114
+ case 4:
115
+ retryCountMap.set(key, retryCount + 1);
116
+ return _context.abrupt("return", this.refreshTokenAndRetryWithDelay(options));
117
+ case 5:
118
+ case "end":
119
+ return _context.stop();
120
+ }
121
+ }, _callee, this);
122
+ }));
123
+ function onResponseError(_x, _x2) {
124
+ return _onResponseError.apply(this, arguments);
125
+ }
126
+ return onResponseError;
127
+ }()
128
+ /**
129
+ * Retry the failed data channel request after a delay.
130
+ * Refreshes the Data-Channel-Auth-Token and re-sends the original request.
131
+ *
132
+ * @param {Object} options - Original request options.
133
+ * @returns {Promise<HttpResponse>} - Resolves on successful retry.
134
+ */
135
+ )
136
+ }, {
137
+ key: "refreshTokenAndRetryWithDelay",
138
+ value: function refreshTokenAndRetryWithDelay(options) {
139
+ var _this2 = this;
140
+ return new _promise.default(function (resolve, reject) {
141
+ setTimeout(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
142
+ var key, newToken, res, msg, err, _t;
143
+ return _regenerator.default.wrap(function (_context2) {
144
+ while (1) switch (_context2.prev = _context2.next) {
145
+ case 0:
146
+ key = _this2.getRetryKey(options);
147
+ _context2.prev = 1;
148
+ _context2.next = 2;
149
+ return _this2._refreshDataChannelToken();
150
+ case 2:
151
+ newToken = _context2.sent;
152
+ options.headers[_constant.DATA_CHANNEL_AUTH_HEADER] = newToken;
153
+
154
+ // @ts-ignore
155
+ _context2.next = 3;
156
+ return _this2.webex.request(options);
157
+ case 3:
158
+ res = _context2.sent;
159
+ retryCountMap.delete(key);
160
+ resolve(res);
161
+ _context2.next = 5;
162
+ break;
163
+ case 4:
164
+ _context2.prev = 4;
165
+ _t = _context2["catch"](1);
166
+ retryCountMap.delete(key);
167
+ msg = (_t === null || _t === void 0 ? void 0 : _t.message) || String(_t);
168
+ err = new Error("DataChannel token refresh failed: ".concat(msg));
169
+ err.statusCode = _t === null || _t === void 0 ? void 0 : _t.statusCode;
170
+ err.original = _t;
171
+ reject(err);
172
+ case 5:
173
+ case "end":
174
+ return _context2.stop();
175
+ }
176
+ }, _callee2, null, [[1, 4]]);
177
+ })), _constant.RETRY_INTERVAL);
178
+ });
179
+ }
180
+ }], [{
181
+ key: "create",
182
+ value: function create() {
183
+ var _this3 = this;
184
+ // @ts-ignore
185
+ return new DataChannelAuthTokenInterceptor({
186
+ webex: this,
187
+ isDataChannelTokenEnabled: function () {
188
+ var _isDataChannelTokenEnabled = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
189
+ return _regenerator.default.wrap(function (_context3) {
190
+ while (1) switch (_context3.prev = _context3.next) {
191
+ case 0:
192
+ return _context3.abrupt("return", _this3.internal.llm.isDataChannelTokenEnabled());
193
+ case 1:
194
+ case "end":
195
+ return _context3.stop();
196
+ }
197
+ }, _callee3);
198
+ }));
199
+ function isDataChannelTokenEnabled() {
200
+ return _isDataChannelTokenEnabled.apply(this, arguments);
201
+ }
202
+ return isDataChannelTokenEnabled;
203
+ }(),
204
+ refreshDataChannelToken: function () {
205
+ var _refreshDataChannelToken = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
206
+ var _yield$_this3$interna, body, _ref2, datachannelToken, dataChannelTokenType;
207
+ return _regenerator.default.wrap(function (_context4) {
208
+ while (1) switch (_context4.prev = _context4.next) {
209
+ case 0:
210
+ _context4.next = 1;
211
+ return _this3.internal.llm.refreshDataChannelToken();
212
+ case 1:
213
+ _yield$_this3$interna = _context4.sent;
214
+ body = _yield$_this3$interna.body;
215
+ _ref2 = body !== null && body !== void 0 ? body : {}, datachannelToken = _ref2.datachannelToken, dataChannelTokenType = _ref2.dataChannelTokenType; // @ts-ignore
216
+ _this3.internal.llm.setDatachannelToken(datachannelToken, dataChannelTokenType);
217
+ return _context4.abrupt("return", datachannelToken);
218
+ case 2:
219
+ case "end":
220
+ return _context4.stop();
221
+ }
222
+ }, _callee4);
223
+ }));
224
+ function refreshDataChannelToken() {
225
+ return _refreshDataChannelToken.apply(this, arguments);
226
+ }
227
+ return refreshDataChannelToken;
228
+ }()
229
+ });
230
+ }
231
+ }]);
232
+ }(_httpCore.Interceptor);
233
+ //# sourceMappingURL=dataChannelAuthToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_httpCore","require","_loggerProxy","_interopRequireDefault","_constant","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","retryCountMap","_map","DataChannelAuthTokenInterceptor","exports","_Interceptor","options","_this","_classCallCheck2","_defineProperty2","_refreshDataChannelToken","refreshDataChannelToken","_isDataChannelTokenEnabled","isDataChannelTokenEnabled","_inherits2","_createClass2","key","value","getRetryKey","RETRY_KEY","concat","_now","Math","random","getHeader","headers","name","_keys","find","k","toLowerCase","undefined","_onResponseError","_asyncToGenerator2","_regenerator","mark","_callee","reason","token","enabled","retryCount","wrap","_context","prev","next","DATA_CHANNEL_AUTH_HEADER","sent","abrupt","_promise","reject","statusCode","get","MAX_RETRY","LoggerProxy","logger","error","delete","set","refreshTokenAndRetryWithDelay","stop","onResponseError","_x","_x2","arguments","_this2","resolve","setTimeout","_callee2","newToken","res","msg","err","_t","_context2","webex","request","message","String","Error","original","RETRY_INTERVAL","create","_this3","_callee3","_context3","internal","llm","_callee4","_yield$_this3$interna","body","_ref2","datachannelToken","dataChannelTokenType","_context4","setDatachannelToken","Interceptor"],"sources":["dataChannelAuthToken.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2026 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {DATA_CHANNEL_AUTH_HEADER, MAX_RETRY, RETRY_INTERVAL, RETRY_KEY} from './constant';\n\n/*!\n * Copyright (c) 2015-2026 Cisco Systems, Inc. See LICENSE file.\n */\n\nconst retryCountMap = new Map();\ninterface HttpLikeError extends Error {\n statusCode?: number;\n original?: any;\n}\n/**\n * @class\n */\nexport default class DataChannelAuthTokenInterceptor extends Interceptor {\n private _refreshDataChannelToken: () => Promise<string>;\n private _isDataChannelTokenEnabled: () => Promise<boolean>;\n constructor(options) {\n super(options);\n\n this._refreshDataChannelToken = options.refreshDataChannelToken;\n this._isDataChannelTokenEnabled = options.isDataChannelTokenEnabled;\n }\n\n /**\n * @returns {DataChannelAuthTokenInterceptor}\n */\n static create() {\n // @ts-ignore\n return new DataChannelAuthTokenInterceptor({\n webex: this,\n\n isDataChannelTokenEnabled: async () => {\n // @ts-ignore\n return this.internal.llm.isDataChannelTokenEnabled();\n },\n\n refreshDataChannelToken: async () => {\n // @ts-ignore\n const {body} = await this.internal.llm.refreshDataChannelToken();\n const {datachannelToken, dataChannelTokenType} = body ?? {};\n\n // @ts-ignore\n this.internal.llm.setDatachannelToken(datachannelToken, dataChannelTokenType);\n\n return datachannelToken;\n },\n });\n }\n\n private getRetryKey(options) {\n if (!options[RETRY_KEY]) {\n options[RETRY_KEY] = `${Date.now()}-${Math.random()}`;\n }\n\n return options[RETRY_KEY];\n }\n\n // Helper function to get header value case insensitively\n private getHeader(headers: Record<string, string>, name: string) {\n const key = Object.keys(headers).find((k) => k.toLowerCase() === name.toLowerCase());\n\n return key ? headers[key] : undefined;\n }\n\n /**\n * Intercept responses and, on 401/403 with `Data-Channel-Auth-Token` header,\n * attempt to refresh the data channel token and retry the original request once.\n *\n * @param {Object} options\n * @param {Object} reason\n * @returns {Promise<HttpResponse>}\n */\n async onResponseError(options, reason) {\n const token = this.getHeader(options.headers, DATA_CHANNEL_AUTH_HEADER);\n const enabled = await this._isDataChannelTokenEnabled();\n\n if (!token || !enabled) {\n return Promise.reject(reason);\n }\n\n if (reason.statusCode !== 401 && reason.statusCode !== 403) {\n return Promise.reject(reason);\n }\n\n const key = this.getRetryKey(options);\n const retryCount = retryCountMap.get(key) || 0;\n\n if (retryCount >= MAX_RETRY) {\n LoggerProxy.logger.error(`data channel token refresh exceeded max retry (${MAX_RETRY})`);\n retryCountMap.delete(key);\n\n return Promise.reject(reason);\n }\n\n retryCountMap.set(key, retryCount + 1);\n\n return this.refreshTokenAndRetryWithDelay(options);\n }\n\n /**\n * Retry the failed data channel request after a delay.\n * Refreshes the Data-Channel-Auth-Token and re-sends the original request.\n *\n * @param {Object} options - Original request options.\n * @returns {Promise<HttpResponse>} - Resolves on successful retry.\n */\n refreshTokenAndRetryWithDelay(options) {\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n const key = this.getRetryKey(options);\n try {\n const newToken = await this._refreshDataChannelToken();\n\n options.headers[DATA_CHANNEL_AUTH_HEADER] = newToken;\n\n // @ts-ignore\n const res = await this.webex.request(options);\n retryCountMap.delete(key);\n\n resolve(res);\n } catch (e) {\n retryCountMap.delete(key);\n\n const msg = e?.message || String(e);\n\n const err: HttpLikeError = new Error(`DataChannel token refresh failed: ${msg}`);\n err.statusCode = e?.statusCode;\n err.original = e;\n\n reject(err);\n }\n }, RETRY_INTERVAL);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,6 +5,12 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
5
5
  _Object$defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ _Object$defineProperty(exports, "DataChannelAuthTokenInterceptor", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _dataChannelAuthToken.default;
12
+ }
13
+ });
8
14
  _Object$defineProperty(exports, "LocusRetryStatusInterceptor", {
9
15
  enumerable: true,
10
16
  get: function get() {
@@ -19,4 +25,5 @@ _Object$defineProperty(exports, "LocusRouteTokenInterceptor", {
19
25
  });
20
26
  var _locusRetry = _interopRequireDefault(require("./locusRetry"));
21
27
  var _locusRouteToken = _interopRequireDefault(require("./locusRouteToken"));
28
+ var _dataChannelAuthToken = _interopRequireDefault(require("./dataChannelAuthToken"));
22
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_locusRetry","_interopRequireDefault","require","_locusRouteToken"],"sources":["index.ts"],"sourcesContent":["import LocusRetryStatusInterceptor from './locusRetry';\nimport LocusRouteTokenInterceptor from './locusRouteToken';\n\nexport {LocusRetryStatusInterceptor, LocusRouteTokenInterceptor};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_locusRetry","_interopRequireDefault","require","_locusRouteToken","_dataChannelAuthToken"],"sources":["index.ts"],"sourcesContent":["import LocusRetryStatusInterceptor from './locusRetry';\nimport LocusRouteTokenInterceptor from './locusRouteToken';\nimport DataChannelAuthTokenInterceptor from './dataChannelAuthToken';\n\nexport {LocusRetryStatusInterceptor, LocusRouteTokenInterceptor, DataChannelAuthTokenInterceptor};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,qBAAA,GAAAH,sBAAA,CAAAC,OAAA","ignoreList":[]}
@@ -372,7 +372,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
372
372
  throw error;
373
373
  });
374
374
  },
375
- version: "3.11.0-next.3"
375
+ version: "3.11.0-next.30"
376
376
  });
377
377
  var _default = exports.default = SimultaneousInterpretation;
378
378
  //# sourceMappingURL=index.js.map
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.11.0-next.3"
21
+ version: "3.11.0-next.30"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -59,7 +59,7 @@ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0,
59
59
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
60
60
  // list of top level keys in Locus DTO relevant for Hash Tree DTOs processing
61
61
  // it does not contain fields specific to classic Locus DTOs like sequence or baseSequence
62
- var LocusDtoTopLevelKeys = ['controls', 'fullState', 'host', 'info', 'links', 'mediaShares', 'meetings', 'participants', 'replaces', 'self', 'sequence', 'syncUrl', 'url', 'htMeta' // only exists when hash trees are used
62
+ var LocusDtoTopLevelKeys = ['controls', 'fullState', 'embeddedApps', 'host', 'info', 'links', 'mediaShares', 'meetings', 'participants', 'replaces', 'self', 'sequence', 'syncUrl', 'url', 'htMeta' // only exists when hash trees are used
63
63
  ];
64
64
  var LocusObjectStateAfterUpdates = {
65
65
  unchanged: 'unchanged',
@@ -210,7 +210,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
210
210
  // in some cases Locus might return us full DTO even when we asked for a delta
211
211
  _loggerProxy.default.logger.info('Locus-info:index#doLocusSync --> got full DTO when we asked for delta');
212
212
  }
213
- meeting.locusInfo.onFullLocus(res.body);
213
+ meeting.locusInfo.onFullLocus('classic Locus sync', res.body);
214
214
  }).catch(function (e) {
215
215
  _loggerProxy.default.logger.info("Locus-info:index#doLocusSync --> getLocusDTO succeeded but failed to handle result, locus parser will resume but not all data may be synced (".concat(e.toString(), ")"));
216
216
  _metrics.default.sendBehavioralMetric(_constants2.default.LOCUS_SYNC_HANDLING_FAILED, {
@@ -339,12 +339,16 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
339
339
  }, {
340
340
  key: "createHashTreeParser",
341
341
  value: function createHashTreeParser(_ref) {
342
- var initialLocus = _ref.initialLocus;
342
+ var _this$webex$config$me;
343
+ var initialLocus = _ref.initialLocus,
344
+ metadata = _ref.metadata;
343
345
  return new _hashTreeParser.default({
344
346
  initialLocus: initialLocus,
347
+ metadata: metadata,
345
348
  webexRequest: this.webex.request.bind(this.webex),
346
349
  locusInfoUpdateCallback: this.updateFromHashTree.bind(this),
347
- debugId: "HT-".concat(this.meetingId.substring(0, 4))
350
+ debugId: "HT-".concat(this.meetingId.substring(0, 4)),
351
+ excludedDataSets: (_this$webex$config$me = this.webex.config.meetings.locus) === null || _this$webex$config$me === void 0 ? void 0 : _this$webex$config$me.excludedDataSets
348
352
  });
349
353
  }
350
354
 
@@ -358,7 +362,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
358
362
  value: (function () {
359
363
  var _initialSetup = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(data) {
360
364
  var _data$locus, _data$locus$links, _data$locus$links$res, _data$locus$links$res2;
361
- var _data$hashTreeMessage, _selfObject$data, selfObject, _data$locus2, _data$locus2$self, _t;
365
+ var _data$hashTreeMessage, _metadataObject$data, metadataObject, _t;
362
366
  return _regenerator.default.wrap(function (_context) {
363
367
  while (1) switch (_context.prev = _context.next) {
364
368
  case 0:
@@ -370,29 +374,28 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
370
374
  _context.next = 4;
371
375
  break;
372
376
  }
373
- // we need the SELF object to be in the received message, because it contains visibleDataSets
377
+ // we need the Metadata object to be in the received message, because it contains visibleDataSets
374
378
  // and these are needed to initialize all the hash trees
375
- selfObject = (_data$hashTreeMessage = data.hashTreeMessage.locusStateElements) === null || _data$hashTreeMessage === void 0 ? void 0 : _data$hashTreeMessage.find(function (el) {
376
- return (0, _utils.isSelf)(el);
379
+ metadataObject = (_data$hashTreeMessage = data.hashTreeMessage.locusStateElements) === null || _data$hashTreeMessage === void 0 ? void 0 : _data$hashTreeMessage.find(function (el) {
380
+ return (0, _utils.isMetadata)(el);
377
381
  });
378
- if (selfObject !== null && selfObject !== void 0 && (_selfObject$data = selfObject.data) !== null && _selfObject$data !== void 0 && _selfObject$data.visibleDataSets) {
382
+ if (metadataObject !== null && metadataObject !== void 0 && (_metadataObject$data = metadataObject.data) !== null && _metadataObject$data !== void 0 && _metadataObject$data.visibleDataSets) {
379
383
  _context.next = 2;
380
384
  break;
381
385
  }
382
- _loggerProxy.default.logger.warn("Locus-info:index#initialSetup --> cannot initialize HashTreeParser, SELF object with visibleDataSets is missing in the message");
383
- throw new Error('SELF object with visibleDataSets is missing in the message');
386
+ _loggerProxy.default.logger.warn("Locus-info:index#initialSetup --> cannot initialize HashTreeParser, Metadata object with visibleDataSets is missing in the message");
387
+ throw new Error('Metadata object with visibleDataSets is missing in the message');
384
388
  case 2:
385
389
  _loggerProxy.default.logger.info('Locus-info:index#initialSetup --> creating HashTreeParser from message');
386
390
  // first create the HashTreeParser, but don't initialize it with any data yet
387
- // pass just a fake locus that contains only the visibleDataSets
388
391
  this.hashTreeParser = this.createHashTreeParser({
389
392
  initialLocus: {
390
- locus: {
391
- self: {
392
- visibleDataSets: selfObject.data.visibleDataSets
393
- }
394
- },
393
+ locus: null,
395
394
  dataSets: [] // empty, because they will be populated in initializeFromMessage() call // dataSets: data.hashTreeMessage.dataSets,
395
+ },
396
+ metadata: {
397
+ htMeta: metadataObject.htMeta,
398
+ visibleDataSets: metadataObject.data.visibleDataSets
396
399
  }
397
400
  });
398
401
 
@@ -405,12 +408,12 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
405
408
  case 4:
406
409
  // "classic" Locus case, no hash trees involved
407
410
  this.updateLocusCache(data.locus);
408
- this.onFullLocus(data.locus, undefined);
411
+ this.onFullLocus('classic locus message', data.locus, undefined);
409
412
  case 5:
410
413
  return _context.abrupt("continue", 10);
411
414
  case 6:
412
415
  this.updateLocusCache(data.locus);
413
- this.onFullLocus(data.locus, undefined, data.dataSets);
416
+ this.onFullLocus('join response', data.locus, undefined, data.dataSets, data.metadata);
414
417
  return _context.abrupt("continue", 10);
415
418
  case 7:
416
419
  if (!((_data$locus = data.locus) !== null && _data$locus !== void 0 && (_data$locus$links = _data$locus.links) !== null && _data$locus$links !== void 0 && (_data$locus$links$res = _data$locus$links.resources) !== null && _data$locus$links$res !== void 0 && (_data$locus$links$res2 = _data$locus$links$res.visibleDataSets) !== null && _data$locus$links$res2 !== void 0 && _data$locus$links$res2.url)) {
@@ -419,16 +422,12 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
419
422
  }
420
423
  _loggerProxy.default.logger.info('Locus-info:index#initialSetup --> creating HashTreeParser from get-loci-response');
421
424
  // first create the HashTreeParser, but don't initialize it with any data yet
422
- // pass just a fake locus that contains only the visibleDataSets
423
425
  this.hashTreeParser = this.createHashTreeParser({
424
426
  initialLocus: {
425
- locus: {
426
- self: {
427
- visibleDataSets: (_data$locus2 = data.locus) === null || _data$locus2 === void 0 ? void 0 : (_data$locus2$self = _data$locus2.self) === null || _data$locus2$self === void 0 ? void 0 : _data$locus2$self.visibleDataSets
428
- }
429
- },
427
+ locus: null,
430
428
  dataSets: [] // empty, because we don't have them yet
431
- }
429
+ },
430
+ metadata: null // get-loci-response doesn't contain Metadata object
432
431
  });
433
432
 
434
433
  // now initialize all the data
@@ -440,7 +439,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
440
439
  case 9:
441
440
  // "classic" Locus case, no hash trees involved
442
441
  this.updateLocusCache(data.locus);
443
- this.onFullLocus(data.locus, undefined);
442
+ this.onFullLocus('classic get-loci-response', data.locus, undefined);
444
443
  case 10:
445
444
  // Change it to true after it receives it first locus object
446
445
  this.emitChange = true;
@@ -543,6 +542,27 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
543
542
  });
544
543
  }
545
544
  break;
545
+ case _types.ObjectType.embeddedApp:
546
+ if (object.data) {
547
+ var _locus$embeddedApps;
548
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> embeddedApp id=".concat(object.htMeta.elementId.id, " url='").concat(object.data.url, "' updated version=").concat(object.htMeta.elementId.version, ":"), object.data);
549
+ var existingEmbeddedApp = (_locus$embeddedApps = locus.embeddedApps) === null || _locus$embeddedApps === void 0 ? void 0 : _locus$embeddedApps.find(function (ms) {
550
+ return ms.htMeta.elementId.id === object.htMeta.elementId.id;
551
+ });
552
+ if (existingEmbeddedApp) {
553
+ (0, _assign.default)(existingEmbeddedApp, object.data);
554
+ } else {
555
+ locus.embeddedApps = locus.embeddedApps || [];
556
+ locus.embeddedApps.push(object.data);
557
+ }
558
+ } else {
559
+ var _locus$embeddedApps2;
560
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> embeddedApp id=".concat(object.htMeta.elementId.id, " removed, version=").concat(object.htMeta.elementId.version));
561
+ locus.embeddedApps = (_locus$embeddedApps2 = locus.embeddedApps) === null || _locus$embeddedApps2 === void 0 ? void 0 : _locus$embeddedApps2.filter(function (ms) {
562
+ return ms.htMeta.elementId.id !== object.htMeta.elementId.id;
563
+ });
564
+ }
565
+ break;
546
566
  case _types.ObjectType.participant:
547
567
  _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> participant id=".concat(object.htMeta.elementId.id, " ").concat(object.data ? 'updated' : 'removed', " version=").concat(object.htMeta.elementId.version));
548
568
  if (object.data) {
@@ -598,6 +618,10 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
598
618
  }
599
619
  }
600
620
  break;
621
+ case _types.ObjectType.metadata:
622
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> metadata object updated to version ".concat(object.htMeta.elementId.version));
623
+ // we don't use hash tree metadata right now for anything, it's mainly used internally by HashTreeParser
624
+ break;
601
625
  default:
602
626
  _loggerProxy.default.logger.warn("Locus-info:index#updateLocusFromHashTreeObject --> received unsupported object type ".concat(type));
603
627
  break;
@@ -749,8 +773,13 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
749
773
  if (this.hashTreeParser) {
750
774
  this.handleHashTreeMessage(meeting, data.eventType, data.stateElementsMessage);
751
775
  } else {
752
- // eslint-disable-next-line @typescript-eslint/no-shadow
753
776
  var eventType = data.eventType;
777
+ if (eventType === _constants.LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
778
+ // this can happen when we get an event before join http response
779
+ // it's OK to just ignore it
780
+ _loggerProxy.default.logger.info("Locus-info:index#parse --> received locus hash tree event before hashTreeParser is created");
781
+ return;
782
+ }
754
783
  var locus = this.getTheLocusToUpdate(data.locus);
755
784
  _loggerProxy.default.logger.info("Locus-info:index#parse --> received locus data: ".concat(eventType));
756
785
  locus.jsSdkMeta = {
@@ -771,14 +800,11 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
771
800
  case _constants.LOCUSEVENT.PARTICIPANT_DECLINED:
772
801
  case _constants.LOCUSEVENT.FLOOR_GRANTED:
773
802
  case _constants.LOCUSEVENT.FLOOR_RELEASED:
774
- this.onFullLocus(locus, eventType);
803
+ this.onFullLocus("classic locus event ".concat(eventType), locus, eventType);
775
804
  break;
776
805
  case _constants.LOCUSEVENT.DIFFERENCE:
777
806
  this.handleLocusDelta(locus, meeting);
778
807
  break;
779
- case _constants.LOCUSEVENT.HASH_TREE_DATA_UPDATED:
780
- this.sendClassicVsHashTreeMismatchMetric(meeting, "got ".concat(eventType, ", expected classic events"));
781
- break;
782
808
  default:
783
809
  // Why will there be a event with no eventType ????
784
810
  // we may not need this, we can get full locus
@@ -803,32 +829,36 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
803
829
  /**
804
830
  * Function for handling full locus when it's using hash trees (so not the "classic" one).
805
831
  *
832
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
806
833
  * @param {object} locus locus object
834
+ * @param {object} metadata locus hash trees metadata
807
835
  * @param {string} eventType locus event
808
836
  * @param {DataSet[]} dataSets
809
837
  * @returns {void}
810
838
  */
811
839
  }, {
812
840
  key: "onFullLocusWithHashTrees",
813
- value: function onFullLocusWithHashTrees(locus, eventType, dataSets) {
841
+ value: function onFullLocusWithHashTrees(debugText, locus, metadata, eventType, dataSets) {
814
842
  if (!this.hashTreeParser) {
815
- _loggerProxy.default.logger.info("Locus-info:index#onFullLocus --> creating hash tree parser");
816
- _loggerProxy.default.logger.info('Locus-info:index#onFullLocus --> dataSets:', dataSets, ' and locus:', locus);
843
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> creating hash tree parser"));
844
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> dataSets:"), dataSets, ' and locus:', locus, ' and metadata:', metadata);
817
845
  this.hashTreeParser = this.createHashTreeParser({
818
846
  initialLocus: {
819
847
  locus: locus,
820
848
  dataSets: dataSets
821
- }
849
+ },
850
+ metadata: metadata
822
851
  });
823
852
  this.onFullLocusCommon(locus, eventType);
824
853
  } else {
825
854
  // in this case the Locus we're getting is not necessarily the full one
826
855
  // so treat it like if we just got it in any api response
827
856
 
828
- _loggerProxy.default.logger.info('Locus-info:index#onFullLocus --> hash tree parser already exists, handling it like a normal API response');
857
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> hash tree parser already exists, handling it like a normal API response"));
829
858
  this.handleLocusAPIResponse(undefined, {
830
859
  dataSets: dataSets,
831
- locus: locus
860
+ locus: locus,
861
+ metadata: metadata
832
862
  });
833
863
  }
834
864
  }
@@ -836,15 +866,16 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
836
866
  /**
837
867
  * Function for handling full locus when it's the "classic" one (not hash trees)
838
868
  *
869
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
839
870
  * @param {object} locus locus object
840
871
  * @param {string} eventType locus event
841
872
  * @returns {void}
842
873
  */
843
874
  }, {
844
875
  key: "onFullLocusClassic",
845
- value: function onFullLocusClassic(locus, eventType) {
876
+ value: function onFullLocusClassic(debugText, locus, eventType) {
846
877
  if (!this.locusParser.isNewFullLocus(locus)) {
847
- _loggerProxy.default.logger.info("Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=".concat(eventType));
878
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> ignoring old full locus DTO, eventType=").concat(eventType));
848
879
  return;
849
880
  }
850
881
  this.onFullLocusCommon(locus, eventType);
@@ -852,23 +883,28 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
852
883
 
853
884
  /**
854
885
  * updates the locus with full locus object
886
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
855
887
  * @param {object} locus locus object
856
888
  * @param {string} eventType locus event
857
889
  * @param {DataSet[]} dataSets
890
+ * @param {object} metadata locus hash trees metadata
858
891
  * @returns {object} null
859
892
  * @memberof LocusInfo
860
893
  */
861
894
  }, {
862
895
  key: "onFullLocus",
863
- value: function onFullLocus(locus, eventType, dataSets) {
896
+ value: function onFullLocus(debugText, locus, eventType, dataSets, metadata) {
864
897
  if (!locus) {
865
- _loggerProxy.default.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');
898
+ _loggerProxy.default.logger.error("Locus-info:index#onFullLocus (".concat(debugText, ") --> object passed as argument was invalid, continuing."));
866
899
  }
867
900
  if (dataSets) {
901
+ if (!metadata) {
902
+ throw new Error("Locus-info:index#onFullLocus (".concat(debugText, ") --> hash tree metadata is missing with full Locus"));
903
+ }
868
904
  // this is the new hashmap Locus DTO format (only applicable to webinars for now)
869
- this.onFullLocusWithHashTrees(locus, eventType, dataSets);
905
+ this.onFullLocusWithHashTrees(debugText, locus, metadata, eventType, dataSets);
870
906
  } else {
871
- this.onFullLocusClassic(locus, eventType);
907
+ this.onFullLocusClassic(debugText, locus, eventType);
872
908
  }
873
909
  }
874
910