diff --git a/pom.xml b/pom.xml index 36f1881..610423d 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ io.socket engine.io-client - 0.9.0 + 1.0.0-SNAPSHOT org.json diff --git a/src/main/java/io/socket/client/IO.java b/src/main/java/io/socket/client/IO.java index 6dd9758..a5455f4 100644 --- a/src/main/java/io/socket/client/IO.java +++ b/src/main/java/io/socket/client/IO.java @@ -3,16 +3,13 @@ package io.socket.client; import io.socket.parser.Parser; import okhttp3.Call; -import okhttp3.OkHttpClient; import okhttp3.WebSocket; -import java.util.logging.Level; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/io/socket/client/Manager.java b/src/main/java/io/socket/client/Manager.java index c2946eb..6da92ee 100644 --- a/src/main/java/io/socket/client/Manager.java +++ b/src/main/java/io/socket/client/Manager.java @@ -2,16 +2,24 @@ package io.socket.client; import io.socket.backo.Backoff; import io.socket.emitter.Emitter; +import io.socket.parser.IOParser; import io.socket.parser.Packet; import io.socket.parser.Parser; import io.socket.thread.EventThread; import okhttp3.Call; import okhttp3.WebSocket; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; import java.net.URI; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -148,8 +156,8 @@ public class Manager extends Emitter { this.uri = uri; this.encoding = false; this.packetBuffer = new ArrayList(); - this.encoder = new Parser.Encoder(); - this.decoder = new Parser.Decoder(); + this.encoder = opts.encoder != null ? opts.encoder : new IOParser.Encoder(); + this.decoder = opts.decoder != null ? opts.decoder : new IOParser.Decoder(); } private void emitAll(String event, Object... args) { @@ -163,11 +171,17 @@ public class Manager extends Emitter { * Update `socket.id` of all sockets */ private void updateSocketIds() { - for (Socket socket : this.nsps.values()) { - socket.id = this.engine.id(); + for (Map.Entry entry : this.nsps.entrySet()) { + String nsp = entry.getKey(); + Socket socket = entry.getValue(); + socket.id = this.generateId(nsp); } } + private String generateId(String nsp) { + return ("/".equals(nsp) ? "" : (nsp + "#")) + this.engine.id(); + } + public boolean reconnection() { return this._reconnection; } @@ -383,12 +397,12 @@ public class Manager extends Emitter { Manager.this.onclose((String)objects[0]); } })); - this.subs.add(On.on(this.decoder, Parser.Decoder.EVENT_DECODED, new Listener() { + this.decoder.onDecoded(new Parser.Decoder.Callback() { @Override - public void call(Object... objects) { - Manager.this.ondecoded((Packet) objects[0]); + public void call (Packet packet) { + Manager.this.ondecoded(packet); } - })); + }); } private void onping() { @@ -425,7 +439,7 @@ public class Manager extends Emitter { * @param opts options. * @return a socket instance for the namespace. */ - public Socket socket(String nsp, Options opts) { + public Socket socket(final String nsp, Options opts) { Socket socket = this.nsps.get(nsp); if (socket == null) { socket = new Socket(this, nsp, opts); @@ -444,7 +458,7 @@ public class Manager extends Emitter { socket.on(Socket.EVENT_CONNECT, new Listener() { @Override public void call(Object... objects) { - s.id = self.engine.id(); + s.id = self.generateId(nsp); } }); } @@ -506,6 +520,7 @@ public class Manager extends Emitter { On.Handle sub; while ((sub = this.subs.poll()) != null) sub.destroy(); + this.decoder.onDecoded(null); this.packetBuffer.clear(); this.encoding = false; @@ -631,6 +646,8 @@ public class Manager extends Emitter { public long reconnectionDelay; public long reconnectionDelayMax; public double randomizationFactor; + public Parser.Encoder encoder; + public Parser.Decoder decoder; /** * Connection timeout (ms). Set -1 to disable. diff --git a/src/main/java/io/socket/client/Socket.java b/src/main/java/io/socket/client/Socket.java index 0f7d9fb..61baef3 100644 --- a/src/main/java/io/socket/client/Socket.java +++ b/src/main/java/io/socket/client/Socket.java @@ -1,7 +1,6 @@ package io.socket.client; import io.socket.emitter.Emitter; -import io.socket.hasbinary.HasBinary; import io.socket.parser.Packet; import io.socket.parser.Parser; import io.socket.thread.EventThread; @@ -9,7 +8,13 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; import java.util.logging.Level; import java.util.logging.Logger; @@ -79,12 +84,12 @@ public class Socket extends Emitter { }}; /*package*/ String id; - /*package*/ String query; private volatile boolean connected; private int ids; private String nsp; private Manager io; + private String query; private Map acks = new HashMap(); private Queue subs; private final Queue> receiveBuffer = new LinkedList>(); @@ -182,51 +187,27 @@ public class Socket extends Emitter { return; } - List _args = new ArrayList(args.length + 1); - _args.add(event); - _args.addAll(Arrays.asList(args)); + Ack ack; + Object[] _args; + int lastIndex = args.length - 1; - JSONArray jsonArgs = new JSONArray(); - for (Object arg : _args) { - jsonArgs.put(arg); - } - int parserType = HasBinary.hasBinary(jsonArgs) ? Parser.BINARY_EVENT : Parser.EVENT; - Packet packet = new Packet(parserType, jsonArgs); - - if (_args.get(_args.size() - 1) instanceof Ack) { - logger.fine(String.format("emitting packet with ack id %d", Socket.this.ids)); - Socket.this.acks.put(Socket.this.ids, (Ack)_args.remove(_args.size() - 1)); - jsonArgs = remove(jsonArgs, jsonArgs.length() - 1); - packet.data = jsonArgs; - packet.id = Socket.this.ids++; - } - - if (Socket.this.connected) { - Socket.this.packet(packet); + if (args.length > 0 && args[lastIndex] instanceof Ack) { + _args = new Object[lastIndex]; + for (int i = 0; i < lastIndex; i++) { + _args[i] = args[i]; + } + ack = (Ack) args[lastIndex]; } else { - Socket.this.sendBuffer.add(packet); + _args = args; + ack = null; } + + emit(event, _args, ack); } }); return this; } - private static JSONArray remove(JSONArray a, int pos) { - JSONArray na = new JSONArray(); - for (int i = 0; i < a.length(); i++){ - if (i != pos) { - Object v; - try { - v = a.get(i); - } catch (JSONException e) { - v = null; - } - na.put(v); - } - } - return na; - } - /** * Emits an event with an acknowledge. * @@ -239,25 +220,28 @@ public class Socket extends Emitter { EventThread.exec(new Runnable() { @Override public void run() { - List _args = new ArrayList() {{ - add(event); - if (args != null) { - addAll(Arrays.asList(args)); - } - }}; - JSONArray jsonArgs = new JSONArray(); - for (Object _arg : _args) { - jsonArgs.put(_arg); + jsonArgs.put(event); + + if (args != null) { + for (Object arg : args) { + jsonArgs.put(arg); + } } - int parserType = HasBinary.hasBinary(jsonArgs) ? Parser.BINARY_EVENT : Parser.EVENT; - Packet packet = new Packet(parserType, jsonArgs); - logger.fine(String.format("emitting packet with ack id %d", ids)); - Socket.this.acks.put(ids, ack); - packet.id = ids++; + Packet packet = new Packet(Parser.EVENT, jsonArgs); - Socket.this.packet(packet); + if (ack != null) { + logger.fine(String.format("emitting packet with ack id %d", ids)); + Socket.this.acks.put(ids, ack); + packet.id = ids++; + } + + if (Socket.this.connected) { + Socket.this.packet(packet); + } else { + Socket.this.sendBuffer.add(packet); + } } }); return this; @@ -377,9 +361,7 @@ public class Socket extends Emitter { jsonArgs.put(arg); } - int type = HasBinary.hasBinary(jsonArgs) - ? Parser.BINARY_ACK : Parser.ACK; - Packet packet = new Packet(type, jsonArgs); + Packet packet = new Packet(Parser.ACK, jsonArgs); packet.id = id; self.packet(packet); } diff --git a/src/main/java/io/socket/parser/IOParser.java b/src/main/java/io/socket/parser/IOParser.java new file mode 100644 index 0000000..813c16c --- /dev/null +++ b/src/main/java/io/socket/parser/IOParser.java @@ -0,0 +1,238 @@ +package io.socket.parser; + +import io.socket.hasbinary.HasBinary; +import org.json.JSONException; +import org.json.JSONTokener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +final public class IOParser implements Parser { + + private static final Logger logger = Logger.getLogger(IOParser.class.getName()); + + private static Packet error() { + return new Packet(ERROR, "parser error"); + } + + private IOParser() {} + + final public static class Encoder implements Parser.Encoder { + + public Encoder() {} + + @Override + public void encode(Packet obj, Callback callback) { + if ((obj.type == EVENT || obj.type == ACK) && HasBinary.hasBinary(obj.data)) { + obj.type = obj.type == EVENT ? BINARY_EVENT : BINARY_ACK; + } + + if (logger.isLoggable(Level.FINE)) { + logger.fine(String.format("encoding packet %s", obj)); + } + + if (BINARY_EVENT == obj.type || BINARY_ACK == obj.type) { + encodeAsBinary(obj, callback); + } else { + String encoding = encodeAsString(obj); + callback.call(new String[] {encoding}); + } + } + + private String encodeAsString(Packet obj) { + StringBuilder str = new StringBuilder("" + obj.type); + + if (BINARY_EVENT == obj.type || BINARY_ACK == obj.type) { + str.append(obj.attachments); + str.append("-"); + } + + if (obj.nsp != null && obj.nsp.length() != 0 && !"/".equals(obj.nsp)) { + str.append(obj.nsp); + str.append(","); + } + + if (obj.id >= 0) { + str.append(obj.id); + } + + if (obj.data != null) { + str.append(obj.data); + } + + if (logger.isLoggable(Level.FINE)) { + logger.fine(String.format("encoded %s as %s", obj, str)); + } + return str.toString(); + } + + private void encodeAsBinary(Packet obj, Callback callback) { + Binary.DeconstructedPacket deconstruction = Binary.deconstructPacket(obj); + String pack = encodeAsString(deconstruction.packet); + List buffers = new ArrayList(Arrays.asList(deconstruction.buffers)); + + buffers.add(0, pack); + callback.call(buffers.toArray()); + } + } + + final public static class Decoder implements Parser.Decoder { + + /*package*/ BinaryReconstructor reconstructor; + + private Decoder.Callback onDecodedCallback; + + public Decoder() { + this.reconstructor = null; + } + + @Override + public void add(String obj) { + Packet packet = decodeString(obj); + if (BINARY_EVENT == packet.type || BINARY_ACK == packet.type) { + this.reconstructor = new BinaryReconstructor(packet); + + if (this.reconstructor.reconPack.attachments == 0) { + if (this.onDecodedCallback != null) { + this.onDecodedCallback.call(packet); + } + } + } else { + if (this.onDecodedCallback != null) { + this.onDecodedCallback.call(packet); + } + } + } + + @Override + public void add(byte[] obj) { + if (this.reconstructor == null) { + throw new RuntimeException("got binary data when not reconstructing a packet"); + } else { + Packet packet = this.reconstructor.takeBinaryData(obj); + if (packet != null) { + this.reconstructor = null; + if (this.onDecodedCallback != null) { + this.onDecodedCallback.call(packet); + } + } + } + } + + private static Packet decodeString(String str) { + int i = 0; + int length = str.length(); + + Packet p = new Packet(Character.getNumericValue(str.charAt(0))); + + if (p.type < 0 || p.type > types.length - 1) return error(); + + if (BINARY_EVENT == p.type || BINARY_ACK == p.type) { + if (!str.contains("-") || length <= i + 1) return error(); + StringBuilder attachments = new StringBuilder(); + while (str.charAt(++i) != '-') { + attachments.append(str.charAt(i)); + } + p.attachments = Integer.parseInt(attachments.toString()); + } + + if (length > i + 1 && '/' == str.charAt(i + 1)) { + StringBuilder nsp = new StringBuilder(); + while (true) { + ++i; + char c = str.charAt(i); + if (',' == c) break; + nsp.append(c); + if (i + 1 == length) break; + } + p.nsp = nsp.toString(); + } else { + p.nsp = "/"; + } + + if (length > i + 1){ + Character next = str.charAt(i + 1); + if (Character.getNumericValue(next) > -1) { + StringBuilder id = new StringBuilder(); + while (true) { + ++i; + char c = str.charAt(i); + if (Character.getNumericValue(c) < 0) { + --i; + break; + } + id.append(c); + if (i + 1 == length) break; + } + try { + p.id = Integer.parseInt(id.toString()); + } catch (NumberFormatException e){ + return error(); + } + } + } + + if (length > i + 1){ + try { + str.charAt(++i); + p.data = new JSONTokener(str.substring(i)).nextValue(); + } catch (JSONException e) { + logger.log(Level.WARNING, "An error occured while retrieving data from JSONTokener", e); + return error(); + } + } + + if (logger.isLoggable(Level.FINE)) { + logger.fine(String.format("decoded %s as %s", str, p)); + } + return p; + } + + @Override + public void destroy() { + if (this.reconstructor != null) { + this.reconstructor.finishReconstruction(); + } + this.onDecodedCallback = null; + } + + @Override + public void onDecoded (Callback callback) { + this.onDecodedCallback = callback; + } + } + + + /*package*/ static class BinaryReconstructor { + + public Packet reconPack; + + /*package*/ List buffers; + + BinaryReconstructor(Packet packet) { + this.reconPack = packet; + this.buffers = new ArrayList(); + } + + public Packet takeBinaryData(byte[] binData) { + this.buffers.add(binData); + if (this.buffers.size() == this.reconPack.attachments) { + Packet packet = Binary.reconstructPacket(this.reconPack, + this.buffers.toArray(new byte[this.buffers.size()][])); + this.finishReconstruction(); + return packet; + } + return null; + } + + public void finishReconstruction () { + this.reconPack = null; + this.buffers = new ArrayList(); + } + } +} + + diff --git a/src/main/java/io/socket/parser/Parser.java b/src/main/java/io/socket/parser/Parser.java index e4c2a5c..66367d5 100644 --- a/src/main/java/io/socket/parser/Parser.java +++ b/src/main/java/io/socket/parser/Parser.java @@ -1,18 +1,6 @@ package io.socket.parser; -import io.socket.emitter.Emitter; -import org.json.JSONException; -import org.json.JSONTokener; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class Parser { - - private static final Logger logger = Logger.getLogger(Parser.class.getName()); +public interface Parser { /** * Packet type `connect`. @@ -64,74 +52,9 @@ public class Parser { "BINARY_ACK" }; + public static interface Encoder { - private Parser() {} - - private static Packet error() { - return new Packet(ERROR, "parser error"); - } - - - public static class Encoder { - - public Encoder() {} - - public void encode(Packet obj, Callback callback) { - if (logger.isLoggable(Level.FINE)) { - logger.fine(String.format("encoding packet %s", obj)); - } - - if (BINARY_EVENT == obj.type || BINARY_ACK == obj.type) { - encodeAsBinary(obj, callback); - } else { - String encoding = encodeAsString(obj); - callback.call(new String[] {encoding}); - } - } - - private String encodeAsString(Packet obj) { - StringBuilder str = new StringBuilder(); - boolean nsp = false; - - str.append(obj.type); - - if (BINARY_EVENT == obj.type || BINARY_ACK == obj.type) { - str.append(obj.attachments); - str.append("-"); - } - - if (obj.nsp != null && obj.nsp.length() != 0 && !"/".equals(obj.nsp)) { - nsp = true; - str.append(obj.nsp); - } - - if (obj.id >= 0) { - if (nsp) { - str.append(","); - nsp = false; - } - str.append(obj.id); - } - - if (obj.data != null) { - if (nsp) str.append(","); - str.append(obj.data); - } - - if (logger.isLoggable(Level.FINE)) { - logger.fine(String.format("encoded %s as %s", obj, str)); - } - return str.toString(); - } - - private void encodeAsBinary(Packet obj, Callback callback) { - Binary.DeconstructedPacket deconstruction = Binary.deconstructPacket(obj); - String pack = encodeAsString(deconstruction.packet); - List buffers = new ArrayList(Arrays.asList(deconstruction.buffers)); - - buffers.add(0, pack); - callback.call(buffers.toArray()); - } + public void encode(Packet obj, Callback callback); public interface Callback { @@ -139,143 +62,19 @@ public class Parser { } } - public static class Decoder extends Emitter { + public static interface Decoder { - public static String EVENT_DECODED = "decoded"; + public void add(String obj); - /*package*/ BinaryReconstructor reconstructor; + public void add(byte[] obj); - public Decoder() { - this.reconstructor = null; - } + public void destroy(); - public void add(String obj) { - Packet packet = decodeString(obj); - if (BINARY_EVENT == packet.type || BINARY_ACK == packet.type) { - this.reconstructor = new BinaryReconstructor(packet); + public void onDecoded(Callback callback); - if (this.reconstructor.reconPack.attachments == 0) { - this.emit(EVENT_DECODED, packet); - } - } else { - this.emit(EVENT_DECODED, packet); - } - } + public interface Callback { - public void add(byte[] obj) { - if (this.reconstructor == null) { - throw new RuntimeException("got binary data when not reconstructing a packet"); - } else { - Packet packet = this.reconstructor.takeBinaryData(obj); - if (packet != null) { - this.reconstructor = null; - this.emit(EVENT_DECODED, packet); - } - } - } - - private static Packet decodeString(String str) { - Packet p = new Packet(); - int i = 0; - int length = str.length(); - - p.type = Character.getNumericValue(str.charAt(0)); - if (p.type < 0 || p.type > types.length - 1) return error(); - - if (BINARY_EVENT == p.type || BINARY_ACK == p.type) { - if (!str.contains("-") || length <= i + 1) return error(); - StringBuilder attachments = new StringBuilder(); - while (str.charAt(++i) != '-') { - attachments.append(str.charAt(i)); - } - p.attachments = Integer.parseInt(attachments.toString()); - } - - if (length > i + 1 && '/' == str.charAt(i + 1)) { - StringBuilder nsp = new StringBuilder(); - while (true) { - ++i; - char c = str.charAt(i); - if (',' == c) break; - nsp.append(c); - if (i + 1 == length) break; - } - p.nsp = nsp.toString(); - } else { - p.nsp = "/"; - } - - if (length > i + 1){ - Character next = str.charAt(i + 1); - if (Character.getNumericValue(next) > -1) { - StringBuilder id = new StringBuilder(); - while (true) { - ++i; - char c = str.charAt(i); - if (Character.getNumericValue(c) < 0) { - --i; - break; - } - id.append(c); - if (i + 1 == length) break; - } - try { - p.id = Integer.parseInt(id.toString()); - } catch (NumberFormatException e){ - return error(); - } - } - } - - if (length > i + 1){ - try { - str.charAt(++i); - p.data = new JSONTokener(str.substring(i)).nextValue(); - } catch (JSONException e) { - logger.log(Level.WARNING, "An error occured while retrieving data from JSONTokener", e); - return error(); - } - } - - if (logger.isLoggable(Level.FINE)) { - logger.fine(String.format("decoded %s as %s", str, p)); - } - return p; - } - - public void destroy() { - if (this.reconstructor != null) { - this.reconstructor.finishReconstruction(); - } - } - } - - - /*package*/ static class BinaryReconstructor { - - public Packet reconPack; - - /*package*/ List buffers; - - BinaryReconstructor(Packet packet) { - this.reconPack = packet; - this.buffers = new ArrayList(); - } - - public Packet takeBinaryData(byte[] binData) { - this.buffers.add(binData); - if (this.buffers.size() == this.reconPack.attachments) { - Packet packet = Binary.reconstructPacket(this.reconPack, - this.buffers.toArray(new byte[this.buffers.size()][])); - this.finishReconstruction(); - return packet; - } - return null; - } - - public void finishReconstruction () { - this.reconPack = null; - this.buffers = new ArrayList(); + public void call(Packet packet); } } } diff --git a/src/test/java/io/socket/client/Connection.java b/src/test/java/io/socket/client/Connection.java index 60d3078..9e7bf8c 100644 --- a/src/test/java/io/socket/client/Connection.java +++ b/src/test/java/io/socket/client/Connection.java @@ -82,7 +82,7 @@ public abstract class Connection { } Socket client(String path) throws URISyntaxException { - return IO.socket(path, createOptions()); + return client(path, createOptions()); } Socket client(IO.Options opts) throws URISyntaxException { diff --git a/src/test/java/io/socket/client/SocketTest.java b/src/test/java/io/socket/client/SocketTest.java index 3006005..aa94e70 100644 --- a/src/test/java/io/socket/client/SocketTest.java +++ b/src/test/java/io/socket/client/SocketTest.java @@ -2,6 +2,8 @@ package io.socket.client; import io.socket.emitter.Emitter; import io.socket.util.Optional; +import org.json.JSONException; +import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -23,7 +25,7 @@ public class SocketTest extends Connection { private Socket socket; @Test(timeout = TIMEOUT) - public void shouldHaveAnAccessibleSocketIdEqualToTheEngineIOSocketId() throws URISyntaxException, InterruptedException { + public void shouldHaveAnAccessibleSocketIdEqualToServerSideSocketId() throws URISyntaxException, InterruptedException { final BlockingQueue values = new LinkedBlockingQueue(); socket = client(); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @@ -41,6 +43,25 @@ public class SocketTest extends Connection { socket.disconnect(); } + @Test(timeout = TIMEOUT) + public void shouldHaveAnAccessibleSocketIdEqualToServerSideSocketIdOnCustomNamespace() throws URISyntaxException, InterruptedException { + final BlockingQueue values = new LinkedBlockingQueue(); + socket = client("/foo"); + socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... objects) { + values.offer(Optional.ofNullable(socket.id())); + } + }); + socket.connect(); + + @SuppressWarnings("unchecked") + Optional id = values.take(); + assertThat(id.isPresent(), is(true)); + assertThat(id.get(), is("/foo#" + socket.io().engine.id())); + socket.disconnect(); + } + @Test(timeout = TIMEOUT) public void clearsSocketIdUponDisconnection() throws URISyntaxException, InterruptedException { final BlockingQueue values = new LinkedBlockingQueue(); @@ -170,19 +191,46 @@ public class SocketTest extends Connection { } @Test(timeout = TIMEOUT) - public void shouldStoreQueryStringAsAProperty() throws URISyntaxException, InterruptedException { - IO.Options opts = new IO.Options(); - opts.query = "a=b"; - Socket socket = IO.socket(this.uri() + "/abc", opts); + public void shouldAcceptAQueryStringOnDefaultNamespace() throws URISyntaxException, InterruptedException, JSONException { + final BlockingQueue values = new LinkedBlockingQueue(); - Socket socket2 = IO.socket(this.uri() + "/abc?b=c&d=e"); + socket = client("/?c=d"); + socket.emit("getHandshake", new Ack() { + @Override + public void call(Object... args) { + JSONObject handshake = (JSONObject)args[0]; + values.offer(Optional.ofNullable(handshake)); + } + }); + socket.connect(); - IO.Options opts3 = new IO.Options(); - opts.query = "%26a=%26%3D%3Fa"; - Socket socket3 = IO.socket(this.uri() + "/abc", opts); + @SuppressWarnings("unchecked") + Optional handshake = values.take(); + assertThat(handshake.get().getJSONObject("query").getString("c"), is("d")); - assertThat(socket.query, is("a=b")); - assertThat(socket2.query, is("b=c&d=e")); - assertThat(socket3.query, is("%26a=%26%3D%3Fa")); + socket.disconnect(); + } + + @Test(timeout = TIMEOUT) + public void shouldAcceptAQueryString() throws URISyntaxException, InterruptedException, JSONException { + final BlockingQueue values = new LinkedBlockingQueue(); + + socket = client("/abc?b=c&d=e"); + socket.on("handshake", new Emitter.Listener() { + @Override + public void call(Object... args) { + JSONObject handshake = (JSONObject)args[0]; + values.offer(Optional.ofNullable(handshake)); + } + }); + socket.connect(); + + @SuppressWarnings("unchecked") + Optional handshake = values.take(); + JSONObject query = handshake.get().getJSONObject("query"); + assertThat(query.getString("b"), is("c")); + assertThat(query.getString("d"), is("e")); + + socket.disconnect(); } } diff --git a/src/test/java/io/socket/parser/ByteArrayTest.java b/src/test/java/io/socket/parser/ByteArrayTest.java index 5154cec..a358c15 100644 --- a/src/test/java/io/socket/parser/ByteArrayTest.java +++ b/src/test/java/io/socket/parser/ByteArrayTest.java @@ -16,7 +16,7 @@ import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class ByteArrayTest { - private static Parser.Encoder encoder = new Parser.Encoder(); + private static Parser.Encoder encoder = new IOParser.Encoder(); @Test public void encodeByteArray() { @@ -87,10 +87,10 @@ public class ByteArrayTest { encoder.encode(packet, new Parser.Encoder.Callback() { @Override public void call(final Object[] encodedPackets) { - final Parser.Decoder decoder = new Parser.Decoder(); - decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() { + final IOParser.Decoder decoder = new IOParser.Decoder(); + decoder.onDecoded(new Parser.Decoder.Callback() { @Override - public void call(Object... args) { + public void call(Packet packet) { throw new RuntimeException("received a packet when not all binary data was sent."); } }); diff --git a/src/test/java/io/socket/parser/Helpers.java b/src/test/java/io/socket/parser/Helpers.java index d56188b..0a3d461 100644 --- a/src/test/java/io/socket/parser/Helpers.java +++ b/src/test/java/io/socket/parser/Helpers.java @@ -14,18 +14,17 @@ import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class Helpers { - private static Parser.Encoder encoder = new Parser.Encoder(); + private static Parser.Encoder encoder = new IOParser.Encoder(); private static Packet errorPacket = new Packet(Parser.ERROR, "parser error"); public static void test(final Packet obj) { encoder.encode(obj, new Parser.Encoder.Callback() { @Override public void call(Object[] encodedPackets) { - Parser.Decoder decoder = new Parser.Decoder(); - decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() { + Parser.Decoder decoder = new IOParser.Decoder(); + decoder.onDecoded(new Parser.Decoder.Callback() { @Override - public void call(Object... args) { - Packet packet = (Packet)args[0]; + public void call(Packet packet) { assertPacket(packet, obj); } }); @@ -35,11 +34,10 @@ public class Helpers { } public static void testDecodeError(final String errorMessage) { - Parser.Decoder decoder = new Parser.Decoder(); - decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() { + Parser.Decoder decoder = new IOParser.Decoder(); + decoder.onDecoded(new IOParser.Decoder.Callback() { @Override - public void call(Object... args) { - Packet packet = (Packet)args[0]; + public void call(Packet packet) { assertPacket(errorPacket, packet); } }); @@ -52,11 +50,10 @@ public class Helpers { encoder.encode(obj, new Parser.Encoder.Callback() { @Override public void call(Object[] encodedPackets) { - Parser.Decoder decoder = new Parser.Decoder(); - decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() { + Parser.Decoder decoder = new IOParser.Decoder(); + decoder.onDecoded(new Parser.Decoder.Callback() { @Override - public void call(Object... args) { - Packet packet = (Packet)args[0]; + public void call(Packet packet) { obj.data = originalData; obj.attachments = -1; assertPacket(packet, obj); diff --git a/src/test/java/io/socket/parser/ParserTest.java b/src/test/java/io/socket/parser/ParserTest.java index d7ff220..c13005c 100644 --- a/src/test/java/io/socket/parser/ParserTest.java +++ b/src/test/java/io/socket/parser/ParserTest.java @@ -9,7 +9,7 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ParserTest { - private static Parser.Encoder encoder = new Parser.Encoder(); + private static Parser.Encoder encoder = new IOParser.Encoder(); @Test public void encodeConnection() { diff --git a/src/test/resources/package-lock.json b/src/test/resources/package-lock.json index 4ba4286..491c6bc 100644 --- a/src/test/resources/package-lock.json +++ b/src/test/resources/package-lock.json @@ -2,116 +2,267 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "arraybuffer.slice": { - "version": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" - }, - "backo2": { - "version": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "better-assert": { - "version": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "requires": { - "callsite": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" + "mime-types": "2.1.15", + "negotiator": "0.6.1" } }, - "blob": { - "version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, - "callsite": { - "version": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" }, - "component-bind": { - "version": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" - }, - "component-inherit": { - "version": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, - "has-binary": { - "version": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "ms": "2.0.0" } }, - "has-cors": { - "version": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "indexof": { - "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" - }, - "object-component": { - "version": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "options": { - "version": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" - }, - "socket.io": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", - "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", + "engine.io": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz", + "integrity": "sha1-XKQ4486f28kVxKIcjdnhJmcG5X4=", "requires": { - "debug": "2.3.3", - "engine.io": "1.8.4", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.4", - "socket.io-parser": "2.3.1" + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.6.8", + "engine.io-parser": "2.1.1", + "uws": "0.14.5", + "ws": "2.3.1" + } + }, + "engine.io-client": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", + "integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.6.8", + "engine.io-parser": "2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "2.3.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } + }, + "engine.io-parser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", + "integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.2" + }, + "dependencies": { + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + } + } + }, + "has-binary2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", + "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "requires": { + "mime-db": "1.27.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "requires": { + "better-assert": "1.0.2" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", "requires": { - "mime-types": "2.1.15", - "negotiator": "0.6.1" + "callsite": "1.0.0" } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64id": { + "callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + }, + "socket.io": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz", + "integrity": "sha1-Q1nwaiSTOua9CHeYr3jGgOrjReM=", + "requires": { + "debug": "2.6.8", + "engine.io": "3.1.0", + "object-assign": "4.1.1", + "socket.io-adapter": "1.1.0", + "socket.io-client": "2.0.3", + "socket.io-parser": "3.1.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "socket.io-adapter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz", + "integrity": "sha1-x6pGUB3VVsLLiiivj/lcC14dqkw=", + "requires": { + "debug": "2.3.3" + }, + "dependencies": { "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", @@ -120,211 +271,119 @@ "ms": "0.7.2" } }, - "engine.io": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.4.tgz", - "integrity": "sha1-d7zhK4Dl1gQpM3/sOw2vaR68kAM=", - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.4" - } - }, - "engine.io-client": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz", - "integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "requires": { - "options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" - } - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "base64-arraybuffer": "0.1.5", - "blob": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "wtf-8": "1.0.0" - } - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "requires": { - "mime-db": "1.27.0" - } - }, "ms": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - } - }, - "socket.io-client": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", - "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", - "requires": { - "backo2": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "component-bind": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.4", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "object-component": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "debug": "2.2.0", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "json3": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "ws": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz", - "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=", - "requires": { - "options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" } } }, - "to-array": { - "version": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + "socket.io-client": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz", + "integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.6.8", + "engine.io-client": "3.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.1.2", + "to-array": "0.1.4" + }, + "dependencies": { + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + } + } }, - "ultron": { - "version": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + "socket.io-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", + "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "requires": { + "component-emitter": "1.2.1", + "debug": "2.6.8", + "has-binary2": "1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + "uws": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", + "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", + "optional": true }, - "yeast": { - "version": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + "ws": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", + "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "requires": { + "safe-buffer": "5.0.1", + "ultron": "1.1.0" + }, + "dependencies": { + "ultron": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", + "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" + } + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" } } } diff --git a/src/test/resources/package.json b/src/test/resources/package.json index 9fe90df..495be8d 100644 --- a/src/test/resources/package.json +++ b/src/test/resources/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "socket.io": "1.7.4" + "socket.io": "2.0.3" } } diff --git a/src/test/resources/server.js b/src/test/resources/server.js index 8f12fa3..08ff53c 100644 --- a/src/test/resources/server.js +++ b/src/test/resources/server.js @@ -10,7 +10,10 @@ if (process.env.SSL) { server = require('http').createServer(); } -var io = require('socket.io')(server, { pingInterval: 2000 }); +var io = require('socket.io')(server, { + pingInterval: 2000, + wsEngine: 'ws' +}); var port = process.env.PORT || 3000; var nsp = process.argv[2] || '/'; var slice = Array.prototype.slice; @@ -31,6 +34,10 @@ io.of('/asd').on('connection', function() { // register namespace }); +io.of('/abc').on('connection', function(socket) { + socket.emit('handshake', socket.handshake); +}); + io.of(nsp).on('connection', function(socket) { socket.send('hello client'); @@ -93,6 +100,10 @@ io.of(nsp).on('connection', function(socket) { socket.on('error', function() { console.log('error: ', arguments); }); + + socket.on('getHandshake', function(cb) { + cb(socket.handshake); + }); });