Skip to content

Commit b50eb49

Browse files
committed
Don't blow up when trying to close the client.
1 parent 63abf62 commit b50eb49

File tree

5 files changed

+15
-10
lines changed

5 files changed

+15
-10
lines changed

lib/slack/real_time/client.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ def config
8181

8282
def run_loop
8383
@socket.connect! do |driver|
84-
@callback.call(driver) if @callback
85-
8684
driver.on :open do |event|
8785
logger.debug("#{self.class}##{__method__}") { event.class.name }
8886
open(event)
@@ -100,6 +98,9 @@ def run_loop
10098
close(event)
10199
callback(event, :closed)
102100
end
101+
102+
# This must be called last to ensure any events are registered before invoking user code.
103+
@callback.call(driver) if @callback
103104
end
104105
end
105106

lib/slack/real_time/concurrency/async.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,12 @@ def connect!
6565

6666
# Close the socket.
6767
def close
68-
@socket.close if @socket
6968
super
69+
ensure
70+
if @socket
71+
@socket.close
72+
@socket = nil
73+
end
7074
end
7175

7276
def run_loop

lib/slack/real_time/concurrency/celluloid.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ def disconnect!
4646

4747
def close
4848
@closing = true
49-
driver.close if driver
5049
super
5150
end
5251

lib/slack/real_time/concurrency/eventmachine.rb

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ def disconnect!
5656
@thread = nil
5757
end
5858

59-
def close
60-
driver.close if driver
61-
super
62-
end
63-
6459
def send_data(message)
6560
logger.debug("#{self.class}##{__method__}") { message }
6661
driver.send(message)

lib/slack/real_time/socket.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ def connect!
3838
yield @driver if block_given?
3939
end
4040

41+
# Gracefully shut down the connection.
4142
def disconnect!
4243
@driver.close
44+
ensure
4345
close
4446
end
4547

@@ -74,7 +76,11 @@ def current_time
7476
end
7577

7678
def close
77-
@driver = nil
79+
# When you call `driver.emit(:close)`, it will typically end up calling `client.close` which will call `@socket.close` and end up back here. In order to break this infinite recursion, we check and set `@driver = nil` before invoking `client.close`.
80+
if driver = @driver
81+
@driver = nil
82+
driver.emit(:close)
83+
end
7884
end
7985

8086
protected

0 commit comments

Comments
 (0)