+ private removeWorkerSetElement (workerSetElement: WorkerSetElement | undefined): void {
+ if (workerSetElement == null) {
+ return
+ }
+ this.workerSet.delete(workerSetElement)
+ }
+
+ private async getWorkerSetElement (): Promise<WorkerSetElement> {
+ let chosenWorkerSetElement: WorkerSetElement | undefined
+ for (const workerSetElement of this.workerSet) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ if (workerSetElement.numberOfWorkerElements < this.workerOptions.elementsPerWorker!) {
+ chosenWorkerSetElement = workerSetElement
+ break
+ }
+ }
+ if (chosenWorkerSetElement == null) {
+ chosenWorkerSetElement = this.addWorkerSetElement()
+ // Add worker set element sequentially to optimize memory at startup
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ this.workerOptions.workerStartDelay! > 0 &&
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ (await sleep(randomizeDelay(this.workerOptions.workerStartDelay!)))
+ }
+ return chosenWorkerSetElement
+ }
+
+ private getWorkerSetElementByWorker (worker: Worker): WorkerSetElement | undefined {
+ let workerSetElt: WorkerSetElement | undefined
+ for (const workerSetElement of this.workerSet) {
+ if (workerSetElement.worker.threadId === worker.threadId) {
+ workerSetElt = workerSetElement
+ break
+ }
+ }
+ return workerSetElt