Comments (1)
A draft on how I could do the second approach:
import enum GraphQL.Map
import class JSONEncoder
import class JSONDecoder
extension Map {
public func into<T: Decodable>(_ dataType: T.Type) throws -> T {
let data = try JSONEncoder().encode(self)
return try JSONDecoder().decode(dataType, from: data)
}
}
// ...
server.vaporMiddleware(
websocketContext: { req, payload, gql in
let myPayload = payload.into(MyPayload.self)
// do something with it
}
)
With this I can have somewhat implement the first with
public typealias VaporCustomWebSocketContext<P: Decodable> = @Sendable (Request, P, GraphQLRequest) async throws -> Context
public typealias VaporCustomWebSocketGuard<P: Decodable> = @Sendable (Request, P) async throws -> Void
public func vaporMiddleware<CustomPayload: Decodable>(
...,
websocketContext: VaporCustomWebSocketContext<CustomPayload>,
websocketGuard: VaporCustomWebSocketGuard<CustomPayload>
) -> VaporGraphQLMiddleware {
vaporMiddleware(
...,
websocketContext: { req, payload, gql in
let custom = payload.into(CustomPayload.self)
return try await websocketContext(req, custom, gql)
},
websocketGuard: { req, payload in
let custom = payload.into(CustomPayload.self)
return try await websocketGuard(req, custom)
}
)
}
I am not particularly a big fan of the above, as I feel if I were to do the first, I need to somewhat rewrite the WebSocket client so that it doesn't have to re-parse the payload for each websocket operation, maybe that advantage of the websocket guard to compute the payload object.
I think the best way is to implement the Map.into(_)
first and later see if I can do the first without adding breaking changes
from pioneer.
Related Issues (20)
- Public structs have no public initialisers
- After pausing the websocket connection from Apollo iOS, it can't reconnect. HOT 12
- Documentation search is pointing to incorrect path HOT 2
- Improvement to Test HOT 1
- Improvement to optional spec-compliant HOT 4
- Field Resolve Middleware HOT 1
- VaporMiddleware responding incorrectly to all paths HOT 7
- Plugins
- Error: 'ConcurrentResolve' is only available in macOS 12 or newer HOT 4
- TestConsumer Improvement
- subscription Precondition failed HOT 13
- Subscription via gateway HOT 3
- Improvement to spec-compliant HOT 1
- Value null in data on errors HOT 8
- GraphQL together with gRPC HOT 4
- Support for the new Swift Universal HTTP types
- Does Pioneer support multiplexing subscriptions over one WebSocket connection? HOT 6
- Does Pioneer support subscriptions via SSE? HOT 2
- `websocketOnInit` has not been implemented
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pioneer.