@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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/hashTree/hashTree.js +18 -0
- package/dist/hashTree/hashTree.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +603 -266
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/hashTree/types.js +4 -2
- package/dist/hashTree/types.js.map +1 -1
- package/dist/hashTree/utils.js +10 -0
- package/dist/hashTree/utils.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptors/constant.js +12 -0
- package/dist/interceptors/constant.js.map +1 -0
- package/dist/interceptors/dataChannelAuthToken.js +233 -0
- package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
- package/dist/interceptors/index.js +7 -0
- package/dist/interceptors/index.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +80 -44
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/types.js.map +1 -1
- package/dist/media/MediaConnectionAwaiter.js +57 -1
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/media/properties.js +4 -2
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/index.js +134 -40
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +50 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +108 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +76 -34
- package/dist/meetings/index.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -1
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +11 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/types/config.d.ts +3 -0
- package/dist/types/hashTree/hashTree.d.ts +7 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +83 -12
- package/dist/types/hashTree/types.d.ts +3 -0
- package/dist/types/hashTree/utils.d.ts +6 -0
- package/dist/types/interceptors/constant.d.ts +5 -0
- package/dist/types/interceptors/dataChannelAuthToken.d.ts +35 -0
- package/dist/types/interceptors/index.d.ts +2 -1
- package/dist/types/locus-info/index.d.ts +9 -2
- package/dist/types/locus-info/types.d.ts +1 -0
- package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
- package/dist/types/media/properties.d.ts +2 -1
- package/dist/types/meeting/index.d.ts +27 -5
- package/dist/types/meeting/request.d.ts +16 -1
- package/dist/types/meeting/request.type.d.ts +5 -0
- package/dist/types/meeting/util.d.ts +28 -0
- package/dist/types/meetings/index.d.ts +3 -1
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/reactions/reactions.type.d.ts +1 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/config.ts +3 -0
- package/src/hashTree/hashTree.ts +17 -0
- package/src/hashTree/hashTreeParser.ts +525 -188
- package/src/hashTree/types.ts +4 -0
- package/src/hashTree/utils.ts +9 -0
- package/src/index.ts +6 -1
- package/src/interceptors/constant.ts +6 -0
- package/src/interceptors/dataChannelAuthToken.ts +142 -0
- package/src/interceptors/index.ts +2 -1
- package/src/locus-info/index.ts +110 -35
- package/src/locus-info/types.ts +1 -0
- package/src/media/MediaConnectionAwaiter.ts +41 -1
- package/src/media/properties.ts +3 -1
- package/src/meeting/index.ts +101 -22
- package/src/meeting/request.ts +42 -0
- package/src/meeting/request.type.ts +6 -0
- package/src/meeting/util.ts +132 -1
- package/src/meetings/index.ts +88 -7
- package/src/metrics/constants.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +1 -1
- package/src/multistream/remoteMediaManager.ts +13 -0
- package/src/reactions/reactions.type.ts +1 -0
- package/test/unit/spec/hashTree/hashTree.ts +66 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +1594 -162
- package/test/unit/spec/interceptors/dataChannelAuthToken.ts +141 -0
- package/test/unit/spec/locus-info/index.js +173 -45
- package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
- package/test/unit/spec/media/properties.ts +12 -3
- package/test/unit/spec/meeting/index.js +414 -62
- package/test/unit/spec/meeting/request.js +64 -0
- package/test/unit/spec/meeting/utils.js +294 -22
- package/test/unit/spec/meetings/index.js +550 -10
- 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":"
|
|
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.
|
|
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.
|
|
21
|
+
version: "3.11.0-next.30"
|
|
22
22
|
});
|
|
23
23
|
var _default = exports.default = SILanguage;
|
|
24
24
|
//# sourceMappingURL=siLanguage.js.map
|
package/dist/locus-info/index.js
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
|
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
|
-
|
|
376
|
-
return (0, _utils.
|
|
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 (
|
|
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,
|
|
383
|
-
throw new Error('
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|