Skip to content

Commit 00ff4e2

Browse files
committed
Fix #926 Handle closing aiohttp.ClientSession in socket mode
1 parent 79b199c commit 00ff4e2

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# ------------------
2+
# Only for running this script here
3+
import sys
4+
from os.path import dirname
5+
6+
sys.path.insert(1, f"{dirname(__file__)}/../../..")
7+
# ------------------
8+
9+
import asyncio
10+
import logging
11+
import os
12+
13+
from slack_sdk.socket_mode.aiohttp import SocketModeClient
14+
15+
logging.basicConfig(level=logging.DEBUG)
16+
17+
async def main():
18+
client = SocketModeClient(app_token=os.environ["SLACK_APP_TOKEN"])
19+
await client.connect()
20+
await asyncio.sleep(3)
21+
await client.close()
22+
23+
24+
if __name__ == "__main__":
25+
asyncio.run(main())
26+
27+
# The issue:
28+
# ERROR:asyncio:Unclosed client session
29+
# client_session: <aiohttp.client.ClientSession object at 0x10e1085e0>
30+
# INFO:slack_sdk.socket_mode.aiohttp:The session has been abandoned

slack_sdk/socket_mode/aiohttp/__init__.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ def __init__(
8383
self.current_session = None
8484
self.current_session_monitor = None
8585

86+
# https://docs.aiohttp.org/en/stable/client_reference.html
87+
# Unless you are connecting to a large, unknown number of different servers
88+
# over the lifetime of your application,
89+
# it is suggested you use a single session for the lifetime of your application
90+
# to benefit from connection pooling.
91+
self.aiohttp_client_session = aiohttp.ClientSession()
92+
8693
self.on_message_listeners = on_message_listeners or []
8794
self.on_error_listeners = on_error_listeners or []
8895
self.on_close_listeners = on_close_listeners or []
@@ -154,10 +161,9 @@ async def receive_messages(self) -> None:
154161

155162
async def connect(self):
156163
old_session = None if self.current_session is None else self.current_session
157-
cs = aiohttp.ClientSession()
158164
if self.wss_uri is None:
159165
self.wss_uri = await self.issue_new_wss_url()
160-
self.current_session = await cs.ws_connect(
166+
self.current_session = await self.aiohttp_client_session.ws_connect(
161167
self.wss_uri, heartbeat=self.ping_interval, proxy=self.proxy,
162168
)
163169
self.auto_reconnect_enabled = self.default_auto_reconnect_enabled
@@ -194,3 +200,5 @@ async def close(self):
194200
self.current_session_monitor.cancel()
195201
if self.message_receiver is not None:
196202
self.message_receiver.cancel()
203+
if self.aiohttp_client_session is not None:
204+
await self.aiohttp_client_session.close()

0 commit comments

Comments
 (0)