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