UNPKG

@viji-dev/core

Version:

Universal execution engine for Viji Creative scenes

652 lines (611 loc) 17.3 kB
export declare interface AnalysisConfiguration { fftSize?: number; smoothing?: number; frequencyBands?: FrequencyBand[]; beatDetection?: boolean; onsetDetection?: boolean; } export declare interface AudioAPI { isConnected: boolean; volume: { rms: number; peak: number; }; beat?: { isKick: boolean; confidence: number; }; bands: Record<string, number>; getFrequencyData: () => Uint8Array; } export declare interface CaptureFrameOptions { /** MIME type for output, e.g., 'image/png', 'image/jpeg', 'image/webp' */ type?: string; /** * Target resolution. * - number: scale factor relative to current canvas size (e.g., 0.5 = 50%) * - { width, height }: exact output size; if aspect ratio differs from canvas, * the source is center-cropped to match the target aspect ratio before scaling */ resolution?: number | { width: number; height: number; }; } declare interface ColorConfig { label: string; description?: string; group?: string; category?: ParameterCategory; } declare interface ColorParameter { value: string; label: string; description?: string; group: string; category: ParameterCategory; } declare interface CoreCapabilities { /** Audio input is active and connected */ hasAudio: boolean; /** Video input is active and connected */ hasVideo: boolean; /** User interactions (mouse, touch, keyboard) are enabled */ hasInteraction: boolean; /** General parameters are always available */ hasGeneral: boolean; } export declare interface FaceData { bounds: { x: number; y: number; width: number; height: number; }; confidence: number; landmarks: { x: number; y: number; }[]; expressions: Record<string, number>; } declare interface FrameRateInfo { mode: FrameRateMode; screenRefreshRate: number; effectiveRefreshRate: number; } declare type FrameRateMode = 'full' | 'half'; export declare interface FrequencyBand { name: string; min: number; max: number; } export declare interface HandData { palm: { x: number; y: number; }; fingers: { x: number; y: number; }[]; gestures: Record<string, boolean>; } export declare interface KeyboardAPI { isPressed(key: string): boolean; wasPressed(key: string): boolean; wasReleased(key: string): boolean; activeKeys: Set<string>; pressedThisFrame: Set<string>; releasedThisFrame: Set<string>; lastKeyPressed: string; lastKeyReleased: string; shift: boolean; ctrl: boolean; alt: boolean; meta: boolean; } export declare interface MouseAPI { x: number; y: number; isInCanvas: boolean; isPressed: boolean; leftButton: boolean; rightButton: boolean; middleButton: boolean; velocity: { x: number; y: number; }; deltaX: number; deltaY: number; wheelDelta: number; wheelX: number; wheelY: number; wasPressed: boolean; wasReleased: boolean; wasMoved: boolean; } declare interface NumberConfig { min?: number; max?: number; step?: number; label: string; description?: string; group?: string; category?: ParameterCategory; } declare interface NumberParameter { value: number; min: number; max: number; step: number; label: string; description?: string; group: string; category: ParameterCategory; } export declare interface ParameterAPI { define(groups: ParameterGroup[]): void; [key: string]: any; } declare type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general'; export declare interface ParameterConfig { min?: number; max?: number; step?: number; options?: string[] | number[]; maxLength?: number; label?: string; description?: string; hidden?: boolean; precision?: number; } export declare interface ParameterDefinition { type: 'slider' | 'color' | 'toggle' | 'select' | 'text' | 'number'; defaultValue: any; label?: string; description?: string; group?: string; category?: ParameterCategory; config?: ParameterConfig; validate?: (value: any) => boolean; } export declare interface ParameterGroup { groupName: string; category?: ParameterCategory; description?: string; collapsed?: boolean; order?: number; parameters: Record<string, ParameterDefinition>; } declare type ParameterValue = string | number | boolean; export declare interface PerformanceStats { frameTime: number; resolution: Resolution; scale: number; frameRate: FrameRateInfo; memoryUsage?: number; activeStreams?: number; parameterCount?: number; } export declare type Resolution = { width: number; height: number; }; declare interface SelectConfig { options: string[] | number[]; label: string; description?: string; group?: string; category?: ParameterCategory; } declare interface SelectParameter { value: string | number; options: string[] | number[]; label: string; description?: string; group: string; category: ParameterCategory; } declare interface SliderConfig { min?: number; max?: number; step?: number; label: string; description?: string; group?: string; category?: ParameterCategory; } declare interface SliderParameter { value: number; min: number; max: number; step: number; label: string; description?: string; group: string; category: ParameterCategory; } declare interface TextConfig { label: string; description?: string; group?: string; category?: ParameterCategory; maxLength?: number; } declare interface TextParameter { value: string; maxLength?: number; label: string; description?: string; group: string; category: ParameterCategory; } declare interface ToggleConfig { label: string; description?: string; group?: string; category?: ParameterCategory; } declare interface ToggleParameter { value: boolean; label: string; description?: string; group: string; category: ParameterCategory; } export declare interface TouchAPI { points: TouchPoint[]; count: number; started: TouchPoint[]; moved: TouchPoint[]; ended: TouchPoint[]; primary: TouchPoint | null; gestures: TouchGestureAPI; } declare interface TouchGestureAPI { isPinching: boolean; isRotating: boolean; isPanning: boolean; isTapping: boolean; pinchScale: number; pinchDelta: number; rotationAngle: number; rotationDelta: number; panDelta: { x: number; y: number; }; tapCount: number; lastTapTime: number; tapPosition: { x: number; y: number; } | null; } declare interface TouchPoint { id: number; x: number; y: number; pressure: number; radius: number; radiusX: number; radiusY: number; rotationAngle: number; force: number; deltaX: number; deltaY: number; velocity: { x: number; y: number; }; isNew: boolean; isActive: boolean; isEnding: boolean; } export declare const VERSION = "0.2.2"; export declare interface VideoAPI { isConnected: boolean; currentFrame: OffscreenCanvas | null; frameWidth: number; frameHeight: number; frameRate: number; getFrameData: () => ImageData | null; faces: FaceData[]; hands: HandData[]; } export declare interface VijiAPI { canvas: OffscreenCanvas; ctx?: OffscreenCanvasRenderingContext2D; gl?: WebGL2RenderingContext; width: number; height: number; pixelRatio: number; time: number; deltaTime: number; frameCount: number; fps: number; audio: AudioAPI; video: VideoAPI; mouse: MouseAPI; keyboard: KeyboardAPI; touches: TouchAPI[]; slider: (defaultValue: number, config: SliderConfig) => SliderParameter; color: (defaultValue: string, config: ColorConfig) => ColorParameter; toggle: (defaultValue: boolean, config: ToggleConfig) => ToggleParameter; select: (defaultValue: string | number, config: SelectConfig) => SelectParameter; text: (defaultValue: string, config: TextConfig) => TextParameter; number: (defaultValue: number, config: NumberConfig) => NumberParameter; useContext(type: '2d' | 'webgl'): OffscreenCanvasRenderingContext2D | WebGLRenderingContext | WebGL2RenderingContext | null; } /** * Main VijiCore class - Universal execution engine for creative scenes. * * Orchestrates secure IFrame + WebWorker execution with controlled communication. * Provides the foundation for scene execution across platform and SDK contexts. */ export declare class VijiCore { private iframeManager; private workerManager; private interactionManager; private audioSystem; private videoCoordinator; private isInitialized; private isDestroyed; private isInitializing; private instanceId; private screenRefreshRate; private debugMode; /** * Debug logging helper */ private debugLog; private config; private currentAudioStream; private currentVideoStream; private currentInteractionEnabled; private parameterGroups; private parameterValues; private parametersInitialized; private parameterListeners; private parameterDefinedListeners; private parameterErrorListeners; private capabilitiesChangeListeners; private stats; constructor(config: VijiCoreConfig); /** * Capture current scene frame as an image Blob. * Resolution can be a scale (0-1+) or explicit width/height with center-crop. */ captureFrame(options?: CaptureFrameOptions): Promise<Blob>; /** * Enable or disable debug logging */ setDebugMode(enabled: boolean): void; /** * Get current debug mode status */ getDebugMode(): boolean; /** * Initializes the core components in sequence */ initialize(): Promise<void>; /** * Creates canvas with retry logic to handle timing issues */ private createCanvasWithRetry; /** * Sets up the interaction system for Phase 7 */ private setupInteractionSystem; /** * Sets up communication between components */ private setupCommunication; /** * Handle parameter definitions received from worker */ private handleParametersDefined; /** * Handle parameter validation errors */ private handleParameterError; /** * Set a single parameter value */ setParameter(name: string, value: ParameterValue): Promise<void>; /** * Set multiple parameter values efficiently */ setParameters(values: Record<string, ParameterValue>): Promise<void>; /** * Get current parameter value */ getParameter(name: string): ParameterValue | undefined; /** * Get all current parameter values */ getParameterValues(): Record<string, ParameterValue>; /** * Get parameter groups (for UI generation) */ getParameterGroups(): ParameterGroup[]; /** * Get current core capabilities (what's currently active) */ getCapabilities(): CoreCapabilities; /** * Get parameter groups filtered by active capabilities */ getVisibleParameterGroups(): ParameterGroup[]; /** * Check if a specific parameter category is currently active */ isCategoryActive(category: ParameterCategory): boolean; /** * Check if parameters have been initialized */ get parametersReady(): boolean; /** * Send all current parameter values to worker (used for initial sync) */ private syncAllParametersToWorker; /** * Add listener for when parameters are defined */ onParametersDefined(listener: (groups: ParameterGroup[]) => void): void; /** * Remove parameter defined listener */ offParametersDefined(listener: (groups: ParameterGroup[]) => void): void; /** * Add listener for parameter value changes */ onParameterChange(parameterName: string, listener: (value: ParameterValue) => void): void; /** * Remove parameter change listener */ offParameterChange(parameterName: string, listener: (value: ParameterValue) => void): void; /** * Add listener for parameter errors */ onParameterError(listener: (error: { message: string; code: string; }) => void): void; /** * Add listener for when core capabilities change (audio/video/interaction state) */ onCapabilitiesChange(listener: (capabilities: CoreCapabilities) => void): void; /** * Remove capabilities change listener */ removeCapabilitiesListener(listener: (capabilities: CoreCapabilities) => void): void; /** * Notify capability change listeners */ private notifyCapabilitiesChange; /** * Remove parameter error listener */ offParameterError(listener: (error: { message: string; code: string; }) => void): void; /** * Notify parameter change listeners */ private notifyParameterListeners; /** * Sets the frame rate to full speed (every animation frame) */ setFullFrameRate(): Promise<void>; /** * Sets the frame rate to half speed (every second animation frame) */ setHalfFrameRate(): Promise<void>; /** * Updates the canvas resolution by sending effective dimensions to the worker */ updateResolution(): void; /** * Sets the audio stream for analysis */ setAudioStream(audioStream: MediaStream | null): Promise<void>; /** * Sets the video stream for processing */ setVideoStream(videoStream: MediaStream | null): Promise<void>; /** * Gets the current audio stream */ getAudioStream(): MediaStream | null; /** * Gets the current video stream */ getVideoStream(): MediaStream | null; /** * Enables or disables user interactions (mouse, keyboard, touch) at runtime */ setInteractionEnabled(enabled: boolean): Promise<void>; /** * Gets the current interaction enabled state */ getInteractionEnabled(): boolean; /** * Updates audio analysis configuration */ setAudioAnalysisConfig(config: { fftSize?: number; smoothing?: number; }): Promise<void>; /** * Updates the canvas resolution by scale */ setResolution(scale: number): void; /** * Detects the screen refresh rate */ private detectScreenRefreshRate; /** * Updates frame rate statistics */ private updateFrameRateStats; /** * Gets current performance statistics */ getStats(): PerformanceStats; /** * Checks if the core is ready for use */ get ready(): boolean; /** * Gets the current configuration */ get configuration(): Readonly<VijiCoreConfig>; /** * Destroys the core instance and cleans up all resources */ destroy(): Promise<void>; /** * Validates that the core is ready for operations */ private validateReady; /** * Validates the provided configuration */ private validateConfig; /** * Cleans up all resources */ private cleanup; } export declare interface VijiCoreConfig { /** Container element where the scene will be rendered */ hostContainer: HTMLElement; /** Artist scene code to execute */ sceneCode: string; /** Frame rate mode - 'full' for every animation frame, 'half' for every second frame */ frameRateMode?: FrameRateMode; /** Enable automatic performance optimization */ autoOptimize?: boolean; /** Audio input stream */ audioStream?: MediaStream; /** Video input stream */ videoStream?: MediaStream; /** Audio analysis configuration */ analysisConfig?: AnalysisConfiguration; /** Initial parameter values */ parameters?: ParameterGroup[]; /** Disable input processing (for preview instances) */ noInputs?: boolean; /** Enable user interaction events */ allowUserInteraction?: boolean; } export declare class VijiCoreError extends Error { code: string; context?: any | undefined; constructor(message: string, code: string, context?: any | undefined); } export { }