Class: Volt::Channel

Inherits:
Object show all
Includes:
Eventable, ReactiveAccessors
Defined in:
lib/volt/page/channel.rb

Instance Method Summary collapse

Methods included from Eventable

#on, #remove_listener, #trigger!

Methods included from ReactiveAccessors

#__reactive_dependency_get, included

Constructor Details

#initializeChannel

Returns a new instance of Channel.



14
15
16
17
18
19
20
21
22
23
# 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

Instance Method Details

#close!Object



125
126
127
128
129
130
# File 'lib/volt/page/channel.rb', line 125

def close!
  self.status = :closed
  `
    this.socket.close();
  `
end

#closed(error) ⇒ Object



83
84
85
86
87
88
89
90
91
92
# 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!Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 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?Boolean

Returns:



25
26
27
# File 'lib/volt/page/channel.rb', line 25

def connected?
  connected
end

#message_received(message) ⇒ Object



107
108
109
110
111
# File 'lib/volt/page/channel.rb', line 107

def message_received(message)
  message = EJSON.parse(message)

  trigger!('message', *message)
end

#openedObject



70
71
72
73
74
75
76
77
78
79
80
81
# 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!Object



94
95
96
97
98
99
100
101
102
103
104
105
# 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) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
# 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