diff --git a/Sources/Packages/Sources/SecretAgentKit/SocketController.swift b/Sources/Packages/Sources/SecretAgentKit/SocketController.swift index 9de2564..f8aa7cb 100644 --- a/Sources/Packages/Sources/SecretAgentKit/SocketController.swift +++ b/Sources/Packages/Sources/SecretAgentKit/SocketController.swift @@ -36,16 +36,16 @@ public struct SocketController { logger.debug("Socket controller path is clear") port = SocketPort(path: path) fileHandle = FileHandle(fileDescriptor: port.socket, closeOnDealloc: true) - Task { [fileHandle, sessionsContinuation, logger] in + Task { @MainActor [fileHandle, sessionsContinuation, logger] in for await notification in NotificationCenter.default.notifications(named: .NSFileHandleConnectionAccepted) { logger.debug("Socket controller accepted connection") guard let new = notification.userInfo?[NSFileHandleNotificationFileHandleItem] as? FileHandle else { continue } let session = Session(fileHandle: new) sessionsContinuation.yield(session) - await fileHandle.acceptConnectionInBackgroundAndNotifyOnMainActor() + fileHandle.acceptConnectionInBackgroundAndNotify() } } - fileHandle.acceptConnectionInBackgroundAndNotify(forModes: [RunLoop.Mode.common]) + fileHandle.acceptConnectionInBackgroundAndNotify() logger.debug("Socket listening at \(path)") } @@ -90,16 +90,16 @@ extension SocketController { logger.debug("Socket controller yielded data.") } } - Task { - await fileHandle.waitForDataInBackgroundAndNotifyOnMainActor() - } + fileHandle.waitForDataInBackgroundAndNotify() } /// Writes new data to the socket. /// - Parameter data: The data to write. public func write(_ data: Data) async throws { try fileHandle.write(contentsOf: data) - await fileHandle.waitForDataInBackgroundAndNotifyOnMainActor() + await MainActor.run { + fileHandle.waitForDataInBackgroundAndNotify() + } } /// Closes the socket and cleans up resources. @@ -113,22 +113,6 @@ extension SocketController { } -private extension FileHandle { - - /// Ensures waitForDataInBackgroundAndNotify will be called on the main actor. - @MainActor func waitForDataInBackgroundAndNotifyOnMainActor() { - waitForDataInBackgroundAndNotify() - } - - - /// Ensures acceptConnectionInBackgroundAndNotify will be called on the main actor. - /// - Parameter modes: the runloop modes to use. - @MainActor func acceptConnectionInBackgroundAndNotifyOnMainActor(forModes modes: [RunLoop.Mode]? = [RunLoop.Mode.common]) { - acceptConnectionInBackgroundAndNotify(forModes: modes) - } - -} - private extension SocketPort { convenience init(path: String) {