class Meshchat::Network::Remote::Relay
Constants
- CHANNEL
This channel is determine by the server, see github.com/NullVoxPopuli/mesh-relay/blob/master/app/channels/mesh_relay_channel.rb
Attributes
_client[R]
_connected[RW]
_message_queue[R]
_request_processor[R]
_url[R]
Public Class Methods
new(url, message_dispatcher, subscribed_callback = nil)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 18 def initialize(url, message_dispatcher, subscribed_callback = nil) @_url = url @_message_queue = [] @_request_processor = Incoming::RequestProcessor.new( network: NETWORK_RELAY, location: url, message_dispatcher: message_dispatcher ) setup(subscribed_callback: subscribed_callback) end
Public Instance Methods
chat_message_received(message)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 100 def chat_message_received(message) _request_processor.process(message) rescue => e ap e.message puts e.backtrace end
connected?()
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 68 def connected? _connected end
error_message_received(message)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 107 def error_message_received(message) Display.info message['error'] if message['status'] == 404 uid = message['uid'] mark_as_offline(uid) end end
mark_as_offline(uid)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 115 def mark_as_offline(uid) node = Node.find_by_uid(uid) if node Display.info "#{node.alias_name} has ventured offline" node.update(on_relay: false) else Display.info 'someone directly sent you a fake offline message' end end
process_error(message)
click to toggle source
TODO: what does an error message look like? TODO: what are situations in which we receive an error message?
# File lib/meshchat/network/remote/relay.rb, line 96 def process_error(message) Display.alert(message) end
process_message(message)
click to toggle source
example messages: {“identifier”=>“{"channel":"MeshRelayChannel"}”, “message”=>{“message”=>“hi”}} {“identifier”=>“{"channel":"MeshRelayChannel"}”, “message”=>{“error”=>“hi”}} {“identifier”=>“{"channel":"MeshRelayChannel"}”, “type”=>“confirm_subscription”} {“identifier”=>“{"channel":"MeshRelayChannel"}”, “message”=>{“error”=>“Member with UID user2 could not be found”}}
# File lib/meshchat/network/remote/relay.rb, line 77 def process_message(message) Debug.received_message_from_relay(message, _url) _, type, message = message.values_at('identifier', 'type', 'message') # do we want to do anything here? return if type == 'confirm_subscription' # are there any other types of websocket messages? return unless message if message['message'] chat_message_received(message) elsif message['error'] error_message_received(message) end end
send_now(payload)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 64 def send_now(payload) _client.perform('chat', payload) end
setup(subscribed_callback: nil)
click to toggle source
# File lib/meshchat/network/remote/relay.rb, line 30 def setup(subscribed_callback: nil) path = "#{_url}?uid=#{APP_CONFIG.user['uid']}" @_client = ActionCableClient.new(path, CHANNEL) # don't output anything upon connecting _client.connected do Debug.connected_to_relay self._connected = true end # If there are errors, report them! _client.errored do |message| process_error(message) end _client.subscribed do Debug.subscribed_to_relay subscribed_callback.call if subscribed_callback end # forward the encrypted messages to our RequestProcessor # so that they can be decrypted _client.received do |message| process_message(message) end _client.disconnected do Debug.disconnected_from_relay self._connected = false end _client end