@webex/plugin-meetings 3.7.0-next.57 → 3.7.0-next.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -209,7 +209,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
209
209
  sessionId: this.sessionId
210
210
  });
211
211
  },
212
- version: "3.7.0-next.57"
212
+ version: "3.7.0-next.59"
213
213
  });
214
214
  var _default = exports.default = Breakout;
215
215
  //# sourceMappingURL=breakout.js.map
@@ -1046,7 +1046,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1046
1046
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1047
1047
  }
1048
1048
  },
1049
- version: "3.7.0-next.57"
1049
+ version: "3.7.0-next.59"
1050
1050
  });
1051
1051
  var _default = exports.default = Breakouts;
1052
1052
  //# sourceMappingURL=index.js.map
@@ -373,7 +373,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
373
373
  throw error;
374
374
  });
375
375
  },
376
- version: "3.7.0-next.57"
376
+ version: "3.7.0-next.59"
377
377
  });
378
378
  var _default = exports.default = SimultaneousInterpretation;
379
379
  //# 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.7.0-next.57"
21
+ version: "3.7.0-next.59"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createBrbState = exports.BrbState = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
10
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
15
+ var _internalMediaCore = require("@webex/internal-media-core");
16
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
17
+ var createBrbState = exports.createBrbState = function createBrbState(meeting, enabled) {
18
+ _loggerProxy.default.logger.info("Meeting:brbState#createBrbState: creating BrbState for meeting id ".concat(meeting === null || meeting === void 0 ? void 0 : meeting.id));
19
+ var brbState = new BrbState(meeting, enabled);
20
+ return brbState;
21
+ };
22
+
23
+ /** The purpose of this class is to manage the local and remote brb state
24
+ * and make sure that the server state always matches the last requested state by the client.
25
+ */
26
+ var BrbState = exports.BrbState = /*#__PURE__*/function () {
27
+ /**
28
+ * Constructor
29
+ *
30
+ * @param {Meeting} meeting - the meeting object
31
+ * @param {boolean} enabled - whether the client audio/video is enabled at all
32
+ */
33
+ function BrbState(meeting, enabled) {
34
+ (0, _classCallCheck2.default)(this, BrbState);
35
+ (0, _defineProperty2.default)(this, "state", void 0);
36
+ (0, _defineProperty2.default)(this, "meeting", void 0);
37
+ this.meeting = meeting;
38
+ this.state = {
39
+ client: {
40
+ enabled: enabled
41
+ },
42
+ server: {
43
+ enabled: false
44
+ },
45
+ syncToServerInProgress: false
46
+ };
47
+ }
48
+
49
+ /**
50
+ * Enables/disables brb
51
+ *
52
+ * @param {boolean} enabled
53
+ * @param {SendSlotManager} sendSlotManager
54
+ * @returns {Promise}
55
+ */
56
+ (0, _createClass2.default)(BrbState, [{
57
+ key: "enable",
58
+ value: function enable(enabled, sendSlotManager) {
59
+ this.state.client.enabled = enabled;
60
+ return this.applyClientStateToServer(sendSlotManager);
61
+ }
62
+
63
+ /**
64
+ * Updates the server local and remote brb values so that they match the current client desired state.
65
+ *
66
+ * @param {SendSlotManager} sendSlotManager
67
+ * @returns {Promise}
68
+ */
69
+ }, {
70
+ key: "applyClientStateToServer",
71
+ value: function applyClientStateToServer(sendSlotManager) {
72
+ var _this = this;
73
+ if (this.state.syncToServerInProgress) {
74
+ _loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: request to server in progress, we need to wait for it to complete");
75
+ return _promise.default.resolve();
76
+ }
77
+ var remoteBrbRequiresSync = this.state.client.enabled !== this.state.server.enabled;
78
+ _loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: remoteBrbRequiresSync: ".concat(remoteBrbRequiresSync));
79
+ if (!remoteBrbRequiresSync) {
80
+ _loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: client state already matching server state, nothing to do");
81
+ return _promise.default.resolve();
82
+ }
83
+ this.state.syncToServerInProgress = true;
84
+ return this.sendLocalBrbStateToServer(sendSlotManager).then(function () {
85
+ _this.state.syncToServerInProgress = false;
86
+ _loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: sync with server completed");
87
+
88
+ // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
89
+ _this.applyClientStateToServer(sendSlotManager);
90
+ }).catch(function (e) {
91
+ _this.state.syncToServerInProgress = false;
92
+ _loggerProxy.default.logger.warn("Meeting:brbState#applyClientStateToServer: error: ".concat(e));
93
+ });
94
+ }
95
+
96
+ /**
97
+ * Send the local brb state to the server
98
+ *
99
+ * @param {SendSlotManager} sendSlotManager
100
+ * @returns {Promise}
101
+ */
102
+ }, {
103
+ key: "sendLocalBrbStateToServer",
104
+ value: (function () {
105
+ var _sendLocalBrbStateToServer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(sendSlotManager) {
106
+ var enabled, errorMessage, error, _errorMessage, _error;
107
+ return _regenerator.default.wrap(function _callee$(_context) {
108
+ while (1) switch (_context.prev = _context.next) {
109
+ case 0:
110
+ enabled = this.state.client.enabled;
111
+ if (this.meeting.isMultistream) {
112
+ _context.next = 6;
113
+ break;
114
+ }
115
+ errorMessage = 'Meeting:brbState#sendLocalBrbStateToServer: Not a multistream meeting';
116
+ error = new Error(errorMessage);
117
+ _loggerProxy.default.logger.error(error);
118
+ return _context.abrupt("return", _promise.default.reject(error));
119
+ case 6:
120
+ if (this.meeting.mediaProperties.webrtcMediaConnection) {
121
+ _context.next = 11;
122
+ break;
123
+ }
124
+ _errorMessage = 'Meeting:brbState#sendLocalBrbStateToServer: WebRTC media connection is not defined';
125
+ _error = new Error(_errorMessage);
126
+ _loggerProxy.default.logger.error(_error);
127
+ return _context.abrupt("return", _promise.default.reject(_error));
128
+ case 11:
129
+ return _context.abrupt("return", this.meeting.meetingRequest.setBrb({
130
+ enabled: enabled,
131
+ locusUrl: this.meeting.locusUrl,
132
+ deviceUrl: this.meeting.deviceUrl,
133
+ selfId: this.meeting.selfId
134
+ }).then(function () {
135
+ sendSlotManager.setSourceStateOverride(_internalMediaCore.MediaType.VideoMain, enabled ? 'away' : null);
136
+ }).catch(function (error) {
137
+ _loggerProxy.default.logger.error('Meeting:brbState#sendLocalBrbStateToServer: Error ', error);
138
+ return _promise.default.reject(error);
139
+ }));
140
+ case 12:
141
+ case "end":
142
+ return _context.stop();
143
+ }
144
+ }, _callee, this);
145
+ }));
146
+ function sendLocalBrbStateToServer(_x) {
147
+ return _sendLocalBrbStateToServer.apply(this, arguments);
148
+ }
149
+ return sendLocalBrbStateToServer;
150
+ }()
151
+ /**
152
+ * This method should be called whenever the server brb state is changed
153
+ *
154
+ * @param {Boolean} [enabled] true if user has brb enabled, false otherwise
155
+ * @returns {undefined}
156
+ */
157
+ )
158
+ }, {
159
+ key: "handleServerBrbUpdate",
160
+ value: function handleServerBrbUpdate(enabled) {
161
+ _loggerProxy.default.logger.info("Meeting:brbState#handleServerBrbUpdate: updating server brb to (".concat(enabled, ")"));
162
+ this.state.server.enabled = !!enabled;
163
+ }
164
+ }]);
165
+ return BrbState;
166
+ }();
167
+ //# sourceMappingURL=brbState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_internalMediaCore","require","_loggerProxy","_interopRequireDefault","createBrbState","exports","meeting","enabled","LoggerProxy","logger","info","concat","id","brbState","BrbState","_classCallCheck2","default","_defineProperty2","state","client","server","syncToServerInProgress","_createClass2","key","value","enable","sendSlotManager","applyClientStateToServer","_this","_promise","resolve","remoteBrbRequiresSync","sendLocalBrbStateToServer","then","catch","e","warn","_sendLocalBrbStateToServer","_asyncToGenerator2","_regenerator","mark","_callee","errorMessage","error","_errorMessage","_error","wrap","_callee$","_context","prev","next","isMultistream","Error","abrupt","reject","mediaProperties","webrtcMediaConnection","meetingRequest","setBrb","locusUrl","deviceUrl","selfId","setSourceStateOverride","MediaType","VideoMain","stop","_x","apply","arguments","handleServerBrbUpdate"],"sources":["brbState.ts"],"sourcesContent":["import {MediaType} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport type Meeting from '.';\nimport SendSlotManager from '../multistream/sendSlotManager';\n\nexport const createBrbState = (meeting: Meeting, enabled: boolean) => {\n LoggerProxy.logger.info(\n `Meeting:brbState#createBrbState: creating BrbState for meeting id ${meeting?.id}`\n );\n\n const brbState = new BrbState(meeting, enabled);\n\n return brbState;\n};\n\n/** The purpose of this class is to manage the local and remote brb state\n * and make sure that the server state always matches the last requested state by the client.\n */\nexport class BrbState {\n state: {\n client: {\n enabled: boolean;\n };\n server: {\n enabled: boolean;\n };\n syncToServerInProgress: boolean;\n };\n\n meeting: Meeting;\n\n /**\n * Constructor\n *\n * @param {Meeting} meeting - the meeting object\n * @param {boolean} enabled - whether the client audio/video is enabled at all\n */\n constructor(meeting: Meeting, enabled: boolean) {\n this.meeting = meeting;\n this.state = {\n client: {\n enabled,\n },\n server: {\n enabled: false,\n },\n syncToServerInProgress: false,\n };\n }\n\n /**\n * Enables/disables brb\n *\n * @param {boolean} enabled\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n public enable(enabled: boolean, sendSlotManager: SendSlotManager) {\n this.state.client.enabled = enabled;\n\n return this.applyClientStateToServer(sendSlotManager);\n }\n\n /**\n * Updates the server local and remote brb values so that they match the current client desired state.\n *\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n private applyClientStateToServer(sendSlotManager: SendSlotManager) {\n if (this.state.syncToServerInProgress) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: request to server in progress, we need to wait for it to complete`\n );\n\n return Promise.resolve();\n }\n\n const remoteBrbRequiresSync = this.state.client.enabled !== this.state.server.enabled;\n\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: remoteBrbRequiresSync: ${remoteBrbRequiresSync}`\n );\n\n if (!remoteBrbRequiresSync) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: client state already matching server state, nothing to do`\n );\n\n return Promise.resolve();\n }\n\n this.state.syncToServerInProgress = true;\n\n return this.sendLocalBrbStateToServer(sendSlotManager)\n .then(() => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: sync with server completed`\n );\n\n // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync\n this.applyClientStateToServer(sendSlotManager);\n })\n .catch((e) => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.warn(`Meeting:brbState#applyClientStateToServer: error: ${e}`);\n });\n }\n\n /**\n * Send the local brb state to the server\n *\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n private async sendLocalBrbStateToServer(sendSlotManager: SendSlotManager) {\n const {enabled} = this.state.client;\n\n if (!this.meeting.isMultistream) {\n const errorMessage = 'Meeting:brbState#sendLocalBrbStateToServer: Not a multistream meeting';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n if (!this.meeting.mediaProperties.webrtcMediaConnection) {\n const errorMessage =\n 'Meeting:brbState#sendLocalBrbStateToServer: WebRTC media connection is not defined';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n // this logic should be applied only to multistream meetings\n return this.meeting.meetingRequest\n .setBrb({\n enabled,\n locusUrl: this.meeting.locusUrl,\n deviceUrl: this.meeting.deviceUrl,\n selfId: this.meeting.selfId,\n })\n .then(() => {\n sendSlotManager.setSourceStateOverride(MediaType.VideoMain, enabled ? 'away' : null);\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:brbState#sendLocalBrbStateToServer: Error ', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * This method should be called whenever the server brb state is changed\n *\n * @param {Boolean} [enabled] true if user has brb enabled, false otherwise\n * @returns {undefined}\n */\n public handleServerBrbUpdate(enabled?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:brbState#handleServerBrbUpdate: updating server brb to (${enabled})`\n );\n this.state.server.enabled = !!enabled;\n }\n}\n"],"mappings":"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"}