diff --git a/README.md b/README.md index 9db97c7..895e40c 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ rcon.connect().then(() => { () => rcon.command('cvarlist').then(cvarlist => console.log(`cvarlist is \n${cvarlist}`)) ).then( () => rcon.command('changelevel de_dust2').then(() => console.log('changed map')) +).then( + () => rcon.disconnect() ).catch(err => { console.log('caught', err); console.log(err.stack); @@ -69,6 +71,12 @@ rcon.connect().then(() => { rcon.command('cvarlist', 1000).then(console.log, console.error); ``` +#### Disconnect once finished + +``` javascript +rcon.disconnect(); +``` + ## Errors Some errors may contain partial command output. That indicates that the command was run, but reply packets have been lost. diff --git a/index.js b/index.js index d4dea3c..8b3146f 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,8 @@ module.exports = params => { return Object.freeze({ connect: connect, - command: command + command: command, + disconnect: disconnect }); function connect() { @@ -20,6 +21,12 @@ module.exports = params => { return connection.create().then(() => _auth(connection)); } + function disconnect() { + return _connection.destroy().then(() => { + _connection = undefined; + }); + } + function _auth(connection) { let buf = packet.request({ id: 1, @@ -64,6 +71,10 @@ module.exports = params => { function command(text, timeout) { return Promise.race([ new Promise((resolve, reject) => { + if (!_connection) { + reject(new Error('not connected')); + } + let unexpectedPackets; let responseData = new Buffer(0); @@ -144,4 +155,3 @@ module.exports = params => { ]); } }; - diff --git a/lib/connection.js b/lib/connection.js index ec681d4..02dc351 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -8,15 +8,22 @@ module.exports = address => { return Object.freeze({ create: create, send: send, - getData: getData + getData: getData, + destroy: destroy }); function create() { return _createConnection().then(newConnection => { connection = newConnection; + + connection.on('close', _disconnectHandler); }); } + function destroy() { + return _destroyConnection(); + } + function _createConnection() { return new Promise((resolve, reject) => { let host = address.split(':')[0]; @@ -38,6 +45,23 @@ module.exports = address => { }); } + function _destroyConnection() { + return new Promise((resolve, reject) => { + if (connection) { + connection.end(); + + connection.on('close', resolve); + } + else { + resolve(); + } + }); + } + + function _disconnectHandler() { + connection = undefined; + } + function getData(cbSync) { return new Promise((resolve, reject) => { connection.on('error', errorHandler); @@ -66,4 +90,3 @@ module.exports = address => { connection.write(buffer); } }; -