diff --git a/slack_sdk/socket_mode/builtin/client.py b/slack_sdk/socket_mode/builtin/client.py index a5e902b5e..132de10db 100644 --- a/slack_sdk/socket_mode/builtin/client.py +++ b/slack_sdk/socket_mode/builtin/client.py @@ -221,10 +221,13 @@ def send_message(self, message: str) -> None: ) raise e - def close(self): + def close(self) -> None: self.closed = True self.auto_reconnect_enabled = False + self.current_session_state.terminated = True self.disconnect() + if self.current_session_runner.is_alive(): + self.current_session_runner.shutdown() if self.current_app_monitor.is_alive(): self.current_app_monitor.shutdown() if self.message_processor.is_alive(): diff --git a/tests/slack_sdk/socket_mode/test_interactions_builtin.py b/tests/slack_sdk/socket_mode/test_interactions_builtin.py index 3f53e4cd1..216453afe 100644 --- a/tests/slack_sdk/socket_mode/test_interactions_builtin.py +++ b/tests/slack_sdk/socket_mode/test_interactions_builtin.py @@ -145,3 +145,25 @@ def test_send_message_while_disconnection(self): client.send_message("foo") finally: client.close() + + def test_close_reaps_current_session_runner(self): + # Regression for #1873: close() must reap current_session_runner without hanging. + client = SocketModeClient( + app_token="xapp-A111-222-xyz", + web_client=self.web_client, + auto_reconnect_enabled=False, + trace_enabled=True, + ) + try: + client.wss_uri = "ws://0.0.0.0:3011/link" + client.connect() + self.assertTrue(client.is_connected()) + time.sleep(1) + + client.close() + + self.assertFalse(client.current_session_runner.is_alive()) + self.assertFalse(client.current_app_monitor.is_alive()) + self.assertFalse(client.message_processor.is_alive()) + finally: + client.close()