Hummingbird Websocket

增加对将 HTTP1 连接升级到 WebSocket 的支持。

使用方法

使用闭包设置 WebSocket 升级,该闭包要么返回包含响应头和 WebSocket 处理程序的 .upgrade,要么返回 .dontUpgrade

let app = Application(
    router: router,
    server: .http1WebSocketUpgrade { request, channel, logger in
        // upgrade if request path is "/ws"
        guard request.path == "/ws" else { return .dontUpgrade }
        // The upgrade response includes the headers to include in the response and 
        // the WebSocket handler
        return .upgrade([:]) { inbound, outbound, context in
            for try await packet in inbound {
                // send "Received" for every packet we receive
                try await outbound.write(.text("Received"))
            }
        }
    }
)
app.runService()

或者,也可以使用 Router。使用路由器意味着您可以添加中间件来处理初始升级请求,然后再对其进行处理,例如,用于验证请求。

let wsRouter = Router(context: BasicWebSocketRequestContext.self)
wsRouter.middlewares.add(BasicAuthenticator())
// An upgrade only occurs if a WebSocket path is matched
wsRouter.ws("/ws") { request, context in
    // allow upgrade
    .upgrade()
} onUpgrade: { inbound, outbound, context in
    for try await packet in inbound {
        // send "Received" for every packet we receive
        try await outbound.write(.text("Received"))
    }
}
let app = Application(
    router: router,
    server: .http1WebSocketUpgrade(webSocketRouter: wsRouter)
)
app.runService()

文档

您可以在此处找到 HummingbirdWebSocket 的文档。hummingbird-examples 存储库包含该库不同用法的示例。