{"version":3,"file":"ngx-chaos-engineering.mjs","sources":["../../../projects/ngx-chaos-engineering/src/lib/chaos-config.service.ts","../../../projects/ngx-chaos-engineering/src/lib/chaos-logging.service.ts","../../../projects/ngx-chaos-engineering/src/lib/chaos-tracking.service.ts","../../../projects/ngx-chaos-engineering/src/lib/chaos-interceptor.ts","../../../projects/ngx-chaos-engineering/src/lib/chaos-control/chaos-control.component.ts","../../../projects/ngx-chaos-engineering/src/lib/chaos-control/chaos-control.component.html","../../../projects/ngx-chaos-engineering/src/public-api.ts","../../../projects/ngx-chaos-engineering/src/ngx-chaos-engineering.ts"],"sourcesContent":["import { Injectable, InjectionToken, Provider, inject } from '@angular/core';\r\nimport { ChaosLoggingLevel } from './chaos-logging.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class ChaosConfigService{\r\n    chaosConfig: ChaosConfig;\r\n\r\n    constructor(){\r\n        const configInput = inject(CHAOS_CONFIG);\r\n        \r\n        this.chaosConfig = {\r\n            chaosMode: configInput.chaosMode ?? ChaosMode.Off,\r\n            delay: configInput.delay ?? 2000,\r\n            failureChanceOutOf100: configInput.failureChanceOutOf100 ?? 50,\r\n            randomDelay: configInput.randomDelay ?? null,\r\n            loggingLevel: configInput.loggingLevel ?? ChaosLoggingLevel.Info\r\n        }\r\n    }\r\n}\r\nexport const CHAOS_CONFIG = new InjectionToken<Partial<ChaosConfig>>('chaos.config', { factory: () => { return {}; } });\r\n\r\nexport type ChaosConfig = {\r\n    chaosMode: ChaosMode\r\n    delay: number,\r\n    randomDelay: {\r\n        min: number,\r\n        max: number\r\n    } | null,\r\n    failureChanceOutOf100: number,\r\n    loggingLevel: ChaosLoggingLevel\r\n};\r\n\r\nexport const provideChaosConfig = (config: Partial<ChaosConfig>): Provider => {\r\n    return { provide: CHAOS_CONFIG, useValue: config }\r\n}\r\n\r\nexport enum ChaosMode{\r\n    Off,\r\n    Configured,\r\n    Controlled\r\n}","import { Injectable, inject } from \"@angular/core\";\r\nimport { ChaosConfigService } from \"./chaos-config.service\";\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class ChaosLoggingService{\r\n    loggingLevel = inject(ChaosConfigService).chaosConfig.loggingLevel;\r\n\r\n    logInfo (message: string)  {\r\n        if(this.loggingLevel <= ChaosLoggingLevel.Info){\r\n            this.log('INFO', message);\r\n        }\r\n    }\r\n    \r\n    logDebug(message: string) {\r\n        if(this.loggingLevel <= ChaosLoggingLevel.Debug){\r\n            this.log('DEBUG', message);\r\n        }\r\n    }\r\n\r\n    log = (level: 'INFO' | 'DEBUG', message: string) => console.log(`ngx-chaos-engineering - ${ new Date().toISOString() } - ${level}: ${message}`)\r\n}\r\n\r\n\r\nexport enum ChaosLoggingLevel {\r\n    Debug,\r\n    Info,\r\n    None\r\n}\r\n\r\n","import { HttpRequest } from '@angular/common/http';\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ChaosTrackingService {\r\n\r\n  private _trackedRequests = signal<TrackedRequest[]>([])\r\n\r\n  get trackedRequests() { \r\n    return this._trackedRequests.asReadonly();\r\n  }\r\n\r\n  trackRequest(req: HttpRequest<unknown>) {\r\n    const action$ = new Subject<ChaosCommand>()\r\n    this._trackedRequests.update((requests) => [\r\n      ...requests,\r\n       { \r\n        id: crypto.randomUUID(),\r\n        method: req.method,\r\n        pathName: new URL(req.urlWithParams).pathname,\r\n        action$,\r\n        timeStamp: new Date()\r\n       }\r\n    ]);\r\n    return action$.asObservable();\r\n  }\r\n\r\n  completeRequest(id: string, command: ChaosCommand) {\r\n    const request = this._trackedRequests().filter(request => request.id === id)[0];\r\n    request.action$.next(command);\r\n    request.action$.complete();\r\n    this._trackedRequests.update((requests) => requests.filter(request => request.id !== id));\r\n  }\r\n\r\n}\r\n\r\nexport type ChaosCommand = {\r\n  fail: boolean;\r\n}\r\n\r\nexport type TrackedRequest = {\r\n  id: string;\r\n  method: string;\r\n  pathName: string;\r\n  timeStamp: Date;\r\n  action$: Subject<ChaosCommand>;\r\n}\r\n","import { HttpErrorResponse, HttpHandlerFn, HttpInterceptorFn, HttpRequest } from \"@angular/common/http\";\r\nimport { throwError, delay, switchMap, tap, of, NEVER, forkJoin, Subject } from \"rxjs\";\r\nimport { ChaosLoggingService } from \"./chaos-logging.service\";\r\nimport { inject } from \"@angular/core\";\r\nimport { ChaosConfigService, ChaosMode } from \"./chaos-config.service\";\r\nimport { ChaosTrackingService } from \"./chaos-tracking.service\";\r\n\r\nexport const chaosInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next: HttpHandlerFn)=>{\r\n    const logger = inject(ChaosLoggingService);\r\n    const tracker = inject(ChaosTrackingService);\r\n\r\n    if (shouldTrackChaos()){\r\n        return handleTrackedChaos(logger, tracker, req, next);\r\n    }\r\n\r\n    if (!shouldAddConfiguredChaos()) {\r\n        return next(req);\r\n    }\r\n\r\n    return handleConfiguredChaos(logger, req, next);\r\n}\r\n\r\nconst handleConfiguredChaos = (logger: ChaosLoggingService, req: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n    const delayMs = getDelay();\r\n    const delay$ = of(NEVER).pipe(\r\n        tap(()=>logger.logDebug(`begining ${delayMs}ms delay`)),\r\n        delay(delayMs)\r\n    );\r\n    \r\n    if (!isFailureChanceMet()) {\r\n        return delay$.pipe(switchMap(() => next(req)));\r\n    }\r\n\r\n    return delay$\r\n    .pipe(\r\n        switchMap(() => fail(logger, req))\r\n    );\r\n}\r\n\r\nconst handleTrackedChaos = (logger: ChaosLoggingService, tracker: ChaosTrackingService, req: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n    return tracker.trackRequest(req).pipe(\r\n        switchMap((chaosCommand) => {\r\n            if (chaosCommand.fail) {\r\n                return fail(logger, req);\r\n            }\r\n            return next(req);\r\n        })\r\n    );\r\n}\r\n\r\nconst fail = (logger: ChaosLoggingService, req: HttpRequest<unknown>) => {\r\n    return of(NEVER).pipe(\r\n        tap(()=>{\r\n            logger.logInfo(`throwing artificial error for ${req.method} request to ${req.url}`)\r\n           }),\r\n        switchMap(()=> throwError(() => new HttpErrorResponse(\r\n            {\r\n                error: { code: 500, description: 'Internal Server Error' },\r\n                status: 500,\r\n                statusText: 'Internal Server Error',\r\n                url: req.url\r\n            }\r\n        )\r\n        ))\r\n    )\r\n}\r\n\r\nconst getGetChaosConfig = () => inject(ChaosConfigService).chaosConfig;\r\n\r\nconst getDelay = () => {\r\n    const config = getGetChaosConfig();\r\n    if(config.randomDelay){\r\n        return getRandomNumberInRange(config.randomDelay.min, config.randomDelay.max);\r\n    }\r\n\r\n    return config.delay;\r\n}\r\n\r\nconst shouldAddConfiguredChaos = () => getGetChaosConfig().chaosMode === ChaosMode.Configured;\r\n\r\nconst shouldTrackChaos = () => getGetChaosConfig().chaosMode === ChaosMode.Controlled;\r\n\r\nconst isFailureChanceMet = () => getRandomNumberBetween1And100() <= getGetChaosConfig().failureChanceOutOf100;\r\n\r\nconst getRandomNumberBetween1And100 = () => getRandomNumberInRange(1, 100);\r\n\r\nconst getRandomNumberInRange = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min;\r\n","import { Component, inject } from '@angular/core';\r\nimport { ChaosTrackingService } from '../chaos-tracking.service';\r\nimport { ChaosConfigService, ChaosMode } from '../chaos-config.service';\r\n\r\n@Component({\r\n  selector: 'ngx-chaos-control',\r\n  standalone: true,\r\n  imports: [],\r\n  templateUrl: './chaos-control.component.html',\r\n  styleUrl: './chaos-control.component.css'\r\n})\r\nexport class ChaosControlComponent {\r\n  private tracker = inject(ChaosTrackingService);\r\n\r\n  trackedRequests = this.tracker.trackedRequests;\r\n\r\n  shouldShowChaosControl = inject(ChaosConfigService).chaosConfig.chaosMode === ChaosMode.Controlled;\r\n\r\n  complete = (id: string) => this.tracker.completeRequest(id, {fail:false});\r\n\r\n  fail = (id: string) => this.tracker.completeRequest(id, {fail:true});\r\n}\r\n","@if(shouldShowChaosControl){\r\n    <div id=\"chaos-tracker-box\">\r\n        <table>\r\n            <thead>\r\n                <tr>\r\n                    <td class=\"chaos-time\">Time</td>\r\n                    <td class=\"chaos-method\">Method</td>\r\n                    <td class=\"chaos-action\">Action</td>\r\n                    <td class=\"chaos-path\">Path</td>\r\n                </tr>\r\n            </thead>\r\n            <tbody>\r\n            @for (req of trackedRequests(); track req.id) {\r\n                <tr>\r\n                    <td>{{req.timeStamp.toLocaleTimeString()}}</td>\r\n                    <td>{{req.method}}</td>\r\n                    <td>\r\n                        <button class=\"chaos-btn chaos-success\" (click)=\"complete(req.id)\">play</button>\r\n                        <button class=\"chaos-btn chaos-fail\" (click)=\"fail(req.id)\">fail</button>\r\n                    </td>\r\n                    <td>{{req.pathName}}</td>\r\n                </tr>\r\n            }\r\n            </tbody>\r\n        </table>\r\n    </div>\r\n}","/*\r\n * Public API Surface of ngx-chaos-engineering\r\n */\r\n\r\nexport * from './lib/chaos-interceptor';\r\nexport * from './lib/chaos-config.service';\r\nexport * from './lib/chaos-logging.service';\r\nexport * from './lib/chaos-control/chaos-control.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}