From 49b4437f2a58cdc72c957b0e15ac0b76201a5b22 Mon Sep 17 00:00:00 2001 From: Koray Koska <11356621+koraykoska@users.noreply.github.com> Date: Fri, 7 Jul 2023 17:21:03 +0100 Subject: [PATCH] fix: ping race condition --- Sources/WebSocketKit/WebSocket.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Sources/WebSocketKit/WebSocket.swift b/Sources/WebSocketKit/WebSocket.swift index e0c11f55..e9372497 100644 --- a/Sources/WebSocketKit/WebSocket.swift +++ b/Sources/WebSocketKit/WebSocket.swift @@ -22,7 +22,7 @@ public final class WebSocket: Sendable { public var closeCode: WebSocketErrorCode? { _closeCode.withLockedValue { $0 } } - + private let _closeCode: NIOLockedValueBox public var onClose: EventLoopFuture { @@ -65,11 +65,11 @@ public final class WebSocket: Sendable { @preconcurrency public func onBinary(_ callback: @Sendable @escaping (WebSocket, ByteBuffer) -> ()) { self.onBinaryCallback.value = callback } - + public func onPong(_ callback: @Sendable @escaping (WebSocket, ByteBuffer) -> ()) { self.onPongCallback.value = callback } - + @available(*, deprecated, message: "Please use `onPong { socket, data in /* … */ }` with the additional `data` parameter.") @preconcurrency public func onPong(_ callback: @Sendable @escaping (WebSocket) -> ()) { self.onPongCallback.value = { ws, _ in callback(ws) } @@ -78,7 +78,7 @@ public final class WebSocket: Sendable { public func onPing(_ callback: @Sendable @escaping (WebSocket, ByteBuffer) -> ()) { self.onPingCallback.value = callback } - + @available(*, deprecated, message: "Please use `onPing { socket, data in /* … */ }` with the additional `data` parameter.") @preconcurrency public func onPing(_ callback: @Sendable @escaping (WebSocket) -> ()) { self.onPingCallback.value = { ws, _ in callback(ws) } @@ -308,6 +308,13 @@ public final class WebSocket: Sendable { @Sendable private func pingAndScheduleNextTimeoutTask() { + if !eventLoop.inEventLoop { + eventLoop.execute { + self.pingAndScheduleNextTimeoutTask() + } + return + } + guard channel.isActive, let pingInterval = pingInterval else { return }