diff --git a/src/main/java/io/socket/client/Manager.java b/src/main/java/io/socket/client/Manager.java index 509d274..1c2e0b6 100644 --- a/src/main/java/io/socket/client/Manager.java +++ b/src/main/java/io/socket/client/Manager.java @@ -84,7 +84,7 @@ public class Manager extends Emitter { private double _randomizationFactor; private Backoff backoff; private long _timeout; - private Set connected; + private Set connecting = new HashSet(); private URI uri; private List packetBuffer; private Queue subs; @@ -139,7 +139,6 @@ public class Manager extends Emitter { this.timeout(opts.timeout); this.readyState = ReadyState.CLOSED; this.uri = uri; - this.connected = new HashSet(); this.encoding = false; this.packetBuffer = new ArrayList(); this.encoder = new Parser.Encoder(); @@ -402,11 +401,16 @@ public class Manager extends Emitter { } else { final Manager self = this; final Socket s = socket; + socket.on(Socket.EVENT_CONNECTING, new Listener() { + @Override + public void call(Object... args) { + self.connecting.add(s); + } + }); socket.on(Socket.EVENT_CONNECT, new Listener() { @Override public void call(Object... objects) { s.id = self.engine.id(); - self.connected.add(s); } }); } @@ -415,8 +419,8 @@ public class Manager extends Emitter { } /*package*/ void destroy(Socket socket) { - this.connected.remove(socket); - if (!this.connected.isEmpty()) return; + this.connecting.remove(socket); + if (!this.connecting.isEmpty()) return; this.close(); } diff --git a/src/main/java/io/socket/client/Socket.java b/src/main/java/io/socket/client/Socket.java index e26c344..06ba841 100644 --- a/src/main/java/io/socket/client/Socket.java +++ b/src/main/java/io/socket/client/Socket.java @@ -25,6 +25,8 @@ public class Socket extends Emitter { */ public static final String EVENT_CONNECT = "connect"; + public static final String EVENT_CONNECTING = "connecting"; + /** * Called on a disconnection. */ @@ -60,6 +62,7 @@ public class Socket extends Emitter { put(EVENT_CONNECT, 1); put(EVENT_CONNECT_ERROR, 1); put(EVENT_CONNECT_TIMEOUT, 1); + put(EVENT_CONNECTING, 1); put(EVENT_DISCONNECT, 1); put(EVENT_ERROR, 1); put(EVENT_RECONNECT, 1); @@ -123,6 +126,7 @@ public class Socket extends Emitter { Socket.this.subEvents(); Socket.this.io.open(); // ensure open if (Manager.ReadyState.OPEN == Socket.this.io.readyState) Socket.this.onopen(); + Socket.this.emit(EVENT_CONNECTING); } }); return this; diff --git a/src/test/java/io/socket/client/ConnectionTest.java b/src/test/java/io/socket/client/ConnectionTest.java index 6c76ca8..c0cd37f 100644 --- a/src/test/java/io/socket/client/ConnectionTest.java +++ b/src/test/java/io/socket/client/ConnectionTest.java @@ -591,6 +591,33 @@ public class ConnectionTest extends Connection { assertThat((Boolean) values.take(), is(true)); } + @Test(timeout = TIMEOUT) + public void connectWhileDisconnectingAnotherSocket() throws URISyntaxException, InterruptedException { + final BlockingQueue values = new LinkedBlockingQueue(); + + final Manager manager = new Manager(new URI(uri())); + final Socket socket1 = manager.socket("/foo"); + socket1.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + final Socket socket2 = manager.socket("/asd"); + socket2.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + values.offer("done"); + socket2.disconnect(); + } + }); + socket2.open(); + socket1.disconnect(); + } + }); + + socket1.open(); + values.take(); + manager.close(); + } + @Test(timeout = TIMEOUT) public void tryToReconnectTwiceAndFailWithIncorrectAddress() throws URISyntaxException, InterruptedException { final BlockingQueue values = new LinkedBlockingQueue();