fix autoversion in online mode.

Explanation:
in this specific case, we were changing the state of the client to hanshaking (in autoVersion.js) before a connection was made (using setSocket), the consequence is the serializer was already piped to the framer when setSocket was called, and setSocket doesn't unpipe before piping. The consequence of that was the framer was piped 2 times, the packet was sent 2 times and the server kicked us.
My solution is piping the serializer to the framer in Client constructor.
Then if the state is changed, it will anyway automatically unpipe before repiping.

Other places correctly unpipe before piping.

Autoversion is now the default in nmp too
This commit is contained in:
Romain Beaumont 2017-07-12 13:07:25 +02:00
parent 2d4f4a05e1
commit eb5764e7ab
No known key found for this signature in database
GPG key ID: DB60E388B3BCF286
3 changed files with 19 additions and 18 deletions

View file

@ -7,7 +7,8 @@ if(process.argv.length < 4 || process.argv.length > 6) {
process.exit(1);
}
var client = mc.createClient({version: false,
var client = mc.createClient({
version: false,
host: process.argv[2],
port: parseInt(process.argv[3]),
username: process.argv[4] ? process.argv[4] : "echo",

View file

@ -18,7 +18,6 @@ class Client extends EventEmitter
this.version=version;
this.isServer = !!isServer;
this.splitter=framing.createSplitter();
this.setSerializer(states.HANDSHAKING);
this.packetsToParse={};
this.serializer;
this.compressor=null;
@ -28,7 +27,6 @@ class Client extends EventEmitter
this.decompressor=null;
this.deserializer;
this.isServer;
this.protocolState=states.HANDSHAKING;
this.ended=true;
this.latency=0;
@ -41,6 +39,8 @@ class Client extends EventEmitter
const direction = this.isServer ? 'toServer' : 'toClient';
this.packetsToParse[event] -= 1;
});
this.state=states.HANDSHAKING;
}
get state(){
@ -109,19 +109,19 @@ class Client extends EventEmitter
const oldProperty = this.protocolState;
this.protocolState = newProperty;
if(!this.compressor)
{
this.serializer.unpipe(this.framer);
this.splitter.unpipe(this.deserializer);
}
else
{
this.serializer.unpipe(this.compressor);
this.decompressor.unpipe(this.deserializer);
}
if(this.serializer) {
if (!this.compressor) {
this.serializer.unpipe();
this.splitter.unpipe(this.deserializer);
}
else {
this.serializer.unpipe(this.compressor);
this.decompressor.unpipe(this.deserializer);
}
this.serializer.removeAllListeners();
this.deserializer.removeAllListeners();
this.serializer.removeAllListeners();
this.deserializer.removeAllListeners();
}
this.setSerializer(this.protocolState);
if(!this.compressor)
@ -180,8 +180,8 @@ class Client extends EventEmitter
this.framer.on('error', onError);
this.splitter.on('error', onError);
this.socket.pipe(this.splitter).pipe(this.deserializer);
this.serializer.pipe(this.framer).pipe(this.socket);
this.socket.pipe(this.splitter);
this.framer.pipe(this.socket);
}
end(reason) {

View file

@ -40,7 +40,7 @@ function ping(options, cb) {
// TODO: refactor with src/client/setProtocol.js
client.on('connect', function() {
client.write('set_protocol', {
protocolVersion: options.protocolVersion,
protocolVersion: -1,
serverHost: options.host,
serverPort: options.port,
nextState: 1