@lotto24-angular/imports-orchestrator
Version:
Orchestrate dynamically imported components in Angular applications
73 lines • 10.5 kB
JavaScript
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=