class Cucumber::Pro::WebSocket::Worker

Attributes

error_handler[R]
logger[R]
next_task[R]
timeout[R]

Public Class Methods

new(create_socket, logger, error_handler, options = {}) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 60
def initialize(create_socket, logger, error_handler, options = {})
  @create_socket, @logger, @error_handler = create_socket, logger, error_handler
  @timeout = options.fetch(:timeout) { raise ArgumentError("Please specify timeout") }
  @q = Queue.new
  @em = Thread.new { start_client }
  @ack_count = 0
end

Public Instance Methods

close() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 68
def close
  @q << -> {
    if @ack_count == 0
      close_websocket
    else
      ensure_close_timer_started
      EM.next_tick { close }
    end
  }
  self
end
closed?() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 88
def closed?
  !@em.alive?
end
send(data) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 80
def send(data)
  @q << -> {
    @ws.send data
    @ack_count += 1
  }
  self
end

Private Instance Methods

access_denied?(event) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 161
def access_denied?(event)
  event.code == 1002 &&
    event.reason == \
    "Error during WebSocket handshake: Unexpected response code: 401"
end
close_websocket() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 109
def close_websocket
  logger.debug [:ws, :close_socket]
  @ws.close
end
ensure_close_timer_started() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 96
def ensure_close_timer_started
  return if @close_timer
  logger.debug [:ws, :set_close_timeout, timeout]
  @close_timer = EM.add_timer(timeout) { handle_close_timeout }
end
handle_close_timeout() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 102
def handle_close_timeout
  logger.debug [:ws, :handle_close_timeout]
  return unless @ws
  error_handler.error Error::Timeout.new
  close_websocket
end
on_close(event) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 145
def on_close(event)
  logger.debug [:ws, :close]
  if access_denied?(event)
    raise Error::AccessDenied.new
  end
  @ws = nil
  EM.stop_event_loop
  self
end
on_error(event) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 130
def on_error(event)
  logger.error [:ws, :error]
  self
end
on_message(event) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 135
def on_message(event)
  logger.debug [:ws, :message, event.data]
  @ack_count -= 1
  message = JSON.parse(event.data)
  if(message['error'])
    raise Error::ServerError.new(message['error'])
  end
  self
end
on_open(event) click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 124
def on_open(event)
  logger.debug [:ws, :open]
  process_tasks
  self
end
process_tasks() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 155
def process_tasks
  @q.pop.call if !@q.empty?
  EM.next_tick { process_tasks }
  self
end
start_client() click to toggle source
# File lib/cucumber/pro/web_socket/session.rb, line 114
def start_client
  EM.run do
    logger.debug [:ws, :start]
    @ws = @create_socket.call(self)
  end
  self
rescue => exception
  error_handler.error exception
end