debug-time-machine-core
Version:
๐ฐ๏ธ Debug Time Machine Core - ์๊ฐ์ฌํ ์์ง๊ณผ ๋คํธ์ํฌ ์ธํฐ์ ํฐ
1,935 lines (1,924 loc) โข 69.1 kB
text/typescript
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():