Merge pull request #439 from socketio/fix/compatible-v2
Make compatible with Socket.IO v2
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -62,7 +62,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.socket</groupId>
|
<groupId>io.socket</groupId>
|
||||||
<artifactId>engine.io-client</artifactId>
|
<artifactId>engine.io-client</artifactId>
|
||||||
<version>0.9.0</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.json</groupId>
|
<groupId>org.json</groupId>
|
||||||
|
|||||||
@@ -3,16 +3,13 @@ package io.socket.client;
|
|||||||
|
|
||||||
import io.socket.parser.Parser;
|
import io.socket.parser.Parser;
|
||||||
import okhttp3.Call;
|
import okhttp3.Call;
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.WebSocket;
|
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.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,16 +2,24 @@ package io.socket.client;
|
|||||||
|
|
||||||
import io.socket.backo.Backoff;
|
import io.socket.backo.Backoff;
|
||||||
import io.socket.emitter.Emitter;
|
import io.socket.emitter.Emitter;
|
||||||
|
import io.socket.parser.IOParser;
|
||||||
import io.socket.parser.Packet;
|
import io.socket.parser.Packet;
|
||||||
import io.socket.parser.Parser;
|
import io.socket.parser.Parser;
|
||||||
import io.socket.thread.EventThread;
|
import io.socket.thread.EventThread;
|
||||||
import okhttp3.Call;
|
import okhttp3.Call;
|
||||||
import okhttp3.WebSocket;
|
import okhttp3.WebSocket;
|
||||||
|
|
||||||
import javax.net.ssl.HostnameVerifier;
|
|
||||||
import javax.net.ssl.SSLContext;
|
|
||||||
import java.net.URI;
|
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.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@@ -148,8 +156,8 @@ public class Manager extends Emitter {
|
|||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.encoding = false;
|
this.encoding = false;
|
||||||
this.packetBuffer = new ArrayList<Packet>();
|
this.packetBuffer = new ArrayList<Packet>();
|
||||||
this.encoder = new Parser.Encoder();
|
this.encoder = opts.encoder != null ? opts.encoder : new IOParser.Encoder();
|
||||||
this.decoder = new Parser.Decoder();
|
this.decoder = opts.decoder != null ? opts.decoder : new IOParser.Decoder();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void emitAll(String event, Object... args) {
|
private void emitAll(String event, Object... args) {
|
||||||
@@ -163,11 +171,17 @@ public class Manager extends Emitter {
|
|||||||
* Update `socket.id` of all sockets
|
* Update `socket.id` of all sockets
|
||||||
*/
|
*/
|
||||||
private void updateSocketIds() {
|
private void updateSocketIds() {
|
||||||
for (Socket socket : this.nsps.values()) {
|
for (Map.Entry<String, Socket> entry : this.nsps.entrySet()) {
|
||||||
socket.id = this.engine.id();
|
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() {
|
public boolean reconnection() {
|
||||||
return this._reconnection;
|
return this._reconnection;
|
||||||
}
|
}
|
||||||
@@ -383,12 +397,12 @@ public class Manager extends Emitter {
|
|||||||
Manager.this.onclose((String)objects[0]);
|
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
|
@Override
|
||||||
public void call(Object... objects) {
|
public void call (Packet packet) {
|
||||||
Manager.this.ondecoded((Packet) objects[0]);
|
Manager.this.ondecoded(packet);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onping() {
|
private void onping() {
|
||||||
@@ -425,7 +439,7 @@ public class Manager extends Emitter {
|
|||||||
* @param opts options.
|
* @param opts options.
|
||||||
* @return a socket instance for the namespace.
|
* @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);
|
Socket socket = this.nsps.get(nsp);
|
||||||
if (socket == null) {
|
if (socket == null) {
|
||||||
socket = new Socket(this, nsp, opts);
|
socket = new Socket(this, nsp, opts);
|
||||||
@@ -444,7 +458,7 @@ public class Manager extends Emitter {
|
|||||||
socket.on(Socket.EVENT_CONNECT, new Listener() {
|
socket.on(Socket.EVENT_CONNECT, new Listener() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object... objects) {
|
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;
|
On.Handle sub;
|
||||||
while ((sub = this.subs.poll()) != null) sub.destroy();
|
while ((sub = this.subs.poll()) != null) sub.destroy();
|
||||||
|
this.decoder.onDecoded(null);
|
||||||
|
|
||||||
this.packetBuffer.clear();
|
this.packetBuffer.clear();
|
||||||
this.encoding = false;
|
this.encoding = false;
|
||||||
@@ -631,6 +646,8 @@ public class Manager extends Emitter {
|
|||||||
public long reconnectionDelay;
|
public long reconnectionDelay;
|
||||||
public long reconnectionDelayMax;
|
public long reconnectionDelayMax;
|
||||||
public double randomizationFactor;
|
public double randomizationFactor;
|
||||||
|
public Parser.Encoder encoder;
|
||||||
|
public Parser.Decoder decoder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection timeout (ms). Set -1 to disable.
|
* Connection timeout (ms). Set -1 to disable.
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package io.socket.client;
|
package io.socket.client;
|
||||||
|
|
||||||
import io.socket.emitter.Emitter;
|
import io.socket.emitter.Emitter;
|
||||||
import io.socket.hasbinary.HasBinary;
|
|
||||||
import io.socket.parser.Packet;
|
import io.socket.parser.Packet;
|
||||||
import io.socket.parser.Parser;
|
import io.socket.parser.Parser;
|
||||||
import io.socket.thread.EventThread;
|
import io.socket.thread.EventThread;
|
||||||
@@ -9,7 +8,13 @@ import org.json.JSONArray;
|
|||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
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.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@@ -79,12 +84,12 @@ public class Socket extends Emitter {
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
/*package*/ String id;
|
/*package*/ String id;
|
||||||
/*package*/ String query;
|
|
||||||
|
|
||||||
private volatile boolean connected;
|
private volatile boolean connected;
|
||||||
private int ids;
|
private int ids;
|
||||||
private String nsp;
|
private String nsp;
|
||||||
private Manager io;
|
private Manager io;
|
||||||
|
private String query;
|
||||||
private Map<Integer, Ack> acks = new HashMap<Integer, Ack>();
|
private Map<Integer, Ack> acks = new HashMap<Integer, Ack>();
|
||||||
private Queue<On.Handle> subs;
|
private Queue<On.Handle> subs;
|
||||||
private final Queue<List<Object>> receiveBuffer = new LinkedList<List<Object>>();
|
private final Queue<List<Object>> receiveBuffer = new LinkedList<List<Object>>();
|
||||||
@@ -182,51 +187,27 @@ public class Socket extends Emitter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Object> _args = new ArrayList<Object>(args.length + 1);
|
Ack ack;
|
||||||
_args.add(event);
|
Object[] _args;
|
||||||
_args.addAll(Arrays.asList(args));
|
int lastIndex = args.length - 1;
|
||||||
|
|
||||||
JSONArray jsonArgs = new JSONArray();
|
if (args.length > 0 && args[lastIndex] instanceof Ack) {
|
||||||
for (Object arg : _args) {
|
_args = new Object[lastIndex];
|
||||||
jsonArgs.put(arg);
|
for (int i = 0; i < lastIndex; i++) {
|
||||||
|
_args[i] = args[i];
|
||||||
}
|
}
|
||||||
int parserType = HasBinary.hasBinary(jsonArgs) ? Parser.BINARY_EVENT : Parser.EVENT;
|
ack = (Ack) args[lastIndex];
|
||||||
Packet<JSONArray> packet = new Packet<JSONArray>(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);
|
|
||||||
} else {
|
} else {
|
||||||
Socket.this.sendBuffer.add(packet);
|
_args = args;
|
||||||
|
ack = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emit(event, _args, ack);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return this;
|
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.
|
* Emits an event with an acknowledge.
|
||||||
*
|
*
|
||||||
@@ -239,25 +220,28 @@ public class Socket extends Emitter {
|
|||||||
EventThread.exec(new Runnable() {
|
EventThread.exec(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
List<Object> _args = new ArrayList<Object>() {{
|
|
||||||
add(event);
|
|
||||||
if (args != null) {
|
|
||||||
addAll(Arrays.asList(args));
|
|
||||||
}
|
|
||||||
}};
|
|
||||||
|
|
||||||
JSONArray jsonArgs = new JSONArray();
|
JSONArray jsonArgs = new JSONArray();
|
||||||
for (Object _arg : _args) {
|
jsonArgs.put(event);
|
||||||
jsonArgs.put(_arg);
|
|
||||||
}
|
|
||||||
int parserType = HasBinary.hasBinary(jsonArgs) ? Parser.BINARY_EVENT : Parser.EVENT;
|
|
||||||
Packet<JSONArray> packet = new Packet<JSONArray>(parserType, jsonArgs);
|
|
||||||
|
|
||||||
|
if (args != null) {
|
||||||
|
for (Object arg : args) {
|
||||||
|
jsonArgs.put(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Packet<JSONArray> packet = new Packet<JSONArray>(Parser.EVENT, jsonArgs);
|
||||||
|
|
||||||
|
if (ack != null) {
|
||||||
logger.fine(String.format("emitting packet with ack id %d", ids));
|
logger.fine(String.format("emitting packet with ack id %d", ids));
|
||||||
Socket.this.acks.put(ids, ack);
|
Socket.this.acks.put(ids, ack);
|
||||||
packet.id = ids++;
|
packet.id = ids++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Socket.this.connected) {
|
||||||
Socket.this.packet(packet);
|
Socket.this.packet(packet);
|
||||||
|
} else {
|
||||||
|
Socket.this.sendBuffer.add(packet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return this;
|
return this;
|
||||||
@@ -377,9 +361,7 @@ public class Socket extends Emitter {
|
|||||||
jsonArgs.put(arg);
|
jsonArgs.put(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int type = HasBinary.hasBinary(jsonArgs)
|
Packet<JSONArray> packet = new Packet<JSONArray>(Parser.ACK, jsonArgs);
|
||||||
? Parser.BINARY_ACK : Parser.ACK;
|
|
||||||
Packet<JSONArray> packet = new Packet<JSONArray>(type, jsonArgs);
|
|
||||||
packet.id = id;
|
packet.id = id;
|
||||||
self.packet(packet);
|
self.packet(packet);
|
||||||
}
|
}
|
||||||
|
|||||||
238
src/main/java/io/socket/parser/IOParser.java
Normal file
238
src/main/java/io/socket/parser/IOParser.java
Normal file
@@ -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<String> error() {
|
||||||
|
return new Packet<String>(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<Object> buffers = new ArrayList<Object>(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<Object> p = new Packet<Object>(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<byte[]> buffers;
|
||||||
|
|
||||||
|
BinaryReconstructor(Packet packet) {
|
||||||
|
this.reconPack = packet;
|
||||||
|
this.buffers = new ArrayList<byte[]>();
|
||||||
|
}
|
||||||
|
|
||||||
|
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<byte[]>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1,18 +1,6 @@
|
|||||||
package io.socket.parser;
|
package io.socket.parser;
|
||||||
|
|
||||||
import io.socket.emitter.Emitter;
|
public interface Parser {
|
||||||
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());
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Packet type `connect`.
|
* Packet type `connect`.
|
||||||
@@ -64,74 +52,9 @@ public class Parser {
|
|||||||
"BINARY_ACK"
|
"BINARY_ACK"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static interface Encoder {
|
||||||
|
|
||||||
private Parser() {}
|
public void encode(Packet obj, Callback callback);
|
||||||
|
|
||||||
private static Packet<String> error() {
|
|
||||||
return new Packet<String>(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<Object> buffers = new ArrayList<Object>(Arrays.asList(deconstruction.buffers));
|
|
||||||
|
|
||||||
buffers.add(0, pack);
|
|
||||||
callback.call(buffers.toArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface 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() {
|
public void destroy();
|
||||||
this.reconstructor = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(String obj) {
|
public void onDecoded(Callback callback);
|
||||||
Packet packet = decodeString(obj);
|
|
||||||
if (BINARY_EVENT == packet.type || BINARY_ACK == packet.type) {
|
|
||||||
this.reconstructor = new BinaryReconstructor(packet);
|
|
||||||
|
|
||||||
if (this.reconstructor.reconPack.attachments == 0) {
|
public interface Callback {
|
||||||
this.emit(EVENT_DECODED, packet);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.emit(EVENT_DECODED, packet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(byte[] obj) {
|
public void call(Packet packet);
|
||||||
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<Object> p = new Packet<Object>();
|
|
||||||
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<byte[]> buffers;
|
|
||||||
|
|
||||||
BinaryReconstructor(Packet packet) {
|
|
||||||
this.reconPack = packet;
|
|
||||||
this.buffers = new ArrayList<byte[]>();
|
|
||||||
}
|
|
||||||
|
|
||||||
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<byte[]>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public abstract class Connection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Socket client(String path) throws URISyntaxException {
|
Socket client(String path) throws URISyntaxException {
|
||||||
return IO.socket(path, createOptions());
|
return client(path, createOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
Socket client(IO.Options opts) throws URISyntaxException {
|
Socket client(IO.Options opts) throws URISyntaxException {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package io.socket.client;
|
|||||||
|
|
||||||
import io.socket.emitter.Emitter;
|
import io.socket.emitter.Emitter;
|
||||||
import io.socket.util.Optional;
|
import io.socket.util.Optional;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.JUnit4;
|
import org.junit.runners.JUnit4;
|
||||||
@@ -23,7 +25,7 @@ public class SocketTest extends Connection {
|
|||||||
private Socket socket;
|
private Socket socket;
|
||||||
|
|
||||||
@Test(timeout = TIMEOUT)
|
@Test(timeout = TIMEOUT)
|
||||||
public void shouldHaveAnAccessibleSocketIdEqualToTheEngineIOSocketId() throws URISyntaxException, InterruptedException {
|
public void shouldHaveAnAccessibleSocketIdEqualToServerSideSocketId() throws URISyntaxException, InterruptedException {
|
||||||
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||||
socket = client();
|
socket = client();
|
||||||
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
|
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
|
||||||
@@ -41,6 +43,25 @@ public class SocketTest extends Connection {
|
|||||||
socket.disconnect();
|
socket.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = TIMEOUT)
|
||||||
|
public void shouldHaveAnAccessibleSocketIdEqualToServerSideSocketIdOnCustomNamespace() throws URISyntaxException, InterruptedException {
|
||||||
|
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||||
|
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<String> id = values.take();
|
||||||
|
assertThat(id.isPresent(), is(true));
|
||||||
|
assertThat(id.get(), is("/foo#" + socket.io().engine.id()));
|
||||||
|
socket.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
@Test(timeout = TIMEOUT)
|
@Test(timeout = TIMEOUT)
|
||||||
public void clearsSocketIdUponDisconnection() throws URISyntaxException, InterruptedException {
|
public void clearsSocketIdUponDisconnection() throws URISyntaxException, InterruptedException {
|
||||||
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||||
@@ -170,19 +191,46 @@ public class SocketTest extends Connection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test(timeout = TIMEOUT)
|
@Test(timeout = TIMEOUT)
|
||||||
public void shouldStoreQueryStringAsAProperty() throws URISyntaxException, InterruptedException {
|
public void shouldAcceptAQueryStringOnDefaultNamespace() throws URISyntaxException, InterruptedException, JSONException {
|
||||||
IO.Options opts = new IO.Options();
|
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||||
opts.query = "a=b";
|
|
||||||
Socket socket = IO.socket(this.uri() + "/abc", opts);
|
|
||||||
|
|
||||||
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();
|
@SuppressWarnings("unchecked")
|
||||||
opts.query = "%26a=%26%3D%3Fa";
|
Optional<JSONObject> handshake = values.take();
|
||||||
Socket socket3 = IO.socket(this.uri() + "/abc", opts);
|
assertThat(handshake.get().getJSONObject("query").getString("c"), is("d"));
|
||||||
|
|
||||||
assertThat(socket.query, is("a=b"));
|
socket.disconnect();
|
||||||
assertThat(socket2.query, is("b=c&d=e"));
|
}
|
||||||
assertThat(socket3.query, is("%26a=%26%3D%3Fa"));
|
|
||||||
|
@Test(timeout = TIMEOUT)
|
||||||
|
public void shouldAcceptAQueryString() throws URISyntaxException, InterruptedException, JSONException {
|
||||||
|
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||||
|
|
||||||
|
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<JSONObject> handshake = values.take();
|
||||||
|
JSONObject query = handshake.get().getJSONObject("query");
|
||||||
|
assertThat(query.getString("b"), is("c"));
|
||||||
|
assertThat(query.getString("d"), is("e"));
|
||||||
|
|
||||||
|
socket.disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import static org.junit.Assert.assertThat;
|
|||||||
@RunWith(JUnit4.class)
|
@RunWith(JUnit4.class)
|
||||||
public class ByteArrayTest {
|
public class ByteArrayTest {
|
||||||
|
|
||||||
private static Parser.Encoder encoder = new Parser.Encoder();
|
private static Parser.Encoder encoder = new IOParser.Encoder();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void encodeByteArray() {
|
public void encodeByteArray() {
|
||||||
@@ -87,10 +87,10 @@ public class ByteArrayTest {
|
|||||||
encoder.encode(packet, new Parser.Encoder.Callback() {
|
encoder.encode(packet, new Parser.Encoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(final Object[] encodedPackets) {
|
public void call(final Object[] encodedPackets) {
|
||||||
final Parser.Decoder decoder = new Parser.Decoder();
|
final IOParser.Decoder decoder = new IOParser.Decoder();
|
||||||
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
|
decoder.onDecoded(new Parser.Decoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object... args) {
|
public void call(Packet packet) {
|
||||||
throw new RuntimeException("received a packet when not all binary data was sent.");
|
throw new RuntimeException("received a packet when not all binary data was sent.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,18 +14,17 @@ import static org.junit.Assert.assertThat;
|
|||||||
@RunWith(JUnit4.class)
|
@RunWith(JUnit4.class)
|
||||||
public class Helpers {
|
public class Helpers {
|
||||||
|
|
||||||
private static Parser.Encoder encoder = new Parser.Encoder();
|
private static Parser.Encoder encoder = new IOParser.Encoder();
|
||||||
private static Packet<String> errorPacket = new Packet<String>(Parser.ERROR, "parser error");
|
private static Packet<String> errorPacket = new Packet<String>(Parser.ERROR, "parser error");
|
||||||
|
|
||||||
public static void test(final Packet obj) {
|
public static void test(final Packet obj) {
|
||||||
encoder.encode(obj, new Parser.Encoder.Callback() {
|
encoder.encode(obj, new Parser.Encoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object[] encodedPackets) {
|
public void call(Object[] encodedPackets) {
|
||||||
Parser.Decoder decoder = new Parser.Decoder();
|
Parser.Decoder decoder = new IOParser.Decoder();
|
||||||
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
|
decoder.onDecoded(new Parser.Decoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object... args) {
|
public void call(Packet packet) {
|
||||||
Packet packet = (Packet)args[0];
|
|
||||||
assertPacket(packet, obj);
|
assertPacket(packet, obj);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -35,11 +34,10 @@ public class Helpers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void testDecodeError(final String errorMessage) {
|
public static void testDecodeError(final String errorMessage) {
|
||||||
Parser.Decoder decoder = new Parser.Decoder();
|
Parser.Decoder decoder = new IOParser.Decoder();
|
||||||
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
|
decoder.onDecoded(new IOParser.Decoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object... args) {
|
public void call(Packet packet) {
|
||||||
Packet packet = (Packet)args[0];
|
|
||||||
assertPacket(errorPacket, packet);
|
assertPacket(errorPacket, packet);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -52,11 +50,10 @@ public class Helpers {
|
|||||||
encoder.encode(obj, new Parser.Encoder.Callback() {
|
encoder.encode(obj, new Parser.Encoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object[] encodedPackets) {
|
public void call(Object[] encodedPackets) {
|
||||||
Parser.Decoder decoder = new Parser.Decoder();
|
Parser.Decoder decoder = new IOParser.Decoder();
|
||||||
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
|
decoder.onDecoded(new Parser.Decoder.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object... args) {
|
public void call(Packet packet) {
|
||||||
Packet packet = (Packet)args[0];
|
|
||||||
obj.data = originalData;
|
obj.data = originalData;
|
||||||
obj.attachments = -1;
|
obj.attachments = -1;
|
||||||
assertPacket(packet, obj);
|
assertPacket(packet, obj);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import org.junit.runners.JUnit4;
|
|||||||
@RunWith(JUnit4.class)
|
@RunWith(JUnit4.class)
|
||||||
public class ParserTest {
|
public class ParserTest {
|
||||||
|
|
||||||
private static Parser.Encoder encoder = new Parser.Encoder();
|
private static Parser.Encoder encoder = new IOParser.Encoder();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void encodeConnection() {
|
public void encodeConnection() {
|
||||||
|
|||||||
453
src/test/resources/package-lock.json
generated
453
src/test/resources/package-lock.json
generated
@@ -1,92 +1,6 @@
|
|||||||
{
|
{
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"lockfileVersion": 1,
|
"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=",
|
|
||||||
"requires": {
|
|
||||||
"callsite": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"blob": {
|
|
||||||
"version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
|
|
||||||
"integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
|
|
||||||
},
|
|
||||||
"callsite": {
|
|
||||||
"version": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
|
|
||||||
},
|
|
||||||
"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="
|
|
||||||
},
|
|
||||||
"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=",
|
|
||||||
"requires": {
|
|
||||||
"isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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=",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"accepts": {
|
"accepts": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
@@ -112,44 +26,50 @@
|
|||||||
"resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
|
||||||
"integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
|
"integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
|
||||||
},
|
},
|
||||||
|
"cookie": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||||
|
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||||
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "2.3.3",
|
"version": "2.6.8",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||||
"integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
|
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ms": "0.7.2"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"engine.io": {
|
"engine.io": {
|
||||||
"version": "1.8.4",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz",
|
||||||
"integrity": "sha1-d7zhK4Dl1gQpM3/sOw2vaR68kAM=",
|
"integrity": "sha1-XKQ4486f28kVxKIcjdnhJmcG5X4=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"accepts": "1.3.3",
|
"accepts": "1.3.3",
|
||||||
"base64id": "1.0.0",
|
"base64id": "1.0.0",
|
||||||
"cookie": "0.3.1",
|
"cookie": "0.3.1",
|
||||||
"debug": "2.3.3",
|
"debug": "2.6.8",
|
||||||
"engine.io-parser": "1.3.2",
|
"engine.io-parser": "2.1.1",
|
||||||
"ws": "1.1.4"
|
"uws": "0.14.5",
|
||||||
|
"ws": "2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"engine.io-client": {
|
"engine.io-client": {
|
||||||
"version": "1.8.4",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz",
|
||||||
"integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=",
|
"integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"component-emitter": "1.2.1",
|
"component-emitter": "1.2.1",
|
||||||
"component-inherit": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
|
"component-inherit": "0.0.3",
|
||||||
"debug": "2.3.3",
|
"debug": "2.6.8",
|
||||||
"engine.io-parser": "1.3.2",
|
"engine.io-parser": "2.1.1",
|
||||||
"has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
|
"has-cors": "1.1.0",
|
||||||
"indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
|
"indexof": "0.0.1",
|
||||||
"parsejson": "0.0.3",
|
"parsejson": "0.0.3",
|
||||||
"parseqs": "0.0.5",
|
"parseqs": "0.0.5",
|
||||||
"parseuri": "0.0.5",
|
"parseuri": "0.0.5",
|
||||||
"ws": "1.1.2",
|
"ws": "2.3.1",
|
||||||
"xmlhttprequest-ssl": "1.5.3",
|
"xmlhttprequest-ssl": "1.5.3",
|
||||||
"yeast": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz"
|
"yeast": "0.1.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"component-emitter": {
|
"component-emitter": {
|
||||||
@@ -157,34 +77,66 @@
|
|||||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
|
||||||
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
||||||
},
|
},
|
||||||
"ws": {
|
"component-inherit": {
|
||||||
"version": "1.1.2",
|
"version": "0.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
|
||||||
"integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
|
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
|
||||||
"requires": {
|
},
|
||||||
"options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
|
"has-cors": {
|
||||||
"ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
|
"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": {
|
"engine.io-parser": {
|
||||||
"version": "1.3.2",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz",
|
||||||
"integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
|
"integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"after": "0.8.2",
|
"after": "0.8.2",
|
||||||
"arraybuffer.slice": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
|
"arraybuffer.slice": "0.0.6",
|
||||||
"base64-arraybuffer": "0.1.5",
|
"base64-arraybuffer": "0.1.5",
|
||||||
"blob": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
|
"blob": "0.0.4",
|
||||||
"has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
|
"has-binary2": "1.0.2"
|
||||||
"wtf-8": "1.0.0"
|
},
|
||||||
|
"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="
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"json3": {
|
"has-binary2": {
|
||||||
"version": "3.3.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
|
||||||
"integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
|
"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": {
|
"mime-db": {
|
||||||
"version": "1.27.0",
|
"version": "1.27.0",
|
||||||
@@ -200,9 +152,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "0.7.2",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
},
|
},
|
||||||
"negotiator": {
|
"negotiator": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
@@ -214,7 +166,22 @@
|
|||||||
"resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
|
||||||
"integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
|
"integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz"
|
"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="
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parseqs": {
|
"parseqs": {
|
||||||
@@ -222,7 +189,22 @@
|
|||||||
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
|
||||||
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
|
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz"
|
"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": {
|
"parseuri": {
|
||||||
@@ -230,76 +212,172 @@
|
|||||||
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
|
||||||
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
|
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz"
|
"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": {
|
"socket.io-adapter": {
|
||||||
"version": "0.5.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz",
|
||||||
"integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=",
|
"integrity": "sha1-x6pGUB3VVsLLiiivj/lcC14dqkw=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"debug": "2.3.3",
|
"debug": "2.3.3"
|
||||||
"socket.io-parser": "2.3.1"
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
|
||||||
|
"integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
|
||||||
|
"requires": {
|
||||||
|
"ms": "0.7.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "0.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
|
||||||
|
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"socket.io-client": {
|
"socket.io-client": {
|
||||||
"version": "1.7.4",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz",
|
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz",
|
||||||
"integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=",
|
"integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"backo2": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
|
"backo2": "1.0.2",
|
||||||
"component-bind": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
|
"base64-arraybuffer": "0.1.5",
|
||||||
|
"component-bind": "1.0.0",
|
||||||
"component-emitter": "1.2.1",
|
"component-emitter": "1.2.1",
|
||||||
"debug": "2.3.3",
|
"debug": "2.6.8",
|
||||||
"engine.io-client": "1.8.4",
|
"engine.io-client": "3.1.1",
|
||||||
"has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
|
"has-cors": "1.1.0",
|
||||||
"indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
|
"indexof": "0.0.1",
|
||||||
"object-component": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
|
"object-component": "0.0.3",
|
||||||
|
"parseqs": "0.0.5",
|
||||||
"parseuri": "0.0.5",
|
"parseuri": "0.0.5",
|
||||||
"socket.io-parser": "2.3.1",
|
"socket.io-parser": "3.1.2",
|
||||||
"to-array": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz"
|
"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="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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": {
|
"dependencies": {
|
||||||
"component-emitter": {
|
"component-emitter": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
|
||||||
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
||||||
|
},
|
||||||
|
"isarray": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
|
||||||
|
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"socket.io-parser": {
|
"uws": {
|
||||||
"version": "2.3.1",
|
"version": "0.14.5",
|
||||||
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz",
|
||||||
"integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
|
"integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=",
|
||||||
"requires": {
|
"optional": true
|
||||||
"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": {
|
"ws": {
|
||||||
"version": "1.1.4",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz",
|
||||||
"integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=",
|
"integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
|
"safe-buffer": "5.0.1",
|
||||||
"ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
|
"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": {
|
"xmlhttprequest-ssl": {
|
||||||
@@ -308,23 +386,4 @@
|
|||||||
"integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0="
|
"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="
|
|
||||||
},
|
|
||||||
"ultron": {
|
|
||||||
"version": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
|
|
||||||
},
|
|
||||||
"wtf-8": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo="
|
|
||||||
},
|
|
||||||
"yeast": {
|
|
||||||
"version": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
|
|
||||||
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"socket.io": "1.7.4"
|
"socket.io": "2.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ if (process.env.SSL) {
|
|||||||
server = require('http').createServer();
|
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 port = process.env.PORT || 3000;
|
||||||
var nsp = process.argv[2] || '/';
|
var nsp = process.argv[2] || '/';
|
||||||
var slice = Array.prototype.slice;
|
var slice = Array.prototype.slice;
|
||||||
@@ -31,6 +34,10 @@ io.of('/asd').on('connection', function() {
|
|||||||
// register namespace
|
// register namespace
|
||||||
});
|
});
|
||||||
|
|
||||||
|
io.of('/abc').on('connection', function(socket) {
|
||||||
|
socket.emit('handshake', socket.handshake);
|
||||||
|
});
|
||||||
|
|
||||||
io.of(nsp).on('connection', function(socket) {
|
io.of(nsp).on('connection', function(socket) {
|
||||||
socket.send('hello client');
|
socket.send('hello client');
|
||||||
|
|
||||||
@@ -93,6 +100,10 @@ io.of(nsp).on('connection', function(socket) {
|
|||||||
socket.on('error', function() {
|
socket.on('error', function() {
|
||||||
console.log('error: ', arguments);
|
console.log('error: ', arguments);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
socket.on('getHandshake', function(cb) {
|
||||||
|
cb(socket.handshake);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user