class Deploy::CLI::WebsocketClient

Manages a connection and associated subscriptions to DeployHQ's websocket

Attributes

subscriptions[R]

Public Class Methods

new() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 41
def initialize
  @subscriptions = {}
end

Public Instance Methods

run() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 50
def run
  catch(:finished) do
    EM.run do
      connection.onopen do
        logger.info "connected"
      end

      connection.onmessage do |msg, type|
        receive(msg)
      end

      connection.onclose do |code, reason|
        logger.info "disconnected #{code} #{reason}"
        reset_connection
      end
    end
  end
end
subscribe(exchange, routing_key) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 45
def subscribe(exchange, routing_key)
  key = subscription_key(exchange, routing_key)
  subscriptions[key] ||= Subscription.new(exchange, routing_key)
end

Private Instance Methods

authenticate() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 86
def authenticate
  send('Authenticate', api_key: Deploy.configuration.api_key)
end
connection() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 124
def connection
  uri = "#{Deploy.configuration.websocket_hostname}/pushwss"
  @connection ||= WebSocket::EventMachine::Client.connect(uri: uri)
end
dispatch(event, payload, mq = nil) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 71
def dispatch(event, payload, mq = nil)
  case event
  when 'Welcome'
    authenticate
  when 'Authenticated'
    request_subscriptions
  when 'Subscribed'
    successful_subscription(payload)
  when 'Error', 'InternalError'
    websocket_error(payload)
  else
    subscription_event(event, payload, mq) if mq
  end
end
logger() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 133
def logger
  @logger ||= Logger.new(STDOUT)
  @logger.level = Logger::ERROR
  @logger
end
receive(msg) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 112
def receive(msg)
  logger.debug "< #{msg}"
  decoded = JSON.parse(msg)
  dispatch(decoded['event'], decoded['payload'], decoded['mq'])
end
request_subscriptions() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 90
def request_subscriptions
  subscriptions.each do |_key, subscription|
    send('Subscribe', exchange: subscription.exchange, routing_key: subscription.routing_key)
  end
end
reset_connection() click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 129
def reset_connection
  @connection = nil
end
send(action, payload = {}) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 118
def send(action, payload = {})
  msg = JSON.dump(action: action, payload: payload)
  logger.debug "> #{msg}"
  connection.send(msg)
end
subscription_event(event, payload, mq) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 106
def subscription_event(event, payload, mq)
  key = subscription_key(mq["e"], mq["rk"])
  subscription = subscriptions[key]
  subscription.dispatch(event, payload) if subscription
end
subscription_key(exchange, routing_key) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 139
def subscription_key(exchange, routing_key)
  [exchange, routing_key].join('-')
end
successful_subscription(payload) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 96
def successful_subscription(payload)
  key = subscription_key(payload['exchange'], payload['routing_key'])
  subscription = subscriptions[key]
  subscription.subscribed! if subscription
end
websocket_error(payload) click to toggle source
# File lib/deploy/cli/websocket_client.rb, line 102
def websocket_error(payload)
  raise Deploy::Errors::WebsocketError, payload['error']
end