Giter VIP home page Giter VIP logo

Comments (1)

d-exclaimation avatar d-exclaimation commented on June 24, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.