@webex/plugin-meetings 3.12.0-next.50 → 3.12.0-next.52
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/aiEnableRequest/index.js +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/hashTree/hashTreeParser.js +54 -14
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +12 -0
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/types.js +4 -1
- package/dist/locus-info/types.js.map +1 -1
- package/dist/meetings/index.js +7 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/multistream/receiveSlot.js +9 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/types/hashTree/hashTreeParser.d.ts +26 -5
- package/dist/types/locus-info/types.d.ts +4 -0
- package/dist/types/meetings/index.d.ts +2 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/hashTree/hashTreeParser.ts +64 -22
- package/src/locus-info/index.ts +15 -0
- package/src/locus-info/types.ts +6 -0
- package/src/meetings/index.ts +15 -10
- package/src/multistream/receiveSlot.ts +18 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +130 -32
- package/test/unit/spec/locus-info/index.js +32 -0
- package/test/unit/spec/meetings/index.js +34 -0
|
@@ -134,6 +134,15 @@ var ReceiveSlot = exports.ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
|
|
|
134
134
|
memberId: _classPrivateFieldGet(_memberId, _this2)
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
|
+
this.mcReceiveSlot.on(_internalMediaCore.ReceiveSlotEvents.MediaStarted, function () {
|
|
138
|
+
_loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> media started on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType));
|
|
139
|
+
});
|
|
140
|
+
this.mcReceiveSlot.on(_internalMediaCore.ReceiveSlotEvents.MediaStopped, function () {
|
|
141
|
+
_loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> media stopped on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType));
|
|
142
|
+
});
|
|
143
|
+
this.mcReceiveSlot.on(_internalMediaCore.ReceiveSlotEvents.MediaEnded, function () {
|
|
144
|
+
_loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> media ended on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType));
|
|
145
|
+
});
|
|
137
146
|
}
|
|
138
147
|
|
|
139
148
|
/** Tries to find the member id for this receive slot if it hasn't got one */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_internalMediaCore","require","_loggerProxy","_interopRequireDefault","_eventsScope","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","_classPrivateFieldInitSpec","a","_checkPrivateRedeclaration","set","has","TypeError","_classPrivateFieldGet","s","get","_assertClassBrand","_classPrivateFieldSet","r","n","arguments","length","ReceiveSlotEvents","exports","SourceUpdate","MaxFsUpdate","receiveSlotCounter","_memberId","_weakMap","_csi","_sourceState","ReceiveSlot","_EventsScope","mediaType","mcReceiveSlot","findMemberIdCallback","_this","_classCallCheck2","_defineProperty2","id","concat","setupEventListeners","_inherits2","_createClass2","key","value","setMaxFs","newFs","emit","file","function","maxFs","_this2","scope","on","WcmeReceiveSlotEvents","state","csi","LoggerProxy","logger","log","undefined","memberId","findMemberId","_stringify","stream","EventsScope"],"sources":["receiveSlot.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {\n MediaType,\n ReceiveSlot as WcmeReceiveSlot,\n ReceiveSlotEvents as WcmeReceiveSlotEvents,\n StreamState,\n} 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 MaxFsUpdate: 'maxFsUpdate',\n};\n\nexport type {StreamState} from '@webex/internal-media-core';\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: WcmeReceiveSlot;\n\n private readonly findMemberIdCallback: FindMemberIdCallback;\n\n public readonly id: ReceiveSlotId;\n\n public readonly mediaType: MediaType;\n\n #memberId?: MemberId;\n\n #csi?: CSI;\n\n #sourceState: StreamState;\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 {MediaType} mediaType\n * @param {ReceiveSlot} mcReceiveSlot\n * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI\n */\n constructor(\n mediaType: MediaType,\n mcReceiveSlot: WcmeReceiveSlot,\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 * Set the max frame size for this slot\n * @param newFs frame size\n */\n public setMaxFs(newFs) {\n // emit event for media request manager to listen to\n\n this.emit(\n {\n file: 'meeting/receiveSlot',\n function: 'findMemberId',\n },\n ReceiveSlotEvents.MaxFsUpdate,\n {\n maxFs: newFs,\n }\n );\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 private setupEventListeners() {\n const scope = {\n file: 'meeting/receiveSlot',\n function: 'setupEventListeners',\n };\n\n this.mcReceiveSlot.on(\n WcmeReceiveSlotEvents.SourceUpdate,\n (state: StreamState, 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 /** Tries to find the member id for this receive slot if it hasn't got one */\n public findMemberId() {\n if (this.#memberId === undefined && this.#csi) {\n this.#memberId = this.findMemberIdCallback(this.#csi);\n\n if (this.#memberId) {\n // if we found the memberId, simulate source update so that the client app knows that something's changed\n this.emit(\n {\n file: 'meeting/receiveSlot',\n function: 'findMemberId',\n },\n ReceiveSlotEvents.SourceUpdate,\n {\n state: this.#sourceState,\n csi: this.#csi,\n memberId: this.#memberId,\n }\n );\n }\n }\n }\n\n /**\n * @returns {string} a log message used to identify the receive slot\n */\n public get logString() {\n return `ReceiveSlot - ${this.id}: ${JSON.stringify(this.mcReceiveSlot.id)}`;\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(): WcmeReceiveSlot {\n return this.mcReceiveSlot;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AACA,IAAAA,kBAAA,GAAAC,OAAA;AAOA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,YAAA,GAAAD,sBAAA,CAAAF,OAAA;AAAwD,SAAAI,WAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,WAAAD,CAAA,OAAAE,gBAAA,CAAAC,OAAA,EAAAH,CAAA,OAAAI,2BAAA,CAAAD,OAAA,EAAAJ,CAAA,EAAAM,yBAAA,KAAAC,kBAAA,CAAAN,CAAA,EAAAC,CAAA,YAAAC,gBAAA,CAAAC,OAAA,EAAAJ,CAAA,EAAAQ,WAAA,IAAAP,CAAA,CAAAQ,KAAA,CAAAT,CAAA,EAAAE,CAAA;AAAA,SAAAI,0BAAA,cAAAN,CAAA,IAAAU,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAN,kBAAA,CAAAG,OAAA,iCAAAV,CAAA,aAAAM,yBAAA,YAAAA,0BAAA,aAAAN,CAAA;AAAA,SAAAc,2BAAAZ,CAAA,EAAAF,CAAA,EAAAe,CAAA,IAAAC,0BAAA,CAAAd,CAAA,EAAAF,CAAA,GAAAA,CAAA,CAAAiB,GAAA,CAAAf,CAAA,EAAAa,CAAA;AAAA,SAAAC,2BAAAd,CAAA,EAAAF,CAAA,QAAAA,CAAA,CAAAkB,GAAA,CAAAhB,CAAA,aAAAiB,SAAA;AAAA,SAAAC,sBAAAC,CAAA,EAAAN,CAAA,WAAAM,CAAA,CAAAC,GAAA,CAAAC,iBAAA,CAAAF,CAAA,EAAAN,CAAA;AAAA,SAAAS,sBAAAH,CAAA,EAAAN,CAAA,EAAAU,CAAA,WAAAJ,CAAA,CAAAJ,GAAA,CAAAM,iBAAA,CAAAF,CAAA,EAAAN,CAAA,GAAAU,CAAA,GAAAA,CAAA;AAAA,SAAAF,kBAAArB,CAAA,EAAAF,CAAA,EAAA0B,CAAA,6BAAAxB,CAAA,GAAAA,CAAA,KAAAF,CAAA,GAAAE,CAAA,CAAAgB,GAAA,CAAAlB,CAAA,UAAA2B,SAAA,CAAAC,MAAA,OAAA5B,CAAA,GAAA0B,CAAA,YAAAP,SAAA,qDATxD;AAWO,IAAMU,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG;EAC/BE,YAAY,EAAE,cAAc;EAC5BC,WAAW,EAAE;AACf,CAAC;AAOD,IAAIC,kBAAkB,GAAG,CAAC;AAAC,IAAAC,SAAA,oBAAAC,QAAA,CAAA/B,OAAA;AAAA,IAAAgC,IAAA,oBAAAD,QAAA,CAAA/B,OAAA;AAAA,IAAAiC,YAAA,oBAAAF,QAAA,CAAA/B,OAAA;AAI3B;AACA;AACA;AACA;AAHA,IAIakC,WAAW,GAAAR,OAAA,CAAAQ,WAAA,0BAAAC,YAAA;EAetB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,SAAAD,YACEE,SAAoB,EACpBC,aAA8B,EAC9BC,oBAA0C,EAC1C;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAAxC,OAAA,QAAAkC,WAAA;IACAK,KAAA,GAAA5C,UAAA,OAAAuC,WAAA;IAAQ,IAAAO,gBAAA,CAAAzC,OAAA,EAAAuC,KAAA;IAAA,IAAAE,gBAAA,CAAAzC,OAAA,EAAAuC,KAAA;IAAA,IAAAE,gBAAA,CAAAzC,OAAA,EAAAuC,KAAA;IAAA,IAAAE,gBAAA,CAAAzC,OAAA,EAAAuC,KAAA;IAnBV7B,0BAAA,CAAA6B,KAAA,EAAAT,SAAS;IAETpB,0BAAA,CAAA6B,KAAA,EAAAP,IAAI;IAEJtB,0BAAA,CAAA6B,KAAA,EAAAN,YAAY;IAiBVJ,kBAAkB,IAAI,CAAC;IAEvBU,KAAA,CAAKD,oBAAoB,GAAGA,oBAAoB;IAChDC,KAAA,CAAKH,SAAS,GAAGA,SAAS;IAC1BG,KAAA,CAAKF,aAAa,GAAGA,aAAa;IAClCjB,qBAAA,CAAKa,YAAY,EAAAM,KAAA,EAAG,WAAJ,CAAC;IACjBA,KAAA,CAAKG,EAAE,OAAAC,MAAA,CAAOd,kBAAkB,CAAE;IAElCU,KAAA,CAAKK,mBAAmB,CAAC,CAAC;IAAC,OAAAL,KAAA;EAC7B;;EAEA;AACF;AACA;EAFE,IAAAM,UAAA,CAAA7C,OAAA,EAAAkC,WAAA,EAAAC,YAAA;EAAA,WAAAW,aAAA,CAAA9C,OAAA,EAAAkC,WAAA;IAAAa,GAAA;IAAA7B,GAAA,EAGA,SAAAA,IAAA,EAAsB;MACpB,OAAOF,qBAAA,CAAKc,SAAS,EAAd,IAAa,CAAC;IACvB;;IAEA;AACF;AACA;EAFE;IAAAiB,GAAA;IAAA7B,GAAA,EAGA,SAAAA,IAAA,EAAiB;MACf,OAAOF,qBAAA,CAAKgB,IAAI,EAAT,IAAQ,CAAC;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAe,GAAA;IAAAC,KAAA,EAIA,SAAOC,QAAQA,CAACC,KAAK,EAAE;MACrB;;MAEA,IAAI,CAACC,IAAI,CACP;QACEC,IAAI,EAAE,qBAAqB;QAC3BC,QAAQ,EAAE;MACZ,CAAC,EACD5B,iBAAiB,CAACG,WAAW,EAC7B;QACE0B,KAAK,EAAEJ;MACT,CACF,CAAC;IACH;;IAEA;AACF;AACA;EAFE;IAAAH,GAAA;IAAA7B,GAAA,EAGA,SAAAA,IAAA,EAAyB;MACvB,OAAOF,qBAAA,CAAKiB,YAAY,EAAjB,IAAgB,CAAC;IAC1B;;IAEA;AACF;AACA;EAFE;IAAAc,GAAA;IAAAC,KAAA,EAGA,SAAQJ,mBAAmBA,CAAA,EAAG;MAAA,IAAAW,MAAA;MAC5B,IAAMC,KAAK,GAAG;QACZJ,IAAI,EAAE,qBAAqB;QAC3BC,QAAQ,EAAE;MACZ,CAAC;MAED,IAAI,CAAChB,aAAa,CAACoB,EAAE,CACnBC,oCAAqB,CAAC/B,YAAY,EAClC,UAACgC,KAAkB,EAAEC,GAAY,EAAK;QACpCC,oBAAW,CAACC,MAAM,CAACC,GAAG,0EAAApB,MAAA,CACqDY,MAAI,CAACb,EAAE,kBAAAC,MAAA,CAAeY,MAAI,CAACnB,SAAS,YAAAO,MAAA,CAASiB,GAAG,cAAAjB,MAAA,CAAWgB,KAAK,CAC3I,CAAC;QACDvC,qBAAA,CAAKU,SAAS,EAAdyB,MAAI,EAAaK,GAAG,GAAGL,MAAI,CAACjB,oBAAoB,CAACsB,GAAG,CAAC,GAAGI,SAA3C,CAAC;QACd5C,qBAAA,CAAKY,IAAI,EAATuB,MAAI,EAAQK,GAAJ,CAAC;QACTxC,qBAAA,CAAKa,YAAY,EAAjBsB,MAAI,EAAgBI,KAAJ,CAAC;QAEjBJ,MAAI,CAACJ,IAAI,CAACK,KAAK,EAAE/B,iBAAiB,CAACE,YAAY,EAAE;UAC/CgC,KAAK,EAAE3C,qBAAA,CAAKiB,YAAY,EAAjBsB,MAAgB,CAAC;UACxBK,GAAG,EAAE5C,qBAAA,CAAKgB,IAAI,EAATuB,MAAQ,CAAC;UACdU,QAAQ,EAAEjD,qBAAA,CAAKc,SAAS,EAAdyB,MAAa;QACzB,CAAC,CAAC;MACJ,CACF,CAAC;IACH;;IAEA;EAAA;IAAAR,GAAA;IAAAC,KAAA,EACA,SAAOkB,YAAYA,CAAA,EAAG;MACpB,IAAIlD,qBAAA,CAAKc,SAAS,EAAd,IAAa,CAAC,KAAKkC,SAAS,IAAIhD,qBAAA,CAAKgB,IAAI,EAAT,IAAQ,CAAC,EAAE;QAC7CZ,qBAAA,CAAKU,SAAS,EAAd,IAAI,EAAa,IAAI,CAACQ,oBAAoB,CAACtB,qBAAA,CAAKgB,IAAI,EAAT,IAAQ,CAAC,CAAvC,CAAC;QAEd,IAAIhB,qBAAA,CAAKc,SAAS,EAAd,IAAa,CAAC,EAAE;UAClB;UACA,IAAI,CAACqB,IAAI,CACP;YACEC,IAAI,EAAE,qBAAqB;YAC3BC,QAAQ,EAAE;UACZ,CAAC,EACD5B,iBAAiB,CAACE,YAAY,EAC9B;YACEgC,KAAK,EAAE3C,qBAAA,CAAKiB,YAAY,EAAjB,IAAgB,CAAC;YACxB2B,GAAG,EAAE5C,qBAAA,CAAKgB,IAAI,EAAT,IAAQ,CAAC;YACdiC,QAAQ,EAAEjD,qBAAA,CAAKc,SAAS,EAAd,IAAa;UACzB,CACF,CAAC;QACH;MACF;IACF;;IAEA;AACF;AACA;EAFE;IAAAiB,GAAA;IAAA7B,GAAA,EAGA,SAAAA,IAAA,EAAuB;MACrB,wBAAAyB,MAAA,CAAwB,IAAI,CAACD,EAAE,QAAAC,MAAA,CAAK,IAAAwB,UAAA,CAAAnE,OAAA,EAAe,IAAI,CAACqC,aAAa,CAACK,EAAE,CAAC;IAC3E;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAK,GAAA;IAAA7B,GAAA,EAKA,SAAAA,IAAA,EAA0B;MACxB,OAAO,IAAI,CAACmB,aAAa,CAAC+B,MAAM;IAClC;;IAEA;AACF;AACA;EAFE;IAAArB,GAAA;IAAA7B,GAAA,EAGA,SAAAA,IAAA,EAAuC;MACrC,OAAO,IAAI,CAACmB,aAAa;IAC3B;EAAC;AAAA,EAzJ8BgC,oBAAW","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_internalMediaCore","require","_loggerProxy","_interopRequireDefault","_eventsScope","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","_classPrivateFieldInitSpec","a","_checkPrivateRedeclaration","set","has","TypeError","_classPrivateFieldGet","s","get","_assertClassBrand","_classPrivateFieldSet","r","n","arguments","length","ReceiveSlotEvents","exports","SourceUpdate","MaxFsUpdate","receiveSlotCounter","_memberId","_weakMap","_csi","_sourceState","ReceiveSlot","_EventsScope","mediaType","mcReceiveSlot","findMemberIdCallback","_this","_classCallCheck2","_defineProperty2","id","concat","setupEventListeners","_inherits2","_createClass2","key","value","setMaxFs","newFs","emit","file","function","maxFs","_this2","scope","on","WcmeReceiveSlotEvents","state","csi","LoggerProxy","logger","log","undefined","memberId","MediaStarted","MediaStopped","MediaEnded","findMemberId","_stringify","stream","EventsScope"],"sources":["receiveSlot.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {\n MediaType,\n ReceiveSlot as WcmeReceiveSlot,\n ReceiveSlotEvents as WcmeReceiveSlotEvents,\n StreamState,\n} 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 MaxFsUpdate: 'maxFsUpdate',\n};\n\nexport type {StreamState} from '@webex/internal-media-core';\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: WcmeReceiveSlot;\n\n private readonly findMemberIdCallback: FindMemberIdCallback;\n\n public readonly id: ReceiveSlotId;\n\n public readonly mediaType: MediaType;\n\n #memberId?: MemberId;\n\n #csi?: CSI;\n\n #sourceState: StreamState;\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 {MediaType} mediaType\n * @param {ReceiveSlot} mcReceiveSlot\n * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI\n */\n constructor(\n mediaType: MediaType,\n mcReceiveSlot: WcmeReceiveSlot,\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 * Set the max frame size for this slot\n * @param newFs frame size\n */\n public setMaxFs(newFs) {\n // emit event for media request manager to listen to\n\n this.emit(\n {\n file: 'meeting/receiveSlot',\n function: 'findMemberId',\n },\n ReceiveSlotEvents.MaxFsUpdate,\n {\n maxFs: newFs,\n }\n );\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 private setupEventListeners() {\n const scope = {\n file: 'meeting/receiveSlot',\n function: 'setupEventListeners',\n };\n\n this.mcReceiveSlot.on(\n WcmeReceiveSlotEvents.SourceUpdate,\n (state: StreamState, 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 this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaStarted, () => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> media started on receive slot ${this.id}, mediaType=${this.mediaType}`\n );\n });\n\n this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaStopped, () => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> media stopped on receive slot ${this.id}, mediaType=${this.mediaType}`\n );\n });\n\n this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaEnded, () => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> media ended on receive slot ${this.id}, mediaType=${this.mediaType}`\n );\n });\n }\n\n /** Tries to find the member id for this receive slot if it hasn't got one */\n public findMemberId() {\n if (this.#memberId === undefined && this.#csi) {\n this.#memberId = this.findMemberIdCallback(this.#csi);\n\n if (this.#memberId) {\n // if we found the memberId, simulate source update so that the client app knows that something's changed\n this.emit(\n {\n file: 'meeting/receiveSlot',\n function: 'findMemberId',\n },\n ReceiveSlotEvents.SourceUpdate,\n {\n state: this.#sourceState,\n csi: this.#csi,\n memberId: this.#memberId,\n }\n );\n }\n }\n }\n\n /**\n * @returns {string} a log message used to identify the receive slot\n */\n public get logString() {\n return `ReceiveSlot - ${this.id}: ${JSON.stringify(this.mcReceiveSlot.id)}`;\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(): WcmeReceiveSlot {\n return this.mcReceiveSlot;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -43,14 +43,21 @@ type WebexRequestMethod = (options: Record<string, any>) => Promise<any>;
|
|
|
43
43
|
export declare const LocusInfoUpdateType: {
|
|
44
44
|
readonly OBJECTS_UPDATED: "OBJECTS_UPDATED";
|
|
45
45
|
readonly MEETING_ENDED: "MEETING_ENDED";
|
|
46
|
+
readonly LOCUS_NOT_FOUND: "LOCUS_NOT_FOUND";
|
|
46
47
|
};
|
|
47
48
|
export type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;
|
|
49
|
+
interface LocusUpdatePayloads {
|
|
50
|
+
[LocusInfoUpdateType.OBJECTS_UPDATED]: {
|
|
51
|
+
updatedObjects: HashTreeObject[];
|
|
52
|
+
};
|
|
53
|
+
[LocusInfoUpdateType.MEETING_ENDED]: unknown;
|
|
54
|
+
[LocusInfoUpdateType.LOCUS_NOT_FOUND]: unknown;
|
|
55
|
+
}
|
|
48
56
|
export type LocusInfoUpdate = {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
};
|
|
57
|
+
[K in keyof LocusUpdatePayloads]: {
|
|
58
|
+
updateType: K;
|
|
59
|
+
} & LocusUpdatePayloads[K];
|
|
60
|
+
}[keyof LocusUpdatePayloads];
|
|
54
61
|
export type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;
|
|
55
62
|
/**
|
|
56
63
|
* This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.
|
|
@@ -58,6 +65,13 @@ export type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;
|
|
|
58
65
|
*/
|
|
59
66
|
export declare class MeetingEndedError extends Error {
|
|
60
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* This error is thrown when a 404 is received from Locus hash tree endpoints, indicating that the locus URL
|
|
70
|
+
* is no longer valid (e.g. participant moved to a breakout room, or meeting ended).
|
|
71
|
+
* It's handled internally by HashTreeParser and results in LOCUS_NOT_FOUND being sent up.
|
|
72
|
+
*/
|
|
73
|
+
export declare class LocusNotFoundError extends Error {
|
|
74
|
+
}
|
|
61
75
|
/**
|
|
62
76
|
* Parses hash tree eventing locus data
|
|
63
77
|
*/
|
|
@@ -193,6 +207,13 @@ declare class HashTreeParser {
|
|
|
193
207
|
* @returns {void}
|
|
194
208
|
*/
|
|
195
209
|
private handleRootHashHeartBeatMessage;
|
|
210
|
+
/**
|
|
211
|
+
* Handles known errors that can happen during syncs
|
|
212
|
+
*
|
|
213
|
+
* @param {any} error - The error to handle
|
|
214
|
+
* @returns {boolean} true if the error was recognized and handled, false otherwise
|
|
215
|
+
*/
|
|
216
|
+
private handleSyncErrors;
|
|
196
217
|
/**
|
|
197
218
|
* Asynchronously initializes new visible data sets
|
|
198
219
|
*
|
|
@@ -494,8 +494,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
494
494
|
* @public
|
|
495
495
|
* @memberof Meetings
|
|
496
496
|
*/
|
|
497
|
-
syncMeetings({ keepOnlyLocusMeetings }?: {
|
|
497
|
+
syncMeetings({ keepOnlyLocusMeetings, skipHashTreeSync, }?: {
|
|
498
498
|
keepOnlyLocusMeetings?: boolean;
|
|
499
|
+
skipHashTreeSync?: boolean;
|
|
499
500
|
}): Promise<void>;
|
|
500
501
|
/**
|
|
501
502
|
* sort out locus array for initial creating
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@ import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
|
6
6
|
import {Enum, HTTP_VERBS} from '../constants';
|
|
7
7
|
import {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';
|
|
8
8
|
import {ObjectType, HtMeta, HashTreeObject} from './types';
|
|
9
|
-
import {LocusDTO} from '../locus-info/types';
|
|
9
|
+
import {LocusDTO, LocusErrorCodes} from '../locus-info/types';
|
|
10
10
|
import {deleteNestedObjectsWithHtMeta, isMetadata, sortByInitPriority} from './utils';
|
|
11
11
|
|
|
12
12
|
export interface DataSet {
|
|
@@ -56,17 +56,23 @@ type WebexRequestMethod = (options: Record<string, any>) => Promise<any>;
|
|
|
56
56
|
export const LocusInfoUpdateType = {
|
|
57
57
|
OBJECTS_UPDATED: 'OBJECTS_UPDATED',
|
|
58
58
|
MEETING_ENDED: 'MEETING_ENDED',
|
|
59
|
+
LOCUS_NOT_FOUND: 'LOCUS_NOT_FOUND',
|
|
59
60
|
} as const;
|
|
60
61
|
|
|
61
62
|
export type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
|
|
64
|
+
interface LocusUpdatePayloads {
|
|
65
|
+
[LocusInfoUpdateType.OBJECTS_UPDATED]: {updatedObjects: HashTreeObject[]};
|
|
66
|
+
[LocusInfoUpdateType.MEETING_ENDED]: unknown; // No extra data
|
|
67
|
+
[LocusInfoUpdateType.LOCUS_NOT_FOUND]: unknown; // No extra data
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export type LocusInfoUpdate = {
|
|
71
|
+
[K in keyof LocusUpdatePayloads]: {
|
|
72
|
+
updateType: K;
|
|
73
|
+
} & LocusUpdatePayloads[K];
|
|
74
|
+
}[keyof LocusUpdatePayloads];
|
|
75
|
+
|
|
70
76
|
export type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;
|
|
71
77
|
|
|
72
78
|
interface LeafInfo {
|
|
@@ -82,6 +88,13 @@ interface LeafInfo {
|
|
|
82
88
|
*/
|
|
83
89
|
export class MeetingEndedError extends Error {}
|
|
84
90
|
|
|
91
|
+
/**
|
|
92
|
+
* This error is thrown when a 404 is received from Locus hash tree endpoints, indicating that the locus URL
|
|
93
|
+
* is no longer valid (e.g. participant moved to a breakout room, or meeting ended).
|
|
94
|
+
* It's handled internally by HashTreeParser and results in LOCUS_NOT_FOUND being sent up.
|
|
95
|
+
*/
|
|
96
|
+
export class LocusNotFoundError extends Error {}
|
|
97
|
+
|
|
85
98
|
/* Currently Locus always sends Metadata objects only in the "self" dataset.
|
|
86
99
|
* If this ever changes, update all the code that relies on this constant.
|
|
87
100
|
*/
|
|
@@ -552,6 +565,32 @@ class HashTreeParser {
|
|
|
552
565
|
});
|
|
553
566
|
}
|
|
554
567
|
|
|
568
|
+
/**
|
|
569
|
+
* Handles known errors that can happen during syncs
|
|
570
|
+
*
|
|
571
|
+
* @param {any} error - The error to handle
|
|
572
|
+
* @returns {boolean} true if the error was recognized and handled, false otherwise
|
|
573
|
+
*/
|
|
574
|
+
private handleSyncErrors(error: any) {
|
|
575
|
+
if (error instanceof MeetingEndedError) {
|
|
576
|
+
this.callLocusInfoUpdateCallback({
|
|
577
|
+
updateType: LocusInfoUpdateType.MEETING_ENDED,
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
return true;
|
|
581
|
+
}
|
|
582
|
+
if (error instanceof LocusNotFoundError) {
|
|
583
|
+
this.callLocusInfoUpdateCallback({
|
|
584
|
+
updateType: LocusInfoUpdateType.LOCUS_NOT_FOUND,
|
|
585
|
+
});
|
|
586
|
+
this.stop();
|
|
587
|
+
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
return false;
|
|
592
|
+
}
|
|
593
|
+
|
|
555
594
|
/**
|
|
556
595
|
* Asynchronously initializes new visible data sets
|
|
557
596
|
*
|
|
@@ -568,11 +607,7 @@ class HashTreeParser {
|
|
|
568
607
|
);
|
|
569
608
|
queueMicrotask(() => {
|
|
570
609
|
this.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch((error) => {
|
|
571
|
-
if (error
|
|
572
|
-
this.callLocusInfoUpdateCallback({
|
|
573
|
-
updateType: LocusInfoUpdateType.MEETING_ENDED,
|
|
574
|
-
});
|
|
575
|
-
} else {
|
|
610
|
+
if (!this.handleSyncErrors(error)) {
|
|
576
611
|
LoggerProxy.logger.warn(
|
|
577
612
|
`HashTreeParser#queueInitForNewVisibleDataSets --> ${
|
|
578
613
|
this.debugId
|
|
@@ -1271,11 +1306,7 @@ class HashTreeParser {
|
|
|
1271
1306
|
this.handleMessage(syncResponse, 'via sync API');
|
|
1272
1307
|
}
|
|
1273
1308
|
} catch (error) {
|
|
1274
|
-
if (error
|
|
1275
|
-
this.callLocusInfoUpdateCallback({
|
|
1276
|
-
updateType: LocusInfoUpdateType.MEETING_ENDED,
|
|
1277
|
-
});
|
|
1278
|
-
} else {
|
|
1309
|
+
if (!this.handleSyncErrors(error)) {
|
|
1279
1310
|
LoggerProxy.logger.warn(
|
|
1280
1311
|
`HashTreeParser#performSync --> ${this.debugId} error during sync for data set "${dataSet.name}":`,
|
|
1281
1312
|
error
|
|
@@ -1603,17 +1634,28 @@ class HashTreeParser {
|
|
|
1603
1634
|
}
|
|
1604
1635
|
|
|
1605
1636
|
private checkForSentinelHttpResponse(error: any, dataSetName?: string) {
|
|
1637
|
+
// 404 for any dataset means the locus is no longer available at this URL - could be replaced or ended
|
|
1638
|
+
// if a dataset is just not visible, we would get a 400
|
|
1639
|
+
if (error.statusCode === 404) {
|
|
1640
|
+
LoggerProxy.logger.info(
|
|
1641
|
+
`HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received 404 for data set "${dataSetName}", locus not found`
|
|
1642
|
+
);
|
|
1643
|
+
this.stopAllTimers();
|
|
1644
|
+
|
|
1645
|
+
throw new LocusNotFoundError();
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1606
1648
|
const isValidDataSetForSentinel =
|
|
1607
1649
|
dataSetName === undefined ||
|
|
1608
1650
|
PossibleSentinelMessageDataSetNames.includes(dataSetName.toLowerCase());
|
|
1609
1651
|
|
|
1610
1652
|
if (
|
|
1611
|
-
|
|
1612
|
-
|
|
1653
|
+
error.statusCode === 409 &&
|
|
1654
|
+
error.body?.errorCode === LocusErrorCodes.LOCUS_INACTIVE &&
|
|
1613
1655
|
isValidDataSetForSentinel
|
|
1614
1656
|
) {
|
|
1615
1657
|
LoggerProxy.logger.info(
|
|
1616
|
-
`HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode} for data set "${dataSetName}", indicating that the meeting has ended`
|
|
1658
|
+
`HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode}/${error.body?.errorCode} for data set "${dataSetName}", indicating that the meeting has ended`
|
|
1617
1659
|
);
|
|
1618
1660
|
this.stopAllTimers();
|
|
1619
1661
|
|
package/src/locus-info/index.ts
CHANGED
|
@@ -1344,6 +1344,21 @@ export default class LocusInfo extends EventsScope {
|
|
|
1344
1344
|
);
|
|
1345
1345
|
this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.SELF_REMOVED);
|
|
1346
1346
|
}
|
|
1347
|
+
break;
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
case LocusInfoUpdateType.LOCUS_NOT_FOUND: {
|
|
1351
|
+
LoggerProxy.logger.info(
|
|
1352
|
+
`Locus-info:index#updateFromHashTree --> received LOCUS_NOT_FOUND for ${locusUrl}, triggering syncMeetings`
|
|
1353
|
+
);
|
|
1354
|
+
this.webex.meetings
|
|
1355
|
+
.syncMeetings({keepOnlyLocusMeetings: false, skipHashTreeSync: true})
|
|
1356
|
+
.catch((syncError) => {
|
|
1357
|
+
LoggerProxy.logger.error(
|
|
1358
|
+
`Locus-info:index#updateFromHashTree --> syncMeetings failed after LOCUS_NOT_FOUND: ${syncError}`
|
|
1359
|
+
);
|
|
1360
|
+
});
|
|
1361
|
+
break;
|
|
1347
1362
|
}
|
|
1348
1363
|
}
|
|
1349
1364
|
}
|
package/src/locus-info/types.ts
CHANGED
package/src/meetings/index.ts
CHANGED
|
@@ -1924,7 +1924,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
1924
1924
|
* @public
|
|
1925
1925
|
* @memberof Meetings
|
|
1926
1926
|
*/
|
|
1927
|
-
public async syncMeetings({
|
|
1927
|
+
public async syncMeetings({
|
|
1928
|
+
keepOnlyLocusMeetings = true,
|
|
1929
|
+
skipHashTreeSync = false,
|
|
1930
|
+
} = {}): Promise<void> {
|
|
1928
1931
|
// @ts-ignore
|
|
1929
1932
|
if (this.webex.credentials.isUnverifiedGuest) {
|
|
1930
1933
|
LoggerProxy.logger.info(
|
|
@@ -1984,18 +1987,20 @@ export default class Meetings extends WebexPlugin {
|
|
|
1984
1987
|
}
|
|
1985
1988
|
}
|
|
1986
1989
|
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
+
if (!skipHashTreeSync) {
|
|
1991
|
+
// Trigger hash tree syncs for all remaining meetings
|
|
1992
|
+
const remainingMeetings = this.meetingCollection.getAll();
|
|
1993
|
+
const syncPromises = [];
|
|
1990
1994
|
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1995
|
+
for (const meeting of Object.values(remainingMeetings) as any[]) {
|
|
1996
|
+
if (meeting.locusInfo) {
|
|
1997
|
+
syncPromises.push(meeting.locusInfo.syncAllHashTreeDatasets());
|
|
1998
|
+
}
|
|
1994
1999
|
}
|
|
1995
|
-
}
|
|
1996
2000
|
|
|
1997
|
-
|
|
1998
|
-
|
|
2001
|
+
if (syncPromises.length > 0) {
|
|
2002
|
+
await Promise.all(syncPromises);
|
|
2003
|
+
}
|
|
1999
2004
|
}
|
|
2000
2005
|
}
|
|
2001
2006
|
|
|
@@ -134,6 +134,24 @@ export class ReceiveSlot extends EventsScope {
|
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
);
|
|
137
|
+
|
|
138
|
+
this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaStarted, () => {
|
|
139
|
+
LoggerProxy.logger.log(
|
|
140
|
+
`ReceiveSlot#setupEventListeners --> media started on receive slot ${this.id}, mediaType=${this.mediaType}`
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaStopped, () => {
|
|
145
|
+
LoggerProxy.logger.log(
|
|
146
|
+
`ReceiveSlot#setupEventListeners --> media stopped on receive slot ${this.id}, mediaType=${this.mediaType}`
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
this.mcReceiveSlot.on(WcmeReceiveSlotEvents.MediaEnded, () => {
|
|
151
|
+
LoggerProxy.logger.log(
|
|
152
|
+
`ReceiveSlot#setupEventListeners --> media ended on receive slot ${this.id}, mediaType=${this.mediaType}`
|
|
153
|
+
);
|
|
154
|
+
});
|
|
137
155
|
}
|
|
138
156
|
|
|
139
157
|
/** Tries to find the member id for this receive slot if it hasn't got one */
|