From 0eb64913ca8be50f6ac5c79ecd4082eff27243ad Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 29 Dec 2016 00:56:55 +0000 Subject: [PATCH] Capture errors raise by emit() and re-raise them after the parser has finished running. --- lib/websocket/driver/draft75.rb | 2 ++ lib/websocket/driver/event_emitter.rb | 13 +++++++++++++ lib/websocket/driver/hybi.rb | 2 ++ lib/websocket/driver/native.rb | 1 + 4 files changed, 18 insertions(+) diff --git a/lib/websocket/driver/draft75.rb b/lib/websocket/driver/draft75.rb index 041b725..cde8ae4 100644 --- a/lib/websocket/driver/draft75.rb +++ b/lib/websocket/driver/draft75.rb @@ -68,6 +68,8 @@ module WebSocket end end end + + reraise_emit_exception end def frame(buffer, type = nil, error_type = nil) diff --git a/lib/websocket/driver/event_emitter.rb b/lib/websocket/driver/event_emitter.rb index 52d69a3..0411083 100644 --- a/lib/websocket/driver/event_emitter.rb +++ b/lib/websocket/driver/event_emitter.rb @@ -38,6 +38,9 @@ module WebSocket @listeners[event.to_s].dup.each do |listener| listener.call(*args) end + + rescue => error + @emit_exception ||= error end def listener_count(event) @@ -48,6 +51,16 @@ module WebSocket def listeners(event) @listeners[event.to_s] end + + private + + def reraise_emit_exception + if @emit_exception + error = @emit_exception + @emit_exception = nil + raise error + end + end end end diff --git a/lib/websocket/driver/hybi.rb b/lib/websocket/driver/hybi.rb index 36d1905..dc0e8b0 100644 --- a/lib/websocket/driver/hybi.rb +++ b/lib/websocket/driver/hybi.rb @@ -127,6 +127,8 @@ module WebSocket buffer = nil end end + + reraise_emit_exception end def binary(message) diff --git a/lib/websocket/driver/native.rb b/lib/websocket/driver/native.rb index a634a0f..f49df8e 100644 --- a/lib/websocket/driver/native.rb +++ b/lib/websocket/driver/native.rb @@ -41,6 +41,7 @@ module WebSocket def parse(chunk) @parser.parse(chunk) + reraise_emit_exception end def binary(message)