src/RawSocket/RawSocketFactory.swift
import Foundation
import NetworkExtension
/**
Represents the type of the socket.
- NW: The socket based on `NWTCPConnection`.
- GCD: The socket based on `GCDAsyncSocket`.
*/
public enum SocketBaseType {
case nw, gcd
}
/// Factory to create `RawTCPSocket` based on configuration.
open class RawSocketFactory {
/// Current active `NETunnelProvider` which creates `NWTCPConnection` instance.
///
/// - note: Must set before any connection is created if `NWTCPSocket` or `NWUDPSocket` is used.
public static weak var TunnelProvider: NETunnelProvider?
/**
Return `RawTCPSocket` instance.
- parameter type: The type of the socket.
- returns: The created socket instance.
*/
public static func getRawSocket(_ type: SocketBaseType? = nil) -> RawTCPSocketProtocol {
switch type {
case .some(.nw):
return NWTCPSocket()
case .some(.gcd):
return GCDTCPSocket()
case nil:
if RawSocketFactory.TunnelProvider == nil {
return GCDTCPSocket()
} else {
return NWTCPSocket()
}
}
}
}