From c4f64de317e3de92cfa87b94567ed73d38353c9f Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Wed, 8 Feb 2023 17:30:31 +0100 Subject: [PATCH] Hummingbird v1.0.0 (#11) * Hummingbird 1.0.0 * HBApplication.WebSocket -> HBWebSocketBuilder --- Package.swift | 4 +- .../Application+WebSocket.swift | 148 +++++++++--------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/Package.swift b/Package.swift index 7270b7f..837298a 100644 --- a/Package.swift +++ b/Package.swift @@ -12,8 +12,8 @@ let package = Package( .library(name: "HummingbirdWSCore", targets: ["HummingbirdWSCore"]), ], dependencies: [ - .package(url: "https://github.com/hummingbird-project/hummingbird-core.git", from: "1.0.0-rc"), - .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "1.0.0-rc"), + .package(url: "https://github.com/hummingbird-project/hummingbird-core.git", from: "1.0.0"), + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "1.0.0"), .package(url: "https://github.com/apple/swift-nio.git", from: "2.32.1"), .package(url: "https://github.com/apple/swift-nio-ssl.git", from: "2.5.0"), .package(url: "https://github.com/swift-extras/swift-extras-base64.git", from: "0.5.0"), diff --git a/Sources/HummingbirdWebSocket/Application+WebSocket.swift b/Sources/HummingbirdWebSocket/Application+WebSocket.swift index b079a6e..871861b 100644 --- a/Sources/HummingbirdWebSocket/Application+WebSocket.swift +++ b/Sources/HummingbirdWebSocket/Application+WebSocket.swift @@ -2,7 +2,7 @@ // // This source file is part of the Hummingbird server framework project // -// Copyright (c) 2021-2021 the Hummingbird authors +// Copyright (c) 2021-2023 the Hummingbird authors // Licensed under Apache License v2.0 // // See LICENSE.txt for license information @@ -15,94 +15,94 @@ import Hummingbird import HummingbirdWSCore -extension HBApplication { - /// WebSocket interface - public struct WebSocket { - /// Context used to create HBRequest - struct WebSocketContext: HBRequestContext { - var eventLoop: EventLoop - var allocator: ByteBufferAllocator - var remoteAddress: SocketAddress? { nil } - } +/// WebSocket application interface +public struct HBWebSocketBuilder { + /// Context used to create HBRequest + struct WebSocketContext: HBRequestContext { + var eventLoop: EventLoop + var allocator: ByteBufferAllocator + var remoteAddress: SocketAddress? { nil } + } - /// Add WebSocket upgrade option. This should be called before any other access to `HBApplication.ws` is performed - public func addUpgrade() { - self.application.server.addWebSocketUpgrade( - shouldUpgrade: { channel, head in - var request = HBRequest( - head: head, - body: .byteBuffer(nil), - application: application, - context: WebSocketContext(eventLoop: channel.eventLoop, allocator: channel.allocator) - ) - request.webSocketTestShouldUpgrade = true - return responder.respond(to: request).flatMapThrowing { - if $0.status == .ok { - return $0.headers - } - throw HBHTTPError(.badRequest) + /// Add WebSocket upgrade option. This should be called before any other access to `HBApplication.ws` is performed + public func addUpgrade() { + self.application.server.addWebSocketUpgrade( + shouldUpgrade: { channel, head in + var request = HBRequest( + head: head, + body: .byteBuffer(nil), + application: application, + context: WebSocketContext(eventLoop: channel.eventLoop, allocator: channel.allocator) + ) + request.webSocketTestShouldUpgrade = true + return responder.respond(to: request).flatMapThrowing { + if $0.status == .ok { + return $0.headers } - }, - onUpgrade: { ws, head in - var request = HBRequest( - head: head, - body: .byteBuffer(nil), - application: application, - context: WebSocketContext(eventLoop: ws.channel.eventLoop, allocator: ws.channel.allocator) - ) - request.webSocket = ws - _ = responder.respond(to: request) + throw HBHTTPError(.badRequest) } - ) - self.routerGroup = .init(router: HBRouterBuilder()) - self.application.lifecycle.register( - label: "WebSockets", - start: .sync { - self.responder = self.routerGroup.router.buildRouter() - }, - shutdown: .sync {} - ) - } - - /// Add WebSocket connection upgrade at given path - /// - Parameters: - /// - path: URI path connection upgrade is available - /// - shouldUpgrade: Return whether upgrade should be allowed - /// - onUpgrade: Called on upgrade with reference to WebSocket - @discardableResult public func on( - _ path: String = "", - shouldUpgrade: @escaping (HBRequest) -> EventLoopFuture = { $0.success(nil) }, - onUpgrade: @escaping (HBRequest, HBWebSocket) -> Void - ) -> HBWebSocketRouterGroup { - self.routerGroup.on(path, shouldUpgrade: shouldUpgrade, onUpgrade: onUpgrade) - } + }, + onUpgrade: { ws, head in + var request = HBRequest( + head: head, + body: .byteBuffer(nil), + application: application, + context: WebSocketContext(eventLoop: ws.channel.eventLoop, allocator: ws.channel.allocator) + ) + request.webSocket = ws + _ = responder.respond(to: request) + } + ) + self.routerGroup = .init(router: HBRouterBuilder()) + self.application.lifecycle.register( + label: "WebSockets", + start: .sync { + self.responder = self.routerGroup.router.buildRouter() + }, + shutdown: .sync {} + ) + } - /// Add middleware to be run only for WebSocket HTTP upgrade requests - @discardableResult public func add(middleware: HBMiddleware) -> HBWebSocketRouterGroup { - self.routerGroup.add(middleware: middleware) - } + /// Add WebSocket connection upgrade at given path + /// - Parameters: + /// - path: URI path connection upgrade is available + /// - shouldUpgrade: Return whether upgrade should be allowed + /// - onUpgrade: Called on upgrade with reference to WebSocket + @discardableResult public func on( + _ path: String = "", + shouldUpgrade: @escaping (HBRequest) -> EventLoopFuture = { $0.success(nil) }, + onUpgrade: @escaping (HBRequest, HBWebSocket) -> Void + ) -> HBWebSocketRouterGroup { + self.routerGroup.on(path, shouldUpgrade: shouldUpgrade, onUpgrade: onUpgrade) + } - var routerGroup: HBWebSocketRouterGroup { - get { self.application.extensions.get(\.ws.routerGroup) } - nonmutating set { application.extensions.set(\.ws.routerGroup, value: newValue) } - } + /// Add middleware to be run only for WebSocket HTTP upgrade requests + @discardableResult public func add(middleware: HBMiddleware) -> HBWebSocketRouterGroup { + self.routerGroup.add(middleware: middleware) + } - var responder: HBResponder { - get { self.application.extensions.get(\.ws.responder) } - nonmutating set { application.extensions.set(\.ws.responder, value: newValue) } - } + var routerGroup: HBWebSocketRouterGroup { + get { self.application.extensions.get(\.ws.routerGroup) } + nonmutating set { application.extensions.set(\.ws.routerGroup, value: newValue) } + } - let application: HBApplication + var responder: HBResponder { + get { self.application.extensions.get(\.ws.responder) } + nonmutating set { application.extensions.set(\.ws.responder, value: newValue) } } + let application: HBApplication +} + +extension HBApplication { /// WebSocket interface - public var ws: WebSocket { .init(application: self) } + public var ws: HBWebSocketBuilder { .init(application: self) } } #if compiler(>=5.5.2) && canImport(_Concurrency) @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) -extension HBApplication.WebSocket { +extension HBWebSocketBuilder { /// Add WebSocket connection upgrade at given path /// - Parameters: /// - path: URI path connection upgrade is available