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