Skip to content

Commit 3358410

Browse files
authored
Publish response from the WebSocketTransport to the ApolloStore (#1889)
* publish response from the WebsocketTransport to the Apollo store * fix build by making methods public * update tests * update StarWars tests * update Playground * make the `store` optional to init `WebSocketTransport`
1 parent 69108bd commit 3358410

8 files changed

Lines changed: 34 additions & 10 deletions

File tree

Playgrounds/ApolloMacPlayground.playground/Pages/Subscriptions.xcplaygroundpage/Contents.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ let normalTransport = RequestChainNetworkTransport(interceptorProvider: DefaultI
3131
//: Next, set up the `WebSocketTransport` to talk to the websocket endpoint. Note that this may take a different URL, sometimes with a `ws` prefix, than your normal http endpoint:
3232

3333
let webSocketURL = URL(string: "ws://localhost:8080/websocket")!
34-
let webSocketTransport = WebSocketTransport(request: URLRequest(url: webSocketURL))
34+
let webSocketTransport = WebSocketTransport(
35+
request: URLRequest(url: webSocketURL),
36+
store: store
37+
)
3538

3639
//: Then, set up the split transport with the two transports you've just created:
3740

Sources/Apollo/ApolloStore.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public final class ApolloStore {
6464
}
6565
}
6666

67-
func publish(records: RecordSet, identifier: UUID? = nil, callbackQueue: DispatchQueue = .main, completion: ((Result<Void, Error>) -> Void)? = nil) {
67+
public func publish(records: RecordSet, identifier: UUID? = nil, callbackQueue: DispatchQueue = .main, completion: ((Result<Void, Error>) -> Void)? = nil) {
6868
queue.async(flags: .barrier) {
6969
do {
7070
let changedKeys = try self.cache.merge(records: records)

Sources/Apollo/GraphQLResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public final class GraphQLResponse<Data: GraphQLSelectionSet> {
1919
self.variables = operation.variables
2020
}
2121

22-
func parseResult(cacheKeyForObject: CacheKeyForObject? = nil) throws -> (GraphQLResult<Data>, RecordSet?) {
22+
public func parseResult(cacheKeyForObject: CacheKeyForObject? = nil) throws -> (GraphQLResult<Data>, RecordSet?) {
2323
let errors: [GraphQLError]?
2424

2525
if let errorsEntry = body["errors"] as? [JSONObject] {

Sources/ApolloWebSocket/WebSocketTransport.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class WebSocketTransport {
2929
let connectOnInit: Bool
3030
let reconnect: Atomic<Bool>
3131
let websocket: WebSocketClient
32+
let store: ApolloStore?
3233
let error: Atomic<Error?> = Atomic(nil)
3334
let serializationFormat = JSONSerializationFormat.self
3435
private let requestBodyCreator: RequestBodyCreator
@@ -88,6 +89,7 @@ public class WebSocketTransport {
8889
/// - connectingPayload: [optional] The payload to send on connection. Defaults to an empty `GraphQLMap`.
8990
/// - requestBodyCreator: The `RequestBodyCreator` to use when serializing requests. Defaults to an `ApolloRequestBodyCreator`.
9091
public init(websocket: WebSocketClient,
92+
store: ApolloStore? = nil,
9193
clientName: String = WebSocketTransport.defaultClientName,
9294
clientVersion: String = WebSocketTransport.defaultClientVersion,
9395
sendOperationIdentifiers: Bool = false,
@@ -98,6 +100,7 @@ public class WebSocketTransport {
98100
connectingPayload: GraphQLMap? = [:],
99101
requestBodyCreator: RequestBodyCreator = ApolloRequestBodyCreator()) {
100102
self.websocket = websocket
103+
self.store = store
101104
self.connectingPayload = connectingPayload
102105
self.sendOperationIdentifiers = sendOperationIdentifiers
103106
self.reconnect = Atomic(reconnect)
@@ -359,10 +362,21 @@ extension WebSocketTransport: NetworkTransport {
359362
return EmptyCancellable()
360363
}
361364

362-
return WebSocketTask(self, operation) { result in
365+
return WebSocketTask(self, operation) { [store] result in
363366
switch result {
364367
case .success(let jsonBody):
365368
let response = GraphQLResponse(operation: operation, body: jsonBody)
369+
if let store = store {
370+
do {
371+
let (_, records) = try response.parseResult(cacheKeyForObject: store.cacheKeyForObject)
372+
if let records = records {
373+
store.publish(records: records, identifier: nil)
374+
}
375+
} catch {
376+
callCompletion(with: .failure(error))
377+
}
378+
}
379+
366380
do {
367381
let graphQLResult = try response.parseResultFast()
368382
callCompletion(with: .success(graphQLResult))

Tests/ApolloServerIntegrationTests/StarWarsSubscriptionTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class StarWarsSubscriptionTests: XCTestCase {
2424
webSocketTransport = WebSocketTransport(
2525
websocket: DefaultWebSocket(
2626
request: URLRequest(url: TestServerURL.starWarsWebSocket.url)
27-
)
27+
),
28+
store: ApolloStore()
2829
)
2930
webSocketTransport.delegate = self
3031
client = ApolloClient(networkTransport: webSocketTransport, store: ApolloStore())
@@ -411,7 +412,8 @@ class StarWarsSubscriptionTests: XCTestCase {
411412
let webSocketTransport = WebSocketTransport(
412413
websocket: MockWebSocket(
413414
request: URLRequest(url: TestServerURL.starWarsWebSocket.url)
414-
)
415+
),
416+
store: ApolloStore()
415417
)
416418

417419
let expectation = self.expectation(description: "Connection closed")

Tests/ApolloServerIntegrationTests/StarWarsWebSocketTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class StarWarsWebSocketTests: XCTestCase, CacheDependentTesting {
2424
let networkTransport = WebSocketTransport(
2525
websocket: DefaultWebSocket(
2626
request: URLRequest(url: TestServerURL.starWarsWebSocket.url)
27-
)
27+
),
28+
store: store
2829
)
2930

3031
client = ApolloClient(networkTransport: networkTransport, store: store)

Tests/ApolloTests/WebSocket/WebSocketTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ class WebSocketTests: XCTestCase {
2121
override func setUp() {
2222
super.setUp()
2323

24+
let store = ApolloStore()
2425
let websocket = MockWebSocket(request:URLRequest(url: TestURL.mockServer.url))
25-
networkTransport = WebSocketTransport(websocket: websocket)
26-
client = ApolloClient(networkTransport: networkTransport!, store: ApolloStore())
26+
networkTransport = WebSocketTransport(websocket: websocket, store: store)
27+
client = ApolloClient(networkTransport: networkTransport!, store: store)
2728
}
2829

2930
override func tearDown() {

Tests/ApolloTests/WebSocket/WebSocketTransportTests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ class WebSocketTransportTests: XCTestCase {
1717
var request = URLRequest(url: TestURL.mockServer.url)
1818
request.addValue("OldToken", forHTTPHeaderField: "Authorization")
1919

20-
self.webSocketTransport = WebSocketTransport(websocket: MockWebSocket(request: request))
20+
self.webSocketTransport = WebSocketTransport(websocket: MockWebSocket(request: request),
21+
store: ApolloStore())
2122

2223
self.webSocketTransport.updateHeaderValues(["Authorization": "UpdatedToken"])
2324

@@ -28,6 +29,7 @@ class WebSocketTransportTests: XCTestCase {
2829
let request = URLRequest(url: TestURL.mockServer.url)
2930

3031
self.webSocketTransport = WebSocketTransport(websocket: MockWebSocket(request: request),
32+
store: ApolloStore(),
3133
connectingPayload: ["Authorization": "OldToken"])
3234

3335
let mockWebSocketDelegate = MockWebSocketDelegate()
@@ -58,6 +60,7 @@ class WebSocketTransportTests: XCTestCase {
5860
let request = URLRequest(url: TestURL.mockServer.url)
5961

6062
self.webSocketTransport = WebSocketTransport(websocket: MockWebSocket(request: request),
63+
store: ApolloStore(),
6164
connectingPayload: ["Authorization": "OldToken"])
6265
self.webSocketTransport.closeConnection()
6366
self.webSocketTransport.updateConnectingPayload(["Authorization": "UpdatedToken"])

0 commit comments

Comments
 (0)