diff --git a/Examples/HelloWorld/Package.resolved b/Examples/HelloWorld/Package.resolved index 3ba4d2c..91453ab 100644 --- a/Examples/HelloWorld/Package.resolved +++ b/Examples/HelloWorld/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "b5b9014f132b00f60b454339b6fdd6997d19665a7ad65f217b3192277274a829", + "originHash" : "b9af8cd562ec2884daa5ebd0fc24d9eb7f9daa954495013f81ff58ee4f081376", "pins" : [ { "identity" : "async-http-client", @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/Graphiti.git", "state" : { - "revision" : "a23a3d232df202fc158ad2d698926325b470523c", - "version" : "3.0.0" + "revision" : "3ec7bf90d9884324852af9d96d2ce5aa60e02cde", + "version" : "3.1.0" } }, { @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQLTransportWS.git", "state" : { - "revision" : "6d62d9f980346f0644a5f4dc1593f2b0f1d07b44", - "version" : "1.0.0" + "revision" : "1fb0dbdec9bc220949370de3024c525c99b754f4", + "version" : "2.0.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQLWS.git", "state" : { - "revision" : "5a3b62e478668199d22f52df7cc7d44b51394cb4", - "version" : "1.0.0" + "revision" : "038a19b365faa9dc6d225a9499e8cfd992c996fa", + "version" : "2.0.0" } }, { diff --git a/Package.resolved b/Package.resolved index 375b369..974b38d 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "f2124c90d97730f0c1ccfefce1998ffd49b45cc9e2a3815bb08e726361f2b6ce", + "originHash" : "2a0d12dffb76bc194e23d22feb1b8acb69d315f8f87b13e43ac7c7550845bf2e", "pins" : [ { "identity" : "async-http-client", @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/Graphiti.git", "state" : { - "revision" : "a23a3d232df202fc158ad2d698926325b470523c", - "version" : "3.0.0" + "revision" : "3ec7bf90d9884324852af9d96d2ce5aa60e02cde", + "version" : "3.1.0" } }, { @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQLTransportWS.git", "state" : { - "revision" : "6d62d9f980346f0644a5f4dc1593f2b0f1d07b44", - "version" : "1.0.0" + "revision" : "1fb0dbdec9bc220949370de3024c525c99b754f4", + "version" : "2.0.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQLWS.git", "state" : { - "revision" : "5a3b62e478668199d22f52df7cc7d44b51394cb4", - "version" : "1.0.0" + "revision" : "038a19b365faa9dc6d225a9499e8cfd992c996fa", + "version" : "2.0.0" } }, { @@ -127,15 +127,6 @@ "version" : "1.3.0" } }, - { - "identity" : "swift-configuration", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-configuration.git", - "state" : { - "revision" : "b4768bd68d8a6fb356bd372cb41905046244fcae", - "version" : "1.0.2" - } - }, { "identity" : "swift-crypto", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index fca25bd..2e07807 100644 --- a/Package.swift +++ b/Package.swift @@ -16,8 +16,8 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-nio.git", from: "2.0.0"), .package(url: "https://github.com/GraphQLSwift/GraphQL.git", from: "4.0.0"), - .package(url: "https://github.com/GraphQLSwift/GraphQLTransportWS.git", from: "1.0.0"), - .package(url: "https://github.com/GraphQLSwift/GraphQLWS.git", from: "1.0.0"), + .package(url: "https://github.com/GraphQLSwift/GraphQLTransportWS.git", from: "2.0.0"), + .package(url: "https://github.com/GraphQLSwift/GraphQLWS.git", from: "2.0.0"), .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), .package( url: "https://github.com/hummingbird-project/hummingbird-websocket.git", @@ -33,6 +33,7 @@ let package = Package( .product(name: "GraphQLWS", package: "GraphQLWS"), .product(name: "Hummingbird", package: "hummingbird"), .product(name: "HummingbirdWebSocket", package: "hummingbird-websocket"), + .product(name: "NIOFoundationCompat", package: "swift-nio"), ] ), .testTarget( diff --git a/Sources/GraphQLHummingbird/WebSocket/GraphQLHandler+handleWebSocket.swift b/Sources/GraphQLHummingbird/WebSocket/GraphQLHandler+handleWebSocket.swift index 526b8eb..ed65eb3 100644 --- a/Sources/GraphQLHummingbird/WebSocket/GraphQLHandler+handleWebSocket.swift +++ b/Sources/GraphQLHummingbird/WebSocket/GraphQLHandler+handleWebSocket.swift @@ -3,6 +3,7 @@ import Hummingbird import HummingbirdWebSocket import Logging +import struct Foundation.Data import struct GraphQLTransportWS.EmptyInitPayload import class GraphQLTransportWS.Server import class GraphQLWS.Server @@ -17,15 +18,16 @@ extension GraphQLHandler where Context: WebSocketRequestContext { ) async throws { let messenger = WebSocketMessenger(outbound: outbound, logger: logger) - let messageStream = inbound.messages(maxSize: context.requestContext.maxUploadSize) - .compactMap { message -> String? in - // TODO: Add binary support - guard case .text(let text) = message else { - return nil - } - logger.trace("GraphQL server received: \(message)") - return text + let messageStream = inbound.messages( + maxSize: context.requestContext.maxUploadSize + ).compactMap { message -> Data? in + // By subprotocol specs, messages must be `text` and UTF8 + guard case .text(let text) = message else { + return nil } + logger.trace("GraphQL server received: \(text)") + return text.data(using: .utf8) + } switch subProtocol { case .graphqlTransportWs: diff --git a/Sources/GraphQLHummingbird/WebSocket/WebSocketMessenger.swift b/Sources/GraphQLHummingbird/WebSocket/WebSocketMessenger.swift index 79135d7..ae194b5 100644 --- a/Sources/GraphQLHummingbird/WebSocket/WebSocketMessenger.swift +++ b/Sources/GraphQLHummingbird/WebSocket/WebSocketMessenger.swift @@ -3,6 +3,9 @@ import GraphQLWS import HummingbirdWebSocket import Logging import NIOCore +import NIOFoundationCompat + +import struct Foundation.Data /// Messenger wrapper for WebSockets class WebSocketMessenger: GraphQLTransportWS.Messenger, GraphQLWS.Messenger, @unchecked Sendable { @@ -17,9 +20,11 @@ class WebSocketMessenger: GraphQLTransportWS.Messenger, GraphQLWS.Messenger, @un self.logger = logger } - func send(_ message: S) async throws where S.Element == Character { - logger.trace("GraphQL server sent: \(String(message))") - try await outbound.write(.text(String(message))) + func send(_ message: Data) async throws { + try await outbound.withTextMessageWriter { writer in + try await writer.callAsFunction(ByteBuffer(data: message)) + } + logger.trace("GraphQL server sent: \(String(decoding: message, as: UTF8.self))") } func error(_ message: String, code: Int) async throws {