{"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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"}