Skip to content

WebSocket DataChannel #11

@mattmassicotte

Description

@mattmassicotte

Suggested implementation from @jbromburg:

extension DataChannel {
    static func socket(url: URL) throws -> DataChannel {
        let socketSession: URLSession = .init(configuration: .default)
        let socket: URLSessionWebSocketTask = socketSession.webSocketTask(with: url)
        
        socket.resume()
        
        let (stream, continuation) = DataSequence.makeStream()

        Task {
            while socket.state == .running {
                do {
                    let message = try await socket.receive()
                    switch message {
                    case .data(let data):
                        continuation.yield(data)
                    case .string(let string):
                        if let data = string.data(using: .utf8) {
                            continuation.yield(data)
                        }
                    @unknown default:
                        fatalError("Unhandled message type")
                    }
                } catch {
                    continuation.finish()
                    throw error
                }
            }
        }
        
        let writeHandler: DataChannel.WriteHandler = {
            try await socket.send(.data($0))
        }
        
        return DataChannel(writeHandler: writeHandler, dataSequence: stream)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions