@spartacus/core
Version:
Spartacus - the core framework
65 lines • 9.63 kB
JavaScript
import { Injectable } from '@angular/core';
import { ReplaySubject, Subject, Subscription, zip } from 'rxjs';
import { concatMap, finalize, mergeMap, retry, switchMap, tap, } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class Command {
}
export var CommandStrategy;
(function (CommandStrategy) {
CommandStrategy[CommandStrategy["Parallel"] = 0] = "Parallel";
CommandStrategy[CommandStrategy["Queue"] = 1] = "Queue";
CommandStrategy[CommandStrategy["CancelPrevious"] = 2] = "CancelPrevious";
CommandStrategy[CommandStrategy["ErrorPrevious"] = 3] = "ErrorPrevious";
// SkipIfOngoing,
// ErrorIfOngoing
})(CommandStrategy || (CommandStrategy = {}));
export class CommandService {
constructor() {
this.subscriptions = new Subscription();
}
create(commandFactory, options) {
const commands$ = new Subject();
const results$ = new Subject();
let process$;
switch (options === null || options === void 0 ? void 0 : options.strategy) {
case CommandStrategy.CancelPrevious:
case CommandStrategy.ErrorPrevious:
process$ = zip(commands$, results$).pipe(switchMap(([cmd, notifier$]) => commandFactory(cmd).pipe(tap(notifier$), finalize(() => options.strategy === CommandStrategy.CancelPrevious
? notifier$.complete()
: notifier$.error(new Error('Canceled by next command'))))), retry());
break;
case CommandStrategy.Parallel:
process$ = zip(commands$, results$).pipe(mergeMap(([cmd, notifier$]) => commandFactory(cmd).pipe(tap(notifier$))), retry());
break;
case CommandStrategy.Queue:
default:
process$ = zip(commands$, results$).pipe(concatMap(([cmd, notifier$]) => commandFactory(cmd).pipe(tap(notifier$))), retry());
break;
}
this.subscriptions.add(process$.subscribe());
const command = new (class extends Command {
constructor() {
super(...arguments);
this.execute = (parameters) => {
const result$ = new ReplaySubject();
results$.next(result$);
commands$.next(parameters);
return result$;
};
}
})();
return command;
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
CommandService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CommandService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
CommandService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CommandService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CommandService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvdXRpbC9jb21tYW5kLXF1ZXJ5L2NvbW1hbmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBYyxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0UsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhCLE1BQU0sT0FBZ0IsT0FBTztDQUU1QjtBQUVELE1BQU0sQ0FBTixJQUFZLGVBT1g7QUFQRCxXQUFZLGVBQWU7SUFDekIsNkRBQVEsQ0FBQTtJQUNSLHVEQUFLLENBQUE7SUFDTCx5RUFBYyxDQUFBO0lBQ2QsdUVBQWEsQ0FBQTtJQUNiLGlCQUFpQjtJQUNqQixpQkFBaUI7QUFDbkIsQ0FBQyxFQVBXLGVBQWUsS0FBZixlQUFlLFFBTzFCO0FBS0QsTUFBTSxPQUFPLGNBQWM7SUFHekI7UUFGVSxrQkFBYSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRTVDLENBQUM7SUFFaEIsTUFBTSxDQUNKLGNBQStDLEVBQy9DLE9BQXdDO1FBRXhDLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUFLLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQW9CLENBQUM7UUFFakQsSUFBSSxRQUF5QixDQUFDO1FBRTlCLFFBQVEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBRTtZQUN6QixLQUFLLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDcEMsS0FBSyxlQUFlLENBQUMsYUFBYTtnQkFDaEMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN0QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQzdCLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ3RCLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFDZCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ1osT0FBTyxDQUFDLFFBQVEsS0FBSyxlQUFlLENBQUMsY0FBYztvQkFDakQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7b0JBQ3RCLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FDM0QsQ0FDRixDQUNGLEVBQ0QsS0FBSyxFQUFFLENBQ1IsQ0FBQztnQkFDRixNQUFNO1lBRVIsS0FBSyxlQUFlLENBQUMsUUFBUTtnQkFDM0IsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN0QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQzVCLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3pDLEVBQ0QsS0FBSyxFQUFFLENBQ1IsQ0FBQztnQkFDRixNQUFNO1lBRVIsS0FBSyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzNCO2dCQUNFLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDdEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUM3QixjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN6QyxFQUNELEtBQUssRUFBRSxDQUNSLENBQUM7Z0JBQ0YsTUFBTTtTQUNUO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFN0MsTUFBTSxPQUFPLEdBQWtCLElBQUksQ0FBQyxLQUFNLFNBQVEsT0FBTztZQUFyQjs7Z0JBQ2xDLFlBQU8sR0FBRyxDQUFDLFVBQWEsRUFBRSxFQUFFO29CQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQWEsRUFBSyxDQUFDO29CQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2QixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUMzQixPQUFPLE9BQU8sQ0FBQztnQkFDakIsQ0FBQyxDQUFDO1lBQ0osQ0FBQztTQUFBLENBQUMsRUFBRSxDQUFDO1FBRUwsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7OzJHQXBFVSxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY29uY2F0TWFwLFxuICBmaW5hbGl6ZSxcbiAgbWVyZ2VNYXAsXG4gIHJldHJ5LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZDxQID0gdW5kZWZpbmVkLCBSID0gdW5rbm93bj4ge1xuICBhYnN0cmFjdCBleGVjdXRlKHBhcmFtczogUCk6IE9ic2VydmFibGU8Uj47XG59XG5cbmV4cG9ydCBlbnVtIENvbW1hbmRTdHJhdGVneSB7XG4gIFBhcmFsbGVsLFxuICBRdWV1ZSxcbiAgQ2FuY2VsUHJldmlvdXMsXG4gIEVycm9yUHJldmlvdXMsXG4gIC8vIFNraXBJZk9uZ29pbmcsXG4gIC8vIEVycm9ySWZPbmdvaW5nXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDb21tYW5kU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNyZWF0ZTxQID0gdW5kZWZpbmVkLCBSID0gdW5rbm93bj4oXG4gICAgY29tbWFuZEZhY3Rvcnk6IChjb21tYW5kOiBQKSA9PiBPYnNlcnZhYmxlPGFueT4sXG4gICAgb3B0aW9ucz86IHsgc3RyYXRlZ3k/OiBDb21tYW5kU3RyYXRlZ3kgfVxuICApOiBDb21tYW5kPFAsIFI+IHtcbiAgICBjb25zdCBjb21tYW5kcyQgPSBuZXcgU3ViamVjdDxQPigpO1xuICAgIGNvbnN0IHJlc3VsdHMkID0gbmV3IFN1YmplY3Q8UmVwbGF5U3ViamVjdDxSPj4oKTtcblxuICAgIGxldCBwcm9jZXNzJDogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgc3dpdGNoIChvcHRpb25zPy5zdHJhdGVneSkge1xuICAgICAgY2FzZSBDb21tYW5kU3RyYXRlZ3kuQ2FuY2VsUHJldmlvdXM6XG4gICAgICBjYXNlIENvbW1hbmRTdHJhdGVneS5FcnJvclByZXZpb3VzOlxuICAgICAgICBwcm9jZXNzJCA9IHppcChjb21tYW5kcyQsIHJlc3VsdHMkKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoW2NtZCwgbm90aWZpZXIkXSkgPT5cbiAgICAgICAgICAgIGNvbW1hbmRGYWN0b3J5KGNtZCkucGlwZShcbiAgICAgICAgICAgICAgdGFwKG5vdGlmaWVyJCksXG4gICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdHJhdGVneSA9PT0gQ29tbWFuZFN0cmF0ZWd5LkNhbmNlbFByZXZpb3VzXG4gICAgICAgICAgICAgICAgICA/IG5vdGlmaWVyJC5jb21wbGV0ZSgpXG4gICAgICAgICAgICAgICAgICA6IG5vdGlmaWVyJC5lcnJvcihuZXcgRXJyb3IoJ0NhbmNlbGVkIGJ5IG5leHQgY29tbWFuZCcpKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeSgpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbW1hbmRTdHJhdGVneS5QYXJhbGxlbDpcbiAgICAgICAgcHJvY2VzcyQgPSB6aXAoY29tbWFuZHMkLCByZXN1bHRzJCkucGlwZShcbiAgICAgICAgICBtZXJnZU1hcCgoW2NtZCwgbm90aWZpZXIkXSkgPT5cbiAgICAgICAgICAgIGNvbW1hbmRGYWN0b3J5KGNtZCkucGlwZSh0YXAobm90aWZpZXIkKSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHJldHJ5KClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29tbWFuZFN0cmF0ZWd5LlF1ZXVlOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcHJvY2VzcyQgPSB6aXAoY29tbWFuZHMkLCByZXN1bHRzJCkucGlwZShcbiAgICAgICAgICBjb25jYXRNYXAoKFtjbWQsIG5vdGlmaWVyJF0pID0+XG4gICAgICAgICAgICBjb21tYW5kRmFjdG9yeShjbWQpLnBpcGUodGFwKG5vdGlmaWVyJCkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeSgpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQocHJvY2VzcyQuc3Vic2NyaWJlKCkpO1xuXG4gICAgY29uc3QgY29tbWFuZDogQ29tbWFuZDxQLCBSPiA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBDb21tYW5kIHtcbiAgICAgIGV4ZWN1dGUgPSAocGFyYW1ldGVyczogUCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQkID0gbmV3IFJlcGxheVN1YmplY3Q8Uj4oKTtcbiAgICAgICAgcmVzdWx0cyQubmV4dChyZXN1bHQkKTtcbiAgICAgICAgY29tbWFuZHMkLm5leHQocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiByZXN1bHQkO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19