UNPKG

@lotto24-angular/imports-orchestrator

Version:

Orchestrate dynamically imported components in Angular applications

73 lines 10.5 kB
import { inject, Injectable } from '@angular/core'; import { processQueueItem } from './process-queue-item'; import { IMPORTS_ORCHESTRATOR_FEATURE_CONCURRENCY, IMPORTS_ORCHESTRATOR_FEATURE_LOGGER, IMPORTS_ORCHESTRATOR_FEATURE_QUEUE, IMPORTS_ORCHESTRATOR_FEATURE_ROUTING, } from '../internal'; import { filter, firstValueFrom, tap } from 'rxjs'; import * as i0 from "@angular/core"; export class ImportsQueueProcessor { constructor() { this.logger = inject(IMPORTS_ORCHESTRATOR_FEATURE_LOGGER); this.queue = inject(IMPORTS_ORCHESTRATOR_FEATURE_QUEUE); this.isRoutingActive$ = inject(IMPORTS_ORCHESTRATOR_FEATURE_ROUTING); this.concurrency = inject(IMPORTS_ORCHESTRATOR_FEATURE_CONCURRENCY); this.running = 0; } static { this.processing = false; } process() { if (!ImportsQueueProcessor.processing) { // do not await, as it would block the lifecycle callback from completing until the queue is processed ImportsQueueProcessor.processing = true; this.processQueue() .then(() => { this.logger.debug('queue processing ended'); }) .catch(() => { this.logger.debug('queue processing failed'); }) .finally(() => { ImportsQueueProcessor.processing = false; }); } } async processQueue() { await this.suspendForNavigation(); const concurrency = this.updateConcurrency(); const concurrentBatch = []; for (let i = this.running; i < concurrency; i++) { this.running++; concurrentBatch.push(this.processItem()); } this.logger.debug(`queue starting ${concurrentBatch.length} item(s) to reach max concurrency (running=${this.running})`); await Promise.all(concurrentBatch); } async processItem() { await processQueueItem(this.queue, this.logger); this.running--; if (!this.queue.empty) { await this.processQueue(); } } updateConcurrency() { const value = typeof this.concurrency === 'function' ? this.concurrency() : this.concurrency; if (value !== this.concurrency) { this.logger.debug(`queue concurrency changed to ${value}`); } return value; } async suspendForNavigation() { // suspend processing while routing, as navigation takes precedence return firstValueFrom(this.isRoutingActive$.pipe(tap((active) => { if (active) { this.logger.debug('queue processing suspended for navigation'); } }), filter((active) => !active))); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportsQueueProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportsQueueProcessor, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportsQueueProcessor, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0cy1xdWV1ZS1wcm9jZXNzb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW1wb3J0cy1vcmNoZXN0cmF0b3Ivc3JjL2xpYi9xdWV1ZS9pbXBvcnRzLXF1ZXVlLXByb2Nlc3Nvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFDTCx3Q0FBd0MsRUFDeEMsbUNBQW1DLEVBQ25DLGtDQUFrQyxFQUNsQyxvQ0FBb0MsR0FDckMsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUduRCxNQUFNLE9BQU8scUJBQXFCO0lBRGxDO1FBSW1CLFdBQU0sR0FBRyxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNyRCxVQUFLLEdBQUcsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbkQscUJBQWdCLEdBQUcsTUFBTSxDQUN4QyxvQ0FBb0MsQ0FDckMsQ0FBQztRQUNlLGdCQUFXLEdBQUcsTUFBTSxDQUNuQyx3Q0FBd0MsQ0FDekMsQ0FBQztRQUVNLFlBQU8sR0FBRyxDQUFDLENBQUM7S0FxRXJCO2FBaEZnQixlQUFVLEdBQUcsS0FBSyxBQUFSLENBQVM7SUFhM0IsT0FBTztRQUNaLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxzR0FBc0c7WUFDdEcscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUV4QyxJQUFJLENBQUMsWUFBWSxFQUFFO2lCQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUM7aUJBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDWixxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWxDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLGtCQUFrQixlQUFlLENBQUMsTUFBTSw4Q0FBOEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUN0RyxDQUFDO1FBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUN2QixNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sS0FBSyxHQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVO1lBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXZCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQjtRQUNoQyxtRUFBbUU7UUFDbkUsT0FBTyxjQUFjLENBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQ3hCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDLENBQUMsRUFDRixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQzVCLENBQ0YsQ0FBQztJQUNKLENBQUM7OEdBaEZVLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRFIsTUFBTTs7MkZBQ25CLHFCQUFxQjtrQkFEakMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2Nlc3NRdWV1ZUl0ZW0gfSBmcm9tICcuL3Byb2Nlc3MtcXVldWUtaXRlbSc7XG5pbXBvcnQge1xuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX0NPTkNVUlJFTkNZLFxuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX0xPR0dFUixcbiAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9RVUVVRSxcbiAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9ST1VUSU5HLFxufSBmcm9tICcuLi9pbnRlcm5hbCc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0VmFsdWVGcm9tLCB0YXAgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJbXBvcnRzUXVldWVQcm9jZXNzb3Ige1xuICBwcml2YXRlIHN0YXRpYyBwcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9MT0dHRVIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlID0gaW5qZWN0KElNUE9SVFNfT1JDSEVTVFJBVE9SX0ZFQVRVUkVfUVVFVUUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzUm91dGluZ0FjdGl2ZSQgPSBpbmplY3QoXG4gICAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9ST1VUSU5HXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uY3VycmVuY3kgPSBpbmplY3QoXG4gICAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9DT05DVVJSRU5DWVxuICApO1xuXG4gIHByaXZhdGUgcnVubmluZyA9IDA7XG5cbiAgcHVibGljIHByb2Nlc3MoKTogdm9pZCB7XG4gICAgaWYgKCFJbXBvcnRzUXVldWVQcm9jZXNzb3IucHJvY2Vzc2luZykge1xuICAgICAgLy8gZG8gbm90IGF3YWl0LCBhcyBpdCB3b3VsZCBibG9jayB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrIGZyb20gY29tcGxldGluZyB1bnRpbCB0aGUgcXVldWUgaXMgcHJvY2Vzc2VkXG4gICAgICBJbXBvcnRzUXVldWVQcm9jZXNzb3IucHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdxdWV1ZSBwcm9jZXNzaW5nIGVuZGVkJyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3F1ZXVlIHByb2Nlc3NpbmcgZmFpbGVkJyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBJbXBvcnRzUXVldWVQcm9jZXNzb3IucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN1c3BlbmRGb3JOYXZpZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IHRoaXMudXBkYXRlQ29uY3VycmVuY3koKTtcbiAgICBjb25zdCBjb25jdXJyZW50QmF0Y2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5ydW5uaW5nOyBpIDwgY29uY3VycmVuY3k7IGkrKykge1xuICAgICAgdGhpcy5ydW5uaW5nKys7XG4gICAgICBjb25jdXJyZW50QmF0Y2gucHVzaCh0aGlzLnByb2Nlc3NJdGVtKCkpO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBxdWV1ZSBzdGFydGluZyAke2NvbmN1cnJlbnRCYXRjaC5sZW5ndGh9IGl0ZW0ocykgdG8gcmVhY2ggbWF4IGNvbmN1cnJlbmN5IChydW5uaW5nPSR7dGhpcy5ydW5uaW5nfSlgXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjb25jdXJyZW50QmF0Y2gpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzSXRlbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBwcm9jZXNzUXVldWVJdGVtKHRoaXMucXVldWUsIHRoaXMubG9nZ2VyKTtcbiAgICB0aGlzLnJ1bm5pbmctLTtcbiAgICBpZiAoIXRoaXMucXVldWUuZW1wdHkpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25jdXJyZW5jeSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvbmN1cnJlbmN5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdGhpcy5jb25jdXJyZW5jeSgpXG4gICAgICAgIDogdGhpcy5jb25jdXJyZW5jeTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jb25jdXJyZW5jeSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYHF1ZXVlIGNvbmN1cnJlbmN5IGNoYW5nZWQgdG8gJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1c3BlbmRGb3JOYXZpZ2F0aW9uKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIHN1c3BlbmQgcHJvY2Vzc2luZyB3aGlsZSByb3V0aW5nLCBhcyBuYXZpZ2F0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmlzUm91dGluZ0FjdGl2ZSQucGlwZShcbiAgICAgICAgdGFwKChhY3RpdmUpID0+IHtcbiAgICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncXVldWUgcHJvY2Vzc2luZyBzdXNwZW5kZWQgZm9yIG5hdmlnYXRpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoKGFjdGl2ZSkgPT4gIWFjdGl2ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG59XG4iXX0=