Module: AnyCable::Rails::ChannelState::ClassMethods

Defined in:
lib/anycable/rails/channel_state.rb

Instance Method Summary collapse

Instance Method Details

#channel_state_attributesObject



29
30
31
32
33
34
35
36
37
38
# File 'lib/anycable/rails/channel_state.rb', line 29

def channel_state_attributes
  return @channel_state_attributes if instance_variable_defined?(:@channel_state_attributes)

  @channel_state_attributes =
    if superclass.respond_to?(:channel_state_attributes)
      superclass.channel_state_attributes.dup
    else
      []
    end
end

#state_attr_accessor(*names) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/anycable/rails/channel_state.rb', line 7

def state_attr_accessor(*names)
  names.each do |name|
    channel_state_attributes << name
    class_eval "      def \#{name}\n        return @\#{name} if instance_variable_defined?(:@\#{name})\n        return unless anycabled?\n\n        raw_val = __istate__[\"\#{name}\"]\n        val = raw_val.present? ? AnyCable::Serializer.deserialize(JSON.parse(raw_val)) : nil\n\n        @\#{name} = val.try(:with_indifferent_access) || val\n      end\n\n      def \#{name}=(val)\n        __istate__[\"\#{name}\"] = AnyCable::Serializer.serialize(val).to_json if anycabled?\n        instance_variable_set(:@\#{name}, val)\n      end\n    RUBY\n  end\nend\n", __FILE__, __LINE__ + 1