UNPKG

molstar

Version:

A comprehensive macromolecular library.

144 lines 6.34 kB
"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