feat: sending messages works
This commit is contained in:
@@ -56,32 +56,44 @@ actor GatewayClient {
|
||||
}
|
||||
|
||||
func getMessage() async throws -> GatewayMessage {
|
||||
let wsMessage = try! await ws.receive()
|
||||
print(wsMessage)
|
||||
guard case .string(let str) = wsMessage else { throw GatewayError.invalidMessage }
|
||||
var strBuffer = ""
|
||||
var gwMessage: GatewayMessage? = nil
|
||||
let json = JSONDecoder()
|
||||
let gwMessage = try json.decode(GatewayMessage.self, from: Data(str.utf8))
|
||||
while gwMessage == nil {
|
||||
let wsMessage = try await ws.receive()
|
||||
guard case .string(let str) = wsMessage else { throw GatewayError.invalidMessage }
|
||||
strBuffer.append(str)
|
||||
do {
|
||||
gwMessage = try json.decode(GatewayMessage.self, from: Data(strBuffer.utf8))
|
||||
} catch DecodingError.dataCorrupted {
|
||||
continue
|
||||
}
|
||||
}
|
||||
guard let gwMessage = gwMessage else { throw GatewayError.invalidMessage }
|
||||
sequenceNum = gwMessage.s ?? sequenceNum
|
||||
return gwMessage
|
||||
}
|
||||
|
||||
private func sendHeartbeat() async throws {
|
||||
let hbMessage = "{\"op\":1,\"d\":\(sequenceNum == nil ? "null" : String(sequenceNum!))}"
|
||||
print(hbMessage)
|
||||
try await ws.send(.string(hbMessage))
|
||||
}
|
||||
|
||||
var events: AsyncStream<GatewayMessage> {
|
||||
AsyncStream { [self] in
|
||||
guard await open else { return nil }
|
||||
do {
|
||||
let event = try await getMessage()
|
||||
if event.op == 1 { try await sendHeartbeat() }
|
||||
return event
|
||||
} catch {
|
||||
print("Error listening to gateway: \(error)")
|
||||
return nil
|
||||
var event: GatewayMessage? = nil
|
||||
while event == nil {
|
||||
do {
|
||||
while await !open {
|
||||
try await Task.sleep(for: .seconds(1))
|
||||
}
|
||||
event = try await getMessage()
|
||||
if event!.op == 1 { try await sendHeartbeat() }
|
||||
} catch {
|
||||
print("Error listening to gateway: \(error)")
|
||||
}
|
||||
}
|
||||
return event!
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user