UNPKG

debug-time-machine-core

Version:

๐Ÿ•ฐ๏ธ Debug Time Machine Core - ์‹œ๊ฐ„์—ฌํ–‰ ์—”์ง„๊ณผ ๋„คํŠธ์›Œํฌ ์ธํ„ฐ์…‰ํ„ฐ

1,935 lines (1,924 loc) โ€ข 69.1 kB
interface ITimeSnapshot { id: string; timestamp: number; state: Record<string, unknown>; actionType: string; description?: string; } interface ITimeTravelEngine { createSnapshot: (state: Record<string, unknown>, actionType: string) => ITimeSnapshot; restoreSnapshot: (snapshotId: string) => boolean; getAllSnapshots: () => ITimeSnapshot[]; clearSnapshots: () => void; } type TTimeTravelAction = 'CREATE_SNAPSHOT' | 'RESTORE_SNAPSHOT' | 'CLEAR_SNAPSHOTS'; interface INetworkRequest { id: string; url: string; method: string; headers: Record<string, string>; body?: string; timestamp: number; } interface INetworkResponse { id: string; requestId: string; status: number; statusText: string; headers: Record<string, string>; body?: string; timestamp: number; } interface INetworkInterceptor { startIntercepting: () => void; stopIntercepting: () => void; getRequestHistory: () => INetworkRequest[]; getResponseHistory: () => INetworkResponse[]; clearHistory: () => void; } type TNetworkMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'; type TNetworkPriority = 'high' | 'medium' | 'low'; type TCacheStatus = 'hit' | 'miss' | 'stale' | 'none'; interface IWebSocketMessage { type: string; payload: unknown; timestamp: number; } type TWebSocketEvent = 'connection' | 'message' | 'close' | 'error'; interface IDebugEvent { id: string; type: string; data: unknown; timestamp: number; source: string; } type TDebugEventType = 'state_change' | 'network_request' | 'network_response' | 'error' | 'warning' | 'info'; interface IErrorContext { url: string; userAgent: string; timestamp: number; userId?: string; sessionId?: string; reactState?: Record<string, unknown>; reactProps?: Record<string, unknown>; domSnapshot?: string; breadcrumbs?: IBreadcrumb[]; originalError?: Error | string; } interface IBreadcrumb { id: string; type: 'navigation' | 'user_action' | 'http' | 'console' | 'state_change'; message: string; data?: Record<string, unknown>; timestamp: number; level: 'info' | 'warning' | 'error'; } interface IMemoryConfig { maxTotalMemoryMB: number; maxSnapshotSizeMB: number; compressionEnabled: boolean; circularRefHandling: boolean; autoCleanupThreshold: number; memoryCheckInterval: number; } interface IMemoryUsage { totalUsageMB: number; snapshotCount: number; averageSnapshotSizeMB: number; largestSnapshotMB: number; compressionRatio: number; } interface IMemoryAlert { type: 'warning' | 'critical'; message: string; currentUsageMB: number; recommendedAction: string; timestamp: number; } /** * MemoryManager - ์Šค๋ƒ…์ƒท ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ํด๋ž˜์Šค */ declare class MemoryManager { private _config; private _snapshotSizes; private _currentMemoryUsage; private _memoryCheckTimer; private _onMemoryAlert?; constructor(config?: Partial<IMemoryConfig>); /** * ์Šค๋ƒ…์ƒท์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค */ calculateSnapshotSize(snapshot: ITimeSnapshot): number; /** * ์Šค๋ƒ…์ƒท ์••์ถ•์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค */ compressSnapshot(state: Record<string, unknown>): Record<string, unknown>; /** * ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค */ cleanup(snapshots: Map<string, ITimeSnapshot>): string[]; /** * ์Šค๋ƒ…์ƒท ์ œ๊ฑฐ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์—…๋ฐ์ดํŠธ */ removeSnapshot(snapshotId: string): void; /** * ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค */ getMemoryUsage(): IMemoryUsage; /** * ๋ฉ”๋ชจ๋ฆฌ ์•Œ๋ฆผ ์ฝœ๋ฐฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค */ onMemoryAlert(callback: (alert: IMemoryAlert) => void): void; /** * ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์ž๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค */ destroy(): void; /** * Circular reference๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค */ private _serializeWithCircularRefHandling; /** * ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค */ private _deepClone; /** * ์••์ถ• ์ „๋žต๋“ค์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค */ private _applyCompressionStrategies; /** * ๊ธด ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค */ private _compressLongStrings; /** * ์ค‘๋ณต ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค */ private _deduplicateObjects; /** * ๋ถˆํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค */ private _removeUnnecessaryProps; /** * ์••์ถ•๋ฅ ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค */ private _calculateCompressionRatio; /** * ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค */ private _updateMemoryUsage; /** * ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค */ private _startMemoryMonitoring; /** * ๋ฉ”๋ชจ๋ฆฌ ์•Œ๋ฆผ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค */ private _emitMemoryAlert; } interface ITimeTravelEngineConfig { maxSnapshots?: number; memoryConfig?: Partial<IMemoryConfig>; enableAutoCleanup?: boolean; compressionEnabled?: boolean; enableLogging?: boolean; } /** * Enhanced TimeTravelEngine - ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ•ํ™”๋œ ์‹œ๊ฐ„์—ฌํ–‰ ๋””๋ฒ„๊น… ์—”์ง„ */ declare class TimeTravelEngine implements ITimeTravelEngine { private _snapshots; private _maxSnapshots; private _memoryManager; private _config; private _onMemoryAlert?; constructor(config?: ITimeTravelEngineConfig); /** * ํ˜„์žฌ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฒ„๋กœ๋“œ) */ createSnapshot(): ITimeSnapshot; createSnapshot(state: Record<string, unknown>, actionType: string): ITimeSnapshot; /** * ์ƒํƒœ์™€ ํ•จ๊ป˜ ์Šค๋ƒ…์ƒท ์ƒ์„ฑ (๋‚ด๋ถ€ ๊ตฌํ˜„) */ private _createSnapshotWithState; /** * ์Šค๋ƒ…์ƒท์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค */ restoreSnapshot(snapshotId: string): boolean; /** * ๋ชจ๋“  ์Šค๋ƒ…์ƒท์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค */ getAllSnapshots(): ITimeSnapshot[]; /** * ๋ชจ๋“  ์Šค๋ƒ…์ƒท์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค */ clearSnapshots(): void; /** * ํŠน์ • ์Šค๋ƒ…์ƒท์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค */ deleteSnapshot(snapshotId: string): boolean; /** * ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค */ getMemoryUsage(): IMemoryUsage; /** * ๋ฉ”๋ชจ๋ฆฌ ์•Œ๋ฆผ ์ฝœ๋ฐฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค */ onMemoryAlert(callback: (alert: IMemoryAlert) => void): void; /** * ์‹œ๊ฐ„ ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์Šค๋ƒ…์ƒท ์ •๋ฆฌ */ cleanupByTimeRange(olderThanMs: number): number; /** * ํŒจํ„ด ๊ธฐ๋ฐ˜ ์Šค๋ƒ…์ƒท ์ •๋ฆฌ (์ค‘๋ณต ์ œ๊ฑฐ) */ cleanupDuplicates(): number; /** * ์‹œ๊ฐ„์—ฌํ–‰ ์—”์ง„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค */ start(): void; /** * ์‹œ๊ฐ„์—ฌํ–‰ ์—”์ง„์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค */ stop(): void; /** * ํŠน์ • ์‹œ์ ์œผ๋กœ ์‹œ๊ฐ„์—ฌํ–‰ */ travelToTime(timestamp: number): void; /** * ์ด์ „ ์ด๋ฒคํŠธ๋กœ ์ด๋™ */ travelToPreviousEvent(): void; /** * ๋‹ค์Œ ์ด๋ฒคํŠธ๋กœ ์ด๋™ */ travelToNextEvent(): void; /** * ํ˜„์žฌ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ */ getState(): { snapshotCount: number; maxSnapshots: number; memoryUsage: IMemoryUsage; config: Required<ITimeTravelEngineConfig>; }; /** * ํžˆ์Šคํ† ๋ฆฌ ์ดˆ๊ธฐํ™” (clearSnapshots์™€ ๋™์ผ) */ clearHistory(): void; /** * ์—”์ง„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค */ destroy(): void; /** * ์ž๋™ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค */ private _performAutomaticCleanup; /** * ์Šค๋ƒ…์ƒท ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค */ private _enforceMaxSnapshots; /** * ๋ณต์› ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค */ private _emitRestoreEvent; /** * ๋ฉ”๋ชจ๋ฆฌ ์•Œ๋ฆผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค */ private _handleMemoryAlert; /** * ์ƒํƒœ ์••์ถ•์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค */ private _decompressState; /** * ๋‘ ์ƒํƒœ๊ฐ€ ๋™์ผํ•œ์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค */ private _areStatesEqual; } /** * ๋„คํŠธ์›Œํฌ ์ธํ„ฐ์…‰ํ„ฐ ์ „์šฉ ํƒ€์ž… ์ •์˜ */ /** * ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํƒ€์ด๋ฐ ์ •๋ณด */ interface INetworkTiming { startTime: number; requestStart: number; responseStart: number; responseEnd: number; duration: number; dnsLookup?: number; tcpConnect?: number; sslHandshake?: number; firstByte?: number; } /** * GraphQL ์ฟผ๋ฆฌ ์ •๋ณด */ interface IGraphQLInfo { operationType: 'query' | 'mutation' | 'subscription'; operationName?: string; variables?: Record<string, unknown>; extensions?: Record<string, unknown>; } /** * ํ™•์žฅ๋œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ธํ„ฐํŽ˜์ด์Šค */ interface IEnhancedNetworkRequest extends INetworkRequest { timing: INetworkTiming; size: { requestHeaders: number; requestBody: number; total: number; }; graphql?: IGraphQLInfo; retryAttempt?: number; cacheStatus?: 'hit' | 'miss' | 'stale' | 'none'; priority?: 'high' | 'medium' | 'low'; } /** * ํ™•์žฅ๋œ ๋„คํŠธ์›Œํฌ ์‘๋‹ต ์ธํ„ฐํŽ˜์ด์Šค */ interface IEnhancedNetworkResponse extends INetworkResponse { timing: INetworkTiming; size: { responseHeaders: number; responseBody: number; total: number; }; compression?: { type: string; ratio: number; }; graphql?: { errors?: unknown[]; data?: unknown; extensions?: Record<string, unknown>; }; } /** * ๋„คํŠธ์›Œํฌ ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ • */ interface INetworkInterceptorConfig { maxHistorySize?: number; captureRequestBody?: boolean; captureResponseBody?: boolean; enableTiming?: boolean; enableGraphQLParsing?: boolean; enableAxiosInterception?: boolean; maxBodySize?: number; excludePatterns?: RegExp[]; includePatterns?: RegExp[]; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; } interface IStateChange { id: string; timestamp: number; statePath: string; oldValue: unknown; newValue: unknown; source: 'api' | 'user' | 'system' | 'unknown'; trigger?: { type: 'api_request' | 'api_response' | 'user_action' | 'timer' | 'unknown'; id?: string; details?: Record<string, unknown>; }; } interface IAPIStateMapping { id: string; apiRequestId: string; apiResponseId?: string; url: string; method: string; stateChanges: IStateChange[]; timing: { apiStart: number; apiEnd?: number; firstStateChange?: number; lastStateChange?: number; totalDuration?: number; }; confidence: number; metadata: { dataFlowType: 'direct' | 'indirect' | 'batched' | 'unknown'; affectedComponents: string[]; stateChangeCount: number; }; } interface IAPIStateMapperConfig { enableAutoMapping?: boolean; stateChangeWindow?: number; confidenceThreshold?: number; maxMappingHistory?: number; enablePatternLearning?: boolean; excludeStatePatterns?: RegExp[]; onMappingCreated?: (mapping: IAPIStateMapping) => void; onStateChange?: (stateChange: IStateChange) => void; } /** * API-์ƒํƒœ ๋งคํ•‘ ์‹œ์Šคํ…œ * * API ํ˜ธ์ถœ๊ณผ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์„ ์ž๋™์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. */ declare class APIStateMapper { private _config; private _isActive; private _pendingRequests; private _recentStateChanges; private _mappings; private _stateObservers; private _patterns; constructor(config?: IAPIStateMapperConfig); /** * ๋งคํ•‘ ์‹œ์ž‘ */ start(): void; /** * ๋งคํ•‘ ์ค‘์ง€ */ stop(): void; /** * API ์š”์ฒญ ์ถ”์  ์‹œ์ž‘ */ trackAPIRequest(request: IEnhancedNetworkRequest): void; /** * API ์‘๋‹ต ์ถ”์  */ trackAPIResponse(response: IEnhancedNetworkResponse): void; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ์ˆ˜๋™ ์ถ”๊ฐ€ */ addStateChange(stateChange: Omit<IStateChange, 'id' | 'timestamp'>): void; /** * ๋งคํ•‘ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ */ getMappings(): IAPIStateMapping[]; /** * ํŠน์ • API ํŒจํ„ด์˜ ๋งคํ•‘ ๊ฐ€์ ธ์˜ค๊ธฐ */ getMappingsByURL(urlPattern: string | RegExp): IAPIStateMapping[]; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ํžˆ์Šคํ† ๋ฆฌ */ getStateChangeHistory(): IStateChange[]; /** * ํŒจํ„ด ํ•™์Šต ๊ฒฐ๊ณผ */ getLearnedPatterns(): Map<string, number>; /** * ํ†ต๊ณ„ ์ •๋ณด */ getStats(): { isActive: boolean; totalMappings: number; pendingRequests: number; recentStateChanges: number; learnedPatterns: number; averageConfidence: number; config: { enableAutoMapping: boolean; stateChangeWindow: number; confidenceThreshold: number; maxMappingHistory: number; enablePatternLearning: boolean; excludeStatePatterns: RegExp[]; onMappingCreated?: (mapping: IAPIStateMapping) => void; onStateChange?: (stateChange: IStateChange) => void; }; }; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ฐฝ ์‹œ์ž‘ */ private _startStateChangeWindow; /** * API-์ƒํƒœ ๋งคํ•‘ ์ƒ์„ฑ */ private _createMapping; /** * ์‹ ๋ขฐ๋„ ๊ณ„์‚ฐ */ private _calculateConfidence; /** * ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ํƒ€์ž… ๋ถ„์„ */ private _analyzeDataFlowType; /** * ์˜ํ–ฅ๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ ์ถ”์ถœ */ private _extractAffectedComponents; /** * URL ํŒจํ„ด ์ถ”์ถœ */ private _extractURLPattern; /** * ํŒจํ„ด ํ•™์Šต */ private _learnPattern; /** * ์ž๋™ ๋งคํ•‘ ์‹œ๋„ */ private _attemptAutoMapping; /** * ์ƒํƒœ ๊ด€์ฐฐ์ž ์„ค์ • */ private _setupStateObservers; /** * Redux ์ƒํƒœ ๊ด€์ฐฐ์ž ์„ค์ • */ private _setupReduxObserver; /** * MobX ์ƒํƒœ ๊ด€์ฐฐ์ž ์„ค์ • */ private _setupMobXObserver; /** * Zustand ์ƒํƒœ ๊ด€์ฐฐ์ž ์„ค์ • */ private _setupZustandObserver; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€ */ private _detectStateChanges; /** * ์ƒํƒœ diff ๊ณ„์‚ฐ */ private _diffStates; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ์ œ์™ธ ์—ฌ๋ถ€ ํ™•์ธ */ private _shouldExcludeStateChange; /** * ์ƒํƒœ ๊ด€์ฐฐ์ž๋“ค ์ •๋ฆฌ */ private _cleanupStateObservers; /** * ์ •๋ฆฌ */ destroy(): void; } /** * ์ „์—ญ API ์ƒํƒœ ๋งคํผ ๊ฐ€์ ธ์˜ค๊ธฐ/์ƒ์„ฑ */ declare function getGlobalAPIStateMapper(config?: IAPIStateMapperConfig): APIStateMapper; /** * ์ „์—ญ API ์ƒํƒœ ๋งคํผ ์ •๋ฆฌ */ declare function destroyGlobalAPIStateMapper(): void; /** * ์—๋Ÿฌ ๊ฐ์ง€ ์‹œ์Šคํ…œ์˜ ์„ค์ • ์ธํ„ฐํŽ˜์ด์Šค */ interface IErrorDetectorConfig { captureConsole?: boolean; captureUnhandledErrors?: boolean; captureUnhandledRejections?: boolean; captureReactErrors?: boolean; includeSourceMap?: boolean; maxStackFrames?: number; excludePatterns?: RegExp[]; onError?: (event: IDebugEvent) => void; } /** * ์—๋Ÿฌ ์ปจํ…์ŠคํŠธ ์ •๋ณด */ interface IErrorContextLocal { url: string; userAgent: string; timestamp: number; userId?: string; sessionId?: string; reactState?: Record<string, unknown>; reactProps?: Record<string, unknown>; domSnapshot?: string; breadcrumbs?: IBreadcrumbLocal[]; originalError?: Error | string; performance?: any; network?: any; stateSnapshot?: any; } /** * ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ (์‚ฌ์šฉ์ž ํ–‰๋™ ์ถ”์ ) */ interface IBreadcrumbLocal { id: string; type: 'navigation' | 'user_action' | 'http' | 'console' | 'state_change'; message: string; data?: Record<string, unknown>; timestamp: number; level: 'info' | 'warning' | 'error'; } /** * ์—๋Ÿฌ ์ƒ์„ธ ์ •๋ณด */ interface IErrorDetails { id: string; type: TDebugEventType; message: string; stack?: string; filename?: string; lineNumber?: number; columnNumber?: number; source?: 'javascript' | 'promise' | 'console' | 'react' | 'manual'; level: 'info' | 'warning' | 'error' | 'critical'; context: IErrorContextLocal; originalError?: Error | string; } /** * ์™„์ „ํ•œ ์—๋Ÿฌ ๊ฐ์ง€ ์‹œ์Šคํ…œ * * JavaScript ์—๋Ÿฌ, Promise rejection, console ๋ฉ”์‹œ์ง€, React ์—๋Ÿฌ ๋“ฑ์„ * ํฌ๊ด„์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ปจํ…์ŠคํŠธ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. */ declare class ErrorDetector { private _config; private _isActive; private _breadcrumbs; private _maxBreadcrumbs; private _originalConsole; private _originalOnError; private _originalOnUnhandledRejection; private _reactErrorHandler?; constructor(config?: Partial<IErrorDetectorConfig>); /** * ์—๋Ÿฌ ๊ฐ์ง€ ์‹œ์ž‘ */ start(): void; /** * ์—๋Ÿฌ ๊ฐ์ง€ ์ค‘๋‹จ */ stop(): void; /** * ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ ์ถ”๊ฐ€ */ addBreadcrumb(breadcrumb: Omit<IBreadcrumbLocal, 'id' | 'timestamp'>): void; /** * React Error Handler ์„ค์ • */ setReactErrorHandler(handler: (error: Error, errorInfo: any) => void): void; /** * ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ์ •๋ณด ์ˆ˜์ง‘ */ getCurrentContext(): IErrorContextLocal; /** * ๊ธ€๋กœ๋ฒŒ JavaScript ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ ์„ค์ • */ private _setupGlobalErrorHandler; /** * Unhandled Promise Rejection ํ•ธ๋“ค๋Ÿฌ ์„ค์ • */ private _setupUnhandledRejectionHandler; /** * Console ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ */ private _setupConsoleOverride; /** * React Error Handler ์„ค์ • */ private _setupReactErrorHandler; /** * React ์—๋Ÿฌ ์ฒ˜๋ฆฌ */ private _handleReactError; /** * ์—๋Ÿฌ ์ œ์™ธ ์—ฌ๋ถ€ ํ™•์ธ */ private _shouldExcludeError; /** * ์ปจํ…์ŠคํŠธ ์ •๋ณด ๊ฐ•ํ™” */ private _enhanceContext; /** * DOM ์Šค๋ƒ…์ƒท ์บก์ฒ˜ (๊ฐ„๋‹จํ•œ ๋ฒ„์ „) */ private _captureDOMSnapshot; /** * ์—๋Ÿฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ */ private _handleError; /** * ํ˜„์žฌ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ */ getState(): { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, 'onError'>> & { onError?: (event: IDebugEvent) => void; }; }; /** * ์„ค์ • ์—…๋ฐ์ดํŠธ */ updateConfig(newConfig: Partial<IErrorDetectorConfig>): void; } /** * ๊ธ€๋กœ๋ฒŒ ErrorDetector ๊ฐ€์ ธ์˜ค๊ธฐ/์ƒ์„ฑ */ declare function getGlobalErrorDetector(config?: Partial<IErrorDetectorConfig>): ErrorDetector; /** * React Error Boundary HOC */ declare function createReactErrorBoundary(errorDetector: ErrorDetector): { new (props: any): { [x: string]: any; componentDidCatch(error: Error, errorInfo: any): void; render(): any; }; [x: string]: any; getDerivedStateFromError(error: Error): { hasError: boolean; error: Error; }; } | null; /** * ์‚ฌ์šฉ์ž ์•ก์…˜ ๊ฐ์ง€ ์„ค์ • */ interface IUserActionDetectorConfig { captureLevel: 'minimal' | 'normal' | 'verbose'; debounceMs: number; includeHoverEvents: boolean; includeScrollEvents: boolean; includeKeyboardEvents: boolean; maxActionsPerSecond: number; excludeSelectors: string[]; prioritySelectors: string[]; onAction?: (action: IUserActionEvent) => void; } /** * ์‚ฌ์šฉ์ž ์•ก์…˜ ์ด๋ฒคํŠธ */ interface IUserActionEvent { id: string; type: string; timestamp: number; element: { tagName: string; id?: string; className?: string; textContent?: string; attributes?: Record<string, string>; }; coordinates?: { x: number; y: number; pageX: number; pageY: number; }; value?: string; target: { selector: string; xpath: string; }; priority: 'low' | 'medium' | 'high' | 'critical'; metadata: { url: string; viewport: { width: number; height: number; }; sessionId?: string; userId?: string; }; } /** * ์Šค๋งˆํŠธ ์‚ฌ์šฉ์ž ์•ก์…˜ ๊ฐ์ง€ ์‹œ์Šคํ…œ * * ์˜๋ฏธ์žˆ๋Š” ์‚ฌ์šฉ์ž ์•ก์…˜๋งŒ ์„ ๋ณ„์ ์œผ๋กœ ์บ์น˜ํ•˜๊ณ , * ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ, ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. */ declare class UserActionDetector { private _config; private _isActive; private _actionQueue; private _debouncedActions; private _actionCount; private _lastSecond; private readonly _priorityRules; constructor(config?: Partial<IUserActionDetectorConfig>); /** * ์‚ฌ์šฉ์ž ์•ก์…˜ ๊ฐ์ง€ ์‹œ์ž‘ */ start(): void; /** * ์‚ฌ์šฉ์ž ์•ก์…˜ ๊ฐ์ง€ ์ค‘๋‹จ */ stop(): void; /** * ์„ค์ •์— ๋”ฐ๋ฅธ ์บก์ฒ˜ํ•  ์ด๋ฒคํŠธ ํƒ€์ž…๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ */ private _getEventTypesToCapture; /** * ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ */ private _handleEvent; /** * ์ด๋ฒคํŠธ ์บก์ฒ˜ ์—ฌ๋ถ€ ๊ฒฐ์ • */ private _shouldCaptureEvent; /** * Rate limiting ์ฒดํฌ */ private _checkRateLimit; /** * ์•ก์…˜ ์šฐ์„ ์ˆœ์œ„ ๊ณ„์‚ฐ */ private _calculatePriority; /** * ๊ทœ์น™ ๋งค์นญ ํ™•์ธ */ private _matchesRule; /** * ์•ก์…˜ ๋””๋ฐ”์šด์‹ฑ */ private _debounceAction; /** * ์•ก์…˜ ์ฒ˜๋ฆฌ */ private _processAction; /** * ์ค‘์š”ํ•œ ์†์„ฑ๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ */ private _getImportantAttributes; /** * ๋งˆ์šฐ์Šค ์ขŒํ‘œ ๊ฐ€์ ธ์˜ค๊ธฐ */ private _getCoordinates; /** * ์ž…๋ ฅ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ */ private _getValue; /** * CSS ์…€๋ ‰ํ„ฐ ์ƒ์„ฑ */ private _getElementSelector; /** * XPath ์ƒ์„ฑ */ private _getElementXPath; /** * ์•ก์…˜ ํ ๊ฐ€์ ธ์˜ค๊ธฐ */ getActionQueue(): IUserActionEvent[]; /** * ์•ก์…˜ ํ ์ดˆ๊ธฐํ™” */ clearActionQueue(): void; /** * ํ˜„์žฌ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ */ getState(): { isActive: boolean; queueLength: number; config: Required<Omit<IUserActionDetectorConfig, 'onAction'>> & { onAction?: (action: IUserActionEvent) => void; }; }; /** * ์„ค์ • ์—…๋ฐ์ดํŠธ */ updateConfig(newConfig: Partial<IUserActionDetectorConfig>): void; } interface IRealTimeErrorReporterConfig extends Partial<IErrorDetectorConfig> { websocket?: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; enableStateSnapshot?: boolean; enableConsoleContext?: boolean; enableNetworkContext?: boolean; enablePerformanceContext?: boolean; autoConnect?: boolean; bufferErrors?: boolean; maxErrorBuffer?: number; enableLogging?: boolean; onError?: (event: IDebugEvent) => void; } /** * ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ ๋ฆฌํฌํ„ฐ - ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฆ‰์‹œ WebSocket์œผ๋กœ ์ „์†ก */ declare class RealTimeErrorReporter { private _config; private _errorDetector; private _webSocketConnector; private _isActive; private _errorBuffer; private _stats; constructor(config?: IRealTimeErrorReporterConfig); /** * ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ ๋ฆฌํฌํŒ… ์‹œ์ž‘ */ start(): Promise<void>; /** * ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ ๋ฆฌํฌํŒ… ์ค‘์ง€ */ stop(): Promise<void>; /** * WebSocket ์ˆ˜๋™ ์—ฐ๊ฒฐ */ connectWebSocket(): Promise<void>; /** * WebSocket ์—ฐ๊ฒฐ ํ•ด์ œ */ disconnectWebSocket(): void; /** * ์—๋Ÿฌ ์ˆ˜๋™ ๋ฆฌํฌํŠธ */ reportError(error: Error, context?: Record<string, unknown>): void; /** * ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ ์ถ”๊ฐ€ */ addBreadcrumb(breadcrumb: { type: 'navigation' | 'user_action' | 'http' | 'console' | 'state_change'; message: string; data?: Record<string, unknown>; level?: 'info' | 'warning' | 'error'; }): void; /** * ํ†ต๊ณ„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ */ getStats(): { uptime: number; isActive: boolean; webSocketConnected: boolean; errorDetectorState: { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, "onError">> & { onError?: (event: IDebugEvent) => void; }; }; totalErrors: number; sentErrors: number; bufferedErrors: number; startTime: number; }; /** * ํ˜„์žฌ ์ƒํƒœ ์ •๋ณด */ getState(): { isActive: boolean; config: { excludePatterns: RegExp[]; websocket: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; autoConnect: boolean; enableLogging: boolean; captureConsole: boolean; captureUnhandledErrors: boolean; captureUnhandledRejections: boolean; captureReactErrors: boolean; includeSourceMap: boolean; maxStackFrames: number; enableStateSnapshot: boolean; enableConsoleContext: boolean; enableNetworkContext: boolean; enablePerformanceContext: boolean; bufferErrors: boolean; maxErrorBuffer: number; onError?: (event: IDebugEvent) => void; }; stats: { uptime: number; isActive: boolean; webSocketConnected: boolean; errorDetectorState: { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, "onError">> & { onError?: (event: IDebugEvent) => void; }; }; totalErrors: number; sentErrors: number; bufferedErrors: number; startTime: number; }; errorDetector: { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, "onError">> & { onError?: (event: IDebugEvent) => void; }; }; webSocketConnector: { isConnected: boolean; sessionId: string; queueSize: number; reconnectAttempts: number; websocketState: number | undefined; } | undefined; errorBufferSize: number; }; /** * ์—๋Ÿฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ */ private _handleError; /** * ์—๋Ÿฌ ์ด๋ฒคํŠธ ๊ฐ•ํ™” (์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ ์ˆ˜์ง‘) */ private _enhanceErrorEvent; /** * ์„ฑ๋Šฅ ์ปจํ…์ŠคํŠธ ์ˆ˜์ง‘ */ private _collectPerformanceContext; /** * ๋„คํŠธ์›Œํฌ ์ปจํ…์ŠคํŠธ ์ˆ˜์ง‘ */ private _collectNetworkContext; /** * ์ƒํƒœ ์Šค๋ƒ…์ƒท ์ˆ˜์ง‘ (๊ฐ„๋‹จํ•œ ๋ฒ„์ „) */ private _collectStateSnapshot; /** * LocalStorage ์Šค๋ƒ…์ƒท (ํ‚ค๋งŒ) */ private _getLocalStorageSnapshot; /** * SessionStorage ์Šค๋ƒ…์ƒท (ํ‚ค๋งŒ) */ private _getSessionStorageSnapshot; /** * ์—๋Ÿฌ ์ด๋ฒคํŠธ ์ „์†ก */ private _sendErrorEvent; /** * ์—๋Ÿฌ ์ด๋ฒคํŠธ ๋ฒ„ํผ๋ง */ private _bufferErrorEvent; /** * ์—๋Ÿฌ ๋ฒ„ํผ ์ „์†ก */ private _flushErrorBuffer; /** * ์‹œ์ž‘ ์ด๋ฒคํŠธ ์ „์†ก */ private _sendStartEvent; /** * ์ข…๋ฃŒ ์ด๋ฒคํŠธ ์ „์†ก */ private _sendStopEvent; /** * ๋กœ๊น… ํ—ฌํผ */ private _log; /** * ์ •๋ฆฌ */ destroy(): Promise<void>; } /** * ์ „์—ญ ์—๋Ÿฌ ๋ฆฌํฌํ„ฐ ์ƒ์„ฑ/๊ฐ€์ ธ์˜ค๊ธฐ */ declare function getGlobalErrorReporter(config?: IRealTimeErrorReporterConfig): RealTimeErrorReporter; /** * ์ „์—ญ ์—๋Ÿฌ ๋ฆฌํฌํ„ฐ ์ •๋ฆฌ */ declare function destroyGlobalErrorReporter(): Promise<void>; /** * React Error Boundary ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ํ—ฌํผ */ declare function createErrorBoundaryWithReporter(errorReporter: RealTimeErrorReporter): { new (props: any): { [x: string]: any; componentDidCatch(error: Error, errorInfo: any): void; render(): any; }; [x: string]: any; getDerivedStateFromError(error: Error): { hasError: boolean; error: Error; }; } | null; /** * ๊ณ ๊ธ‰ ๋„คํŠธ์›Œํฌ ์ธํ„ฐ์…‰ํ„ฐ * * Fetch, XHR์„ ์ง€์›ํ•˜๋ฉฐ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: * - ์ƒ์„ธํ•œ ํƒ€์ด๋ฐ ์ •๋ณด ์ˆ˜์ง‘ * - GraphQL ์ฟผ๋ฆฌ ๊ฐ์ง€ ๋ฐ ํŒŒ์‹ฑ * - ์š”์ฒญ/์‘๋‹ต ํฌ๊ธฐ ์ธก์ • * - ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ์ถ”์  */ declare class NetworkInterceptor implements INetworkInterceptor { private _config; private _isIntercepting; private _requestHistory; private _responseHistory; private _originalFetch; private _originalXMLHttpRequest; constructor(config?: Partial<INetworkInterceptorConfig>); /** * ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ€๋กœ์ฑ„๊ธฐ ์‹œ์ž‘ */ startIntercepting(): void; /** * ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ€๋กœ์ฑ„๊ธฐ ์ค‘๋‹จ */ stopIntercepting(): void; /** * ์š”์ฒญ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ */ getRequestHistory(): IEnhancedNetworkRequest[]; /** * ์‘๋‹ต ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ */ getResponseHistory(): IEnhancedNetworkResponse[]; /** * ํžˆ์Šคํ† ๋ฆฌ ์ดˆ๊ธฐํ™” */ clearHistory(): void; /** * ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋งคํŠธ๋ฆญ ๊ฐ€์ ธ์˜ค๊ธฐ */ getNetworkMetrics(): { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; /** * Fetch API ๊ฐ€๋กœ์ฑ„๊ธฐ */ private _interceptFetch; /** * XMLHttpRequest ๊ฐ€๋กœ์ฑ„๊ธฐ */ private _interceptXMLHttpRequest; /** * ์š”์ฒญ URL์ด ์ œ์™ธ ํŒจํ„ด์— ๋งค์น˜๋˜๋Š”์ง€ ํ™•์ธ */ private _shouldExcludeRequest; /** * GraphQL ์ฟผ๋ฆฌ ํŒŒ์‹ฑ */ private _parseGraphQL; /** * GraphQL ์˜คํผ๋ ˆ์ด์…˜ ํƒ€์ž… ๊ฐ์ง€ */ private _detectGraphQLOperationType; /** * GraphQL ์˜คํผ๋ ˆ์ด์…˜ ์ด๋ฆ„ ์ถ”์ถœ */ private _extractGraphQLOperationName; /** * ์š”์ฒญ ์šฐ์„ ์ˆœ์œ„ ๊ณ„์‚ฐ */ private _calculateRequestPriority; /** * Fetch ์‘๋‹ต ์ฒ˜๋ฆฌ */ private _handleFetchResponse; /** * Fetch ์—๋Ÿฌ ์ฒ˜๋ฆฌ */ private _handleFetchError; /** * XHR ์‘๋‹ต ์ฒ˜๋ฆฌ */ private _handleXHRResponse; /** * GraphQL ์‘๋‹ต ํŒŒ์‹ฑ */ private _parseGraphQLResponse; /** * ํ—ค๋” ํฌ๊ธฐ ๊ณ„์‚ฐ */ private _calculateHeadersSize; /** * ์š”์ฒญ ํ—ค๋” ์ถ”์ถœ */ private _extractHeaders; /** * ์‘๋‹ต ํ—ค๋” ์ถ”์ถœ */ private _extractResponseHeaders; /** * ํ˜„์žฌ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ */ getState(): { isIntercepting: boolean; requestCount: number; responseCount: number; config: { maxHistorySize: number; captureRequestBody: boolean; captureResponseBody: boolean; enableTiming: boolean; enableGraphQLParsing: boolean; enableAxiosInterception: boolean; maxBodySize: number; excludePatterns: RegExp[]; includePatterns: RegExp[]; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }; metrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; }; /** * ์ •๋ฆฌ */ destroy(): void; } interface IRealTimeAPIInterceptorConfig extends Partial<INetworkInterceptorConfig> { websocket?: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; enableAxiosInterception?: boolean; autoConnect?: boolean; enableLogging?: boolean; } /** * ์‹ค์‹œ๊ฐ„ API ์ธํ„ฐ์…‰ํ„ฐ - ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  WebSocket์œผ๋กœ ์ „์†ก */ declare class RealTimeAPIInterceptor { private _config; private _networkInterceptor; private _axiosInterceptor; private _webSocketConnector; private _isActive; private _stats; constructor(config?: IRealTimeAPIInterceptorConfig); /** * ์‹ค์‹œ๊ฐ„ API ์ธํ„ฐ์…‰์…˜ ์‹œ์ž‘ */ start(): Promise<void>; /** * ์‹ค์‹œ๊ฐ„ API ์ธํ„ฐ์…‰์…˜ ์ค‘์ง€ */ stop(): Promise<void>; /** * WebSocket ์ˆ˜๋™ ์—ฐ๊ฒฐ */ connectWebSocket(): Promise<void>; /** * WebSocket ์—ฐ๊ฒฐ ํ•ด์ œ */ disconnectWebSocket(): void; /** * ์š”์ฒญ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ */ getRequestHistory(): IEnhancedNetworkRequest[]; /** * ์‘๋‹ต ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ */ getResponseHistory(): IEnhancedNetworkResponse[]; /** * ํžˆ์Šคํ† ๋ฆฌ ์ดˆ๊ธฐํ™” */ clearHistory(): void; /** * ํ†ต๊ณ„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ */ getStats(): { uptime: number; networkMetrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; isActive: boolean; webSocketConnected: boolean; webSocketQueueSize: number; axiosIntercepting: boolean; totalRequests: number; totalResponses: number; totalErrors: number; startTime: number; }; /** * ํ˜„์žฌ ์ƒํƒœ ์ •๋ณด */ getState(): { isActive: boolean; config: { maxHistorySize: number; captureRequestBody: boolean; captureResponseBody: boolean; enableTiming: boolean; enableGraphQLParsing: boolean; enableAxiosInterception: boolean; maxBodySize: number; excludePatterns: RegExp[]; includePatterns: RegExp[]; websocket: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; autoConnect: boolean; enableLogging: boolean; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }; stats: { uptime: number; networkMetrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; isActive: boolean; webSocketConnected: boolean; webSocketQueueSize: number; axiosIntercepting: boolean; totalRequests: number; totalResponses: number; totalErrors: number; startTime: number; }; networkInterceptor: { isIntercepting: boolean; requestCount: number; responseCount: number; config: { maxHistorySize: number; captureRequestBody: boolean; captureResponseBody: boolean; enableTiming: boolean; enableGraphQLParsing: boolean; enableAxiosInterception: boolean; maxBodySize: number; excludePatterns: RegExp[]; includePatterns: RegExp[]; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }; metrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; }; axiosInterceptor: { isIntercepting: boolean; hasRequestInterceptor: boolean; hasResponseInterceptor: boolean; axiosAvailable: boolean; } | undefined; webSocketConnector: { isConnected: boolean; sessionId: string; queueSize: number; reconnectAttempts: number; websocketState: number | undefined; } | undefined; }; /** * ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฒ˜๋ฆฌ */ private _handleNetworkRequest; /** * ๋„คํŠธ์›Œํฌ ์‘๋‹ต ์ฒ˜๋ฆฌ */ private _handleNetworkResponse; /** * ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ */ private _handleNetworkError; /** * ์‹œ์ž‘ ์ด๋ฒคํŠธ ์ „์†ก */ private _sendStartEvent; /** * ์ข…๋ฃŒ ์ด๋ฒคํŠธ ์ „์†ก */ private _sendStopEvent; /** * ๋กœ๊น… ํ—ฌํผ */ private _log; /** * ์ •๋ฆฌ */ destroy(): Promise<void>; } /** * ์ „์—ญ API ์ธํ„ฐ์…‰ํ„ฐ ์ƒ์„ฑ/๊ฐ€์ ธ์˜ค๊ธฐ */ declare function getGlobalAPIInterceptor(config?: IRealTimeAPIInterceptorConfig): RealTimeAPIInterceptor; /** * ์ „์—ญ API ์ธํ„ฐ์…‰ํ„ฐ ์ •๋ฆฌ */ declare function destroyGlobalAPIInterceptor(): Promise<void>; /** * Axios ์ธํ„ฐ์…‰ํ„ฐ - axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ†ตํ•ฉ */ declare class AxiosInterceptor { private _isIntercepting; private _requestInterceptorId; private _responseInterceptorId; private _onRequest?; private _onResponse?; private _onError?; constructor(callbacks?: { onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }); /** * Axios ์ธํ„ฐ์…‰์…˜ ์‹œ์ž‘ */ startIntercepting(): void; /** * Axios ์ธํ„ฐ์…‰์…˜ ์ค‘์ง€ */ stopIntercepting(): void; /** * ์ „์—ญ axios ์ธ์Šคํ„ด์Šค ํƒ์ง€ */ private _getAxiosInstance; /** * Axios ์š”์ฒญ ์ธํ„ฐ์…‰ํ„ฐ */ private _handleAxiosRequest; /** * Axios ์š”์ฒญ ์—๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ */ private _handleAxiosRequestError; /** * Axios ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ */ private _handleAxiosResponse; /** * Axios ์‘๋‹ต ์—๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ */ private _handleAxiosResponseError; /** * ์ „์ฒด URL ๊ตฌ์„ฑ */ private _buildFullUrl; /** * ํ—ค๋” ์ •๊ทœํ™” */ private _normalizeHeaders; /** * ํ—ค๋” ํฌ๊ธฐ ๊ณ„์‚ฐ */ private _calculateHeadersSize; /** * GraphQL ๊ฐ์ง€ */ private _detectGraphQL; /** * GraphQL ์˜คํผ๋ ˆ์ด์…˜ ํƒ€์ž… ๊ฐ์ง€ */ private _detectGraphQLOperationType; /** * GraphQL ์˜คํผ๋ ˆ์ด์…˜ ์ด๋ฆ„ ์ถ”์ถœ */ private _extractGraphQLOperationName; /** * GraphQL ์‘๋‹ต ํŒŒ์‹ฑ */ private _parseGraphQLResponse; /** * ์š”์ฒญ ์šฐ์„ ์ˆœ์œ„ ๊ณ„์‚ฐ */ private _calculatePriority; /** * ํ˜„์žฌ ์ƒํƒœ ํ™•์ธ */ get isIntercepting(): boolean; /** * ์ƒํƒœ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ */ getState(): { isIntercepting: boolean; hasRequestInterceptor: boolean; hasResponseInterceptor: boolean; axiosAvailable: boolean; }; /** * ์ •๋ฆฌ */ destroy(): void; } interface IDebugTimeMachineConfig { websocket?: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; networkInterception?: Partial<IRealTimeAPIInterceptorConfig>; errorReporting?: Partial<IRealTimeErrorReporterConfig>; stateMapping?: Partial<IAPIStateMapperConfig>; enableNetworkInterception?: boolean; enableErrorReporting?: boolean; enableStateMapping?: boolean; autoStart?: boolean; enableLogging?: boolean; sessionId?: string; } interface IDebugTimeMachineStats { uptime: number; sessionId: string; isActive: boolean; network: { totalRequests: number; totalResponses: number; totalErrors: number; webSocketConnected: boolean; }; errors: { totalErrors: number; sentErrors: number; bufferedErrors: number; }; stateMapping: { totalMappings: number; averageConfidence: number; learnedPatterns: number; }; } /** * Debug Time Machine ํ†ตํ•ฉ ์—”์ง„ * * ๋ชจ๋“  ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค์„ ํ†ตํ•ฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. */ declare class DebugTimeMachineEngine { private _config; private _isActive; private _sessionId; private _startTime; private _apiInterceptor; private _errorReporter; private _stateMapper; private _timeTravelEngine; constructor(config?: IDebugTimeMachineConfig); /** * Debug Time Machine ์‹œ์ž‘ */ start(): Promise<void>; /** * Debug Time Machine ์ค‘์ง€ */ stop(): Promise<void>; /** * WebSocket ์ˆ˜๋™ ์—ฐ๊ฒฐ */ connectWebSocket(): Promise<void>; /** * WebSocket ์—ฐ๊ฒฐ ํ•ด์ œ */ disconnectWebSocket(): void; /** * ์—๋Ÿฌ ์ˆ˜๋™ ๋ฆฌํฌํŠธ */ reportError(error: Error, context?: Record<string, unknown>): void; /** * ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ ์ถ”๊ฐ€ */ addBreadcrumb(breadcrumb: { type: 'navigation' | 'user_action' | 'http' | 'console' | 'state_change'; message: string; data?: Record<string, unknown>; level?: 'info' | 'warning' | 'error'; }): void; /** * ์ƒํƒœ ๋ณ€๊ฒฝ ์ˆ˜๋™ ์ถ”๊ฐ€ */ addStateChange(stateChange: { statePath: string; oldValue: unknown; newValue: unknown; source?: 'api' | 'user' | 'system' | 'unknown'; }): void; /** * ์‹œ๊ฐ„์—ฌํ–‰ - ํŠน์ • ์‹œ์ ์œผ๋กœ ์ด๋™ */ travelToTime(timestamp: number): void; /** * ์‹œ๊ฐ„์—ฌํ–‰ - ์ด์ „ ์ด๋ฒคํŠธ๋กœ ์ด๋™ */ travelToPreviousEvent(): void; /** * ์‹œ๊ฐ„์—ฌํ–‰ - ๋‹ค์Œ ์ด๋ฒคํŠธ๋กœ ์ด๋™ */ travelToNextEvent(): void; /** * ํ˜„์žฌ ์ƒํƒœ ์Šค๋ƒ…์ƒท ์ƒ์„ฑ */ createSnapshot(): void; /** * ํžˆ์Šคํ† ๋ฆฌ ์ดˆ๊ธฐํ™” */ clearHistory(): void; /** * ํ†ต๊ณ„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ */ getStats(): IDebugTimeMachineStats; /** * ์ƒ์„ธ ์ƒํƒœ ์ •๋ณด */ getDetailedState(): { engine: { isActive: boolean; sessionId: string; uptime: number; config: { websocket: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; networkInterception: Partial<IRealTimeAPIInterceptorConfig>; errorReporting: Partial<IRealTimeErrorReporterConfig>; stateMapping: Partial<IAPIStateMapperConfig>; enableNetworkInterception: boolean; enableErrorReporting: boolean; enableStateMapping: boolean; autoStart: boolean; enableLogging: boolean; sessionId: string; }; }; apiInterceptor: { isActive: boolean; config: { maxHistorySize: number; captureRequestBody: boolean; captureResponseBody: boolean; enableTiming: boolean; enableGraphQLParsing: boolean; enableAxiosInterception: boolean; maxBodySize: number; excludePatterns: RegExp[]; includePatterns: RegExp[]; websocket: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; autoConnect: boolean; enableLogging: boolean; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }; stats: { uptime: number; networkMetrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; isActive: boolean; webSocketConnected: boolean; webSocketQueueSize: number; axiosIntercepting: boolean; totalRequests: number; totalResponses: number; totalErrors: number; startTime: number; }; networkInterceptor: { isIntercepting: boolean; requestCount: number; responseCount: number; config: { maxHistorySize: number; captureRequestBody: boolean; captureResponseBody: boolean; enableTiming: boolean; enableGraphQLParsing: boolean; enableAxiosInterception: boolean; maxBodySize: number; excludePatterns: RegExp[]; includePatterns: RegExp[]; onRequest?: (request: IEnhancedNetworkRequest) => void; onResponse?: (response: IEnhancedNetworkResponse) => void; onError?: (error: Error, request: IEnhancedNetworkRequest) => void; }; metrics: { totalRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; completedRequests?: undefined; graphqlRequestsCount?: undefined; } | { totalRequests: number; completedRequests: number; successRate: number; averageResponseTime: number; totalDataTransferred: number; errorCount: number; slowRequestsCount: number; graphqlRequestsCount: number; }; }; axiosInterceptor: { isIntercepting: boolean; hasRequestInterceptor: boolean; hasResponseInterceptor: boolean; axiosAvailable: boolean; } | undefined; webSocketConnector: { isConnected: boolean; sessionId: string; queueSize: number; reconnectAttempts: number; websocketState: number | undefined; } | undefined; } | undefined; errorReporter: { isActive: boolean; config: { excludePatterns: RegExp[]; websocket: { url: string; reconnectInterval?: number; maxReconnectAttempts?: number; enableHeartbeat?: boolean; heartbeatInterval?: number; }; autoConnect: boolean; enableLogging: boolean; captureConsole: boolean; captureUnhandledErrors: boolean; captureUnhandledRejections: boolean; captureReactErrors: boolean; includeSourceMap: boolean; maxStackFrames: number; enableStateSnapshot: boolean; enableConsoleContext: boolean; enableNetworkContext: boolean; enablePerformanceContext: boolean; bufferErrors: boolean; maxErrorBuffer: number; onError?: (event: IDebugEvent) => void; }; stats: { uptime: number; isActive: boolean; webSocketConnected: boolean; errorDetectorState: { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, "onError">> & { onError?: (event: IDebugEvent) => void; }; }; totalErrors: number; sentErrors: number; bufferedErrors: number; startTime: number; }; errorDetector: { isActive: boolean; breadcrumbsCount: number; config: Required<Omit<IErrorDetectorConfig, "onError">> & { onError?: (event: IDebugEvent) => void; }; }; webSocketConnector: { isConnected: boolean; sessionId: string; queueSize: number; reconnectAttempts: number; websocketState: number | undefined; } | undefined; errorBufferSize: number; } | undefined; stateMapper: { isActive: boolean; totalMappings: number; pendingRequests: number; recentStateChanges: number; learnedPatterns: number; averageConfidence: number; config: { enableAutoMapping: boolean; stateChangeWindow: number; confidenceThreshold: number; maxMappingHistory: number; enablePatternLearning: boolean; excludeStatePatterns: RegExp[]; onMappingCreated?: (mapping: IAPIStateMapping) => void; onStateChange?: (stateChange: IStateChange) => void; }; } | undefined; timeTravelEngine: { snapshotCount: number; maxSnapshots: number; memoryUsage: IMemoryUsage; config: Required<ITimeTravelEngineConfig>; } | undefined; }; /** * API ๋งคํ•‘ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ */ getAPIMappings(): IAPIStateMapping[]; /** * ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํžˆ์Šคํ† ๋ฆฌ */ getNetworkHistory():