UNPKG

ready-callback

Version:
119 lines 8.58 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Ready = void 0; const node_events_1 = __importDefault(require("node:events")); const node_util_1 = require("node:util"); const node_crypto_1 = require("node:crypto"); const once_1 = __importDefault(require("once")); const get_ready_1 = require("get-ready"); const debug = (0, node_util_1.debuglog)('ready-callback'); const defaults = { timeout: 10000, isWeakDep: false, }; /** * @class Ready */ class Ready extends node_events_1.default { isError = false; cache = new Map(); opt; obj; ready; constructor(opt = {}) { super(); get_ready_1.Ready.mixin(this); this.opt = opt; if (!this.opt.lazyStart) { this.start(); } } start() { setImmediate(() => { // fire callback directly when no registered ready callback if (this.cache.size === 0) { debug('Fire callback directly'); this.ready(true); } }); } /** * Mix `ready` and `readyCallback` to `obj` * @function Ready#mixin * @param {Object} obj - The mixed object * @return {Ready} this */ mixin(obj) { // only mixin once if (!obj || this.obj) return null; // delegate API to object obj.ready = this.ready.bind(this); obj.readyCallback = this.readyCallback.bind(this); // only ready once with error this.once('error', err => obj.ready(err)); // delegate events if (obj.emit) { this.on('ready_timeout', obj.emit.bind(obj, 'ready_timeout')); this.on('ready_stat', obj.emit.bind(obj, 'ready_stat')); this.on('error', obj.emit.bind(obj, 'error')); } this.obj = obj; return this; } readyCallback(name, opt = {}) { opt = Object.assign({}, defaults, this.opt, opt); const cacheKey = (0, node_crypto_1.randomUUID)(); opt.name = name || cacheKey; const timer = setTimeout(() => this.emit('ready_timeout', opt.name), opt.timeout); const cb = (0, once_1.default)((err) => { if (err != null && !(err instanceof Error)) { err = new Error(err); } clearTimeout(timer); // won't continue to fire after it's error if (this.isError === true) return; // fire callback after all register setImmediate(() => this.readyDone(cacheKey, opt, err)); }); debug('[%s] Register task id `%s` with %j', cacheKey, opt.name, opt); cb.id = opt.name; this.cache.set(cacheKey, cb); return cb; } readyDone(id, opt, err) { if (err != null && !opt.isWeakDep) { this.isError = true; debug('[%s] Throw error task id `%s`, error %s', id, opt.name, err); return this.emit('error', err); } debug('[%s] End task id `%s`, error %s', id, opt.name, err); this.cache.delete(id); this.emit('ready_stat', { id: opt.name, remain: getRemain(this.cache), }); if (this.cache.size === 0) { debug('[%s] Fire callback async', id); this.ready(true); } return this; } } exports.Ready = Ready; function getRemain(map) { const names = []; for (const cb of map.values()) { names.push(cb.id); } return names; } function default_1(opt = {}) { return new Ready(opt); } exports.default = default_1; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQXVDO0FBQ3ZDLHlDQUFxQztBQUNyQyw2Q0FBeUM7QUFDekMsZ0RBQXdCO0FBQ3hCLHlDQUF3RTtBQUV4RSxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQWtCekMsTUFBTSxRQUFRLEdBQXdCO0lBQ3BDLE9BQU8sRUFBRSxLQUFLO0lBQ2QsU0FBUyxFQUFFLEtBQUs7Q0FDakIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxLQUFNLFNBQVEscUJBQVk7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQXVCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFdEMsR0FBRyxDQUFjO0lBQ2pCLEdBQUcsQ0FBTTtJQUVULEtBQUssQ0FBOEM7SUFFbkQsWUFBWSxNQUFtQixFQUFFO1FBQy9CLEtBQUssRUFBRSxDQUFDO1FBQ1IsaUJBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILFlBQVksQ0FBQyxHQUFHLEVBQUU7WUFDaEIsMkRBQTJEO1lBQzNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUN6QixLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFD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