Skip to content

Commit

Permalink
fix: remove completed continuations from the connections list
Browse files Browse the repository at this point in the history
  • Loading branch information
LosFarmosCTL committed Jan 22, 2024
1 parent e52e0a1 commit 1e3dc61
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,28 @@ import TwitchIRC
internal actor AuthenticationContinuation: TwitchContinuation {
private var continuation: CheckedContinuation<Void, Error>?

internal func check(message: IncomingMessage) async {
if case .connectionNotice = message {
continuation?.resume()
continuation = nil
} else if case .notice(let notice) = message {
if case .global(let message) = notice.kind {
if message.contains("Login authentication failed") {
continuation?.resume(throwing: IRCError.loginFailed)
continuation = nil
}
}
}
internal func check(message: IncomingMessage) async -> Bool {
return checkConnectionNotice(message: message)
|| checkNotice(message: message)
}

private func checkConnectionNotice(message: IncomingMessage) -> Bool {
guard case .connectionNotice = message else { return false }

continuation?.resume()
continuation = nil
return true
}

private func checkNotice(message: IncomingMessage) -> Bool {
guard case .notice(let notice) = message else { return false }
guard case .global(let message) = notice.kind else { return false }

guard message.contains("Login authentication failed") else { return false }

continuation?.resume(throwing: IRCError.loginFailed)
continuation = nil
return true
}

internal init(_ continuation: CheckedContinuation<Void, Error>) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import TwitchIRC
internal actor CapabilitiesContinuation: TwitchContinuation {
private var continuation: CheckedContinuation<Void, Error>?

internal func check(message: IncomingMessage) async {
guard case .capabilities = message else { return }
internal func check(message: IncomingMessage) async -> Bool {
guard case .capabilities = message else { return false }

continuation?.resume()
continuation = nil

return true
}

internal init(_ continuation: CheckedContinuation<Void, Error>) {
Expand Down
51 changes: 31 additions & 20 deletions Sources/Twitch/Chat/IRC/TwitchContinuations/JoinContinuation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,38 @@ internal actor JoinContinuation: TwitchContinuation {
private var continuation: CheckedContinuation<Void, Error>?
private let channel: String

internal func check(message: IncomingMessage) async {
if case .join(let join) = message {
if join.channel == self.channel {
continuation?.resume()
continuation = nil
}
} else if case .notice(let notice) = message {
if case .local(let channel, _, let noticeId) = notice.kind {
if case .msgChannelSuspended = noticeId {
if channel == self.channel {
continuation?.resume(throwing: IRCError.channelSuspended(channel))
continuation = nil
}
} else if case .msgBanned = noticeId {
if channel == self.channel {
continuation?.resume(throwing: IRCError.bannedFromChannel(channel))
continuation = nil
}
}
}
internal func check(message: IncomingMessage) async -> Bool {
return checkNotice(message: message) || checkJoin(message: message)
}

private func checkNotice(message: IncomingMessage) -> Bool {
guard case .notice(let notice) = message else { return false }
guard case .local(let channel, _, let noticeId) = notice.kind else {
return false
}

guard channel == self.channel else { return false }

switch noticeId {
case .msgChannelSuspended:
continuation?.resume(throwing: IRCError.channelSuspended(channel))
case .msgBanned:
continuation?.resume(throwing: IRCError.bannedFromChannel(channel))
default: return false
}

continuation = nil
return true
}

private func checkJoin(message: IncomingMessage) -> Bool {
guard case .join(let join) = message else { return false }
guard join.channel == self.channel else { return false }

continuation?.resume()
continuation = nil

return true
}

internal init(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ internal actor PartContinuation: TwitchContinuation {
private var continuation: CheckedContinuation<Void, Error>?
private let channel: String

internal func check(message: IncomingMessage) async {
guard case .part(let part) = message else { return }
guard part.channel == self.channel else { return }
internal func check(message: IncomingMessage) async -> Bool {
guard case .part(let part) = message else { return false }
guard part.channel == self.channel else { return false }

continuation?.resume()
continuation = nil

return true
}

internal init(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import TwitchIRC

internal protocol TwitchContinuation {
func check(message: IncomingMessage) async
func check(message: IncomingMessage) async -> Bool
}
9 changes: 7 additions & 2 deletions Sources/Twitch/Chat/IRC/TwitchIRCConnection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,13 @@ internal class TwitchIRCConnection {

// TODO: check all other NOTICE cases that indicate failure
private func checkContinuations(with message: IncomingMessage) async {
for continuation in continuations {
await continuation.check(message: message)
var incompleteContinuations: [TwitchContinuation] = []

for continuation in continuations
where await !continuation.check(message: message) {
incompleteContinuations.append(continuation)
}

continuations = incompleteContinuations
}
}

0 comments on commit 1e3dc61

Please sign in to comment.