Module: RobotLab::RactorBoundary

Defined in:
lib/robot_lab/ractor_boundary.rb

Overview

Utility for making values safe to pass across Ractor boundaries.

Recursively freezes Hash and Array structures. Raises RactorBoundaryError if a value cannot be made Ractor-shareable (e.g. a live IO or Proc).

Examples:

safe = RactorBoundary.freeze_deep({ model: "sonnet", args: { x: 1 } })
Ractor.shareable?(safe)  #=> true

Class Method Summary collapse

Class Method Details

.freeze_deep(obj) ⇒ Object

Recursively freeze an object for safe Ractor boundary crossing.

Parameters:

  • obj (Object)

    the value to freeze

Returns:

  • (Object)

    a frozen, Ractor-shareable copy

Raises:



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/robot_lab/ractor_boundary.rb', line 19

def self.freeze_deep(obj)
  return obj if Ractor.shareable?(obj)

  result = case obj
           when Hash
             obj.transform_keys { |k| freeze_deep(k) }
                .transform_values { |v| freeze_deep(v) }
           when Array
             obj.map { |v| freeze_deep(v) }
           else
             begin
               obj.dup
             rescue TypeError
               raise RactorBoundaryError,
                     "Cannot make #{obj.class} Ractor-shareable: dup not supported"
             end
           end

  Ractor.make_shareable(result)
rescue Ractor::IsolationError, Ractor::Error => e
  raise RactorBoundaryError, "Cannot make value Ractor-shareable: #{e.message}"
end