Class: Ractor::Server::Client

Inherits:
Object
  • Object
show all
Extended by:
Debugging
Includes:
Debugging
Defined in:
lib/ractor/server/client.rb

Constant Summary collapse

CONFIG =
{
  share_args: Set[].freeze,
  tell_methods: Set[].freeze,
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Debugging

debug

Constructor Details

#initialize(server) ⇒ Client

Returns a new instance of Client.

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
# File 'lib/ractor/server/client.rb', line 12

def initialize(server)
  raise ArgumentError, "Expected a Ractor, got #{server.inspect}" unless server.is_a?(::Ractor)

  @nest_request_key = :"Ractor::Server::Client#{object_id}"
  @server = server
  freeze
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, **options, &block) ⇒ Object (private)



123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/ractor/server/client.rb', line 123

private def method_missing(method, *args, **options, &block)
  if implemented_by_server?(method)
    refresh_server_call_layer
    # sanity check
    unless self.class::ServerCallLayer.method_defined?(method)
      raise "`refresh_server_call_layer` failed for #{method}"
    end

    return __send__(method, *args, **options, &block)
  end

  super
end

Instance Attribute Details

#serverObject (readonly)

Returns the value of attribute server.



10
11
12
# File 'lib/ractor/server/client.rb', line 10

def server
  @server
end

Class Method Details

.config(key) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/ractor/server/client.rb', line 69

def config(key)
  cur = self::CONFIG
  cur_value = cur.fetch(key)
  if block_given?
    cur_value = yield cur_value
    remove_const(:CONFIG) if const_defined?(:CONFIG, false)
    const_set(:CONFIG, Ractor.make_shareable(cur.merge(key => cur_value)))
  end
  cur_value
end

.interface_with_server(*methods) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/ractor/server/client.rb', line 51

def interface_with_server(*methods)
  methods.flatten!(1)
  self::ServerCallLayer.class_eval do
    methods.each do |method|
      public alias_method(method, :call_server_alias)
    end
  end
  debug(:interface) { "Defined methods #{methods.join(', ')}" }

  methods
end

.refresh_server_call_layerObject



42
43
44
45
46
47
48
49
# File 'lib/ractor/server/client.rb', line 42

def refresh_server_call_layer
  layer = self::ServerCallLayer
  server_klass = self::Server
  are_defined = layer.instance_methods
  should_be_defined = server_klass.instance_methods - NOT_IMPLICITLY_DEFINED
  (are_defined - should_be_defined).each { layer.remove_method _1 }
  interface_with_server(*config(:tell_methods) | should_be_defined - are_defined)
end

.share_args(*methods) ⇒ Object



91
92
93
94
95
96
# File 'lib/ractor/server/client.rb', line 91

def share_args(*methods)
  methods.flatten!(1)
  config(:share_args) { |val| val + methods }

  methods
end

.start(*args, **options) ⇒ Object



37
38
39
40
# File 'lib/ractor/server/client.rb', line 37

def start(*args, **options)
  ractor = self.class::Server.start_ractor(*args, **options)
  new(ractor)
end

.sync_kind(method, block_given) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/ractor/server/client.rb', line 80

def sync_kind(method, block_given)
  case
  when setter?(method) || config(:tell_methods).include?(method)
    :tell
  when block_given
    :converse
  else
    :ask
  end
end

.tells(*methods) ⇒ Object



63
64
65
66
67
# File 'lib/ractor/server/client.rb', line 63

def tells(*methods)
  methods.flatten!(1)
  config(:tell_methods) { |set| set + methods }
  interface_with_server(*methods)
end

Instance Method Details

#inspectObject Also known as: to_s



25
26
27
# File 'lib/ractor/server/client.rb', line 25

def inspect
  "<##{self.class} server: #{call_server(:inspect)}>"
end