From 2f2bd490458fc09834da9738982b0b85525cdc72 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:06:09 -0400 Subject: [PATCH 01/17] fix socketio/socket.io-client-swift#181 --- SocketIOClientSwift/SocketEngine.swift | 42 +++++++++++++++----------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index ba3d214..fd9b654 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -99,6 +99,19 @@ public final class SocketEngine: NSObject, WebSocketDelegate { deinit { Logger.log("Engine is being deinit", type: logType) } + + private func checkIfMessageIsBase64Binary(var message: String) { + if message.hasPrefix("b4") { + // binary in base64 string + message.removeRange(Range(start: message.startIndex, + end: message.startIndex.advancedBy(2))) + + if let data = NSData(base64EncodedString: message, + options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { + client?.parseBinaryData(data) + } + } + } public func close(fast fast: Bool) { Logger.log("Engine is being closed. Fast: %@", type: logType, args: fast) @@ -364,19 +377,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } } - private func checkIfMessageIsBase64Binary(var message: String) { - if message.hasPrefix("b4") { - // binary in base64 string - message.removeRange(Range(start: message.startIndex, - end: message.startIndex.advancedBy(2))) - - if let data = NSData(base64EncodedString: message, - options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { - client?.parseBinaryData(data) - } - } - } - private func handleMessage(message: String) { client?.parseSocketMessage(message) } @@ -492,11 +492,17 @@ public final class SocketEngine: NSObject, WebSocketDelegate { var reader = SocketStringReader(message: str) while reader.hasNext { - let n = reader.readUntilStringOccurence(":") - let str = reader.read(Int(n)!) - - dispatch_async(handleQueue) { - self.parseEngineMessage(str, fromPolling: true) + if let n = Int(reader.readUntilStringOccurence(":")) { + let str = reader.read(n) + + dispatch_async(handleQueue) { + self.parseEngineMessage(str, fromPolling: true) + } + } else { + dispatch_async(handleQueue) { + self.parseEngineMessage(str, fromPolling: true) + } + break } } } From 978bd2614e8975e800b8b2686933c0d215abec0a Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:08:58 -0400 Subject: [PATCH 02/17] bump version --- README.md | 4 ++-- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b540d59..41a5d13 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 3.0.1 # Or latest version +github "socketio/socket.io-client-swift" ~> 3.0.2 # Or latest version ``` Run `carthage update --platform ios,macosx`. @@ -83,7 +83,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 3.0.1' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 3.0.2' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 098b719..600639c 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Socket.IO-Client-Swift" - s.version = "3.0.1" + s.version = "3.0.2" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.author = { "Erik" => "nuclear.ace@gmail.com" } s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.10' - s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v3.0.1' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v3.0.2' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From ba5638a109a108f0eba3a919903113ad61204414 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:09:02 -0400 Subject: [PATCH 03/17] Revert "tweak to objective-c api" This reverts commit d0a57ca353268d4473b82d03c3f5b18a875467f4. --- README.md | 22 +++++++++++----------- SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 1 + 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 41a5d13..c60c784 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket onEvent:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket onEvent:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { double cur = [[data objectAtIndex:0] floatValue]; [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { @@ -130,16 +130,16 @@ Options Methods ------- -1. `on(event: String, callback: ((data: NSArray?, ack: AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -2. `on(event event: String, callback:((data: NSArray?, ack: AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -3. `onAny(callback:((event: String, items: AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -4. `emit(event: String, _ items: AnyObject...)` - Sends a message. Can send multiple items. -5. `emit(event: String, withItems items: [AnyObject])` - `emit` for Objective-C -6. `emitWithAck(event: String, _ items: AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -7. `emitWithAck(event: String, withItems items: [AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +1. `on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +2. `onObjectiveC(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +3. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. +4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C +6. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. 8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. -9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -10. `close(fast fast: Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. 11. `reconnect()` - Causes the client to reconnect to the server. 12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0f26629..cd52b69 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -417,7 +417,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Adds a handler for an event. */ - public func on(event event: String, callback: NormalCallbackObjectiveC) { + public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, callback: callback) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index c32ffa4..e27bbe3 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -30,3 +30,4 @@ public typealias AckEmitterObjectiveC = (NSArray) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void + From 4997294186d27dae2a544b94c2821fc591070e5b Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:47:02 -0400 Subject: [PATCH 04/17] clean up readme --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c60c784..d2c298b 100644 --- a/README.md +++ b/README.md @@ -130,16 +130,16 @@ Options Methods ------- -1. `on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -2. `onObjectiveC(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -3. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. -5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C -6. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -7. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +1. `on(name: String, callback: ((data: NSArray?, ack: AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +2. `onObjectiveC(name: String, callback: ((data: NSArray?, ack: AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +3. `onAny(callback:((event: String, items: AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. +4. `emit(event: String, _ items: AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(event: String, withItems items: [AnyObject])` - `emit` for Objective-C +6. `emitWithAck(event: String, _ items: AnyObject...) -> (timeoutAfter: UInt64, callback: (NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(event: String, withItems items: [AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. 8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. -9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -10. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(fast fast: Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. 11. `reconnect()` - Causes the client to reconnect to the server. 12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / From a81f9256711394f7147e170f8d4c6298ae9abc45 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 13:33:37 -0400 Subject: [PATCH 05/17] make note of https --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2c298b..80234b1 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Objective-C: ##API Constructors ----------- -`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) +`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. `convenience init(socketURL: String, options:NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. From a72f96759e96091986af3785346406d063622165 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 18:19:49 -0400 Subject: [PATCH 06/17] Adds SocketIOClient#once(event, callback) When the specified event is emitted, the handler deregisters itself. --- SocketIOClientSwift/SocketIOClient.swift | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index cd52b69..aa6fdf8 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -424,6 +424,34 @@ public final class SocketIOClient: NSObject, SocketEngineClient { handlers.append(handler) } + /** + Adds a single-use handler for an event. + */ + public func once(event: String, callback: NormalCallback) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + callback?(data, ack) + } + + handlers.append(handler) + } + + /** + Adds a single-use handler for an event. + */ + public func once(event event: String, callback: NormalCallbackObjectiveC) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + callback?(data, ack) + } + + handlers.append(handler) + } + /** Removes all handlers. Can be used after disconnecting to break any potential remaining retain cycles. From 9b3f84dcd0873fed7b12b94d91bcc2e30b5ec6df Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:33:36 -0400 Subject: [PATCH 07/17] Remove type declarations --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index aa6fdf8..c4f2e64 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,8 +430,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,8 +444,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 136847fd77a8bcd92e4949efb2f6b1d2028bad9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:41:34 -0400 Subject: [PATCH 08/17] Fix "Variable used within its own initial value" error --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c4f2e64..3559c92 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,7 +430,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,7 +446,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 7d26bd3ee830a807e7ab5c937226504f4ee53be8 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:00:56 -0400 Subject: [PATCH 09/17] Fix type declarations --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 3559c92..e38071c 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -432,7 +432,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -448,7 +448,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From f5c3a2cac9c57f17e5a7108a274e696d9af05b9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:08:37 -0400 Subject: [PATCH 10/17] Add strict equality and execute "callback" as non-optional --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e38071c..1151420 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,8 +433,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) @@ -449,8 +449,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) From fe8469cfc659850ce12dada944cf045c67f27323 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:48:09 -0400 Subject: [PATCH 11/17] Add SocketEventHandler#id to filter against --- SocketIOClientSwift/SocketEventHandler.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 05efb10..c61c4c5 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,6 +35,7 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { + let id = NSUUID() let event: String let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? From aaaf9dc451cba8bfca499cde078728ba7c49b4ec Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:49:18 -0400 Subject: [PATCH 12/17] Filter against SocketEventHandler#id --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 1151420..dba36c5 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,7 +433,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } @@ -449,7 +449,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } From a9b4193fe4051a5fc9edf443c3401b20c845fe98 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 22:06:12 -0400 Subject: [PATCH 13/17] Fix "Variable 'handler' captured by a closure before being initialized" error --- SocketIOClientSwift/SocketIOClient.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index dba36c5..c9fdad0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /** @@ -446,14 +446,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /** From 9a05f6043b046b2ca9aa39703f86fbfaa379ade1 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 23:52:23 -0400 Subject: [PATCH 14/17] tweaks to once --- README.md | 2 ++ SocketIOClientSwift/SocketEventHandler.swift | 8 ++++--- SocketIOClientSwift/SocketIOClient.swift | 24 +++++++++++--------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 80234b1..9c29b6a 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,8 @@ Methods 11. `reconnect()` - Causes the client to reconnect to the server. 12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / +14. `once(event: String, callback: NormalCallback)` - Adds a handler that will only be executed once. +15. `once(event event: String, callback: NormalCallbackObjectiveC)` - Adds a handler that will only be executed once. Client Events ------ diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index c61c4c5..beb88a6 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,19 +35,21 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { - let id = NSUUID() let event: String + let id: NSUUID let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? - init(event: String, callback: NormalCallback) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallback) { self.event = event + self.id = id self.callback = callback self.callBackObjectiveC = nil } - init(event: String, callback: NormalCallbackObjectiveC) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallbackObjectiveC) { self.event = event + self.id = id self.callback = nil self.callBackObjectiveC = callback } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c9fdad0..00b328a 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler?; - - handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitter?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - handlers.append(handler!) + handlers.append(handler) } /** @@ -446,14 +447,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler?; - - handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitterObjectiveC?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - - handlers.append(handler!) + + handlers.append(handler) } /** From 99ed93038fe2ce2a191ffd02d5731d8b77f5948f Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:01:03 -0400 Subject: [PATCH 15/17] update readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9c29b6a..066d7b3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ socket.connect() ##Objective-C Example ```objective-c -SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; +SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" opts:nil]; [socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); @@ -107,9 +107,9 @@ Objective-C: ##API Constructors ----------- -`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. +`init(socketURL: String, opts: NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. -`convenience init(socketURL: String, options:NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. +`convenience init(socketURL: String, opts: NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. Options ------- From 456406416a15bc44019eca0eac197774a66449db Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:02:18 -0400 Subject: [PATCH 16/17] other init doesn't exist anymore --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 066d7b3..09cf4fb 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,6 @@ Constructors ----------- `init(socketURL: String, opts: NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. -`convenience init(socketURL: String, opts: NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. - Options ------- - `connectParams: [String: AnyObject]?` - Dictionary whose contents will be passed with the connection. From 0233bce881044cd268e89a137003e114e1f2ddc4 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:27:14 -0400 Subject: [PATCH 17/17] tweaks to closing --- README.md | 2 +- SocketIOClientSwift/SocketIOClient.swift | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 09cf4fb..e7cbd56 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Methods 7. `emitWithAck(event: String, withItems items: [AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. 8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -10. `close(fast fast: Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +10. `close()` - Closes the socket. Once a socket is closed it should not be reopened. 11. `reconnect()` - Causes the client to reconnect to the server. 12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 00b328a..32507fd 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -133,12 +133,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Will turn off automatic reconnects. Pass true to fast if you're closing from a background task */ - public func close(fast fast: Bool) { + public func close() { Logger.log("Closing socket", type: logType) reconnects = false - status = SocketIOClientStatus.Closed - engine?.close(fast: fast) + didDisconnect("Closed") } /** @@ -151,8 +150,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(timeoutAfter timeoutAfter:Int, - withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter: Int, + withTimeoutHandler handler: (() -> Void)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .Connected else { @@ -222,7 +221,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Logger.log("Disconnected: %@", type: logType, args: reason) status = .Closed - reconnects = false // Make sure the engine is actually dead. @@ -241,8 +239,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Same as close */ - public func disconnect(fast fast: Bool) { - close(fast: fast) + public func disconnect() { + close() } /**