ng-commander
Version:
Command pattern for Angular applications
1 lines • 12.7 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/lib/ng-commander.module.ts","../../../projects/ng-commander/src/public-api.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}\n\nexport interface CommandEvent {\n type: CommandEventType;\n timestamp: Date;\n command: Command<any>;\n data?: any; // Optional data like result or error information\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, catchError, concatMap, Subject } from 'rxjs';\nimport {\n CommandEvent,\n CommandEventType,\n} from '../Domain/command-event.interface';\nimport { Command } from '../Domain/command.interface';\n\nexport enum CommanderState {\n IDLE,\n EXECUTING,\n DONE,\n ERROR,\n}\n\nexport enum CommandsType {\n WAITING,\n DONE,\n ERROR,\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class Commander {\n // Use BehaviorSubjects instead of arrays\n private commandsSubject = new BehaviorSubject<Command<any>[]>([]);\n private commandsDoneSubject = new BehaviorSubject<Command<any>[]>([]);\n private commandsInErrorSubject = new BehaviorSubject<Command<any>[]>([]);\n private stateSubject = new BehaviorSubject<CommanderState>(\n CommanderState.IDLE\n );\n\n // Nouveau sujet pour les événements de commande\n private eventsSubject = new BehaviorSubject<CommandEvent[]>([]);\n\n private processingCommand = new Subject<{\n command: Command<any>;\n result: any;\n }>();\n\n // Expose as Observables\n public commands$ = this.commandsSubject.asObservable();\n public commandsDone$ = this.commandsDoneSubject.asObservable();\n public commandsInError$ = this.commandsInErrorSubject.asObservable();\n public state$ = this.stateSubject.asObservable();\n public events$ = this.eventsSubject.asObservable();\n\n constructor() {\n this.processingCommand\n .pipe(\n concatMap(({ command }) => {\n this.stateSubject.next(CommanderState.EXECUTING);\n // Ajouter un événement START\n this.trackEvent(CommandEventType.START, command);\n\n return command.execute().pipe(\n concatMap((result) => {\n return [{ command, result, isError: false }];\n }),\n catchError((error) => {\n return [{ command, error, isError: true }];\n })\n );\n })\n )\n .subscribe({\n next: (data) => {\n if (data.isError) {\n this.stateSubject.next(CommanderState.ERROR);\n const currentErrors = this.commandsInErrorSubject.value;\n this.commandsInErrorSubject.next([...currentErrors, data.command]);\n // Ajouter un événement FAIL avec l'erreur si disponible\n this.trackEvent(\n CommandEventType.FAIL,\n data.command,\n 'error' in data ? data.error : undefined\n );\n } else {\n this.stateSubject.next(CommanderState.DONE);\n const currentDone = this.commandsDoneSubject.value;\n this.commandsDoneSubject.next([...currentDone, data.command]);\n // Ajouter un événement SUCCESS avec le résultat si disponible\n this.trackEvent(\n CommandEventType.SUCCESS,\n data.command,\n 'result' in data ? data.result : undefined\n );\n }\n this.executeNextCommand();\n },\n error: (errorObj) => {\n this.stateSubject.next(CommanderState.ERROR);\n this.executeNextCommand();\n },\n });\n }\n\n addCommand<C>(command: Command<C>) {\n // Initialiser le tableau d'événements si nécessaire\n if (!command.events) {\n command.events = [];\n }\n\n const currentCommands = this.commandsSubject.value;\n this.commandsSubject.next([...currentCommands, command]);\n if (currentCommands.length === 0) {\n this.executeNextCommand();\n }\n }\n\n replayCommandsInError() {\n const commandsInError = this.commandsInErrorSubject.value;\n this.commandsInErrorSubject.next([]);\n if (commandsInError.length > 0) {\n // Ajouter un événement RESTART pour chaque commande\n commandsInError.forEach((command) => {\n this.trackEvent(CommandEventType.RESTART, command);\n });\n\n this.commandsSubject.next(commandsInError);\n this.executeNextCommand();\n }\n }\n\n getCommands(type: CommandsType): Command<any>[] {\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 }\n }\n\n getState(): CommanderState {\n return this.stateSubject.value;\n }\n\n // Obtenir tous les événements\n getEvents(): CommandEvent[] {\n return this.eventsSubject.value;\n }\n\n // Obtenir les événements pour une commande spécifique\n getCommandEvents(commandId: string): CommandEvent[] {\n return this.eventsSubject.value.filter(\n (event) => event.command.id === commandId\n );\n }\n\n // Méthode privée pour tracer un événement\n private trackEvent(\n type: CommandEventType,\n command: Command<any>,\n data?: any\n ) {\n const event: CommandEvent = {\n type,\n command,\n data,\n timestamp: new Date(),\n };\n\n // Ajouter l'événement à la collection globale\n const currentEvents = this.eventsSubject.value;\n this.eventsSubject.next([...currentEvents, event]);\n\n // Ajouter l'événement à la commande elle-même\n if (!command.events) {\n command.events = [event];\n } else {\n command.events.push(event);\n }\n }\n\n private executeNextCommand() {\n const currentCommands = this.commandsSubject.value;\n if (currentCommands.length > 0) {\n const [command, ...rest] = currentCommands;\n this.commandsSubject.next(rest);\n this.stateSubject.next(CommanderState.EXECUTING);\n this.processingCommand.next({ command, result: null });\n } else {\n this.stateSubject.next(CommanderState.IDLE);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { Commander } from '../Application/commander.service';\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [Commander],\n exports: [],\n})\nexport class NgCommanderModule {}\n","/*\n * Public API Surface of ng-commander\n */\n\nexport * from './Application/commander.service';\nexport * from './Domain/command.interface';\nexport * from './lib/ng-commander.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}