diff --git a/config/initializers/widget_renderer.rb b/config/initializers/widget_renderer.rb index 608c188b1..69e2c6813 100644 --- a/config/initializers/widget_renderer.rb +++ b/config/initializers/widget_renderer.rb @@ -2,7 +2,7 @@ begin # Try loading the precompiled Rutie extension. require_relative '../../ext/widget_renderer/lib/widget_renderer' - + # Verify the class was properly defined if defined?(WidgetRenderer) && WidgetRenderer.respond_to?(:generate_js) Rails.logger.info "WidgetRenderer: Rust extension loaded successfully! generate_js method available." @@ -14,6 +14,9 @@ rescue LoadError => e Rails.logger.warn "Widget renderer native library not available: #{e.message}" Rails.logger.warn 'Rust extension must be built during staging; falling back to ERB template rendering.' +rescue SystemExit => e + Rails.logger.error "Widget renderer exited during load: #{e.message}" + Rails.logger.warn 'Falling back to ERB template rendering' rescue StandardError => e Rails.logger.error "Widget renderer failed to load: #{e.class}: #{e.message}" Rails.logger.error e.backtrace.join("\n") if e.backtrace diff --git a/ext/widget_renderer/lib/widget_renderer.rb b/ext/widget_renderer/lib/widget_renderer.rb index c6cd72a44..6c4142352 100644 --- a/ext/widget_renderer/lib/widget_renderer.rb +++ b/ext/widget_renderer/lib/widget_renderer.rb @@ -9,13 +9,6 @@ puts "WidgetRenderer: root=#{root}" puts "WidgetRenderer: __dir__=#{__dir__}" -# If a stale module exists, remove it so Rutie can define or reopen the class. -if defined?(WidgetRenderer) && WidgetRenderer.is_a?(Module) && !WidgetRenderer.is_a?(Class) - Object.send(:remove_const, :WidgetRenderer) -end -# Ensure the constant exists as a Class so rb_define_class will reopen it instead of erroring on Module. -WidgetRenderer = Class.new unless defined?(WidgetRenderer) && WidgetRenderer.is_a?(Class) - # Check for library file extensions based on platform lib_extensions = %w[.so .bundle .dylib] lib_names = lib_extensions.map { |ext| "libwidget_renderer#{ext}" } @@ -84,6 +77,13 @@ end end end + + # If a stale module exists, remove it so Rutie can define or reopen the class. + if defined?(WidgetRenderer) && WidgetRenderer.is_a?(Module) && !WidgetRenderer.is_a?(Class) + Object.send(:remove_const, :WidgetRenderer) + end + # Ensure the constant exists as a Class so rb_define_class will reopen it instead of erroring on Module. + WidgetRenderer = Class.new unless defined?(WidgetRenderer) && WidgetRenderer.is_a?(Class) else puts 'WidgetRenderer: Library not found in any checked path. Listing root contents:' # List files in root to help debug @@ -104,6 +104,9 @@ else puts "WidgetRenderer: target/release directory does not exist at #{release_dir}" end + + # No native library available; let caller handle fallback. + raise LoadError, 'WidgetRenderer native library not found' end # Rutie expects the project root and appends /target/release/lib.so @@ -112,4 +115,8 @@ puts "WidgetRenderer: Initializing Rutie with path: #{path}" -Rutie.new(:widget_renderer).init 'Init_widget_renderer', path +begin + Rutie.new(:widget_renderer).init 'Init_widget_renderer', path +rescue SystemExit => e + raise LoadError, "WidgetRenderer native init exited: #{e.message}" +end