@amadeus-it-group/ngrx-devtool 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"amadeus-it-group-ngrx-devtool.mjs","sources":["../../../projects/ngrx-devtool/src/lib/core/core.models.ts","../../../projects/ngrx-devtool/src/lib/core/effect-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/core/websocket.service.ts","../../../projects/ngrx-devtool/src/lib/core/actions-interceptor.service.ts","../../../projects/ngrx-devtool/src/lib/core/devtools-effect-sources.ts","../../../projects/ngrx-devtool/src/lib/core/index.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-tracker.service.ts","../../../projects/ngrx-devtool/src/types/state.model.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-analyzer.service.ts","../../../projects/ngrx-devtool/src/lib/performance/render-impact-estimator.ts","../../../projects/ngrx-devtool/src/lib/selectors/selector-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/selectors/track-selector.ts","../../../projects/ngrx-devtool/src/lib/store/meta-reducer.ts","../../../projects/ngrx-devtool/src/lib/store/provide-devtool.ts","../../../projects/ngrx-devtool/src/public-api.ts","../../../projects/ngrx-devtool/src/amadeus-it-group-ngrx-devtool.ts"],"sourcesContent":["import { Action } from '@ngrx/store';\n\nexport const DEFAULT_WS_URL = 'ws://localhost:4000';\n\nexport type EffectLifecycle = 'triggered' | 'emitted' | 'executed' | 'error';\n\nexport interface EffectEvent {\n readonly effectName: string;\n readonly sourceName: string;\n readonly propertyName: string;\n readonly lifecycle: EffectLifecycle;\n readonly timestamp: number;\n readonly triggerAction?: Action;\n readonly action?: Action;\n readonly error?: unknown;\n readonly duration?: number;\n readonly executionId?: string;\n readonly dispatch?: boolean;\n}\n\nexport interface EffectMetadataInfo {\n readonly propertyName: string;\n readonly dispatch: boolean;\n readonly functional: boolean;\n readonly useEffectsErrorHandler: boolean;\n}\n\n\n\nexport type ActionSource = 'user' | 'effect';\n\nexport type EffectStatus = 'completed' | 'error';\n\n// Action tracked in the timeline\nexport interface TrackedAction {\n readonly action: string;\n readonly payload: unknown;\n readonly timestamp: number;\n readonly source: ActionSource;\n readonly correlationId?: string;\n readonly effectName?: string;\n}\n\n// Effect execution\nexport interface TrackedEffect {\n readonly effectName: string;\n readonly sourceName: string | null;\n readonly propertyName: string;\n readonly triggerAction?: string;\n readonly resultAction?: string;\n readonly startTime: number;\n readonly endTime?: number;\n readonly duration?: number;\n readonly status: EffectStatus;\n readonly error?: unknown;\n}\n\n\n\nexport type DevToolMessageType = 'ACTION_TRACKED' | 'EFFECT_EVENT' | 'TIMELINE_CLEARED';\n\n\nexport interface DevToolMessage {\n readonly type: DevToolMessageType;\n readonly action?: string;\n readonly payload?: unknown;\n readonly isEffectResult?: boolean;\n readonly effectName?: string;\n readonly correlationId?: string;\n readonly effectEvent?: DevToolEffectEventPayload;\n readonly timestamp: string;\n}\n\nexport interface DevToolEffectEventPayload {\n readonly name: string;\n readonly lifecycle: string;\n readonly duration?: number;\n readonly executionId?: string;\n readonly dispatch?: boolean;\n readonly errorMessage?: string;\n readonly errorStack?: string;\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources } from '@ngrx/effects';\nimport { ReplaySubject, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EffectEvent, TrackedAction, TrackedEffect } from './core.models';\nimport { DevToolsEffectSources } from './devtools-effect-sources';\n\nconst REPLAY_BUFFER_SIZE = 100;\nconst TIMELINE_MAX_SIZE = 1000;\nconst TIMELINE_TRIM_SIZE = 500;\nconst EFFECT_TIMELINE_MAX_SIZE = 500;\nconst CORRELATION_TIMEOUT_MS = 30000;\n\ninterface PendingCorrelation {\n readonly correlationId: string;\n readonly actionType: string;\n readonly timestamp: number;\n readonly timeoutId: ReturnType<typeof setTimeout>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EffectTrackerService implements OnDestroy {\n private readonly effectSources = inject(EffectSources, { optional: true });\n private readonly destroy$ = new Subject<void>();\n\n private actionTimeline: TrackedAction[] = [];\n private effectTimeline: TrackedEffect[] = [];\n private readonly effectActionPatterns = new Set<string>();\n private pendingCorrelations: PendingCorrelation[] = [];\n private correlationCounter = 0;\n private lastTriggerAction: Action | null = null;\n\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n constructor() {\n this.subscribeToEffectEvents();\n }\n\n private subscribeToEffectEvents(): void {\n const devToolsSources = this.effectSources as DevToolsEffectSources | null;\n\n if (devToolsSources?.effectEvents$) {\n\n devToolsSources.effectEvents$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((event: EffectEvent) => {\n this.handleEffectEvent(event);\n this.effectEvents$.next(event);\n });\n }\n }\n\n private handleEffectEvent(event: EffectEvent): void {\n switch (event.lifecycle) {\n case 'emitted':\n if (event.action) {\n const trackedEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n resultAction: event.action.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'completed',\n };\n this.effectTimeline.push(trackedEffect);\n this.effectActionPatterns.add(event.action.type);\n }\n break;\n\n case 'error': {\n const erroredEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'error',\n error: event.error,\n };\n this.effectTimeline.push(erroredEffect);\n break;\n }\n }\n\n if (this.effectTimeline.length > EFFECT_TIMELINE_MAX_SIZE) {\n this.effectTimeline = this.effectTimeline.slice(-EFFECT_TIMELINE_MAX_SIZE / 2);\n }\n }\n\n isEffectAction(actionType: string): boolean {\n return this.effectActionPatterns.has(actionType);\n }\n\n trackAction(action: Action): TrackedAction {\n const isEffect = this.isEffectAction(action.type);\n\n if (!isEffect) {\n this.lastTriggerAction = action;\n }\n\n // Resolve trigger action type to match the correct correlation.\n const triggerActionType = isEffect\n ? this.findTriggerActionType(action.type)\n : undefined;\n\n const correlationId = isEffect\n ? this.consumeCorrelation(triggerActionType)\n : this.createCorrelation(action);\n\n const effectName = this.findEffectNameForAction(action.type);\n\n const tracked: TrackedAction = {\n action: action.type,\n payload: action,\n timestamp: Date.now(),\n source: isEffect ? 'effect' : 'user',\n correlationId,\n effectName,\n };\n\n this.actionTimeline.push(tracked);\n\n if (this.actionTimeline.length > TIMELINE_MAX_SIZE) {\n this.actionTimeline = this.actionTimeline.slice(-TIMELINE_TRIM_SIZE);\n }\n\n return tracked;\n }\n\n getTimeline(): readonly TrackedAction[] {\n return [...this.actionTimeline];\n }\n\n clearTimeline(): void {\n this.actionTimeline = [];\n this.clearPendingCorrelations();\n }\n\n private createCorrelation(action: Action): string {\n const correlationId = `corr_${++this.correlationCounter}_${Date.now()}`;\n\n const timeoutId = setTimeout(() => {\n this.pendingCorrelations = this.pendingCorrelations.filter(\n c => c.correlationId !== correlationId\n );\n }, CORRELATION_TIMEOUT_MS);\n\n this.pendingCorrelations.push({\n correlationId,\n actionType: action.type,\n timestamp: Date.now(),\n timeoutId,\n });\n\n return correlationId;\n }\n\n // Find and consume the best-matching pending correlation (by trigger type, then FIFO fallback).\n private consumeCorrelation(triggerActionType?: string): string | undefined {\n let idx = -1;\n\n // Prefer matching by trigger action type (oldest match first)\n if (triggerActionType) {\n idx = this.pendingCorrelations.findIndex(c => c.actionType === triggerActionType);\n }\n\n // Fallback: oldest pending correlation (FIFO)\n if (idx === -1 && this.pendingCorrelations.length > 0) {\n idx = 0;\n }\n\n if (idx === -1) {\n return undefined;\n }\n\n const [entry] = this.pendingCorrelations.splice(idx, 1);\n clearTimeout(entry.timeoutId);\n return entry.correlationId;\n }\n\n // Resolve which user action type triggered a given effect-result action type.\n private findTriggerActionType(effectActionType: string): string | undefined {\n for (let i = this.effectTimeline.length - 1; i >= Math.max(0, this.effectTimeline.length - 10); i--) {\n const effect = this.effectTimeline[i];\n if (effect.resultAction === effectActionType && effect.triggerAction) {\n return effect.triggerAction;\n }\n }\n return undefined;\n }\n\n private findEffectNameForAction(actionType: string): string | undefined {\n for (let i = this.effectTimeline.length - 1; i >= Math.max(0, this.effectTimeline.length - 10); i--) {\n const effect = this.effectTimeline[i];\n if (effect.resultAction === actionType) {\n return effect.effectName;\n }\n }\n\n return undefined;\n }\n\n private clearPendingCorrelations(): void {\n for (const entry of this.pendingCorrelations) {\n clearTimeout(entry.timeoutId);\n }\n this.pendingCorrelations = [];\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.effectEvents$.complete();\n this.clearPendingCorrelations();\n }\n}\n","import { inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DEFAULT_WS_URL } from './core.models';\n\nexport interface WebSocketMessage {\n readonly type: string;\n}\n\nconst MAX_BUFFER_SIZE = 200;\n\n@Injectable({ providedIn: 'root' })\nexport class WebSocketService implements OnDestroy {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private socket: WebSocket | null = null;\n private messageBuffer: string[] = [];\n private wsUrl: string | null = null;\n private initialized = false;\n\n private readonly connectionState$ = new BehaviorSubject<boolean>(false);\n private readonly incomingMessages$ = new BehaviorSubject<WebSocketMessage | null>(null);\n\n get isConnected(): boolean {\n return this.connectionState$.getValue();\n }\n\n get connected$(): Observable<boolean> {\n return this.connectionState$.asObservable();\n }\n\n get messages$(): Observable<WebSocketMessage | null> {\n return this.incomingMessages$.asObservable();\n }\n\n initialize(wsUrl = DEFAULT_WS_URL): void {\n if (this.initialized) {\n // If already initialized with same URL, skip\n if (this.wsUrl === wsUrl) {\n return;\n }\n // If different URL, close existing and reinitialize\n this.close();\n }\n\n this.initialized = true;\n this.wsUrl = wsUrl;\n this.setupWebSocket(wsUrl);\n }\n\n send<T extends WebSocketMessage>(message: T): void {\n this.bufferOrSend(JSON.stringify(message));\n }\n\n sendRaw(payload: string): void {\n this.bufferOrSend(payload);\n }\n\n private bufferOrSend(payload: string): void {\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(payload);\n } else if (this.isBrowser && this.messageBuffer.length < MAX_BUFFER_SIZE) {\n this.messageBuffer.push(payload);\n }\n }\n\n ngOnDestroy(): void {\n this.close();\n this.connectionState$.complete();\n this.incomingMessages$.complete();\n }\n\n private close(): void {\n this.socket?.close();\n this.socket = null;\n this.messageBuffer = [];\n this.connectionState$.next(false);\n this.initialized = false;\n this.wsUrl = null;\n }\n\n private setupWebSocket(wsUrl: string): void {\n if (!this.isBrowser) {\n return;\n }\n\n this.socket = new WebSocket(wsUrl);\n\n this.socket.onopen = () => {\n this.connectionState$.next(true);\n this.flushBuffer();\n };\n\n this.socket.onclose = () => {\n this.connectionState$.next(false);\n };\n\n this.socket.onerror = (error) => {\n console.warn('[NgRx DevTool] WebSocket error:', error);\n };\n\n this.socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as WebSocketMessage;\n this.incomingMessages$.next(message);\n } catch {\n // Ignore non-JSON messages\n }\n };\n }\n\n private flushBuffer(): void {\n const buffered = this.messageBuffer;\n this.messageBuffer = [];\n\n for (const message of buffered) {\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(message);\n }\n }\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Actions } from '@ngrx/effects';\nimport { Action } from '@ngrx/store';\nimport { filter, Subject, takeUntil, tap } from 'rxjs';\n\nimport { DEFAULT_WS_URL, DevToolMessage, EffectEvent, TrackedAction } from './core.models';\nimport { EffectTrackerService } from './effect-tracker.service';\nimport { WebSocketService, WebSocketMessage } from './websocket.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ActionsInterceptorService implements OnDestroy {\n private readonly actions$ = inject(Actions);\n private readonly effectTracker = inject(EffectTrackerService);\n private readonly webSocketService = inject(WebSocketService);\n\n private readonly destroy$ = new Subject<void>();\n private initialized = false;\n\n initialize(wsUrl = DEFAULT_WS_URL): void {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n this.webSocketService.initialize(wsUrl);\n this.setupMessageListener();\n this.setupActionInterception();\n this.setupEffectEventForwarding();\n }\n\n getTimeline(): readonly TrackedAction[] {\n return this.effectTracker.getTimeline();\n }\n\n clearTimeline(): void {\n this.effectTracker.clearTimeline();\n this.sendMessage({\n type: 'TIMELINE_CLEARED',\n timestamp: new Date().toISOString(),\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupMessageListener(): void {\n this.webSocketService.messages$.pipe(\n takeUntil(this.destroy$),\n filter((message): message is WebSocketMessage => message !== null),\n tap((message) => {\n if (message['type'] === 'CLEAR_REQUEST') {\n this.effectTracker.clearTimeline();\n }\n })\n ).subscribe();\n }\n\n private setupActionInterception(): void {\n this.actions$.pipe(\n takeUntil(this.destroy$),\n tap((action: Action) => {\n const tracked = this.effectTracker.trackAction(action);\n\n const message: DevToolMessage = {\n type: 'ACTION_TRACKED',\n action: action.type,\n payload: this.sanitizePayload(action),\n isEffectResult: tracked.source === 'effect',\n effectName: tracked.effectName,\n correlationId: tracked.correlationId,\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe();\n }\n\n private setupEffectEventForwarding(): void {\n this.effectTracker.effectEvents$.pipe(\n takeUntil(this.destroy$),\n tap((event: EffectEvent) => {\n const errorMessage = event.error instanceof Error\n ? event.error.message\n : event.error != null ? String(event.error) : undefined;\n const errorStack = event.error instanceof Error ? event.error.stack : undefined;\n\n const message: DevToolMessage = {\n type: 'EFFECT_EVENT',\n action: event.action?.type,\n effectName: event.effectName,\n effectEvent: {\n name: event.effectName,\n lifecycle: event.lifecycle,\n duration: event.duration,\n executionId: event.executionId,\n dispatch: event.dispatch,\n errorMessage,\n errorStack,\n },\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe({\n error: (err) => console.error('[NgRx DevTool] Effect event forwarding error:', err)\n });\n }\n\n private sendMessage(message: DevToolMessage): void {\n this.webSocketService.send(message);\n }\n\n private sanitizePayload(action: Action): unknown {\n try {\n JSON.stringify(action);\n return action;\n } catch {\n return { type: action.type, _note: 'Non-serializable payload' };\n }\n }\n}\n","import { ErrorHandler, inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources, EFFECTS_ERROR_HANDLER } from '@ngrx/effects';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { EffectEvent, EffectMetadataInfo } from './core.models';\n\n\n/** NgRx internal metadata key for createEffect() */\nconst CREATE_EFFECT_METADATA_KEY = '__@ngrx/effects_create__';\n\nconst REPLAY_BUFFER_SIZE = 100;\n\n\ninterface EffectConfig {\n readonly dispatch?: boolean;\n readonly functional?: boolean;\n readonly useEffectsErrorHandler?: boolean;\n}\n\ninterface EffectSourceInstance {\n ngrxOnIdentifyEffects?(): string;\n constructor: { name?: string };\n [key: string]: unknown;\n}\n\ntype EffectObservable = Observable<Action> & {\n [CREATE_EFFECT_METADATA_KEY]?: EffectConfig;\n};\n\n@Injectable()\nexport class DevToolsEffectSources extends EffectSources implements OnDestroy {\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n private readonly registeredEffects = new Map<string, readonly EffectMetadataInfo[]>();\n private executionCounter = 0;\n\n constructor() {\n super(inject(ErrorHandler), inject(EFFECTS_ERROR_HANDLER));\n }\n\n override addEffects(effectSourceInstance: EffectSourceInstance): void {\n const sourceName = this.resolveSourceName(effectSourceInstance);\n\n if (sourceName) {\n const metadata = this.extractEffectMetadata(effectSourceInstance);\n\n if (metadata.length > 0) {\n this.registeredEffects.set(sourceName, metadata);\n this.instrumentEffects(effectSourceInstance, sourceName, metadata);\n }\n }\n\n super.addEffects(effectSourceInstance);\n }\n\n getRegisteredEffects(): ReadonlyMap<string, readonly EffectMetadataInfo[]> {\n return this.registeredEffects;\n }\n\n ngOnDestroy(): void {\n this.effectEvents$.complete();\n }\n\n private instrumentEffects(\n instance: EffectSourceInstance,\n sourceName: string,\n metadata: readonly EffectMetadataInfo[]\n ): void {\n for (const { propertyName, dispatch } of metadata) {\n const original = instance[propertyName];\n if (!original) continue;\n\n const effectName = `${sourceName}.${propertyName}`;\n\n if (typeof original === 'function') {\n const factory = original as () => EffectObservable;\n const wrapped = () => this.wrapEffectObservable(factory(), effectName, dispatch);\n this.copyEffectMetadata(factory, wrapped);\n instance[propertyName] = wrapped;\n } else if (this.isObservable(original)) {\n const wrapped = this.wrapEffectObservable(original, effectName, dispatch);\n this.copyEffectMetadata(original as EffectObservable, wrapped);\n instance[propertyName] = wrapped;\n }\n }\n }\n\n private wrapEffectObservable(\n source$: Observable<Action>,\n effectName: string,\n dispatch: boolean\n ): Observable<Action> {\n const [sourceName, propertyName] = this.parseEffectName(effectName);\n\n return new Observable(subscriber => {\n let lastEmitTime = Date.now();\n\n const subscription = source$.pipe(\n tap({\n next: (value: Action) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: dispatch ? 'emitted' : 'executed',\n action: dispatch ? value : undefined,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n dispatch,\n });\n lastEmitTime = now;\n },\n error: (err: unknown) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: 'error',\n error: err,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n });\n },\n })\n ).subscribe(subscriber);\n\n return () => subscription.unsubscribe();\n });\n }\n\n private copyEffectMetadata(\n original: EffectObservable | (() => EffectObservable),\n wrapped: EffectObservable | (() => EffectObservable)\n ): void {\n const originalRecord = original as unknown as Record<string, unknown>;\n const metadata = originalRecord[CREATE_EFFECT_METADATA_KEY];\n if (metadata) {\n Object.defineProperty(wrapped, CREATE_EFFECT_METADATA_KEY, {\n value: metadata,\n configurable: true,\n });\n }\n }\n\n private extractEffectMetadata(instance: EffectSourceInstance): EffectMetadataInfo[] {\n const metadata: EffectMetadataInfo[] = [];\n\n for (const propertyName of Object.getOwnPropertyNames(instance)) {\n try {\n const property = instance[propertyName] as EffectObservable | undefined;\n const config = property?.[CREATE_EFFECT_METADATA_KEY];\n\n if (config) {\n metadata.push({\n propertyName,\n dispatch: config.dispatch !== false,\n functional: config.functional === true,\n useEffectsErrorHandler: config.useEffectsErrorHandler !== false,\n });\n }\n } catch {\n // Ignore reflection errors for non-effect properties\n }\n }\n\n return metadata;\n }\n\n private resolveSourceName(instance: EffectSourceInstance): string | null {\n if (!instance) return null;\n\n if (typeof instance.ngrxOnIdentifyEffects === 'function') {\n const id = instance.ngrxOnIdentifyEffects();\n if (id) return id;\n }\n\n const constructorName = instance.constructor?.name;\n if (this.isValidClassName(constructorName)) {\n return constructorName;\n }\n\n const proto = Object.getPrototypeOf(instance) as EffectSourceInstance | null;\n const protoName = proto?.constructor?.name;\n if (this.isValidClassName(protoName)) {\n return protoName;\n }\n\n const effectProps = Object.getOwnPropertyNames(instance)\n .filter(p => p.endsWith('$') || p.startsWith('load') || p.startsWith('fetch'));\n\n if (effectProps.length > 0) {\n return `Effects(${effectProps.slice(0, 2).join(', ')}...)`;\n }\n\n return constructorName ?? 'UnknownEffect';\n }\n\n private isValidClassName(name: string | undefined): name is string {\n return Boolean(name && name.length > 1 && name !== 'Object' && name !== 'Function');\n }\n\n private isObservable(value: unknown): value is Observable<Action> {\n return Boolean(value && typeof (value as Observable<Action>).subscribe === 'function');\n }\n\n private parseEffectName(effectName: string): [string, string] {\n const [sourceName, propertyName = 'unknown'] = effectName.split('.');\n return [sourceName, propertyName];\n }\n\n private generateExecutionId(effectName: string): string {\n return `${effectName}_${++this.executionCounter}`;\n }\n\n private emitEvent(event: EffectEvent): void {\n this.effectEvents$.next(event);\n }\n}\n","// Models\nexport * from './core.models';\n\n// Services\nexport * from './actions-interceptor.service';\nexport * from './effect-tracker.service';\nexport * from './devtools-effect-sources';\nexport * from './websocket.service';\n","import { Injectable, inject, PLATFORM_ID, Injector, afterNextRender } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { PerformanceWarning, PerformanceThresholds, ActionTypeStats, PerformanceWarningType } from '../../types/state.model';\n\nexport interface RenderPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly renderTime: number;\n}\n\nexport interface RenderPerformanceStats {\n readonly avgRenderTime: number;\n readonly maxRenderTime: number;\n readonly slowestAction: string | null;\n readonly totalActions: number;\n}\n\nexport interface AggregatedPerformanceStats {\n readonly totalActions: number;\n readonly avgReducerTime: number;\n readonly maxReducerTime: number;\n readonly slowestAction: string | null;\n readonly currentStateSize: number;\n readonly actionsPerSecond: number;\n readonly performanceScore: number;\n readonly actionTypeStats: Map<string, ActionTypeStats>;\n}\n\nexport interface WarningsSummary {\n readonly type: PerformanceWarningType;\n readonly count: number;\n readonly severity: 'low' | 'medium' | 'high';\n}\n\nconst ENTRIES_MAX_SIZE = 1000;\nconst ENTRIES_TRIM_SIZE = 500;\n\nconst DEFAULT_THRESHOLDS: PerformanceThresholds = {\n maxReducerTime: 16,\n maxStateSize: 5 * 1024 * 1024,\n maxStateChangeSize: 1024 * 1024,\n maxActionsPerSecond: 60,\n maxPayloadSize: 100 * 1024,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceTrackerService {\n private entries: RenderPerformanceEntry[] = [];\n private warnings: PerformanceWarning[] = [];\n private readonly platformId = inject(PLATFORM_ID);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private thresholds = DEFAULT_THRESHOLDS;\n private firstActionTime: number | null = null;\n\n measureRenderTime<State>(\n actionType: string,\n reducer: () => State,\n callback: (renderTime: number) => void\n ): State {\n const startTime = performance.now();\n const nextState = reducer();\n\n if (!this.isBrowser) {\n callback(0);\n return nextState;\n }\n\n afterNextRender(() => {\n const renderTime = parseFloat((performance.now() - startTime).toFixed(2));\n\n const entry: RenderPerformanceEntry = {\n actionType,\n timestamp: Date.now(),\n renderTime,\n };\n\n this.entries.push(entry);\n\n if (this.firstActionTime === null) {\n this.firstActionTime = entry.timestamp;\n }\n\n if (this.entries.length > ENTRIES_MAX_SIZE) {\n this.entries = this.entries.slice(-ENTRIES_TRIM_SIZE);\n }\n\n callback(renderTime);\n }, { injector: this.injector });\n\n return nextState;\n }\n\n getEntries(): readonly RenderPerformanceEntry[] {\n return [...this.entries];\n }\n\n getStats(): RenderPerformanceStats {\n if (this.entries.length === 0) {\n return {\n avgRenderTime: 0,\n maxRenderTime: 0,\n slowestAction: null,\n totalActions: 0,\n };\n }\n\n const renderTimes = this.entries.map(e => e.renderTime);\n const avgRenderTime = renderTimes.reduce((a, b) => a + b, 0) / renderTimes.length;\n const maxRenderTime = Math.max(...renderTimes);\n\n const slowestEntry = this.entries.reduce((prev, curr) =>\n curr.renderTime > prev.renderTime ? curr : prev\n );\n\n return {\n avgRenderTime,\n maxRenderTime,\n slowestAction: slowestEntry.actionType,\n totalActions: this.entries.length,\n };\n }\n\n getAggregatedStats(): AggregatedPerformanceStats {\n const stats = this.getStats();\n const actionTypeStats = this.getActionTypeStats();\n const elapsedTime = this.firstActionTime\n ? (Date.now() - this.firstActionTime) / 1000\n : 1;\n\n return {\n totalActions: stats.totalActions,\n avgReducerTime: stats.avgRenderTime,\n maxReducerTime: stats.maxRenderTime,\n slowestAction: stats.slowestAction,\n currentStateSize: 0,\n actionsPerSecond: stats.totalActions / Math.max(elapsedTime, 1),\n performanceScore: this.calculatePerformanceScore(stats),\n actionTypeStats,\n };\n }\n\n getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n setThresholds(thresholds: Partial<PerformanceThresholds>): void {\n this.thresholds = { ...this.thresholds, ...thresholds };\n }\n\n getWarningsSummary(): WarningsSummary[] {\n const summaryMap = new Map<PerformanceWarningType, WarningsSummary>();\n\n for (const warning of this.warnings) {\n const existing = summaryMap.get(warning.type);\n if (existing) {\n summaryMap.set(warning.type, {\n ...existing,\n count: existing.count + 1,\n severity: this.maxSeverity(existing.severity, warning.severity),\n });\n } else {\n summaryMap.set(warning.type, {\n type: warning.type,\n count: 1,\n severity: warning.severity,\n });\n }\n }\n\n return Array.from(summaryMap.values());\n }\n\n getSlowestRenders(limit = 10): readonly RenderPerformanceEntry[] {\n return [...this.entries]\n .sort((a, b) => b.renderTime - a.renderTime)\n .slice(0, limit);\n }\n\n clear(): void {\n this.entries = [];\n this.warnings = [];\n this.firstActionTime = null;\n }\n\n private getActionTypeStats(): Map<string, ActionTypeStats> {\n const statsMap = new Map<string, ActionTypeStats>();\n\n for (const entry of this.entries) {\n const existing = statsMap.get(entry.actionType);\n if (existing) {\n existing.count++;\n existing.totalTime += entry.renderTime;\n existing.avgTime = existing.totalTime / existing.count;\n existing.maxTime = Math.max(existing.maxTime, entry.renderTime);\n existing.lastExecuted = entry.timestamp;\n } else {\n statsMap.set(entry.actionType, {\n count: 1,\n totalTime: entry.renderTime,\n avgTime: entry.renderTime,\n maxTime: entry.renderTime,\n lastExecuted: entry.timestamp,\n });\n }\n }\n\n return statsMap;\n }\n\n private calculatePerformanceScore(stats: RenderPerformanceStats): number {\n let score = 100;\n\n if (stats.avgRenderTime > this.thresholds.maxReducerTime) {\n score -= Math.min(30, (stats.avgRenderTime - this.thresholds.maxReducerTime) * 2);\n }\n\n if (stats.maxRenderTime > this.thresholds.maxReducerTime * 2) {\n score -= Math.min(20, (stats.maxRenderTime - this.thresholds.maxReducerTime * 2) / 2);\n }\n\n return Math.max(0, Math.round(score));\n }\n\n private maxSeverity(\n a: 'low' | 'medium' | 'high',\n b: 'low' | 'medium' | 'high'\n ): 'low' | 'medium' | 'high' {\n const order = { low: 0, medium: 1, high: 2 };\n return order[a] >= order[b] ? a : b;\n }\n}\n","export interface ActionDispatchedPayload {\n readonly actionType: string;\n readonly previousState: Record<string, unknown>;\n readonly action: Record<string, unknown>;\n readonly nextState: Record<string, unknown>;\n}\n\nexport interface PerformanceMetrics {\n readonly reducerExecutionTime: number;\n readonly stateSize: number;\n readonly stateSizeChange: number;\n readonly memoryUsage?: MemoryInfo;\n readonly actionPayloadSize: number;\n}\n\nexport interface MemoryInfo {\n readonly usedJSHeapSize: number;\n readonly totalJSHeapSize: number;\n readonly jsHeapSizeLimit: number;\n}\n\n\nexport interface PerformanceWarning {\n readonly type: PerformanceWarningType;\n readonly message: string;\n readonly severity: 'low' | 'medium' | 'high';\n readonly suggestion?: string;\n}\n\nexport enum PerformanceWarningType {\n SLOW_REDUCER = 'SLOW_REDUCER',\n LARGE_STATE = 'LARGE_STATE',\n LARGE_STATE_CHANGE = 'LARGE_STATE_CHANGE',\n FREQUENT_ACTIONS = 'FREQUENT_ACTIONS',\n LARGE_PAYLOAD = 'LARGE_PAYLOAD',\n MEMORY_PRESSURE = 'MEMORY_PRESSURE',\n HIGH_RENDER_IMPACT = 'HIGH_RENDER_IMPACT',\n}\n\nexport interface PerformanceThresholds {\n readonly maxReducerTime: number;\n readonly maxStateSize: number;\n readonly maxStateChangeSize: number;\n readonly maxActionsPerSecond: number;\n readonly maxPayloadSize: number;\n}\n\nexport interface ActionTypeStats {\n count: number;\n totalTime: number;\n avgTime: number;\n maxTime: number;\n lastExecuted: number;\n}\n\nexport interface ActionPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly metrics: PerformanceMetrics;\n readonly warnings: readonly PerformanceWarning[];\n}\n\nexport interface RenderImpactData {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactorData[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactorData {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface SelectorMetricsData {\n readonly name: string;\n readonly invocationCount: number;\n readonly recomputationCount: number;\n readonly totalComputationTime: number;\n readonly avgComputationTime: number;\n maxComputationTime: number;\n cacheHitRate: number;\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n PerformanceTrackerService,\n AggregatedPerformanceStats,\n} from './performance-tracker.service';\nimport { PerformanceWarningType, ActionTypeStats } from '../../types/state.model';\n\nexport interface PerformanceRecommendation {\n readonly category: 'reducer' | 'state' | 'actions' | 'memory' | 'general';\n readonly title: string;\n readonly description: string;\n readonly impact: 'low' | 'medium' | 'high';\n readonly codeExample?: string;\n readonly learnMoreUrl?: string;\n}\n\nexport interface PerformanceReport {\n readonly timestamp: string;\n readonly overallScore: number;\n readonly scoreGrade: 'A' | 'B' | 'C' | 'D' | 'F';\n readonly stats: AggregatedPerformanceStats;\n readonly recommendations: readonly PerformanceRecommendation[];\n readonly hotspots: readonly HotspotInfo[];\n readonly trends: PerformanceTrends;\n}\n\nexport interface HotspotInfo {\n readonly actionType: string;\n readonly issue: string;\n readonly avgTime: number;\n readonly callCount: number;\n readonly totalTime: number;\n readonly percentOfTotal: number;\n}\n\nexport interface PerformanceTrends {\n readonly reducerTimesTrend: 'improving' | 'stable' | 'degrading';\n readonly stateSizeTrend: 'stable' | 'growing' | 'shrinking';\n readonly actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceAnalyzerService {\n private previousStats: AggregatedPerformanceStats | null = null;\n private readonly performanceTracker = inject(PerformanceTrackerService);\n\n generateReport(): PerformanceReport {\n const stats = this.performanceTracker.getAggregatedStats();\n const recommendations = this.generateRecommendations(stats);\n const hotspots = this.identifyHotspots(stats);\n const trends = this.analyzeTrends(stats);\n\n const report: PerformanceReport = {\n timestamp: new Date().toISOString(),\n overallScore: stats.performanceScore,\n scoreGrade: this.getScoreGrade(stats.performanceScore),\n stats,\n recommendations,\n hotspots,\n trends,\n };\n\n this.previousStats = stats;\n\n return report;\n }\n\n getQuickSummary(): {\n score: number;\n grade: string;\n mainIssue: string | null;\n actionCount: number;\n avgReducerTime: number;\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n let mainIssue: string | null = null;\n const highSeverityWarning = warnings.find(w => w.severity === 'high');\n if (highSeverityWarning) {\n mainIssue = this.getWarningDescription(highSeverityWarning.type);\n }\n\n return {\n score: stats.performanceScore,\n grade: this.getScoreGrade(stats.performanceScore),\n mainIssue,\n actionCount: stats.totalActions,\n avgReducerTime: stats.avgReducerTime,\n };\n }\n\n analyzeActionType(actionType: string): {\n stats: ActionTypeStats | undefined;\n isProblematic: boolean;\n issues: string[];\n suggestions: string[];\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const actionStats = stats.actionTypeStats.get(actionType);\n const thresholds = this.performanceTracker.getThresholds();\n\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n if (!actionStats) {\n return { stats: undefined, isProblematic: false, issues, suggestions };\n }\n\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issues.push(`Average execution time (${actionStats.avgTime.toFixed(2)}ms) exceeds threshold`);\n suggestions.push('Consider optimizing the reducer logic for this action');\n }\n\n const totalActions = stats.totalActions;\n const percentOfTotal = (actionStats.count / totalActions) * 100;\n if (percentOfTotal > 30 && actionStats.count > 10) {\n issues.push(`This action represents ${percentOfTotal.toFixed(1)}% of all actions`);\n suggestions.push('Consider debouncing or batching this action if dispatched frequently');\n }\n\n if (actionStats.maxTime > actionStats.avgTime * 3 && actionStats.maxTime > thresholds.maxReducerTime) {\n issues.push(`Occasional spikes in execution time (max: ${actionStats.maxTime.toFixed(2)}ms)`);\n suggestions.push('Investigate what causes performance spikes - possibly large payload or complex state updates');\n }\n\n return {\n stats: actionStats,\n isProblematic: issues.length > 0,\n issues,\n suggestions,\n };\n }\n\n private generateRecommendations(stats: AggregatedPerformanceStats): PerformanceRecommendation[] {\n const recommendations: PerformanceRecommendation[] = [];\n const thresholds = this.performanceTracker.getThresholds();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n if (stats.avgReducerTime > thresholds.maxReducerTime) {\n recommendations.push({\n category: 'reducer',\n title: 'Optimize Reducer Performance',\n description: `Your reducers are taking an average of ${stats.avgReducerTime.toFixed(2)}ms to execute. For smooth 60fps animations, reducers should complete in under ${thresholds.maxReducerTime}ms.`,\n impact: stats.avgReducerTime > thresholds.maxReducerTime * 2 ? 'high' : 'medium',\n codeExample: `import { createReducer, on } from '@ngrx/store';\nimport { produce } from 'immer';\n\non(someAction, (state, { items }) => ({\n ...state,\n items\n}))`,\n learnMoreUrl: 'https://ngrx.io/guide/store/reducers#reducer-functions',\n });\n }\n\n if (stats.currentStateSize > thresholds.maxStateSize * 0.5) {\n recommendations.push({\n category: 'state',\n title: 'Consider State Normalization',\n description: `Your state size is ${this.formatBytes(stats.currentStateSize)}. Large states can slow down serialization and increase memory usage.`,\n impact: stats.currentStateSize > thresholds.maxStateSize ? 'high' : 'medium',\n codeExample: `{ users: [{ id: 1, posts: [{ id: 1, ... }] }] }\n\n{\n users: { ids: [1], entities: { 1: { id: 1 } } },\n posts: { ids: [1], entities: { 1: { id: 1, userId: 1 } } }\n}`,\n learnMoreUrl: 'https://ngrx.io/guide/entity',\n });\n }\n\n if (stats.actionsPerSecond > thresholds.maxActionsPerSecond * 0.5) {\n recommendations.push({\n category: 'actions',\n title: 'Reduce Action Dispatch Frequency',\n description: `You're dispatching ${stats.actionsPerSecond.toFixed(1)} actions per second. High frequency can cause performance issues.`,\n impact: stats.actionsPerSecond > thresholds.maxActionsPerSecond ? 'high' : 'medium',\n codeExample: `import { debounceTime } from 'rxjs/operators';\n\nsearchInput$.pipe(\n debounceTime(300)\n).subscribe(term => {\n this.store.dispatch(searchAction({ term }));\n});\n\nthis.store.dispatch(batchUpdateAction({ items: allItems }));`,\n });\n }\n\n if (stats.slowestAction && stats.maxReducerTime > thresholds.maxReducerTime * 2) {\n recommendations.push({\n category: 'reducer',\n title: `Optimize \"${stats.slowestAction}\"`,\n description: `This action has the highest execution time (${stats.maxReducerTime.toFixed(2)}ms). Focus optimization efforts here for maximum impact. Profile this specific action to identify bottlenecks.`,\n impact: 'high',\n });\n }\n\n const memoryWarnings = warnings.filter(w => w.type === PerformanceWarningType.MEMORY_PRESSURE);\n if (memoryWarnings.length > 0) {\n recommendations.push({\n category: 'memory',\n title: 'Address Memory Pressure',\n description: 'Your application is using a significant portion of available memory. This can lead to garbage collection pauses.',\n impact: 'high',\n codeExample: `ngOnDestroy() {\n this.store.dispatch(clearTemporaryData());\n}\n\nthis.store.dispatch(loadPage({ page: 1, pageSize: 50 }));`,\n });\n }\n\n if (stats.performanceScore >= 80 && recommendations.length === 0) {\n recommendations.push({\n category: 'general',\n title: 'Performance is Good! 🎉',\n description: 'Your NgRx store is performing well. Continue following best practices.',\n impact: 'low',\n });\n }\n\n return recommendations;\n }\n\n private identifyHotspots(stats: AggregatedPerformanceStats): HotspotInfo[] {\n const hotspots: HotspotInfo[] = [];\n const totalTime = Array.from(stats.actionTypeStats.values())\n .reduce((sum, s) => sum + s.totalTime, 0);\n\n stats.actionTypeStats.forEach((actionStats, actionType) => {\n const percentOfTotal = (actionStats.totalTime / totalTime) * 100;\n const thresholds = this.performanceTracker.getThresholds();\n\n let issue = '';\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issue = 'Slow reducer execution';\n } else if (percentOfTotal > 20 && actionStats.count > 5) {\n issue = 'High time consumption';\n } else if (actionStats.maxTime > actionStats.avgTime * 5) {\n issue = 'Inconsistent performance';\n }\n\n if (issue) {\n hotspots.push({\n actionType,\n issue,\n avgTime: actionStats.avgTime,\n callCount: actionStats.count,\n totalTime: actionStats.totalTime,\n percentOfTotal,\n });\n }\n });\n\n return hotspots.sort((a, b) => b.totalTime - a.totalTime).slice(0, 5);\n }\n\n private analyzeTrends(currentStats: AggregatedPerformanceStats): PerformanceTrends {\n if (!this.previousStats) {\n return {\n reducerTimesTrend: 'stable',\n stateSizeTrend: 'stable',\n actionFrequencyTrend: 'stable',\n };\n }\n\n const prev = this.previousStats;\n\n let reducerTimesTrend: 'improving' | 'stable' | 'degrading' = 'stable';\n const timeDiff = currentStats.avgReducerTime - prev.avgReducerTime;\n if (timeDiff > 2) reducerTimesTrend = 'degrading';\n else if (timeDiff < -2) reducerTimesTrend = 'improving';\n\n let stateSizeTrend: 'stable' | 'growing' | 'shrinking' = 'stable';\n const sizeDiff = currentStats.currentStateSize - prev.currentStateSize;\n const sizeChangePercent = Math.abs(sizeDiff) / (prev.currentStateSize || 1) * 100;\n if (sizeChangePercent > 10) {\n stateSizeTrend = sizeDiff > 0 ? 'growing' : 'shrinking';\n }\n\n let actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing' = 'stable';\n const freqDiff = currentStats.actionsPerSecond - prev.actionsPerSecond;\n if (freqDiff > 5) actionFrequencyTrend = 'increasing';\n else if (freqDiff < -5) actionFrequencyTrend = 'decreasing';\n\n return {\n reducerTimesTrend,\n stateSizeTrend,\n actionFrequencyTrend,\n };\n }\n\n private getScoreGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n }\n\n private getWarningDescription(type: PerformanceWarningType): string {\n const descriptions: Record<string, string> = {\n SLOW_REDUCER: 'Slow reducer execution',\n LARGE_STATE: 'Large state size',\n LARGE_STATE_CHANGE: 'Large state changes',\n FREQUENT_ACTIONS: 'High action frequency',\n LARGE_PAYLOAD: 'Large action payloads',\n MEMORY_PRESSURE: 'Memory pressure',\n };\n return descriptions[type] || type;\n }\n\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n }\n}\n","export interface RenderImpactEstimate {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactor[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactor {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface StateChangeAnalysis {\n rootPropertiesChanged: number;\n totalPropertiesChanged: number;\n arrayChanges: ArrayChangeInfo[];\n largeObjectChanges: LargeObjectChange[];\n maxChangeDepth: number;\n}\n\nexport interface ArrayChangeInfo {\n readonly path: string;\n readonly previousLength: number;\n readonly newLength: number;\n readonly itemsAdded: number;\n readonly itemsRemoved: number;\n}\n\nexport interface LargeObjectChange {\n readonly path: string;\n readonly size: number;\n readonly changeType: 'added' | 'modified' | 'replaced';\n}\n\nexport function estimateRenderImpact(\n prevState: unknown,\n nextState: unknown\n): RenderImpactEstimate {\n const analysis = analyzeStateChange(prevState, nextState);\n const factors: RenderImpactFactor[] = [];\n let totalScore = 0;\n\n if (analysis.rootPropertiesChanged > 0) {\n const impact = Math.min(analysis.rootPropertiesChanged * 15, 40);\n totalScore += impact;\n factors.push({\n name: 'Root State Changes',\n description: `${analysis.rootPropertiesChanged} top-level state slice(s) changed`,\n impact,\n details: 'Each root change can trigger re-renders in components selecting that slice',\n });\n }\n\n if (analysis.arrayChanges.length > 0) {\n const largestArrayChange = Math.max(...analysis.arrayChanges.map(a => Math.abs(a.newLength - a.previousLength)));\n const impact = Math.min(largestArrayChange * 2 + analysis.arrayChanges.length * 5, 50);\n totalScore += impact;\n factors.push({\n name: 'Array Mutations',\n description: `${analysis.arrayChanges.length} array(s) changed`,\n impact,\n details: analysis.arrayChanges.map(a =>\n `${a.path}: ${a.previousLength} → ${a.newLength} items`\n ).join(', '),\n });\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n const totalSize = analysis.largeObjectChanges.reduce((sum, o) => sum + o.size, 0);\n const impact = Math.min(totalSize / 10000 * 20, 30);\n totalScore += impact;\n factors.push({\n name: 'Large Object Changes',\n description: `${analysis.largeObjectChanges.length} large object(s) changed (${formatBytes(totalSize)})`,\n impact,\n details: 'Large objects can cause expensive diffing and template updates',\n });\n }\n\n if (analysis.maxChangeDepth > 3) {\n const impact = Math.min((analysis.maxChangeDepth - 3) * 5, 15);\n totalScore += impact;\n factors.push({\n name: 'Deep State Changes',\n description: `Changes at depth ${analysis.maxChangeDepth}`,\n impact,\n details: 'Deeply nested changes may indicate non-normalized state',\n });\n }\n\n if (analysis.totalPropertiesChanged > 10) {\n const impact = Math.min(analysis.totalPropertiesChanged / 5, 20);\n totalScore += impact;\n factors.push({\n name: 'Property Change Volume',\n description: `${analysis.totalPropertiesChanged} total properties changed`,\n impact,\n });\n }\n\n totalScore = Math.min(Math.round(totalScore), 100);\n\n let level: 'low' | 'medium' | 'high' | 'critical';\n if (totalScore < 25) level = 'low';\n else if (totalScore < 50) level = 'medium';\n else if (totalScore < 75) level = 'high';\n else level = 'critical';\n\n const estimatedComponentsAffected = Math.ceil(\n analysis.rootPropertiesChanged * 2 +\n analysis.arrayChanges.length * 3 +\n analysis.largeObjectChanges.length\n );\n\n const recommendations = generateRecommendations(analysis, factors);\n\n return {\n score: totalScore,\n level,\n estimatedComponentsAffected,\n factors,\n recommendations,\n };\n}\n\nfunction analyzeStateChange(prevState: unknown, nextState: unknown): StateChangeAnalysis {\n const analysis: StateChangeAnalysis = {\n rootPropertiesChanged: 0,\n totalPropertiesChanged: 0,\n arrayChanges: [],\n largeObjectChanges: [],\n maxChangeDepth: 0,\n };\n\n if (!prevState || !nextState || typeof prevState !== 'object' || typeof nextState !== 'object') {\n return analysis;\n }\n\n const prevObj = prevState as Record<string, unknown>;\n const nextObj = nextState as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analysis.rootPropertiesChanged++;\n analyzeDeep(prevObj[key], nextObj[key], key, 1, analysis);\n }\n }\n\n return analysis;\n}\n\nfunction analyzeDeep(\n prev: unknown,\n next: unknown,\n path: string,\n depth: number,\n analysis: StateChangeAnalysis\n): void {\n analysis.maxChangeDepth = Math.max(analysis.maxChangeDepth, depth);\n analysis.totalPropertiesChanged++;\n\n if (Array.isArray(prev) || Array.isArray(next)) {\n const prevArr = Array.isArray(prev) ? prev : [];\n const nextArr = Array.isArray(next) ? next : [];\n\n if (prevArr.length !== nextArr.length || prev !== next) {\n analysis.arrayChanges.push({\n path,\n previousLength: prevArr.length,\n newLength: nextArr.length,\n itemsAdded: Math.max(0, nextArr.length - prevArr.length),\n itemsRemoved: Math.max(0, prevArr.length - nextArr.length),\n });\n }\n return;\n }\n\n if (typeof next === 'object' && next !== null) {\n const size = estimateSize(next);\n if (size > 5000) {\n analysis.largeObjectChanges.push({\n path,\n size,\n changeType: prev === undefined || prev === null ? 'added' : 'modified',\n });\n }\n\n if (depth < 10) {\n const prevObj = (prev && typeof prev === 'object' ? prev : {}) as Record<string, unknown>;\n const nextObj = next as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analyzeDeep(prevObj[key], nextObj[key], `${path}.${key}`, depth + 1, analysis);\n }\n }\n }\n }\n}\n\nfunction estimateSize(obj: unknown): number {\n try {\n return JSON.stringify(obj).length;\n } catch {\n return 0;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction generateRecommendations(\n analysis: StateChangeAnalysis,\n factors: readonly RenderImpactFactor[]\n): string[] {\n const recommendations: string[] = [];\n\n const largeArrayChanges = analysis.arrayChanges.filter(a => a.newLength > 100);\n if (largeArrayChanges.length > 0) {\n recommendations.push(\n 'Consider using trackBy in *ngFor for large arrays to reduce DOM updates'\n );\n recommendations.push(\n 'Use virtual scrolling (cdk-virtual-scroll-viewport) for lists with 100+ items'\n );\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n recommendations.push(\n 'Break down large state objects into smaller, normalized entities'\n );\n recommendations.push(\n 'Use OnPush change detection strategy in components displaying this data'\n );\n }\n\n if (analysis.maxChangeDepth > 4) {\n recommendations.push(\n 'Normalize deeply nested state using @ngrx/entity for better performance'\n );\n }\n\n if (analysis.rootPropertiesChanged > 2) {\n recommendations.push(\n 'Consider batching related state updates into a single action'\n );\n }\n\n const totalImpact = factors.reduce((sum, f) => sum + f.impact, 0);\n if (totalImpact > 50) {\n recommendations.push(\n 'Use memoized selectors to prevent unnecessary recomputations'\n );\n recommendations.push(\n 'Consider using component-level state for frequently changing UI state'\n );\n }\n\n return recommendations;\n}\n","import { Injectable } from '@angular/core';\n\nexport interface SelectorMetrics {\n readonly name: string;\n invocationCount: number;\n recomputationCount: number;\n totalComputationTime: number;\n avgComputationTime: number;\n maxComputationTime: number;\n lastComputationTime: number;\n cacheHitRate: number;\n lastInvoked: number;\n triggeringActions: string[];\n}\n\nexport interface SelectorInvocation {\n readonly selectorName: string;\n readonly timestamp: number;\n readonly computationTime: number;\n readonly wasRecomputed: boolean;\n readonly inputChanged: boolean;\n readonly triggeringAction?: string;\n}\n\nexport interface EndToEndTiming {\n readonly actionType: string;\n readonly actionDispatchTime: number;\n readonly reducerCompleteTime: number;\n readonly selectorsCompleteTime: number;\n readonly totalTime: number;\n readonly reducerTime: number;\n readonly selectorTime: number;\n readonly affectedSelectors: readonly string[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SelectorTrackerService {\n private readonly selectorMetrics = new Map<string, SelectorMetrics>();\n private recentInvocations: SelectorInvocation[] = [];\n private pendingAction: { type: string; dispatchTime: number; reducerCompleteTime?: number; reducerTime?: number } | null = null;\n private endToEndTimings: EndToEndTiming[] = [];\n\n markActionDispatch(actionType: string): void {\n this.pendingAction = {\n type: actionType,\n dispatchTime: performance.now(),\n };\n }\n\n markReducerComplete(reducerTime: number): void {\n if (this.pendingAction) {\n this.pendingAction.reducerCompleteTime = performance.now();\n this.pendingAction.reducerTime = reducerTime;\n }\n }\n\n recordSelectorInvocation(\n selectorName: string,\n computationTime: number,\n wasRecomputed: boolean,\n inputChanged: boolean\n ): void {\n const invocation: SelectorInvocation = {\n selectorName,\n timestamp: Date.now(),\n computationTime,\n wasRecomputed,\n inputChanged,\n triggeringAction: this.pendingAction?.type,\n };\n\n this.recentInvocations.push(invocation);\n\n const existing = this.selectorMetrics.get(selectorName);\n if (existing) {\n existing.invocationCount++;\n if (wasRecomputed) {\n existing.recomputationCount++;\n existing.totalComputationTime += computationTime;\n existing.avgComputationTime = existing.totalComputationTime / existing.recomputationCount;\n existing.maxComputationTime = Math.max(existing.maxComputationTime, computationTime);\n existing.lastComputationTime = computationTime;\n }\n existing.cacheHitRate = ((existing.invocationCount - existing.recomputationCount) / existing.invocationCount) * 100;\n existing.lastInvoked = Date.now();\n if (this.pendingAction?.type && !existing.triggeringActions.includes(this.pendingAction.type)) {\n existing.triggeringActions.push(this.pendingAction.type);\n if (existing.triggeringActions.length > 10) {\n existing.triggeringActions.shift();\n }\n }\n } else {\n this.selectorMetrics.set(selectorName, {\n name: selectorName,\n invocationCount: 1,\n recomputationCount: wasRecomputed ? 1 : 0,\n totalComputationTime: wasRecomputed ? computationTime : 0,\n avgComputationTime: wasRecomputed ? computationTime : 0,\n maxComputationTime: wasRecomputed ? computationTime : 0,\n lastComputationTime: wasRecomputed ? computationTime : 0,\n cacheHitRate: wasRecomputed ? 0 : 100,\n lastInvoked: Date.now(),\n triggeringActions: this.pendingAction?.type ? [this.pendingAction.type] : [],\n });\n }\n\n if (this.recentInvocations.length > 500) {\n this.recentInvocations = this.recentInvocations.slice(-250);\n }\n }\n\n markSelectorsComplete(): EndToEndTiming | null {\n if (!this.pendingAction) return null;\n\n const now = performance.now();\n\n const affectedSelectors = this.recentInvocations\n .filter(inv => inv.triggeringAction === this.pendingAction?.type)\n .map(inv => inv.selectorName)\n .filter((name, index, arr) => arr.indexOf(name) === index);\n\n const timing: EndToEndTiming = {\n actionType: this.pendingAction.type,\n actionDispatchTime: this.pendingAction.dispatchTime,\n reducerCompleteTime: this.pendingAction.reducerCompleteTime ?? now,\n selectorsCompleteTime: now,\n totalTime: now - this.pendingAction.dispatchTime,\n reducerTime: this.pendingAction.reducerTime ?? 0,\n selectorTime: now - (this.pendingAction.reducerCompleteTime ?? this.pendingAction.dispatchTime),\n affectedSelectors,\n };\n\n this.endToEndTimings.push(timing);\n if (this.endToEndTimings.length > 100) {\n this.endToEndTimings = this.endToEndTimings.slice(-50);\n }\n\n this.pendingAction = null;\n return timing;\n }\n\n getAllMetrics(): ReadonlyMap<string, SelectorMetrics> {\n return new Map(this.selectorMetrics);\n }\n\n getMetrics(selectorName: string): SelectorMetrics | undefined {\n return this.selectorMetrics.get(selectorName);\n }\n\n getSlowestSelectors(limit = 10): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .sort((a, b) => b.totalComputationTime - a.totalComputationTime)\n .slice(0, limit);\n }\n\n getInefficientSelectors(cacheHitThreshold = 50): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .filter(m => m.cacheHitRate < cacheHitThreshold && m.invocationCount > 5)\n .sort((a, b) => a.cacheHitRate - b.cacheHitRate);\n }\n\n getEndToEndTimings(): readonly EndToEndTiming[] {\n return [...this.endToEndTimings];\n }\n\n getAverageEndToEndTime(): number {\n if (this.endToEndTimings.length === 0) return 0;\n const total = this.endToEndTimings.reduce((sum, t) => sum + t.totalTime, 0);\n return total / this.endToEndTimings.length;\n }\n\n clear(): void {\n this.selectorMetrics.clear();\n this.recentInvocations = [];\n this.endToEndTimings = [];\n this.pendingAction = null;\n }\n}\n","import { MemoizedSelector, createSelector, Selector } from '@ngrx/store';\nimport { SelectorTrackerService } from './selector-tracker.service';\n\nlet globalSelectorTracker: SelectorTrackerService | null = null;\n\nexport function setSelectorTracker(tracker: SelectorTrackerService): void {\n globalSelectorTracker = tracker;\n}\n\nexport function trackSelector<State, Result>(\n name: string,\n selector: MemoizedSelector<State, Result>\n): MemoizedSelector<State, Result> {\n let lastResult: Result | undefined;\n let lastInput: State | undefined;\n\n const trackedSelector = ((state: State) => {\n const startTime = performance.now();\n const result = selector(state);\n const endTime = performance.now();\n\n const computationTime = endTime - startTime;\n const wasRecomputed = result !== lastResult;\n const inputChanged = state !== lastInput;\n\n lastResult = result;\n lastInput = state;\n\n if (globalSelectorTracker) {\n globalSelectorTracker.recordSelectorInvocation(\n name,\n computationTime,\n wasRecomputed,\n inputChanged\n );\n }\n\n return result;\n }) as MemoizedSelector<State, Result>;\n\n (trackedSelector as unknown as { release: typeof selector.release }).release = selector.release;\n (trackedSelector as unknown as { projector: typeof selector.projector }).projector = selector.projector;\n (trackedSelector as unknown as { setResult: typeof selector.setResult }).setResult = selector.setResult;\n (trackedSelector as unknown as { clearResult: typeof selector.clearResult }).clearResult = selector.clearResult;\n\n return trackedSelector;\n}\n\nexport function createTrackedSelector<State, S1, Result>(\n name: string,\n s1: Selector<State, S1>,\n projector: (s1: S1) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n projector: (s1: S1, s2: S2) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n projector: (s1: S1, s2: S2, s3: S3) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, S4, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n s4: Selector<State, S4>,\n projector: (s1: S1, s2: S2, s3: S3, s4: S4) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector(\n name: string,\n ...args: unknown[]\n): MemoizedSelector<unknown, unknown> {\n const selector = (createSelector as (...args: unknown[]) => MemoizedSelector<unknown, unknown>)(...args);\n return trackSelector(name, selector);\n}\n\nexport function TrackedSelector(name: string) {\n return function (target: Record<string, unknown>, propertyKey: string): void {\n const originalSelector = target[propertyKey] as MemoizedSelector<unknown, unknown>;\n if (originalSelector) {\n target[propertyKey] = trackSelector(name, originalSelector);\n }\n };\n}\n","import { ActionReducer, Action } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { PerformanceTrackerService } from '../performance/performance-tracker.service';\nimport { WebSocketService } from '../core/websocket.service';\nimport { DEFAULT_WS_URL } from '../core/core.models';\n\nexport interface RenderPerformanceData {\n readonly renderTime: number;\n}\n\nexport interface StateChangeMessage {\n type: 'STATE_CHANGE';\n action: Action;\n prevState: unknown;\n nextState: unknown;\n timestamp: string;\n renderPerformance?: RenderPerformanceData;\n}\n\nexport interface DevToolMetaReducerConfig {\n readonly wsUrl?: string;\n readonly enablePerformanceTracking?: boolean;\n}\n\nexport function createDevToolMetaReducer(\n wsUrlOrConfig: string | DevToolMetaReducerConfig = DEFAULT_WS_URL\n) {\n const config: DevToolMetaReducerConfig = typeof wsUrlOrConfig === 'string'\n ? { wsUrl: wsUrlOrConfig }\n : wsUrlOrConfig;\n\n const wsUrl = config.wsUrl ?? DEFAULT_WS_URL;\n const enablePerf = config.enablePerformanceTracking ?? true;\n\n return function devToolMetaReducer<State>(\n reducer: ActionReducer<State>\n ): ActionReducer<State> {\n const performanceTracker = inject(PerformanceTrackerService);\n const webSocketService = inject(WebSocketService);\n\n // Initialize WebSocket connection (no-op if already initialized)\n webSocketService.initialize(wsUrl);\n\n return function (state, action) {\n const prevState = state;\n const timestamp = new Date().toISOString();\n\n let nextState: State;\n\n if (enablePerf) {\n nextState = performanceTracker.measureRenderTime(\n action.type,\n () => reducer(state, action),\n (renderTime) => {\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n renderPerformance: { renderTime }\n };\n\n webSocketService.send(message);\n }\n );\n } else {\n nextState = reducer(state, action);\n\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n };\n\n webSocketService.send(message);\n }\n\n return nextState;\n };\n };\n}\n\nexport function loggerMetaReducer<State>(\n reducer: ActionReducer<State>\n): ActionReducer<State> {\n return createDevToolMetaReducer(DEFAULT_WS_URL)(reducer);\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { EffectSources } from '@ngrx/effects';\nimport { ActionsInterceptorService } from '../core/actions-interceptor.service';\nimport { DevToolsEffectSources } from '../core/devtools-effect-sources';\nimport { DEFAULT_WS_URL } from '../core/core.models';\n\nexport interface DevToolConfig {\n readonly wsUrl?: string;\n readonly trackEffects?: boolean;\n}\n\nexport function provideNgrxDevTool(config: DevToolConfig = {}): Provider[] {\n const providers: Provider[] = [\n {\n provide: APP_INITIALIZER,\n useFactory: (interceptor: ActionsInterceptorService) => () => {\n interceptor.initialize(config.wsUrl ?? DEFAULT_WS_URL);\n },\n deps: [ActionsInterceptorService],\n multi: true,\n },\n ];\n\n if (config.trackEffects !== false) {\n providers.push({\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n });\n }\n\n return providers;\n}\n\nexport function provideEffectTracking(): Provider {\n return {\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n };\n}\n","/*\n * Public API Surface of ngrx-devtool\n */\n\nexport * from './lib/core';\nexport * from './lib/performance';\nexport * from './lib/selectors';\nexport * from './lib/store';\nexport * from './types/state.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["REPLAY_BUFFER_SIZE","takeUntil","tap"],"mappings":"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"}
1
+ {"version":3,"file":"amadeus-it-group-ngrx-devtool.mjs","sources":["../../../projects/ngrx-devtool/src/lib/core/core.models.ts","../../../projects/ngrx-devtool/src/lib/core/effect-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/core/websocket.service.ts","../../../projects/ngrx-devtool/src/lib/core/actions-interceptor.service.ts","../../../projects/ngrx-devtool/src/lib/core/devtools-effect-sources.ts","../../../projects/ngrx-devtool/src/lib/core/index.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-tracker.service.ts","../../../projects/ngrx-devtool/src/types/state.model.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-analyzer.service.ts","../../../projects/ngrx-devtool/src/lib/performance/render-impact-estimator.ts","../../../projects/ngrx-devtool/src/lib/selectors/selector-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/selectors/track-selector.ts","../../../projects/ngrx-devtool/src/lib/store/meta-reducer.ts","../../../projects/ngrx-devtool/src/lib/store/provide-devtool.ts","../../../projects/ngrx-devtool/src/public-api.ts","../../../projects/ngrx-devtool/src/amadeus-it-group-ngrx-devtool.ts"],"sourcesContent":["import { Action } from '@ngrx/store';\n\nexport const DEFAULT_WS_URL = 'ws://localhost:4000';\n\nexport type EffectLifecycle = 'triggered' | 'emitted' | 'executed' | 'error';\n\nexport interface EffectEvent {\n readonly effectName: string;\n readonly sourceName: string;\n readonly propertyName: string;\n readonly lifecycle: EffectLifecycle;\n readonly timestamp: number;\n readonly triggerAction?: Action;\n readonly action?: Action;\n readonly error?: unknown;\n readonly duration?: number;\n readonly executionId?: string;\n readonly dispatch?: boolean;\n}\n\nexport interface EffectMetadataInfo {\n readonly propertyName: string;\n readonly dispatch: boolean;\n readonly functional: boolean;\n readonly useEffectsErrorHandler: boolean;\n}\n\n\n\nexport type ActionSource = 'user' | 'effect';\n\nexport type EffectStatus = 'completed' | 'error';\n\n// Action tracked in the timeline\nexport interface TrackedAction {\n readonly action: string;\n readonly payload: unknown;\n readonly timestamp: number;\n readonly source: ActionSource;\n readonly correlationId?: string;\n readonly effectName?: string;\n}\n\n// Effect execution\nexport interface TrackedEffect {\n readonly effectName: string;\n readonly sourceName: string | null;\n readonly propertyName: string;\n readonly triggerAction?: string;\n readonly resultAction?: string;\n readonly startTime: number;\n readonly endTime?: number;\n readonly duration?: number;\n readonly status: EffectStatus;\n readonly error?: unknown;\n}\n\n\n\nexport type DevToolMessageType = 'ACTION_TRACKED' | 'EFFECT_EVENT' | 'TIMELINE_CLEARED';\n\n\nexport interface DevToolMessage {\n readonly type: DevToolMessageType;\n readonly action?: string;\n readonly payload?: unknown;\n readonly isEffectResult?: boolean;\n readonly effectName?: string;\n readonly correlationId?: string;\n readonly effectEvent?: DevToolEffectEventPayload;\n readonly timestamp: string;\n}\n\nexport interface DevToolEffectEventPayload {\n readonly name: string;\n readonly lifecycle: string;\n readonly duration?: number;\n readonly executionId?: string;\n readonly dispatch?: boolean;\n readonly errorMessage?: string;\n readonly errorStack?: string;\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources } from '@ngrx/effects';\nimport { ReplaySubject, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EffectEvent, TrackedAction, TrackedEffect } from './core.models';\nimport { DevToolsEffectSources } from './devtools-effect-sources';\n\nconst REPLAY_BUFFER_SIZE = 100;\nconst TIMELINE_MAX_SIZE = 1000;\nconst TIMELINE_TRIM_SIZE = 500;\nconst EFFECT_TIMELINE_MAX_SIZE = 500;\nconst CORRELATION_TIMEOUT_MS = 30000;\n\ninterface PendingCorrelation {\n readonly correlationId: string;\n readonly actionType: string;\n readonly timestamp: number;\n readonly timeoutId: ReturnType<typeof setTimeout>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EffectTrackerService implements OnDestroy {\n private readonly effectSources = inject(EffectSources, { optional: true });\n private readonly destroy$ = new Subject<void>();\n\n private actionTimeline: TrackedAction[] = [];\n private effectTimeline: TrackedEffect[] = [];\n private readonly effectActionPatterns = new Set<string>();\n private pendingCorrelations: PendingCorrelation[] = [];\n private correlationCounter = 0;\n private lastTriggerAction: Action | null = null;\n\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n constructor() {\n this.subscribeToEffectEvents();\n }\n\n private subscribeToEffectEvents(): void {\n const devToolsSources = this.effectSources as DevToolsEffectSources | null;\n\n if (devToolsSources?.effectEvents$) {\n\n devToolsSources.effectEvents$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((event: EffectEvent) => {\n this.handleEffectEvent(event);\n this.effectEvents$.next(event);\n });\n }\n }\n\n private handleEffectEvent(event: EffectEvent): void {\n switch (event.lifecycle) {\n case 'emitted':\n if (event.action) {\n const trackedEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n resultAction: event.action.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'completed',\n };\n this.effectTimeline.push(trackedEffect);\n this.effectActionPatterns.add(event.action.type);\n }\n break;\n\n case 'error': {\n const erroredEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'error',\n error: event.error,\n };\n this.effectTimeline.push(erroredEffect);\n break;\n }\n }\n\n if (this.effectTimeline.length > EFFECT_TIMELINE_MAX_SIZE) {\n this.effectTimeline = this.effectTimeline.slice(-EFFECT_TIMELINE_MAX_SIZE / 2);\n }\n }\n\n isEffectAction(actionType: string): boolean {\n return this.effectActionPatterns.has(actionType);\n }\n\n trackAction(action: Action): TrackedAction {\n const isEffect = this.isEffectAction(action.type);\n\n if (!isEffect) {\n this.lastTriggerAction = action;\n }\n\n // Resolve trigger action type to match the correct correlation.\n const triggerActionType = isEffect\n ? this.findTriggerActionType(action.type)\n : undefined;\n\n const correlationId = isEffect\n ? this.consumeCorrelation(triggerActionType)\n : this.createCorrelation(action);\n\n const effectName = this.findEffectNameForAction(action.type);\n\n const tracked: TrackedAction = {\n action: action.type,\n payload: action,\n timestamp: Date.now(),\n source: isEffect ? 'effect' : 'user',\n correlationId,\n effectName,\n };\n\n this.actionTimeline.push(tracked);\n\n if (this.actionTimeline.length > TIMELINE_MAX_SIZE) {\n this.actionTimeline = this.actionTimeline.slice(-TIMELINE_TRIM_SIZE);\n }\n\n return tracked;\n }\n\n getTimeline(): readonly TrackedAction[] {\n return [...this.actionTimeline];\n }\n\n clearTimeline(): void {\n this.actionTimeline = [];\n this.clearPendingCorrelations();\n }\n\n private createCorrelation(action: Action): string {\n const correlationId = `corr_${++this.correlationCounter}_${Date.now()}`;\n\n const timeoutId = setTimeout(() => {\n this.pendingCorrelations = this.pendingCorrelations.filter(\n c => c.correlationId !== correlationId\n );\n }, CORRELATION_TIMEOUT_MS);\n\n this.pendingCorrelations.push({\n correlationId,\n actionType: action.type,\n timestamp: Date.now(),\n timeoutId,\n });\n\n return correlationId;\n }\n\n // Find and consume the best-matching pending correlation (by trigger type, then FIFO fallback).\n private consumeCorrelation(triggerActionType?: string): string | undefined {\n let idx = -1;\n\n // Prefer matching by trigger action type (oldest match first)\n if (triggerActionType) {\n idx = this.pendingCorrelations.findIndex(c => c.actionType === triggerActionType);\n }\n\n // Fallback: oldest pending correlation (FIFO)\n if (idx === -1 && this.pendingCorrelations.length > 0) {\n idx = 0;\n }\n\n if (idx === -1) {\n return undefined;\n }\n\n const [entry] = this.pendingCorrelations.splice(idx, 1);\n clearTimeout(entry.timeoutId);\n return entry.correlationId;\n }\n\n // Resolve which user action type triggered a given effect-result action type.\n private findTriggerActionType(effectActionType: string): string | undefined {\n for (let i = this.effectTimeline.length - 1; i >= Math.max(0, this.effectTimeline.length - 10); i--) {\n const effect = this.effectTimeline[i];\n if (effect.resultAction === effectActionType && effect.triggerAction) {\n return effect.triggerAction;\n }\n }\n return undefined;\n }\n\n private findEffectNameForAction(actionType: string): string | undefined {\n for (let i = this.effectTimeline.length - 1; i >= Math.max(0, this.effectTimeline.length - 10); i--) {\n const effect = this.effectTimeline[i];\n if (effect.resultAction === actionType) {\n return effect.effectName;\n }\n }\n\n return undefined;\n }\n\n private clearPendingCorrelations(): void {\n for (const entry of this.pendingCorrelations) {\n clearTimeout(entry.timeoutId);\n }\n this.pendingCorrelations = [];\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.effectEvents$.complete();\n this.clearPendingCorrelations();\n }\n}\n","import { inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DEFAULT_WS_URL } from './core.models';\n\nexport interface WebSocketMessage {\n readonly type: string;\n}\n\nconst MAX_BUFFER_SIZE = 200;\n\n@Injectable({ providedIn: 'root' })\nexport class WebSocketService implements OnDestroy {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private socket: WebSocket | null = null;\n private messageBuffer: string[] = [];\n private wsUrl: string | null = null;\n private initialized = false;\n\n private readonly connectionState$ = new BehaviorSubject<boolean>(false);\n private readonly incomingMessages$ = new BehaviorSubject<WebSocketMessage | null>(null);\n\n get isConnected(): boolean {\n return this.connectionState$.getValue();\n }\n\n get connected$(): Observable<boolean> {\n return this.connectionState$.asObservable();\n }\n\n get messages$(): Observable<WebSocketMessage | null> {\n return this.incomingMessages$.asObservable();\n }\n\n initialize(wsUrl = DEFAULT_WS_URL): void {\n if (this.initialized) {\n // If already initialized with same URL, skip\n if (this.wsUrl === wsUrl) {\n return;\n }\n // If different URL, close existing and reinitialize\n this.close();\n }\n\n this.initialized = true;\n this.wsUrl = wsUrl;\n this.setupWebSocket(wsUrl);\n }\n\n send<T extends WebSocketMessage>(message: T): void {\n this.bufferOrSend(JSON.stringify(message));\n }\n\n sendRaw(payload: string): void {\n this.bufferOrSend(payload);\n }\n\n private bufferOrSend(payload: string): void {\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(payload);\n } else if (this.isBrowser && this.messageBuffer.length < MAX_BUFFER_SIZE) {\n this.messageBuffer.push(payload);\n }\n }\n\n ngOnDestroy(): void {\n this.close();\n this.connectionState$.complete();\n this.incomingMessages$.complete();\n }\n\n private close(): void {\n this.socket?.close();\n this.socket = null;\n this.messageBuffer = [];\n this.connectionState$.next(false);\n this.initialized = false;\n this.wsUrl = null;\n }\n\n private setupWebSocket(wsUrl: string): void {\n if (!this.isBrowser) {\n return;\n }\n\n this.socket = new WebSocket(wsUrl);\n\n this.socket.onopen = () => {\n this.connectionState$.next(true);\n this.flushBuffer();\n };\n\n this.socket.onclose = () => {\n this.connectionState$.next(false);\n };\n\n this.socket.onerror = (error) => {\n console.warn('[NgRx DevTool] WebSocket error:', error);\n };\n\n this.socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as WebSocketMessage;\n this.incomingMessages$.next(message);\n } catch {\n // Ignore non-JSON messages\n }\n };\n }\n\n private flushBuffer(): void {\n const buffered = this.messageBuffer;\n this.messageBuffer = [];\n\n for (const message of buffered) {\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(message);\n }\n }\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Actions } from '@ngrx/effects';\nimport { Action } from '@ngrx/store';\nimport { filter, Subject, takeUntil, tap } from 'rxjs';\n\nimport { DEFAULT_WS_URL, DevToolMessage, EffectEvent, TrackedAction } from './core.models';\nimport { EffectTrackerService } from './effect-tracker.service';\nimport { WebSocketService, WebSocketMessage } from './websocket.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ActionsInterceptorService implements OnDestroy {\n private readonly actions$ = inject(Actions);\n private readonly effectTracker = inject(EffectTrackerService);\n private readonly webSocketService = inject(WebSocketService);\n\n private readonly destroy$ = new Subject<void>();\n private initialized = false;\n\n initialize(wsUrl = DEFAULT_WS_URL): void {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n this.webSocketService.initialize(wsUrl);\n this.setupMessageListener();\n this.setupActionInterception();\n this.setupEffectEventForwarding();\n }\n\n getTimeline(): readonly TrackedAction[] {\n return this.effectTracker.getTimeline();\n }\n\n clearTimeline(): void {\n this.effectTracker.clearTimeline();\n this.sendMessage({\n type: 'TIMELINE_CLEARED',\n timestamp: new Date().toISOString(),\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupMessageListener(): void {\n this.webSocketService.messages$.pipe(\n takeUntil(this.destroy$),\n filter((message): message is WebSocketMessage => message !== null),\n tap((message) => {\n if (message['type'] === 'CLEAR_REQUEST') {\n this.effectTracker.clearTimeline();\n }\n })\n ).subscribe();\n }\n\n private setupActionInterception(): void {\n this.actions$.pipe(\n takeUntil(this.destroy$),\n tap((action: Action) => {\n const tracked = this.effectTracker.trackAction(action);\n\n const message: DevToolMessage = {\n type: 'ACTION_TRACKED',\n action: action.type,\n payload: this.sanitizePayload(action),\n isEffectResult: tracked.source === 'effect',\n effectName: tracked.effectName,\n correlationId: tracked.correlationId,\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe();\n }\n\n private setupEffectEventForwarding(): void {\n this.effectTracker.effectEvents$.pipe(\n takeUntil(this.destroy$),\n tap((event: EffectEvent) => {\n const errorMessage = event.error instanceof Error\n ? event.error.message\n : event.error != null ? String(event.error) : undefined;\n const errorStack = event.error instanceof Error ? event.error.stack : undefined;\n\n const message: DevToolMessage = {\n type: 'EFFECT_EVENT',\n action: event.action?.type,\n effectName: event.effectName,\n effectEvent: {\n name: event.effectName,\n lifecycle: event.lifecycle,\n duration: event.duration,\n executionId: event.executionId,\n dispatch: event.dispatch,\n errorMessage,\n errorStack,\n },\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe({\n error: (err) => console.error('[NgRx DevTool] Effect event forwarding error:', err)\n });\n }\n\n private sendMessage(message: DevToolMessage): void {\n this.webSocketService.send(message);\n }\n\n private sanitizePayload(action: Action): unknown {\n try {\n JSON.stringify(action);\n return action;\n } catch {\n return { type: action.type, _note: 'Non-serializable payload' };\n }\n }\n}\n","import { ErrorHandler, inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources, EFFECTS_ERROR_HANDLER } from '@ngrx/effects';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { EffectEvent, EffectMetadataInfo } from './core.models';\n\n\n/** NgRx internal metadata key for createEffect() */\nconst CREATE_EFFECT_METADATA_KEY = '__@ngrx/effects_create__';\n\nconst REPLAY_BUFFER_SIZE = 100;\n\n\ninterface EffectConfig {\n readonly dispatch?: boolean;\n readonly functional?: boolean;\n readonly useEffectsErrorHandler?: boolean;\n}\n\ninterface EffectSourceInstance {\n ngrxOnIdentifyEffects?(): string;\n constructor: { name?: string };\n [key: string]: unknown;\n}\n\ntype EffectObservable = Observable<Action> & {\n [CREATE_EFFECT_METADATA_KEY]?: EffectConfig;\n};\n\n@Injectable()\nexport class DevToolsEffectSources extends EffectSources implements OnDestroy {\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n private readonly registeredEffects = new Map<string, readonly EffectMetadataInfo[]>();\n private executionCounter = 0;\n\n constructor() {\n super(inject(ErrorHandler), inject(EFFECTS_ERROR_HANDLER));\n }\n\n override addEffects(effectSourceInstance: EffectSourceInstance): void {\n const sourceName = this.resolveSourceName(effectSourceInstance);\n\n if (sourceName) {\n const metadata = this.extractEffectMetadata(effectSourceInstance);\n\n if (metadata.length > 0) {\n this.registeredEffects.set(sourceName, metadata);\n this.instrumentEffects(effectSourceInstance, sourceName, metadata);\n }\n }\n\n super.addEffects(effectSourceInstance);\n }\n\n getRegisteredEffects(): ReadonlyMap<string, readonly EffectMetadataInfo[]> {\n return this.registeredEffects;\n }\n\n ngOnDestroy(): void {\n this.effectEvents$.complete();\n }\n\n private instrumentEffects(\n instance: EffectSourceInstance,\n sourceName: string,\n metadata: readonly EffectMetadataInfo[]\n ): void {\n for (const { propertyName, dispatch } of metadata) {\n const original = instance[propertyName];\n if (!original) continue;\n\n const effectName = `${sourceName}.${propertyName}`;\n\n if (typeof original === 'function') {\n const factory = original as () => EffectObservable;\n const wrapped = () => this.wrapEffectObservable(factory(), effectName, dispatch);\n this.copyEffectMetadata(factory, wrapped);\n instance[propertyName] = wrapped;\n } else if (this.isObservable(original)) {\n const wrapped = this.wrapEffectObservable(original, effectName, dispatch);\n this.copyEffectMetadata(original as EffectObservable, wrapped);\n instance[propertyName] = wrapped;\n }\n }\n }\n\n private wrapEffectObservable(\n source$: Observable<Action>,\n effectName: string,\n dispatch: boolean\n ): Observable<Action> {\n const [sourceName, propertyName] = this.parseEffectName(effectName);\n\n return new Observable(subscriber => {\n let lastEmitTime = Date.now();\n\n const subscription = source$.pipe(\n tap({\n next: (value: Action) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: dispatch ? 'emitted' : 'executed',\n action: dispatch ? value : undefined,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n dispatch,\n });\n lastEmitTime = now;\n },\n error: (err: unknown) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: 'error',\n error: err,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n });\n },\n })\n ).subscribe(subscriber);\n\n return () => subscription.unsubscribe();\n });\n }\n\n private copyEffectMetadata(\n original: EffectObservable | (() => EffectObservable),\n wrapped: EffectObservable | (() => EffectObservable)\n ): void {\n const originalRecord = original as unknown as Record<string, unknown>;\n const metadata = originalRecord[CREATE_EFFECT_METADATA_KEY];\n if (metadata) {\n Object.defineProperty(wrapped, CREATE_EFFECT_METADATA_KEY, {\n value: metadata,\n configurable: true,\n });\n }\n }\n\n private extractEffectMetadata(instance: EffectSourceInstance): EffectMetadataInfo[] {\n const metadata: EffectMetadataInfo[] = [];\n\n for (const propertyName of Object.getOwnPropertyNames(instance)) {\n try {\n const property = instance[propertyName] as EffectObservable | undefined;\n const config = property?.[CREATE_EFFECT_METADATA_KEY];\n\n if (config) {\n metadata.push({\n propertyName,\n dispatch: config.dispatch !== false,\n functional: config.functional === true,\n useEffectsErrorHandler: config.useEffectsErrorHandler !== false,\n });\n }\n } catch {\n // Ignore reflection errors for non-effect properties\n }\n }\n\n return metadata;\n }\n\n private resolveSourceName(instance: EffectSourceInstance): string | null {\n if (!instance) return null;\n\n if (typeof instance.ngrxOnIdentifyEffects === 'function') {\n const id = instance.ngrxOnIdentifyEffects();\n if (id) return id;\n }\n\n const constructorName = instance.constructor?.name;\n if (this.isValidClassName(constructorName)) {\n return constructorName;\n }\n\n const proto = Object.getPrototypeOf(instance) as EffectSourceInstance | null;\n const protoName = proto?.constructor?.name;\n if (this.isValidClassName(protoName)) {\n return protoName;\n }\n\n const effectProps = Object.getOwnPropertyNames(instance)\n .filter(p => p.endsWith('$') || p.startsWith('load') || p.startsWith('fetch'));\n\n if (effectProps.length > 0) {\n return `Effects(${effectProps.slice(0, 2).join(', ')}...)`;\n }\n\n return constructorName ?? 'UnknownEffect';\n }\n\n private isValidClassName(name: string | undefined): name is string {\n return Boolean(name && name.length > 1 && name !== 'Object' && name !== 'Function');\n }\n\n private isObservable(value: unknown): value is Observable<Action> {\n return Boolean(value && typeof (value as Observable<Action>).subscribe === 'function');\n }\n\n private parseEffectName(effectName: string): [string, string] {\n const [sourceName, propertyName = 'unknown'] = effectName.split('.');\n return [sourceName, propertyName];\n }\n\n private generateExecutionId(effectName: string): string {\n return `${effectName}_${++this.executionCounter}`;\n }\n\n private emitEvent(event: EffectEvent): void {\n this.effectEvents$.next(event);\n }\n}\n","// Models\nexport * from './core.models';\n\n// Services\nexport * from './actions-interceptor.service';\nexport * from './effect-tracker.service';\nexport * from './devtools-effect-sources';\nexport * from './websocket.service';\n","import { Injectable, inject, PLATFORM_ID, Injector, afterNextRender } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { PerformanceWarning, PerformanceThresholds, ActionTypeStats, PerformanceWarningType } from '../../types/state.model';\n\nexport interface RenderPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly renderTime: number;\n readonly reducerTime?: number;\n readonly stateSize?: number;\n}\n\nexport interface RenderPerformanceStats {\n readonly avgRenderTime: number;\n readonly maxRenderTime: number;\n readonly slowestAction: string | null;\n readonly totalActions: number;\n}\n\nexport interface AggregatedPerformanceStats {\n readonly totalActions: number;\n readonly avgReducerTime: number;\n readonly maxReducerTime: number;\n readonly slowestAction: string | null;\n readonly currentStateSize: number;\n readonly actionsPerSecond: number;\n readonly performanceScore: number;\n readonly actionTypeStats: Map<string, ActionTypeStats>;\n}\n\nexport interface WarningsSummary {\n readonly type: PerformanceWarningType;\n readonly count: number;\n readonly severity: 'low' | 'medium' | 'high';\n}\n\nconst ENTRIES_MAX_SIZE = 1000;\nconst ENTRIES_TRIM_SIZE = 500;\n\nconst DEFAULT_THRESHOLDS: PerformanceThresholds = {\n maxReducerTime: 16,\n maxStateSize: 5 * 1024 * 1024,\n maxStateChangeSize: 1024 * 1024,\n maxActionsPerSecond: 60,\n maxPayloadSize: 100 * 1024,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceTrackerService {\n private entries: RenderPerformanceEntry[] = [];\n private warnings: PerformanceWarning[] = [];\n private readonly platformId = inject(PLATFORM_ID);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private thresholds = DEFAULT_THRESHOLDS;\n private firstActionTime: number | null = null;\n\n measureRenderTime<State>(\n actionType: string,\n reducer: () => State,\n callback: (renderTime: number, reducerTime: number, stateSize: number) => void\n ): State {\n const renderStartTime = performance.now();\n const reducerStartTime = performance.now();\n const nextState = reducer();\n const reducerTime = parseFloat((performance.now() - reducerStartTime).toFixed(2));\n const stateSize = this.getSerializedSize(nextState);\n\n if (!this.isBrowser) {\n callback(0, reducerTime, stateSize);\n return nextState;\n }\n\n afterNextRender(() => {\n const renderTime = parseFloat((performance.now() - renderStartTime).toFixed(2));\n\n const entry: RenderPerformanceEntry = {\n actionType,\n timestamp: Date.now(),\n renderTime,\n reducerTime,\n stateSize,\n };\n\n this.entries.push(entry);\n\n if (this.firstActionTime === null) {\n this.firstActionTime = entry.timestamp;\n }\n\n if (this.entries.length > ENTRIES_MAX_SIZE) {\n this.entries = this.entries.slice(-ENTRIES_TRIM_SIZE);\n }\n\n callback(renderTime, reducerTime, stateSize);\n }, { injector: this.injector });\n\n return nextState;\n }\n\n getEntries(): readonly RenderPerformanceEntry[] {\n return [...this.entries];\n }\n\n getStats(): RenderPerformanceStats {\n if (this.entries.length === 0) {\n return {\n avgRenderTime: 0,\n maxRenderTime: 0,\n slowestAction: null,\n totalActions: 0,\n };\n }\n\n const renderTimes = this.entries.map(e => e.renderTime);\n const avgRenderTime = renderTimes.reduce((a, b) => a + b, 0) / renderTimes.length;\n const maxRenderTime = Math.max(...renderTimes);\n\n const slowestEntry = this.entries.reduce((prev, curr) =>\n curr.renderTime > prev.renderTime ? curr : prev\n );\n\n return {\n avgRenderTime,\n maxRenderTime,\n slowestAction: slowestEntry.actionType,\n totalActions: this.entries.length,\n };\n }\n\n getAggregatedStats(): AggregatedPerformanceStats {\n const stats = this.getStats();\n const actionTypeStats = this.getActionTypeStats();\n const reducerTimes = this.entries.map(entry => entry.reducerTime ?? entry.renderTime);\n const avgReducerTime = reducerTimes.length\n ? reducerTimes.reduce((total, time) => total + time, 0) / reducerTimes.length\n : 0;\n const maxReducerTime = reducerTimes.length ? Math.max(...reducerTimes) : 0;\n const slowestReducer = this.entries.reduce<RenderPerformanceEntry | null>(\n (slowest, entry) => !slowest || (entry.reducerTime ?? entry.renderTime) > (slowest.reducerTime ?? slowest.renderTime)\n ? entry\n : slowest,\n null\n );\n const currentStateSize = this.entries.at(-1)?.stateSize ?? 0;\n const elapsedTime = this.firstActionTime\n ? (Date.now() - this.firstActionTime) / 1000\n : 1;\n\n return {\n totalActions: stats.totalActions,\n avgReducerTime,\n maxReducerTime,\n slowestAction: slowestReducer?.actionType ?? null,\n currentStateSize,\n actionsPerSecond: stats.totalActions / Math.max(elapsedTime, 1),\n performanceScore: this.calculatePerformanceScore(avgReducerTime, maxReducerTime),\n actionTypeStats,\n };\n }\n\n getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n setThresholds(thresholds: Partial<PerformanceThresholds>): void {\n this.thresholds = { ...this.thresholds, ...thresholds };\n }\n\n getWarningsSummary(): WarningsSummary[] {\n const summaryMap = new Map<PerformanceWarningType, WarningsSummary>();\n\n for (const warning of this.warnings) {\n const existing = summaryMap.get(warning.type);\n if (existing) {\n summaryMap.set(warning.type, {\n ...existing,\n count: existing.count + 1,\n severity: this.maxSeverity(existing.severity, warning.severity),\n });\n } else {\n summaryMap.set(warning.type, {\n type: warning.type,\n count: 1,\n severity: warning.severity,\n });\n }\n }\n\n return Array.from(summaryMap.values());\n }\n\n getSlowestRenders(limit = 10): readonly RenderPerformanceEntry[] {\n return [...this.entries]\n .sort((a, b) => b.renderTime - a.renderTime)\n .slice(0, limit);\n }\n\n clear(): void {\n this.entries = [];\n this.warnings = [];\n this.firstActionTime = null;\n }\n\n private getActionTypeStats(): Map<string, ActionTypeStats> {\n const statsMap = new Map<string, ActionTypeStats>();\n\n for (const entry of this.entries) {\n const reducerTime = entry.reducerTime ?? entry.renderTime;\n const existing = statsMap.get(entry.actionType);\n if (existing) {\n existing.count++;\n existing.totalTime += reducerTime;\n existing.avgTime = existing.totalTime / existing.count;\n existing.maxTime = Math.max(existing.maxTime, reducerTime);\n existing.lastExecuted = entry.timestamp;\n } else {\n statsMap.set(entry.actionType, {\n count: 1,\n totalTime: reducerTime,\n avgTime: reducerTime,\n maxTime: reducerTime,\n lastExecuted: entry.timestamp,\n });\n }\n }\n\n return statsMap;\n }\n\n private calculatePerformanceScore(avgReducerTime: number, maxReducerTime: number): number {\n let score = 100;\n\n if (avgReducerTime > this.thresholds.maxReducerTime) {\n score -= Math.min(30, (avgReducerTime - this.thresholds.maxReducerTime) * 2);\n }\n\n if (maxReducerTime > this.thresholds.maxReducerTime * 2) {\n score -= Math.min(20, (maxReducerTime - this.thresholds.maxReducerTime * 2) / 2);\n }\n\n return Math.max(0, Math.round(score));\n }\n\n private getSerializedSize(value: unknown): number {\n try {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? 0 : new TextEncoder().encode(serialized).byteLength;\n } catch {\n return 0;\n }\n }\n\n private maxSeverity(\n a: 'low' | 'medium' | 'high',\n b: 'low' | 'medium' | 'high'\n ): 'low' | 'medium' | 'high' {\n const order = { low: 0, medium: 1, high: 2 };\n return order[a] >= order[b] ? a : b;\n }\n}\n","export interface ActionDispatchedPayload {\n readonly actionType: string;\n readonly previousState: Record<string, unknown>;\n readonly action: Record<string, unknown>;\n readonly nextState: Record<string, unknown>;\n}\n\nexport interface PerformanceMetrics {\n readonly reducerExecutionTime: number;\n readonly stateSize: number;\n readonly stateSizeChange: number;\n readonly memoryUsage?: MemoryInfo;\n readonly actionPayloadSize: number;\n}\n\nexport interface MemoryInfo {\n readonly usedJSHeapSize: number;\n readonly totalJSHeapSize: number;\n readonly jsHeapSizeLimit: number;\n}\n\n\nexport interface PerformanceWarning {\n readonly type: PerformanceWarningType;\n readonly message: string;\n readonly severity: 'low' | 'medium' | 'high';\n readonly suggestion?: string;\n}\n\nexport enum PerformanceWarningType {\n SLOW_REDUCER = 'SLOW_REDUCER',\n LARGE_STATE = 'LARGE_STATE',\n LARGE_STATE_CHANGE = 'LARGE_STATE_CHANGE',\n FREQUENT_ACTIONS = 'FREQUENT_ACTIONS',\n LARGE_PAYLOAD = 'LARGE_PAYLOAD',\n MEMORY_PRESSURE = 'MEMORY_PRESSURE',\n HIGH_RENDER_IMPACT = 'HIGH_RENDER_IMPACT',\n}\n\nexport interface PerformanceThresholds {\n readonly maxReducerTime: number;\n readonly maxStateSize: number;\n readonly maxStateChangeSize: number;\n readonly maxActionsPerSecond: number;\n readonly maxPayloadSize: number;\n}\n\nexport interface ActionTypeStats {\n count: number;\n totalTime: number;\n avgTime: number;\n maxTime: number;\n lastExecuted: number;\n}\n\nexport interface ActionPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly metrics: PerformanceMetrics;\n readonly warnings: readonly PerformanceWarning[];\n}\n\nexport interface RenderImpactData {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactorData[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactorData {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface SelectorMetricsData {\n readonly name: string;\n readonly invocationCount: number;\n readonly recomputationCount: number;\n readonly totalComputationTime: number;\n readonly avgComputationTime: number;\n maxComputationTime: number;\n cacheHitRate: number;\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n PerformanceTrackerService,\n AggregatedPerformanceStats,\n} from './performance-tracker.service';\nimport { PerformanceWarningType, ActionTypeStats } from '../../types/state.model';\n\nexport interface PerformanceRecommendation {\n readonly category: 'reducer' | 'state' | 'actions' | 'memory' | 'general';\n readonly title: string;\n readonly description: string;\n readonly impact: 'low' | 'medium' | 'high';\n readonly codeExample?: string;\n readonly learnMoreUrl?: string;\n}\n\nexport interface PerformanceReport {\n readonly timestamp: string;\n readonly overallScore: number;\n readonly scoreGrade: 'A' | 'B' | 'C' | 'D' | 'F';\n readonly stats: AggregatedPerformanceStats;\n readonly recommendations: readonly PerformanceRecommendation[];\n readonly hotspots: readonly HotspotInfo[];\n readonly trends: PerformanceTrends;\n}\n\nexport interface HotspotInfo {\n readonly actionType: string;\n readonly issue: string;\n readonly avgTime: number;\n readonly callCount: number;\n readonly totalTime: number;\n readonly percentOfTotal: number;\n}\n\nexport interface PerformanceTrends {\n readonly reducerTimesTrend: 'improving' | 'stable' | 'degrading';\n readonly stateSizeTrend: 'stable' | 'growing' | 'shrinking';\n readonly actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceAnalyzerService {\n private previousStats: AggregatedPerformanceStats | null = null;\n private readonly performanceTracker = inject(PerformanceTrackerService);\n\n generateReport(): PerformanceReport {\n const stats = this.performanceTracker.getAggregatedStats();\n const recommendations = this.generateRecommendations(stats);\n const hotspots = this.identifyHotspots(stats);\n const trends = this.analyzeTrends(stats);\n\n const report: PerformanceReport = {\n timestamp: new Date().toISOString(),\n overallScore: stats.performanceScore,\n scoreGrade: this.getScoreGrade(stats.performanceScore),\n stats,\n recommendations,\n hotspots,\n trends,\n };\n\n this.previousStats = stats;\n\n return report;\n }\n\n getQuickSummary(): {\n score: number;\n grade: string;\n mainIssue: string | null;\n actionCount: number;\n avgReducerTime: number;\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n let mainIssue: string | null = null;\n const highSeverityWarning = warnings.find(w => w.severity === 'high');\n if (highSeverityWarning) {\n mainIssue = this.getWarningDescription(highSeverityWarning.type);\n }\n\n return {\n score: stats.performanceScore,\n grade: this.getScoreGrade(stats.performanceScore),\n mainIssue,\n actionCount: stats.totalActions,\n avgReducerTime: stats.avgReducerTime,\n };\n }\n\n analyzeActionType(actionType: string): {\n stats: ActionTypeStats | undefined;\n isProblematic: boolean;\n issues: string[];\n suggestions: string[];\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const actionStats = stats.actionTypeStats.get(actionType);\n const thresholds = this.performanceTracker.getThresholds();\n\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n if (!actionStats) {\n return { stats: undefined, isProblematic: false, issues, suggestions };\n }\n\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issues.push(`Average execution time (${actionStats.avgTime.toFixed(2)}ms) exceeds threshold`);\n suggestions.push('Consider optimizing the reducer logic for this action');\n }\n\n const totalActions = stats.totalActions;\n const percentOfTotal = (actionStats.count / totalActions) * 100;\n if (percentOfTotal > 30 && actionStats.count > 10) {\n issues.push(`This action represents ${percentOfTotal.toFixed(1)}% of all actions`);\n suggestions.push('Consider debouncing or batching this action if dispatched frequently');\n }\n\n if (actionStats.maxTime > actionStats.avgTime * 3 && actionStats.maxTime > thresholds.maxReducerTime) {\n issues.push(`Occasional spikes in execution time (max: ${actionStats.maxTime.toFixed(2)}ms)`);\n suggestions.push('Investigate what causes performance spikes - possibly large payload or complex state updates');\n }\n\n return {\n stats: actionStats,\n isProblematic: issues.length > 0,\n issues,\n suggestions,\n };\n }\n\n private generateRecommendations(stats: AggregatedPerformanceStats): PerformanceRecommendation[] {\n const recommendations: PerformanceRecommendation[] = [];\n const thresholds = this.performanceTracker.getThresholds();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n if (stats.avgReducerTime > thresholds.maxReducerTime) {\n recommendations.push({\n category: 'reducer',\n title: 'Optimize Reducer Performance',\n description: `Your reducers are taking an average of ${stats.avgReducerTime.toFixed(2)}ms to execute. For smooth 60fps animations, reducers should complete in under ${thresholds.maxReducerTime}ms.`,\n impact: stats.avgReducerTime > thresholds.maxReducerTime * 2 ? 'high' : 'medium',\n codeExample: `import { createReducer, on } from '@ngrx/store';\nimport { produce } from 'immer';\n\non(someAction, (state, { items }) => ({\n ...state,\n items\n}))`,\n learnMoreUrl: 'https://ngrx.io/guide/store/reducers#reducer-functions',\n });\n }\n\n if (stats.currentStateSize > thresholds.maxStateSize * 0.5) {\n recommendations.push({\n category: 'state',\n title: 'Consider State Normalization',\n description: `Your state size is ${this.formatBytes(stats.currentStateSize)}. Large states can slow down serialization and increase memory usage.`,\n impact: stats.currentStateSize > thresholds.maxStateSize ? 'high' : 'medium',\n codeExample: `{ users: [{ id: 1, posts: [{ id: 1, ... }] }] }\n\n{\n users: { ids: [1], entities: { 1: { id: 1 } } },\n posts: { ids: [1], entities: { 1: { id: 1, userId: 1 } } }\n}`,\n learnMoreUrl: 'https://ngrx.io/guide/entity',\n });\n }\n\n if (stats.actionsPerSecond > thresholds.maxActionsPerSecond * 0.5) {\n recommendations.push({\n category: 'actions',\n title: 'Reduce Action Dispatch Frequency',\n description: `You're dispatching ${stats.actionsPerSecond.toFixed(1)} actions per second. High frequency can cause performance issues.`,\n impact: stats.actionsPerSecond > thresholds.maxActionsPerSecond ? 'high' : 'medium',\n codeExample: `import { debounceTime } from 'rxjs/operators';\n\nsearchInput$.pipe(\n debounceTime(300)\n).subscribe(term => {\n this.store.dispatch(searchAction({ term }));\n});\n\nthis.store.dispatch(batchUpdateAction({ items: allItems }));`,\n });\n }\n\n if (stats.slowestAction && stats.maxReducerTime > thresholds.maxReducerTime * 2) {\n recommendations.push({\n category: 'reducer',\n title: `Optimize \"${stats.slowestAction}\"`,\n description: `This action has the highest execution time (${stats.maxReducerTime.toFixed(2)}ms). Focus optimization efforts here for maximum impact. Profile this specific action to identify bottlenecks.`,\n impact: 'high',\n });\n }\n\n const memoryWarnings = warnings.filter(w => w.type === PerformanceWarningType.MEMORY_PRESSURE);\n if (memoryWarnings.length > 0) {\n recommendations.push({\n category: 'memory',\n title: 'Address Memory Pressure',\n description: 'Your application is using a significant portion of available memory. This can lead to garbage collection pauses.',\n impact: 'high',\n codeExample: `ngOnDestroy() {\n this.store.dispatch(clearTemporaryData());\n}\n\nthis.store.dispatch(loadPage({ page: 1, pageSize: 50 }));`,\n });\n }\n\n if (stats.performanceScore >= 80 && recommendations.length === 0) {\n recommendations.push({\n category: 'general',\n title: 'Performance is Good! 🎉',\n description: 'Your NgRx store is performing well. Continue following best practices.',\n impact: 'low',\n });\n }\n\n return recommendations;\n }\n\n private identifyHotspots(stats: AggregatedPerformanceStats): HotspotInfo[] {\n const hotspots: HotspotInfo[] = [];\n const totalTime = Array.from(stats.actionTypeStats.values())\n .reduce((sum, s) => sum + s.totalTime, 0);\n\n stats.actionTypeStats.forEach((actionStats, actionType) => {\n const percentOfTotal = (actionStats.totalTime / totalTime) * 100;\n const thresholds = this.performanceTracker.getThresholds();\n\n let issue = '';\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issue = 'Slow reducer execution';\n } else if (percentOfTotal > 20 && actionStats.count > 5) {\n issue = 'High time consumption';\n } else if (actionStats.maxTime > actionStats.avgTime * 5) {\n issue = 'Inconsistent performance';\n }\n\n if (issue) {\n hotspots.push({\n actionType,\n issue,\n avgTime: actionStats.avgTime,\n callCount: actionStats.count,\n totalTime: actionStats.totalTime,\n percentOfTotal,\n });\n }\n });\n\n return hotspots.sort((a, b) => b.totalTime - a.totalTime).slice(0, 5);\n }\n\n private analyzeTrends(currentStats: AggregatedPerformanceStats): PerformanceTrends {\n if (!this.previousStats) {\n return {\n reducerTimesTrend: 'stable',\n stateSizeTrend: 'stable',\n actionFrequencyTrend: 'stable',\n };\n }\n\n const prev = this.previousStats;\n\n let reducerTimesTrend: 'improving' | 'stable' | 'degrading' = 'stable';\n const timeDiff = currentStats.avgReducerTime - prev.avgReducerTime;\n if (timeDiff > 2) reducerTimesTrend = 'degrading';\n else if (timeDiff < -2) reducerTimesTrend = 'improving';\n\n let stateSizeTrend: 'stable' | 'growing' | 'shrinking' = 'stable';\n const sizeDiff = currentStats.currentStateSize - prev.currentStateSize;\n const sizeChangePercent = Math.abs(sizeDiff) / (prev.currentStateSize || 1) * 100;\n if (sizeChangePercent > 10) {\n stateSizeTrend = sizeDiff > 0 ? 'growing' : 'shrinking';\n }\n\n let actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing' = 'stable';\n const freqDiff = currentStats.actionsPerSecond - prev.actionsPerSecond;\n if (freqDiff > 5) actionFrequencyTrend = 'increasing';\n else if (freqDiff < -5) actionFrequencyTrend = 'decreasing';\n\n return {\n reducerTimesTrend,\n stateSizeTrend,\n actionFrequencyTrend,\n };\n }\n\n private getScoreGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n }\n\n private getWarningDescription(type: PerformanceWarningType): string {\n const descriptions: Record<string, string> = {\n SLOW_REDUCER: 'Slow reducer execution',\n LARGE_STATE: 'Large state size',\n LARGE_STATE_CHANGE: 'Large state changes',\n FREQUENT_ACTIONS: 'High action frequency',\n LARGE_PAYLOAD: 'Large action payloads',\n MEMORY_PRESSURE: 'Memory pressure',\n };\n return descriptions[type] || type;\n }\n\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n }\n}\n","export interface RenderImpactEstimate {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactor[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactor {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface StateChangeAnalysis {\n rootPropertiesChanged: number;\n totalPropertiesChanged: number;\n arrayChanges: ArrayChangeInfo[];\n largeObjectChanges: LargeObjectChange[];\n maxChangeDepth: number;\n}\n\nexport interface ArrayChangeInfo {\n readonly path: string;\n readonly previousLength: number;\n readonly newLength: number;\n readonly itemsAdded: number;\n readonly itemsRemoved: number;\n}\n\nexport interface LargeObjectChange {\n readonly path: string;\n readonly size: number;\n readonly changeType: 'added' | 'modified' | 'replaced';\n}\n\nexport function estimateRenderImpact(\n prevState: unknown,\n nextState: unknown\n): RenderImpactEstimate {\n const analysis = analyzeStateChange(prevState, nextState);\n const factors: RenderImpactFactor[] = [];\n let totalScore = 0;\n\n if (analysis.rootPropertiesChanged > 0) {\n const impact = Math.min(analysis.rootPropertiesChanged * 15, 40);\n totalScore += impact;\n factors.push({\n name: 'Root State Changes',\n description: `${analysis.rootPropertiesChanged} top-level state slice(s) changed`,\n impact,\n details: 'Each root change can trigger re-renders in components selecting that slice',\n });\n }\n\n if (analysis.arrayChanges.length > 0) {\n const largestArrayChange = Math.max(...analysis.arrayChanges.map(a => Math.abs(a.newLength - a.previousLength)));\n const impact = Math.min(largestArrayChange * 2 + analysis.arrayChanges.length * 5, 50);\n totalScore += impact;\n factors.push({\n name: 'Array Mutations',\n description: `${analysis.arrayChanges.length} array(s) changed`,\n impact,\n details: analysis.arrayChanges.map(a =>\n `${a.path}: ${a.previousLength} → ${a.newLength} items`\n ).join(', '),\n });\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n const totalSize = analysis.largeObjectChanges.reduce((sum, o) => sum + o.size, 0);\n const impact = Math.min(totalSize / 10000 * 20, 30);\n totalScore += impact;\n factors.push({\n name: 'Large Object Changes',\n description: `${analysis.largeObjectChanges.length} large object(s) changed (${formatBytes(totalSize)})`,\n impact,\n details: 'Large objects can cause expensive diffing and template updates',\n });\n }\n\n if (analysis.maxChangeDepth > 3) {\n const impact = Math.min((analysis.maxChangeDepth - 3) * 5, 15);\n totalScore += impact;\n factors.push({\n name: 'Deep State Changes',\n description: `Changes at depth ${analysis.maxChangeDepth}`,\n impact,\n details: 'Deeply nested changes may indicate non-normalized state',\n });\n }\n\n if (analysis.totalPropertiesChanged > 10) {\n const impact = Math.min(analysis.totalPropertiesChanged / 5, 20);\n totalScore += impact;\n factors.push({\n name: 'Property Change Volume',\n description: `${analysis.totalPropertiesChanged} total properties changed`,\n impact,\n });\n }\n\n totalScore = Math.min(Math.round(totalScore), 100);\n\n let level: 'low' | 'medium' | 'high' | 'critical';\n if (totalScore < 25) level = 'low';\n else if (totalScore < 50) level = 'medium';\n else if (totalScore < 75) level = 'high';\n else level = 'critical';\n\n const estimatedComponentsAffected = Math.ceil(\n analysis.rootPropertiesChanged * 2 +\n analysis.arrayChanges.length * 3 +\n analysis.largeObjectChanges.length\n );\n\n const recommendations = generateRecommendations(analysis, factors);\n\n return {\n score: totalScore,\n level,\n estimatedComponentsAffected,\n factors,\n recommendations,\n };\n}\n\nfunction analyzeStateChange(prevState: unknown, nextState: unknown): StateChangeAnalysis {\n const analysis: StateChangeAnalysis = {\n rootPropertiesChanged: 0,\n totalPropertiesChanged: 0,\n arrayChanges: [],\n largeObjectChanges: [],\n maxChangeDepth: 0,\n };\n\n if (!prevState || !nextState || typeof prevState !== 'object' || typeof nextState !== 'object') {\n return analysis;\n }\n\n const prevObj = prevState as Record<string, unknown>;\n const nextObj = nextState as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analysis.rootPropertiesChanged++;\n analyzeDeep(prevObj[key], nextObj[key], key, 1, analysis);\n }\n }\n\n return analysis;\n}\n\nfunction analyzeDeep(\n prev: unknown,\n next: unknown,\n path: string,\n depth: number,\n analysis: StateChangeAnalysis\n): void {\n analysis.maxChangeDepth = Math.max(analysis.maxChangeDepth, depth);\n analysis.totalPropertiesChanged++;\n\n if (Array.isArray(prev) || Array.isArray(next)) {\n const prevArr = Array.isArray(prev) ? prev : [];\n const nextArr = Array.isArray(next) ? next : [];\n\n if (prevArr.length !== nextArr.length || prev !== next) {\n analysis.arrayChanges.push({\n path,\n previousLength: prevArr.length,\n newLength: nextArr.length,\n itemsAdded: Math.max(0, nextArr.length - prevArr.length),\n itemsRemoved: Math.max(0, prevArr.length - nextArr.length),\n });\n }\n return;\n }\n\n if (typeof next === 'object' && next !== null) {\n const size = estimateSize(next);\n if (size > 5000) {\n analysis.largeObjectChanges.push({\n path,\n size,\n changeType: prev === undefined || prev === null ? 'added' : 'modified',\n });\n }\n\n if (depth < 10) {\n const prevObj = (prev && typeof prev === 'object' ? prev : {}) as Record<string, unknown>;\n const nextObj = next as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analyzeDeep(prevObj[key], nextObj[key], `${path}.${key}`, depth + 1, analysis);\n }\n }\n }\n }\n}\n\nfunction estimateSize(obj: unknown): number {\n try {\n return JSON.stringify(obj).length;\n } catch {\n return 0;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction generateRecommendations(\n analysis: StateChangeAnalysis,\n factors: readonly RenderImpactFactor[]\n): string[] {\n const recommendations: string[] = [];\n\n const largeArrayChanges = analysis.arrayChanges.filter(a => a.newLength > 100);\n if (largeArrayChanges.length > 0) {\n recommendations.push(\n 'Consider using trackBy in *ngFor for large arrays to reduce DOM updates'\n );\n recommendations.push(\n 'Use virtual scrolling (cdk-virtual-scroll-viewport) for lists with 100+ items'\n );\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n recommendations.push(\n 'Break down large state objects into smaller, normalized entities'\n );\n recommendations.push(\n 'Use OnPush change detection strategy in components displaying this data'\n );\n }\n\n if (analysis.maxChangeDepth > 4) {\n recommendations.push(\n 'Normalize deeply nested state using @ngrx/entity for better performance'\n );\n }\n\n if (analysis.rootPropertiesChanged > 2) {\n recommendations.push(\n 'Consider batching related state updates into a single action'\n );\n }\n\n const totalImpact = factors.reduce((sum, f) => sum + f.impact, 0);\n if (totalImpact > 50) {\n recommendations.push(\n 'Use memoized selectors to prevent unnecessary recomputations'\n );\n recommendations.push(\n 'Consider using component-level state for frequently changing UI state'\n );\n }\n\n return recommendations;\n}\n","import { Injectable } from '@angular/core';\n\nexport interface SelectorMetrics {\n readonly name: string;\n invocationCount: number;\n recomputationCount: number;\n totalComputationTime: number;\n avgComputationTime: number;\n maxComputationTime: number;\n lastComputationTime: number;\n cacheHitRate: number;\n lastInvoked: number;\n triggeringActions: string[];\n}\n\nexport interface SelectorInvocation {\n readonly selectorName: string;\n readonly timestamp: number;\n readonly computationTime: number;\n readonly wasRecomputed: boolean;\n readonly inputChanged: boolean;\n readonly triggeringAction?: string;\n}\n\nexport interface EndToEndTiming {\n readonly actionType: string;\n readonly actionDispatchTime: number;\n readonly reducerCompleteTime: number;\n readonly selectorsCompleteTime: number;\n readonly totalTime: number;\n readonly reducerTime: number;\n readonly selectorTime: number;\n readonly affectedSelectors: readonly string[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SelectorTrackerService {\n private readonly selectorMetrics = new Map<string, SelectorMetrics>();\n private recentInvocations: SelectorInvocation[] = [];\n private pendingAction: { type: string; dispatchTime: number; reducerCompleteTime?: number; reducerTime?: number } | null = null;\n private endToEndTimings: EndToEndTiming[] = [];\n\n markActionDispatch(actionType: string): void {\n this.pendingAction = {\n type: actionType,\n dispatchTime: performance.now(),\n };\n }\n\n markReducerComplete(reducerTime: number): void {\n if (this.pendingAction) {\n this.pendingAction.reducerCompleteTime = performance.now();\n this.pendingAction.reducerTime = reducerTime;\n }\n }\n\n recordSelectorInvocation(\n selectorName: string,\n computationTime: number,\n wasRecomputed: boolean,\n inputChanged: boolean\n ): void {\n const invocation: SelectorInvocation = {\n selectorName,\n timestamp: Date.now(),\n computationTime,\n wasRecomputed,\n inputChanged,\n triggeringAction: this.pendingAction?.type,\n };\n\n this.recentInvocations.push(invocation);\n\n const existing = this.selectorMetrics.get(selectorName);\n if (existing) {\n existing.invocationCount++;\n if (wasRecomputed) {\n existing.recomputationCount++;\n existing.totalComputationTime += computationTime;\n existing.avgComputationTime = existing.totalComputationTime / existing.recomputationCount;\n existing.maxComputationTime = Math.max(existing.maxComputationTime, computationTime);\n existing.lastComputationTime = computationTime;\n }\n existing.cacheHitRate = ((existing.invocationCount - existing.recomputationCount) / existing.invocationCount) * 100;\n existing.lastInvoked = Date.now();\n if (this.pendingAction?.type && !existing.triggeringActions.includes(this.pendingAction.type)) {\n existing.triggeringActions.push(this.pendingAction.type);\n if (existing.triggeringActions.length > 10) {\n existing.triggeringActions.shift();\n }\n }\n } else {\n this.selectorMetrics.set(selectorName, {\n name: selectorName,\n invocationCount: 1,\n recomputationCount: wasRecomputed ? 1 : 0,\n totalComputationTime: wasRecomputed ? computationTime : 0,\n avgComputationTime: wasRecomputed ? computationTime : 0,\n maxComputationTime: wasRecomputed ? computationTime : 0,\n lastComputationTime: wasRecomputed ? computationTime : 0,\n cacheHitRate: wasRecomputed ? 0 : 100,\n lastInvoked: Date.now(),\n triggeringActions: this.pendingAction?.type ? [this.pendingAction.type] : [],\n });\n }\n\n if (this.recentInvocations.length > 500) {\n this.recentInvocations = this.recentInvocations.slice(-250);\n }\n }\n\n markSelectorsComplete(): EndToEndTiming | null {\n if (!this.pendingAction) return null;\n\n const now = performance.now();\n\n const affectedSelectors = this.recentInvocations\n .filter(inv => inv.triggeringAction === this.pendingAction?.type)\n .map(inv => inv.selectorName)\n .filter((name, index, arr) => arr.indexOf(name) === index);\n\n const timing: EndToEndTiming = {\n actionType: this.pendingAction.type,\n actionDispatchTime: this.pendingAction.dispatchTime,\n reducerCompleteTime: this.pendingAction.reducerCompleteTime ?? now,\n selectorsCompleteTime: now,\n totalTime: now - this.pendingAction.dispatchTime,\n reducerTime: this.pendingAction.reducerTime ?? 0,\n selectorTime: now - (this.pendingAction.reducerCompleteTime ?? this.pendingAction.dispatchTime),\n affectedSelectors,\n };\n\n this.endToEndTimings.push(timing);\n if (this.endToEndTimings.length > 100) {\n this.endToEndTimings = this.endToEndTimings.slice(-50);\n }\n\n this.pendingAction = null;\n return timing;\n }\n\n getAllMetrics(): ReadonlyMap<string, SelectorMetrics> {\n return new Map(this.selectorMetrics);\n }\n\n getMetrics(selectorName: string): SelectorMetrics | undefined {\n return this.selectorMetrics.get(selectorName);\n }\n\n getSlowestSelectors(limit = 10): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .sort((a, b) => b.totalComputationTime - a.totalComputationTime)\n .slice(0, limit);\n }\n\n getInefficientSelectors(cacheHitThreshold = 50): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .filter(m => m.cacheHitRate < cacheHitThreshold && m.invocationCount > 5)\n .sort((a, b) => a.cacheHitRate - b.cacheHitRate);\n }\n\n getEndToEndTimings(): readonly EndToEndTiming[] {\n return [...this.endToEndTimings];\n }\n\n getAverageEndToEndTime(): number {\n if (this.endToEndTimings.length === 0) return 0;\n const total = this.endToEndTimings.reduce((sum, t) => sum + t.totalTime, 0);\n return total / this.endToEndTimings.length;\n }\n\n clear(): void {\n this.selectorMetrics.clear();\n this.recentInvocations = [];\n this.endToEndTimings = [];\n this.pendingAction = null;\n }\n}\n","import { MemoizedSelector, createSelector, Selector } from '@ngrx/store';\nimport { SelectorTrackerService } from './selector-tracker.service';\n\nlet globalSelectorTracker: SelectorTrackerService | null = null;\n\nexport function setSelectorTracker(tracker: SelectorTrackerService): void {\n globalSelectorTracker = tracker;\n}\n\nexport function trackSelector<State, Result>(\n name: string,\n selector: MemoizedSelector<State, Result>\n): MemoizedSelector<State, Result> {\n let lastResult: Result | undefined;\n let lastInput: State | undefined;\n\n const trackedSelector = ((state: State) => {\n const startTime = performance.now();\n const result = selector(state);\n const endTime = performance.now();\n\n const computationTime = endTime - startTime;\n const wasRecomputed = result !== lastResult;\n const inputChanged = state !== lastInput;\n\n lastResult = result;\n lastInput = state;\n\n if (globalSelectorTracker) {\n globalSelectorTracker.recordSelectorInvocation(\n name,\n computationTime,\n wasRecomputed,\n inputChanged\n );\n }\n\n return result;\n }) as MemoizedSelector<State, Result>;\n\n (trackedSelector as unknown as { release: typeof selector.release }).release = selector.release;\n (trackedSelector as unknown as { projector: typeof selector.projector }).projector = selector.projector;\n (trackedSelector as unknown as { setResult: typeof selector.setResult }).setResult = selector.setResult;\n (trackedSelector as unknown as { clearResult: typeof selector.clearResult }).clearResult = selector.clearResult;\n\n return trackedSelector;\n}\n\nexport function createTrackedSelector<State, S1, Result>(\n name: string,\n s1: Selector<State, S1>,\n projector: (s1: S1) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n projector: (s1: S1, s2: S2) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n projector: (s1: S1, s2: S2, s3: S3) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, S4, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n s4: Selector<State, S4>,\n projector: (s1: S1, s2: S2, s3: S3, s4: S4) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector(\n name: string,\n ...args: unknown[]\n): MemoizedSelector<unknown, unknown> {\n const selector = (createSelector as (...args: unknown[]) => MemoizedSelector<unknown, unknown>)(...args);\n return trackSelector(name, selector);\n}\n\nexport function TrackedSelector(name: string) {\n return function (target: Record<string, unknown>, propertyKey: string): void {\n const originalSelector = target[propertyKey] as MemoizedSelector<unknown, unknown>;\n if (originalSelector) {\n target[propertyKey] = trackSelector(name, originalSelector);\n }\n };\n}\n","import { ActionReducer, Action } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { PerformanceTrackerService } from '../performance/performance-tracker.service';\nimport { WebSocketService } from '../core/websocket.service';\nimport { DEFAULT_WS_URL } from '../core/core.models';\n\nexport interface RenderPerformanceData {\n readonly renderTime: number;\n readonly reducerTime: number;\n readonly stateSize: number;\n}\n\nexport interface StateChangeMessage {\n type: 'STATE_CHANGE';\n action: Action;\n prevState: unknown;\n nextState: unknown;\n timestamp: string;\n renderPerformance?: RenderPerformanceData;\n}\n\nexport interface DevToolMetaReducerConfig {\n readonly wsUrl?: string;\n readonly enablePerformanceTracking?: boolean;\n}\n\nexport function createDevToolMetaReducer(\n wsUrlOrConfig: string | DevToolMetaReducerConfig = DEFAULT_WS_URL\n) {\n const config: DevToolMetaReducerConfig = typeof wsUrlOrConfig === 'string'\n ? { wsUrl: wsUrlOrConfig }\n : wsUrlOrConfig;\n\n const wsUrl = config.wsUrl ?? DEFAULT_WS_URL;\n const enablePerf = config.enablePerformanceTracking ?? true;\n\n return function devToolMetaReducer<State>(\n reducer: ActionReducer<State>\n ): ActionReducer<State> {\n const performanceTracker = inject(PerformanceTrackerService);\n const webSocketService = inject(WebSocketService);\n\n // Initialize WebSocket connection (no-op if already initialized)\n webSocketService.initialize(wsUrl);\n\n return function (state, action) {\n const prevState = state;\n const timestamp = new Date().toISOString();\n\n let nextState: State;\n\n if (enablePerf) {\n nextState = performanceTracker.measureRenderTime(\n action.type,\n () => reducer(state, action),\n (renderTime, reducerTime, stateSize) => {\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n renderPerformance: { renderTime, reducerTime, stateSize }\n };\n\n webSocketService.send(message);\n }\n );\n } else {\n nextState = reducer(state, action);\n\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n };\n\n webSocketService.send(message);\n }\n\n return nextState;\n };\n };\n}\n\nexport function loggerMetaReducer<State>(\n reducer: ActionReducer<State>\n): ActionReducer<State> {\n return createDevToolMetaReducer(DEFAULT_WS_URL)(reducer);\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { EffectSources } from '@ngrx/effects';\nimport { ActionsInterceptorService } from '../core/actions-interceptor.service';\nimport { DevToolsEffectSources } from '../core/devtools-effect-sources';\nimport { DEFAULT_WS_URL } from '../core/core.models';\n\nexport interface DevToolConfig {\n readonly wsUrl?: string;\n readonly trackEffects?: boolean;\n}\n\nexport function provideNgrxDevTool(config: DevToolConfig = {}): Provider[] {\n const providers: Provider[] = [\n {\n provide: APP_INITIALIZER,\n useFactory: (interceptor: ActionsInterceptorService) => () => {\n interceptor.initialize(config.wsUrl ?? DEFAULT_WS_URL);\n },\n deps: [ActionsInterceptorService],\n multi: true,\n },\n ];\n\n if (config.trackEffects !== false) {\n providers.push({\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n });\n }\n\n return providers;\n}\n\nexport function provideEffectTracking(): Provider {\n return {\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n };\n}\n","/*\n * Public API Surface of ngrx-devtool\n */\n\nexport * from './lib/core';\nexport * from './lib/performance';\nexport * from './lib/selectors';\nexport * from './lib/store';\nexport * from './types/state.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["REPLAY_BUFFER_SIZE","takeUntil","tap"],"mappings":"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"}
@@ -250,6 +250,8 @@ interface RenderPerformanceEntry {
250
250
  readonly actionType: string;
251
251
  readonly timestamp: number;
252
252
  readonly renderTime: number;
253
+ readonly reducerTime?: number;
254
+ readonly stateSize?: number;
253
255
  }
254
256
  interface RenderPerformanceStats {
255
257
  readonly avgRenderTime: number;
@@ -280,7 +282,7 @@ declare class PerformanceTrackerService {
280
282
  private readonly isBrowser;
281
283
  private thresholds;
282
284
  private firstActionTime;
283
- measureRenderTime<State>(actionType: string, reducer: () => State, callback: (renderTime: number) => void): State;
285
+ measureRenderTime<State>(actionType: string, reducer: () => State, callback: (renderTime: number, reducerTime: number, stateSize: number) => void): State;
284
286
  getEntries(): readonly RenderPerformanceEntry[];
285
287
  getStats(): RenderPerformanceStats;
286
288
  getAggregatedStats(): AggregatedPerformanceStats;
@@ -291,6 +293,7 @@ declare class PerformanceTrackerService {
291
293
  clear(): void;
292
294
  private getActionTypeStats;
293
295
  private calculatePerformanceScore;
296
+ private getSerializedSize;
294
297
  private maxSeverity;
295
298
  static ɵfac: i0.ɵɵFactoryDeclaration<PerformanceTrackerService, never>;
296
299
  static ɵprov: i0.ɵɵInjectableDeclaration<PerformanceTrackerService>;
@@ -447,6 +450,8 @@ declare function TrackedSelector(name: string): (target: Record<string, unknown>
447
450
 
448
451
  interface RenderPerformanceData {
449
452
  readonly renderTime: number;
453
+ readonly reducerTime: number;
454
+ readonly stateSize: number;
450
455
  }
451
456
  interface StateChangeMessage {
452
457
  type: 'STATE_CHANGE';