def __init__( # type: ignore self, app: App, # type: ignore app_token: Optional[str] = None, logger: Optional[Logger] = None, web_client: Optional[AsyncWebClient] = None, ping_interval: float = 10, ): """Socket Mode adapter for Bolt apps. Please note that this adapter does not support proxy configuration as the underlying websockets module does not support proxy-wired connections. If you use proxy, consider using one of the other Socket Mode adapters. Args: app: The Bolt app app_token: App-level token starting with `xapp-` logger: Custom logger web_client: custom `slack_sdk.web.WebClient` instance ping_interval: The ping-pong internal (seconds) """ self.app = app self.app_token = app_token or os.environ["SLACK_APP_TOKEN"] self.client = SocketModeClient( app_token=self.app_token, logger=logger if logger is not None else app.logger, web_client=web_client if web_client is not None else app.client, ping_interval=ping_interval, ) self.client.socket_mode_request_listeners.append(self.handle)
async def test_issue_new_wss_url(self): client = SocketModeClient( app_token="xapp-A111-222-xyz", web_client=self.web_client, ) url = await client.issue_new_wss_url() self.assertTrue(url.startswith("wss://"))
def __init__( # type: ignore self, app: AsyncApp, # type: ignore app_token: Optional[str] = None, ): self.app = app self.app_token = app_token or os.environ["SLACK_APP_TOKEN"] self.client = SocketModeClient(app_token=self.app_token) self.client.socket_mode_request_listeners.append(self.handle)
async def test_connect_to_new_endpoint(self): client = SocketModeClient( app_token="xapp-A111-222-xyz", web_client=self.web_client, ) try: await client.connect_to_new_endpoint() except Exception as e: # TODO: valida test to connect pass finally: await client.close()
async def test_send_message_while_disconnection(self): if is_ci_unstable_test_skip_enabled(): return t = Thread(target=start_socket_mode_server(self, 3001)) t.daemon = True t.start() client = SocketModeClient( app_token="xapp-A111-222-xyz", web_client=self.web_client, auto_reconnect_enabled=False, trace_enabled=True, ) try: time.sleep(1) # wait for the server client.wss_uri = "ws://0.0.0.0:3001/link" await client.connect() await asyncio.sleep(1) # wait for the message receiver await client.send_message("foo") await client.disconnect() await asyncio.sleep(1) # wait for the message receiver try: await client.send_message("foo") self.fail("WebSocketException is expected here") except WebSocketException as _: pass await client.connect() await asyncio.sleep(1) # wait for the message receiver await client.send_message("foo") finally: await client.close() self.server.stop() self.server.close()
async def test_enqueue_message(self): client = SocketModeClient( app_token="xapp-A111-222-xyz", web_client=self.web_client, ) client.message_listeners.append(listener) try: await client.enqueue_message("hello") await client.process_message() await client.enqueue_message( """{"type":"hello","num_connections":1,"debug_info":{"host":"applink-111-222","build_number":10,"approximate_connection_time":18060},"connection_info":{"app_id":"A111"}}""" ) await client.process_message() finally: await client.close()
def __init__( # type: ignore self, app: AsyncApp, # type: ignore app_token: Optional[str] = None, logger: Optional[Logger] = None, web_client: Optional[AsyncWebClient] = None, ping_interval: float = 10, ): self.app = app self.app_token = app_token or os.environ["SLACK_APP_TOKEN"] self.client = SocketModeClient( app_token=self.app_token, logger=logger if logger is not None else app.logger, web_client=web_client if web_client is not None else app.client, ping_interval=ping_interval, ) self.client.socket_mode_request_listeners.append(self.handle)
async def main(): client = SocketModeClient( app_token=os.environ.get("SLACK_SDK_TEST_SOCKET_MODE_APP_TOKEN"), web_client=AsyncWebClient( token=os.environ.get("SLACK_SDK_TEST_SOCKET_MODE_BOT_TOKEN")), ) async def process(client: SocketModeClient, req: SocketModeRequest): if req.type == "events_api": response = SocketModeResponse(envelope_id=req.envelope_id) await client.send_socket_mode_response(response) await client.web_client.reactions_add( name="eyes", channel=req.payload["event"]["channel"], timestamp=req.payload["event"]["ts"], ) client.socket_mode_request_listeners.append(process) await client.connect() await asyncio.sleep(float("inf"))
async def test_interactions(self): t = Thread(target=start_socket_mode_server(self, 3002)) t.daemon = True t.start() received_messages = [] received_socket_mode_requests = [] async def message_handler( receiver: AsyncBaseSocketModeClient, message: dict, raw_message: Optional[str], ): self.logger.info(f"Raw Message: {raw_message}") await asyncio.sleep(randint(50, 200) / 1000) received_messages.append(raw_message) async def socket_mode_listener( receiver: AsyncBaseSocketModeClient, request: SocketModeRequest, ): self.logger.info(f"Socket Mode Request: {request}") await asyncio.sleep(randint(50, 200) / 1000) received_socket_mode_requests.append(request) client = SocketModeClient( app_token="xapp-A111-222-xyz", web_client=self.web_client, auto_reconnect_enabled=False, ) client.message_listeners.append(message_handler) client.socket_mode_request_listeners.append(socket_mode_listener) try: time.sleep(1) # wait for the server client.wss_uri = "ws://0.0.0.0:3002/link" await client.connect() await asyncio.sleep(1) # wait for the message receiver for _ in range(10): await client.send_message("foo") await client.send_message("bar") await client.send_message("baz") expected = (socket_mode_envelopes + [socket_mode_hello_message] + ["foo", "bar", "baz"] * 10) expected.sort() count = 0 while count < 10 and len(received_messages) < len(expected): await asyncio.sleep(0.2) count += 0.2 received_messages.sort() self.assertEqual(received_messages, expected) self.assertEqual(len(socket_mode_envelopes), len(received_socket_mode_requests)) finally: await client.close() self.server.stop() self.server.close()
async def test_init_close(self): client = SocketModeClient(app_token="xapp-A111-222-xyz") try: self.assertIsNotNone(client) finally: await client.close()