hpg-r3f-model-scene
Version:
Pretty Footer react component used in ant.design
91 lines (90 loc) • 2.75 kB
JavaScript
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
import _createClass from "@babel/runtime/helpers/esm/createClass";
/**
* @author Deepkolos / https://github.com/deepkolos
*/
export var WorkerPool = /*#__PURE__*/function () {
function WorkerPool() {
var pool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
_classCallCheck(this, WorkerPool);
this.pool = pool;
this.queue = [];
this.workers = [];
this.workersResolve = [];
this.workerStatus = 0;
}
_createClass(WorkerPool, [{
key: "_initWorker",
value: function _initWorker(workerId) {
if (!this.workers[workerId]) {
var worker = this.workerCreator();
worker.addEventListener('message', this._onMessage.bind(this, workerId));
this.workers[workerId] = worker;
}
}
}, {
key: "_getIdleWorker",
value: function _getIdleWorker() {
for (var i = 0; i < this.pool; i++) if (!(this.workerStatus & 1 << i)) return i;
return -1;
}
}, {
key: "_onMessage",
value: function _onMessage(workerId, msg) {
var resolve = this.workersResolve[workerId];
resolve && resolve(msg);
if (this.queue.length) {
var _this$queue$shift = this.queue.shift(),
_resolve = _this$queue$shift.resolve,
_msg = _this$queue$shift.msg,
transfer = _this$queue$shift.transfer;
this.workersResolve[workerId] = _resolve;
this.workers[workerId].postMessage(_msg, transfer);
} else {
this.workerStatus ^= 1 << workerId;
}
}
}, {
key: "setWorkerCreator",
value: function setWorkerCreator(workerCreator) {
this.workerCreator = workerCreator;
}
}, {
key: "setWorkerLimit",
value: function setWorkerLimit(pool) {
this.pool = pool;
}
}, {
key: "postMessage",
value: function postMessage(msg, transfer) {
var _this = this;
return new Promise(function (resolve) {
var workerId = _this._getIdleWorker();
if (workerId !== -1) {
_this._initWorker(workerId);
_this.workerStatus |= 1 << workerId;
_this.workersResolve[workerId] = resolve;
_this.workers[workerId].postMessage(msg, transfer);
} else {
_this.queue.push({
resolve: resolve,
msg: msg,
transfer: transfer
});
}
});
}
}, {
key: "dispose",
value: function dispose() {
this.workers.forEach(function (worker) {
return worker.terminate();
});
this.workersResolve.length = 0;
this.workers.length = 0;
this.queue.length = 0;
this.workerStatus = 0;
}
}]);
return WorkerPool;
}();