molstar
Version:
A comprehensive macromolecular library.
144 lines • 6.34 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.TaskManager = void 0;
var tslib_1 = require("tslib");
var mol_task_1 = require("../../mol-task");
var rx_event_helper_1 = require("../../mol-util/rx-event-helper");
var now_1 = require("../../mol-util/now");
var observable_1 = require("../../mol-task/execution/observable");
var array_1 = require("../../mol-util/array");
var TaskManager = /** @class */ (function () {
function TaskManager() {
this.ev = rx_event_helper_1.RxEventHelper.create();
this.id = 0;
this.runningTasks = new Set();
this.abortRequests = new Map();
this.options = new Map();
this.currentContext = [];
this.events = {
progress: this.ev(),
finished: this.ev()
};
}
TaskManager.prototype.tryGetAbortTaskId = function (node) {
if (this.abortRequests.has(node.progress.taskId))
return node.progress.taskId;
for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
var c = _a[_i];
var abort = this.tryGetAbortTaskId(c);
if (abort !== void 0)
return abort;
}
return void 0;
};
TaskManager.prototype.track = function (internalId, taskId) {
var _this = this;
return function (progress) {
var _a;
if (progress.canAbort && progress.requestAbort) {
var abortTaskId = _this.tryGetAbortTaskId(progress.root);
if (abortTaskId !== void 0)
progress.requestAbort(_this.abortRequests.get(abortTaskId));
}
var elapsed = (0, now_1.now)() - progress.root.progress.startedTime;
_this.events.progress.next({
id: internalId,
useOverlay: (_a = _this.options.get(taskId)) === null || _a === void 0 ? void 0 : _a.useOverlay,
level: elapsed < 250 ? 'none' : 'background',
progress: progress
});
};
};
TaskManager.prototype.run = function (task, params) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var id, ctx, ret;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
id = this.id++;
if ((params === null || params === void 0 ? void 0 : params.createNewContext) || this.currentContext.length === 0) {
ctx = { ctx: (0, observable_1.CreateObservableCtx)(task, this.track(id, task.id), 100), refCount: 1 };
}
else {
ctx = this.currentContext[this.currentContext.length - 1];
ctx.refCount++;
}
_a.label = 1;
case 1:
_a.trys.push([1, , 3, 4]);
this.options.set(task.id, { useOverlay: !!(params === null || params === void 0 ? void 0 : params.useOverlay) });
this.runningTasks.add(task.id);
return [4 /*yield*/, (0, observable_1.ExecuteInContext)(ctx.ctx, task)];
case 2:
ret = _a.sent();
return [2 /*return*/, ret];
case 3:
this.options.delete(task.id);
this.runningTasks.delete(task.id);
this.events.finished.next({ id: id });
this.abortRequests.delete(task.id);
ctx.refCount--;
if (ctx.refCount === 0)
(0, array_1.arrayRemoveInPlace)(this.currentContext, ctx);
return [7 /*endfinally*/];
case 4: return [2 /*return*/];
}
});
});
};
TaskManager.prototype.requestAbortAll = function (reason) {
var _this = this;
this.runningTasks.forEach(function (id) { return _this.abortRequests.set(id, reason); });
};
TaskManager.prototype.requestAbort = function (taskIdOrProgress, reason) {
var id = typeof taskIdOrProgress === 'number'
? taskIdOrProgress
: taskIdOrProgress.root.progress.taskId;
this.abortRequests.set(id, reason);
};
TaskManager.prototype.dispose = function () {
this.ev.dispose();
};
return TaskManager;
}());
exports.TaskManager = TaskManager;
(function (TaskManager) {
function delay(time) {
return new Promise(function (res) { return setTimeout(res, time); });
}
function testTask(N) {
var _this = this;
return mol_task_1.Task.create('Test', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var i;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
i = 0;
_a.label = 1;
case 1:
if (!(i < N)) return [3 /*break*/, 5];
return [4 /*yield*/, delay(100 + Math.random() * 200)];
case 2:
_a.sent();
if (!ctx.shouldUpdate) return [3 /*break*/, 4];
return [4 /*yield*/, ctx.update({ message: 'Step ' + i, current: i, max: N, isIndeterminate: false })];
case 3:
_a.sent();
_a.label = 4;
case 4:
i++;
return [3 /*break*/, 1];
case 5: return [2 /*return*/];
}
});
}); });
}
TaskManager.testTask = testTask;
})(TaskManager || (TaskManager = {}));
exports.TaskManager = TaskManager;
//# sourceMappingURL=task-manager.js.map