@@ -18,17 +18,11 @@ use super::{Event, GatewayClient, GatewayPayload};
1818pub ( super ) async fn gateway_task (
1919 mut connection : super :: WebSocketConnection ,
2020 mut inbox : tokio:: sync:: broadcast:: Receiver < Event > ,
21- mut kill_receive : tokio:: sync:: broadcast:: Receiver < ( ) > ,
22- mut kill_send : tokio:: sync:: broadcast:: Sender < ( ) > ,
2321 mut heartbeat_send : tokio:: sync:: broadcast:: Sender < GatewayHeartbeat > ,
2422 last_sequence_number : Arc < Mutex < u64 > > ,
2523) {
2624 log:: trace!( target: "symfonia::gateway::gateway_task" , "Started a new gateway task!" ) ;
27- let inbox_processor = tokio:: spawn ( process_inbox (
28- connection. clone ( ) ,
29- inbox. resubscribe ( ) ,
30- kill_receive. resubscribe ( ) ,
31- ) ) ;
25+ let inbox_processor = tokio:: spawn ( process_inbox ( connection. clone ( ) , inbox. resubscribe ( ) ) ) ;
3226
3327 /*
3428 Before we can respond to any gateway event we receive, we need to figure out what kind of event
@@ -39,18 +33,45 @@ pub(super) async fn gateway_task(
3933
4034 loop {
4135 tokio:: select! {
42- _ = kill_receive. recv( ) => {
36+ _ = connection . kill_receive. recv( ) => {
4337 return ;
4438 } ,
4539 message_result = connection. receiver. recv( ) => {
4640 match message_result {
4741 Ok ( message_of_unknown_type) => {
48- let event = unwrap_event( Event :: try_from( message_of_unknown_type) , connection. clone( ) , kill_send. clone( ) ) ;
49- // TODO: Handle event
42+ log:: trace!( target: "symfonia::gateway::gateway_task" , "Received raw message {:?}" , message_of_unknown_type) ;
43+ let event = unwrap_event( Event :: try_from( message_of_unknown_type) , connection. clone( ) , connection. kill_send. clone( ) ) ;
44+ log:: trace!( target: "symfonia::gateway::gateway_task" , "Event type of received message: {:?}" , event) ;
45+ match event {
46+ Event :: Dispatch ( _) => {
47+ // Receiving a dispatch event from a client is never correct
48+ log:: debug!( target: "symfonia::gateway::gateway_task" , "Received an unexpected message: {:?}" , event) ;
49+ connection. sender. send( Message :: Close ( Some ( CloseFrame { code: tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4002 ) , reason: "DECODE_ERROR" . into( ) } ) ) ) ;
50+ connection. kill_send. send( ( ) ) . expect( "Failed to send kill_send" ) ;
51+ panic!( "Killing gateway task: Received an unexpected message" ) ;
52+ } ,
53+ Event :: Heartbeat ( hearbeat_event) => {
54+ match heartbeat_send. send( hearbeat_event) {
55+ Err ( e) => {
56+ log:: debug!( target: "symfonia::gateway::gateway_task" , "Received Heartbeat but HeartbeatHandler seems to be dead?" ) ;
57+ connection. sender. send( Message :: Close ( Some ( CloseFrame { code: tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4002 ) , reason: "DECODE_ERROR" . into( ) } ) ) ) ;
58+ connection. kill_send. send( ( ) ) . expect( "Failed to send kill_send" ) ;
59+ panic!( "Killing gateway task: Received an unexpected message" ) ;
60+ } ,
61+ Ok ( _) => {
62+ log:: trace!( target: "symfonia::gateway::gateway_task" , "Forwarded heartbeat message to HeartbeatHandler!" ) ;
63+ }
64+ }
65+ }
66+ _ => {
67+ log:: error!( target: "symfonia::gateway::gateway_task" , "Received an event type for which no code is yet implemented in the gateway_task. Please open a issue or PR at the symfonia repository. {:?}" , event) ;
68+ }
69+ }
70+
5071 } ,
5172 Err ( error) => {
5273 connection. sender. send( Message :: Close ( Some ( CloseFrame { code: tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4000 ) , reason: "INTERNAL_SERVER_ERROR" . into( ) } ) ) ) ;
53- kill_send. send( ( ) ) . expect( "Failed to send kill_send" ) ;
74+ connection . kill_send. send( ( ) ) . expect( "Failed to send kill_send" ) ;
5475 return ;
5576 } ,
5677 }
@@ -81,26 +102,26 @@ fn unwrap_event(
81102 match e {
82103 Error :: Gateway ( g) => match g {
83104 GatewayError :: UnexpectedOpcode ( o) => {
84- log:: debug!( target: "symfonia::gateway::gateway_task" , "Received an unexpected opcode: {:?}" , o) ;
105+ log:: debug!( target: "symfonia::gateway::gateway_task::unwrap_event " , "Received an unexpected opcode: {:?}" , o) ;
85106 connection. sender . send ( Message :: Close ( Some ( CloseFrame { code : tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4001 ) , reason : "UNKNOWN_OPCODE" . into ( ) } ) ) ) ;
86107 kill_send. send ( ( ) ) . expect ( "Failed to send kill_send" ) ;
87108 panic ! ( "Killing gateway task: Received an unexpected opcode" ) ;
88109 }
89110 GatewayError :: UnexpectedMessage ( m) => {
90- log:: debug!( target: "symfonia::gateway::gateway_task" , "Received an unexpected message: {:?}" , m) ;
111+ log:: debug!( target: "symfonia::gateway::gateway_task::unwrap_event " , "Received an unexpected message: {:?}" , m) ;
91112 connection. sender . send ( Message :: Close ( Some ( CloseFrame { code : tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4002 ) , reason : "DECODE_ERROR" . into ( ) } ) ) ) ;
92113 kill_send. send ( ( ) ) . expect ( "Failed to send kill_send" ) ;
93114 panic ! ( "Killing gateway task: Received an unexpected message" ) ;
94115 }
95116 _ => {
96- log:: debug!( target: "symfonia::gateway::gateway_task" , "Received an unexpected error: {:?}" , g) ;
117+ log:: debug!( target: "symfonia::gateway::gateway_task::unwrap_event " , "Received an unexpected error: {:?}" , g) ;
97118 connection. sender . send ( Message :: Close ( Some ( CloseFrame { code : tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4000 ) , reason : "INTERNAL_SERVER_ERROR" . into ( ) } ) ) ) ;
98119 kill_send. send ( ( ) ) . expect ( "Failed to send kill_send" ) ;
99120 panic ! ( "Killing gateway task: Received an unexpected error" ) ;
100121 }
101122 } ,
102123 _ => {
103- log:: debug!( target: "symfonia::gateway::gateway_task" , "Received an unexpected error: {:?}" , e) ;
124+ log:: debug!( target: "symfonia::gateway::gateway_task::unwrap_event " , "Received an unexpected error: {:?}" , e) ;
104125 connection. sender . send ( Message :: Close ( Some ( CloseFrame { code : tokio_tungstenite:: tungstenite:: protocol:: frame:: coding:: CloseCode :: Library ( 4000 ) , reason : "INTERNAL_SERVER_ERROR" . into ( ) } ) ) ) ;
105126 kill_send. send ( ( ) ) . expect ( "Failed to send kill_send" ) ;
106127 panic ! ( "Killing gateway task: Received an unexpected error" ) ;
@@ -112,13 +133,12 @@ fn unwrap_event(
112133}
113134
114135async fn process_inbox (
115- connection : super :: WebSocketConnection ,
136+ mut connection : super :: WebSocketConnection ,
116137 mut inbox : tokio:: sync:: broadcast:: Receiver < Event > ,
117- mut kill_receive : tokio:: sync:: broadcast:: Receiver < ( ) > ,
118138) {
119139 loop {
120140 tokio:: select! {
121- _ = kill_receive. recv( ) => {
141+ _ = connection . kill_receive. recv( ) => {
122142 return ;
123143 }
124144 event = inbox. recv( ) => {
0 commit comments