@ibsheet/loader
Version:
Dynamically load support module for IBSheet
188 lines • 7.08 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.LoaderTaskManager = void 0;
var dom_utils_1 = require("../shared/dom-utils");
var lodash_1 = require("../shared/lodash");
var custom_1 = require("../custom");
var interface_1 = require("../interface");
var interface_2 = require("./interface");
var utils_1 = require("./utils");
var LoaderTaskManager = (function (_super) {
__extends(LoaderTaskManager, _super);
function LoaderTaskManager(type, uber) {
var _this = _super.call(this) || this;
_this._working = false;
_this._reserved = 0;
_this._type = type;
_this._stack = [];
_this._wipList = [];
_this._uber = uber;
return _this;
}
Object.defineProperty(LoaderTaskManager.prototype, "working", {
get: function () {
return this._working;
},
enumerable: false,
configurable: true
});
Object.defineProperty(LoaderTaskManager.prototype, "type", {
get: function () {
return this._type;
},
enumerable: false,
configurable: true
});
Object.defineProperty(LoaderTaskManager.prototype, "debug", {
get: function () {
return this._uber.debug;
},
enumerable: false,
configurable: true
});
Object.defineProperty(LoaderTaskManager.prototype, "options", {
get: function () {
return {
debug: this.debug,
retry: this._uber.getOption('retry'),
};
},
enumerable: false,
configurable: true
});
Object.defineProperty(LoaderTaskManager.prototype, "reserved", {
get: function () {
return this._reserved > 0;
},
enumerable: false,
configurable: true
});
LoaderTaskManager.prototype._reserveJobs = function () {
this._reserved += 1;
};
LoaderTaskManager.prototype._resolveJobs = function () {
if (this.reserved) {
this._reserved -= 1;
if (this._stack.length) {
this.start();
}
}
};
LoaderTaskManager.prototype._newWipItem = function (item) {
if ((0, lodash_1.isNil)(item))
return null;
this._wipList.push(item);
return item;
};
LoaderTaskManager.prototype._resolveWipItem = function (item) {
(0, lodash_1.remove)(this._wipList, function (o) { return o.id === item.id; });
return item;
};
LoaderTaskManager.prototype._checkIgnoreItem = function (item) {
return this.type === interface_2.LoaderTaskType.LOAD ? item.loaded : !item.loaded;
};
LoaderTaskManager.prototype.add = function (item, immediatly) {
if (immediatly === void 0) { immediatly = false; }
if (this._checkIgnoreItem(item)) {
if (this.debug) {
console.warn("\"".concat(item.alias, "\" is already ").concat(this.type, "ed"));
}
return null;
}
if (this.exists(item)) {
if (this.debug) {
console.warn("\"".concat(item.alias, "\" is already added to the tasks"));
}
return null;
}
this._stack.push(item);
if (immediatly)
this.start();
return item;
};
LoaderTaskManager.prototype.exists = function (item) {
var target = (0, lodash_1.find)(this._stack, { id: item.id });
if ((0, lodash_1.isNil)(target) && this._wipList.length) {
target = (0, lodash_1.find)(this._wipList, { id: item.id });
}
return !(0, lodash_1.isNil)(target);
};
LoaderTaskManager.prototype._start = function () {
var _this = this;
if (this.working) {
this._reserveJobs();
return;
}
this._working = true;
var startTime = (0, lodash_1.now)();
var asyncTasks = [];
var item;
var _loop_1 = function () {
item = this_1._newWipItem(this_1._stack.shift());
if ((0, lodash_1.isNil)(item) || this_1._checkIgnoreItem(item))
return "continue";
if (this_1.debug) {
console.log("%c[".concat(this_1.type, ".start] ").concat(item.alias), 'color:royalblue');
}
var eventData = { target: item };
this_1.emit(interface_1.LoaderEventName.LOAD, eventData);
var eventList = (0, utils_1.getTaskEventsByType)(this_1.type);
var task = new Promise(function (resolve) {
eventList.forEach(function (event) {
item.once(event, function (evt) {
_this.emit(event, eventData);
if ((0, utils_1.isResolveTaskEvent)(event)) {
_this._resolveWipItem(evt.target);
resolve(evt.target);
}
});
});
var taskHandler = item[_this.type];
taskHandler.call(item, _this.options);
});
asyncTasks.push(task);
};
var this_1 = this;
while (this._stack.length) {
_loop_1();
}
if (!asyncTasks.length)
return;
Promise.all(asyncTasks)
.then(function (items) {
if (_this.debug) {
console.log("%c[IBSheetLoader] ".concat(_this.type, " tasks all done -- ").concat((0, lodash_1.now)() - startTime, "ms"), 'color: green');
}
_this.emit(interface_1.LoaderEventName.LOAD_COMPLETE, { target: _this, data: items });
_this._working = false;
_this._resolveJobs();
})
.catch(function (err) {
_this.emit(interface_1.LoaderEventName.LOAD_FAILED, { target: _this, error: err });
_this._working = false;
throw new Error(err);
});
};
LoaderTaskManager.prototype.start = function () {
var _this = this;
(0, dom_utils_1.documentReady)(function () { return _this._start(); });
};
return LoaderTaskManager;
}(custom_1.CustomEventEmitter));
exports.LoaderTaskManager = LoaderTaskManager;
//# sourceMappingURL=task-manager.js.map