{"version":3,"file":"FilterFactory.cjs","sources":["../../../src/filters/FilterFactory.ts"],"sourcesContent":["import { type FilterConfig, type FilterResult, type FilterType } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Filter module loading states\n */\nenum FilterModuleState {\n    UNLOADED = 'unloaded',\n    LOADING = 'loading',\n    LOADED = 'loaded',\n    ERROR = 'error'\n}\n\n/**\n * Interface for filter module registry entry\n */\ninterface FilterModuleEntry {\n    state: FilterModuleState;\n    loadPromise?: Promise<any>;\n    lastUsed: number;\n    useCount: number;\n    loadTime?: number;\n    creator?: Function;\n    error?: Error;\n}\n\n/**\n * Configuration for filter lazy loading\n */\ninterface LazyLoadingConfig {\n    /** Timeout in ms before unloading unused filters */\n    unloadTimeoutMs: number;\n    /** Maximum number of cached filter modules */\n    maxCachedModules: number;\n    /** Whether to enable prefetching */\n    enablePrefetching: boolean;\n    /** Whether to retry failed loads */\n    retryFailedLoads: boolean;\n    /** Maximum number of retries */\n    maxRetries: number;\n}\n\n/**\n * Factory for creating and managing different types of PixiJS filters\n *\n * This factory creates filters based on the provided configuration,\n * with lazy loading of filter modules and resource management.\n */\nexport class FilterFactory {\n    /** Shader resource manager instance */\n    private static shaderManager: ShaderResourceManager | null = null;\n\n    /** Filter cache for reusing instances with identical configurations */\n    private static filterCache = new Map<string, FilterResult>();\n\n    /** Debug mode flag */\n    private static debug = false;\n\n    /** Is shader pooling enabled */\n    private static shaderPoolingEnabled = false;\n\n    /** Registry of filter modules and their loading states */\n    private static moduleRegistry = new Map<FilterType, FilterModuleEntry>();\n\n    /** Lazy loading configuration */\n    private static lazyLoadConfig: LazyLoadingConfig = {\n        unloadTimeoutMs: 60000, // 1 minute\n        maxCachedModules: 20,\n        enablePrefetching: true,\n        retryFailedLoads: true,\n        maxRetries: 3\n    };\n\n    /** Timer for cleanup of unused modules */\n    private static cleanupTimer: number | null = null;\n\n    /** Map of filter types to their module paths for dynamic imports */\n    private static readonly MODULE_PATHS: Record<FilterType, string> = {\n        'adjustment': './filters/adjustmentFilter.js',\n        'advancedBloom': './filters/advancedBloomFilter.js',\n        'alpha': './filters/alphaFilter.js',\n        'ascii': './filters/asciiFilter.js',\n        'backdropBlur': './filters/backdropBlurFilter.js',\n        'bevel': './filters/bevelFilter.js',\n        'bloom': './filters/bloomFilter.js',\n        'blur': './filters/blurFilter.js',\n        'bulgePinch': './filters/bulgePinchFilter.js',\n        'colorGradient': './filters/colorGradientFilter.js',\n        'colorMap': './filters/colorMapFilter.js',\n        'colorMatrix': './filters/colorMatrixFilter.js',\n        'colorOverlay': './filters/colorOverlayFilter.js',\n        'colorReplace': './filters/colorReplaceFilter.js',\n        'convolution': './filters/convolutionFilter.js',\n        'crossHatch': './filters/crossHatchFilter.js',\n        'crt': './filters/crtFilter.js',\n        'dot': './filters/dotFilter.js',\n        'dropShadow': './filters/dropShadowFilter.js',\n        'emboss': './filters/embossFilter.js',\n        'glitch': './filters/glitchFilter.js',\n        'glow': './filters/glowFilter.js',\n        'godray': './filters/godrayFilter.js',\n        'grayscale': './filters/grayscaleFilter.js',\n        'hsl': './filters/hslAdjustmentFilter.js',\n        'kawaseBlur': './filters/kawaseBlurFilter.js',\n        'motionBlur': './filters/motionBlurFilter.js',\n        'multiColorReplace': './filters/multiColorReplaceFilter.js',\n        'noise': './filters/noiseFilter.js',\n        'oldFilm': './filters/oldFilmFilter.js',\n        'outline': './filters/outlineFilter.js',\n        'pixelate': './filters/pixelateFilter.js',\n        'radialBlur': './filters/radialBlurFilter.js',\n        'reflection': './filters/reflectionFilter.js',\n        'rgbSplit': './filters/rgbSplitFilter.js',\n        'shockwave': './filters/shockwaveFilter.js',\n        'simpleLightmap': './filters/simpleLightmapFilter.js',\n        'simplexNoise': './filters/simplexNoiseFilter.js',\n        'tiltShift': './filters/tiltShiftFilter.js',\n        'twist': './filters/twistFilter.js',\n        'zoomBlur': './filters/zoomBlurFilter.js'\n    };\n\n    /**\n     * Initialize the FilterFactory with a ShaderResourceManager\n     *\n     * @param options - Configuration options\n     */\n    public static initialize(options: {\n        enableShaderPooling?: boolean;\n        enableDebug?: boolean;\n        maxCacheSize?: number;\n        lazyLoadConfig?: Partial<LazyLoadingConfig>;\n    } = {}): void {\n        // Get or create a shader manager instance\n        this.shaderManager = ShaderResourceManager.getInstance({\n            debug: options.enableDebug,\n            maxPoolSize: 100\n        });\n\n        this.debug = options.enableDebug ?? false;\n        this.shaderPoolingEnabled = options.enableShaderPooling ?? true;\n\n        // Apply lazy loading configuration if provided\n        if (options.lazyLoadConfig) {\n            this.lazyLoadConfig = {\n                ...this.lazyLoadConfig,\n                ...options.lazyLoadConfig\n            };\n        }\n\n        if (this.debug) {\n            console.log(`[FilterFactory] Initialized with shader pooling ${this.shaderPoolingEnabled ? 'enabled' : 'disabled'}`);\n            console.log(`[FilterFactory] Lazy loading configuration:`, this.lazyLoadConfig);\n        }\n\n        // Start the cleanup timer\n        this.startCleanupTimer();\n\n        // Apply shader program pooling patches if enabled\n        if (this.shaderPoolingEnabled && this.shaderManager) {\n            // PixiJS patching for shader pooling would go here in a production implementation\n            // This requires internal knowledge of how each filter creates its shaders\n            if (this.debug) {\n                console.log('[FilterFactory] Shader pooling enabled - shader programs will be shared between filter instances');\n            }\n        }\n\n        // Initialize the module registry with all filter types in UNLOADED state\n        Object.keys(this.MODULE_PATHS).forEach(type => {\n            const filterType = type as FilterType;\n            if (!this.moduleRegistry.has(filterType)) {\n                this.moduleRegistry.set(filterType, {\n                    state: FilterModuleState.UNLOADED,\n                    lastUsed: 0,\n                    useCount: 0\n                });\n            }\n        });\n    }\n\n    /**\n     * Start the cleanup timer for unused filter modules\n     */\n    private static startCleanupTimer(): void {\n        if (this.cleanupTimer !== null) {\n            window.clearInterval(this.cleanupTimer);\n        }\n\n        this.cleanupTimer = window.setInterval(() => {\n            this.cleanupUnusedModules();\n        }, 30000); // Check every 30 seconds\n    }\n\n    /**\n     * Cleanup unused filter modules\n     */\n    private static cleanupUnusedModules(): void {\n        if (this.debug) {\n            console.log('[FilterFactory] Running cleanup for unused filter modules');\n        }\n\n        const now = Date.now();\n        let unloadCount = 0;\n\n        // Find modules that haven't been used recently\n        for (const [type, entry] of this.moduleRegistry.entries()) {\n            // Skip modules that are not loaded or are currently loading\n            if (entry.state !== FilterModuleState.LOADED) continue;\n\n            // Check if module hasn't been used for the timeout period\n            const timeSinceLastUse = now - entry.lastUsed;\n            if (timeSinceLastUse > this.lazyLoadConfig.unloadTimeoutMs) {\n                // Unload the module by removing the creator reference\n                entry.creator = undefined;\n                entry.state = FilterModuleState.UNLOADED;\n                unloadCount++;\n\n                if (this.debug) {\n                    console.log(`[FilterFactory] Unloaded unused filter module: ${type} (${timeSinceLastUse}ms since last use)`);\n                }\n            }\n        }\n\n        if (this.debug) {\n            console.log(`[FilterFactory] Cleanup complete: unloaded ${unloadCount} unused filter modules`);\n        }\n    }\n\n    /**\n     * Prefetch filter modules based on likely usage\n     *\n     * @param filterTypes - Array of filter types to prefetch\n     * @param priority - Priority level (high, medium, low)\n     */\n    public static prefetchFilterModules(filterTypes: FilterType[], priority: 'high' | 'medium' | 'low' = 'medium'): void {\n        if (!this.lazyLoadConfig.enablePrefetching) return;\n\n        const priorityDelay = {\n            high: 0,\n            medium: 100,\n            low: 1000\n        };\n\n        // Schedule prefetching with appropriate delay based on priority\n        setTimeout(() => {\n            filterTypes.forEach(type => {\n                // Skip if already loaded or loading\n                const entry = this.moduleRegistry.get(type);\n                if (!entry || entry.state === FilterModuleState.LOADED || entry.state === FilterModuleState.LOADING) {\n                    return;\n                }\n\n                if (this.debug) {\n                    console.log(`[FilterFactory] Prefetching filter module: ${type} (${priority} priority)`);\n                }\n\n                // Load the module but don't wait for it\n                this.loadFilterModule(type).catch(error => {\n                    if (this.debug) {\n                        console.error(`[FilterFactory] Error prefetching filter module ${type}:`, error);\n                    }\n                });\n            });\n        }, priorityDelay[priority]);\n    }\n\n    /**\n     * Check if a filter module is available (loaded)\n     *\n     * @param type - Filter type to check\n     * @returns True if the filter module is loaded and ready to use\n     */\n    public static isFilterModuleLoaded(type: FilterType): boolean {\n        const entry = this.moduleRegistry.get(type);\n        return entry?.state === FilterModuleState.LOADED && !!entry.creator;\n    }\n\n    /**\n     * Get the loading state of a filter module\n     *\n     * @param type - Filter type to check\n     * @returns The current loading state of the filter module\n     */\n    public static getFilterModuleState(type: FilterType): FilterModuleState {\n        return this.moduleRegistry.get(type)?.state || FilterModuleState.UNLOADED;\n    }\n\n    /**\n     * Load a filter module if not already loaded\n     *\n     * @param type - Type of filter to load\n     * @returns Promise resolving when the module is loaded\n     */\n    private static async loadFilterModule(type: FilterType, retryCount = 0): Promise<any> {\n        // Get or create registry entry\n        if (!this.moduleRegistry.has(type)) {\n            this.moduleRegistry.set(type, {\n                state: FilterModuleState.UNLOADED,\n                lastUsed: Date.now(),\n                useCount: 0\n            });\n        }\n\n        const entry = this.moduleRegistry.get(type)!;\n\n        // If already loading, return the existing promise\n        if (entry.state === FilterModuleState.LOADING && entry.loadPromise) {\n            return entry.loadPromise;\n        }\n\n        // If already loaded, return immediately\n        if (entry.state === FilterModuleState.LOADED && entry.creator) {\n            // Update usage stats\n            entry.lastUsed = Date.now();\n            entry.useCount++;\n            return Promise.resolve(entry.creator);\n        }\n\n        // Start loading the module\n        entry.state = FilterModuleState.LOADING;\n        const startTime = performance.now();\n\n        // For better debuggability\n        if (this.debug) {\n            console.log(`[FilterFactory] Loading filter module: ${type}`);\n        }\n\n        try {\n            // Record the loading promise - now using a more reliable method with the index file\n            entry.loadPromise = this.importAllFilters().then(module => {\n                // Convert the filter type to the correct function name\n                // e.g., 'rgbSplit' -> 'createRGBSplitFilter'\n                const creatorFnName = `create${this.capitalizeFilterType(type)}Filter`;\n\n                if (this.debug) {\n                    console.log(`[FilterFactory] Looking for creator function: ${creatorFnName}`);\n                }\n\n                const creator = module[creatorFnName];\n\n                if (!creator || typeof creator !== 'function') {\n                    throw new Error(`Filter creator function ${creatorFnName} not found in filters module`);\n                }\n\n                // Update registry entry\n                entry.state = FilterModuleState.LOADED;\n                entry.creator = creator;\n                entry.loadTime = performance.now() - startTime;\n                entry.lastUsed = Date.now();\n                entry.useCount = 1;\n                entry.error = undefined;\n\n                if (this.debug) {\n                    console.log(`[FilterFactory] Loaded filter module: ${type} in ${entry.loadTime.toFixed(2)}ms`);\n                }\n\n                return creator;\n            });\n\n            return entry.loadPromise;\n        } catch (error) {\n            entry.state = FilterModuleState.ERROR;\n            entry.error = error as Error;\n\n            if (this.debug) {\n                console.error(`[FilterFactory] Error loading filter module ${type}:`, error);\n            }\n\n            // Retry loading if enabled and under max retries\n            if (this.lazyLoadConfig.retryFailedLoads && retryCount < this.lazyLoadConfig.maxRetries) {\n                if (this.debug) {\n                    console.log(`[FilterFactory] Retrying load for filter module ${type} (attempt ${retryCount + 1}/${this.lazyLoadConfig.maxRetries})`);\n                }\n\n                // Wait a bit before retrying (exponential backoff)\n                const retryDelay = Math.min(1000 * Math.pow(2, retryCount), 5000);\n                await new Promise(resolve => setTimeout(resolve, retryDelay));\n\n                // Clear the error state\n                entry.state = FilterModuleState.UNLOADED;\n                entry.error = undefined;\n\n                // Try again with incremented retry count\n                return this.loadFilterModule(type, retryCount + 1);\n            }\n\n            return Promise.reject(error);\n        }\n    }\n\n    /**\n     * Import all filters from the consolidated module\n     * This is more reliable than individual dynamic imports\n     *\n     * @returns Promise resolving to the module with all filter creators\n     */\n    private static async importAllFilters(): Promise<any> {\n        if (this.debug) {\n            console.log('[FilterFactory] Importing all filters from consolidated module');\n        }\n\n        try {\n            // Try importing the main filters index\n            return import('./index');\n        } catch (error) {\n            if (this.debug) {\n                console.error('[FilterFactory] Error importing filter index:', error);\n            }\n\n            // If direct import fails, try relative path from current module\n            return import('../filters/index');\n        }\n    }\n\n    /**\n     * Capitalize the first letter of a filter type\n     */\n    private static capitalizeFilterType(type: string): string {\n        // Handle special cases like \"rgbSplit\" -> \"RGBSplit\"\n        if (type === 'rgbSplit') return 'RGBSplit';\n        if (type === 'hsl') return 'HslAdjustment';\n\n        // Standard case: first letter capitalized\n        return type.charAt(0).toUpperCase() + type.slice(1);\n    }\n\n    /**\n     * Generate a cache key for a filter configuration\n     *\n     * @param config - Filter configuration\n     * @returns A string key for cache lookups\n     */\n    private static generateCacheKey(config: FilterConfig): string {\n        return `${config.type}_${JSON.stringify(config)}`;\n    }\n\n    /**\n     * Log a message if debug is enabled\n     *\n     * @param message - Message to log\n     */\n    private static log(message: string): void {\n        if (this.debug) {\n            console.log(`[FilterFactory] ${message}`);\n        }\n    }\n\n    /**\n     * Create a filter based on the provided configuration\n     *\n     * @param config - Configuration for the filter\n     * @returns Promise resolving to an object containing the filter instance and control functions\n     */\n    static async createFilterAsync(config: FilterConfig & { type: FilterType }): Promise<FilterResult> {\n        // Initialize if not already done\n        if (!this.shaderManager) {\n            this.initialize();\n        }\n\n        // Check cache for identical configuration\n        const cacheKey = this.generateCacheKey(config);\n        if (this.filterCache.has(cacheKey)) {\n            const cachedResult = this.filterCache.get(cacheKey);\n            this.log(`Reusing cached filter for ${config.type}`);\n\n            // Update last used timestamp for the module\n            const entry = this.moduleRegistry.get(config.type);\n            if (entry) {\n                entry.lastUsed = Date.now();\n                entry.useCount++;\n            }\n\n            return cachedResult!;\n        }\n\n        try {\n            // Load the filter module\n            const creator = await this.loadFilterModule(config.type);\n\n            // Create the filter using the loaded creator function\n            const result = creator(config);\n\n            // Cache the result\n            this.filterCache.set(cacheKey, result);\n\n            return result;\n        } catch (error) {\n            this.log(`Error creating filter ${config.type}: ${error}`);\n            throw error;\n        }\n    }\n\n    /**\n     * Create a filter based on the provided configuration (synchronous version)\n     * Falls back to async loading if the module is not already loaded\n     *\n     * @param config - Configuration for the filter\n     * @returns Object containing the filter instance and control functions, or a promise resolving to it\n     */\n    static createFilter(config: FilterConfig & { type: FilterType }): FilterResult | Promise<FilterResult> {\n        // Initialize if not already done\n        if (!this.shaderManager) {\n            this.initialize();\n        }\n\n        // Check cache for identical configuration\n        const cacheKey = this.generateCacheKey(config);\n        if (this.filterCache.has(cacheKey)) {\n            const cachedResult = this.filterCache.get(cacheKey);\n            this.log(`Reusing cached filter for ${config.type}`);\n\n            // Update last used timestamp for the module\n            const entry = this.moduleRegistry.get(config.type);\n            if (entry) {\n                entry.lastUsed = Date.now();\n                entry.useCount++;\n            }\n\n            return cachedResult!;\n        }\n\n        // Check if the module is already loaded\n        const entry = this.moduleRegistry.get(config.type);\n\n        if (entry?.state === FilterModuleState.LOADED && entry.creator) {\n            // Module is loaded, create the filter synchronously\n            try {\n                const result = entry.creator(config);\n                this.filterCache.set(cacheKey, result);\n\n                // Update usage stats\n                entry.lastUsed = Date.now();\n                entry.useCount++;\n\n                return result;\n            } catch (error) {\n                this.log(`Error creating filter ${config.type}: ${error}`);\n                throw error;\n            }\n        } else {\n            // Module is not loaded, fall back to async loading\n            this.log(`Filter module ${config.type} not loaded, loading asynchronously`);\n            return this.createFilterAsync(config);\n        }\n    }\n\n    /**\n     * Get stats about loaded filter modules\n     *\n     * @returns Object with statistics about filter module loading\n     */\n    static getFilterModuleStats(): {\n        totalModules: number;\n        loadedModules: number;\n        loadingModules: number;\n        errorModules: number;\n        unloadedModules: number;\n        moduleDetails: Record<string, {\n            state: string;\n            useCount: number;\n            lastUsed: number;\n            loadTime?: number;\n            hasError: boolean;\n        }>;\n    } {\n        const stats = {\n            totalModules: this.moduleRegistry.size,\n            loadedModules: 0,\n            loadingModules: 0,\n            errorModules: 0,\n            unloadedModules: 0,\n            moduleDetails: {} as Record<string, any>\n        };\n\n        this.moduleRegistry.forEach((entry, type) => {\n            if (entry.state === FilterModuleState.LOADED) stats.loadedModules++;\n            else if (entry.state === FilterModuleState.LOADING) stats.loadingModules++;\n            else if (entry.state === FilterModuleState.ERROR) stats.errorModules++;\n            else stats.unloadedModules++;\n\n            stats.moduleDetails[type] = {\n                state: entry.state,\n                useCount: entry.useCount,\n                lastUsed: entry.lastUsed,\n                loadTime: entry.loadTime,\n                hasError: !!entry.error\n            };\n        });\n\n        return stats;\n    }\n\n    /**\n     * Clear the filter cache\n     */\n    static clearCache(): void {\n        this.filterCache.clear();\n        this.log('Filter cache cleared');\n    }\n\n    /**\n     * Dispose all resources managed by the FilterFactory\n     */\n    static dispose(): void {\n        // Clear cache and stop timer\n        this.clearCache();\n\n        if (this.cleanupTimer !== null) {\n            window.clearInterval(this.cleanupTimer);\n            this.cleanupTimer = null;\n        }\n\n        // Reset registry\n        this.moduleRegistry.clear();\n\n        this.log('FilterFactory disposed');\n    }\n}"],"names":["ShaderResourceManager","entry"],"mappings":"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"}