Class: CableRoom::RoomMembership

Inherits:
Object
  • Object
show all
Includes:
Ports
Defined in:
lib/cable_room/room_member.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Ports

#close_streamed_ports!, #ports, #stream_port

Constructor Details

#initialize(cable_channel, room_class, room_key, create: false, on_room_opened: nil, on_joined: nil, on_message: nil, on_room_closed: nil, on_left: nil, tags: [], extra: nil, &preconfigure) ⇒ RoomMembership

Returns a new instance of RoomMembership.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/cable_room/room_member.rb', line 75

def initialize(
  cable_channel,
  room_class,
  room_key,
  create: false,
  on_room_opened: nil, # Not guaranteed (Only given if the Room Opens while we are trying to connect to it)
  on_joined: nil,
  on_message: nil,
  on_room_closed: nil, # Not guaranteed (Only given if the Room Closes while we are connected to it)
  on_left: nil,
  tags: [],
  extra: nil,
  &preconfigure
)
  @mutex = Monitor.new

  @has_left = false
  @has_established = false
  @streams_live = false
  @reannounce_delay = nil
  @reannounce_job = nil

  @cable_channel = cable_channel
  @room_class = room_class
  @room_key = room_key
  @allow_create = create

  @on_room_opened = on_room_opened
  @on_joined = on_joined
  @on_message = on_message
  @on_room_closed = on_room_closed
  @on_left = on_left
  @preconfigure = preconfigure

  @tags = Array(tags).map(&:to_sym)
  @extra = extra

  initiate_connection
end

Instance Attribute Details

#room_class ⇒ Object (readonly)

Returns the value of attribute room_class.



73
74
75
# File 'lib/cable_room/room_member.rb', line 73

def room_class
  @room_class
end

Instance Method Details

#<<(data) ⇒ Object



117
118
119
# File 'lib/cable_room/room_member.rb', line 117

def <<(data)
  port_transmit(room_class::ROOM_IN_CHANNEL, data)
end

#connected? ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/cable_room/room_member.rb', line 121

def connected?
  !left? && @has_established
end

#key ⇒ Object



163
# File 'lib/cable_room/room_member.rb', line 163

def key; @room_key; end

#leave! ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/cable_room/room_member.rb', line 141

def leave!
  @mutex.synchronize do
    return if left?

    stop_reannouncing
    close_streamed_ports!
    @cable_channel._room_memberships.delete(self)
    port_transmit(room_class::ROOM_IN_CHANNEL, { type: 'port_disconnected' }, secure_context: true)
    @has_left = true
  end
  @on_left&.call(self)
end

#left? ⇒ Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/cable_room/room_member.rb', line 125

def left?
  @mutex.synchronize { @has_left }
end

#ping! ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/cable_room/room_member.rb', line 129

def ping!
  return if left?
  if @has_established
    port_transmit(room_class::ROOM_IN_CHANNEL, { type: 'port_ping' }, secure_context: true) unless recently_transmitted?
  else
    transmit_port_connected
  end
  @mutex.synchronize do
    maybe_provision_room
  end
end

#rejoin! ⇒ Object



154
155
156
157
158
159
160
161
# File 'lib/cable_room/room_member.rb', line 154

def rejoin!
  @mutex.synchronize do
    return unless left?

    @has_left = false
    initiate_connection
  end
end

#streams_live! ⇒ Object



166
167
168
# File 'lib/cable_room/room_member.rb', line 166

def streams_live!
  @streams_live = true
end

#transmit_port_connected ⇒ Object



171
172
173
174
175
176
177
178
179
# File 'lib/cable_room/room_member.rb', line 171

def transmit_port_connected
  msg = {
    type: 'port_connected',
    tags: @tags,
  }
  msg[:extra] = ::ActiveJob::Arguments.serialize([@extra]) if @extra
  port_transmit(room_class::ROOM_IN_CHANNEL, msg, secure_context: true)
  schedule_reannounce
end