Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion config/initializers/widget_renderer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand All @@ -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
Expand Down
23 changes: 15 additions & 8 deletions ext/widget_renderer/lib/widget_renderer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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}" }
Expand Down Expand Up @@ -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
Expand All @@ -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<name>.so
Expand All @@ -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
Loading