class Volt::Channel

Public Class Methods

new() click to toggle source
# File lib/volt/page/channel.rb, line 14
def initialize
  @socket          = nil
  self.status      = :opening
  self.connected   = false
  self.error       = nil
  self.retry_count = 0
  @queue           = []

  connect!
end

Public Instance Methods

close!() click to toggle source
# File lib/volt/page/channel.rb, line 125
def close!
  self.status = :closed
  `
    this.socket.close();
  `
end
closed(error) click to toggle source
# File lib/volt/page/channel.rb, line 83
def closed(error)
  self.status    = :closed
  self.connected = false
  self.error     = `error.reason`

  # Trigger a disconnect event
  trigger!('disconnect')

  reconnect!
end
connect!() click to toggle source
# File lib/volt/page/channel.rb, line 29
def connect!
  # The websocket url can be overridden by config.public.websocket_url
  socket_url = Volt.config.try(:public).try(:websocket_url) || begin
    "#{`document.location.host`}/socket"
  end

  if socket_url !~ /^wss?[:]\/\//
    if socket_url !~ /^[:]\/\//
      # Add :// to the front
      socket_url = "://#{socket_url}"
    end

    ws_proto = (`document.location.protocol` == 'https:') ? 'wss' : 'ws'

    # Add wss? to the front
    socket_url = "#{ws_proto}#{socket_url}"
  end

  `
    this.socket = new WebSocket(socket_url);

    this.socket.onopen = function () {
      self.$opened();
    };

    // Log errors
    this.socket.onerror = function (error) {
      console.log('WebSocket Error ', error);
    };

    // Log messages from the server
    this.socket.onmessage = function(message) {
      self['$message_received'](message.data);
    };

    this.socket.onclose = function(error) {
      self.$closed(error);
    };
  `
end
connected?() click to toggle source
# File lib/volt/page/channel.rb, line 25
def connected?
  connected
end
message_received(message) click to toggle source
# File lib/volt/page/channel.rb, line 107
def message_received(message)
  message = EJSON.parse(message)

  trigger!('message', *message)
end
opened() click to toggle source
# File lib/volt/page/channel.rb, line 70
def opened
  self.status             = :open
  self.connected          = true
  self.reconnect_interval = nil
  self.retry_count        = 0
  @queue.each do |message|
    send_message(message)
  end

  # Trigger a connect event
  trigger!('connect')
end
reconnect!() click to toggle source
# File lib/volt/page/channel.rb, line 94
def reconnect!
  self.status             = :reconnecting
  self.reconnect_interval ||= 0
  self.reconnect_interval += (1000 + rand(5000))
  self.retry_count += 1

  interval = self.reconnect_interval

  self.reconnect_in = interval

  reconnect_tick
end
send_message(message) click to toggle source
# File lib/volt/page/channel.rb, line 113
def send_message(message)
  if status != :open
    @queue << message
  else
    # TODO: Temp: wrap message in an array, so we're sure its valid JSON
    message = EJSON.stringify([message])
    `
      this.socket.send(message);
    `
  end
end

Private Instance Methods

reconnect_tick() click to toggle source
# File lib/volt/page/channel.rb, line 134
def reconnect_tick
  if reconnect_in >= 1000
    self.reconnect_in -= 1000
    `
    setTimeout(function() {
      self['$reconnect_tick']();
    }, 1000);
    `
  else
    connect!
  end
end