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>
|
||||
<groupId>io.socket</groupId>
|
||||
<artifactId>engine.io-client</artifactId>
|
||||
<version>0.9.0</version>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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<Packet>();
|
||||
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<String, Socket> 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.
|
||||
|
||||
@@ -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<Integer, Ack> acks = new HashMap<Integer, Ack>();
|
||||
private Queue<On.Handle> subs;
|
||||
private final Queue<List<Object>> receiveBuffer = new LinkedList<List<Object>>();
|
||||
@@ -182,51 +187,27 @@ public class Socket extends Emitter {
|
||||
return;
|
||||
}
|
||||
|
||||
List<Object> _args = new ArrayList<Object>(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<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);
|
||||
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<Object> _args = new ArrayList<Object>() {{
|
||||
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<JSONArray> packet = new Packet<JSONArray>(parserType, jsonArgs);
|
||||
|
||||
logger.fine(String.format("emitting packet with ack id %d", ids));
|
||||
Socket.this.acks.put(ids, ack);
|
||||
packet.id = ids++;
|
||||
Packet<JSONArray> packet = new Packet<JSONArray>(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<JSONArray> packet = new Packet<JSONArray>(type, jsonArgs);
|
||||
Packet<JSONArray> packet = new Packet<JSONArray>(Parser.ACK, jsonArgs);
|
||||
packet.id = id;
|
||||
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;
|
||||
|
||||
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<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 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<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[]>();
|
||||
public void call(Packet packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||
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<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)
|
||||
public void clearsSocketIdUponDisconnection() throws URISyntaxException, InterruptedException {
|
||||
final BlockingQueue<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||
@@ -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<Optional> values = new LinkedBlockingQueue<Optional>();
|
||||
|
||||
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<JSONObject> 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<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)
|
||||
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.");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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<String> errorPacket = new Packet<String>(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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
625
src/test/resources/package-lock.json
generated
625
src/test/resources/package-lock.json
generated
@@ -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="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"socket.io": "1.7.4"
|
||||
"socket.io": "2.0.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user