@@ -53,6 +53,7 @@ class DiscordGateway: WebSocketDelegate, ObservableObject {
5353 request. timeoutInterval = connTimeout
5454 socket = WebSocket ( request: request)
5555 socket. delegate = self
56+ socket. callbackQueue = queue
5657
5758 log. i ( " Attempting connection to Gateway: \( apiConfig. gateway) " )
5859 socket. connect ( )
@@ -157,69 +158,67 @@ class DiscordGateway: WebSocketDelegate, ObservableObject {
157158 }
158159
159160 func handleIncoming( received: String ) {
160- queue. async { [ self ] in
161- guard let decoded = try ? JSONDecoder ( ) . decode ( GatewayIncoming . self, from: received. data ( using: . utf8) !)
162- else { return }
163-
164- DispatchQueue . main. async {
165- if ( decoded. s != nil ) { seq = decoded. s } // Update sequence
161+ guard let decoded = try ? JSONDecoder ( ) . decode ( GatewayIncoming . self, from: received. data ( using: . utf8) !)
162+ else { return }
163+
164+ DispatchQueue . main. async {
165+ if ( decoded. s != nil ) { self . seq = decoded. s } // Update sequence
166+ }
167+
168+ switch ( decoded. op) {
169+ case . heartbeat:
170+ // Immediately send heartbeat as requested
171+ log. d ( " Send heartbeat by server request " )
172+ sendToGateway ( op: . heartbeat, d: GatewayHeartbeat ( ) )
173+ case . hello:
174+ // Start heartbeating and send identify
175+ guard let d = decoded. d as? GatewayHello else { return }
176+ initHeartbeat ( interval: d. heartbeat_interval)
177+
178+ // Check if we're attempting to and can resume
179+ if isReconnecting && !doNotResume && sessionID != nil && seq != nil {
180+ log. i ( " Attempting resume " )
181+ guard let resume = getResume ( seq: seq!, sessionID: sessionID!)
182+ else { return }
183+ sendToGateway ( op: . resume, d: resume)
166184 }
167-
168- switch ( decoded. op) {
169- case . heartbeat:
170- // Immediately send heartbeat as requested
171- log. d ( " Send heartbeat by server request " )
172- sendToGateway ( op: . heartbeat, d: GatewayHeartbeat ( ) )
173- case . hello:
174- // Start heartbeating and send identify
175- guard let d = decoded. d as? GatewayHello else { return }
176- initHeartbeat ( interval: d. heartbeat_interval)
177-
178- // Check if we're attempting to and can resume
179- if isReconnecting && !doNotResume && sessionID != nil && seq != nil {
180- log. i ( " Attempting resume " )
181- guard let resume = getResume ( seq: seq!, sessionID: sessionID!)
182- else { return }
183- sendToGateway ( op: . resume, d: resume)
185+ else {
186+ log. d ( " Sending identify: " , isConnected, !doNotResume, sessionID ?? " No sessionID " , seq ?? - 1 )
187+ // Send identify
188+ DispatchQueue . main. async {
189+ self . seq = nil // Clear sequence #
190+ self . isReconnecting = false // Resuming failed/not attempted
184191 }
185- else {
186- log. d ( " Sending identify: " , isConnected, !doNotResume, sessionID ?? " No sessionID " , seq ?? - 1 )
187- // Send identify
188- DispatchQueue . main. async {
189- seq = nil // Clear sequence #
190- isReconnecting = false // Resuming failed/not attempted
191- }
192- guard let identify = getIdentify ( ) else {
193- log. d ( " Token not in keychain " )
194- authFailed = true
195- socket. disconnect ( closeCode: 1000 )
196- return
197- }
198- sendToGateway ( op: . identify, d: identify)
192+ guard let identify = getIdentify ( ) else {
193+ log. d ( " Token not in keychain " )
194+ authFailed = true
195+ socket. disconnect ( closeCode: 1000 )
196+ return
199197 }
200- case . heartbeatAck: DispatchQueue . main. async { missedACK = 0 }
201- case . dispatchEvent:
202- guard let type = decoded. t else { return }
203- guard let data = decoded. d else { return }
204- switch ( type) {
205- case . ready:
206- guard let d = data as? ReadyEvt else { return }
207- DispatchQueue . main. async {
208- doNotResume = false
209- sessionID = d. session_id
210- cache. guilds = d. guilds
211- cache. user = d. user
212- }
213- log. i ( " Gateway ready " )
214- default : log. i ( " Dispatched event < \( type) > " )
198+ sendToGateway ( op: . identify, d: identify)
199+ }
200+ case . heartbeatAck: DispatchQueue . main. async { self . missedACK = 0 }
201+ case . dispatchEvent:
202+ guard let type = decoded. t else { return }
203+ guard let data = decoded. d else { return }
204+ switch ( type) {
205+ case . ready:
206+ guard let d = data as? ReadyEvt else { return }
207+ DispatchQueue . main. async {
208+ self . doNotResume = false
209+ self . sessionID = d. session_id
210+ self . cache. guilds = d. guilds
211+ self . cache. user = d. user
215212 }
216- onEvent. notify ( event: ( type, data) )
217- case . invalidSession:
218- // Check if the session can be resumed
219- let shouldResume = ( decoded. primitiveData as? Bool ) ?? false
220- attemptReconnect ( resume: shouldResume)
221- default : log. w ( " Unimplemented opcode: \( decoded. op) " )
213+ log. i ( " Gateway ready " )
214+ default : log. i ( " Dispatched event < \( type) > " )
222215 }
216+ onEvent. notify ( event: ( type, data) )
217+ case . invalidSession:
218+ // Check if the session can be resumed
219+ let shouldResume = ( decoded. primitiveData as? Bool ) ?? false
220+ attemptReconnect ( resume: shouldResume)
221+ default : log. w ( " Unimplemented opcode: \( decoded. op) " )
223222 }
224223 }
225224}
0 commit comments