Skip to content

Commit

Permalink
Hummingbird v1.0.0 (#11)
Browse files Browse the repository at this point in the history
* Hummingbird 1.0.0

* HBApplication.WebSocket -> HBWebSocketBuilder
  • Loading branch information
adam-fowler committed Feb 8, 2023
1 parent 7935959 commit c4f64de
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 76 deletions.
4 changes: 2 additions & 2 deletions Package.swift
Expand Up @@ -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"),
Expand Down
148 changes: 74 additions & 74 deletions Sources/HummingbirdWebSocket/Application+WebSocket.swift
Expand Up @@ -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
Expand All @@ -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<HTTPHeaders?> = { $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<HTTPHeaders?> = { $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
Expand Down

0 comments on commit c4f64de

Please sign in to comment.