diff --git a/docs/API.rst b/docs/API.rst index 5194adb2..0c18b087 100644 --- a/docs/API.rst +++ b/docs/API.rst @@ -18,6 +18,7 @@ Client { userName: 'nodebot', realName: 'nodeJS IRC client', + socket: false, port: 6667, localAddress: null, debug: false, @@ -44,6 +45,8 @@ Client If you set `selfSigned` to true SSL accepts certificates from a non trusted CA. If you set `certExpired` to true, the bot connects even if the ssl cert has expired. + Set `socket` to true to interpret `server` as a path to a UNIX domain socket. + `localAddress` is the address to bind to when connecting. `floodProtection` queues all your messages and slowly unpacks it to make sure diff --git a/lib/irc.js b/lib/irc.js index 23ccfe08..d205657b 100644 --- a/lib/irc.js +++ b/lib/irc.js @@ -38,6 +38,7 @@ function Client(server, nick, opt) { password: null, userName: 'nodebot', realName: 'nodeJS IRC client', + socket: false, port: 6667, localAddress: null, debug: false, @@ -396,6 +397,8 @@ function Client(server, nick, opt) { channel = self.chanData(message.args[1]); if (channel) { channel.topic = message.args[2]; + // channel, topic, nick + self.emit('topic', message.args[1], channel.topic, null, message) } break; case 'rpl_away': @@ -745,10 +748,13 @@ Client.prototype.connect = function(retryCount, callback) { self.chans = {}; // socket opts - var connectionOpts = { - host: self.opt.server, - port: self.opt.port - }; + var connectionOpts = {}; + if (self.opt.socket === true) { + connectionOpts.path = self.opt.server; + } else { + connectionOpts.host = self.opt.server; + connectionOpts.port = self.opt.port; + } // local address to bind to if (self.opt.localAddress) diff --git a/test/helpers.js b/test/helpers.js index 6051da68..43ded199 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -3,6 +3,7 @@ var path = require('path'); var fs = require('fs'); var net = require('net'); +var os = require('os'); var tls = require('tls'); var util = require('util'); var EventEmitter = require('events').EventEmitter; @@ -59,6 +60,17 @@ MockIrcd.prototype.getIncomingMsgs = function() { return this.incoming; }; +module.exports.getTempSocket = function() { + var tempDir = os.tmpdir(); + var sockPath = path.join(tempDir, 'mock_ircd.sock'); + try { + fs.unlinkSync(sockPath); + } catch (e) { + // ignore + } + return sockPath; +} + var fixtures = require('./data/fixtures'); module.exports.getFixtures = function(testSuite) { return fixtures[testSuite]; diff --git a/test/test-socket.js b/test/test-socket.js new file mode 100644 index 00000000..e6d1b881 --- /dev/null +++ b/test/test-socket.js @@ -0,0 +1,34 @@ +var irc = require('../lib/irc'); +var test = require('tape'); + +var testHelpers = require('./helpers'); + +test('connect and quit socket with message', function(t) { + var tempSock = testHelpers.getTempSocket(); + var mock = testHelpers.MockIrcd(tempSock); + var client = new irc.Client(tempSock, 'testbot', {socket: true, debug: true}); + + expected = testHelpers.getFixtures('quit'); + + t.plan(expected.sent.length + expected.received.length + 1); + + mock.server.on('connection', function() { + mock.send(':localhost 001 testbot :Welcome to the Internet Relay Chat Network testbot\r\n'); + }); + + client.on('registered', function() { + t.equal(mock.outgoing[0], expected.received[0][0], expected.received[0][1]); + client.disconnect('quitting as a test', function() {}); + }); + + mock.on('end', function() { + var msgs = mock.getIncomingMsgs(); + + t.equal(msgs.length, expected.sent.length, 'Server received the correct amount of messages.') + + for (var i = 0; i < msgs.length; i++) { + t.equal(msgs[i], expected.sent[i][0], expected.sent[i][1]); + } + mock.close(); + }); +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..83966081 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,351 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-color@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +colors@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +commander@~2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.5.1.tgz#23c61f6e47be143cc02e7ad4bb1c47f5cd5a2883" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +deep-equal@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + +deep-equal@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" + +defined@0.0.0, defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +esprima-harmony-jscs@1.1.0-dev-harmony: + version "1.1.0-dev-harmony" + resolved "https://registry.yarnpkg.com/esprima-harmony-jscs/-/esprima-harmony-jscs-1.1.0-dev-harmony.tgz#10041935337145f09965c34acf65b09f9eee49e4" + +esprima@~1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" + +estraverse@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.8.0.tgz#3f1264fb62c8500dbae5e4f73705cd576d6af428" + +exit@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +faucet@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/faucet/-/faucet-0.0.1.tgz#597dcf1d2189a2c062321b591e8f151ed2039d9c" + dependencies: + defined "0.0.0" + duplexer "~0.1.1" + minimist "0.0.5" + sprintf "~0.1.3" + tap-parser "~0.4.0" + tape "~2.3.2" + through2 "~0.2.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@~4.0.0: + version "4.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.0.6.tgz#695c50bdd4e2fb5c5d370b091f388d3707e291a7" + dependencies: + graceful-fs "^3.0.2" + inherits "2" + minimatch "^1.0.0" + once "^1.3.0" + +graceful-fs@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +iconv@~2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/iconv/-/iconv-2.2.3.tgz#e084d60eeb7d73da7f0a9c096e4c8abe090bfaed" + dependencies: + nan "^2.3.5" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +irc-colors@^1.1.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/irc-colors/-/irc-colors-1.3.3.tgz#16f8fa6130a3882fdf4fab801c5b4f58328a3391" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +jscs@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/jscs/-/jscs-1.9.0.tgz#3394a1dbbfc20138992d90f1118f48283bd9e79f" + dependencies: + colors "~1.0.3" + commander "~2.5.0" + esprima "~1.2.2" + esprima-harmony-jscs "1.1.0-dev-harmony" + estraverse "~1.8.0" + exit "~0.1.2" + glob "~4.0.0" + minimatch "~1.0.0" + regenerate "~1.0.1" + strip-json-comments "~1.0.1" + supports-color "~1.2.0" + unicode-6.3.0 "~0.1.5" + vow "~0.4.3" + vow-fs "~0.3.1" + xmlbuilder "~2.4.0" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +lodash-node@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash-node/-/lodash-node-2.4.1.tgz#ea82f7b100c733d1a42af76801e506105e2a80ec" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^1.0.0, minimatch@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" + +nan@^2.3.3, nan@^2.3.5: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +node-icu-charset-detector@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-icu-charset-detector/-/node-icu-charset-detector-0.2.0.tgz#c2320da374ddcb671fc54cb4a0e041e156ffd639" + dependencies: + nan "^2.3.3" + +object-inspect@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +readable-stream@~1.1.11, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +regenerate@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.0.1.tgz#3905476f2a28044ebe70c47e0a4d11d9d17b7424" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + dependencies: + through "~2.3.4" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +sprintf@~0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +strip-json-comments@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.1.tgz#12ee21507086cd98c1058d9ec0f4ac476b7af3b2" + +tap-parser@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.4.3.tgz#a4eae190c10d76c7a111921ff38bbe4d58f09eea" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.11" + +tape@^3.0.3: + version "3.6.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-3.6.1.tgz#4893dd53e280a5f58c0ceb30c2c0ebb3bcd51e1f" + dependencies: + deep-equal "~0.2.0" + defined "~0.0.0" + glob "~3.2.9" + inherits "~2.0.1" + object-inspect "~0.4.0" + resumer "~0.0.0" + through "~2.3.4" + +tape@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.3.tgz#2e7ce0a31df09f8d6851664a71842e0ca5057af7" + dependencies: + deep-equal "~0.1.0" + defined "~0.0.0" + inherits "~2.0.1" + jsonify "~0.0.0" + resumer "~0.0.0" + through "~2.3.4" + +through2@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + dependencies: + readable-stream "~1.1.9" + xtend "~2.1.1" + +through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +unicode-6.3.0@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/unicode-6.3.0/-/unicode-6.3.0-0.1.6.tgz#b36f0061cfc08151a9453b0e0be31c4d3d0ba3bf" + +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +vow-fs@~0.3.1: + version "0.3.6" + resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.6.tgz#2d4c59be22e2bf2618ddf597ab4baa923be7200d" + dependencies: + glob "^7.0.5" + uuid "^2.0.2" + vow "^0.4.7" + vow-queue "^0.4.1" + +vow-queue@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.4.2.tgz#e7fe17160e15c7c4184d1b666a9bc64e18e30184" + dependencies: + vow "~0.4.0" + +vow@^0.4.7, vow@~0.4.0, vow@~0.4.3: + version "0.4.15" + resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.15.tgz#0579163aff6ba0ae05c456b2c0e4ca6373f111b3" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +xmlbuilder@~2.4.0: + version "2.4.6" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-2.4.6.tgz#42c664f1358864e5beb1461b4346aec87b63450f" + dependencies: + lodash-node "~2.4.1" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0"