From cd3eb37ac801185201301937b2fb5113401ff51f Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 20 May 2017 09:27:01 -0400 Subject: [PATCH] Initial Swift4 work --- Source/SocketIO/Ack/SocketAckEmitter.swift | 2 ++ Source/SocketIO/Client/SocketAnyEvent.swift | 2 ++ Source/SocketIO/Client/SocketIOClient.swift | 23 +++++++++++++++++++ Source/SocketIO/Engine/SocketEngine.swift | 2 +- .../SocketIO/Util/SocketClientManager.swift | 5 ++++ Source/Starscream | 2 +- 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Source/SocketIO/Ack/SocketAckEmitter.swift b/Source/SocketIO/Ack/SocketAckEmitter.swift index ea82ab0..b13e15a 100644 --- a/Source/SocketIO/Ack/SocketAckEmitter.swift +++ b/Source/SocketIO/Ack/SocketAckEmitter.swift @@ -65,6 +65,7 @@ public final class SocketAckEmitter : NSObject { /// Call to ack receiving this event. /// /// - parameter items: An array of items to send when acking. Use `[]` to send nothing. + @objc public func with(_ items: [Any]) { guard ackNum != -1 else { return } @@ -104,6 +105,7 @@ public final class OnAckCallback : NSObject { /// - parameter after: The number of seconds before this emit times out if an ack hasn't been received. /// - parameter callback: The callback called when an ack is received, or when a timeout happens. /// To check for timeout, use `SocketAckStatus`'s `noAck` case. + @objc public func timingOut(after seconds: Double, callback: @escaping AckCallback) { guard let socket = self.socket, ackNumber != -1 else { return } diff --git a/Source/SocketIO/Client/SocketAnyEvent.swift b/Source/SocketIO/Client/SocketAnyEvent.swift index f27bb1c..441e8c5 100644 --- a/Source/SocketIO/Client/SocketAnyEvent.swift +++ b/Source/SocketIO/Client/SocketAnyEvent.swift @@ -29,9 +29,11 @@ public final class SocketAnyEvent : NSObject { // MARK: Properties /// The event name. + @objc public let event: String /// The data items for this event. + @objc public let items: [Any]? /// The description of this event. diff --git a/Source/SocketIO/Client/SocketIOClient.swift b/Source/SocketIO/Client/SocketIOClient.swift index 47d2e2b..11cf734 100644 --- a/Source/SocketIO/Client/SocketIOClient.swift +++ b/Source/SocketIO/Client/SocketIOClient.swift @@ -54,25 +54,31 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// If `true` then every time `connect` is called, a new engine will be created. + @objc public var forceNew = false /// The queue that all interaction with the client should occur on. This is the queue that event handlers are /// called on. + @objc public var handleQueue = DispatchQueue.main /// The namespace for this client. + @objc public var nsp = "/" /// The configuration for this client. public var config: SocketIOClientConfiguration /// If `true`, this client will try and reconnect on any disconnects. + @objc public var reconnects = true /// The number of seconds to wait before attempting to reconnect. + @objc public var reconnectWait = 10 /// The session id of this client. + @objc public var sid: String? { return engine?.sid } @@ -81,6 +87,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// /// If changed after calling `init`, `forceNew` must be set to `true`, or it will only connect to the url set in the /// init. + @objc public var socketURL: URL var ackHandlers = SocketAckManager() @@ -141,6 +148,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// /// - parameter socketURL: The url of the socket.io server. /// - parameter config: The config for this socket. + @objc public convenience init(socketURL: NSURL, config: NSDictionary?) { self.init(socketURL: socketURL as URL, config: config?.toSocketConfiguration() ?? []) } @@ -163,6 +171,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// Connect to the server. + @objc open func connect() { connect(timeoutAfter: 0, withHandler: nil) } @@ -172,6 +181,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter timeoutAfter: The number of seconds after which if we are not connected we assume the connection /// has failed. Pass 0 to never timeout. /// - parameter withHandler: The handler to call when the client fails to connect. + @objc open func connect(timeoutAfter: Double, withHandler handler: (() -> ())?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") @@ -229,6 +239,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// Disconnects the socket. + @objc open func disconnect() { DefaultSocketLogger.Logger.log("Closing socket", type: SocketIOClient.logType) @@ -257,6 +268,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// /// - parameter event: The event to send. /// - parameter with: The items to send with this event. May be left out. + @objc open func emit(_ event: String, with items: [Any]) { guard status == .connected else { handleClientEvent(.error, data: ["Tried emitting \(event) when not connected"]) @@ -314,6 +326,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event to send. /// - parameter with: The items to send with this event. Use `[]` to send nothing. /// - returns: An `OnAckCallback`. You must call the `timingOut(after:)` method before the event will be sent. + @objc open func emitWithAck(_ event: String, with items: [Any]) -> OnAckCallback { return createOnAck([event] + items) } @@ -405,6 +418,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter data: the data associated with this event. /// - parameter isInternalMessage: If `true` event handlers for this event will be called regardless of status. /// - parameter withAck: The ack number for this event. May be left out. + @objc open func handleEvent(_ event: String, data: [Any], isInternalMessage: Bool, withAck ack: Int = -1) { guard status == .connected || isInternalMessage else { return } @@ -422,6 +436,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// Leaves nsp and goes back to the default namespace. + @objc open func leaveNamespace() { if nsp != "/" { engine?.send("1\(nsp)", withData: []) @@ -434,6 +449,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// **Do not use this to join the default namespace.** Instead call `leaveNamespace`. /// /// - parameter namespace: The namespace to join. + @objc open func joinNamespace(_ namespace: String) { nsp = namespace @@ -457,6 +473,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// If you wish to remove a specific event, call the `off(id:)` with the UUID received from its `on` call. /// /// - parameter event: The event to remove handlers for. + @objc open func off(_ event: String) { DefaultSocketLogger.Logger.log("Removing handler for event: \(event)", type: SocketIOClient.logType) @@ -468,6 +485,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// If you want to remove all events for an event, call the off `off(_:)` method with the event name. /// /// - parameter id: The UUID of the handler you wish to remove. + @objc open func off(id: UUID) { DefaultSocketLogger.Logger.log("Removing handler with id: \(id)", type: SocketIOClient.logType) @@ -479,6 +497,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event name for this handler. /// - parameter callback: The callback that will execute when this event is received. /// - returns: A unique id for the handler that can be used to remove it. + @objc @discardableResult open func on(_ event: String, callback: @escaping NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding handler for event: \(event)", type: SocketIOClient.logType) @@ -527,6 +546,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event name for this handler. /// - parameter callback: The callback that will execute when this event is received. /// - returns: A unique id for the handler that can be used to remove it. + @objc @discardableResult open func once(_ event: String, callback: @escaping NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding once handler for event: \(event)", type: SocketIOClient.logType) @@ -547,6 +567,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Adds a handler that will be called on every event. /// /// - parameter handler: The callback that will execute whenever an event is received. + @objc open func onAny(_ handler: @escaping (SocketAnyEvent) -> ()) { anyHandler = handler } @@ -570,6 +591,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Tries to reconnect to the server. /// /// This will cause a `disconnect` event to be emitted, as well as an `reconnectAttempt` event. + @objc open func reconnect() { guard !reconnecting else { return } @@ -578,6 +600,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Removes all handlers. /// Can be used after disconnecting to break any potential remaining retain cycles. + @objc open func removeAllHandlers() { handlers.removeAll(keepingCapacity: false) } diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 293ca83..969011b 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -223,7 +223,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll private func handleBase64(message: String) { // binary in base64 string - let noPrefix = message[message.index(message.startIndex, offsetBy: 2).. SocketIOClient? { return sockets.removeValue(forKey: label) @@ -87,6 +90,7 @@ open class SocketClientManager : NSObject { /// /// - parameter socket: The socket to remove. /// - returns: The socket if it was in the manager. + @objc @discardableResult open func removeSocket(_ socket: SocketIOClient) -> SocketIOClient? { var returnSocket: SocketIOClient? @@ -99,6 +103,7 @@ open class SocketClientManager : NSObject { } /// Removes all the sockets in the manager. + @objc open func removeSockets() { sockets.removeAll() } diff --git a/Source/Starscream b/Source/Starscream index f7e28f2..4ae6fe9 160000 --- a/Source/Starscream +++ b/Source/Starscream @@ -1 +1 @@ -Subproject commit f7e28f24ae20898da5804079319da52682bb9212 +Subproject commit 4ae6fe995316a49e7ac4ee0aaba9b3a0ba7f774d