kinetic-slider
Version:
A WebGL-powered kinetic slider component using PIXI.js
1 lines • 34.6 kB
Source Map (JSON)
{"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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"}