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