eye-analysis
Version:
Eye Analysis - Browser-based eye tracking and screen recording library for research and experiments
294 lines • 7.32 kB
TypeScript
export interface GazePoint {
sessionId: string;
deviceTimeStamp?: number;
systemTimestamp: number;
browserTimestamp: number;
normalized?: boolean;
screenX: number | undefined;
screenY: number | undefined;
screenWidth: number;
screenHeight: number;
contentX: number;
contentY: number;
confidence: number | undefined;
leftEye?: EyeData;
rightEye?: EyeData;
windowState?: WindowState;
}
export interface GazePointInput {
deviceTimeStamp?: number;
systemTimestamp?: number;
normalized?: boolean;
screenX: number | undefined;
screenY: number | undefined;
confidence: number | undefined;
leftEye?: EyeDataInput;
rightEye?: EyeDataInput;
}
export interface EyeDataInput {
screenX: number | undefined;
screenY: number | undefined;
positionX?: number;
positionY?: number;
positionZ?: number;
pupilSize?: number;
rotateX?: number;
rotateY?: number;
rotateZ?: number;
}
export interface EyeData {
screenX: number | undefined;
screenY: number | undefined;
contentX: number;
contentY: number;
positionX?: number;
positionY?: number;
positionZ?: number;
pupilSize?: number;
rotateX?: number;
rotateY?: number;
rotateZ?: number;
}
export interface SessionEvent {
id: string;
sessionId: string;
type: "session_start" | "session_stop" | "recording_start" | "recording_stop" | "user_event";
timestamp: number;
browserTimestamp: number;
data?: Record<string, unknown>;
}
export interface SessionConfig {
participantId: string;
experimentType: string;
sessionId?: string;
}
export interface RecordingConfig {
frameRate?: number;
quality?: "low" | "medium" | "high";
chunkDuration?: number;
captureEntireScreen?: boolean;
videoFormat?: "webm" | "mp4";
videoCodec?: "vp8" | "vp9" | "h264";
}
export type RecordingMode = "current-tab" | "full-screen";
export interface RecorderState {
status: "idle" | "initialized" | "recording" | "stopped" | "error";
currentSession: SessionInfo | null;
isRecording: boolean;
recordingDuration: number;
gazeDataCount: number;
eventsCount: number;
videoChunksCount: number;
error: string | null;
lastUpdate: number;
recordingConfig?: {
availableRecordingModes?: RecordingMode[];
};
startBrowserTime?: number;
recordingStream: MediaStream | null;
}
export interface SessionInfo {
sessionId: string;
participantId: string;
experimentType: string;
startTime: number;
endTime?: number;
config: RecordingConfig;
status?: "recording" | "completed" | "error";
recordingMode: RecordingMode;
recordingReference?: {
screen: ScreenInfo;
window: WindowInfo;
};
actualContentSize?: {
width: number;
height: number;
};
metadata?: {
browser?: string;
screen?: string;
displayWidth?: number;
displayHeight?: number;
userAgent?: string;
duration?: number;
settings?: {
screenRecording?: RecordingConfig;
};
environment?: {
browser?: string;
screen?: string;
displayWidth?: number;
displayHeight?: number;
userAgent?: string;
};
startBrowserTime?: number;
endBrowserTime?: number;
};
}
export interface SessionData {
session: SessionInfo;
events: SessionEvent[];
gazeData: GazePoint[];
videoChunks: VideoChunkInfo[];
metadata: {
totalDuration: number;
gazeDataPoints: number;
eventsCount: number;
chunksCount: number;
exportedAt: string;
startBrowserTime?: number;
endBrowserTime?: number;
};
}
export interface VideoChunkInfo {
id: string;
sessionId: string;
timestamp: number;
chunkIndex: number;
duration: number;
size: number;
}
export interface WindowInfo {
innerWidth: number;
innerHeight: number;
scrollX: number;
scrollY: number;
devicePixelRatio: number;
screenX: number;
screenY: number;
outerWidth: number;
outerHeight: number;
}
export interface ScreenInfo {
width: number;
height: number;
availWidth: number;
availHeight: number;
}
export interface WindowState {
screenX: number;
screenY: number;
scrollX: number;
scrollY: number;
innerWidth: number;
innerHeight: number;
outerWidth: number;
outerHeight: number;
}
export type StateSubscriber = (state: RecorderState) => void;
export interface SyncMarker {
id: string;
sessionId: string;
timestamp: number;
systemTimestamp: number;
browserTimestamp: number;
type: string;
data?: Record<string, unknown>;
}
export interface VideoChunk {
id: string;
sessionId: string;
timestamp: number;
data: Blob;
chunkIndex: number;
duration: number;
}
export interface ExperimentSession {
sessionId: string;
participantId: string;
experimentType: string;
startTime: number;
endTime?: number;
config: RecordingConfig;
status?: "recording" | "completed" | "error";
}
export interface QualityMetrics {
recordingQuality: {
averageFrameRate: number;
frameDrops: number;
duration: number;
};
gazeTrackingQuality: {
averageSamplingRate: number;
dataLossRate: number;
averageConfidence: number;
};
syncQuality: {
maxTimeOffset: number;
averageOffset: number;
quality: "excellent" | "good" | "fair" | "poor";
};
}
export interface ExperimentConfig {
participantId: string;
experimentType: string;
sessionId?: string;
recording?: RecordingConfig;
enableEyeTracking?: boolean;
}
export interface MetadataJSON {
sessionInfo: SessionInfo;
metadata: {
totalDuration: number;
gazeDataPoints: number;
eventsCount: number;
chunksCount: number;
exportedAt: string;
startBrowserTime?: number;
endBrowserTime?: number;
};
videoChunks: Array<VideoChunkInfo & {
note: string;
}>;
summary: {
totalGazePoints: number;
totalEvents: number;
totalVideoChunks: number;
sessionDuration: number;
recordingStartTime: string;
recordingEndTime: string | null;
startBrowserTime?: number;
endBrowserTime?: number;
elapsedTimeNote: string;
};
}
export type RecorderAction = {
type: "INITIALIZE";
} | {
type: "CREATE_SESSION";
payload: SessionInfo;
} | {
type: "UPDATE_SESSION";
payload: SessionInfo;
} | {
type: "START_RECORDING";
} | {
type: "STOP_RECORDING";
} | {
type: "ADD_GAZE_DATA";
payload: GazePoint;
} | {
type: "ADD_EVENT";
payload: SessionEvent;
} | {
type: "UPDATE_DURATION";
payload: number;
} | {
type: "SET_ERROR";
payload: string;
} | {
type: "CLEAR_ERROR";
} | {
type: "RESET";
} | {
type: "CLEAR_SESSION";
} | {
type: "SET_RECORDING_CONFIG";
payload: {
availableRecordingModes?: RecordingMode[];
};
} | {
type: "SET_RECORDING_STREAM";
payload: MediaStream | null;
};
//# sourceMappingURL=types.d.ts.map