UNPKG

molstar

Version:

A comprehensive macromolecular library.

140 lines (139 loc) 6.05 kB
/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ import { __awaiter, __generator } from "tslib"; import { Task } from '../../mol-task'; import { RxEventHelper } from '../../mol-util/rx-event-helper'; import { now } from '../../mol-util/now'; import { CreateObservableCtx, ExecuteInContext } from '../../mol-task/execution/observable'; import { arrayRemoveInPlace } from '../../mol-util/array'; export { TaskManager }; var TaskManager = /** @class */ (function () { function TaskManager() { this.ev = 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 = 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 __awaiter(this, void 0, void 0, function () { var id, ctx, ret; return __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: 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*/, 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) 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; }()); (function (TaskManager) { function delay(time) { return new Promise(function (res) { return setTimeout(res, time); }); } function testTask(N) { var _this = this; return Task.create('Test', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var i; return __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 = {}));