@harmoni-org/sdk 0.0.1
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.
- package/LICENSE +21 -0
- package/README.md +694 -0
- package/dist/index.d.mts +712 -0
- package/dist/index.d.ts +712 -0
- package/dist/index.js +2054 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2013 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/errors/ApiError.ts","../src/core/http/HttpClient.ts","../src/modules/auth/AuthModule.ts","../src/modules/user/UserModule.ts","../src/modules/watchTogether/WatchTogetherError.ts","../src/types/actions.ts","../src/types/watchTogether.ts","../src/modules/watchTogether/WatchTogetherModule.ts","../src/sdk/HarmoniSDK.ts","../src/types/player.ts","../src/utils/string.ts","../src/utils/date.ts","../src/utils/object.ts","../src/utils/validation.ts","../src/utils/storage.ts","../src/player/stateDetection.ts","../src/player/PlayerStatusMonitor.ts","../src/player/HTML5VideoController.ts","../src/player/SyncedPlayer.ts"],"names":["axios","io","minLength"],"mappings":"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","file":"index.js","sourcesContent":["export interface ApiErrorResponse {\n message: string;\n code?: string;\n status?: number;\n details?: unknown;\n}\n\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: unknown;\n public readonly isApiError = true;\n\n constructor(message: string, status: number, code?: string, details?: unknown) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): ApiErrorResponse {\n return {\n message: this.message,\n code: this.code,\n status: this.status,\n details: this.details,\n };\n }\n\n static isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError || (error as ApiError)?.isApiError === true;\n }\n}\n\nexport class NetworkError extends ApiError {\n constructor(message = 'Network error occurred') {\n super(message, 0, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends ApiError {\n constructor(message = 'Request timeout') {\n super(message, 408, 'TIMEOUT_ERROR');\n this.name = 'TimeoutError';\n }\n}\n\nexport class UnauthorizedError extends ApiError {\n constructor(message = 'Unauthorized') {\n super(message, 401, 'UNAUTHORIZED');\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(message = 'Forbidden') {\n super(message, 403, 'FORBIDDEN');\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(message = 'Resource not found') {\n super(message, 404, 'NOT_FOUND');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ApiError {\n constructor(message = 'Validation failed', details?: unknown) {\n super(message, 422, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n","import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from 'axios';\nimport {\n ApiError,\n NetworkError,\n TimeoutError,\n UnauthorizedError,\n ForbiddenError,\n NotFoundError,\n ValidationError,\n} from '../errors';\nimport { HttpClientConfig, RequestInterceptor, ResponseInterceptor, RequestConfig } from './types';\n\nexport class HttpClient {\n private client: AxiosInstance;\n private authToken: string | null = null;\n private refreshTokenFn?: () => Promise<string>;\n private retryCount = new Map<string, number>();\n\n constructor(private config: HttpClientConfig) {\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 30000,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n withCredentials: config.withCredentials || false,\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Request interceptor - inject auth token\n this.client.interceptors.request.use(\n (config) => {\n const requestConfig = config as RequestConfig;\n\n // Inject auth token if available and not skipped\n if (this.authToken && !requestConfig.skipAuth) {\n config.headers = config.headers || {};\n config.headers.Authorization = `Bearer ${this.authToken}`;\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(this.handleError(error));\n }\n );\n\n // Response interceptor - handle errors and retry\n this.client.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const originalRequest = error.config as RequestConfig & {\n _retry?: boolean;\n _retryCount?: number;\n };\n\n // Handle 401 - try to refresh token and retry original request\n if (error.response?.status === 401 && !originalRequest._retry && this.refreshTokenFn) {\n originalRequest._retry = true;\n\n try {\n const newToken = await this.refreshTokenFn();\n this.setAuthToken(newToken);\n\n // Update the request with new token\n if (!originalRequest.headers) {\n originalRequest.headers = {};\n }\n originalRequest.headers.Authorization = `Bearer ${newToken}`;\n\n // Retry the original request with new token\n return this.client.request(originalRequest);\n } catch (refreshError) {\n this.authToken = null;\n return Promise.reject(this.handleError(refreshError));\n }\n }\n\n // Handle retry logic for specific status codes\n if (this.shouldRetry(error, originalRequest)) {\n return this.retryRequest(originalRequest);\n }\n\n return Promise.reject(this.handleError(error));\n }\n );\n }\n\n private shouldRetry(error: AxiosError, config?: RequestConfig): boolean {\n if (!config || config.skipRetry) return false;\n\n const retryConfig = this.config.retryConfig;\n if (!retryConfig || !retryConfig.maxRetries) return false;\n\n // Don't retry non-idempotent methods (POST, PATCH, DELETE) by default\n const method = config.method?.toUpperCase();\n const safeToRetry = method === 'GET' || method === 'HEAD' || method === 'OPTIONS';\n if (!safeToRetry && !config._retry) {\n return false;\n }\n\n const requestId = this.getRequestId(config);\n const currentRetries = this.retryCount.get(requestId) || 0;\n\n if (currentRetries >= retryConfig.maxRetries) {\n this.retryCount.delete(requestId);\n return false;\n }\n\n const retryableStatuses = retryConfig.retryableStatuses || [408, 429, 500, 502, 503, 504];\n return error.response ? retryableStatuses.includes(error.response.status) : true;\n }\n\n private async retryRequest(\n config: AxiosRequestConfig & { _retryCount?: number }\n ): Promise<unknown> {\n const requestId = this.getRequestId(config);\n const currentRetries = this.retryCount.get(requestId) || 0;\n this.retryCount.set(requestId, currentRetries + 1);\n\n // Exponential backoff: 1s, 2s, 4s, 8s...\n const delay = this.config.retryConfig?.retryDelay || 1000;\n const backoffDelay = delay * Math.pow(2, currentRetries);\n\n await this.sleep(backoffDelay);\n\n // Track retry count on the config\n config._retryCount = currentRetries + 1;\n\n return this.client.request(config);\n }\n\n private getRequestId(config: AxiosRequestConfig): string {\n return `${config.method}-${config.url}`;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private handleError(error: unknown): ApiError {\n if (ApiError.isApiError(error)) {\n return error as ApiError;\n }\n\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n\n // Network errors\n if (!axiosError.response) {\n if (axiosError.code === 'ECONNABORTED') {\n return new TimeoutError();\n }\n return new NetworkError(axiosError.message);\n }\n\n // HTTP errors\n const status = axiosError.response.status;\n const data = axiosError.response.data as { message?: string; code?: string };\n const message = data?.message || axiosError.message;\n\n switch (status) {\n case 401:\n return new UnauthorizedError(message);\n case 403:\n return new ForbiddenError(message);\n case 404:\n return new NotFoundError(message);\n case 422:\n return new ValidationError(message, data);\n default:\n return new ApiError(message, status, data?.code, data);\n }\n }\n\n // Unknown errors\n return new ApiError(error instanceof Error ? error.message : 'An unknown error occurred', 500);\n }\n\n // Public methods\n public setAuthToken(token: string | null): void {\n this.authToken = token;\n }\n\n public getAuthToken(): string | null {\n return this.authToken;\n }\n\n public setRefreshTokenFunction(fn: () => Promise<string>): void {\n this.refreshTokenFn = fn;\n }\n\n public addRequestInterceptor(interceptor: RequestInterceptor): number {\n return this.client.interceptors.request.use(\n interceptor.onFulfilled as Parameters<typeof this.client.interceptors.request.use>[0],\n interceptor.onRejected as Parameters<typeof this.client.interceptors.request.use>[1]\n );\n }\n\n public addResponseInterceptor(interceptor: ResponseInterceptor): number {\n return this.client.interceptors.response.use(interceptor.onFulfilled, interceptor.onRejected);\n }\n\n public removeRequestInterceptor(id: number): void {\n this.client.interceptors.request.eject(id);\n }\n\n public removeResponseInterceptor(id: number): void {\n this.client.interceptors.response.eject(id);\n }\n\n // HTTP methods\n public async get<T>(url: string, config?: RequestConfig): Promise<T> {\n const response = await this.client.get<T>(url, config);\n return response.data;\n }\n\n public async post<T>(url: string, data?: unknown, config?: RequestConfig): Promise<T> {\n // Handle FormData properly\n const requestConfig = { ...config };\n if (data instanceof FormData) {\n requestConfig.headers = {\n ...requestConfig.headers,\n 'Content-Type': 'multipart/form-data',\n };\n }\n\n const response = await this.client.post<T>(url, data, requestConfig);\n return response.data;\n }\n\n public async put<T>(url: string, data?: unknown, config?: RequestConfig): Promise<T> {\n // Handle FormData properly\n const requestConfig = { ...config };\n if (data instanceof FormData) {\n requestConfig.headers = {\n ...requestConfig.headers,\n 'Content-Type': 'multipart/form-data',\n };\n }\n\n const response = await this.client.put<T>(url, data, requestConfig);\n return response.data;\n }\n\n public async patch<T>(url: string, data?: unknown, config?: RequestConfig): Promise<T> {\n // Handle FormData properly\n const requestConfig = { ...config };\n if (data instanceof FormData) {\n requestConfig.headers = {\n ...requestConfig.headers,\n 'Content-Type': 'multipart/form-data',\n };\n }\n\n const response = await this.client.patch<T>(url, data, requestConfig);\n return response.data;\n }\n\n public async delete<T>(url: string, config?: RequestConfig): Promise<T> {\n const response = await this.client.delete<T>(url, config);\n return response.data;\n }\n}\n","import { HttpClient } from '../../core/http';\nimport {\n LoginCredentials,\n LoginResponse,\n RegisterData,\n RegisterResponse,\n User,\n VerifyTokenResponse,\n RefreshTokenResponse,\n} from '../../types';\n\nexport class AuthModule {\n constructor(private http: HttpClient) {}\n\n /**\n * Authenticates the user by calling the login endpoint.\n * @param credentials - The login request payload containing emailOrUsername and password.\n * @returns The logged-in user information including the access token.\n */\n async login(credentials: LoginCredentials): Promise<User> {\n const response = await this.http.post<LoginResponse>('/auth/login', credentials, {\n skipAuth: true,\n });\n\n const { user, accessToken, refreshToken } = response;\n\n // Automatically set the auth token\n this.http.setAuthToken(accessToken);\n\n // Map userId to id for consistency\n const normalizedUser = {\n ...user,\n id: (user as any).userId || user.id,\n token: accessToken,\n refreshToken,\n };\n\n return normalizedUser;\n }\n\n /**\n * Registers a new user by calling the registration endpoint.\n * @param registrationData - The registration request payload containing username, password, and optionally email.\n * @returns The newly created user information including the access token.\n */\n async register(data: RegisterData): Promise<User> {\n const response = await this.http.post<RegisterResponse>('/auth/register', data, {\n skipAuth: true,\n });\n\n const { user, accessToken, refreshToken } = response;\n\n // Automatically set the auth token\n this.http.setAuthToken(accessToken);\n\n // Map userId to id for consistency\n const normalizedUser = {\n ...user,\n id: (user as any).userId || user.id,\n token: accessToken,\n refreshToken,\n };\n\n return normalizedUser;\n }\n\n /**\n * Verifies if the provided JWT token is valid.\n * @returns The user information if the token is valid.\n */\n async verifyToken(): Promise<VerifyTokenResponse> {\n const response = await this.http.get<VerifyTokenResponse>('/auth/verify-token');\n\n // Map userId to id for consistency\n if (response.user && (response.user as any).userId) {\n response.user.id = (response.user as any).userId;\n }\n\n return response;\n }\n\n /**\n * Refreshes the access token using the stored refresh token.\n * @returns The newly issued access token.\n */\n async refreshAccessToken(): Promise<string> {\n const response = await this.http.get<RefreshTokenResponse>('/auth/refresh-token');\n const { accessToken } = response;\n\n // Automatically set the new auth token\n this.http.setAuthToken(accessToken);\n\n return accessToken;\n }\n\n /**\n * Checks if the provided email is unique (not already registered).\n * @param email - The email address to check.\n * @returns True if the email is unique, otherwise false.\n */\n async isEmailUnique(email: string): Promise<boolean> {\n const response = await this.http.get<{ isUnique: boolean }>(`/auth/check-email/${email}`, {\n skipAuth: true,\n });\n return response.isUnique;\n }\n\n /**\n * Checks if the provided username is unique (not already taken).\n * @param username - The username to check.\n * @returns True if the username is unique, otherwise false.\n */\n async isUsernameUnique(username: string): Promise<boolean> {\n const response = await this.http.get<{ isUnique: boolean }>(\n `/auth/check-username/${username}`,\n { skipAuth: true }\n );\n return response.isUnique;\n }\n\n /**\n * Logout the current user\n */\n async logout(): Promise<void> {\n this.http.setAuthToken(null);\n // If you have a logout endpoint on your backend, uncomment:\n // await this.http.post('/auth/logout');\n }\n\n /**\n * Request password reset\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.http.post('/auth/password/reset-request', { email }, { skipAuth: true });\n }\n\n /**\n * Reset password with token\n */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.http.post('/auth/password/reset', { token, newPassword }, { skipAuth: true });\n }\n\n /**\n * Change password for authenticated user\n */\n async changePassword(currentPassword: string, newPassword: string): Promise<void> {\n await this.http.post('/auth/password/change', {\n currentPassword,\n newPassword,\n });\n }\n\n /**\n * Verify email with token\n */\n async verifyEmail(token: string): Promise<void> {\n await this.http.post('/auth/email/verify', { token }, { skipAuth: true });\n }\n\n /**\n * Resend verification email\n */\n async resendVerificationEmail(email: string): Promise<void> {\n await this.http.post('/auth/email/resend', { email }, { skipAuth: true });\n }\n}\n","import { HttpClient } from '../../core/http';\nimport { BaseUser, PaginatedResponse, PaginationParams, FilterParams } from '../../types';\n\nexport interface UpdateUserData {\n username?: string;\n email?: string;\n}\n\nexport interface UserProfile extends BaseUser {\n bio?: string;\n avatar?: string;\n phone?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport class UserModule {\n constructor(private http: HttpClient) {}\n\n /**\n * Get user by ID\n */\n async getById(userId: string): Promise<UserProfile> {\n return this.http.get<UserProfile>(`/users/${userId}`);\n }\n\n /**\n * Get current user profile\n */\n async getCurrentUser(): Promise<UserProfile> {\n return this.http.get<UserProfile>('/users/me');\n }\n\n /**\n * Update current user profile\n */\n async updateProfile(data: UpdateUserData): Promise<UserProfile> {\n return this.http.patch<UserProfile>('/users/me', data);\n }\n\n /**\n * Delete current user account\n */\n async deleteAccount(): Promise<void> {\n await this.http.delete('/users/me');\n }\n\n /**\n * Get list of users with pagination and filters\n */\n async list(params?: PaginationParams & FilterParams): Promise<PaginatedResponse<BaseUser>> {\n return this.http.get<PaginatedResponse<BaseUser>>('/users', { params });\n }\n\n /**\n * Search users by query\n */\n async search(query: string, params?: PaginationParams): Promise<PaginatedResponse<BaseUser>> {\n return this.http.get<PaginatedResponse<BaseUser>>('/users/search', {\n params: { query, ...params },\n });\n }\n\n /**\n * Upload user avatar\n */\n async uploadAvatar(file: File | Blob, fileName?: string): Promise<{ url: string }> {\n const formData = new FormData();\n formData.append('avatar', file, fileName);\n\n // No need to set Content-Type header - FormData will set it with boundary\n // The HttpClient will handle this automatically\n return this.http.post<{ url: string }>('/users/me/avatar', formData);\n }\n\n /**\n * Delete user avatar\n */\n async deleteAvatar(): Promise<void> {\n await this.http.delete('/users/me/avatar');\n }\n}\n","/**\n * Watch Together Error Class\n */\n\nexport class WatchTogetherError extends Error {\n public readonly isWatchTogetherError = true;\n\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'WatchTogetherError';\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WatchTogetherError);\n }\n }\n\n toJSON(): {\n name: string;\n message: string;\n code: string;\n details?: Record<string, unknown>;\n } {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n details: this.details,\n };\n }\n\n static isWatchTogetherError(error: unknown): error is WatchTogetherError {\n return (\n error instanceof WatchTogetherError ||\n (error as WatchTogetherError)?.isWatchTogetherError === true\n );\n }\n}\n","/**\n * User Action Types\n *\n * Shared action constants for player state changes and Watch Together sync.\n */\n\n/**\n * User action events detected from player state changes.\n */\nexport const USER_ACTIONS = {\n // Core playback actions (synced with Watch Together)\n PLAY: 'PLAY',\n PAUSE: 'PAUSE',\n SEEK: 'SEEK',\n\n // File/media actions\n FILE_UPDATE: 'FILE_UPDATE',\n\n // Advanced actions (may not be synced)\n STOP: 'STOP',\n VOLUME_UPDATE: 'VOLUME_UPDATE',\n ENTER_FULLSCREEN: 'ENTER_FULLSCREEN',\n EXIT_FULLSCREEN: 'EXIT_FULLSCREEN',\n SPEED_UPDATE: 'SPEED_UPDATE',\n AUDIO_DELAY_UPDATE: 'AUDIO_DELAY_UPDATE',\n SUBTITLE_DELAY_UPDATE: 'SUBTITLE_DELAY_UPDATE',\n ASPECT_RATIO_UPDATE: 'ASPECT_RATIO_UPDATE',\n TOGGLE_REPEAT: 'TOGGLE_REPEAT',\n TOGGLE_LOOP: 'TOGGLE_LOOP',\n VIDEO_EFFECT_UPDATE: 'VIDEO_EFFECT_UPDATE',\n AUDIO_FILTER_UPDATE: 'AUDIO_FILTER_UPDATE',\n TOGGLE_RANDOM: 'TOGGLE_RANDOM',\n API_VERSION_UPDATE: 'API_VERSION_UPDATE',\n PLAYLIST_UPDATE: 'PLAYLIST_UPDATE',\n TITLE_OR_CHAPTER_UPDATE: 'TITLE_OR_CHAPTER_UPDATE',\n NO_CHANGE: 'NO_CHANGE',\n} as const;\n\nexport type UserActionType = (typeof USER_ACTIONS)[keyof typeof USER_ACTIONS];\n","/**\n * Watch Together Types & Interfaces\n */\n\n// ============================================\n// SYNC STATE\n// ============================================\nexport interface SyncState {\n time: number; // Current playback time in seconds\n isPlaying: boolean; // Whether video is currently playing\n lastUpdated: number; // Timestamp for sync validation\n syncErrorMargin: number; // Acceptable sync difference in seconds\n}\n\n// ============================================\n// ROOM INFORMATION\n// ============================================\nexport interface RoomInfo {\n name: string;\n description?: string;\n ownerId: string;\n isPrivate: boolean;\n status: string;\n createdAt: number;\n lastActivity: number;\n roomType: string;\n}\n\n// ============================================\n// ROOM MEMBER\n// ============================================\nexport interface RoomMember {\n userId: string;\n username: string;\n clientId: string;\n active: boolean;\n role: string; // 'host' | 'member'\n typing: boolean;\n lastActivity: number;\n}\n\n// ============================================\n// FILE INFORMATION\n// ============================================\nexport interface FileInfo {\n fileId: string;\n userId: string;\n name: string;\n fullTime: number; // Duration in seconds\n hash: string;\n}\n\n// ============================================\n// CHAT MESSAGE\n// ============================================\nexport interface ChatMessage {\n messageId: string;\n userId: string;\n username: string;\n content: string;\n timestamp: string; // ISO date string\n systemMessage?: boolean;\n replyTo?: string; // messageId of replied message\n edited?: boolean;\n deleted?: boolean;\n}\n\n// ============================================\n// ROOM (COMPLETE)\n// ============================================\nexport interface Room {\n roomId: string;\n roomInfo: RoomInfo;\n syncState: SyncState;\n members: RoomMember[];\n files: FileInfo[];\n chat: ChatMessage[];\n}\n\n// ============================================\n// ROOM UPDATE (FOR PARTIAL UPDATES)\n// ============================================\nexport interface RoomUpdate {\n roomId: string;\n roomUpdates: Partial<Room>;\n metadata: {\n action: string; // SyncAction value\n userId: string;\n username?: string;\n };\n}\n\n// ============================================\n// SYNC ACTIONS\n// ============================================\nexport const SyncActions = {\n PLAY: 'play',\n PAUSE: 'pause',\n SEEK: 'seek',\n} as const;\n\nexport type SyncAction = (typeof SyncActions)[keyof typeof SyncActions];\n\n// ============================================\n// USER ACTIONS (LOCAL PLAYER EVENTS)\n// ============================================\n// Re-export shared action types\nexport { USER_ACTIONS, type UserActionType } from './actions';\n\n// ============================================\n// PAYLOAD TYPES\n// ============================================\n\n// Join Room Payload\nexport interface JoinRoomPayload {\n roomId?: string; // If joining existing room\n roomName?: string; // If creating new room\n password?: string; // If room is password protected\n}\n\n// Sync Update Payload\nexport interface SyncUpdatePayload {\n roomId: string;\n action: SyncAction; // 'play' | 'pause' | 'seek'\n value?: number; // Required for 'seek' action (time in seconds)\n}\n\n// File Info Update Payload\nexport interface UpdateFileInfoPayload {\n roomId: string;\n fileInfo: {\n fileId: string;\n name: string;\n fullTime: number;\n hash: string;\n };\n}\n\n// Chat Send Payload\nexport interface ChatSendPayload {\n roomId: string;\n text: string;\n tempMessageId?: string; // For optimistic updates\n}\n\n// ============================================\n// ERROR CODES\n// ============================================\nexport const WatchTogetherErrorCodes = {\n ROOM_NOT_FOUND: 'ROOM_NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ROOM_FULL: 'ROOM_FULL',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n NOT_IN_ROOM: 'NOT_IN_ROOM',\n PERMISSION_DENIED: 'PERMISSION_DENIED',\n CONNECTION_ERROR: 'CONNECTION_ERROR',\n ALREADY_IN_ROOM: 'ALREADY_IN_ROOM',\n} as const;\n\n// ============================================\n// CONSTANTS\n// ============================================\nexport const WatchTogetherConstants = {\n NAMESPACE: '/watch-together',\n SYNC_CHECK_INTERVAL_MS: 30000, // 30 seconds\n SYNC_TOLERANCE_SECONDS: 1, // Time difference tolerance\n MAX_RECONNECT_ATTEMPTS: 5,\n RECONNECT_DELAY_MS: 2000,\n} as const;\n\n// UI Element IDs (for desktop app integration)\nexport const WatchTogetherIDs = {\n JOIN_ROOM_INPUT: 'join-room-code',\n JOIN_AND_INVITE_SECTION: 'join-invite-section',\n JOIN_BUTTON: 'join-room-button',\n START_BUTTON: 'watchtogether-start-button',\n LEAVE_BUTTON: 'watchtogether-leave-button',\n JOINED_ROOM_SECTION: 'joined-room-section',\n ACTION_SECTION: 'watchtogether-action-section',\n CREATE_ROOM_BUTTON: 'watchtogether-create-room-button',\n};\n\n// Section Names\nexport const SECTION_NAMES = {\n JOIN_AND_INVITE: 'JOIN_AND_INVITE',\n JOINED_ROOM: 'JOINED_ROOM',\n};\n\n// User-facing Messages\nexport const WatchTogetherMessages = {\n START_SUCCESS: 'WatchTogether session started successfully!',\n JOIN_SUCCESS: 'Joined the WatchTogether session!',\n LEAVE_SUCCESS: 'You have left the WatchTogether session.',\n INVALID_ARGS: 'Missing required arguments. Please check the usage.',\n CONNECTION_SUCCESS: 'Connected to WatchTogether service.',\n DISCONNECTED: 'Disconnected from WatchTogether service.',\n};\n","/**\n * Watch Together Module\n *\n * Provides real-time synchronized video playback using WebSocket (Socket.IO)\n */\n\nimport { io, Socket, ManagerOptions, SocketOptions } from 'socket.io-client';\nimport type { HttpClient } from '../../core/http';\nimport { WatchTogetherError } from './WatchTogetherError';\nimport type {\n Room,\n RoomUpdate,\n SyncState,\n ChatMessage,\n JoinRoomPayload,\n SyncAction,\n FileInfo,\n} from '../../types/watchTogether';\nimport { WatchTogetherConstants } from '../../types/watchTogether';\n\ntype EventCallback<T> = (data: T) => void;\n\nexport interface WatchTogetherConfig {\n baseURL: string;\n namespace?: string;\n autoConnect?: boolean; // Auto-connect on SDK init\n persistentConnection?: boolean; // Keep connection always on\n}\n\nexport interface ConnectionStatus {\n connected: boolean;\n connecting: boolean;\n authenticated: boolean;\n inRoom: boolean;\n roomId: string | null;\n error: string | null;\n}\n\nexport class WatchTogetherModule {\n private socket: Socket | null = null;\n private currentRoom: Room | null = null;\n private syncInterval: NodeJS.Timeout | null = null;\n private eventListeners: Map<string, Set<EventCallback<unknown>>> = new Map();\n private connectionStatus: ConnectionStatus = {\n connected: false,\n connecting: false,\n authenticated: false,\n inRoom: false,\n roomId: null,\n error: null,\n };\n private shouldStayConnected = false; // Flag for persistent connection\n\n constructor(\n private http: HttpClient,\n private config: WatchTogetherConfig\n ) {\n // Auto-connect if enabled\n if (config.autoConnect || config.persistentConnection) {\n this.initializePersistentConnection();\n }\n }\n\n /**\n * Initialize persistent connection (always on)\n */\n private initializePersistentConnection(): void {\n this.shouldStayConnected = true;\n\n // Try to connect immediately\n this.connect().catch(() => {\n // Retry connection in 2 seconds if fails\n setTimeout(() => {\n if (this.shouldStayConnected) {\n this.initializePersistentConnection();\n }\n }, 2000);\n });\n }\n\n /**\n * Connect to the Watch Together service\n */\n async connect(): Promise<void> {\n // If already connected, just return\n if (this.socket?.connected) {\n this.updateConnectionStatus({ connected: true, connecting: false });\n return;\n }\n\n // If persistent mode, always try to connect (even without auth)\n const isPersistent = this.config.persistentConnection || this.shouldStayConnected;\n const token = this.http.getAuthToken();\n\n if (!token && !isPersistent) {\n throw new WatchTogetherError('Authentication required. Please login first.', 'UNAUTHORIZED');\n }\n\n this.updateConnectionStatus({ connecting: true, error: null });\n\n const namespace = this.config.namespace || WatchTogetherConstants.NAMESPACE;\n const url = `${this.config.baseURL}${namespace}`;\n\n // Configure socket with persistent reconnection\n const socketOptions: Partial<ManagerOptions & SocketOptions> = {\n query: { connectionId: 'watchTogether' },\n forceNew: !this.socket, // Reuse socket if exists\n reconnection: true,\n reconnectionAttempts: Infinity, // Infinite reconnection attempts\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n timeout: 10000,\n };\n\n // Add auth header if token available\n if (token) {\n socketOptions.extraHeaders = {\n Authorization: `Bearer ${token}`,\n };\n this.updateConnectionStatus({ authenticated: true });\n }\n\n this.socket = io(url, socketOptions);\n this.setupSocketListeners();\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (!isPersistent) {\n reject(new WatchTogetherError('Connection timeout', 'CONNECTION_ERROR'));\n } else {\n // In persistent mode, resolve anyway - reconnection will happen\n resolve();\n }\n }, 10000);\n\n this.socket!.once('connect', () => {\n clearTimeout(timeout);\n this.updateConnectionStatus({\n connected: true,\n connecting: false,\n error: null,\n });\n this.emit('connect', undefined);\n resolve();\n });\n\n this.socket!.once('connect_error', (error) => {\n clearTimeout(timeout);\n this.updateConnectionStatus({\n connected: false,\n connecting: false,\n error: error.message,\n });\n\n if (!isPersistent) {\n reject(new WatchTogetherError(error.message || 'Connection failed', 'CONNECTION_ERROR'));\n } else {\n // In persistent mode, keep trying\n resolve();\n }\n });\n });\n }\n\n /**\n * Disconnect from the Watch Together service\n */\n disconnect(): void {\n this.shouldStayConnected = false; // Stop persistent connection\n this.stopSyncCheck();\n\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n this.socket = null;\n }\n\n this.currentRoom = null;\n this.updateConnectionStatus({\n connected: false,\n connecting: false,\n authenticated: false,\n inRoom: false,\n roomId: null,\n });\n this.emit('disconnect', 'manual');\n }\n\n /**\n * Enable persistent connection mode (always on)\n */\n enablePersistentConnection(): void {\n if (!this.shouldStayConnected) {\n this.shouldStayConnected = true;\n this.initializePersistentConnection();\n }\n }\n\n /**\n * Disable persistent connection mode\n */\n disablePersistentConnection(): void {\n this.shouldStayConnected = false;\n }\n\n /**\n * Create a new room\n */\n async createRoom(options?: { roomName?: string }): Promise<Room> {\n this.ensureConnected();\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new WatchTogetherError('Create room timeout', 'CONNECTION_ERROR'));\n }, 5000);\n\n this.socket!.once('roomState', (room: Room) => {\n clearTimeout(timeout);\n this.currentRoom = room;\n this.startSyncCheck();\n resolve(room);\n });\n\n this.socket!.once('error', (error: { code: string; message: string }) => {\n clearTimeout(timeout);\n reject(new WatchTogetherError(error.message, error.code));\n });\n\n this.socket!.emit('createRoom', options || {});\n });\n }\n\n /**\n * Join an existing room or create a new one\n */\n async joinRoom(options: JoinRoomPayload): Promise<Room> {\n this.ensureConnected();\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new WatchTogetherError('Join room timeout', 'CONNECTION_ERROR'));\n }, 5000);\n\n this.socket!.once('roomState', (room: Room) => {\n clearTimeout(timeout);\n this.currentRoom = room;\n this.updateConnectionStatus({\n inRoom: true,\n roomId: room.roomId,\n });\n this.startSyncCheck();\n resolve(room);\n });\n\n this.socket!.once('error', (error: { code: string; message: string }) => {\n clearTimeout(timeout);\n reject(new WatchTogetherError(error.message, error.code));\n });\n\n this.socket!.emit('joinRoom', options);\n });\n }\n\n /**\n * Leave the current room\n */\n leaveRoom(): void {\n if (!this.currentRoom) {\n return;\n }\n\n this.ensureConnected();\n this.stopSyncCheck();\n\n this.socket!.emit('leaveRoom', { roomId: this.currentRoom.roomId });\n this.currentRoom = null;\n this.updateConnectionStatus({\n inRoom: false,\n roomId: null,\n });\n }\n\n /**\n * Play the video (synced to all users)\n */\n play(): void {\n this.ensureInRoom();\n this.updateSyncState('play');\n }\n\n /**\n * Pause the video (synced to all users)\n */\n pause(): void {\n this.ensureInRoom();\n this.updateSyncState('pause');\n }\n\n /**\n * Seek to a specific time (synced to all users)\n */\n seek(timeInSeconds: number): void {\n this.ensureInRoom();\n this.updateSyncState('seek', timeInSeconds);\n }\n\n /**\n * Request sync state from server\n */\n requestSync(): void {\n this.ensureInRoom();\n this.socket!.emit('checkSync', { roomId: this.currentRoom!.roomId });\n }\n\n /**\n * Update current file information\n */\n updateFileInfo(fileInfo: Omit<FileInfo, 'userId'>): void {\n this.ensureInRoom();\n\n this.socket!.emit('updateFileInfo', {\n roomId: this.currentRoom!.roomId,\n fileInfo,\n });\n }\n\n /**\n * Send a chat message\n */\n async sendMessage(text: string): Promise<void> {\n this.ensureInRoom();\n\n const tempMessageId = `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new WatchTogetherError('Send message timeout', 'CONNECTION_ERROR'));\n }, 5000);\n\n this.socket!.once('chat:ack', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.socket!.once('chat:error', (error: { message: string }) => {\n clearTimeout(timeout);\n reject(new WatchTogetherError(error.message, 'CHAT_ERROR'));\n });\n\n this.socket!.emit('chat:send', {\n roomId: this.currentRoom!.roomId,\n text,\n tempMessageId,\n });\n });\n }\n\n /**\n * Get chat history for current room\n */\n getChatHistory(): ChatMessage[] {\n return this.currentRoom?.chat || [];\n }\n\n /**\n * Get current room state\n */\n getCurrentRoom(): Room | null {\n return this.currentRoom;\n }\n\n /**\n * Check if connected to the service\n */\n isConnected(): boolean {\n return this.socket?.connected || false;\n }\n\n /**\n * Check if currently in a room\n */\n isInRoom(): boolean {\n return this.currentRoom !== null;\n }\n\n /**\n * Get current connection status\n */\n getConnectionStatus(): ConnectionStatus {\n return { ...this.connectionStatus };\n }\n\n /**\n * Check if user is online (connected to socket)\n */\n isOnline(): boolean {\n return this.connectionStatus.connected;\n }\n\n // ============================================\n // EVENT LISTENERS\n // ============================================\n\n /**\n * Listen for room state events\n */\n onRoomState(callback: EventCallback<Room>): () => void {\n return this.addEventListener('roomState', callback);\n }\n\n /**\n * Listen for room update events\n */\n onRoomUpdate(callback: EventCallback<RoomUpdate>): () => void {\n return this.addEventListener('roomUpdates', callback);\n }\n\n /**\n * Listen for sync state events\n */\n onSyncState(callback: EventCallback<SyncState>): () => void {\n return this.addEventListener('syncState', callback);\n }\n\n /**\n * Listen for chat messages\n */\n onChatMessage(callback: EventCallback<ChatMessage>): () => void {\n return this.addEventListener('chat:receive', callback);\n }\n\n /**\n * Listen for system messages\n */\n onSystemMessage(callback: EventCallback<ChatMessage>): () => void {\n return this.addEventListener('newMessage', callback);\n }\n\n /**\n * Listen for chat history\n */\n onChatHistory(callback: EventCallback<ChatMessage[]>): () => void {\n return this.addEventListener('chatHistory', callback);\n }\n\n /**\n * Listen for errors\n */\n onError(callback: EventCallback<{ code: string; message: string }>): () => void {\n return this.addEventListener('error', callback);\n }\n\n /**\n * Listen for connection events\n */\n onConnect(callback: EventCallback<void>): () => void {\n return this.addEventListener('connect', callback);\n }\n\n /**\n * Listen for disconnection events\n */\n onDisconnect(callback: EventCallback<string>): () => void {\n return this.addEventListener('disconnect', callback);\n }\n\n /**\n * Listen for connection status changes\n */\n onConnectionStatusChange(callback: EventCallback<ConnectionStatus>): () => void {\n return this.addEventListener('connectionStatusChange', callback);\n }\n\n /**\n * Listen for online/offline status\n */\n onOnlineStatusChange(callback: EventCallback<boolean>): () => void {\n return this.addEventListener('onlineStatusChange', callback);\n }\n\n // ============================================\n // PRIVATE METHODS\n // ============================================\n\n private setupSocketListeners(): void {\n if (!this.socket) return;\n\n // Room events\n this.socket.on('roomState', (room: Room) => {\n this.currentRoom = room;\n this.updateConnectionStatus({\n inRoom: true,\n roomId: room.roomId,\n });\n this.emit('roomState', room);\n });\n\n this.socket.on('roomUpdates', (update: RoomUpdate) => {\n // Update local room state\n if (this.currentRoom && update.roomUpdates) {\n this.currentRoom = {\n ...this.currentRoom,\n ...update.roomUpdates,\n };\n }\n this.emit('roomUpdates', update);\n });\n\n // Sync events\n this.socket.on('syncState', (syncState: SyncState) => {\n if (this.currentRoom) {\n this.currentRoom.syncState = syncState;\n }\n this.emit('syncState', syncState);\n });\n\n // Chat events\n this.socket.on('chat:receive', (data: { message: ChatMessage }) => {\n if (this.currentRoom) {\n this.currentRoom.chat.push(data.message);\n }\n this.emit('chat:receive', data.message);\n });\n\n this.socket.on('newMessage', (data: { message: ChatMessage }) => {\n const message = { ...data.message, systemMessage: true };\n if (this.currentRoom) {\n this.currentRoom.chat.push(message);\n }\n this.emit('newMessage', message);\n });\n\n this.socket.on('chatHistory', (data: { messages: ChatMessage[] }) => {\n if (this.currentRoom) {\n this.currentRoom.chat = data.messages;\n }\n this.emit('chatHistory', data.messages);\n });\n\n this.socket.on('chat:ack', (data: { message: ChatMessage }) => {\n this.emit('chat:ack', data.message);\n });\n\n this.socket.on('chat:error', (data: { message: string }) => {\n this.emit('chat:error', data);\n });\n\n // Error events\n this.socket.on('error', (data: { code: string; message: string }) => {\n this.updateConnectionStatus({ error: data.message });\n this.emit('error', data);\n });\n\n // Connection events\n this.socket.on('connect', () => {\n this.updateConnectionStatus({\n connected: true,\n connecting: false,\n error: null,\n });\n });\n\n this.socket.on('disconnect', (reason: string) => {\n this.stopSyncCheck();\n this.updateConnectionStatus({\n connected: false,\n error: `Disconnected: ${reason}`,\n });\n this.emit('disconnect', reason);\n\n // Auto-reconnect in persistent mode\n if (this.shouldStayConnected) {\n setTimeout(() => {\n if (this.shouldStayConnected && !this.socket?.connected) {\n this.connect().catch(() => {\n // Will retry again\n });\n }\n }, 2000);\n }\n });\n\n this.socket.on('connect_error', async (error: Error) => {\n this.updateConnectionStatus({\n connected: false,\n connecting: false,\n error: error.message,\n });\n\n // Try to refresh token if unauthorized\n if (error.message.includes('Unauthorized') || error.message.includes('401')) {\n try {\n await this.refreshTokenAndReconnect();\n } catch {\n this.emit('error', {\n code: 'UNAUTHORIZED',\n message: 'Session expired. Please login again.',\n });\n }\n }\n\n // In persistent mode, keep trying\n if (this.shouldStayConnected) {\n setTimeout(() => {\n if (this.shouldStayConnected && !this.socket?.connected) {\n this.connect().catch(() => {\n // Will retry again\n });\n }\n }, 3000);\n }\n });\n\n this.socket.on('reconnect_attempt', (attempt: number) => {\n this.updateConnectionStatus({\n connecting: true,\n error: `Reconnecting (attempt ${attempt})...`,\n });\n });\n\n this.socket.on('reconnect', (_attempt: number) => {\n this.updateConnectionStatus({\n connected: true,\n connecting: false,\n error: null,\n });\n this.emit('connect', undefined);\n });\n\n this.socket.on('reconnect_failed', () => {\n this.updateConnectionStatus({\n connected: false,\n connecting: false,\n error: 'Reconnection failed',\n });\n\n // Keep trying in persistent mode\n if (this.shouldStayConnected) {\n setTimeout(() => {\n if (this.shouldStayConnected) {\n this.connect().catch(() => {});\n }\n }, 5000);\n }\n });\n }\n\n private async refreshTokenAndReconnect(): Promise<void> {\n // This would typically call the auth module's refresh method\n // For now, we'll just disconnect and let the app handle re-auth\n if (!this.shouldStayConnected) {\n this.disconnect();\n throw new WatchTogetherError('Session expired. Please login again.', 'UNAUTHORIZED');\n }\n // In persistent mode, keep connection but mark as not authenticated\n this.updateConnectionStatus({ authenticated: false });\n }\n\n /**\n * Update authentication token after refresh\n */\n updateAuthToken(token: string): void {\n if (this.socket && this.socket.io.opts.extraHeaders) {\n this.socket.io.opts.extraHeaders.Authorization = `Bearer ${token}`;\n this.updateConnectionStatus({ authenticated: true, error: null });\n\n // Reconnect with new token\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n }\n\n /**\n * Update connection status and emit events\n */\n private updateConnectionStatus(updates: Partial<ConnectionStatus>): void {\n const previousOnlineStatus = this.connectionStatus.connected;\n\n this.connectionStatus = {\n ...this.connectionStatus,\n ...updates,\n };\n\n // Emit status change event\n this.emit('connectionStatusChange', this.connectionStatus);\n\n // Emit online/offline event if changed\n if (previousOnlineStatus !== this.connectionStatus.connected) {\n this.emit('onlineStatusChange', this.connectionStatus.connected);\n }\n }\n\n private updateSyncState(action: SyncAction, value?: number): void {\n this.ensureInRoom();\n\n const payload: { roomId: string; action: SyncAction; value?: number } = {\n roomId: this.currentRoom!.roomId,\n action,\n };\n\n if (action === 'seek' && value !== undefined) {\n payload.value = value;\n }\n\n this.socket!.emit('updateSyncState', payload);\n }\n\n private startSyncCheck(): void {\n this.stopSyncCheck();\n\n this.syncInterval = setInterval(() => {\n if (this.currentRoom && this.socket?.connected) {\n this.socket.emit('checkSync', { roomId: this.currentRoom.roomId });\n }\n }, WatchTogetherConstants.SYNC_CHECK_INTERVAL_MS);\n }\n\n private stopSyncCheck(): void {\n if (this.syncInterval) {\n clearInterval(this.syncInterval);\n this.syncInterval = null;\n }\n }\n\n private ensureConnected(): void {\n if (!this.socket?.connected) {\n throw new WatchTogetherError(\n 'Not connected. Please call connect() first.',\n 'CONNECTION_ERROR'\n );\n }\n }\n\n private ensureInRoom(): void {\n this.ensureConnected();\n if (!this.currentRoom) {\n throw new WatchTogetherError(\n 'Not in a room. Please join or create a room first.',\n 'NOT_IN_ROOM'\n );\n }\n }\n\n private addEventListener<T>(event: string, callback: EventCallback<T>): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n\n this.eventListeners.get(event)!.add(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(callback as EventCallback<unknown>);\n }\n };\n }\n\n private emit<T>(event: string, data: T): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n}\n","import { HttpClient, HttpClientConfig } from '../core/http';\nimport { AuthModule } from '../modules/auth';\nimport { UserModule } from '../modules/user';\nimport { WatchTogetherModule } from '../modules/watchTogether';\n\nexport interface HarmoniSDKConfig extends HttpClientConfig {\n // Add any SDK-specific config here\n autoRefreshToken?: boolean;\n watchTogetherNamespace?: string;\n persistentConnection?: boolean; // Keep Watch Together always connected\n}\n\nexport class HarmoniSDK {\n private httpClient: HttpClient;\n\n // Modules\n public readonly auth: AuthModule;\n public readonly user: UserModule;\n public readonly watchTogether: WatchTogetherModule;\n\n constructor(config: HarmoniSDKConfig) {\n // Initialize HTTP client\n this.httpClient = new HttpClient(config);\n\n // Setup auto token refresh if enabled\n if (config.autoRefreshToken) {\n this.setupAutoRefresh();\n }\n\n // Initialize modules\n this.auth = new AuthModule(this.httpClient);\n this.user = new UserModule(this.httpClient);\n this.watchTogether = new WatchTogetherModule(this.httpClient, {\n baseURL: config.baseURL,\n namespace: config.watchTogetherNamespace,\n persistentConnection: config.persistentConnection,\n });\n }\n\n /**\n * Setup automatic token refresh\n */\n private setupAutoRefresh(): void {\n // This would be called when a 401 is encountered\n this.httpClient.setRefreshTokenFunction(async () => {\n // Call refresh endpoint (uses cookies/headers for refresh token)\n const accessToken = await this.auth.refreshAccessToken();\n\n // Store new access token\n this.storeAccessToken(accessToken);\n\n return accessToken;\n });\n }\n\n /**\n * Set authentication token\n */\n public setAuthToken(token: string | null): void {\n this.httpClient.setAuthToken(token);\n }\n\n /**\n * Get current authentication token\n */\n public getAuthToken(): string | null {\n return this.httpClient.getAuthToken();\n }\n\n /**\n * Store access token (override this method or use storage)\n */\n private storeAccessToken(accessToken: string): void {\n // This is a placeholder - you can implement storage logic\n if (typeof globalThis !== 'undefined' && 'localStorage' in globalThis) {\n const storage = (globalThis as Record<string, unknown>).localStorage as\n | { setItem: (key: string, value: string) => void }\n | undefined;\n storage?.setItem('harmoni_access_token', accessToken);\n }\n }\n\n /**\n * Get the underlying HTTP client (for advanced usage)\n */\n public getHttpClient(): HttpClient {\n return this.httpClient;\n }\n}\n","/**\n * Video Player Integration Types & Interfaces\n */\n\n// ============================================\n// PLAYER STATE INTERFACES\n// ============================================\n\n/**\n * Represents the current state of a video player.\n */\nexport interface IPlayerState {\n isPlaying: boolean; // Whether video is currently playing\n currentTime: number; // Current playback position in seconds\n loop: boolean; // Loop mode enabled\n repeat: boolean; // Repeat mode enabled\n title: string; // Video title\n chapter: string; // Current chapter (for DVD/Blu-ray)\n filename: string; // Current file name\n duration: number; // Total duration in seconds\n filepath: string; // Full file path (if available)\n}\n\n/**\n * Video effect settings.\n */\nexport interface VideoEffects {\n contrast: number; // -1.0 to 1.0, default 0\n gamma: number; // 0.1 to 10.0, default 1.0\n hue: number; // -180 to 180, default 0\n brightness: number; // -1.0 to 1.0, default 0\n saturation: number; // 0.0 to 3.0, default 1.0\n}\n\n/**\n * Extended player state with additional video settings.\n */\nexport interface ExtendedPlayerState extends IPlayerState {\n volume: number; // 0-100\n fullscreen: boolean;\n rate: number; // Playback speed (1.0 = normal)\n audiodelay: number; // Audio delay in ms\n subtitledelay: number; // Subtitle delay in ms\n aspectratio: string | null; // e.g., \"16:9\", \"4:3\"\n videoeffects: VideoEffects;\n audiofilters: Record<string, unknown>;\n random: boolean; // Shuffle mode\n}\n\n// ============================================\n// USER ACTION TYPES\n// ============================================\n\n// Import and re-export shared action types\nimport { type UserActionType as ActionType } from './actions';\nexport { USER_ACTIONS, type UserActionType } from './actions';\n\n/**\n * Represents a detected user action with its associated value.\n */\nexport interface UserAction {\n event: ActionType;\n value?: {\n isPlaying?: boolean;\n currentTime?: number;\n filename?: string | null;\n loop?: boolean;\n repeat?: boolean;\n title?: string;\n chapter?: string;\n [key: string]: unknown;\n };\n}\n\n// ============================================\n// PLAYER CONTROLLER INTERFACE\n// ============================================\n\n/**\n * Abstract interface for video player controllers.\n * Implementations can use VLC, HTML5 Video, YouTube API, etc.\n */\nexport interface VideoPlayerController {\n // Lifecycle\n start(onReady?: () => void): Promise<void>;\n quit(): Promise<void>;\n\n // Playback Control\n play(): Promise<void>;\n pause(): Promise<void>;\n stop(): Promise<void>;\n seek(timeInSeconds: number): Promise<void>;\n\n // Media Loading\n loadMedia(source: string): Promise<void>;\n\n // State\n getStatus(): Promise<IPlayerState>;\n checkPlayerRunning(): Promise<boolean>;\n\n // Monitoring\n observeStatusChange(\n onChange: (events: UserAction[], source: 'app' | 'user') => void,\n onStop: () => void,\n intervalMs?: number\n ): void;\n\n // OSD (if supported)\n displayMessage?(message: string, durationSeconds?: number): Promise<void>;\n}\n\n// ============================================\n// CONSTANTS\n// ============================================\n\nexport const PlayerConstants = {\n DEFAULT_POLLING_INTERVAL_MS: 2000,\n SEEK_THRESHOLD_SECONDS: 0.5,\n COMMAND_STACK_TIMEOUT_MS: 3000,\n MIN_INTERVAL_MS: 100,\n} as const;\n","/**\n * String utility functions\n */\n\n/**\n * Capitalize the first letter of a string\n */\nexport function capitalize(str: string): string {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Convert string to title case\n */\nexport function titleCase(str: string): string {\n if (!str) return '';\n return str\n .toLowerCase()\n .split(' ')\n .map((word) => capitalize(word))\n .join(' ');\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Truncate string to specified length\n */\nexport function truncate(str: string, length: number, suffix = '...'): string {\n if (!str || str.length <= length) return str;\n return str.slice(0, length - suffix.length) + suffix;\n}\n\n/**\n * Check if string is valid email\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Generate random string\n */\nexport function randomString(length: number): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Slugify a string (URL-friendly)\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","/**\n * Date utility functions\n */\n\n/**\n * Format date to ISO string\n */\nexport function toISOString(date: Date | string | number): string {\n return new Date(date).toISOString();\n}\n\n/**\n * Check if date is valid\n */\nexport function isValidDate(date: unknown): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * Get time ago string (e.g., \"2 hours ago\")\n */\nexport function timeAgo(date: Date | string | number): string {\n const now = new Date();\n const past = new Date(date);\n const diffInSeconds = Math.floor((now.getTime() - past.getTime()) / 1000);\n\n if (diffInSeconds < 60) return 'just now';\n if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)} minutes ago`;\n if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)} hours ago`;\n if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)} days ago`;\n if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 604800)} weeks ago`;\n if (diffInSeconds < 31536000) return `${Math.floor(diffInSeconds / 2592000)} months ago`;\n return `${Math.floor(diffInSeconds / 31536000)} years ago`;\n}\n\n/**\n * Add days to a date\n */\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\n/**\n * Add hours to a date\n */\nexport function addHours(date: Date, hours: number): Date {\n const result = new Date(date);\n result.setHours(result.getHours() + hours);\n return result;\n}\n\n/**\n * Format date to readable string\n */\nexport function formatDate(date: Date | string | number, format = 'YYYY-MM-DD'): string {\n const d = new Date(date);\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: Date | string | number): boolean {\n const today = new Date();\n const checkDate = new Date(date);\n return (\n checkDate.getDate() === today.getDate() &&\n checkDate.getMonth() === today.getMonth() &&\n checkDate.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * Check if date is in the past\n */\nexport function isPast(date: Date | string | number): boolean {\n return new Date(date).getTime() < Date.now();\n}\n\n/**\n * Check if date is in the future\n */\nexport function isFuture(date: Date | string | number): boolean {\n return new Date(date).getTime() > Date.now();\n}\n","/**\n * Object utility functions\n */\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T;\n if (obj instanceof Array) return obj.map((item) => deepClone(item)) as unknown as T;\n if (obj instanceof Object) {\n const clonedObj = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clonedObj[key] = deepClone(obj[key]);\n }\n }\n return clonedObj;\n }\n return obj;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const output: Record<string, unknown> = { ...target };\n\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n );\n } else {\n output[key] = sourceValue;\n }\n });\n }\n\n return output as T;\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Pick specific keys from an object\n */\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n keys.forEach((key) => {\n if (key in obj) {\n result[key] = obj[key];\n }\n });\n return result;\n}\n\n/**\n * Omit specific keys from an object\n */\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n keys.forEach((key) => {\n delete result[key];\n });\n return result;\n}\n\n/**\n * Check if object is empty\n */\nexport function isEmpty(obj: unknown): boolean {\n if (obj === null || obj === undefined) return true;\n if (typeof obj === 'string' || Array.isArray(obj)) return obj.length === 0;\n if (typeof obj === 'object') return Object.keys(obj).length === 0;\n return false;\n}\n\n/**\n * Get nested value from object using dot notation\n */\nexport function getNestedValue<T>(obj: unknown, path: string): T | undefined {\n const keys = path.split('.');\n let result: unknown = obj;\n\n for (const key of keys) {\n if (result && typeof result === 'object' && key in result) {\n result = (result as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n\n return result as T;\n}\n\n/**\n * Set nested value in object using dot notation\n */\nexport function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n let current = obj;\n for (const key of keys) {\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[lastKey] = value;\n}\n","/**\n * Validation utility functions\n */\n\n/**\n * Validate email format\n */\nexport function validateEmail(email: string): { valid: boolean; message?: string } {\n if (!email) {\n return { valid: false, message: 'Email is required' };\n }\n\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n return { valid: false, message: 'Invalid email format' };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate password strength\n */\nexport function validatePassword(\n password: string,\n options: {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n } = {}\n): { valid: boolean; message?: string } {\n const {\n minLength = 8,\n requireUppercase = true,\n requireLowercase = true,\n requireNumbers = true,\n requireSpecialChars = true,\n } = options;\n\n if (!password) {\n return { valid: false, message: 'Password is required' };\n }\n\n if (password.length < minLength) {\n return { valid: false, message: `Password must be at least ${minLength} characters` };\n }\n\n if (requireUppercase && !/[A-Z]/.test(password)) {\n return { valid: false, message: 'Password must contain at least one uppercase letter' };\n }\n\n if (requireLowercase && !/[a-z]/.test(password)) {\n return { valid: false, message: 'Password must contain at least one lowercase letter' };\n }\n\n if (requireNumbers && !/\\d/.test(password)) {\n return { valid: false, message: 'Password must contain at least one number' };\n }\n\n if (requireSpecialChars && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n return { valid: false, message: 'Password must contain at least one special character' };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate URL format\n */\nexport function validateUrl(url: string): { valid: boolean; message?: string } {\n if (!url) {\n return { valid: false, message: 'URL is required' };\n }\n\n try {\n new URL(url);\n return { valid: true };\n } catch {\n return { valid: false, message: 'Invalid URL format' };\n }\n}\n\n/**\n * Validate phone number (basic)\n */\nexport function validatePhone(phone: string): { valid: boolean; message?: string } {\n if (!phone) {\n return { valid: false, message: 'Phone number is required' };\n }\n\n const phoneRegex = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s.]?[(]?[0-9]{1,4}[)]?[-\\s.]?[0-9]{1,9}$/;\n if (!phoneRegex.test(phone)) {\n return { valid: false, message: 'Invalid phone number format' };\n }\n\n return { valid: true };\n}\n\n/**\n * Check if value is required\n */\nexport function required(\n value: unknown,\n fieldName = 'Field'\n): { valid: boolean; message?: string } {\n if (value === null || value === undefined || value === '') {\n return { valid: false, message: `${fieldName} is required` };\n }\n return { valid: true };\n}\n\n/**\n * Validate minimum length\n */\nexport function minLength(\n value: string,\n min: number,\n fieldName = 'Field'\n): { valid: boolean; message?: string } {\n if (value.length < min) {\n return { valid: false, message: `${fieldName} must be at least ${min} characters` };\n }\n return { valid: true };\n}\n\n/**\n * Validate maximum length\n */\nexport function maxLength(\n value: string,\n max: number,\n fieldName = 'Field'\n): { valid: boolean; message?: string } {\n if (value.length > max) {\n return { valid: false, message: `${fieldName} must be at most ${max} characters` };\n }\n return { valid: true };\n}\n","/**\n * Storage utility functions for localStorage and sessionStorage\n * SSR-safe: works in both browser and Node.js environments\n */\n\n// Browser Storage interface\ninterface BrowserStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n key(index: number): string | null;\n readonly length: number;\n}\n\n// Check if we're in a browser environment\nconst isBrowser = typeof globalThis !== 'undefined' && 'localStorage' in globalThis;\n\nexport class Storage {\n private storage: BrowserStorage | null;\n private memoryStorage: Map<string, string>;\n\n constructor(type: 'local' | 'session' = 'local') {\n this.memoryStorage = new Map();\n\n if (isBrowser) {\n const global = globalThis as {\n localStorage?: BrowserStorage;\n sessionStorage?: BrowserStorage;\n };\n this.storage =\n type === 'local' ? (global.localStorage ?? null) : (global.sessionStorage ?? null);\n } else {\n // In Node.js/SSR, use in-memory storage\n this.storage = null;\n }\n }\n\n /**\n * Set item in storage\n */\n set<T>(key: string, value: T): void {\n try {\n const serialized = JSON.stringify(value);\n\n if (this.storage) {\n this.storage.setItem(key, serialized);\n } else {\n this.memoryStorage.set(key, serialized);\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error saving to storage:`, error);\n }\n }\n }\n\n /**\n * Get item from storage\n */\n get<T>(key: string): T | null {\n try {\n let item: string | null | undefined;\n\n if (this.storage) {\n item = this.storage.getItem(key);\n } else {\n item = this.memoryStorage.get(key);\n }\n\n if (!item) return null;\n return JSON.parse(item) as T;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error reading from storage:`, error);\n }\n return null;\n }\n }\n\n /**\n * Remove item from storage\n */\n remove(key: string): void {\n try {\n if (this.storage) {\n this.storage.removeItem(key);\n } else {\n this.memoryStorage.delete(key);\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error removing from storage:`, error);\n }\n }\n }\n\n /**\n * Clear all items from storage\n */\n clear(): void {\n try {\n if (this.storage) {\n this.storage.clear();\n } else {\n this.memoryStorage.clear();\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error clearing storage:`, error);\n }\n }\n }\n\n /**\n * Check if key exists in storage\n */\n has(key: string): boolean {\n if (this.storage) {\n return this.storage.getItem(key) !== null;\n } else {\n return this.memoryStorage.has(key);\n }\n }\n\n /**\n * Get all keys from storage\n */\n keys(): string[] {\n if (this.storage) {\n return Object.keys(this.storage);\n } else {\n return Array.from(this.memoryStorage.keys());\n }\n }\n\n /**\n * Check if storage is available (browser environment)\n */\n isAvailable(): boolean {\n return this.storage !== null;\n }\n}\n\n// Default instances\nexport const localStorage = new Storage('local');\nexport const sessionStorage = new Storage('session');\n","/**\n * Player State Detection Algorithms\n */\n\nimport type { IPlayerState, UserAction } from '../types/player';\nimport { USER_ACTIONS, PlayerConstants } from '../types/player';\n\n/**\n * Detects user actions by comparing old and new player states.\n *\n * @param oldState - Previous player state\n * @param newState - Current player state\n * @param intervalMs - Time since last check in milliseconds\n * @returns Array of detected user actions\n */\nexport function identifyUserActions(\n oldState: IPlayerState | null,\n newState: IPlayerState | null,\n intervalMs: number\n): UserAction[] {\n const actions: UserAction[] = [];\n\n if (!oldState || !newState) return [];\n\n // Minimum interval to prevent false positives\n const normalizedInterval = Math.max(intervalMs, PlayerConstants.MIN_INTERVAL_MS);\n\n // Detect play/pause changes\n if (oldState.isPlaying !== newState.isPlaying) {\n actions.push({\n event: newState.isPlaying ? USER_ACTIONS.PLAY : USER_ACTIONS.PAUSE,\n value: {\n isPlaying: newState.isPlaying,\n currentTime: newState.currentTime,\n },\n });\n }\n\n // Detect seek events\n const timeDifference = Math.abs(oldState.currentTime - newState.currentTime);\n const expectedTimeAdvance = (normalizedInterval / 1000) * (newState.isPlaying ? 1 : 0);\n const seekThreshold = Math.max(PlayerConstants.SEEK_THRESHOLD_SECONDS, expectedTimeAdvance * 1.5);\n\n if (timeDifference > expectedTimeAdvance + seekThreshold) {\n actions.push({\n event: USER_ACTIONS.SEEK,\n value: { currentTime: newState.currentTime },\n });\n }\n\n // Detect file changes\n if (oldState.filename !== newState.filename) {\n actions.push({\n event: USER_ACTIONS.FILE_UPDATE,\n value: {\n filename: newState.filename === 'no-input' ? null : newState.filename,\n },\n });\n }\n\n // Detect loop/repeat changes\n if (oldState.loop !== newState.loop) {\n actions.push({\n event: USER_ACTIONS.TOGGLE_LOOP,\n value: { loop: newState.loop },\n });\n }\n\n if (oldState.repeat !== newState.repeat) {\n actions.push({\n event: USER_ACTIONS.TOGGLE_REPEAT,\n value: { repeat: newState.repeat },\n });\n }\n\n // Detect title/chapter changes\n if (oldState.title !== newState.title || oldState.chapter !== newState.chapter) {\n actions.push({\n event: USER_ACTIONS.TITLE_OR_CHAPTER_UPDATE,\n value: { title: newState.title, chapter: newState.chapter },\n });\n }\n\n return actions;\n}\n\n/**\n * Helper to normalize player state for comparison.\n * Handles edge cases like NaN, null, undefined.\n */\nexport function normalizePlayerState(state: Partial<IPlayerState>): IPlayerState {\n return {\n isPlaying: state.isPlaying ?? false,\n currentTime: Number.isFinite(state.currentTime) ? state.currentTime! : 0,\n loop: state.loop ?? false,\n repeat: state.repeat ?? false,\n title: state.title ?? '',\n chapter: state.chapter ?? '',\n filename: state.filename ?? '',\n duration: Number.isFinite(state.duration) ? state.duration! : 0,\n filepath: state.filepath ?? '',\n };\n}\n","/**\n * Player Status Monitor\n *\n * Monitors player state and reports changes.\n */\n\nimport type { IPlayerState, UserAction, VideoPlayerController } from '../types/player';\nimport { PlayerConstants } from '../types/player';\nimport { identifyUserActions } from './stateDetection';\n\n/**\n * Monitors player state and reports changes.\n * This pattern is used to detect when users interact with the player.\n */\nexport class PlayerStatusMonitor {\n private lastKnownState: IPlayerState | null = null;\n private lastCheckTime: number = 0;\n private pollingTimer: NodeJS.Timeout | null = null;\n private isRunning = false;\n\n constructor(\n private player: VideoPlayerController,\n private onStateChange: (actions: UserAction[], source: 'app' | 'user') => void,\n private onStop: () => void,\n private pollingIntervalMs: number = PlayerConstants.DEFAULT_POLLING_INTERVAL_MS\n ) {}\n\n /**\n * Starts monitoring the player status.\n */\n start(): void {\n if (this.isRunning) {\n return;\n }\n this.isRunning = true;\n this.lastCheckTime = Date.now();\n this.checkStatus();\n }\n\n /**\n * Stops monitoring the player status.\n */\n stop(): void {\n this.isRunning = false;\n if (this.pollingTimer) {\n clearTimeout(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n\n /**\n * Check if monitor is currently running.\n */\n getIsRunning(): boolean {\n return this.isRunning;\n }\n\n /**\n * Get the last known player state.\n */\n getLastKnownState(): IPlayerState | null {\n return this.lastKnownState;\n }\n\n /**\n * Manually update the last known state (used when app initiates actions).\n */\n updateLastKnownState(state: IPlayerState): void {\n this.lastKnownState = state;\n }\n\n private async checkStatus(): Promise<void> {\n if (!this.isRunning) {\n return;\n }\n\n try {\n const isRunning = await this.player.checkPlayerRunning();\n\n if (!isRunning) {\n this.isRunning = false;\n this.onStop();\n return;\n }\n\n const currentTime = Date.now();\n const timeSinceLastCheck =\n this.lastCheckTime > 0 ? currentTime - this.lastCheckTime : this.pollingIntervalMs;\n this.lastCheckTime = currentTime;\n\n const currentState = await this.player.getStatus();\n\n if (this.lastKnownState) {\n const detectedActions = identifyUserActions(\n this.lastKnownState,\n currentState,\n timeSinceLastCheck\n );\n\n if (detectedActions.length > 0) {\n // Determine if action came from app or user\n // In the SDK, this would check against recent sync commands\n const source = this.determineActionSource(detectedActions);\n this.onStateChange(detectedActions, source);\n }\n }\n\n this.lastKnownState = currentState;\n\n // Schedule next check\n if (this.isRunning) {\n this.pollingTimer = setTimeout(() => this.checkStatus(), this.pollingIntervalMs);\n }\n } catch (error) {\n console.error('Error fetching player status:', error);\n this.isRunning = false;\n this.onStop();\n }\n }\n\n /**\n * Determines if the action came from app sync or user interaction.\n * Should be overridden to integrate with command tracking.\n */\n protected determineActionSource(_actions: UserAction[]): 'app' | 'user' {\n // Default implementation - override in SDK integration\n return 'user';\n }\n}\n","/**\n * HTML5 Video Player Controller\n *\n * Reference implementation for web-based video players.\n */\n\nimport type { IPlayerState, UserAction, VideoPlayerController } from '../types/player';\nimport { PlayerStatusMonitor } from './PlayerStatusMonitor';\n\n/**\n * HTML5 Video player controller implementation.\n */\nexport class HTML5VideoController implements VideoPlayerController {\n private video: HTMLVideoElement | null = null;\n private statusMonitor: PlayerStatusMonitor | null = null;\n\n constructor(private videoElementId: string) {}\n\n async start(onReady?: () => void): Promise<void> {\n if (typeof document === 'undefined') {\n throw new Error('HTML5VideoController requires a browser environment');\n }\n\n this.video = document.getElementById(this.videoElementId) as HTMLVideoElement;\n if (!this.video) {\n throw new Error(`Video element with id \"${this.videoElementId}\" not found`);\n }\n\n if (this.video.readyState >= 2) {\n // Already ready\n onReady?.();\n } else {\n this.video.addEventListener('canplay', () => onReady?.(), { once: true });\n }\n }\n\n async play(): Promise<void> {\n if (!this.video) {\n throw new Error('Player not initialized');\n }\n await this.video.play();\n }\n\n async pause(): Promise<void> {\n if (!this.video) {\n throw new Error('Player not initialized');\n }\n this.video.pause();\n }\n\n async stop(): Promise<void> {\n if (this.video) {\n this.video.pause();\n this.video.currentTime = 0;\n }\n }\n\n async seek(timeInSeconds: number): Promise<void> {\n if (!this.video) {\n throw new Error('Player not initialized');\n }\n this.video.currentTime = timeInSeconds;\n }\n\n async loadMedia(source: string): Promise<void> {\n if (!this.video) {\n throw new Error('Player not initialized');\n }\n this.video.src = source;\n this.video.load();\n }\n\n async getStatus(): Promise<IPlayerState> {\n if (!this.video) {\n throw new Error('Player not initialized');\n }\n\n return {\n isPlaying: !this.video.paused && !this.video.ended,\n currentTime: this.video.currentTime,\n loop: this.video.loop,\n repeat: false,\n title: '',\n chapter: '',\n filename: this.video.src.split('/').pop() || '',\n duration: Number.isFinite(this.video.duration) ? this.video.duration : 0,\n filepath: this.video.src,\n };\n }\n\n async checkPlayerRunning(): Promise<boolean> {\n return this.video !== null && this.video.readyState >= 2;\n }\n\n async quit(): Promise<void> {\n if (this.video) {\n this.video.pause();\n this.video.src = '';\n }\n this.statusMonitor?.stop();\n }\n\n observeStatusChange(\n onChange: (events: UserAction[], source: 'app' | 'user') => void,\n onStop: () => void,\n intervalMs: number = 500\n ): void {\n this.statusMonitor?.stop();\n this.statusMonitor = new PlayerStatusMonitor(this, onChange, onStop, intervalMs);\n this.statusMonitor.start();\n }\n\n async displayMessage(message: string, durationSeconds: number = 5): Promise<void> {\n // Simple console implementation - override for OSD overlay\n console.log(`[Player OSD] ${message} (${durationSeconds}s)`);\n }\n\n /**\n * Get the underlying HTMLVideoElement (for advanced usage).\n */\n getVideoElement(): HTMLVideoElement | null {\n return this.video;\n }\n}\n","/**\n * Synced Player\n *\n * Connects a video player to Watch Together for synchronized playback.\n */\n\nimport type { VideoPlayerController, UserAction } from '../types/player';\nimport { USER_ACTIONS, PlayerConstants } from '../types/player';\nimport type { WatchTogetherModule } from '../modules/watchTogether/WatchTogetherModule';\nimport type { RoomUpdate } from '../types/watchTogether';\n\ninterface CommandStackEntry {\n action: string;\n timestamp: number;\n}\n\n/**\n * Connects a player to Watch Together sync.\n * Handles the challenge of distinguishing user actions from sync actions.\n */\nexport class SyncedPlayer {\n private commandStack: CommandStackEntry[] = [];\n private currentUserId: string | null = null;\n private unsubscribers: Array<() => void> = [];\n\n constructor(\n private player: VideoPlayerController,\n private watchTogether: WatchTogetherModule,\n private options: {\n getCurrentUserId: () => string | null;\n onPlayerStopped?: () => void;\n }\n ) {\n this.currentUserId = options.getCurrentUserId();\n this.setupListeners();\n }\n\n /**\n * Setup listeners for sync and player changes.\n */\n private setupListeners(): void {\n // Listen for sync updates from other users\n const unsubRoomUpdate = this.watchTogether.onRoomUpdate((update) => {\n this.handleRemoteSyncUpdate(update);\n });\n this.unsubscribers.push(unsubRoomUpdate);\n\n // Monitor local player changes\n this.player.observeStatusChange(\n (actions, _source) => this.handleLocalPlayerChange(actions),\n () => {\n this.options.onPlayerStopped?.();\n }\n );\n }\n\n /**\n * Handle sync updates from other users.\n */\n private async handleRemoteSyncUpdate(update: RoomUpdate): Promise<void> {\n const { action, userId } = update.metadata;\n\n // Ignore our own updates\n if (userId === this.currentUserId) {\n return;\n }\n\n // Track that this command came from sync (not user)\n this.commandStack.push({ action, timestamp: Date.now() });\n\n try {\n switch (action) {\n case 'play':\n await this.player.play();\n break;\n case 'pause':\n await this.player.pause();\n break;\n case 'seek': {\n const time = update.roomUpdates.syncState?.time;\n if (time !== undefined) {\n await this.player.seek(time);\n }\n break;\n }\n }\n } catch (error) {\n console.error('Error applying remote sync update:', error);\n }\n }\n\n /**\n * Handle local player changes and broadcast to room.\n */\n private handleLocalPlayerChange(actions: UserAction[]): void {\n for (const action of actions) {\n // Check if this was triggered by sync (not user)\n const isFromSync = this.popMatchingCommand(action.event);\n\n if (isFromSync) {\n // Skip - this was from sync, not user action\n continue;\n }\n\n // User initiated this action - broadcast to room\n try {\n switch (action.event) {\n case USER_ACTIONS.PLAY:\n this.watchTogether.play();\n break;\n case USER_ACTIONS.PAUSE:\n this.watchTogether.pause();\n break;\n case USER_ACTIONS.SEEK: {\n const time = action.value?.currentTime;\n if (time !== undefined) {\n this.watchTogether.seek(time);\n }\n break;\n }\n case USER_ACTIONS.FILE_UPDATE: {\n const filename = action.value?.filename;\n if (filename) {\n // Optionally update file info\n // This would require additional player metadata\n }\n break;\n }\n }\n } catch (error) {\n console.error('Error broadcasting player action:', error);\n }\n }\n }\n\n /**\n * Check if a matching command exists in the stack (from sync).\n * Returns true if found (and removes it from stack).\n */\n private popMatchingCommand(event: string): boolean {\n const now = Date.now();\n\n // Clean up old commands\n this.commandStack = this.commandStack.filter(\n (cmd) => now - cmd.timestamp < PlayerConstants.COMMAND_STACK_TIMEOUT_MS\n );\n\n // Find matching command\n const index = this.commandStack.findIndex(\n (cmd) =>\n cmd.action === this.eventToAction(event) &&\n now - cmd.timestamp < PlayerConstants.COMMAND_STACK_TIMEOUT_MS\n );\n\n if (index !== -1) {\n this.commandStack.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Map user action event to sync action name.\n */\n private eventToAction(event: string): string {\n const mapping: Record<string, string> = {\n [USER_ACTIONS.PLAY]: 'play',\n [USER_ACTIONS.PAUSE]: 'pause',\n [USER_ACTIONS.SEEK]: 'seek',\n };\n return mapping[event] || event.toLowerCase();\n }\n\n /**\n * Cleanup listeners.\n */\n destroy(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.unsubscribers = [];\n this.commandStack = [];\n }\n}\n"]}
|