mirror of https://github.com/jitsi/jitsi-meet
The process for doing a replaceLocalTrack is async. Is it possible to trigger replaceLocalTrack multiple times before each call is finished. This leads to situations where replaceLocalTrack is called multiple times with oldTrack being null and a new track. In this scenario, each new track will be added, causing UI issues such as the local participant's large video not displaying for remote participants. The action replaceLocalTrack is used when unmuting audio or video, when creating new tracks on device switch, and when toggling screensharing. These actions can collide with each other. One way to fix this would be to queue replaceLocalTrack.pull/3419/head
parent
dafcde5060
commit
3927f29ba8
@ -0,0 +1,63 @@ |
||||
const logger = require('jitsi-meet-logger').getLogger(__filename); |
||||
|
||||
/** |
||||
* Manages a queue of functions where the current function in progress will |
||||
* automatically execute the next queued function. |
||||
*/ |
||||
export class TaskQueue { |
||||
/** |
||||
* Creates a new instance of {@link TaskQueue} and sets initial instance |
||||
* variable values. |
||||
*/ |
||||
constructor() { |
||||
this._queue = []; |
||||
this._currentTask = null; |
||||
|
||||
this._onTaskComplete = this._onTaskComplete.bind(this); |
||||
} |
||||
|
||||
/** |
||||
* Adds a new function to the queue. It will be immediately invoked if no |
||||
* other functions are queued. |
||||
* |
||||
* @param {Function} taskFunction - The function to be queued for execution. |
||||
* @private |
||||
* @returns {void} |
||||
*/ |
||||
enqueue(taskFunction) { |
||||
this._queue.push(taskFunction); |
||||
this._executeNext(); |
||||
} |
||||
|
||||
/** |
||||
* If no queued task is currently executing, invokes the first task in the |
||||
* queue if any. |
||||
* |
||||
* @private |
||||
* @returns {void} |
||||
*/ |
||||
_executeNext() { |
||||
if (this._currentTask) { |
||||
logger.warn('Task queued while a task is in progress.'); |
||||
|
||||
return; |
||||
} |
||||
|
||||
this._currentTask = this._queue.shift() || null; |
||||
|
||||
if (this._currentTask) { |
||||
this._currentTask(this._onTaskComplete); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Prepares to invoke the next function in the queue. |
||||
* |
||||
* @private |
||||
* @returns {void} |
||||
*/ |
||||
_onTaskComplete() { |
||||
this._currentTask = null; |
||||
this._executeNext(); |
||||
} |
||||
} |
Loading…
Reference in new issue