use multiple threads to respond to messages

This commit is contained in:
2026-03-25 17:44:34 -04:00
parent a1ed1564b9
commit 32c9f0fd6c
2 changed files with 21 additions and 11 deletions
+7 -5
View File
@@ -44,6 +44,11 @@ actor GatewayClient {
while !Task.isCancelled { while !Task.isCancelled {
try await sendHeartbeat() try await sendHeartbeat()
try await Task.sleep(for: .milliseconds(helloMessage.heartbeat_interval)) try await Task.sleep(for: .milliseconds(helloMessage.heartbeat_interval))
if await !hbAck {
// haven't heard back
await ws.cancel()
}
} }
} catch { } catch {
print("Heartbeat task canceled") print("Heartbeat task canceled")
@@ -127,7 +132,8 @@ actor GatewayClient {
private func attemptResume() async throws { private func attemptResume() async throws {
guard guard
ws.closeCode.rawValue != 4004 && ws.closeCode.rawValue < 4010, ws.closeCode.rawValue != 4004 && ws.closeCode.rawValue != 1000 &&
ws.closeCode.rawValue != 1001 && ws.closeCode.rawValue < 4010,
let resumeURL = resumeURL, let resumeURL = resumeURL,
let sessionID = sessionID, let sessionID = sessionID,
let sequenceNum = sequenceNum let sequenceNum = sequenceNum
@@ -164,10 +170,6 @@ actor GatewayClient {
hbAck = false hbAck = false
let hbMessage = "{\"op\":1,\"d\":\(sequenceNum == nil ? "null" : String(sequenceNum!))}" let hbMessage = "{\"op\":1,\"d\":\(sequenceNum == nil ? "null" : String(sequenceNum!))}"
try await ws.send(.string(hbMessage)) try await ws.send(.string(hbMessage))
try await Task.sleep(for: .seconds(5))
if !hbAck {
ws.cancel(with: .normalClosure, reason: nil)
}
} }
var events: AsyncStream<GatewayPayload> { var events: AsyncStream<GatewayPayload> {
+14 -6
View File
@@ -23,13 +23,21 @@ struct Zundamon {
try await bot.connect() try await bot.connect()
for await event in await bot.events { await withThrowingTaskGroup(of: Void.self) { group in
switch event { for i in 0...5 {
case .messageCreate(let event): group.addTask {
try await MessageHandler(ctx: event, client: bot.client).handle() for await event in await bot.events {
default: print(i)
continue switch event {
case .messageCreate(let event):
try await MessageHandler(ctx: event, client: bot.client).handle()
default:
continue
}
}
}
} }
} }
print("bottom of main") print("bottom of main")
} }