Skip to content

Commit 919da33

Browse files
feat!: Remove onMessage callback
This is not necessary anymore, since you can just map the incoming AsyncStream
1 parent 141103a commit 919da33

3 files changed

Lines changed: 36 additions & 45 deletions

File tree

Sources/GraphQLWS/Client.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ public actor Client<InitPayload: Equatable & Codable> {
1212
let onData: (DataResponse, Client) async throws -> Void
1313
let onError: (ErrorResponse, Client) async throws -> Void
1414
let onComplete: (CompleteResponse, Client) async throws -> Void
15-
let onMessage: (String, Client) async throws -> Void
1615

1716
let encoder = GraphQLJSONEncoder()
1817
let decoder = JSONDecoder()
@@ -27,16 +26,14 @@ public actor Client<InitPayload: Equatable & Codable> {
2726
/// - onData: The callback run on receipt of a `data` message
2827
/// - onError: The callback run on receipt of an `error` message
2928
/// - onComplete: The callback run on receipt of a `complete` message
30-
/// - onMessage: The callback run on receipt of any message
3129
public init(
3230
messenger: Messenger,
3331
onConnectionError: @escaping (ConnectionErrorResponse, Client) async throws -> Void = { _, _ in },
3432
onConnectionAck: @escaping (ConnectionAckResponse, Client) async throws -> Void = { _, _ in },
3533
onConnectionKeepAlive: @escaping (ConnectionKeepAliveResponse, Client) async throws -> Void = { _, _ in },
3634
onData: @escaping (DataResponse, Client) async throws -> Void = { _, _ in },
3735
onError: @escaping (ErrorResponse, Client) async throws -> Void = { _, _ in },
38-
onComplete: @escaping (CompleteResponse, Client) async throws -> Void = { _, _ in },
39-
onMessage: @escaping (String, Client) async throws -> Void = { _, _ in }
36+
onComplete: @escaping (CompleteResponse, Client) async throws -> Void = { _, _ in }
4037
) {
4138
self.messenger = messenger
4239
self.onConnectionError = onConnectionError
@@ -45,15 +42,12 @@ public actor Client<InitPayload: Equatable & Codable> {
4542
self.onData = onData
4643
self.onError = onError
4744
self.onComplete = onComplete
48-
self.onMessage = onMessage
4945
}
5046

5147
/// Listen and react to the provided async sequence of server messages. This function will block until the stream is completed.
5248
/// - Parameter incoming: The server message sequence that the client should react to.
5349
public func listen<A: AsyncSequence & Sendable>(to incoming: A) async throws -> Void where A.Element == String {
5450
for try await message in incoming {
55-
try await onMessage(message, self)
56-
5751
// Detect and ignore error responses.
5852
if message.starts(with: "44") {
5953
// TODO: Determine what to do with returned error messages

Sources/GraphQLWS/Server.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public actor Server<
1717
let onExecute: (GraphQLRequest, InitPayloadResult) async throws -> GraphQLResult
1818
let onSubscribe: (GraphQLRequest, InitPayloadResult) async throws -> SubscriptionSequenceType
1919

20-
let onMessage: (String) async throws -> Void
2120
let onOperationComplete: (String) async throws -> Void
2221
let onOperationError: (String, [Error]) async throws -> Void
2322

@@ -34,23 +33,20 @@ public actor Server<
3433
/// - messenger: The messenger to bind the server to.
3534
/// - onExecute: Callback run during `start` resolution for non-streaming queries. Typically this is `API.execute`.
3635
/// - onSubscribe: Callback run during `start` resolution for streaming queries. Typically this is `API.subscribe`.
37-
/// - onMessage: Optional callback run on every message event
3836
/// - onOperationComplete: Optional callback run when an operation completes
3937
/// - onOperationError: Optional callback run when an operation errors
4038
public init(
4139
messenger: Messenger,
4240
onInit: @escaping (InitPayload) async throws -> InitPayloadResult,
4341
onExecute: @escaping (GraphQLRequest, InitPayloadResult) async throws -> GraphQLResult,
4442
onSubscribe: @escaping (GraphQLRequest, InitPayloadResult) async throws -> SubscriptionSequenceType,
45-
onMessage: @escaping (String) async throws -> Void = { _ in },
4643
onOperationComplete: @escaping (String) async throws -> Void = { _ in },
4744
onOperationError: @escaping (String, [Error]) async throws -> Void = { _, _ in }
4845
) {
4946
self.messenger = messenger
5047
self.onInit = onInit
5148
self.onExecute = onExecute
5249
self.onSubscribe = onSubscribe
53-
self.onMessage = onMessage
5450
self.onOperationComplete = onOperationComplete
5551
self.onOperationError = onOperationError
5652
}
@@ -59,8 +55,6 @@ public actor Server<
5955
/// - Parameter incoming: The client message sequence that the server should react to.
6056
public func listen<A: AsyncSequence & Sendable>(to incoming: A) async throws -> Void where A.Element == String {
6157
for try await message in incoming {
62-
try await onMessage(message)
63-
6458
// Detect and ignore error responses.
6559
if message.starts(with: "44") {
6660
// TODO: Determine what to do with returned error messages

Tests/GraphQLWSTests/GraphQLWSTests.swift

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,23 @@ struct GraphqlTransportWSTests {
2929
}
3030
)
3131
let (messageStream, messageContinuation) = AsyncThrowingStream<String, any Error>.makeStream()
32+
let serverMessageStream = serverMessenger.stream.map { message in
33+
messageContinuation.yield(message)
34+
// Expect only one message
35+
messageContinuation.finish()
36+
return message
37+
}
3238
let client = Client<TokenInitPayload>(
3339
messenger: clientMessenger,
3440
onError: { message, _ in
3541
messageContinuation.finish(throwing: message.payload[0])
36-
},
37-
onMessage: { message, _ in
38-
messageContinuation.yield(message)
39-
// Expect only one message
40-
messageContinuation.finish()
42+
await clientMessenger.close()
4143
}
4244
)
43-
let serverStream = serverMessenger.stream
4445
let clientStream = clientMessenger.stream
4546
Task {
4647
try await server.listen(to: clientStream)
47-
}
48-
Task {
49-
try await client.listen(to: serverStream)
48+
await serverMessenger.close()
5049
}
5150

5251
try await client.sendStart(
@@ -59,6 +58,7 @@ struct GraphqlTransportWSTests {
5958
),
6059
id: UUID().uuidString
6160
)
61+
try await client.listen(to: serverMessageStream)
6262

6363
let messages = try await messageStream.reduce(into: [String]()) { result, message in
6464
result.append(message)
@@ -92,31 +92,31 @@ struct GraphqlTransportWSTests {
9292
}
9393
)
9494
let (messageStream, messageContinuation) = AsyncThrowingStream<String, any Error>.makeStream()
95+
let serverMessageStream = serverMessenger.stream.map { message in
96+
messageContinuation.yield(message)
97+
// Expect only one message
98+
messageContinuation.finish()
99+
return message
100+
}
95101
let client = Client<TokenInitPayload>(
96102
messenger: clientMessenger,
97103
onError: { message, _ in
98104
messageContinuation.finish(throwing: message.payload[0])
99-
},
100-
onMessage: { message, _ in
101-
messageContinuation.yield(message)
102-
// Expect only one message
103-
messageContinuation.finish()
105+
await clientMessenger.close()
104106
}
105107
)
106-
let serverStream = serverMessenger.stream
107108
let clientStream = clientMessenger.stream
108109
Task {
109110
try await server.listen(to: clientStream)
110-
}
111-
Task {
112-
try await client.listen(to: serverStream)
111+
await serverMessenger.close()
113112
}
114113

115114
try await client.sendConnectionInit(
116115
payload: TokenInitPayload(
117116
authToken: ""
118117
)
119118
)
119+
try await client.listen(to: serverMessageStream)
120120

121121
let messages = try await messageStream.reduce(into: [String]()) { result, message in
122122
result.append(message)
@@ -150,6 +150,10 @@ struct GraphqlTransportWSTests {
150150
}
151151
)
152152
let (messageStream, messageContinuation) = AsyncThrowingStream<String, any Error>.makeStream()
153+
let serverMessageStream = serverMessenger.stream.map { message in
154+
messageContinuation.yield(message)
155+
return message
156+
}
153157
let client = Client<TokenInitPayload>(
154158
messenger: clientMessenger,
155159
onConnectionAck: { _, client in
@@ -166,24 +170,21 @@ struct GraphqlTransportWSTests {
166170
},
167171
onError: { message, _ in
168172
messageContinuation.finish(throwing: message.payload[0])
173+
await clientMessenger.close()
169174
},
170175
onComplete: { _, _ in
171176
messageContinuation.finish()
172-
},
173-
onMessage: { message, _ in
174-
messageContinuation.yield(message)
177+
await clientMessenger.close()
175178
}
176179
)
177-
let serverStream = serverMessenger.stream
178180
let clientStream = clientMessenger.stream
179181
Task {
180182
try await server.listen(to: clientStream)
181-
}
182-
Task {
183-
try await client.listen(to: serverStream)
183+
await serverMessenger.close()
184184
}
185185

186186
try await client.sendConnectionInit(payload: TokenInitPayload(authToken: ""))
187+
try await client.listen(to: serverMessageStream)
187188

188189
let messages = try await messageStream.reduce(into: [String]()) { result, message in
189190
result.append(message)
@@ -222,6 +223,11 @@ struct GraphqlTransportWSTests {
222223
}
223224
)
224225
let (messageStream, messageContinuation) = AsyncThrowingStream<String, any Error>.makeStream()
226+
// Used to extract the server messages
227+
let serverMessageStream = serverMessenger.stream.map { message in
228+
messageContinuation.yield(message)
229+
return message
230+
}
225231
let client = Client<TokenInitPayload>(
226232
messenger: clientMessenger,
227233
onConnectionAck: { _, client in
@@ -250,24 +256,21 @@ struct GraphqlTransportWSTests {
250256
},
251257
onError: { message, _ in
252258
messageContinuation.finish(throwing: message.payload[0])
259+
await clientMessenger.close()
253260
},
254261
onComplete: { _, _ in
255262
messageContinuation.finish()
256-
},
257-
onMessage: { message, _ in
258-
messageContinuation.yield(message)
263+
await clientMessenger.close()
259264
}
260265
)
261266
let clientStream = clientMessenger.stream
262-
let serverStream = serverMessenger.stream
263267
Task {
264268
try await server.listen(to: clientStream)
265-
}
266-
Task {
267-
try await client.listen(to: serverStream)
269+
await serverMessenger.close()
268270
}
269271

270272
try await client.sendConnectionInit(payload: TokenInitPayload(authToken: ""))
273+
try await client.listen(to: serverMessageStream)
271274

272275
let messages = try await messageStream.reduce(into: [String]()) { result, message in
273276
result.append(message)

0 commit comments

Comments
 (0)