Skip to content

Commit 4d44255

Browse files
author
Garrett Moseke
committed
feat: update next handling to user GraphQLResults
1 parent 98158da commit 4d44255

File tree

5 files changed

+22
-60
lines changed

5 files changed

+22
-60
lines changed

Sources/GraphQLTransportWS/Client.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ public class Client<InitPayload: Equatable & Codable> {
144144

145145
/// Add an observable object for this client that will fire off `Next` messages to the server as updates happen.
146146
/// - Parameter observable: `Observable<EventLoopFuture<GraphQLRequest>>` to subscribe to for changes.
147-
public func addObservable(observable: Observable<EventLoopFuture<GraphQLRequest>>) {
147+
public func addObservableSubscription(observable: Observable<EventLoopFuture<GraphQLResult>>) {
148148
observable.subscribe(
149149
onNext: { [weak self] resultFuture in
150150
guard let self = self else { return }
151-
resultFuture.whenSuccess { request in
152-
self.sendNext(payload: request, id: UUID().uuidString)
151+
resultFuture.whenSuccess { result in
152+
self.sendNext(payload: result, id: UUID().uuidString)
153153
}
154154
resultFuture.whenFailure { error in
155155
self.error(.graphQLError(error))
@@ -162,11 +162,11 @@ public class Client<InitPayload: Equatable & Codable> {
162162
/// - Parameters:
163163
/// - payload: `GraphQLRequest` object for the server to handle
164164
/// - id: id of the message
165-
private func sendNext(payload: GraphQLRequest, id: String) {
165+
private func sendNext(payload: GraphQLResult, id: String) {
166166
guard let messenger = messenger else { return }
167167
messenger.send(
168-
NextRequest(
169-
payload: payload,
168+
NextResponse(
169+
payload,
170170
id: id
171171
).toJSON(encoder)
172172
)

Sources/GraphQLTransportWS/Requests.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ struct SubscribeRequest: Equatable, JsonEncodable {
3030
let id: String
3131
}
3232

33-
/// A websocket `next` request from the client to the server
34-
public struct NextRequest: Equatable, JsonEncodable {
35-
var type = RequestMessageType.next
36-
let payload: GraphQLRequest
37-
let id: String
38-
}
39-
4033
/// A websocket `complete` request from the client to the server
4134
struct CompleteRequest: Equatable, JsonEncodable {
4235
var type = RequestMessageType.complete

Sources/GraphQLTransportWS/Server.swift

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class Server<InitPayload: Equatable & Codable> {
1919
var onOperationComplete: (String) -> Void = { _ in }
2020
var onOperationError: (String) -> Void = { _ in }
2121
var onMessage: (String) -> Void = { _ in }
22-
var onNext: (NextRequest, Server) -> Void = { _, _ in }
22+
var onNext: (NextResponse, Server) -> Void = { _, _ in }
2323

2424
var initialized = false
2525

@@ -89,25 +89,15 @@ public class Server<InitPayload: Equatable & Codable> {
8989
self.error(.invalidType())
9090
// Addition for Datasync: Servers may now receive "next" responses from clients
9191
case .next:
92-
guard let nextRequest = try? self.decoder.decode(NextRequest.self, from: data) else {
93-
self.error(.invalidRequestFormat(messageType: .next))
92+
guard self.initialized else {
93+
self.error(.notInitialized())
9494
return
9595
}
96-
do {
97-
if try nextRequest.payload.isSubscription() {
98-
self
99-
.error(.init(
100-
"Cannot initialize a subscription within another subscription. Payload must be query or mutation",
101-
code: .invalidRequestFormat
102-
))
103-
}
104-
else {
105-
self.onNext(nextRequest, self)
106-
}
107-
}
108-
catch {
109-
self.error(.graphQLError(error))
96+
guard let nextMessage = try? self.decoder.decode(NextResponse.self, from: data) else {
97+
self.error(.invalidRequestFormat(messageType: .next))
98+
return
11099
}
100+
self.onNext(nextMessage, self)
111101
}
112102
}
113103
}
@@ -149,7 +139,7 @@ public class Server<InitPayload: Equatable & Codable> {
149139
/// can now define custom handling for frames containing `GraphQLResult`
150140
/// objects sent by the client.
151141
/// - Parameter callback: The callback to assign
152-
public func onNext(_ callback: @escaping (NextRequest, Server) -> Void) {
142+
public func onNext(_ callback: @escaping (NextResponse, Server) -> Void) {
153143
self.onNext = callback
154144
}
155145

Tests/GraphQLTransportWSTests/GraphQLTransportWSTests.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ final class GraphqlTransportWSTests: XCTestCase {
213213

214214
let client = Client<TokenInitPayload>(messenger: clientMessenger)
215215
client.onConnectionAck { _, client in
216-
client.addObservable(observable: testObservable(loop: self.eventLoop))
216+
client.addObservableSubscription(observable: testObservable(loop: self.eventLoop))
217217
}
218218

219219
client.onError { _, _ in
@@ -273,7 +273,7 @@ final class GraphqlTransportWSTests: XCTestCase {
273273
pubsub.onNext("hello \(dataIndex)")
274274

275275
// Once the subscription has begun send a `next` frame from the client as well
276-
client.addObservable(observable: testObservable(loop: self.eventLoop))
276+
client.addObservableSubscription(observable: testObservable(loop: self.eventLoop))
277277
}
278278

279279
client.onNext { _, _ in
@@ -322,34 +322,26 @@ final class GraphqlTransportWSTests: XCTestCase {
322322
)
323323
}
324324

325-
func testDisallowedNestedSubscriptions() throws {
325+
func testNextUninitialized() throws {
326326
var messages = [String]()
327327
let completeExpectation = XCTestExpectation()
328-
completeExpectation.expectedFulfillmentCount = 2
329328

330329
let client = Client<TokenInitPayload>(messenger: clientMessenger)
331-
client.onConnectionAck { _, client in
332-
client.addObservable(observable: testObservable(loop: self.eventLoop, sendAsSubscription: true))
333-
}
334330

335331
client.onMessage { message, _ in
336332
messages.append(message)
337333
completeExpectation.fulfill()
338334
}
339335

340-
client.sendConnectionInit(
341-
payload: TokenInitPayload(
342-
authToken: ""
343-
)
344-
)
336+
client.addObservableSubscription(observable: testObservable(loop: self.eventLoop))
345337

346338
wait(for: [completeExpectation], timeout: 2)
347339
XCTAssertEqual(
348340
messages.count,
349-
2, // 1 connection_ack, 1 error
341+
1, // 1 error
350342
"Messages: \(messages.description)"
351343
)
352-
XCTAssertTrue(try XCTUnwrap(messages.last).contains(ErrorCode.invalidRequestFormat.rawValue.description))
344+
XCTAssertTrue(try XCTUnwrap(messages.last).contains(ErrorCode.notInitialized.rawValue.description))
353345
}
354346

355347
enum TestError: Error {

Tests/GraphQLTransportWSTests/Utils/TestAPI.swift

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,9 @@ struct TestResolver {
3939
}
4040
}
4141

42-
func testObservable(loop: EventLoop, sendAsSubscription: Bool = false) -> Observable<EventLoopFuture<GraphQLRequest>> {
42+
func testObservable(loop: EventLoop) -> Observable<EventLoopFuture<GraphQLResult>> {
4343
return Observable.create { observer in
44-
observer.on(.next(loop.makeSucceededFuture(GraphQLRequest(
45-
query:
46-
sendAsSubscription ?
47-
"""
48-
subscription {
49-
hello
50-
}
51-
""" :
52-
"""
53-
query {
54-
hello
55-
}
56-
"""
57-
))))
44+
observer.on(.next(loop.makeSucceededFuture(GraphQLResult(data: ["Some Data": "For you"], errors: []))))
5845
return Disposables.create()
5946
}
6047
}

0 commit comments

Comments
 (0)