ng-commander
Version:
Command pattern for Angular applications
1 lines • 16.2 kB
Source Map (JSON)
{"version":3,"file":"ng-commander.mjs","sources":["../../../projects/ng-commander/src/Domain/command-event.interface.ts","../../../projects/ng-commander/src/Application/commander.service.ts","../../../projects/ng-commander/src/ng-commander.ts"],"sourcesContent":["import Command from './command.interface';\n\nexport enum CommandEventType {\n START = 'start',\n SUCCESS = 'success',\n FAIL = 'fail',\n RESTART = 'restart',\n DEAD = 'dead',\n}\nexport interface CommandEvent {\n type: CommandEventType;\n timestamp: Date;\n command: Command;\n data?: any;\n}\n\n// Signal types for Angular 18+ compatibility\nexport type CommandEventSignal = CommandEvent;\n","import { computed, Injectable, OnDestroy } from '@angular/core';\nimport {\n BehaviorSubject,\n catchError,\n EMPTY,\n finalize,\n Subject,\n switchMap,\n} from 'rxjs';\nimport {\n CommandEvent,\n CommandEventType,\n} from '../Domain/command-event.interface';\nimport Command from '../Domain/command.interface';\nimport { CommanderConfiguration } from './commander.service.configuration';\n\nexport enum CommanderState {\n IDLE,\n EXECUTING,\n DONE,\n ERROR,\n}\n\nexport enum CommandsType {\n WAITING,\n DONE,\n ERROR,\n DEAD,\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class Commander implements OnDestroy {\n private configuration: CommanderConfiguration = {\n error: {\n maxNumberOfRetries: 3,\n },\n };\n\n private commandsSubject = new BehaviorSubject<Command[]>([]);\n private commandsDoneSubject = new BehaviorSubject<Command[]>([]);\n private commandsInErrorSubject = new BehaviorSubject<Command[]>([]);\n private commandsDeadSubject = new BehaviorSubject<Command[]>([]);\n private stateSubject = new BehaviorSubject<CommanderState>(\n CommanderState.IDLE,\n );\n\n private processingCommand = new Subject<{\n command: Command;\n result: any;\n }>();\n\n private destroy$ = new Subject<void>();\n\n public commands$ = this.commandsSubject.asObservable();\n public commandsDone$ = this.commandsDoneSubject.asObservable();\n public commandsInError$ = this.commandsInErrorSubject.asObservable();\n public commandsDead$ = this.commandsDeadSubject.asObservable();\n public state$ = this.stateSubject.asObservable();\n\n // Signal properties for Angular 18+ compatibility\n public commandsSignal = computed(() => this.commandsSubject.value);\n public commandsDoneSignal = computed(() => this.commandsDoneSubject.value);\n public commandsInErrorSignal = computed(\n () => this.commandsInErrorSubject.value,\n );\n public commandsDeadSignal = computed(() => this.commandsDeadSubject.value);\n public stateSignal = computed(() => this.stateSubject.value);\n\n constructor() {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n init(configuration: CommanderConfiguration) {\n this.configuration = configuration;\n this.startCommander();\n }\n\n private startCommander() {\n this.processingCommand\n .pipe(\n switchMap(({ command }) => {\n // Update state to executing before starting execution\n this.stateSubject.next(CommanderState.EXECUTING);\n\n return command.execute().pipe(\n // Handle successful execution\n switchMap((result) => {\n return this.handleSuccessfulCommand(command, result);\n }),\n // Handle errors with retry logic\n catchError((error) => {\n return this.handleFailedCommand(command, error);\n }),\n // Finalize to ensure cleanup\n finalize(() => {\n this.executeNextCommand();\n }),\n );\n }),\n // Complete the stream when destroy$ emits\n finalize(() => {\n this.stateSubject.complete();\n }),\n )\n .subscribe({\n error: (error) => {\n console.error('Commander error:', error);\n this.stateSubject.next(CommanderState.ERROR);\n },\n });\n }\n\n private handleSuccessfulCommand(command: Command, result: any) {\n const event: CommandEvent = {\n type: CommandEventType.SUCCESS,\n timestamp: new Date(),\n command: command,\n };\n\n if (!command.events) command.events = [];\n command.events.push(event);\n\n\n const currentErrors = this.commandsInErrorSubject.value;\n this.commandsInErrorSubject.next(currentErrors.filter(c => c !== command));\n\n const currentDone = this.commandsDoneSubject.value;\n this.commandsDoneSubject.next([...currentDone, command]);\n\n // Update state to DONE only if there are no more commands\n this.stateSubject.next(\n this.commandsSubject.value.length > 0\n ? CommanderState.EXECUTING\n : CommanderState.DONE,\n );\n\n return EMPTY;\n }\n\n private handleFailedCommand(command: Command, error: any) {\n const event: CommandEvent = {\n type: CommandEventType.FAIL,\n timestamp: new Date(),\n command: command,\n };\n\n if (!command.events) command.events = [];\n command.events.push(event);\n\n const currentErrors = this.commandsInErrorSubject.value;\n this.commandsInErrorSubject.next([...currentErrors, command]);\n\n // Check if we should mark as dead\n this.trashDeadCommands();\n\n return EMPTY;\n }\n stop() {\n this.stateSubject.complete();\n }\n\n addCommand(command: Command) {\n const currentCommands = this.commandsSubject.value;\n this.commandsSubject.next([...currentCommands, command]);\n\n // Start processing if this is the first command\n if (\n currentCommands.length === 0 &&\n this.stateSubject.value === CommanderState.IDLE\n ) {\n this.executeNextCommand();\n }\n }\n\n replayCommandsInError() {\n const commandsInError = this.commandsInErrorSubject.value;\n this.commandsInErrorSubject.next([]);\n\n if (commandsInError.length > 0) {\n this.commandsSubject.next(commandsInError);\n\n // Only start execution if not already executing\n if (this.stateSubject.value === CommanderState.IDLE) {\n this.executeNextCommand();\n }\n }\n }\n\n private trashDeadCommands() {\n const inError = this.commandsInErrorSubject.value;\n\n // Check for commands that have exceeded max retries\n const deadCommands: Command[] = [];\n const remainingCommands: Command[] = [];\n\n inError.forEach((command) => {\n const events = command.events;\n\n // Count failure events (excluding restarts if they exist)\n const failCount =\n events?.filter((e) => e.type === CommandEventType.FAIL).length || 0;\n\n if (events && failCount > this.configuration.error.maxNumberOfRetries) {\n // Mark as dead\n const event: CommandEvent = {\n type: CommandEventType.DEAD,\n timestamp: new Date(),\n command: command,\n };\n\n if (!command.events) command.events = [];\n command.events.push(event);\n\n deadCommands.push(command);\n } else {\n remainingCommands.push(command);\n }\n });\n\n if (deadCommands.length > 0) {\n this.commandsDeadSubject.next([\n ...this.commandsDeadSubject.value,\n ...deadCommands,\n ]);\n }\n\n if (remainingCommands.length !== inError.length) {\n this.commandsInErrorSubject.next(remainingCommands);\n }\n }\n\n flushDeadCommands() {\n this.commandsDeadSubject.next([]);\n }\n\n getCommands(type: CommandsType): Command[] {\n switch (type) {\n case CommandsType.WAITING:\n return this.commandsSubject.value;\n case CommandsType.DONE:\n return this.commandsDoneSubject.value;\n case CommandsType.ERROR:\n return this.commandsInErrorSubject.value;\n case CommandsType.DEAD:\n return this.commandsDeadSubject.value;\n }\n }\n\n getState(): CommanderState {\n return this.stateSubject.value;\n }\n\n private executeNextCommand() {\n const currentCommands = this.commandsSubject.value;\n\n if (currentCommands.length > 0) {\n const [command, ...rest] = currentCommands;\n this.commandsSubject.next(rest);\n\n // Update state to EXECUTING\n if (this.stateSubject.value !== CommanderState.EXECUTING) {\n this.stateSubject.next(CommanderState.EXECUTING);\n }\n\n // Process the command\n this.processingCommand.next({ command, result: null });\n } else {\n // No more commands, set to IDLE\n this.stateSubject.next(CommanderState.IDLE);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}