@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.2

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 (111) hide show
  1. package/dist/common/errors/webex-errors.js +5 -29
  2. package/dist/common/errors/webex-errors.js.map +1 -1
  3. package/dist/constants.js +15 -74
  4. package/dist/constants.js.map +1 -1
  5. package/dist/media/index.js +68 -213
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/media/internal-media-core-wrapper.js +22 -0
  8. package/dist/media/internal-media-core-wrapper.js.map +1 -0
  9. package/dist/media/properties.js +20 -25
  10. package/dist/media/properties.js.map +1 -1
  11. package/dist/media/util.js +0 -27
  12. package/dist/media/util.js.map +1 -1
  13. package/dist/meeting/index.js +694 -432
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +1 -0
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/util.js +3 -44
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/meetings/index.js +64 -5
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/meetings/util.js +24 -1
  22. package/dist/meetings/util.js.map +1 -1
  23. package/dist/members/index.js +68 -0
  24. package/dist/members/index.js.map +1 -1
  25. package/dist/multistream/mediaRequestManager.js +132 -0
  26. package/dist/multistream/mediaRequestManager.js.map +1 -0
  27. package/dist/multistream/multistreamMedia.js +116 -0
  28. package/dist/multistream/multistreamMedia.js.map +1 -0
  29. package/dist/multistream/receiveSlot.js +209 -0
  30. package/dist/multistream/receiveSlot.js.map +1 -0
  31. package/dist/multistream/receiveSlotManager.js +195 -0
  32. package/dist/multistream/receiveSlotManager.js.map +1 -0
  33. package/dist/multistream/remoteMedia.js +284 -0
  34. package/dist/multistream/remoteMedia.js.map +1 -0
  35. package/dist/multistream/remoteMediaGroup.js +243 -0
  36. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  37. package/dist/multistream/remoteMediaManager.js +1113 -0
  38. package/dist/multistream/remoteMediaManager.js.map +1 -0
  39. package/dist/reconnection-manager/index.js +109 -130
  40. package/dist/reconnection-manager/index.js.map +1 -1
  41. package/dist/roap/index.js +57 -240
  42. package/dist/roap/index.js.map +1 -1
  43. package/dist/roap/request.js +2 -114
  44. package/dist/roap/request.js.map +1 -1
  45. package/dist/roap/turnDiscovery.js +11 -5
  46. package/dist/roap/turnDiscovery.js.map +1 -1
  47. package/dist/statsAnalyzer/global.js +2 -0
  48. package/dist/statsAnalyzer/global.js.map +1 -1
  49. package/dist/statsAnalyzer/index.js +39 -36
  50. package/dist/statsAnalyzer/index.js.map +1 -1
  51. package/package.json +20 -19
  52. package/src/common/errors/webex-errors.js +0 -18
  53. package/src/constants.ts +139 -180
  54. package/src/media/index.js +60 -194
  55. package/src/media/internal-media-core-wrapper.ts +9 -0
  56. package/src/media/properties.js +19 -25
  57. package/src/media/util.js +0 -22
  58. package/src/meeting/index.js +565 -320
  59. package/src/meeting/request.js +1 -0
  60. package/src/meeting/util.js +3 -46
  61. package/src/meetings/index.js +30 -1
  62. package/src/meetings/util.js +23 -2
  63. package/src/members/index.js +48 -0
  64. package/src/multistream/mediaRequestManager.ts +164 -0
  65. package/src/multistream/multistreamMedia.ts +92 -0
  66. package/src/multistream/receiveSlot.ts +141 -0
  67. package/src/multistream/receiveSlotManager.ts +142 -0
  68. package/src/multistream/remoteMedia.ts +219 -0
  69. package/src/multistream/remoteMediaGroup.ts +224 -0
  70. package/src/multistream/remoteMediaManager.ts +911 -0
  71. package/src/reconnection-manager/index.js +40 -53
  72. package/src/roap/index.js +47 -207
  73. package/src/roap/request.js +1 -72
  74. package/src/roap/turnDiscovery.ts +12 -6
  75. package/src/statsAnalyzer/global.js +2 -0
  76. package/src/statsAnalyzer/index.js +32 -46
  77. package/test/integration/spec/journey.js +1 -1
  78. package/test/unit/spec/media/index.ts +223 -0
  79. package/test/unit/spec/media/properties.ts +73 -82
  80. package/test/unit/spec/meeting/effectsState.js +1 -3
  81. package/test/unit/spec/meeting/index.js +420 -228
  82. package/test/unit/spec/meeting/muteState.js +7 -0
  83. package/test/unit/spec/meeting/utils.js +61 -2
  84. package/test/unit/spec/meetings/index.js +0 -4
  85. package/test/unit/spec/members/index.js +164 -2
  86. package/test/unit/spec/multistream/mediaRequestManager.ts +511 -0
  87. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  88. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  89. package/test/unit/spec/multistream/remoteMedia.ts +217 -0
  90. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  91. package/test/unit/spec/multistream/remoteMediaManager.ts +1251 -0
  92. package/test/unit/spec/roap/index.ts +63 -35
  93. package/test/unit/spec/stats-analyzer/index.js +19 -22
  94. package/dist/peer-connection-manager/index.js +0 -794
  95. package/dist/peer-connection-manager/index.js.map +0 -1
  96. package/dist/roap/collection.js +0 -73
  97. package/dist/roap/collection.js.map +0 -1
  98. package/dist/roap/handler.js +0 -337
  99. package/dist/roap/handler.js.map +0 -1
  100. package/dist/roap/state.js +0 -164
  101. package/dist/roap/state.js.map +0 -1
  102. package/dist/roap/util.js +0 -102
  103. package/dist/roap/util.js.map +0 -1
  104. package/src/peer-connection-manager/index.js +0 -723
  105. package/src/roap/collection.js +0 -63
  106. package/src/roap/handler.js +0 -252
  107. package/src/roap/state.js +0 -149
  108. package/src/roap/util.js +0 -93
  109. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  110. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  111. package/test/unit/spec/roap/util.js +0 -30
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+
5
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
+
7
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
+
9
+ _Object$defineProperty(exports, "__esModule", {
10
+ value: true
11
+ });
12
+
13
+ exports.ReceiveSlotEvents = exports.ReceiveSlot = void 0;
14
+
15
+ var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
16
+
17
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
18
+
19
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
+
21
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
22
+
23
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
24
+
25
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
26
+
27
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
28
+
29
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
30
+
31
+ var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldGet"));
32
+
33
+ var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldSet"));
34
+
35
+ var _internalMediaCore = require("@webex/internal-media-core");
36
+
37
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
38
+
39
+ var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
40
+
41
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
42
+
43
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
44
+
45
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
46
+
47
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
48
+
49
+ var ReceiveSlotEvents = {
50
+ SourceUpdate: 'sourceUpdate'
51
+ };
52
+ exports.ReceiveSlotEvents = ReceiveSlotEvents;
53
+ var receiveSlotCounter = 0;
54
+
55
+ var _memberId = /*#__PURE__*/new _weakMap.default();
56
+
57
+ var _csi = /*#__PURE__*/new _weakMap.default();
58
+
59
+ var _sourceState = /*#__PURE__*/new _weakMap.default();
60
+
61
+ /**
62
+ * Class representing a receive slot. A single receive slot is able to receive a single track
63
+ * for example some participant's main video or audio
64
+ */
65
+ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
66
+ (0, _inherits2.default)(ReceiveSlot, _EventsScope);
67
+
68
+ var _super = _createSuper(ReceiveSlot);
69
+
70
+ /**
71
+ * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
72
+ * to create any receive slots
73
+ *
74
+ * @param {MC.MediaType} mediaType
75
+ * @param {MC.ReceiveSlot} mcReceiveSlot
76
+ * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI
77
+ */
78
+ function ReceiveSlot(mediaType, mcReceiveSlot, findMemberIdCallback) {
79
+ var _this;
80
+
81
+ (0, _classCallCheck2.default)(this, ReceiveSlot);
82
+ _this = _super.call(this);
83
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mcReceiveSlot", void 0);
84
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findMemberIdCallback", void 0);
85
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0);
86
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
87
+
88
+ _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _memberId, {
89
+ writable: true,
90
+ value: void 0
91
+ });
92
+
93
+ _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _csi, {
94
+ writable: true,
95
+ value: void 0
96
+ });
97
+
98
+ _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _sourceState, {
99
+ writable: true,
100
+ value: void 0
101
+ });
102
+
103
+ receiveSlotCounter += 1;
104
+ _this.findMemberIdCallback = findMemberIdCallback;
105
+ _this.mediaType = mediaType;
106
+ _this.mcReceiveSlot = mcReceiveSlot;
107
+ (0, _classPrivateFieldSet2.default)((0, _assertThisInitialized2.default)(_this), _sourceState, 'no source');
108
+ _this.id = "r".concat(receiveSlotCounter);
109
+
110
+ _this.setupEventListeners();
111
+
112
+ return _this;
113
+ }
114
+ /**
115
+ * Getter for memberId
116
+ */
117
+
118
+
119
+ (0, _createClass2.default)(ReceiveSlot, [{
120
+ key: "memberId",
121
+ get: function get() {
122
+ return (0, _classPrivateFieldGet2.default)(this, _memberId);
123
+ }
124
+ /**
125
+ * Getter for csi
126
+ */
127
+
128
+ }, {
129
+ key: "csi",
130
+ get: function get() {
131
+ return (0, _classPrivateFieldGet2.default)(this, _csi);
132
+ }
133
+ /**
134
+ * Getter for sourceState
135
+ */
136
+
137
+ }, {
138
+ key: "sourceState",
139
+ get: function get() {
140
+ return (0, _classPrivateFieldGet2.default)(this, _sourceState);
141
+ }
142
+ /**
143
+ * registers event handlers with the underlying ReceiveSlot
144
+ */
145
+
146
+ }, {
147
+ key: "setupEventListeners",
148
+ value: function setupEventListeners() {
149
+ var _this2 = this;
150
+
151
+ var scope = {
152
+ file: 'meeting/receiveSlot',
153
+ function: 'setupEventListeners'
154
+ };
155
+ this.mcReceiveSlot.on(_internalMediaCore.MediaConnection.ReceiveSlotEvents.SourceUpdate, function (state, csi) {
156
+ _loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> got source update on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType, ", csi=").concat(csi, ", state=").concat(state));
157
+
158
+ (0, _classPrivateFieldSet2.default)(_this2, _memberId, csi ? _this2.findMemberIdCallback(csi) : undefined);
159
+ (0, _classPrivateFieldSet2.default)(_this2, _csi, csi);
160
+ (0, _classPrivateFieldSet2.default)(_this2, _sourceState, state);
161
+
162
+ _this2.emit(scope, ReceiveSlotEvents.SourceUpdate, {
163
+ state: (0, _classPrivateFieldGet2.default)(_this2, _sourceState),
164
+ csi: (0, _classPrivateFieldGet2.default)(_this2, _csi),
165
+ memberId: (0, _classPrivateFieldGet2.default)(_this2, _memberId)
166
+ });
167
+ });
168
+ }
169
+ /**
170
+ * The MediaStream object associated with this slot.
171
+ *
172
+ * @returns {MediaStream} The MediaStreamTrack.
173
+ */
174
+
175
+ }, {
176
+ key: "stream",
177
+ get: function get() {
178
+ return this.mcReceiveSlot.stream;
179
+ }
180
+ /**
181
+ * The underlying WCME receive slot
182
+ */
183
+
184
+ }, {
185
+ key: "wcmeReceiveSlot",
186
+ get: function get() {
187
+ return this.mcReceiveSlot;
188
+ }
189
+ /**
190
+ * Resets the source state to the default 'no source' value.
191
+ * This function should be called on receive slots that are
192
+ * no longer part of a media request. It's needed because WCME
193
+ * does not send any more events on such slots, so the sourceState
194
+ * value would not represent the truth anymore.
195
+ */
196
+
197
+ }, {
198
+ key: "resetSourceState",
199
+ value: function resetSourceState() {
200
+ (0, _classPrivateFieldSet2.default)(this, _sourceState, 'no source');
201
+ (0, _classPrivateFieldSet2.default)(this, _csi, undefined);
202
+ (0, _classPrivateFieldSet2.default)(this, _memberId, undefined);
203
+ }
204
+ }]);
205
+ return ReceiveSlot;
206
+ }(_eventsScope.default);
207
+
208
+ exports.ReceiveSlot = ReceiveSlot;
209
+ //# sourceMappingURL=receiveSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReceiveSlotEvents","SourceUpdate","receiveSlotCounter","ReceiveSlot","mediaType","mcReceiveSlot","findMemberIdCallback","id","setupEventListeners","scope","file","function","on","MC","state","csi","LoggerProxy","logger","log","undefined","emit","memberId","stream","EventsScope"],"sources":["receiveSlot.ts"],"sourcesContent":["import {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nexport const ReceiveSlotEvents = {\n SourceUpdate: 'sourceUpdate',\n};\n\nexport type SourceState = MC.SourceState;\nexport type CSI = number;\nexport type MemberId = string;\nexport type ReceiveSlotId = string;\n\nlet receiveSlotCounter = 0;\n\nexport type FindMemberIdCallback = (csi: CSI) => MemberId | undefined;\n\n/**\n * Class representing a receive slot. A single receive slot is able to receive a single track\n * for example some participant's main video or audio\n */\nexport class ReceiveSlot extends EventsScope {\n private readonly mcReceiveSlot: MC.ReceiveSlot;\n\n private readonly findMemberIdCallback: FindMemberIdCallback;\n\n public readonly id: ReceiveSlotId;\n\n public readonly mediaType: MC.MediaType;\n\n #memberId?: MemberId;\n\n #csi?: CSI;\n\n #sourceState: MC.SourceState;\n\n /**\n * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()\n * to create any receive slots\n *\n * @param {MC.MediaType} mediaType\n * @param {MC.ReceiveSlot} mcReceiveSlot\n * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI\n */\n constructor(\n mediaType: MC.MediaType,\n mcReceiveSlot: MC.ReceiveSlot,\n findMemberIdCallback: FindMemberIdCallback\n ) {\n super();\n\n receiveSlotCounter += 1;\n\n this.findMemberIdCallback = findMemberIdCallback;\n this.mediaType = mediaType;\n this.mcReceiveSlot = mcReceiveSlot;\n this.#sourceState = 'no source';\n this.id = `r${receiveSlotCounter}`;\n\n this.setupEventListeners();\n }\n\n /**\n * Getter for memberId\n */\n public get memberId() {\n return this.#memberId;\n }\n\n /**\n * Getter for csi\n */\n public get csi() {\n return this.#csi;\n }\n\n /**\n * Getter for sourceState\n */\n public get sourceState() {\n return this.#sourceState;\n }\n\n /**\n * registers event handlers with the underlying ReceiveSlot\n */\n setupEventListeners() {\n const scope = {\n file: 'meeting/receiveSlot',\n function: 'setupEventListeners',\n };\n\n this.mcReceiveSlot.on(\n MC.ReceiveSlotEvents.SourceUpdate,\n (state: MC.SourceState, csi?: number) => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> got source update on receive slot ${this.id}, mediaType=${this.mediaType}, csi=${csi}, state=${state}`\n );\n this.#memberId = csi ? this.findMemberIdCallback(csi) : undefined;\n this.#csi = csi;\n this.#sourceState = state;\n\n this.emit(scope, ReceiveSlotEvents.SourceUpdate, {\n state: this.#sourceState,\n csi: this.#csi,\n memberId: this.#memberId,\n });\n }\n );\n }\n\n /**\n * The MediaStream object associated with this slot.\n *\n * @returns {MediaStream} The MediaStreamTrack.\n */\n get stream(): MediaStream {\n return this.mcReceiveSlot.stream;\n }\n\n /**\n * The underlying WCME receive slot\n */\n get wcmeReceiveSlot(): MC.ReceiveSlot {\n return this.mcReceiveSlot;\n }\n\n /**\n * Resets the source state to the default 'no source' value.\n * This function should be called on receive slots that are\n * no longer part of a media request. It's needed because WCME\n * does not send any more events on such slots, so the sourceState\n * value would not represent the truth anymore.\n */\n public resetSourceState() {\n this.#sourceState = 'no source';\n this.#csi = undefined;\n this.#memberId = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;;;;;;;;;AAEO,IAAMA,iBAAiB,GAAG;EAC/BC,YAAY,EAAE;AADiB,CAA1B;;AASP,IAAIC,kBAAkB,GAAG,CAAzB;;;;;;;;AAIA;AACA;AACA;AACA;IACaC,W;;;;;EAeX;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,qBACEC,SADF,EAEEC,aAFF,EAGEC,oBAHF,EAIE;IAAA;;IAAA;IACA;IADA;IAAA;IAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAGAJ,kBAAkB,IAAI,CAAtB;IAEA,MAAKI,oBAAL,GAA4BA,oBAA5B;IACA,MAAKF,SAAL,GAAiBA,SAAjB;IACA,MAAKC,aAAL,GAAqBA,aAArB;IACA,+FAAoB,WAApB;IACA,MAAKE,EAAL,cAAcL,kBAAd;;IAEA,MAAKM,mBAAL;;IAXA;EAYD;EAED;AACF;AACA;;;;;SACE,eAAsB;MACpB,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAiB;MACf,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAyB;MACvB,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;WACE,+BAAsB;MAAA;;MACpB,IAAMC,KAAK,GAAG;QACZC,IAAI,EAAE,qBADM;QAEZC,QAAQ,EAAE;MAFE,CAAd;MAKA,KAAKN,aAAL,CAAmBO,EAAnB,CACEC,kCAAA,CAAGb,iBAAH,CAAqBC,YADvB,EAEE,UAACa,KAAD,EAAwBC,GAAxB,EAAyC;QACvCC,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,iFAC2E,MAAI,CAACX,EADhF,yBACiG,MAAI,CAACH,SADtG,mBACwHW,GADxH,qBACsID,KADtI;;QAGA,0CAAI,aAAaC,GAAG,GAAG,MAAI,CAACT,oBAAL,CAA0BS,GAA1B,CAAH,GAAoCI,SAApD,CAAJ;QACA,0CAAI,QAAQJ,GAAR,CAAJ;QACA,0CAAI,gBAAgBD,KAAhB,CAAJ;;QAEA,MAAI,CAACM,IAAL,CAAUX,KAAV,EAAiBT,iBAAiB,CAACC,YAAnC,EAAiD;UAC/Ca,KAAK,sCAAE,MAAF,eAD0C;UAE/CC,GAAG,sCAAE,MAAF,OAF4C;UAG/CM,QAAQ,sCAAE,MAAF;QAHuC,CAAjD;MAKD,CAfH;IAiBD;IAED;AACF;AACA;AACA;AACA;;;;SACE,eAA0B;MACxB,OAAO,KAAKhB,aAAL,CAAmBiB,MAA1B;IACD;IAED;AACF;AACA;;;;SACE,eAAsC;MACpC,OAAO,KAAKjB,aAAZ;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,4BAA0B;MACxB,wDAAoB,WAApB;MACA,gDAAYc,SAAZ;MACA,qDAAiBA,SAAjB;IACD;;;EArH8BI,oB"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports.ReceiveSlotManager = void 0;
12
+
13
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
14
+
15
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
16
+
17
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
18
+
19
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
20
+
21
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
22
+
23
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
24
+
25
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
26
+
27
+ var _internalMediaCore = require("@webex/internal-media-core");
28
+
29
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
30
+
31
+ var _receiveSlot = require("./receiveSlot");
32
+
33
+ /* eslint-disable import/prefer-default-export */
34
+
35
+ /**
36
+ * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,
37
+ * so this manager has a pool in order to re-use the slots that were released earlier.
38
+ */
39
+ var ReceiveSlotManager = /*#__PURE__*/function () {
40
+ /**
41
+ * Constructor
42
+ * @param {Meeting} meeting
43
+ */
44
+ function ReceiveSlotManager(meeting) {
45
+ var _this$allocatedSlots, _this$freeSlots;
46
+
47
+ (0, _classCallCheck2.default)(this, ReceiveSlotManager);
48
+ (0, _defineProperty2.default)(this, "allocatedSlots", void 0);
49
+ (0, _defineProperty2.default)(this, "freeSlots", void 0);
50
+ (0, _defineProperty2.default)(this, "meeting", void 0);
51
+ this.allocatedSlots = (_this$allocatedSlots = {}, (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$allocatedSlots);
52
+ this.freeSlots = (_this$freeSlots = {}, (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$freeSlots);
53
+ this.meeting = meeting;
54
+ }
55
+ /**
56
+ * Creates a new receive slot or returns one from the existing pool of free slots
57
+ *
58
+ * @param {MC.MediaType} mediaType
59
+ * @returns {Promise<ReceiveSlot>}
60
+ */
61
+
62
+
63
+ (0, _createClass2.default)(ReceiveSlotManager, [{
64
+ key: "allocateSlot",
65
+ value: function () {
66
+ var _allocateSlot = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(mediaType) {
67
+ var _this$meeting,
68
+ _this$meeting$mediaPr,
69
+ _this = this;
70
+
71
+ var availableSlot, wcmeReceiveSlot, receiveSlot;
72
+ return _regenerator.default.wrap(function _callee$(_context) {
73
+ while (1) {
74
+ switch (_context.prev = _context.next) {
75
+ case 0:
76
+ if ((_this$meeting = this.meeting) !== null && _this$meeting !== void 0 && (_this$meeting$mediaPr = _this$meeting.mediaProperties) !== null && _this$meeting$mediaPr !== void 0 && _this$meeting$mediaPr.webrtcMediaConnection) {
77
+ _context.next = 2;
78
+ break;
79
+ }
80
+
81
+ return _context.abrupt("return", _promise.default.reject(new Error('Webrtc media connection is missing')));
82
+
83
+ case 2:
84
+ // try to use one of the free ones
85
+ availableSlot = this.freeSlots[mediaType].pop();
86
+
87
+ if (!availableSlot) {
88
+ _context.next = 7;
89
+ break;
90
+ }
91
+
92
+ this.allocatedSlots[mediaType].push(availableSlot);
93
+
94
+ _loggerProxy.default.logger.log("receive slot re-used: ".concat(availableSlot.id));
95
+
96
+ return _context.abrupt("return", availableSlot);
97
+
98
+ case 7:
99
+ _context.next = 9;
100
+ return this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);
101
+
102
+ case 9:
103
+ wcmeReceiveSlot = _context.sent;
104
+ receiveSlot = new _receiveSlot.ReceiveSlot(mediaType, wcmeReceiveSlot, function (csi) {
105
+ var _this$meeting$members;
106
+
107
+ return (_this$meeting$members = _this.meeting.members.findMemberByCsi(csi)) === null || _this$meeting$members === void 0 ? void 0 : _this$meeting$members.id;
108
+ });
109
+ this.allocatedSlots[mediaType].push(receiveSlot);
110
+
111
+ _loggerProxy.default.logger.log("new receive slot allocated: ".concat(receiveSlot.id));
112
+
113
+ return _context.abrupt("return", receiveSlot);
114
+
115
+ case 14:
116
+ case "end":
117
+ return _context.stop();
118
+ }
119
+ }
120
+ }, _callee, this);
121
+ }));
122
+
123
+ function allocateSlot(_x) {
124
+ return _allocateSlot.apply(this, arguments);
125
+ }
126
+
127
+ return allocateSlot;
128
+ }()
129
+ /**
130
+ * Releases the slot back to the pool so it can be re-used by others in the future
131
+ * @param {ReceiveSlot} slot
132
+ */
133
+
134
+ }, {
135
+ key: "releaseSlot",
136
+ value: function releaseSlot(slot) {
137
+ var idx = this.allocatedSlots[slot.mediaType].findIndex(function (allocatedSlot) {
138
+ return allocatedSlot === slot;
139
+ });
140
+
141
+ if (idx >= 0) {
142
+ this.allocatedSlots[slot.mediaType].splice(idx, 1);
143
+ this.freeSlots[slot.mediaType].push(slot);
144
+
145
+ _loggerProxy.default.logger.log("receive slot released: ".concat(slot.id));
146
+ } else {
147
+ _loggerProxy.default.logger.warn('ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager');
148
+ }
149
+ }
150
+ /**
151
+ * Resets the slot manager - this method should be called when the media connection is torn down
152
+ */
153
+
154
+ }, {
155
+ key: "reset",
156
+ value: function reset() {
157
+ var _this$allocatedSlots2, _this$freeSlots2;
158
+
159
+ this.allocatedSlots = (_this$allocatedSlots2 = {}, (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$allocatedSlots2);
160
+ this.freeSlots = (_this$freeSlots2 = {}, (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$freeSlots2);
161
+ }
162
+ /**
163
+ * Returns statistics about the managed slots
164
+ *
165
+ * @returns {Object}
166
+ */
167
+
168
+ }, {
169
+ key: "getStats",
170
+ value: function getStats() {
171
+ var _this2 = this;
172
+
173
+ var numAllocatedSlots = {};
174
+ var numFreeSlots = {};
175
+ (0, _keys.default)(this.allocatedSlots).forEach(function (key) {
176
+ if (_this2.allocatedSlots[key].length > 0) {
177
+ numAllocatedSlots[key] = _this2.allocatedSlots[key].length;
178
+ }
179
+ });
180
+ (0, _keys.default)(this.freeSlots).forEach(function (key) {
181
+ if (_this2.freeSlots[key].length > 0) {
182
+ numFreeSlots[key] = _this2.freeSlots[key].length;
183
+ }
184
+ });
185
+ return {
186
+ numAllocatedSlots: numAllocatedSlots,
187
+ numFreeSlots: numFreeSlots
188
+ };
189
+ }
190
+ }]);
191
+ return ReceiveSlotManager;
192
+ }();
193
+
194
+ exports.ReceiveSlotManager = ReceiveSlotManager;
195
+ //# sourceMappingURL=receiveSlotManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReceiveSlotManager","meeting","allocatedSlots","MC","MediaType","AudioMain","VideoMain","AudioSlides","VideoSlides","freeSlots","mediaType","mediaProperties","webrtcMediaConnection","reject","Error","availableSlot","pop","push","LoggerProxy","logger","log","id","createReceiveSlot","wcmeReceiveSlot","receiveSlot","ReceiveSlot","csi","members","findMemberByCsi","slot","idx","findIndex","allocatedSlot","splice","warn","numAllocatedSlots","numFreeSlots","forEach","key","length"],"sources":["receiveSlotManager.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Meeting from '../meeting';\n\nimport {CSI, ReceiveSlot} from './receiveSlot';\n\n/**\n * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,\n * so this manager has a pool in order to re-use the slots that were released earlier.\n */\nexport class ReceiveSlotManager {\n private allocatedSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private freeSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private meeting: Meeting;\n\n /**\n * Constructor\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.meeting = meeting;\n }\n\n /**\n * Creates a new receive slot or returns one from the existing pool of free slots\n *\n * @param {MC.MediaType} mediaType\n * @returns {Promise<ReceiveSlot>}\n */\n async allocateSlot(mediaType: MC.MediaType): Promise<ReceiveSlot> {\n if (!this.meeting?.mediaProperties?.webrtcMediaConnection) {\n return Promise.reject(new Error('Webrtc media connection is missing'));\n }\n\n // try to use one of the free ones\n const availableSlot = this.freeSlots[mediaType].pop();\n\n if (availableSlot) {\n this.allocatedSlots[mediaType].push(availableSlot);\n\n LoggerProxy.logger.log(`receive slot re-used: ${availableSlot.id}`);\n\n return availableSlot;\n }\n\n // we have to create a new one\n const wcmeReceiveSlot =\n await this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);\n\n const receiveSlot = new ReceiveSlot(\n mediaType,\n wcmeReceiveSlot,\n (csi: CSI) => this.meeting.members.findMemberByCsi(csi)?.id\n );\n\n this.allocatedSlots[mediaType].push(receiveSlot);\n LoggerProxy.logger.log(`new receive slot allocated: ${receiveSlot.id}`);\n\n return receiveSlot;\n }\n\n /**\n * Releases the slot back to the pool so it can be re-used by others in the future\n * @param {ReceiveSlot} slot\n */\n releaseSlot(slot: ReceiveSlot) {\n const idx = this.allocatedSlots[slot.mediaType].findIndex(\n (allocatedSlot) => allocatedSlot === slot\n );\n\n if (idx >= 0) {\n this.allocatedSlots[slot.mediaType].splice(idx, 1);\n this.freeSlots[slot.mediaType].push(slot);\n LoggerProxy.logger.log(`receive slot released: ${slot.id}`);\n } else {\n LoggerProxy.logger.warn(\n 'ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager'\n );\n }\n }\n\n /**\n * Resets the slot manager - this method should be called when the media connection is torn down\n */\n reset() {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n }\n\n /**\n * Returns statistics about the managed slots\n *\n * @returns {Object}\n */\n getStats() {\n const numAllocatedSlots = {};\n const numFreeSlots = {};\n\n Object.keys(this.allocatedSlots).forEach((key) => {\n if (this.allocatedSlots[key].length > 0) {\n numAllocatedSlots[key] = this.allocatedSlots[key].length;\n }\n });\n\n Object.keys(this.freeSlots).forEach((key) => {\n if (this.freeSlots[key].length > 0) {\n numFreeSlots[key] = this.freeSlots[key].length;\n }\n });\n\n return {\n numAllocatedSlots,\n numFreeSlots,\n };\n }\n}\n"],"mappings":"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"}