Files
Danny Sung 4dd6c81f28 travis: update CI environments (#202)
* travis: update CI environments
* Add BlueSocketTestCommonLibrary, BlueSocketTestClient, BlueSocketTestServer
- Add a library component to make it easier to do tests and profiling under streaming loads (multiple client connections, lots of data, etc.)

* Removed Swift 4.x, bumped minimum swift version requirement to 5.1
* keep build at Swift 5.0; update CI to only test from 5.1.5 on up
* Only attempt to build command-line for Swift 5.2+
* Ensure tools and dependencies only build for Swift 5.2+
* Address various lint errors
* Update README with version details and latest iOS related issues
2021-06-16 22:18:24 -07:00

66 lines
2.3 KiB
Swift

//
// Array+SocketHandler.swift
// BlueSocket
//
// Created by Sung, Danny on 2021-04-12.
// Copyright © 2021 Kitura project. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// swiftlint:disable force_try
import Foundation
import Socket
extension Array where Element == SocketHandler {
/// Wait for any socket to have activity that needs to be handled via `process()`
/// - Parameter timeout: Amount of time to wait; wait forever if value is not finite
/// - Returns: List of `SocketHandler` that need to be `process()`ed
func wait(timeout: TimeInterval) -> [SocketHandler] {
// Find handlers with pending output
let clientsPendingOutput = (self.filter { $0 is ClientHandler } as! [ClientHandler])
.filter { $0.hasPendingOutput }
// Create lookup to return SocketHandlers
var socketList: [Socket:SocketHandler] = [:]
for handler in self {
socketList[handler.socket] = handler
}
let sockets = self.map { $0.socket }
let activeSockets: [Socket]
let waitParam: (timeout: UInt, waitForever: Bool)
if clientsPendingOutput.count > 0 {
waitParam = (timeout: 10, waitForever: false)
} else if timeout.isFinite {
waitParam = (timeout: UInt(timeout*1000), waitForever: false)
} else {
waitParam = (timeout: 1000_000, waitForever: true)
}
activeSockets = try! Socket.wait(for: sockets, timeout: waitParam.timeout, waitForever: waitParam.waitForever) ?? []
let activeSocketHandlers = activeSockets.map { socketList[$0]! }
return activeSocketHandlers + clientsPendingOutput
}
func process() {
for handler in self {
handler.process()
}
}
}