diff --git a/.eslintrc b/.eslintrc index d4caebff8..dfca9481a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -51,7 +51,8 @@ "yoda": [2, "never"] }, "env": { - "node": true + "node": true, + "mocha": true }, "extends": "eslint:recommended" } diff --git a/.travis.yml b/.travis.yml index 1537331c7..277d85755 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,22 +2,22 @@ sudo: false language: node_js node_js: - '4.2.6' -env: -- CXX=g++-4.8 addons: apt: sources: - - ubuntu-toolchain-r-test + - ubuntu-toolchain-r-test packages: - - g++-4.8 + - gcc-4.9 + - g++-4.9 script: -- grunt && npm test && cat ./coverage/lcov.info | ./node_modules/.bin/codecov -before_install: npm install -g grunt-cli -install: npm install - + - grunt && npm test && cat ./coverage/lcov.info | ./node_modules/.bin/codecov +before_install: + - export CC="gcc-4.9" CXX="g++-4.9" + - npm install -g grunt-cli +install: + - npm install after_success: - chmod 755 ${TRAVIS_BUILD_DIR}/deploy.sh && sh -c "${TRAVIS_BUILD_DIR}/deploy.sh" - env: global: secure: EZ+XXJFDtehmag7wt8JbutqgzpkkJUCzkEWw6W+p7MIxWenLyuGv/RUu7KGqAloOud1cZbmZGSfRx/vsPvxRjo+ZC7aaPqb74qRvfctGdlJTtEffS2jFno1pEppJzCR4n7vocSfMVYtOD6oHP67lXwn/Qnh++WUkZaV137m5+7rqiYgJ+JTeSs5jBRZ6X7VNoNz8tZXejQ+FOymCFQTS2JM/rSZX9NEK+OwUEhEjRcxqWMm2avk6NAQNAL3WQuIBJQH8lxEJxOXkMc0rQZZ09AoLpqJKzsaicaZMInt5JstPo2e9vJfhi+PpRSNhErIff36aCHWRYYDPKl5x6IelZpBfZeTdrs4V2TbRi1y0ELbgMG1FHS4HAw3vTnh4/49g01lAJed4UguFRc6MzwTLAL8uPG/zFe8snm9+kaf4pL7yO89Hf3eltE03+N//tyVv+X/jdSca2dBZ9FMeLE5pJ2jlRiKitCLjXmLUEMMxEwNF7K/IvOrD9wue3JXK0UogOpcXfppk++pNTijsZluU1Yj7k3fGFeS8d6rIU0Yj40y6/VMaJeL4EXlARRsGLigUKVjQL6+/N5xudlsCng+EG+WVIy4wEEPH0QgjUkPTgWx1NrUlTwjskE0cdqDOBu39WkRFJHHECYFPTfTuDJ7xxuuibFTQmUFu2zjbYfYKhPE= diff --git a/Gruntfile.js b/Gruntfile.js index d28ad750b..b0a063e8f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -16,7 +16,7 @@ module.exports = function(grunt) { src: ['src/kuzzle.js'], dest: 'dist/kuzzle.js', options: { - exclude: ['socket.io-client'], + exclude: ['socket.io-client', 'ws', './src/networkWrapper/wrappers/wsnode.js'], browserifyOptions: { noParse: [require.resolve('node-uuid')] } diff --git a/README.md b/README.md index 4bcd28508..ef365b35f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ [![Build Status](https://travis-ci.org/kuzzleio/sdk-javascript.svg?branch=master)](https://travis-ci.org/kuzzleio/sdk-javascript) [![codecov.io](http://codecov.io/github/kuzzleio/sdk-javascript/coverage.svg?branch=master)](http://codecov.io/github/kuzzleio/sdk-javascript?branch=master) [![Dependency Status](https://david-dm.org/kuzzleio/sdk-javascript.svg)](https://david-dm.org/kuzzleio/sdk-javascript) -Official Kuzzle Javascript SDK +Official Kuzzle Javascript SDK ====== -This SDK version is compatible with Kuzzle 1.0.0-beta.1 and higher +This SDK version is compatible with Kuzzle 1.0.0-RC5 and higher + +Please use SDK v1.x for earlier versions of Kuzzle. ## About Kuzzle @@ -13,18 +15,38 @@ For UI and linked objects developers, Kuzzle is an open-source solution that han You can access the Kuzzle repository on [Github](https://github.com/kuzzleio/kuzzle) * [SDK Documentation](#sdk-documentation) +* [Protocols used](#protocols-used) * [Installation](#installation) * [NodeJS](#nodejs) * [Basic usage](#basic-usage-node) * [Javascript](#javascript) * [Basic usage](#basic-usage-js) * [Building manually](#building-manually) +* [Migrating from SDK v1.x](#migrating-from-sdk-v1.x) * [License](#license) ## SDK Documentation The complete SDK documentation is available [here](http://kuzzleio.github.io/sdk-documentation) +## Protocols used + +The SDK Javascript implements two network protocols: raw WebSocket, and [Socket.IO](http://socket.io/) +The main reason behind this is that while Socket.IO offers better compatibility with older web browsers, our raw WebSocket implementation is about 20% faster + +For this reason, there is a slight difference with the [generic SDK documentation](http://kuzzleio.github.io/sdk-documentation): instead of 1 available `port` option, there are actually a `wsPort` and a `ioPort` options. +These options are defaulted to Kuzzle default protocol plugins. + +What protocol is used when you connect to Kuzzle depends on multiple factors: + +#### NodeJS + +The protocol used is always raw WebSocket. + +#### Web Browsers + +The SDK will first try to use raw WebSocket to connect to Kuzzle. If the web browser does not support this protocol, then the SDK falls back to Socket.IO + ## Installation This SDK can be used either in NodeJS or in a browser. @@ -40,7 +62,7 @@ npm install kuzzle-sdk --save ```javascript var Kuzzle = require('kuzzle-sdk'), - kuzzle = new Kuzzle('http://foobar:7512'); + kuzzle = new Kuzzle('serverName'); var myDoc = { name: 'Rick Astley', @@ -93,7 +115,7 @@ bower install kuzzle-sdk --save ```javascript var - kuzzle = new Kuzzle('http://foobar:7512'); + kuzzle = new Kuzzle('serverName'); var myDoc = { name: 'Rick Astley', @@ -119,6 +141,10 @@ kuzzle Clone this github repository and run ``grunt``. A ``dist`` directory will be created, containing a plain browserified version of this SDK, and a minified version. +## Migrating from SDK v1.x + +* Kuzzle constructor has been changed. Instead of an URL, you have to provide a resolvable server name, or an IP address. If you need to specify a port different than the provided default values, you can do so using these two new options: `wsPort` (WebSocket port) and `ioPort` (Socket.IO port) + ## License [Apache 2](LICENSE.md) diff --git a/dist/kuzzle.js b/dist/kuzzle.js index c039d167e..93d95fdcf 100644 --- a/dist/kuzzle.js +++ b/dist/kuzzle.js @@ -1,4 +1,125 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + cachedSetTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],2:[function(require,module,exports){ // uuid.js // // Copyright (c) 2010-2012 Robert Kieffer @@ -272,127 +393,6 @@ } })('undefined' !== typeof window ? window : null); -},{}],2:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -(function () { - try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); - } - } - try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); - } - } -} ()) -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = cachedSetTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - cachedClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - cachedSetTimeout(drainQueue, 0); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - },{}],3:[function(require,module,exports){ (function (process){ var @@ -400,30 +400,31 @@ var KuzzleDataCollection = require('./kuzzleDataCollection'), KuzzleSecurity = require('./security/kuzzleSecurity'), KuzzleMemoryStorage = require('./kuzzleMemoryStorage'), - KuzzleUser = require('./security/kuzzleUser'); + KuzzleUser = require('./security/kuzzleUser'), + networkWrapper = require('./networkWrapper'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ /** * Kuzzle object constructor. - * @param url - URL to the Kuzzle instance - * @param index - Database index + * + * @constructor + * @param address - Server name or IP Address to the Kuzzle instance * @param [options] - Connection options * @param {responseCallback} [cb] - Handles connection response * @constructor */ - -module.exports = Kuzzle = function (url, options, cb) { +module.exports = Kuzzle = function (address, options, cb) { var self = this; if (!(this instanceof Kuzzle)) { - return new Kuzzle(url, options, cb); + return new Kuzzle(address, options, cb); } if (!cb && typeof options === 'function') { @@ -431,8 +432,8 @@ module.exports = Kuzzle = function (url, options, cb) { options = null; } - if (!url || url === '') { - throw new Error('URL argument missing'); + if (!address || address === '') { + throw new Error('address argument missing'); } Object.defineProperties(this, { @@ -459,10 +460,6 @@ module.exports = Kuzzle = function (url, options, cb) { eventTimeout: { value: 200 }, - io: { - value: null, - writable: true - }, queuing: { value: false, writable: true @@ -471,10 +468,6 @@ module.exports = Kuzzle = function (url, options, cb) { value: {}, writable: true }, - socket: { - value: null, - writable: true - }, state: { value: 'initializing', writable: true @@ -511,8 +504,16 @@ module.exports = Kuzzle = function (url, options, cb) { value: (options && typeof options.reconnectionDelay === 'number') ? options.reconnectionDelay : 1000, enumerable: true }, - url: { - value: url, + address: { + value: address, + enumerable: true + }, + wsPort: { + value: (options && typeof options.wsPort === 'number') ? options.wsPort : 7513, + enumerable: true + }, + ioPort: { + value: (options && typeof options.ioPort === 'number') ? options.ioPort : 7512, enumerable: true }, autoQueue: { @@ -587,12 +588,6 @@ module.exports = Kuzzle = function (url, options, cb) { } }); - if (typeof window !== 'undefined' && window.io) { - this.io = window.io; - } else { - this.io = require('socket.io-client'); - } - if (options) { Object.keys(options).forEach(function (opt) { if (self.hasOwnProperty(opt) && Object.getOwnPropertyDescriptor(self, opt).writable) { @@ -687,6 +682,8 @@ module.exports = Kuzzle = function (url, options, cb) { this.state = 'ready'; } + cleanHistory(this.requestHistory); + if (this.bluebird) { return this.bluebird.promisifyAll(this, { suffix: 'Promise', @@ -699,17 +696,19 @@ module.exports = Kuzzle = function (url, options, cb) { } }); } - }; - /** - * Connects to a Kuzzle instance using the provided URL. + * Connects to a Kuzzle instance using the provided address. * @returns {Object} this */ Kuzzle.prototype.connect = function () { var self = this; + if (!self.network) { + self.network = networkWrapper(self.address, self.wsPort, self.ioPort); + } + if (['initializing', 'ready', 'disconnected', 'error', 'offline'].indexOf(this.state) === -1) { if (self.connectCB) { self.connectCB(null, self); @@ -718,14 +717,9 @@ Kuzzle.prototype.connect = function () { } self.state = 'connecting'; + self.network.connect(self.autoReconnect, self.reconnectionDelay); - self.socket = self.io(self.url, { - reconnection: self.autoReconnect, - reconnectionDelay: self.reconnectionDelay, - forceNew: true - }); - - self.socket.once('connect', function () { + self.network.onConnect(function () { self.state = 'connected'; renewAllSubscriptions.call(self); dequeue.call(self); @@ -736,8 +730,8 @@ Kuzzle.prototype.connect = function () { } }); - self.socket.on('connect_error', function (error) { - var connectionError = new Error('Unable to connect to kuzzle server at "' + self.url + '"'); + self.network.onConnectError(function (error) { + var connectionError = new Error('Unable to connect to kuzzle server at "' + self.address + '"'); connectionError.internal = error; self.state = 'error'; @@ -748,7 +742,7 @@ Kuzzle.prototype.connect = function () { } }); - self.socket.on('disconnect', function () { + self.network.onDisconnect(function () { self.state = 'offline'; if (!self.autoReconnect) { @@ -762,7 +756,7 @@ Kuzzle.prototype.connect = function () { self.emitEvent('disconnected'); }); - self.socket.on('reconnect', function () { + self.network.onReconnect(function () { var reconnect = function () { // renew subscriptions if (self.autoResubscribe) { @@ -1080,6 +1074,25 @@ function cleanQueue () { } } + +/** + * Clean history from requests made more than 10s ago + */ +function cleanHistory (requestHistory) { + var + now = Date.now(); + + Object.keys(requestHistory).forEach(function (key) { + if (requestHistory[key] < now - 10000) { + delete requestHistory[key]; + } + }); + + setTimeout(function () { + cleanHistory(requestHistory); + }, 1000); +} + /** * Emit a request to Kuzzle * @@ -1088,11 +1101,10 @@ function cleanQueue () { */ function emitRequest (request, cb) { var - now = Date.now(), self = this; if (self.jwtToken !== undefined || cb) { - self.socket.once(request.requestId, function (response) { + self.network.once(request.requestId, function (response) { if (request.action !== 'logout' && response.error && response.error.message === 'Token expired') { self.jwtToken = undefined; self.emitEvent('jwtTokenExpired', request, cb); @@ -1104,17 +1116,10 @@ function emitRequest (request, cb) { }); } - self.socket.emit('kuzzle', request); + this.network.send(request); // Track requests made to allow KuzzleRoom.subscribeToSelf to work - self.requestHistory[request.requestId] = now; - - // Clean history from requests made more than 10s ago - Object.keys(self.requestHistory).forEach(function (key) { - if (self.requestHistory[key] < now - 10000) { - delete self.requestHistory[key]; - } - }); + self.requestHistory[request.requestId] = Date.now(); } /** @@ -1204,7 +1209,7 @@ Kuzzle.prototype.addListener = function(event, listener) { throw new Error('Invalid listener type: expected a function, got a ' + listenerType); } - listenerId = uuid.v1(); + listenerId = uuid.v4(); this.eventListeners[event].listeners.push({id: listenerId, fn: listener}); return listenerId; }; @@ -1427,8 +1432,7 @@ Kuzzle.prototype.disconnect = function () { this.logout(); this.state = 'disconnected'; - this.socket.close(); - this.socket = null; + this.network.close(); for (collection in this.collections) { if (this.collections.hasOwnProperty(collection)) { @@ -1839,8 +1843,10 @@ Kuzzle.prototype.stopQueuing = function () { return this; }; + + }).call(this,require('_process')) -},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,"_process":2,"node-uuid":1,"socket.io-client":undefined}],4:[function(require,module,exports){ +},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./networkWrapper":9,"./security/kuzzleSecurity":14,"./security/kuzzleUser":16,"_process":1,"node-uuid":2}],4:[function(require,module,exports){ var KuzzleDocument = require('./kuzzleDocument'), KuzzleDataMapping = require('./kuzzleDataMapping'), @@ -3406,7 +3412,7 @@ KuzzleRoom.prototype.renew = function (filters, cb) { self.kuzzle.subscriptions[self.roomId][self.id] = self; self.notifier = notificationCallback.bind(self); - self.kuzzle.socket.on(self.channel, self.notifier); + self.kuzzle.network.on(self.channel, self.notifier); dequeue.call(self); }); @@ -3435,7 +3441,7 @@ KuzzleRoom.prototype.unsubscribe = function () { } if (room) { - self.kuzzle.socket.off(self.channel, this.notifier); + self.kuzzle.network.off(self.channel, this.notifier); if (Object.keys(self.kuzzle.subscriptions[room]).length === 1) { delete self.kuzzle.subscriptions[room]; @@ -3477,7 +3483,7 @@ KuzzleRoom.prototype.setHeaders = function (content, replace) { }; /** - * Callback called by socket.io when a message is sent to the subscribed room ID + * Callback called by the network handler when a message is sent to the subscribed room ID * Calls the registered callback if the notification passes the subscription filters * * @param {object} data - data @@ -3526,7 +3532,380 @@ function isReady() { module.exports = KuzzleRoom; -},{"node-uuid":1}],9:[function(require,module,exports){ +},{"node-uuid":2}],9:[function(require,module,exports){ +/** + * + * @param address + * @param wsPort + * @param ioPort + * @returns {Object} tnstantiated WebSocket/Socket.IO object + */ + +function network(address, wsPort, ioPort) { + // Web browser / NodeJS websocket handling + if (typeof window !== 'undefined') { + // use native websockets if the browser supports it + if (typeof WebSocket !== 'undefined') { + return new (require('./wrappers/wsbrowsers'))(address, wsPort); + } + // otherwise fallback to socket.io, if available + else if (window.io) { + return new (require('./wrappers/socketio'))(address, ioPort); + } + + throw new Error('Aborting: no websocket support detected and no socket.io library loaded either.'); + } + + return new (require('./wrappers/wsnode'))(address, wsPort); +} + +module.exports = network; + +},{"./wrappers/socketio":10,"./wrappers/wsbrowsers":11,"./wrappers/wsnode":undefined}],10:[function(require,module,exports){ +function SocketIO(address, port) { + this.address = address; + this.port = port; + this.socket = null; + + /** + * Creates a new socket from the provided arguments + * + * @constructor + * @param {boolean} autoReconnect + * @param {int} reconnectionDelay + */ + this.connect = function (autoReconnect, reconnectionDelay) { + this.socket = window.io('http://' + this.address + ':' + this.port, { + reconnection: autoReconnect, + reconnectionDelay: reconnectionDelay, + forceNew: true + }); + }; + + /** + * Fires the provided callback whence a connection is established + * + * @param {function} callback + */ + this.onConnect = function (callback) { + this.socket.on('connect', callback); + }; + + /** + * Fires the provided callback whenever a connection error is received + * @param {function} callback + */ + this.onConnectError = function (callback) { + this.socket.on('connect_error', callback); + }; + + /** + * Fires the provided callback whenever a disconnection occurred + * @param {function} callback + */ + this.onDisconnect = function (callback) { + this.socket.on('disconnect', callback); + }; + + /** + * Fires the provided callback whenever a connection has been reestablished + * @param {function} callback + */ + this.onReconnect = function (callback) { + this.socket.on('reconnect', callback); + }; + + /** + * Registers a callback on a room. Once 1 message is received, fires the + * callback and unregister it afterward. + * + * @param {string} roomId + * @param {function} callback + */ + this.once = function (roomId, callback) { + this.socket.once(roomId, callback); + }; + + /** + * Registers a callback on a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.on = function (roomId, callback) { + this.socket.on(roomId, callback); + }; + + /** + * Unregisters a callback from a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.off = function (roomId, callback) { + this.socket.off(roomId, callback); + }; + + + /** + * Sends a payload to the connected server + * + * @param {Object} payload + */ + this.send = function (payload) { + this.socket.emit('kuzzle', payload); + }; + + /** + * Closes the connection + */ + this.close = function () { + this.socket.close(); + this.socket = null; + }; +} + +module.exports = SocketIO; + +},{}],11:[function(require,module,exports){ +function WSBrowsers(address, port) { + var self = this; + this.address = address; + this.port = port; + this.client = null; + this.retrying = false; + + /* + Listeners are stored using the following format: + roomId: { + fn: callback_function, + once: boolean + } + */ + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + /** + * Creates a new socket from the provided arguments + * + * @constructor + * @param {boolean} autoReconnect + * @param {int} reconnectionDelay + * @returns {Object} Socket + */ + this.connect = function (autoReconnect, reconnectionDelay) { + this.client = new WebSocket('ws://' + this.address + ':' + this.port); + + this.client.onopen = function () { + if (self.retrying) { + poke(self.listeners, 'reconnect'); + } + else { + poke(self.listeners, 'connect'); + } + }; + + this.client.onclose = function () { + poke(self.listeners, 'disconnect'); + }; + + this.client.onerror = function () { + if (autoReconnect) { + self.retrying = true; + setTimeout(function () { + self.connect(autoReconnect, reconnectionDelay); + }, reconnectionDelay); + } + + poke(self.listeners, 'error'); + }; + + this.client.onmessage = function (payload) { + var data = JSON.parse(payload.data); + + if (data.room && self.listeners[data.room]) { + poke(self.listeners, data.room, data); + } + }; + }; + + /** + * Fires the provided callback whence a connection is established + * + * @param {function} callback + */ + this.onConnect = function (callback) { + this.listeners.connect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection error is received + * @param {function} callback + */ + this.onConnectError = function (callback) { + this.listeners.error.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a disconnection occurred + * @param {function} callback + */ + this.onDisconnect = function (callback) { + this.listeners.disconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection has been reestablished + * @param {function} callback + */ + this.onReconnect = function (callback) { + this.listeners.reconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Registers a callback on a room. Once 1 message is received, fires the + * callback and unregister it afterward. + * + * @param {string} roomId + * @param {function} callback + */ + this.once = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: false + }); + }; + + /** + * Registers a callback on a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.on = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: true + }); + }; + + /** + * Unregisters a callback from a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.off = function (roomId, callback) { + var index; + + if (this.listeners[roomId]) { + index = this.listeners[roomId].findIndex(function (listener) { + return listener.fn === callback; + }); + + if (index !== -1) { + if (this.listeners[roomId].length === 1) { + delete this.listeners[roomId]; + } + else { + this.listeners[roomId].splice(index, 1); + } + } + } + }; + + + /** + * Sends a payload to the connected server + * + * @param {Object} payload + */ + this.send = function (payload) { + if (this.client && this.client.readyState === this.client.OPEN) { + this.client.send(JSON.stringify(payload)); + } + }; + + /** + * Closes the connection + */ + this.close = function () { + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + this.retrying = false; + this.client.close(); + this.client = null; + }; +} + +/** + * Executes all registered listeners in the provided + * "listeners" structure. + * + * Listeners are of the following format: + * [ + * { fn: callback, once: boolean }, + * ... + * ] + * + * @private + * @param {Object} listeners + * @param {string} roomId + * @param {Object} [payload] + */ +function poke (listeners, roomId, payload) { + var + i, + length = listeners[roomId].length; + + for (i = 0; i < length; ++i) { + listeners[roomId][i].fn(payload); + + if (!listeners[roomId][i].keep) { + if (listeners[roomId].length > 1) { + listeners[roomId].splice(i, 1); + --i; + --length; + } + else { + delete listeners[roomId]; + } + } + } +} + +module.exports = WSBrowsers; + +},{}],12:[function(require,module,exports){ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); @@ -3676,7 +4055,7 @@ KuzzleProfile.prototype.getPolicies = function () { module.exports = KuzzleProfile; -},{"./kuzzleSecurityDocument":12}],10:[function(require,module,exports){ +},{"./kuzzleSecurityDocument":15}],13:[function(require,module,exports){ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); function KuzzleRole(kuzzleSecurity, id, content) { @@ -3746,7 +4125,7 @@ KuzzleRole.prototype.save = function (options, cb) { }; module.exports = KuzzleRole; -},{"./kuzzleSecurityDocument":12}],11:[function(require,module,exports){ +},{"./kuzzleSecurityDocument":15}],14:[function(require,module,exports){ var KuzzleRole = require('./kuzzleRole'), KuzzleProfile = require('./kuzzleProfile'), @@ -4511,7 +4890,7 @@ KuzzleSecurity.prototype.getUserRights = function (userId, options, cb) { module.exports = KuzzleSecurity; -},{"./kuzzleProfile":9,"./kuzzleRole":10,"./kuzzleUser":13}],12:[function(require,module,exports){ +},{"./kuzzleProfile":12,"./kuzzleRole":13,"./kuzzleUser":16}],15:[function(require,module,exports){ function KuzzleSecurityDocument(kuzzleSecurity, id, content) { if (!id) { @@ -4651,7 +5030,7 @@ KuzzleSecurityDocument.prototype.update = function (content, options, cb) { }; module.exports = KuzzleSecurityDocument; -},{}],13:[function(require,module,exports){ +},{}],16:[function(require,module,exports){ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); @@ -4790,4 +5169,4 @@ KuzzleUser.prototype.getProfiles = function () { module.exports = KuzzleUser; -},{"./kuzzleSecurityDocument":12}]},{},[3]); +},{"./kuzzleSecurityDocument":15}]},{},[3]); diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 063102991..60e29481c 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ -// Official Javascript SDK for Kuzzle v1.9.3 - License: Apache-2.0 -!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>>((3&b)<<3)&255;return e},"undefined"!=typeof console&&console.warn&&console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()")}}function e(){if("function"==typeof a)try{var b=a("crypto").randomBytes;l=j=b&&function(){return b(16)},j()}catch(c){}}function f(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=q[a])});e<16;)b[d+e++]=0;return b}function g(a,b){var c=b||0,d=p;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function h(a,b,c){var d=b&&c||0,e=b||[];a=a||{};var f=null!=a.clockseq?a.clockseq:u,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:w+1,j=h-v+(i-w)/1e4;if(j<0&&null==a.clockseq&&(f=f+1&16383),(j<0||h>v)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=h,w=i,u=f,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;e[d++]=k>>>24&255,e[d++]=k>>>16&255,e[d++]=k>>>8&255,e[d++]=255&k;var l=h/4294967296*1e4&268435455;e[d++]=l>>>8&255,e[d++]=255&l,e[d++]=l>>>24&15|16,e[d++]=l>>>16&255,e[d++]=f>>>8|128,e[d++]=255&f;for(var m=a.node||t,n=0;n<6;n++)e[d+n]=m[n];return b?b:g(e)}function i(a,b,c){var d=b&&c||0;"string"==typeof a&&(b="binary"===a?new o(16):null,a=null),a=a||{};var e=a.random||(a.rng||j)();if(e[6]=15&e[6]|64,e[8]=63&e[8]|128,b)for(var f=0;f<16;f++)b[d+f]=e[f];return b||g(e)}var j,k,l,m,n;c?d():e();for(var o="function"==typeof Buffer?Buffer:Array,p=[],q={},r=0;r<256;r++)p[r]=(r+256).toString(16).substr(1),q[p[r]]=r;var s=j(),t=[1|s[0],s[1],s[2],s[3],s[4],s[5]],u=16383&(s[6]<<8|s[7]),v=0,w=0,x=i;x.v1=h,x.v4=i,x.parse=f,x.unparse=g,x.BufferClass=o,x._rng=j,x._mathRNG=k,x._nodeRNG=l,x._whatwgRNG=m,"undefined"!=typeof b&&b.exports?b.exports=x:"function"==typeof define&&define.amd?define(function(){return x}):(n=c.uuid,x.noConflict=function(){return c.uuid=n,x},c.uuid=x)}("undefined"!=typeof window?window:null)},{}],2:[function(a,b,c){function d(){m&&k&&(m=!1,k.length?l=k.concat(l):n=-1,l.length&&e())}function e(){if(!m){var a=h(d);m=!0;for(var b=l.length;b;){for(k=l,l=[];++n1)for(var c=1;c0&&(a.offlineQueue.forEach(function(d,e){d.ts0&&a.offlineQueue.length>a.queueMaxSize&&a.offlineQueue.splice(0,a.offlineQueue.length-a.queueMaxSize).forEach(function(b){a.emitEvent("offlineQueuePop",b.query)})}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){"logout"!==a.action&&c.error&&"Token expired"===c.error.message&&(d.jwtToken=void 0,d.emitEvent("jwtTokenExpired",a,b)),b&&b(c.error,c)}),d.socket.emit("kuzzle",a),d.requestHistory[a.requestId]=c,Object.keys(d.requestHistory).forEach(function(a){d.requestHistory[a]0?(e.call(b,b.offlineQueue[0].query,b.offlineQueue[0].cb),b.emitEvent("offlineQueuePop",b.offlineQueue.shift()),setTimeout(function(){d()},Math.max(0,b.replayInterval))):b.queuing=!1};if(b.offlineQueueLoader){if("function"!=typeof b.offlineQueueLoader)throw new Error("Invalid value for offlineQueueLoader property. Expected: function. Got: "+typeof b.offlineQueueLoader);if(a=b.offlineQueueLoader(),!Array.isArray(a))throw new Error("Invalid value returned by the offlineQueueLoader function. Expected: array. Got: "+typeof a);b.offlineQueue=a.concat(b.offlineQueue).filter(function(a){if(!a.query||void 0===a.query.requestId||!a.query.action||!a.query.controller)throw new Error("Invalid offline queue request. One or more missing properties: requestId, action, controller.");return!c.hasOwnProperty(a.query.requestId)&&(c[a.query.requestId]=!0)})}d()}function g(){var a=this;Object.keys(a.subscriptions).forEach(function(b){Object.keys(a.subscriptions[b]).forEach(function(c){var d=a.subscriptions[b][c];d.renew(d.callback)})})}var h=a("node-uuid"),i=a("./kuzzleDataCollection"),j=a("./security/kuzzleSecurity"),k=a("./kuzzleMemoryStorage"),l=a("./security/kuzzleUser");b.exports=Kuzzle=function(b,d,e){var f=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,d,e);if(e||"function"!=typeof d||(e=d,d=null),!b||""===b)throw new Error("URL argument missing");return Object.defineProperties(this,{collections:{value:{},writable:!0},connectCB:{value:e},eventListeners:{value:{connected:{lastEmitted:null,listeners:[]},error:{lastEmitted:null,listeners:[]},disconnected:{lastEmitted:null,listeners:[]},reconnected:{lastEmitted:null,listeners:[]},jwtTokenExpired:{lastEmitted:null,listeners:[]},loginAttempt:{lastEmitted:null,listeners:[]},offlineQueuePush:{listeners:[]},offlineQueuePop:{listeners:[]}}},eventTimeout:{value:200},io:{value:null,writable:!0},queuing:{value:!1,writable:!0},requestHistory:{value:{},writable:!0},socket:{value:null,writable:!0},state:{value:"initializing",writable:!0},subscriptions:{value:{pending:{}},writable:!0},autoReconnect:{value:!d||"boolean"!=typeof d.autoReconnect||d.autoReconnect,enumerable:!0},defaultIndex:{value:d&&"string"==typeof d.defaultIndex?d.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:d&&"number"==typeof d.reconnectionDelay?d.reconnectionDelay:1e3,enumerable:!0},url:{value:b,enumerable:!0},autoQueue:{value:!1,enumerable:!0,writable:!0},autoReplay:{value:!1,enumerable:!0,writable:!0},autoResubscribe:{value:!0,enumerable:!0,writable:!0},headers:{value:{},enumerable:!0,writable:!0},metadata:{value:{},enumerable:!0,writable:!0},offlineQueue:{value:[],enumerable:!0,writable:!0},queueFilter:{value:null,enumerable:!0,writable:!0},queueMaxSize:{value:500,enumerable:!0,writable:!0},queueTTL:{value:12e4,enumerable:!0,writable:!0},replayInterval:{value:10,enumerable:!0,writable:!0},jwtToken:{value:void 0,enumerable:!0,writable:!0},offlineQueueLoader:{value:null,enumerable:!0,writable:!0}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),d&&(Object.keys(d).forEach(function(a){f.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(f,a).writable&&(f[a]=d[a])}),"auto"===d.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===f.state)throw new Error("This Kuzzle object has been invalidated. Did you try to access it after a disconnect call?")}}),Object.defineProperty(this,"addHeaders",{value:function(a,b){return Object.keys(b).forEach(function(c){a[c]||(a[c]=b[c])}),a}}),Object.defineProperty(this,"callbackRequired",{value:function(a,b){if(!b||"function"!=typeof b)throw new Error(a+": a callback argument is required for read queries")}}),Object.defineProperty(this,"security",{value:new j(this),enumerable:!0}),Object.defineProperty(this,"emitEvent",{value:function(a){var b=Date.now(),d=Array.prototype.slice.call(arguments,1),e=this.eventListeners[a];return!(e.lastEmitted&&e.lastEmitted>=b-this.eventTimeout)&&(e.listeners.forEach(function(a){c.nextTick(function(){a.fn.apply(void 0,d)})}),void(void 0!==e.lastEmitted&&(e.lastEmitted=b)))}}),Object.defineProperty(this,"memoryStorage",{value:new k(this),enumerable:!0}),d&&d.connect&&"auto"!==d.connect?this.state="ready":this.connect(),this.bluebird?this.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["getAllStatistics","getServerInfo","getStatistics","listCollections","listIndexes","login","logout","now","query","checkToken","whoAmI"];return d&&e.indexOf(a)!==-1}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return["initializing","ready","disconnected","error","offline"].indexOf(this.state)===-1?(a.connectCB&&a.connectCB(null,a),a):(a.state="connecting",a.socket=a.io(a.url,{reconnection:a.autoReconnect,reconnectionDelay:a.reconnectionDelay,forceNew:!0}),a.socket.once("connect",function(){a.state="connected",g.call(a),f.call(a),a.emitEvent("connected"),a.connectCB&&a.connectCB(null,a)}),a.socket.on("connect_error",function(b){var c=new Error('Unable to connect to kuzzle server at "'+a.url+'"');c.internal=b,a.state="error",a.emitEvent("error",c),a.connectCB&&a.connectCB(c)}),a.socket.on("disconnect",function(){a.state="offline",a.autoReconnect||a.disconnect(),a.autoQueue&&(a.queuing=!0),a.emitEvent("disconnected")}),a.socket.on("reconnect",function(){var b=function(){a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")};a.state="connected",a.jwtToken?a.checkToken(a.jwtToken,function(c,d){!c&&d.valid||(a.jwtToken=void 0,a.emitEvent("jwtTokenExpired")),b()}):b()}),this)},Kuzzle.prototype.setJwtToken=function(a){if("string"==typeof a)this.jwtToken=a;else{if("object"!=typeof a)return this.emitEvent("loginAttempt",{success:!1,error:"Invalid token argument: "+a}),this;if(!a.result||!a.result.jwt||"string"!=typeof a.result.jwt)return this.emitEvent("loginAttempt",{success:!1,error:"Cannot find a valid JWT token in the following object: "+JSON.stringify(a)}),this;this.jwtToken=a.result.jwt}return g.call(this),this.emitEvent("loginAttempt",{success:!0}),this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a){var b,c,d=this,e={strategy:a};return arguments[1]&&("object"==typeof arguments[1]?b=arguments[1]:"number"==typeof arguments[1]||"string"==typeof arguments[1]?e.expiresIn=arguments[1]:"function"==typeof arguments[1]&&(c=arguments[1])),arguments[2]&&("number"==typeof arguments[2]||"string"==typeof arguments[2]?e.expiresIn=arguments[2]:"function"==typeof arguments[2]&&(c=arguments[2])),arguments[3]&&"function"==typeof arguments[3]&&(c=arguments[3]),"object"==typeof b&&Object.keys(b).forEach(function(a){e[a]=b[a]}),this.query({controller:"auth",action:"login"},{body:e},{queuable:!1},function(a,b){a?(c&&"function"==typeof c&&c(a),d.emitEvent("loginAttempt",{success:!1,error:a.message})):(b.result.jwt&&d.setJwtToken(b.result.jwt),c&&"function"==typeof c&&c(null,b.result))}),d},Kuzzle.prototype.logout=function(a){var b=this,c={action:"logout",controller:"auth",requestId:h.v4(),body:{}};return this.query({controller:"auth",action:"logout"},c,{queuable:!1},function(c){null===c?(b.jwtToken=void 0,"function"==typeof a&&a(null,b)):"function"==typeof a&&a(c)}),b},Kuzzle.prototype.checkToken=function(a,b){var c=this,d={body:{token:a}};return this.callbackRequired("Kuzzle.checkToken",b),this.query({controller:"auth",action:"checkToken"},d,{queuable:!1},function(a,c){return a?b(a):void b(null,c.result)}),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return b.callbackRequired("Kuzzle.whoAmI",a),b.query({controller:"auth",action:"getCurrentUser"},{},{},function(c,d){return c?a(c):void a(null,new l(b.security,d.result._id,d.result._source))}),b},Kuzzle.prototype.getMyRights=function(a,b){var c=this;b||"function"!=typeof a||(b=a,a=null),c.callbackRequired("Kuzzle.getMyRights",b),c.query({controller:"auth",action:"getMyRights"},{},null,function(a,c){return a?b(a):void b(null,c.result.hits)})},Kuzzle.prototype.updateSelf=function(a,b,c){var d=this,e={},f={controller:"auth",action:"updateSelf"};c||"function"!=typeof b||(c=b,b=null),e.body=a,c?d.query(f,e,b,function(a,b){return a?c(a):void c(null,b.result)}):d.query(f,e,b)},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),d.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+d.toString());if("function"!==e)throw new Error("Invalid listener type: expected a function, got a "+e);return c=h.v1(),this.eventListeners[a].listeners.push({id:c,fn:b}),c},Kuzzle.prototype.getAllStatistics=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getAllStatistics",b),this.query({controller:"admin",action:"getAllStats"},{},a,function(a,c){return a?b(a):void b(null,c.result.hits)}),this},Kuzzle.prototype.getStatistics=function(a,b,c){var d;return c||(1===arguments.length?(c=arguments[0],b=null,a=null):(c=arguments[1],"object"==typeof arguments[0]?(b=arguments[0],a=null):(a=arguments[0],b=null))),d=function(b,d){return b?c(b):void(a?c(null,d.result.hits):c(null,[d.result]))},this.callbackRequired("Kuzzle.getStatistics",c),a?this.query({controller:"admin",action:"getStats"},{body:{startTime:a}},b,d):this.query({controller:"admin",action:"getLastStats"},{},b,d),this},Kuzzle.prototype.dataCollectionFactory=function(a,b){if(this.isValid(),!b){if(!this.defaultIndex)throw new Error("Unable to create a new data collection object: no index specified");b=this.defaultIndex}if("string"!=typeof b)throw new Error('Invalid "index" argument: string expected, got '+typeof b);if("string"!=typeof a)throw new Error('Invalid "collection" argument: string expected, got '+typeof a);return this.collections[b]||(this.collections[b]={}),this.collections[b][a]||(this.collections[b][a]=new i(this,b,a)),this.collections[b][a]},Kuzzle.prototype.flushQueue=function(){return this.offlineQueue=[],this},Kuzzle.prototype.listCollections=function(){var a,b,c,d="all",e=Array.prototype.slice.call(arguments);if(e.forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.listCollections: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.listCollections",c),b&&b.type&&(d=b.type),this.query({index:a,controller:"read",action:"listCollections"},{body:{type:d}},b,function(a,b){return a?c(a):c(null,b.result.collections)}),this},Kuzzle.prototype.listIndexes=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.listIndexes",b),this.query({controller:"read",action:"listIndexes"},{},a,function(a,c){return a?b(a):b(null,c.result.indexes)}),this},Kuzzle.prototype.disconnect=function(){var a;this.logout(),this.state="disconnected",this.socket.close(),this.socket=null;for(a in this.collections)this.collections.hasOwnProperty(a)&&delete this.collections[a]},Kuzzle.prototype.getServerInfo=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getServerInfo",b),this.query({controller:"read",action:"serverInfo"},{},a,function(a,c){return a?b(a):void b(null,c.result.serverInfo)}),this},Kuzzle.prototype.refreshIndex=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.refreshIndex: index required");a=this.defaultIndex}return this.query({index:a,controller:"admin",action:"refreshIndex"},{},b,c),this},Kuzzle.prototype.getAutoRefresh=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.getAutoRefresh: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.getAutoRefresh",c),this.query({index:a,controller:"admin",action:"getAutoRefresh"},{},b,c),this},Kuzzle.prototype.setAutoRefresh=function(){var a,b,c,d;if(Array.prototype.slice.call(arguments).forEach(function(e){switch(typeof e){case"string":a=e;break;case"boolean":b=e;break;case"object":c=e;break;case"function":d=e}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.setAutoRefresh: index required");a=this.defaultIndex}if(void 0===b)throw new Error("Kuzzle.setAutoRefresh: autoRefresh value is required");return this.query({index:a,controller:"admin",action:"setAutoRefresh"},{body:{autoRefresh:b}},c,d),this},Kuzzle.prototype.now=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.now",b),this.query({controller:"read",action:"now"},{},a,function(a,c){return a?b(a):void b(null,c.result.now)}),this},Kuzzle.prototype.query=function(a,b,c,f){var g,i={action:a.action,controller:a.controller,metadata:this.metadata},j=this;if(this.isValid(),f||"function"!=typeof c||(f=c,c=null),c&&(c.metadata&&Object.keys(c.metadata).forEach(function(a){i.metadata[a]=c.metadata[a]}),c.queuable===!1&&"offline"===j.state))return j;b.metadata&&Object.keys(b.metadata).forEach(function(a){i.metadata[a]=b.metadata[a]});for(g in b)"metadata"!==g&&b.hasOwnProperty(g)&&(i[g]=b[g]);return i=j.addHeaders(i,this.headers),void 0===j.jwtToken||"auth"===i.controller&&"checkToken"===i.action||(i.headers=i.headers||{},i.headers.authorization="Bearer "+j.jwtToken),a.collection&&(i.collection=a.collection),a.index&&(i.index=a.index),i.requestId||(i.requestId=h.v4()),"connected"===j.state||c&&c.queuable===!1?"connected"===j.state?e.call(this,i,f):f&&f(new Error("Unable to execute request: not connected to a Kuzzle server.\nDiscarded request: "+JSON.stringify(i))):(j.queuing||["initializing","connecting"].indexOf(j.state)!==-1)&&(d.call(this,i,f),j.queueFilter&&!j.queueFilter(i)||(j.offlineQueue.push({ts:Date.now(),query:i,cb:f}),j.emitEvent("offlineQueuePush",{query:i,cb:f}))),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(b.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+b.toString());this.eventListeners[a].listeners=[]}else b.forEach(function(a){c.eventListeners[a].listeners=[]})},Kuzzle.prototype.removeListener=function(a,b){var c=Object.keys(this.eventListeners),d=this;if(c.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+c.toString());this.eventListeners[a].listeners.forEach(function(c,e){c.id===b&&d.eventListeners[a].listeners.splice(e,1)})},Kuzzle.prototype.replayQueue=function(){return"offline"===this.state||this.autoReplay||(d.call(this),f.call(this)),this},Kuzzle.prototype.setDefaultIndex=function(a){if("string"!=typeof a)throw new Error("Invalid default index: ["+a+"] (an index name is expected)");if(0===a.length)throw new Error("Cannot set an empty index as the default index");return this.defaultIndex=a,this},Kuzzle.prototype.setHeaders=function(a,b){var c=this;if("object"!=typeof a||Array.isArray(a))throw new Error("Expected a content object, received a "+typeof a);return b?c.headers=a:Object.keys(a).forEach(function(b){c.headers[b]=a[b]}),c},Kuzzle.prototype.startQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!0),this},Kuzzle.prototype.stopQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!1),this}}).call(this,a("_process"))},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,_process:2,"node-uuid":1,"socket.io-client":void 0}],4:[function(a,b,c){function d(a,b,c){if(!b||!c)throw new Error("The KuzzleDataCollection object constructor needs an index and a collection arguments");return Object.defineProperties(this,{collection:{value:c,enumerable:!0},index:{value:b,enumerable:!0},kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),Object.defineProperty(this,"buildQueryArgs",{value:function(a,b){return{controller:a,action:b,collection:this.collection,index:this.index}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["publishMessage","setHeaders","subscribe"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleDocument"),f=a("./kuzzleDataMapping"),g=a("./kuzzleRoom");d.prototype.advancedSearch=function(a,b,c){var d,f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.advancedSearch",c),d=f.kuzzle.addHeaders({body:a},this.headers),f.kuzzle.query(this.buildQueryArgs("read","search"),d,b,function(a,b){var d=[];return a?c(a):(b.result.hits.forEach(function(a){var b=new e(f,a._id,a._source);b.version=a._version,d.push(b)}),void c(null,{total:b.result.total,documents:d}))}),this},d.prototype.count=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.count",c),d=this.kuzzle.addHeaders({body:a},this.headers),this.kuzzle.query(this.buildQueryArgs("read","count"),d,b,function(a,b){return a?c(a):void c(null,b.result.count)}),this},d.prototype.create=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","createCollection"),c,a,b),this},d.prototype.createDocument=function(a,b,c,d){var f=this,g={},h="create";return a&&"string"!=typeof a&&(d=c,c=b,b=a,a=null),d||"function"!=typeof c||(d=c,c=null),b instanceof e?g=b.serialize():g.body=b,c&&(h=c.updateIfExist?"createOrReplace":"create"),a&&(g._id=a),g=f.kuzzle.addHeaders(g,f.headers),d?f.kuzzle.query(this.buildQueryArgs("write",h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write",h),g,c),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};"string"==typeof a?(e._id=a,d="delete"):(e.body=a,d="deleteByQuery"),c||"function"!=typeof b||(c=b,b=null),e=this.kuzzle.addHeaders(e,this.headers),c?this.kuzzle.query(this.buildQueryArgs("write",d),e,b,function(a,b){return a?c(a):void("delete"===d?c(null,[b.result._id]):c(null,b.result.ids))}):this.kuzzle.query(this.buildQueryArgs("write",d),e,b)},d.prototype.fetchDocument=function(a,b,c){var d={_id:a},f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.fetch",c),d=f.kuzzle.addHeaders(d,this.headers),f.kuzzle.query(this.buildQueryArgs("read","get"),d,b,function(a,b){var d;return a?c(a):(d=new e(f,b.result._id,b.result._source),d.version=b.result._version,void c(null,d))}),this},d.prototype.fetchAllDocuments=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),a&&(a.from&&(c.from=a.from),a.size&&(c.size=a.size)),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch(c,a,b),this},d.prototype.getMapping=function(a,b){var c;return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.getMapping",b),c=new f(this),c.refresh(a,b),this},d.prototype.publishMessage=function(a,b,c){var d={};return a instanceof e?d=a.serialize():d.body=a,d=this.kuzzle.addHeaders(d,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),d,b,c),this},d.prototype.replaceDocument=function(a,b,c,d){var f=this,g={_id:a,body:b};return d||"function"!=typeof c||(d=c,c=null),g=f.kuzzle.addHeaders(g,this.headers),d?f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c),this},d.prototype.subscribe=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.subscribe",c),d=new g(this,b),d.renew(a,c)},d.prototype.truncate=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("admin","truncateCollection"),c,a,b),this},d.prototype.updateDocument=function(a,b,c,d){var f={_id:a,body:b},g=this;return d||"function"!=typeof c||(d=c,c=null),f=g.kuzzle.addHeaders(f,this.headers),d?g.kuzzle.query(this.buildQueryArgs("write","update"),f,c,function(a,b){var c;return a?d(a):(c=new e(g,b.result._id),void c.refresh(d))}):g.kuzzle.query(this.buildQueryArgs("write","update"),f,c),g},d.prototype.documentFactory=function(a,b){return new e(this,a,b)},d.prototype.roomFactory=function(a){return new g(this,a)},d.prototype.dataMappingFactory=function(a){return new f(this,a)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"./kuzzleDataMapping":5,"./kuzzleDocument":6,"./kuzzleRoom":8}],5:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},mapping:{value:b||{},enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["set","setHeaders"];return d&&e.indexOf(a)===-1}}):this}d.prototype.apply=function(a,b){var c=this,d=this.kuzzle.addHeaders({body:{properties:this.mapping}},this.headers);return b||"function"!=typeof a||(b=a,a=null),c.kuzzle.query(this.collection.buildQueryArgs("admin","updateMapping"),d,a,function(d){return d?!!b&&b(d):void c.refresh(a,b)}),this},d.prototype.refresh=function(a,b){var c=this,d=this.kuzzle.addHeaders({},this.headers);return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.query(this.collection.buildQueryArgs("admin","getMapping"),d,a,function(a,d){return a?!!b&&b(a):d.result[c.collection.index]?d.result[c.collection.index].mappings[c.collection.collection]?(c.mapping=d.result[c.collection.index].mappings[c.collection.collection].properties,void 0===c.mapping&&(c.mapping={}),void(b&&b(null,c))):!!b&&b(new Error("No mapping found for collection "+c.collection.collection)):!!b&&b(new Error("No mapping found for index "+c.collection.index))}),this},d.prototype.set=function(a,b){return this.mapping[a]=b,this},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],6:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{collection:{value:a.collection,enumerable:!0},dataCollection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},id:{value:void 0,enumerable:!0,writable:!0},content:{value:{},writable:!0,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},version:{value:void 0,enumerable:!0,writable:!0}}),!c&&b&&"object"==typeof b&&(c=b,b=null),c&&(c._version&&(this.version=c._version,delete c._version),this.setContent(c,!0)),b&&Object.defineProperty(this,"id",{value:b,enumerable:!0}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","refresh","save"];return d&&e.indexOf(a)!==-1}}):this}d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a._version=this.version,a=this.kuzzle.addHeaders(a,this.headers)},d.prototype.toString=function(){return JSON.stringify(this.serialize())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a,function(a){return a?b(a):void b(null,c.id)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a)},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");this.kuzzle.callbackRequired("KuzzleDocument.refresh",b),c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,e){var f;return a?b(a):(f=new d(c.dataCollection,c.id,e.result._source),f.version=e.result._version,void b(null,f))})},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?!!b&&b(a):(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.serialize();return this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this},d.prototype.setContent=function(a,b){var c=this;return b?this.content=a:Object.keys(a).forEach(function(b){c.content[b]=a[b]}),this},d.prototype.subscribe=function(a,b){var c;if(a&&!b&&"function"==typeof a&&(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDocument.subscribe",b),!this.id)throw new Error("KuzzleDocument.subscribe: cannot subscribe to a document if no ID has been provided");return c={ids:{values:[this.id]}},this.dataCollection.subscribe(c,a,b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],7:[function(a,b,c){function d(a){return Object.defineProperties(this,{kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),this.setHeaders=a.setHeaders.bind(this),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["setHeaders"];return d&&e.indexOf(a)===-1}}):this}!function(){var a=["id","value"],b=["id","keys"],c={append:a,bgrewriteaof:[],bgsave:[],bitcount:["id","start","end"],bitop:["operation","destkey",b],bitpos:["id","bit",{__opts__:["start","end"]}],blpop:[b,"timeout"],brpoplpush:["source","destination"],dbsize:[],decrby:a,del:[b],discard:[],exec:[],exists:[b],expire:["id","seconds"],expireat:["id","timestamp"],flushdb:[],getbit:["id","offset"],getrange:["id","start","end"],hdel:["id",["field","fields"]],hexists:["id","field"],hincrby:["id","field","value"],hmset:["id","values"],hset:["id","field","value"],info:["section"],keys:["pattern"],lastsave:[],lindex:["id","idx"],linsert:["id","position","pivot","value"],lpush:["id",["value","values"]],lrange:["id","start","stop"],lrem:["id","count","value"],lset:["id","idx","value"],ltrim:["id","start","stop"],mset:["values"],multi:[],object:["subcommand","args"],pexpire:["id","milliseconds"],pexpireat:["id","timestamp"],pfadd:["id",["element","elements"]],pfmerge:["destkey",["sourcekey","sourcekeys"]],ping:[],psetex:["id","milliseconds","value"],publish:["channel","message"],randomkey:[],rename:["id","newkey"],renamenx:["id","newkey"],restore:["id","ttl","content"],rpoplpush:["source","destination"],sadd:["id",["member","members"]],save:[],set:["id","value",{__opts__:["ex","px","nx","xx"]}],sdiffstore:["destination",b],setbit:["id","offset","value"],setex:["id","seconds","value"],setrange:["id","offset","value"],sinterstore:["destination",b],sismember:["id","member"], -smove:["id","destination","member"],sort:["id",{__opts__:["by","offset","count","get","direction","alpha","store"]}],spop:["id","count"],srem:["id",["member","members"]],sunionstore:["destination",b],unwatch:[],wait:["numslaves","timeout"],zadd:["id",{__opts__:["nx","xx","ch","incr","score","member","members"]}],zcount:["id","min","max"],zincrby:["id","value","member"],zinterstore:["destination",b,{__opts__:["weight","weights","aggregate"]}],zlexcount:["id","min","max"],zrange:["id","start","stop",{__opts__:["withscores"]}],zrangebylex:["id","min","max",{__opts__:["offset","count"]}],zrangebyscore:["id","min","max",{__opts__:["withscores","offset","count"]}],zrem:["id","member"],zremrangebylex:["id","min","max"],zremrangebyscore:["id","min","max"],zrevrangebylex:["id","max","min",{__opts__:["offset","count"]}],zrevrangebyscore:["id","max","min",{__opts__:["withscores","offset","count"]}],zrevrank:["id","member"]};c.decr=c.get=c.dump=c.hgetall=c.hkeys=c.hlen=c.hstrlen=c.hvals=c.incr=c.llen=c.lpop=c.persist=c.pttl=c.rpop=c.scard=c.smembers=c.strlen=c.ttl=c.type=c.zcard=["id"],c.getset=c.lpushx=a,c.del=c.exists=c.mget=c.pfcount=c.sdiff=c.sinter=c.sunion=c.watch=[b],c.incrby=c.incrbyfloat=c.decrby,c.brpop=c.blpop,c.hget=c.hexists,c.hmget=c.hdel,c.hsetnx=c.hset,c.msetnx=c.mset,c.rpush=c.lpush,c.hincrbyfloat=c.hincrby,c.srandmember=c.spop,c.zrevrange=c.zrange,c.zscore=c.zrevrank,Object.keys(c).forEach(function(a){d.prototype[a]=function(){var b,d=Array.prototype.slice.call(arguments),e=null,f={controller:"ms",action:a},g={};return"function"==typeof d[d.length-1]&&(b=d.pop()),d.length&&"object"==typeof d[d.length-1]&&1===Object.keys(d[d.length-1]).length&&void 0!==d[d.length-1].queuable&&(e=d.pop()),c[a].forEach(function(a,b){void 0!==d[b]&&(Array.isArray(a)&&(a=Array.isArray(d[b])?a[1]:a[0]),"id"===a?g._id=d[b]:(g.body||(g.body={}),"object"==typeof a&&void 0!==a.__opts__?a.__opts__.forEach(function(a){void 0!==d[b][a]&&(g.body[a]=d[b][a])}):g.body[a]=d[b]))}),this.kuzzle.query(f,g,e,b),this}})}(),b.exports=d},{}],8:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:h.v4()},lastRenewal:{value:null,writable:!0},notifier:{value:null,writable:!0},queue:{value:[],writable:!0},renewalDelay:{value:500},scope:{value:b&&b.scope?b.scope:"all"},state:{value:b&&b.state?b.state:"done"},subscribing:{value:!1,writable:!0},users:{value:b&&b.users?b.users:"none"},collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},filters:{value:null,enumerable:!0,writable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},metadata:{value:b&&b.metadata?b.metadata:{},enumerable:!0,writable:!0},roomId:{value:null,enumerable:!0,writable:!0},subscribeToSelf:{value:!b||"boolean"!=typeof b.subscribeToSelf||b.subscribeToSelf,enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["count"];return d&&e.indexOf(a)!==-1}}):this}function e(a){return a.error?this.callback(a.error):"jwtTokenExpired"===a.action?(this.kuzzle.jwtToken=void 0,this.kuzzle.emitEvent("jwtTokenExpired")):void(this.kuzzle.requestHistory[a.requestId]?(this.subscribeToSelf&&this.callback(null,a),delete this.kuzzle.requestHistory[a.requestId]):this.callback(null,a))}function f(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}function g(){return"connected"===this.kuzzle.state&&!this.subscribing}var h=a("node-uuid");d.prototype.count=function(a){var b;if(this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),!g.call(this))return this.queue.push({action:"count",args:[a]}),this;if(!this.roomId)throw new Error("KuzzleRoom.count: cannot count subscriptions on an inactive room");return this.kuzzle.query(this.collection.buildQueryArgs("subscribe","count"),b,function(b,c){return b?a(b):void a(null,c.result.count)}),this},d.prototype.renew=function(a,b){var c=Date.now(),d={scope:this.scope,state:this.state,users:this.users},g=this;return!b&&a&&"function"==typeof a&&(b=a,a=null),g.kuzzle.callbackRequired("KuzzleRoom.renew",b),g.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(a&&(g.filters=a),"connected"!==g.kuzzle.state?(g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,g):g.subscribing?(g.queue.push({action:"renew",args:[a,b]}),g):(g.unsubscribe(),g.roomId=null,g.subscribing=!0,g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,d.body=g.filters,d=g.kuzzle.addHeaders(d,this.headers),g.kuzzle.query(g.collection.buildQueryArgs("subscribe","on"),d,{metadata:g.metadata},function(a,b){if(delete g.kuzzle.subscriptions.pending[g.id],g.subscribing=!1,a)throw g.queue=[],new Error("Error during Kuzzle subscription: "+a.message);g.lastRenewal=c,g.roomId=b.result.roomId,g.channel=b.result.channel,g.kuzzle.subscriptions[g.roomId]||(g.kuzzle.subscriptions[g.roomId]={}),g.kuzzle.subscriptions[g.roomId][g.id]=g,g.notifier=e.bind(g),g.kuzzle.socket.on(g.channel,g.notifier),f.call(g)}),g))},d.prototype.unsubscribe=function(){var a,b=this,c=b.roomId;return g.call(this)?(c&&(b.kuzzle.socket.off(b.channel,this.notifier),1===Object.keys(b.kuzzle.subscriptions[c]).length?(delete b.kuzzle.subscriptions[c],0===Object.keys(b.kuzzle.subscriptions.pending).length?b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}):a=setInterval(function(){0===Object.keys(b.kuzzle.subscriptions.pending).length&&(b.kuzzle.subscriptions[c]||b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}),clearInterval(a))},100)):delete b.kuzzle.subscriptions[c][b.id],b.roomId=null),b):(b.queue.push({action:"unsubscribe",args:[]}),b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],9:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"},updateActionName:{value:"updateProfile"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c,d=this;if(!this.content.policies)throw new Error('Argument "policies" is mandatory in a profile. This argument contains an array of objects.');return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c=this.serialize(),d.kuzzle.query(d.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.addPolicy=function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an object containing at least a "roleId" member which must be a string.');return this.content.policies||(this.content.policies=[]),this.content.policies.push(a),this},d.prototype.setPolicies=function(a){if(!Array.isArray(a))throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string');return a.map(function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string')}),this.content.policies=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getPolicies=function(){return this.content.policies},b.exports=d},{"./kuzzleSecurityDocument":12}],10:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"},updateActionName:{value:"updateRole"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c=this.serialize(),d=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))})},b.exports=d},{"./kuzzleSecurityDocument":12}],11:[function(a,b,c){function d(a){return Object.defineProperty(this,"kuzzle",{value:a}),Object.defineProperty(this,"buildQueryArgs",{value:function(a){return{controller:"security",action:a}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["roleFactory","profileFactory","userFactory","isActionAllowed"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b,c){var d,f=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},f.kuzzle.callbackRequired("KuzzleSecurity.getRole",c),f.kuzzle.query(this.buildQueryArgs("getRole"),d,b,function(a,b){return a?c(a):void c(null,new e(f,b.result._id,b.result._source))})},d.prototype.searchRoles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",c),d.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},b,function(a,b){var f;return a?c(a):(f=b.result.hits.map(function(a){return new e(d,a._id,a._source)}),void c(null,{total:b.result.total,roles:f}))})},d.prototype.createRole=function(a,b,c,d){var f=this,g={},h="createRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createRole: cannot create a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceRole":"createRole"),d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),void d(null,c))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateRole=function(a,b,c,d){var f=this,g={},h="updateRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateRole: cannot update a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(c){return c?d(c):void d(null,new e(f,a,b))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteRole=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this;if(c||"function"!=typeof b||(c=b,b=null),!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,b,function(a,b){return a?c(a):void c(null,new f(e,b.result._id,b.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new f(d,a._id,a._source)}),void c(null,{total:b.result.total,profiles:e}))})},d.prototype.createProfile=function(a,b,c,d){var e=this,g={},h="createProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createProfile: cannot create a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceProfile":"createProfile"),d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new f(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateProfile=function(a,b,c,d){var e=this,g={},h="updateProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateProfile: cannot update a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c={};return a?d(a):(Object.keys(b.result._source).forEach(function(a){c[a]=b.result._source[a]}),void d(null,new f(e,b.result._id,c)))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteProfile=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b,c){var d,e=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getUser",c),e.kuzzle.query(this.buildQueryArgs("getUser"),d,b,function(a,b){return a?c(a):void c(null,new g(e,b.result._id,b.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new g(d,a._id,a._source)}),void c(null,{total:b.result.total,users:e}))})},d.prototype.createUser=function(a,b,c,d){var e=this,f={},h="createUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createUser: cannot create a user without a user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,c&&(h=c.replaceIfExist?"createOrReplaceUser":"createUser"),d?e.kuzzle.query(this.buildQueryArgs(h),f,null,function(a,b){var c;return a?d(a):(c=new g(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),f)},d.prototype.updateUser=function(a,b,c,d){var e=this,f={},h="updateUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateUser: cannot update an user without an user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),f,c,function(a,b){return a?d(a):void d(null,new g(e,b.result._id,b.result._source))}):e.kuzzle.query(this.buildQueryArgs(h),f,c)},d.prototype.deleteUser=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},d.prototype.isActionAllowed=function(a,b,c,d,e){var f;if(!a||"object"!=typeof a)throw new Error("rights parameter is mandatory for isActionAllowed function");if(!b||"string"!=typeof b)throw new Error("controller parameter is mandatory for isActionAllowed function");if(!c||"string"!=typeof c)throw new Error("action parameter is mandatory for isActionAllowed function");return f=a.filter(function(a){return a.controller===b||"*"===a.controller}).filter(function(a){return a.action===c||"*"===a.action}).filter(function(a){return a.index===d||"*"===a.index}).filter(function(a){return a.collection===e||"*"===a.collection}),f.some(function(a){return"allowed"===a.value})?"allowed":f.some(function(a){return"conditional"===a.value})?"conditional":"denied"},d.prototype.getUserRights=function(a,b,c){var d={_id:a},e=this;if(!a||"string"!=typeof a)throw new Error("userId parameter is mandatory for getUserRights function");c||"function"!=typeof b||(c=b,b=null),e.kuzzle.callbackRequired("Kuzzle.getUserRights",c),this.kuzzle.query(this.buildQueryArgs("getUserRights"),d,b,function(a,b){return a?c(a):void c(null,b.result.hits)})},b.exports=d},{"./kuzzleProfile":9,"./kuzzleRole":10,"./kuzzleUser":13}],12:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");if(Object.defineProperties(this,{kuzzle:{value:a.kuzzle},kuzzleSecurity:{value:a},id:{value:b,enumerable:!0},content:{value:{},writable:!0,enumerable:!0}}),c&&this.setContent(c,!0),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","update"];return d&&e.indexOf(a)!==-1}})}d.prototype.setContent=function(a){return this.content=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype["delete"]=function(a,b){var c=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},a,function(a,c){return a?!!b&&b(a):void(b&&b(null,c.result._id))})},d.prototype.update=function(a,b,c){var d={},e=this;if("object"!=typeof a)throw new Error('Parameter "content" must be a object');b&&void 0===c&&"function"==typeof b&&(c=b,b=null),d._id=e.id,d.body=a,e.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.updateActionName),d,b,function(a,b){return a?!!c&&c(a):(e.setContent(b.result._source),void(c&&c(null,e)))})},b.exports=d},{}],13:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"},updateActionName:{value:"updateUser"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.setProfiles=function(a){if(!Array.isArray(a)||"string"!=typeof a[0])throw new Error('Parameter "profilesIds" must be an array of strings');return this.content.profilesIds=a,this},d.prototype.addProfile=function(a){if("string"!=typeof a)throw new Error('Parameter "profileId" must be a string');return this.content.profilesIds||(this.content.profilesIds=[]),this.content.profilesIds.indexOf(a)===-1&&this.content.profilesIds.push(a),this},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getProfiles=function(){return this.content.profilesIds},b.exports=d},{"./kuzzleSecurityDocument":12}]},{},[3]); +// Official Javascript SDK for Kuzzle v2.0.0 - License: Apache-2.0 +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g1)for(var c=1;c>>((3&b)<<3)&255;return e},"undefined"!=typeof console&&console.warn&&console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()")}}function e(){if("function"==typeof a)try{var b=a("crypto").randomBytes;l=j=b&&function(){return b(16)},j()}catch(c){}}function f(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=q[a])});e<16;)b[d+e++]=0;return b}function g(a,b){var c=b||0,d=p;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function h(a,b,c){var d=b&&c||0,e=b||[];a=a||{};var f=null!=a.clockseq?a.clockseq:u,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:w+1,j=h-v+(i-w)/1e4;if(j<0&&null==a.clockseq&&(f=f+1&16383),(j<0||h>v)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=h,w=i,u=f,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;e[d++]=k>>>24&255,e[d++]=k>>>16&255,e[d++]=k>>>8&255,e[d++]=255&k;var l=h/4294967296*1e4&268435455;e[d++]=l>>>8&255,e[d++]=255&l,e[d++]=l>>>24&15|16,e[d++]=l>>>16&255,e[d++]=f>>>8|128,e[d++]=255&f;for(var m=a.node||t,n=0;n<6;n++)e[d+n]=m[n];return b?b:g(e)}function i(a,b,c){var d=b&&c||0;"string"==typeof a&&(b="binary"===a?new o(16):null,a=null),a=a||{};var e=a.random||(a.rng||j)();if(e[6]=15&e[6]|64,e[8]=63&e[8]|128,b)for(var f=0;f<16;f++)b[d+f]=e[f];return b||g(e)}var j,k,l,m,n;c?d():e();for(var o="function"==typeof Buffer?Buffer:Array,p=[],q={},r=0;r<256;r++)p[r]=(r+256).toString(16).substr(1),q[p[r]]=r;var s=j(),t=[1|s[0],s[1],s[2],s[3],s[4],s[5]],u=16383&(s[6]<<8|s[7]),v=0,w=0,x=i;x.v1=h,x.v4=i,x.parse=f,x.unparse=g,x.BufferClass=o,x._rng=j,x._mathRNG=k,x._nodeRNG=l,x._whatwgRNG=m,"undefined"!=typeof b&&b.exports?b.exports=x:"function"==typeof define&&define.amd?define(function(){return x}):(n=c.uuid,x.noConflict=function(){return c.uuid=n,x},c.uuid=x)}("undefined"!=typeof window?window:null)},{}],3:[function(a,b,c){(function(c){function d(){var a=this,b=Date.now(),c=-1;a.queueTTL>0&&(a.offlineQueue.forEach(function(d,e){d.ts0&&a.offlineQueue.length>a.queueMaxSize&&a.offlineQueue.splice(0,a.offlineQueue.length-a.queueMaxSize).forEach(function(b){a.emitEvent("offlineQueuePop",b.query)})}function e(a){var b=Date.now();Object.keys(a).forEach(function(c){a[c]0?(f.call(b,b.offlineQueue[0].query,b.offlineQueue[0].cb),b.emitEvent("offlineQueuePop",b.offlineQueue.shift()),setTimeout(function(){d()},Math.max(0,b.replayInterval))):b.queuing=!1};if(b.offlineQueueLoader){if("function"!=typeof b.offlineQueueLoader)throw new Error("Invalid value for offlineQueueLoader property. Expected: function. Got: "+typeof b.offlineQueueLoader);if(a=b.offlineQueueLoader(),!Array.isArray(a))throw new Error("Invalid value returned by the offlineQueueLoader function. Expected: array. Got: "+typeof a);b.offlineQueue=a.concat(b.offlineQueue).filter(function(a){if(!a.query||void 0===a.query.requestId||!a.query.action||!a.query.controller)throw new Error("Invalid offline queue request. One or more missing properties: requestId, action, controller.");return!c.hasOwnProperty(a.query.requestId)&&(c[a.query.requestId]=!0)})}d()}function h(){var a=this;Object.keys(a.subscriptions).forEach(function(b){Object.keys(a.subscriptions[b]).forEach(function(c){var d=a.subscriptions[b][c];d.renew(d.callback)})})}var i=a("node-uuid"),j=a("./kuzzleDataCollection"),k=a("./security/kuzzleSecurity"),l=a("./kuzzleMemoryStorage"),m=a("./security/kuzzleUser"),n=a("./networkWrapper");b.exports=Kuzzle=function(a,b,d){var f=this;if(!(this instanceof Kuzzle))return new Kuzzle(a,b,d);if(d||"function"!=typeof b||(d=b,b=null),!a||""===a)throw new Error("address argument missing");return Object.defineProperties(this,{collections:{value:{},writable:!0},connectCB:{value:d},eventListeners:{value:{connected:{lastEmitted:null,listeners:[]},error:{lastEmitted:null,listeners:[]},disconnected:{lastEmitted:null,listeners:[]},reconnected:{lastEmitted:null,listeners:[]},jwtTokenExpired:{lastEmitted:null,listeners:[]},loginAttempt:{lastEmitted:null,listeners:[]},offlineQueuePush:{listeners:[]},offlineQueuePop:{listeners:[]}}},eventTimeout:{value:200},queuing:{value:!1,writable:!0},requestHistory:{value:{},writable:!0},state:{value:"initializing",writable:!0},subscriptions:{value:{pending:{}},writable:!0},autoReconnect:{value:!b||"boolean"!=typeof b.autoReconnect||b.autoReconnect,enumerable:!0},defaultIndex:{value:b&&"string"==typeof b.defaultIndex?b.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:b&&"number"==typeof b.reconnectionDelay?b.reconnectionDelay:1e3,enumerable:!0},address:{value:a,enumerable:!0},wsPort:{value:b&&"number"==typeof b.wsPort?b.wsPort:7513,enumerable:!0},ioPort:{value:b&&"number"==typeof b.ioPort?b.ioPort:7512,enumerable:!0},autoQueue:{value:!1,enumerable:!0,writable:!0},autoReplay:{value:!1,enumerable:!0,writable:!0},autoResubscribe:{value:!0,enumerable:!0,writable:!0},headers:{value:{},enumerable:!0,writable:!0},metadata:{value:{},enumerable:!0,writable:!0},offlineQueue:{value:[],enumerable:!0,writable:!0},queueFilter:{value:null,enumerable:!0,writable:!0},queueMaxSize:{value:500,enumerable:!0,writable:!0},queueTTL:{value:12e4,enumerable:!0,writable:!0},replayInterval:{value:10,enumerable:!0,writable:!0},jwtToken:{value:void 0,enumerable:!0,writable:!0},offlineQueueLoader:{value:null,enumerable:!0,writable:!0}}),b&&(Object.keys(b).forEach(function(a){f.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(f,a).writable&&(f[a]=b[a])}),"auto"===b.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===f.state)throw new Error("This Kuzzle object has been invalidated. Did you try to access it after a disconnect call?")}}),Object.defineProperty(this,"addHeaders",{value:function(a,b){return Object.keys(b).forEach(function(c){a[c]||(a[c]=b[c])}),a}}),Object.defineProperty(this,"callbackRequired",{value:function(a,b){if(!b||"function"!=typeof b)throw new Error(a+": a callback argument is required for read queries")}}),Object.defineProperty(this,"security",{value:new k(this),enumerable:!0}),Object.defineProperty(this,"emitEvent",{value:function(a){var b=Date.now(),d=Array.prototype.slice.call(arguments,1),e=this.eventListeners[a];return!(e.lastEmitted&&e.lastEmitted>=b-this.eventTimeout)&&(e.listeners.forEach(function(a){c.nextTick(function(){a.fn.apply(void 0,d)})}),void(void 0!==e.lastEmitted&&(e.lastEmitted=b)))}}),Object.defineProperty(this,"memoryStorage",{value:new l(this),enumerable:!0}),b&&b.connect&&"auto"!==b.connect?this.state="ready":this.connect(),e(this.requestHistory),this.bluebird?this.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["getAllStatistics","getServerInfo","getStatistics","listCollections","listIndexes","login","logout","now","query","checkToken","whoAmI"];return d&&e.indexOf(a)!==-1}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return a.network||(a.network=n(a.address,a.wsPort,a.ioPort)),["initializing","ready","disconnected","error","offline"].indexOf(this.state)===-1?(a.connectCB&&a.connectCB(null,a),a):(a.state="connecting",a.network.connect(a.autoReconnect,a.reconnectionDelay),a.network.onConnect(function(){a.state="connected",h.call(a),g.call(a),a.emitEvent("connected"),a.connectCB&&a.connectCB(null,a)}),a.network.onConnectError(function(b){var c=new Error('Unable to connect to kuzzle server at "'+a.address+'"');c.internal=b,a.state="error",a.emitEvent("error",c),a.connectCB&&a.connectCB(c)}),a.network.onDisconnect(function(){a.state="offline",a.autoReconnect||a.disconnect(),a.autoQueue&&(a.queuing=!0),a.emitEvent("disconnected")}),a.network.onReconnect(function(){var b=function(){a.autoResubscribe&&h.call(a),a.autoReplay&&(d.call(a),g.call(a)),a.emitEvent("reconnected")};a.state="connected",a.jwtToken?a.checkToken(a.jwtToken,function(c,d){!c&&d.valid||(a.jwtToken=void 0,a.emitEvent("jwtTokenExpired")),b()}):b()}),this)},Kuzzle.prototype.setJwtToken=function(a){if("string"==typeof a)this.jwtToken=a;else{if("object"!=typeof a)return this.emitEvent("loginAttempt",{success:!1,error:"Invalid token argument: "+a}),this;if(!a.result||!a.result.jwt||"string"!=typeof a.result.jwt)return this.emitEvent("loginAttempt",{success:!1,error:"Cannot find a valid JWT token in the following object: "+JSON.stringify(a)}),this;this.jwtToken=a.result.jwt}return h.call(this),this.emitEvent("loginAttempt",{success:!0}),this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a){var b,c,d=this,e={strategy:a};return arguments[1]&&("object"==typeof arguments[1]?b=arguments[1]:"number"==typeof arguments[1]||"string"==typeof arguments[1]?e.expiresIn=arguments[1]:"function"==typeof arguments[1]&&(c=arguments[1])),arguments[2]&&("number"==typeof arguments[2]||"string"==typeof arguments[2]?e.expiresIn=arguments[2]:"function"==typeof arguments[2]&&(c=arguments[2])),arguments[3]&&"function"==typeof arguments[3]&&(c=arguments[3]),"object"==typeof b&&Object.keys(b).forEach(function(a){e[a]=b[a]}),this.query({controller:"auth",action:"login"},{body:e},{queuable:!1},function(a,b){a?(c&&"function"==typeof c&&c(a),d.emitEvent("loginAttempt",{success:!1,error:a.message})):(b.result.jwt&&d.setJwtToken(b.result.jwt),c&&"function"==typeof c&&c(null,b.result))}),d},Kuzzle.prototype.logout=function(a){var b=this,c={action:"logout",controller:"auth",requestId:i.v4(),body:{}};return this.query({controller:"auth",action:"logout"},c,{queuable:!1},function(c){null===c?(b.jwtToken=void 0,"function"==typeof a&&a(null,b)):"function"==typeof a&&a(c)}),b},Kuzzle.prototype.checkToken=function(a,b){var c=this,d={body:{token:a}};return this.callbackRequired("Kuzzle.checkToken",b),this.query({controller:"auth",action:"checkToken"},d,{queuable:!1},function(a,c){return a?b(a):void b(null,c.result)}),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return b.callbackRequired("Kuzzle.whoAmI",a),b.query({controller:"auth",action:"getCurrentUser"},{},{},function(c,d){return c?a(c):void a(null,new m(b.security,d.result._id,d.result._source))}),b},Kuzzle.prototype.getMyRights=function(a,b){var c=this;b||"function"!=typeof a||(b=a,a=null),c.callbackRequired("Kuzzle.getMyRights",b),c.query({controller:"auth",action:"getMyRights"},{},null,function(a,c){return a?b(a):void b(null,c.result.hits)})},Kuzzle.prototype.updateSelf=function(a,b,c){var d=this,e={},f={controller:"auth",action:"updateSelf"};c||"function"!=typeof b||(c=b,b=null),e.body=a,c?d.query(f,e,b,function(a,b){return a?c(a):void c(null,b.result)}):d.query(f,e,b)},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),d.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+d.toString());if("function"!==e)throw new Error("Invalid listener type: expected a function, got a "+e);return c=i.v4(),this.eventListeners[a].listeners.push({id:c,fn:b}),c},Kuzzle.prototype.getAllStatistics=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getAllStatistics",b),this.query({controller:"admin",action:"getAllStats"},{},a,function(a,c){return a?b(a):void b(null,c.result.hits)}),this},Kuzzle.prototype.getStatistics=function(a,b,c){var d;return c||(1===arguments.length?(c=arguments[0],b=null,a=null):(c=arguments[1],"object"==typeof arguments[0]?(b=arguments[0],a=null):(a=arguments[0],b=null))),d=function(b,d){return b?c(b):void(a?c(null,d.result.hits):c(null,[d.result]))},this.callbackRequired("Kuzzle.getStatistics",c),a?this.query({controller:"admin",action:"getStats"},{body:{startTime:a}},b,d):this.query({controller:"admin",action:"getLastStats"},{},b,d),this},Kuzzle.prototype.dataCollectionFactory=function(a,b){if(this.isValid(),!b){if(!this.defaultIndex)throw new Error("Unable to create a new data collection object: no index specified");b=this.defaultIndex}if("string"!=typeof b)throw new Error('Invalid "index" argument: string expected, got '+typeof b);if("string"!=typeof a)throw new Error('Invalid "collection" argument: string expected, got '+typeof a);return this.collections[b]||(this.collections[b]={}),this.collections[b][a]||(this.collections[b][a]=new j(this,b,a)),this.collections[b][a]},Kuzzle.prototype.flushQueue=function(){return this.offlineQueue=[],this},Kuzzle.prototype.listCollections=function(){var a,b,c,d="all",e=Array.prototype.slice.call(arguments);if(e.forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.listCollections: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.listCollections",c),b&&b.type&&(d=b.type),this.query({index:a,controller:"read",action:"listCollections"},{body:{type:d}},b,function(a,b){return a?c(a):c(null,b.result.collections)}),this},Kuzzle.prototype.listIndexes=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.listIndexes",b),this.query({controller:"read",action:"listIndexes"},{},a,function(a,c){return a?b(a):b(null,c.result.indexes)}),this},Kuzzle.prototype.disconnect=function(){var a;this.logout(),this.state="disconnected",this.network.close();for(a in this.collections)this.collections.hasOwnProperty(a)&&delete this.collections[a]},Kuzzle.prototype.getServerInfo=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getServerInfo",b),this.query({controller:"read",action:"serverInfo"},{},a,function(a,c){return a?b(a):void b(null,c.result.serverInfo)}),this},Kuzzle.prototype.refreshIndex=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.refreshIndex: index required");a=this.defaultIndex}return this.query({index:a,controller:"admin",action:"refreshIndex"},{},b,c),this},Kuzzle.prototype.getAutoRefresh=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.getAutoRefresh: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.getAutoRefresh",c),this.query({index:a,controller:"admin",action:"getAutoRefresh"},{},b,c),this},Kuzzle.prototype.setAutoRefresh=function(){var a,b,c,d;if(Array.prototype.slice.call(arguments).forEach(function(e){switch(typeof e){case"string":a=e;break;case"boolean":b=e;break;case"object":c=e;break;case"function":d=e}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.setAutoRefresh: index required");a=this.defaultIndex}if(void 0===b)throw new Error("Kuzzle.setAutoRefresh: autoRefresh value is required");return this.query({index:a,controller:"admin",action:"setAutoRefresh"},{body:{autoRefresh:b}},c,d),this},Kuzzle.prototype.now=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.now",b),this.query({controller:"read",action:"now"},{},a,function(a,c){return a?b(a):void b(null,c.result.now)}),this},Kuzzle.prototype.query=function(a,b,c,e){var g,h={action:a.action,controller:a.controller,metadata:this.metadata},j=this;if(this.isValid(),e||"function"!=typeof c||(e=c,c=null),c&&(c.metadata&&Object.keys(c.metadata).forEach(function(a){h.metadata[a]=c.metadata[a]}),c.queuable===!1&&"offline"===j.state))return j;b.metadata&&Object.keys(b.metadata).forEach(function(a){h.metadata[a]=b.metadata[a]});for(g in b)"metadata"!==g&&b.hasOwnProperty(g)&&(h[g]=b[g]);return h=j.addHeaders(h,this.headers),void 0===j.jwtToken||"auth"===h.controller&&"checkToken"===h.action||(h.headers=h.headers||{},h.headers.authorization="Bearer "+j.jwtToken),a.collection&&(h.collection=a.collection),a.index&&(h.index=a.index),h.requestId||(h.requestId=i.v4()),"connected"===j.state||c&&c.queuable===!1?"connected"===j.state?f.call(this,h,e):e&&e(new Error("Unable to execute request: not connected to a Kuzzle server.\nDiscarded request: "+JSON.stringify(h))):(j.queuing||["initializing","connecting"].indexOf(j.state)!==-1)&&(d.call(this,h,e),j.queueFilter&&!j.queueFilter(h)||(j.offlineQueue.push({ts:Date.now(),query:h,cb:e}),j.emitEvent("offlineQueuePush",{query:h,cb:e}))),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(b.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+b.toString());this.eventListeners[a].listeners=[]}else b.forEach(function(a){c.eventListeners[a].listeners=[]})},Kuzzle.prototype.removeListener=function(a,b){var c=Object.keys(this.eventListeners),d=this;if(c.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+c.toString());this.eventListeners[a].listeners.forEach(function(c,e){c.id===b&&d.eventListeners[a].listeners.splice(e,1)})},Kuzzle.prototype.replayQueue=function(){return"offline"===this.state||this.autoReplay||(d.call(this),g.call(this)),this},Kuzzle.prototype.setDefaultIndex=function(a){if("string"!=typeof a)throw new Error("Invalid default index: ["+a+"] (an index name is expected)");if(0===a.length)throw new Error("Cannot set an empty index as the default index");return this.defaultIndex=a,this},Kuzzle.prototype.setHeaders=function(a,b){var c=this;if("object"!=typeof a||Array.isArray(a))throw new Error("Expected a content object, received a "+typeof a);return b?c.headers=a:Object.keys(a).forEach(function(b){c.headers[b]=a[b]}),c},Kuzzle.prototype.startQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!0),this},Kuzzle.prototype.stopQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!1),this}}).call(this,a("_process"))},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./networkWrapper":9,"./security/kuzzleSecurity":14,"./security/kuzzleUser":16,_process:1,"node-uuid":2}],4:[function(a,b,c){function d(a,b,c){if(!b||!c)throw new Error("The KuzzleDataCollection object constructor needs an index and a collection arguments");return Object.defineProperties(this,{collection:{value:c,enumerable:!0},index:{value:b,enumerable:!0},kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),Object.defineProperty(this,"buildQueryArgs",{value:function(a,b){return{controller:a,action:b,collection:this.collection,index:this.index}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["publishMessage","setHeaders","subscribe"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleDocument"),f=a("./kuzzleDataMapping"),g=a("./kuzzleRoom");d.prototype.advancedSearch=function(a,b,c){var d,f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.advancedSearch",c),d=f.kuzzle.addHeaders({body:a},this.headers),f.kuzzle.query(this.buildQueryArgs("read","search"),d,b,function(a,b){var d=[];return a?c(a):(b.result.hits.forEach(function(a){var b=new e(f,a._id,a._source);b.version=a._version,d.push(b)}),void c(null,{total:b.result.total,documents:d}))}),this},d.prototype.count=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.count",c),d=this.kuzzle.addHeaders({body:a},this.headers),this.kuzzle.query(this.buildQueryArgs("read","count"),d,b,function(a,b){return a?c(a):void c(null,b.result.count)}),this},d.prototype.create=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","createCollection"),c,a,b),this},d.prototype.createDocument=function(a,b,c,d){var f=this,g={},h="create";return a&&"string"!=typeof a&&(d=c,c=b,b=a,a=null),d||"function"!=typeof c||(d=c,c=null),b instanceof e?g=b.serialize():g.body=b,c&&(h=c.updateIfExist?"createOrReplace":"create"),a&&(g._id=a),g=f.kuzzle.addHeaders(g,f.headers),d?f.kuzzle.query(this.buildQueryArgs("write",h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write",h),g,c),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};"string"==typeof a?(e._id=a,d="delete"):(e.body=a,d="deleteByQuery"),c||"function"!=typeof b||(c=b,b=null),e=this.kuzzle.addHeaders(e,this.headers),c?this.kuzzle.query(this.buildQueryArgs("write",d),e,b,function(a,b){return a?c(a):void("delete"===d?c(null,[b.result._id]):c(null,b.result.ids))}):this.kuzzle.query(this.buildQueryArgs("write",d),e,b)},d.prototype.fetchDocument=function(a,b,c){var d={_id:a},f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.fetch",c),d=f.kuzzle.addHeaders(d,this.headers),f.kuzzle.query(this.buildQueryArgs("read","get"),d,b,function(a,b){var d;return a?c(a):(d=new e(f,b.result._id,b.result._source),d.version=b.result._version,void c(null,d))}),this},d.prototype.fetchAllDocuments=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),a&&(a.from&&(c.from=a.from),a.size&&(c.size=a.size)),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch(c,a,b),this},d.prototype.getMapping=function(a,b){var c;return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.getMapping",b),c=new f(this),c.refresh(a,b),this},d.prototype.publishMessage=function(a,b,c){var d={};return a instanceof e?d=a.serialize():d.body=a,d=this.kuzzle.addHeaders(d,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),d,b,c),this},d.prototype.replaceDocument=function(a,b,c,d){var f=this,g={_id:a,body:b};return d||"function"!=typeof c||(d=c,c=null),g=f.kuzzle.addHeaders(g,this.headers),d?f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c),this},d.prototype.subscribe=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.subscribe",c),d=new g(this,b),d.renew(a,c)},d.prototype.truncate=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("admin","truncateCollection"),c,a,b),this},d.prototype.updateDocument=function(a,b,c,d){var f={_id:a,body:b},g=this;return d||"function"!=typeof c||(d=c,c=null),f=g.kuzzle.addHeaders(f,this.headers),d?g.kuzzle.query(this.buildQueryArgs("write","update"),f,c,function(a,b){var c;return a?d(a):(c=new e(g,b.result._id),void c.refresh(d))}):g.kuzzle.query(this.buildQueryArgs("write","update"),f,c),g},d.prototype.documentFactory=function(a,b){return new e(this,a,b)},d.prototype.roomFactory=function(a){return new g(this,a)},d.prototype.dataMappingFactory=function(a){return new f(this,a)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"./kuzzleDataMapping":5,"./kuzzleDocument":6,"./kuzzleRoom":8}],5:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},mapping:{value:b||{},enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["set","setHeaders"];return d&&e.indexOf(a)===-1}}):this}d.prototype.apply=function(a,b){var c=this,d=this.kuzzle.addHeaders({body:{properties:this.mapping}},this.headers);return b||"function"!=typeof a||(b=a,a=null),c.kuzzle.query(this.collection.buildQueryArgs("admin","updateMapping"),d,a,function(d){return d?!!b&&b(d):void c.refresh(a,b)}),this},d.prototype.refresh=function(a,b){var c=this,d=this.kuzzle.addHeaders({},this.headers);return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.query(this.collection.buildQueryArgs("admin","getMapping"),d,a,function(a,d){return a?!!b&&b(a):d.result[c.collection.index]?d.result[c.collection.index].mappings[c.collection.collection]?(c.mapping=d.result[c.collection.index].mappings[c.collection.collection].properties,void 0===c.mapping&&(c.mapping={}),void(b&&b(null,c))):!!b&&b(new Error("No mapping found for collection "+c.collection.collection)):!!b&&b(new Error("No mapping found for index "+c.collection.index))}),this},d.prototype.set=function(a,b){return this.mapping[a]=b,this},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],6:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{collection:{value:a.collection,enumerable:!0},dataCollection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},id:{value:void 0,enumerable:!0,writable:!0},content:{value:{},writable:!0,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},version:{value:void 0,enumerable:!0,writable:!0}}),!c&&b&&"object"==typeof b&&(c=b,b=null),c&&(c._version&&(this.version=c._version,delete c._version),this.setContent(c,!0)),b&&Object.defineProperty(this,"id",{value:b,enumerable:!0}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","refresh","save"];return d&&e.indexOf(a)!==-1}}):this}d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a._version=this.version,a=this.kuzzle.addHeaders(a,this.headers)},d.prototype.toString=function(){return JSON.stringify(this.serialize())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a,function(a){return a?b(a):void b(null,c.id)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a)},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");this.kuzzle.callbackRequired("KuzzleDocument.refresh",b),c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,e){var f;return a?b(a):(f=new d(c.dataCollection,c.id,e.result._source),f.version=e.result._version,void b(null,f))})},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?!!b&&b(a):(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.serialize();return this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this},d.prototype.setContent=function(a,b){var c=this;return b?this.content=a:Object.keys(a).forEach(function(b){c.content[b]=a[b]}),this},d.prototype.subscribe=function(a,b){var c;if(a&&!b&&"function"==typeof a&&(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDocument.subscribe",b),!this.id)throw new Error("KuzzleDocument.subscribe: cannot subscribe to a document if no ID has been provided");return c={ids:{values:[this.id]}},this.dataCollection.subscribe(c,a,b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],7:[function(a,b,c){function d(a){return Object.defineProperties(this,{kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),this.setHeaders=a.setHeaders.bind(this),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["setHeaders"];return d&&e.indexOf(a)===-1}}):this}!function(){var a=["id","value"],b=["id","keys"],c={append:a,bgrewriteaof:[],bgsave:[],bitcount:["id","start","end"],bitop:["operation","destkey",b],bitpos:["id","bit",{__opts__:["start","end"]}],blpop:[b,"timeout"],brpoplpush:["source","destination"],dbsize:[],decrby:a,del:[b],discard:[],exec:[],exists:[b],expire:["id","seconds"],expireat:["id","timestamp"],flushdb:[],getbit:["id","offset"],getrange:["id","start","end"],hdel:["id",["field","fields"]],hexists:["id","field"],hincrby:["id","field","value"],hmset:["id","values"],hset:["id","field","value"],info:["section"],keys:["pattern"],lastsave:[],lindex:["id","idx"],linsert:["id","position","pivot","value"],lpush:["id",["value","values"]],lrange:["id","start","stop"],lrem:["id","count","value"],lset:["id","idx","value"],ltrim:["id","start","stop"],mset:["values"],multi:[],object:["subcommand","args"],pexpire:["id","milliseconds"],pexpireat:["id","timestamp"],pfadd:["id",["element","elements"]],pfmerge:["destkey",["sourcekey","sourcekeys"]],ping:[],psetex:["id","milliseconds","value"],publish:["channel","message"],randomkey:[],rename:["id","newkey"],renamenx:["id","newkey"],restore:["id","ttl","content"],rpoplpush:["source","destination"],sadd:["id",["member","members"]],save:[],set:["id","value",{__opts__:["ex","px","nx","xx"]}],sdiffstore:["destination",b],setbit:["id","offset","value"],setex:["id","seconds","value"],setrange:["id","offset","value"], +sinterstore:["destination",b],sismember:["id","member"],smove:["id","destination","member"],sort:["id",{__opts__:["by","offset","count","get","direction","alpha","store"]}],spop:["id","count"],srem:["id",["member","members"]],sunionstore:["destination",b],unwatch:[],wait:["numslaves","timeout"],zadd:["id",{__opts__:["nx","xx","ch","incr","score","member","members"]}],zcount:["id","min","max"],zincrby:["id","value","member"],zinterstore:["destination",b,{__opts__:["weight","weights","aggregate"]}],zlexcount:["id","min","max"],zrange:["id","start","stop",{__opts__:["withscores"]}],zrangebylex:["id","min","max",{__opts__:["offset","count"]}],zrangebyscore:["id","min","max",{__opts__:["withscores","offset","count"]}],zrem:["id","member"],zremrangebylex:["id","min","max"],zremrangebyscore:["id","min","max"],zrevrangebylex:["id","max","min",{__opts__:["offset","count"]}],zrevrangebyscore:["id","max","min",{__opts__:["withscores","offset","count"]}],zrevrank:["id","member"]};c.decr=c.get=c.dump=c.hgetall=c.hkeys=c.hlen=c.hstrlen=c.hvals=c.incr=c.llen=c.lpop=c.persist=c.pttl=c.rpop=c.scard=c.smembers=c.strlen=c.ttl=c.type=c.zcard=["id"],c.getset=c.lpushx=a,c.del=c.exists=c.mget=c.pfcount=c.sdiff=c.sinter=c.sunion=c.watch=[b],c.incrby=c.incrbyfloat=c.decrby,c.brpop=c.blpop,c.hget=c.hexists,c.hmget=c.hdel,c.hsetnx=c.hset,c.msetnx=c.mset,c.rpush=c.lpush,c.hincrbyfloat=c.hincrby,c.srandmember=c.spop,c.zrevrange=c.zrange,c.zscore=c.zrevrank,Object.keys(c).forEach(function(a){d.prototype[a]=function(){var b,d=Array.prototype.slice.call(arguments),e=null,f={controller:"ms",action:a},g={};return"function"==typeof d[d.length-1]&&(b=d.pop()),d.length&&"object"==typeof d[d.length-1]&&1===Object.keys(d[d.length-1]).length&&void 0!==d[d.length-1].queuable&&(e=d.pop()),c[a].forEach(function(a,b){void 0!==d[b]&&(Array.isArray(a)&&(a=Array.isArray(d[b])?a[1]:a[0]),"id"===a?g._id=d[b]:(g.body||(g.body={}),"object"==typeof a&&void 0!==a.__opts__?a.__opts__.forEach(function(a){void 0!==d[b][a]&&(g.body[a]=d[b][a])}):g.body[a]=d[b]))}),this.kuzzle.query(f,g,e,b),this}})}(),b.exports=d},{}],8:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:h.v4()},lastRenewal:{value:null,writable:!0},notifier:{value:null,writable:!0},queue:{value:[],writable:!0},renewalDelay:{value:500},scope:{value:b&&b.scope?b.scope:"all"},state:{value:b&&b.state?b.state:"done"},subscribing:{value:!1,writable:!0},users:{value:b&&b.users?b.users:"none"},collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},filters:{value:null,enumerable:!0,writable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},metadata:{value:b&&b.metadata?b.metadata:{},enumerable:!0,writable:!0},roomId:{value:null,enumerable:!0,writable:!0},subscribeToSelf:{value:!b||"boolean"!=typeof b.subscribeToSelf||b.subscribeToSelf,enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["count"];return d&&e.indexOf(a)!==-1}}):this}function e(a){return a.error?this.callback(a.error):"jwtTokenExpired"===a.action?(this.kuzzle.jwtToken=void 0,this.kuzzle.emitEvent("jwtTokenExpired")):void(this.kuzzle.requestHistory[a.requestId]?(this.subscribeToSelf&&this.callback(null,a),delete this.kuzzle.requestHistory[a.requestId]):this.callback(null,a))}function f(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}function g(){return"connected"===this.kuzzle.state&&!this.subscribing}var h=a("node-uuid");d.prototype.count=function(a){var b;if(this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),!g.call(this))return this.queue.push({action:"count",args:[a]}),this;if(!this.roomId)throw new Error("KuzzleRoom.count: cannot count subscriptions on an inactive room");return this.kuzzle.query(this.collection.buildQueryArgs("subscribe","count"),b,function(b,c){return b?a(b):void a(null,c.result.count)}),this},d.prototype.renew=function(a,b){var c=Date.now(),d={scope:this.scope,state:this.state,users:this.users},g=this;return!b&&a&&"function"==typeof a&&(b=a,a=null),g.kuzzle.callbackRequired("KuzzleRoom.renew",b),g.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(a&&(g.filters=a),"connected"!==g.kuzzle.state?(g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,g):g.subscribing?(g.queue.push({action:"renew",args:[a,b]}),g):(g.unsubscribe(),g.roomId=null,g.subscribing=!0,g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,d.body=g.filters,d=g.kuzzle.addHeaders(d,this.headers),g.kuzzle.query(g.collection.buildQueryArgs("subscribe","on"),d,{metadata:g.metadata},function(a,b){if(delete g.kuzzle.subscriptions.pending[g.id],g.subscribing=!1,a)throw g.queue=[],new Error("Error during Kuzzle subscription: "+a.message);g.lastRenewal=c,g.roomId=b.result.roomId,g.channel=b.result.channel,g.kuzzle.subscriptions[g.roomId]||(g.kuzzle.subscriptions[g.roomId]={}),g.kuzzle.subscriptions[g.roomId][g.id]=g,g.notifier=e.bind(g),g.kuzzle.network.on(g.channel,g.notifier),f.call(g)}),g))},d.prototype.unsubscribe=function(){var a,b=this,c=b.roomId;return g.call(this)?(c&&(b.kuzzle.network.off(b.channel,this.notifier),1===Object.keys(b.kuzzle.subscriptions[c]).length?(delete b.kuzzle.subscriptions[c],0===Object.keys(b.kuzzle.subscriptions.pending).length?b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}):a=setInterval(function(){0===Object.keys(b.kuzzle.subscriptions.pending).length&&(b.kuzzle.subscriptions[c]||b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}),clearInterval(a))},100)):delete b.kuzzle.subscriptions[c][b.id],b.roomId=null),b):(b.queue.push({action:"unsubscribe",args:[]}),b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":2}],9:[function(a,b,c){function d(b,c,d){if("undefined"!=typeof window){if("undefined"!=typeof WebSocket)return new(a("./wrappers/wsbrowsers"))(b,c);if(window.io)return new(a("./wrappers/socketio"))(b,d);throw new Error("Aborting: no websocket support detected and no socket.io library loaded either.")}return new(a("./wrappers/wsnode"))(b,c)}b.exports=d},{"./wrappers/socketio":10,"./wrappers/wsbrowsers":11,"./wrappers/wsnode":void 0}],10:[function(a,b,c){function d(a,b){this.address=a,this.port=b,this.socket=null,this.connect=function(a,b){this.socket=window.io("http://"+this.address+":"+this.port,{reconnection:a,reconnectionDelay:b,forceNew:!0})},this.onConnect=function(a){this.socket.on("connect",a)},this.onConnectError=function(a){this.socket.on("connect_error",a)},this.onDisconnect=function(a){this.socket.on("disconnect",a)},this.onReconnect=function(a){this.socket.on("reconnect",a)},this.once=function(a,b){this.socket.once(a,b)},this.on=function(a,b){this.socket.on(a,b)},this.off=function(a,b){this.socket.off(a,b)},this.send=function(a){this.socket.emit("kuzzle",a)},this.close=function(){this.socket.close(),this.socket=null}}b.exports=d},{}],11:[function(a,b,c){function d(a,b){var c=this;this.address=a,this.port=b,this.client=null,this.retrying=!1,this.listeners={error:[],connect:[],disconnect:[],reconnect:[]},this.connect=function(a,b){this.client=new WebSocket("ws://"+this.address+":"+this.port),this.client.onopen=function(){c.retrying?e(c.listeners,"reconnect"):e(c.listeners,"connect")},this.client.onclose=function(){e(c.listeners,"disconnect")},this.client.onerror=function(){a&&(c.retrying=!0,setTimeout(function(){c.connect(a,b)},b)),e(c.listeners,"error")},this.client.onmessage=function(a){var b=JSON.parse(a.data);b.room&&c.listeners[b.room]&&e(c.listeners,b.room,b)}},this.onConnect=function(a){this.listeners.connect.push({fn:a,keep:!0})},this.onConnectError=function(a){this.listeners.error.push({fn:a,keep:!0})},this.onDisconnect=function(a){this.listeners.disconnect.push({fn:a,keep:!0})},this.onReconnect=function(a){this.listeners.reconnect.push({fn:a,keep:!0})},this.once=function(a,b){this.listeners[a]||(this.listeners[a]=[]),this.listeners[a].push({fn:b,keep:!1})},this.on=function(a,b){this.listeners[a]||(this.listeners[a]=[]),this.listeners[a].push({fn:b,keep:!0})},this.off=function(a,b){var c;this.listeners[a]&&(c=this.listeners[a].findIndex(function(a){return a.fn===b}),c!==-1&&(1===this.listeners[a].length?delete this.listeners[a]:this.listeners[a].splice(c,1)))},this.send=function(a){this.client&&this.client.readyState===this.client.OPEN&&this.client.send(JSON.stringify(a))},this.close=function(){this.listeners={error:[],connect:[],disconnect:[],reconnect:[]},this.retrying=!1,this.client.close(),this.client=null}}function e(a,b,c){var d,e=a[b].length;for(d=0;d1?(a[b].splice(d,1),--d,--e):delete a[b])}b.exports=d},{}],12:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"},updateActionName:{value:"updateProfile"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c,d=this;if(!this.content.policies)throw new Error('Argument "policies" is mandatory in a profile. This argument contains an array of objects.');return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c=this.serialize(),d.kuzzle.query(d.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.addPolicy=function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an object containing at least a "roleId" member which must be a string.');return this.content.policies||(this.content.policies=[]),this.content.policies.push(a),this},d.prototype.setPolicies=function(a){if(!Array.isArray(a))throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string');return a.map(function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string')}),this.content.policies=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getPolicies=function(){return this.content.policies},b.exports=d},{"./kuzzleSecurityDocument":15}],13:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"},updateActionName:{value:"updateRole"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c=this.serialize(),d=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))})},b.exports=d},{"./kuzzleSecurityDocument":15}],14:[function(a,b,c){function d(a){return Object.defineProperty(this,"kuzzle",{value:a}),Object.defineProperty(this,"buildQueryArgs",{value:function(a){return{controller:"security",action:a}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["roleFactory","profileFactory","userFactory","isActionAllowed"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b,c){var d,f=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},f.kuzzle.callbackRequired("KuzzleSecurity.getRole",c),f.kuzzle.query(this.buildQueryArgs("getRole"),d,b,function(a,b){return a?c(a):void c(null,new e(f,b.result._id,b.result._source))})},d.prototype.searchRoles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",c),d.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},b,function(a,b){var f;return a?c(a):(f=b.result.hits.map(function(a){return new e(d,a._id,a._source)}),void c(null,{total:b.result.total,roles:f}))})},d.prototype.createRole=function(a,b,c,d){var f=this,g={},h="createRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createRole: cannot create a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceRole":"createRole"),d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),void d(null,c))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateRole=function(a,b,c,d){var f=this,g={},h="updateRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateRole: cannot update a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(c){return c?d(c):void d(null,new e(f,a,b))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteRole=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this;if(c||"function"!=typeof b||(c=b,b=null),!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,b,function(a,b){return a?c(a):void c(null,new f(e,b.result._id,b.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new f(d,a._id,a._source)}),void c(null,{total:b.result.total,profiles:e}))})},d.prototype.createProfile=function(a,b,c,d){var e=this,g={},h="createProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createProfile: cannot create a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceProfile":"createProfile"),d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new f(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateProfile=function(a,b,c,d){var e=this,g={},h="updateProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateProfile: cannot update a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c={};return a?d(a):(Object.keys(b.result._source).forEach(function(a){c[a]=b.result._source[a]}),void d(null,new f(e,b.result._id,c)))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteProfile=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b,c){var d,e=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getUser",c),e.kuzzle.query(this.buildQueryArgs("getUser"),d,b,function(a,b){return a?c(a):void c(null,new g(e,b.result._id,b.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new g(d,a._id,a._source)}),void c(null,{total:b.result.total,users:e}))})},d.prototype.createUser=function(a,b,c,d){var e=this,f={},h="createUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createUser: cannot create a user without a user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,c&&(h=c.replaceIfExist?"createOrReplaceUser":"createUser"),d?e.kuzzle.query(this.buildQueryArgs(h),f,null,function(a,b){var c;return a?d(a):(c=new g(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),f)},d.prototype.updateUser=function(a,b,c,d){var e=this,f={},h="updateUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateUser: cannot update an user without an user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),f,c,function(a,b){return a?d(a):void d(null,new g(e,b.result._id,b.result._source))}):e.kuzzle.query(this.buildQueryArgs(h),f,c)},d.prototype.deleteUser=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},d.prototype.isActionAllowed=function(a,b,c,d,e){var f;if(!a||"object"!=typeof a)throw new Error("rights parameter is mandatory for isActionAllowed function");if(!b||"string"!=typeof b)throw new Error("controller parameter is mandatory for isActionAllowed function");if(!c||"string"!=typeof c)throw new Error("action parameter is mandatory for isActionAllowed function");return f=a.filter(function(a){return a.controller===b||"*"===a.controller}).filter(function(a){return a.action===c||"*"===a.action}).filter(function(a){return a.index===d||"*"===a.index}).filter(function(a){return a.collection===e||"*"===a.collection}),f.some(function(a){return"allowed"===a.value})?"allowed":f.some(function(a){return"conditional"===a.value})?"conditional":"denied"},d.prototype.getUserRights=function(a,b,c){var d={_id:a},e=this;if(!a||"string"!=typeof a)throw new Error("userId parameter is mandatory for getUserRights function");c||"function"!=typeof b||(c=b,b=null),e.kuzzle.callbackRequired("Kuzzle.getUserRights",c),this.kuzzle.query(this.buildQueryArgs("getUserRights"),d,b,function(a,b){return a?c(a):void c(null,b.result.hits)})},b.exports=d},{"./kuzzleProfile":12,"./kuzzleRole":13,"./kuzzleUser":16}],15:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");if(Object.defineProperties(this,{kuzzle:{value:a.kuzzle},kuzzleSecurity:{value:a},id:{value:b,enumerable:!0},content:{value:{},writable:!0,enumerable:!0}}),c&&this.setContent(c,!0),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","update"];return d&&e.indexOf(a)!==-1}})}d.prototype.setContent=function(a){return this.content=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype["delete"]=function(a,b){var c=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},a,function(a,c){return a?!!b&&b(a):void(b&&b(null,c.result._id))})},d.prototype.update=function(a,b,c){var d={},e=this;if("object"!=typeof a)throw new Error('Parameter "content" must be a object');b&&void 0===c&&"function"==typeof b&&(c=b,b=null),d._id=e.id,d.body=a,e.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.updateActionName),d,b,function(a,b){return a?!!c&&c(a):(e.setContent(b.result._source),void(c&&c(null,e)))})},b.exports=d},{}],16:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"},updateActionName:{value:"updateUser"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.setProfiles=function(a){if(!Array.isArray(a)||"string"!=typeof a[0])throw new Error('Parameter "profilesIds" must be an array of strings');return this.content.profilesIds=a,this},d.prototype.addProfile=function(a){if("string"!=typeof a)throw new Error('Parameter "profileId" must be a string');return this.content.profilesIds||(this.content.profilesIds=[]),this.content.profilesIds.indexOf(a)===-1&&this.content.profilesIds.push(a),this},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getProfiles=function(){return this.content.profilesIds},b.exports=d},{"./kuzzleSecurityDocument":15}]},{},[3]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index b3929288d..5e4340998 100644 --- a/dist/kuzzle.min.map +++ b/dist/kuzzle.min.map @@ -1 +1 @@ -{"version":3,"sources":["kuzzle.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_window","setupBrowser","_crypto","crypto","msCrypto","_rng","getRandomValues","_rnds8","Uint8Array","_whatwgRNG","_rnds","Array","_mathRNG","Math","random","console","warn","setupNode","_rb","randomBytes","_nodeRNG","parse","buf","offset","ii","toLowerCase","replace","oct","_hexToByte","unparse","bth","_byteToHex","v1","options","b","clockseq","_clockseq","msecs","Date","getTime","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","node","_nodeId","v4","BufferClass","rnds","rng","_previousRoot","Buffer","toString","substr","_seedBytes","uuid","define","amd","noConflict","window","2","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","cachedSetTimeout","len","run","cachedClearTimeout","Item","fun","array","this","noop","process","setTimeout","clearTimeout","nextTick","args","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask","3","cleanQueue","self","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","droppedRequest","emitEvent","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","requestId","response","action","error","message","requestHistory","Object","keys","key","dequeue","additionalQueue","uniqueQueue","dequeuingProcess","shift","max","replayInterval","queuing","offlineQueueLoader","isArray","filter","controller","hasOwnProperty","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","KuzzleMemoryStorage","KuzzleUser","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","loginAttempt","offlineQueuePush","offlineQueuePop","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","slice","eventProperties","listener","fn","connect","bluebird","promisifyAll","suffix","func","target","passes","whitelist","indexOf","reconnection","forceNew","connectionError","internal","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","success","result","jwt","JSON","stringify","getJwtToken","login","strategy","credentials","expiresIn","body","queuable","logout","callbackRequired","whoAmI","security","_id","_source","getMyRights","hits","updateSelf","content","data","queryArgs","listenerId","knownEvents","listenerType","isValid","id","getAllStatistics","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","refreshIndex","getAutoRefresh","setAutoRefresh","autoRefresh","attr","object","meta","addHeaders","authorization","eventName","replayQueue","setDefaultIndex","setHeaders","startQueuing","stopQueuing","./kuzzleDataCollection","./kuzzleMemoryStorage","./security/kuzzleSecurity","./security/kuzzleUser","_process","node-uuid","socket.io-client","4","kuzzle","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_version","total","count","create","createDocument","document","serialize","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","from","size","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom","5","kuzzleDataCollection","properties","mappings","set","field","6","dataCollection","setContent","save","publish","values","7","bind","keyVal","idOrKeys","commands","append","bgrewriteaof","bgsave","bitcount","bitop","bitpos","__opts__","blpop","brpoplpush","dbsize","decrby","del","discard","exec","exists","expire","expireat","flushdb","getbit","getrange","hdel","hexists","hincrby","hmset","hset","info","lastsave","lindex","linsert","lpush","lrange","lrem","lset","ltrim","mset","multi","pexpire","pexpireat","pfadd","pfmerge","ping","psetex","randomkey","rename","renamenx","restore","rpoplpush","sadd","sdiffstore","setbit","setex","setrange","sinterstore","sismember","smove","sort","spop","srem","sunionstore","unwatch","wait","zadd","zcount","zincrby","zinterstore","zlexcount","zrange","zrangebylex","zrangebyscore","zrem","zremrangebylex","zremrangebyscore","zrevrangebylex","zrevrangebyscore","zrevrank","decr","get","dump","hgetall","hkeys","hlen","hstrlen","hvals","incr","llen","lpop","persist","pttl","rpop","scard","smembers","strlen","ttl","zcard","getset","lpushx","mget","pfcount","sdiff","sinter","sunion","watch","incrby","incrbyfloat","brpop","hget","hmget","hsetnx","msetnx","rpush","hincrbyfloat","srandmember","zrevrange","zscore","command","pop","v","8","channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","isReady","subscribeQuery","unsubscribe","interval","setInterval","clearInterval","9","KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","updateActionName","constructor","policies","addPolicy","policy","roleId","setPolicies","map","getPolicies","./kuzzleSecurityDocument","10","KuzzleRole","11","getRole","searchRoles","roles","createRole","replaceIfExist","updateRole","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","updateProfile","updatedContent","property","deleteProfile","profileFactory","getUser","searchUsers","createUser","updateUser","deleteUser","userFactory","isActionAllowed","rights","filteredRights","right","some","item","getUserRights","userId","./kuzzleProfile","./kuzzleRole","./kuzzleUser","12","update","13","setProfiles","profilesIds","addProfile","profileId","getProfiles"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file +{"version":3,"sources":["kuzzle.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","cachedSetTimeout","len","run","cachedClearTimeout","Item","fun","array","this","noop","process","setTimeout","clearTimeout","nextTick","args","Array","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask","2","_window","setupBrowser","_crypto","crypto","msCrypto","_rng","getRandomValues","_rnds8","Uint8Array","_whatwgRNG","_rnds","_mathRNG","Math","random","console","warn","setupNode","_rb","randomBytes","_nodeRNG","parse","buf","offset","ii","toLowerCase","replace","oct","_hexToByte","unparse","bth","_byteToHex","v1","options","b","clockseq","_clockseq","msecs","Date","getTime","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","node","_nodeId","v4","BufferClass","rnds","rng","_previousRoot","Buffer","toString","substr","_seedBytes","uuid","define","amd","noConflict","window","3","cleanQueue","self","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","droppedRequest","emitEvent","queueMaxSize","cleanHistory","requestHistory","Object","keys","key","emitRequest","request","cb","undefined","jwtToken","network","requestId","response","action","error","message","send","dequeue","additionalQueue","uniqueQueue","dequeuingProcess","shift","max","replayInterval","queuing","offlineQueueLoader","isArray","filter","controller","hasOwnProperty","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","KuzzleMemoryStorage","KuzzleUser","networkWrapper","Kuzzle","address","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","loginAttempt","offlineQueuePush","offlineQueuePop","eventTimeout","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","wsPort","ioPort","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","slice","eventProperties","listener","fn","connect","bluebird","promisifyAll","suffix","func","target","passes","whitelist","indexOf","onConnect","onConnectError","connectionError","internal","onDisconnect","disconnect","onReconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","success","result","jwt","JSON","stringify","getJwtToken","login","strategy","credentials","expiresIn","body","queuable","logout","callbackRequired","whoAmI","security","_id","_source","getMyRights","hits","updateSelf","content","data","queryArgs","listenerId","knownEvents","listenerType","isValid","id","getAllStatistics","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","refreshIndex","getAutoRefresh","setAutoRefresh","autoRefresh","attr","object","meta","addHeaders","authorization","eventName","replayQueue","setDefaultIndex","setHeaders","startQueuing","stopQueuing","./kuzzleDataCollection","./kuzzleMemoryStorage","./networkWrapper","./security/kuzzleSecurity","./security/kuzzleUser","_process","node-uuid","4","kuzzle","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_version","total","count","create","createDocument","document","serialize","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","from","size","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom","5","kuzzleDataCollection","properties","mappings","set","field","6","dataCollection","setContent","save","publish","values","7","bind","keyVal","idOrKeys","commands","append","bgrewriteaof","bgsave","bitcount","bitop","bitpos","__opts__","blpop","brpoplpush","dbsize","decrby","del","discard","exec","exists","expire","expireat","flushdb","getbit","getrange","hdel","hexists","hincrby","hmset","hset","info","lastsave","lindex","linsert","lpush","lrange","lrem","lset","ltrim","mset","multi","pexpire","pexpireat","pfadd","pfmerge","ping","psetex","randomkey","rename","renamenx","restore","rpoplpush","sadd","sdiffstore","setbit","setex","setrange","sinterstore","sismember","smove","sort","spop","srem","sunionstore","unwatch","wait","zadd","zcount","zincrby","zinterstore","zlexcount","zrange","zrangebylex","zrangebyscore","zrem","zremrangebylex","zremrangebyscore","zrevrangebylex","zrevrangebyscore","zrevrank","decr","get","dump","hgetall","hkeys","hlen","hstrlen","hvals","incr","llen","lpop","persist","pttl","rpop","scard","smembers","strlen","ttl","zcard","getset","lpushx","mget","pfcount","sdiff","sinter","sunion","watch","incrby","incrbyfloat","brpop","hget","hmget","hsetnx","msetnx","rpush","hincrbyfloat","srandmember","zrevrange","zscore","command","pop","v","8","channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","isReady","subscribeQuery","unsubscribe","interval","setInterval","clearInterval","9","WebSocket","io","./wrappers/socketio","./wrappers/wsbrowsers","./wrappers/wsnode","10","SocketIO","port","socket","reconnection","forceNew","payload","11","WSBrowsers","client","retrying","onopen","poke","onclose","onerror","onmessage","keep","findIndex","readyState","OPEN","12","KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","updateActionName","constructor","policies","addPolicy","policy","roleId","setPolicies","map","getPolicies","./kuzzleSecurityDocument","13","KuzzleRole","14","getRole","searchRoles","roles","createRole","replaceIfExist","updateRole","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","updateProfile","updatedContent","property","deleteProfile","profileFactory","getUser","searchUsers","createUser","updateUser","deleteUser","userFactory","isActionAllowed","rights","filteredRights","right","some","item","getUserRights","userId","./kuzzleProfile","./kuzzleRole","./kuzzleUser","15","update","16","setProfiles","profilesIds","addProfile","profileId","getProfiles"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file diff --git a/package.json b/package.json index 2a26a5a2e..c11864f40 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kuzzle-sdk", - "version": "1.10.0", + "version": "2.0.0", "description": "Official Javascript SDK for Kuzzle", "author": "The Kuzzle Team ", "repository": { @@ -25,8 +25,10 @@ "license": "Apache-2.0", "dependencies": { "bluebird": "3.4.1", + "bufferutil": "^1.2.1", "node-uuid": "1.4.7", - "socket.io-client": "1.4.8" + "utf-8-validate": "^1.2.1", + "ws": "^1.1.1" }, "devDependencies": { "browserify": "13.0.1", @@ -41,6 +43,6 @@ "proxyquire": "^1.7.3", "rewire": "^2.5.0", "should": "9.0.2", - "sinon": "^1.17.4" + "sinon": "^1.17.5" } } diff --git a/src/kuzzle.js b/src/kuzzle.js index a8790a923..45af8ad97 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -3,30 +3,31 @@ var KuzzleDataCollection = require('./kuzzleDataCollection'), KuzzleSecurity = require('./security/kuzzleSecurity'), KuzzleMemoryStorage = require('./kuzzleMemoryStorage'), - KuzzleUser = require('./security/kuzzleUser'); + KuzzleUser = require('./security/kuzzleUser'), + networkWrapper = require('./networkWrapper'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ /** * Kuzzle object constructor. - * @param url - URL to the Kuzzle instance - * @param index - Database index + * + * @constructor + * @param host - Server name or IP Address to the Kuzzle instance * @param [options] - Connection options * @param {responseCallback} [cb] - Handles connection response * @constructor */ - -module.exports = Kuzzle = function (url, options, cb) { +module.exports = Kuzzle = function (host, options, cb) { var self = this; if (!(this instanceof Kuzzle)) { - return new Kuzzle(url, options, cb); + return new Kuzzle(host, options, cb); } if (!cb && typeof options === 'function') { @@ -34,8 +35,8 @@ module.exports = Kuzzle = function (url, options, cb) { options = null; } - if (!url || url === '') { - throw new Error('URL argument missing'); + if (!host || host === '') { + throw new Error('host argument missing'); } Object.defineProperties(this, { @@ -62,10 +63,6 @@ module.exports = Kuzzle = function (url, options, cb) { eventTimeout: { value: 200 }, - io: { - value: null, - writable: true - }, queuing: { value: false, writable: true @@ -74,10 +71,6 @@ module.exports = Kuzzle = function (url, options, cb) { value: {}, writable: true }, - socket: { - value: null, - writable: true - }, state: { value: 'initializing', writable: true @@ -114,8 +107,16 @@ module.exports = Kuzzle = function (url, options, cb) { value: (options && typeof options.reconnectionDelay === 'number') ? options.reconnectionDelay : 1000, enumerable: true }, - url: { - value: url, + host: { + value: host, + enumerable: true + }, + wsPort: { + value: (options && typeof options.wsPort === 'number') ? options.wsPort : 7513, + enumerable: true + }, + ioPort: { + value: (options && typeof options.ioPort === 'number') ? options.ioPort : 7512, enumerable: true }, autoQueue: { @@ -190,12 +191,6 @@ module.exports = Kuzzle = function (url, options, cb) { } }); - if (typeof window !== 'undefined' && window.io) { - this.io = window.io; - } else { - this.io = require('socket.io-client'); - } - if (options) { Object.keys(options).forEach(function (opt) { if (self.hasOwnProperty(opt) && Object.getOwnPropertyDescriptor(self, opt).writable) { @@ -290,6 +285,8 @@ module.exports = Kuzzle = function (url, options, cb) { this.state = 'ready'; } + cleanHistory(this.requestHistory); + if (this.bluebird) { return this.bluebird.promisifyAll(this, { suffix: 'Promise', @@ -302,17 +299,19 @@ module.exports = Kuzzle = function (url, options, cb) { } }); } - }; - /** - * Connects to a Kuzzle instance using the provided URL. + * Connects to a Kuzzle instance using the provided host name. * @returns {Object} this */ Kuzzle.prototype.connect = function () { var self = this; + if (!self.network) { + self.network = networkWrapper(self.host, self.wsPort, self.ioPort); + } + if (['initializing', 'ready', 'disconnected', 'error', 'offline'].indexOf(this.state) === -1) { if (self.connectCB) { self.connectCB(null, self); @@ -321,14 +320,9 @@ Kuzzle.prototype.connect = function () { } self.state = 'connecting'; + self.network.connect(self.autoReconnect, self.reconnectionDelay); - self.socket = self.io(self.url, { - reconnection: self.autoReconnect, - reconnectionDelay: self.reconnectionDelay, - forceNew: true - }); - - self.socket.once('connect', function () { + self.network.onConnect(function () { self.state = 'connected'; renewAllSubscriptions.call(self); dequeue.call(self); @@ -339,8 +333,8 @@ Kuzzle.prototype.connect = function () { } }); - self.socket.on('connect_error', function (error) { - var connectionError = new Error('Unable to connect to kuzzle server at "' + self.url + '"'); + self.network.onConnectError(function (error) { + var connectionError = new Error('Unable to connect to kuzzle server at "' + self.host + '"'); connectionError.internal = error; self.state = 'error'; @@ -351,7 +345,7 @@ Kuzzle.prototype.connect = function () { } }); - self.socket.on('disconnect', function () { + self.network.onDisconnect(function () { self.state = 'offline'; if (!self.autoReconnect) { @@ -365,7 +359,7 @@ Kuzzle.prototype.connect = function () { self.emitEvent('disconnected'); }); - self.socket.on('reconnect', function () { + self.network.onReconnect(function () { var reconnect = function () { // renew subscriptions if (self.autoResubscribe) { @@ -683,6 +677,25 @@ function cleanQueue () { } } + +/** + * Clean history from requests made more than 10s ago + */ +function cleanHistory (requestHistory) { + var + now = Date.now(); + + Object.keys(requestHistory).forEach(function (key) { + if (requestHistory[key] < now - 10000) { + delete requestHistory[key]; + } + }); + + setTimeout(function () { + cleanHistory(requestHistory); + }, 1000); +} + /** * Emit a request to Kuzzle * @@ -691,11 +704,10 @@ function cleanQueue () { */ function emitRequest (request, cb) { var - now = Date.now(), self = this; if (self.jwtToken !== undefined || cb) { - self.socket.once(request.requestId, function (response) { + self.network.once(request.requestId, function (response) { if (request.action !== 'logout' && response.error && response.error.message === 'Token expired') { self.jwtToken = undefined; self.emitEvent('jwtTokenExpired', request, cb); @@ -707,17 +719,10 @@ function emitRequest (request, cb) { }); } - self.socket.emit('kuzzle', request); + this.network.send(request); // Track requests made to allow KuzzleRoom.subscribeToSelf to work - self.requestHistory[request.requestId] = now; - - // Clean history from requests made more than 10s ago - Object.keys(self.requestHistory).forEach(function (key) { - if (self.requestHistory[key] < now - 10000) { - delete self.requestHistory[key]; - } - }); + self.requestHistory[request.requestId] = Date.now(); } /** @@ -807,7 +812,7 @@ Kuzzle.prototype.addListener = function(event, listener) { throw new Error('Invalid listener type: expected a function, got a ' + listenerType); } - listenerId = uuid.v1(); + listenerId = uuid.v4(); this.eventListeners[event].listeners.push({id: listenerId, fn: listener}); return listenerId; }; @@ -1030,8 +1035,7 @@ Kuzzle.prototype.disconnect = function () { this.logout(); this.state = 'disconnected'; - this.socket.close(); - this.socket = null; + this.network.close(); for (collection in this.collections) { if (this.collections.hasOwnProperty(collection)) { @@ -1263,6 +1267,10 @@ Kuzzle.prototype.query = function (queryArgs, query, options, cb) { } } + if (!query || typeof query !== 'object' || Array.isArray(query)) { + throw new Error('Invalid query parameter: ' + query); + } + if (query.metadata) { Object.keys(query.metadata).forEach(function (meta) { object.metadata[meta] = query.metadata[meta]; @@ -1441,3 +1449,5 @@ Kuzzle.prototype.stopQueuing = function () { return this; }; + + diff --git a/src/kuzzleDataCollection.js b/src/kuzzleDataCollection.js index e617c9811..bbb9bebfd 100644 --- a/src/kuzzleDataCollection.js +++ b/src/kuzzleDataCollection.js @@ -8,7 +8,7 @@ var * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ /** diff --git a/src/kuzzleDataMapping.js b/src/kuzzleDataMapping.js index 422cf7ddf..69d72c328 100644 --- a/src/kuzzleDataMapping.js +++ b/src/kuzzleDataMapping.js @@ -3,7 +3,7 @@ * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ diff --git a/src/kuzzleDocument.js b/src/kuzzleDocument.js index 3cb940e2e..f76006ad3 100644 --- a/src/kuzzleDocument.js +++ b/src/kuzzleDocument.js @@ -3,7 +3,7 @@ * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ /** diff --git a/src/kuzzleMemoryStorage.js b/src/kuzzleMemoryStorage.js index 1eceea89d..df8e7d497 100644 --- a/src/kuzzleMemoryStorage.js +++ b/src/kuzzleMemoryStorage.js @@ -3,7 +3,7 @@ * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ diff --git a/src/kuzzleRoom.js b/src/kuzzleRoom.js index 9a96d59de..6966607aa 100644 --- a/src/kuzzleRoom.js +++ b/src/kuzzleRoom.js @@ -6,7 +6,7 @@ var * * @callback responseCallback * @param {Object} err - Error object, NULL if the query is successful - * @param {Object} data - The content of the query response + * @param {Object} [data] - The content of the query response */ /** @@ -227,7 +227,7 @@ KuzzleRoom.prototype.renew = function (filters, cb) { self.kuzzle.subscriptions[self.roomId][self.id] = self; self.notifier = notificationCallback.bind(self); - self.kuzzle.socket.on(self.channel, self.notifier); + self.kuzzle.network.on(self.channel, self.notifier); dequeue.call(self); }); @@ -256,7 +256,7 @@ KuzzleRoom.prototype.unsubscribe = function () { } if (room) { - self.kuzzle.socket.off(self.channel, this.notifier); + self.kuzzle.network.off(self.channel, this.notifier); if (Object.keys(self.kuzzle.subscriptions[room]).length === 1) { delete self.kuzzle.subscriptions[room]; @@ -298,7 +298,7 @@ KuzzleRoom.prototype.setHeaders = function (content, replace) { }; /** - * Callback called by socket.io when a message is sent to the subscribed room ID + * Callback called by the network handler when a message is sent to the subscribed room ID * Calls the registered callback if the notification passes the subscription filters * * @param {object} data - data diff --git a/src/networkWrapper/index.js b/src/networkWrapper/index.js new file mode 100644 index 000000000..219bec563 --- /dev/null +++ b/src/networkWrapper/index.js @@ -0,0 +1,27 @@ +/** + * + * @param host + * @param wsPort + * @param ioPort + * @returns {Object} tnstantiated WebSocket/Socket.IO object + */ + +function network(host, wsPort, ioPort) { + // Web browser / NodeJS websocket handling + if (typeof window !== 'undefined') { + // use native websockets if the browser supports it + if (typeof WebSocket !== 'undefined') { + return new (require('./wrappers/wsbrowsers'))(host, wsPort); + } + // otherwise fallback to socket.io, if available + else if (window.io) { + return new (require('./wrappers/socketio'))(host, ioPort); + } + + throw new Error('Aborting: no websocket support detected and no socket.io library loaded either.'); + } + + return new (require('./wrappers/wsnode'))(host, wsPort); +} + +module.exports = network; diff --git a/src/networkWrapper/wrappers/socketio.js b/src/networkWrapper/wrappers/socketio.js new file mode 100644 index 000000000..c2306c1f6 --- /dev/null +++ b/src/networkWrapper/wrappers/socketio.js @@ -0,0 +1,104 @@ +function SocketIO(host, port) { + this.host = host; + this.port = port; + this.socket = null; + + /** + * Creates a new socket from the provided arguments + * + * @constructor + * @param {boolean} autoReconnect + * @param {int} reconnectionDelay + */ + this.connect = function (autoReconnect, reconnectionDelay) { + this.socket = window.io('http://' + this.host + ':' + this.port, { + reconnection: autoReconnect, + reconnectionDelay: reconnectionDelay, + forceNew: true + }); + }; + + /** + * Fires the provided callback whence a connection is established + * + * @param {function} callback + */ + this.onConnect = function (callback) { + this.socket.on('connect', callback); + }; + + /** + * Fires the provided callback whenever a connection error is received + * @param {function} callback + */ + this.onConnectError = function (callback) { + this.socket.on('connect_error', callback); + }; + + /** + * Fires the provided callback whenever a disconnection occurred + * @param {function} callback + */ + this.onDisconnect = function (callback) { + this.socket.on('disconnect', callback); + }; + + /** + * Fires the provided callback whenever a connection has been reestablished + * @param {function} callback + */ + this.onReconnect = function (callback) { + this.socket.on('reconnect', callback); + }; + + /** + * Registers a callback on a room. Once 1 message is received, fires the + * callback and unregister it afterward. + * + * @param {string} roomId + * @param {function} callback + */ + this.once = function (roomId, callback) { + this.socket.once(roomId, callback); + }; + + /** + * Registers a callback on a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.on = function (roomId, callback) { + this.socket.on(roomId, callback); + }; + + /** + * Unregisters a callback from a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.off = function (roomId, callback) { + this.socket.off(roomId, callback); + }; + + + /** + * Sends a payload to the connected server + * + * @param {Object} payload + */ + this.send = function (payload) { + this.socket.emit('kuzzle', payload); + }; + + /** + * Closes the connection + */ + this.close = function () { + this.socket.close(); + this.socket = null; + }; +} + +module.exports = SocketIO; diff --git a/src/networkWrapper/wrappers/wsbrowsers.js b/src/networkWrapper/wrappers/wsbrowsers.js new file mode 100644 index 000000000..9abe30214 --- /dev/null +++ b/src/networkWrapper/wrappers/wsbrowsers.js @@ -0,0 +1,236 @@ +function WSBrowsers(host, port) { + var self = this; + this.host = host; + this.port = port; + this.client = null; + this.retrying = false; + + /* + Listeners are stored using the following format: + roomId: { + fn: callback_function, + once: boolean + } + */ + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + /** + * Creates a new socket from the provided arguments + * + * @constructor + * @param {boolean} autoReconnect + * @param {int} reconnectionDelay + * @returns {Object} Socket + */ + this.connect = function (autoReconnect, reconnectionDelay) { + this.client = new WebSocket('ws://' + this.host + ':' + this.port); + + this.client.onopen = function () { + if (self.retrying) { + poke(self.listeners, 'reconnect'); + } + else { + poke(self.listeners, 'connect'); + } + }; + + this.client.onclose = function () { + poke(self.listeners, 'disconnect'); + }; + + this.client.onerror = function () { + if (autoReconnect) { + self.retrying = true; + setTimeout(function () { + self.connect(autoReconnect, reconnectionDelay); + }, reconnectionDelay); + } + + poke(self.listeners, 'error'); + }; + + this.client.onmessage = function (payload) { + var data = JSON.parse(payload.data); + + if (data.room && self.listeners[data.room]) { + poke(self.listeners, data.room, data); + } + }; + }; + + /** + * Fires the provided callback whence a connection is established + * + * @param {function} callback + */ + this.onConnect = function (callback) { + this.listeners.connect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection error is received + * @param {function} callback + */ + this.onConnectError = function (callback) { + this.listeners.error.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a disconnection occurred + * @param {function} callback + */ + this.onDisconnect = function (callback) { + this.listeners.disconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection has been reestablished + * @param {function} callback + */ + this.onReconnect = function (callback) { + this.listeners.reconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Registers a callback on a room. Once 1 message is received, fires the + * callback and unregister it afterward. + * + * @param {string} roomId + * @param {function} callback + */ + this.once = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: false + }); + }; + + /** + * Registers a callback on a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.on = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: true + }); + }; + + /** + * Unregisters a callback from a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.off = function (roomId, callback) { + var index; + + if (this.listeners[roomId]) { + index = this.listeners[roomId].findIndex(function (listener) { + return listener.fn === callback; + }); + + if (index !== -1) { + if (this.listeners[roomId].length === 1 && ['error', 'connect', 'disconnect', 'reconnect'].indexOf(roomId) === -1) { + delete this.listeners[roomId]; + } + else { + this.listeners[roomId].splice(index, 1); + } + } + } + }; + + + /** + * Sends a payload to the connected server + * + * @param {Object} payload + */ + this.send = function (payload) { + if (this.client && this.client.readyState === this.client.OPEN) { + this.client.send(JSON.stringify(payload)); + } + }; + + /** + * Closes the connection + */ + this.close = function () { + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + this.retrying = false; + this.client.close(); + this.client = null; + }; +} + +/** + * Executes all registered listeners in the provided + * "listeners" structure. + * + * Listeners are of the following format: + * [ + * { fn: callback, once: boolean }, + * ... + * ] + * + * @private + * @param {Object} listeners + * @param {string} roomId + * @param {Object} [payload] + */ +function poke (listeners, roomId, payload) { + var + i, + length = listeners[roomId].length; + + for (i = 0; i < length; ++i) { + listeners[roomId][i].fn(payload); + + if (!listeners[roomId][i].keep) { + if (listeners[roomId].length > 1) { + listeners[roomId].splice(i, 1); + --i; + --length; + } + else { + delete listeners[roomId]; + } + } + } +} + +module.exports = WSBrowsers; diff --git a/src/networkWrapper/wrappers/wsnode.js b/src/networkWrapper/wrappers/wsnode.js new file mode 100644 index 000000000..c9fb7f1b6 --- /dev/null +++ b/src/networkWrapper/wrappers/wsnode.js @@ -0,0 +1,239 @@ +var + WebSocket = require('ws'); + +function WSNode(host, port) { + var self = this; + this.host = host; + this.port = port; + this.client = null; + this.retrying = false; + + /* + Listeners are stored using the following format: + roomId: { + fn: callback_function, + once: boolean + } + */ + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + /** + * Creates a new socket from the provided arguments + * + * @constructor + * @param {boolean} autoReconnect + * @param {int} reconnectionDelay + * @returns {Object} Socket + */ + this.connect = function (autoReconnect, reconnectionDelay) { + this.client = new WebSocket('ws://' + this.host + ':' + this.port, {perMessageDeflate: false}); + + this.client.on('open', function () { + if (self.retrying) { + poke(self.listeners, 'reconnect'); + } + else { + poke(self.listeners, 'connect'); + } + }); + + this.client.on('close', function () { + poke(self.listeners, 'disconnect'); + }); + + this.client.on('error', function () { + if (autoReconnect) { + self.retrying = true; + setTimeout(function () { + self.connect(autoReconnect, reconnectionDelay); + }, reconnectionDelay); + } + + poke(self.listeners, 'error'); + }); + + this.client.on('message', function (payload) { + var data = JSON.parse(payload); + + if (data.room && self.listeners[data.room]) { + poke(self.listeners, data.room, data); + } + }); + }; + + /** + * Fires the provided callback whence a connection is established + * + * @param {function} callback + */ + this.onConnect = function (callback) { + this.listeners.connect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection error is received + * @param {function} callback + */ + this.onConnectError = function (callback) { + this.listeners.error.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a disconnection occurred + * @param {function} callback + */ + this.onDisconnect = function (callback) { + this.listeners.disconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Fires the provided callback whenever a connection has been reestablished + * @param {function} callback + */ + this.onReconnect = function (callback) { + this.listeners.reconnect.push({ + fn: callback, + keep: true + }); + }; + + /** + * Registers a callback on a room. Once 1 message is received, fires the + * callback and unregister it afterward. + * + * @param {string} roomId + * @param {function} callback + */ + this.once = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: false + }); + }; + + /** + * Registers a callback on a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.on = function (roomId, callback) { + if (!this.listeners[roomId]) { + this.listeners[roomId] = []; + } + + this.listeners[roomId].push({ + fn: callback, + keep: true + }); + }; + + /** + * Unregisters a callback from a room. + * + * @param {string} roomId + * @param {function} callback + */ + this.off = function (roomId, callback) { + var index; + + if (this.listeners[roomId]) { + index = this.listeners[roomId].findIndex(function (listener) { + return listener.fn === callback; + }); + + if (index !== -1) { + if (this.listeners[roomId].length === 1 && ['error', 'connect', 'disconnect', 'reconnect'].indexOf(roomId) === -1) { + delete this.listeners[roomId]; + } + else { + this.listeners[roomId].splice(index, 1); + } + } + } + }; + + + /** + * Sends a payload to the connected server + * + * @param {Object} payload + */ + this.send = function (payload) { + if (this.client && this.client.readyState === this.client.OPEN) { + this.client.send(JSON.stringify(payload)); + } + }; + + /** + * Closes the connection + */ + this.close = function () { + this.listeners = { + error: [], + connect: [], + disconnect: [], + reconnect: [] + }; + + this.retrying = false; + this.client.close(); + this.client = null; + }; +} + +/** + * Executes all registered listeners in the provided + * "listeners" structure. + * + * Listeners are of the following format: + * [ + * { fn: callback, once: boolean }, + * ... + * ] + * + * @private + * @param {Object} listeners + * @param {string} roomId + * @param {Object} [payload] + */ +function poke (listeners, roomId, payload) { + var + i, + length = listeners[roomId].length; + + for (i = 0; i < length; ++i) { + listeners[roomId][i].fn(payload); + + if (!listeners[roomId][i].keep) { + if (listeners[roomId].length > 1) { + listeners[roomId].splice(i, 1); + --i; + --length; + } + else { + delete listeners[roomId]; + } + } + } +} + +module.exports = WSNode; diff --git a/test/kuzzle/constructor.test.js b/test/kuzzle/constructor.test.js index daa8f88ad..27c9663fc 100644 --- a/test/kuzzle/constructor.test.js +++ b/test/kuzzle/constructor.test.js @@ -1,39 +1,30 @@ var should = require('should'), rewire = require('rewire'), + sinon = require('sinon'), bluebird = require('bluebird'), proxyquire = require('proxyquire'), - EventEmitter = require('events').EventEmitter, + NetworkWrapper = require('../../src/networkWrapper/wrappers/wsnode'), kuzzleSource = '../../src/kuzzle'; describe('Kuzzle constructor', () => { - var Kuzzle; + var + Kuzzle, + networkStub; + + beforeEach(function () { + networkStub = sinon.stub(new NetworkWrapper('address', 'port')); + }); describe('#constructor', function () { before(function () { Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client' : function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('connect')); - return emitter; + './networkWrapper' : function () { + return networkStub; } }); }); - it('when in javascript mode, it should not load socket.io', function () { - var - KuzzleRewired = rewire(kuzzleSource), - fakeIO = false, - kuzzle; - - KuzzleRewired.__with__({ - 'window': {io:function () { fakeIO = true; return new EventEmitter; }} - })(function () { - kuzzle = new KuzzleRewired('foo'); - should(fakeIO).be.true(); - }); - }); - it('should expose the documented functions', () => { var kuzzle; @@ -78,6 +69,8 @@ describe('Kuzzle constructor', () => { should(kuzzle).have.propertyWithDescriptor('reconnectionDelay', { enumerable: true, writable: false, configurable: false }); should(kuzzle).have.propertyWithDescriptor('jwtToken', { enumerable: true, writable: true, configurable: false }); should(kuzzle).have.propertyWithDescriptor('offlineQueueLoader', { enumerable: true, writable: true, configurable: false }); + should(kuzzle).have.propertyWithDescriptor('wsPort', { enumerable: true, writable: false, configurable: false }); + should(kuzzle).have.propertyWithDescriptor('ioPort', { enumerable: true, writable: false, configurable: false }); }); it('should have properties with the documented default values', () => { @@ -94,6 +87,8 @@ describe('Kuzzle constructor', () => { should(kuzzle.replayInterval).be.exactly(10); should(kuzzle.reconnectionDelay).be.exactly(1000); should(kuzzle.defaultIndex).be.undefined(); + should(kuzzle.wsPort).be.exactly(7513); + should(kuzzle.ioPort).be.exactly(7512); }); it('should initialize correctly properties using the "options" argument', () => { @@ -109,7 +104,9 @@ describe('Kuzzle constructor', () => { metadata: {foo: ['bar', 'baz', 'qux'], bar: 'foo'}, replayInterval: 99999, reconnectionDelay: 666, - defaultIndex: 'foobar' + defaultIndex: 'foobar', + wsPort: 1234, + ioPort: 4567 }, kuzzle = new Kuzzle('nowhere', options); @@ -124,6 +121,8 @@ describe('Kuzzle constructor', () => { should(kuzzle.metadata).be.an.Object().and.match(options.metadata); should(kuzzle.replayInterval).be.exactly(options.replayInterval); should(kuzzle.reconnectionDelay).be.exactly(options.reconnectionDelay); + should(kuzzle.wsPort).be.exactly(options.wsPort); + should(kuzzle.ioPort).be.exactly(options.ioPort); }); it('should handle the offlineMode option properly', () => { @@ -139,11 +138,11 @@ describe('Kuzzle constructor', () => { var kuzzle = new Kuzzle('nowhere', {connect: 'manual'}); should(kuzzle.state).be.exactly('ready'); - should(kuzzle.socket).be.null(); + should(networkStub.connect.called).be.false(); kuzzle = new Kuzzle('nowhere', {connect: 'auto'}); should(kuzzle.state).be.exactly('connecting'); - should(kuzzle.socket).not.be.null(); + should(networkStub.connect.called).be.true(); }); it('should return a new instance even if not called with "new"', () => { @@ -155,6 +154,12 @@ describe('Kuzzle constructor', () => { it('should allow passing a callback and respond once initialized', function (done) { this.timeout(500); + networkStub.onConnect = function (cb) { + process.nextTick(function () { + cb(); + }); + }; + new Kuzzle('nowhere', () => { try { kuzzle.isValid(); @@ -218,27 +223,11 @@ describe('Kuzzle constructor', () => { }); describe('#connect', function () { - var iostub = function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('connect')); - return emitter; - }; - - beforeEach(function () { - Kuzzle = proxyquire(kuzzleSource, {'socket.io-client' : iostub}); - }); - it('should return immediately if already connected', function (done) { var kuzzle; this.timeout(200); - Kuzzle = proxyquire(kuzzleSource, { - io: function () { - // does nothing, making the test crash if trying to connect - } - }); - kuzzle = new Kuzzle('nowhere', {connect: 'manual'}, (err, res) => { should(err).be.null(); should(res).be.exactly(kuzzle); @@ -255,12 +244,6 @@ describe('Kuzzle constructor', () => { this.timeout(200); - Kuzzle = proxyquire(kuzzleSource, { - io: function () { - // does nothing, making the test crash if trying to connect - } - }); - kuzzle = new Kuzzle('nowhere', {connect: 'manual'}, (err, res) => { should(err).be.null(); should(res).be.exactly(kuzzle); @@ -279,7 +262,6 @@ describe('Kuzzle constructor', () => { kuzzle.state = state; should(kuzzle.connect()).be.exactly(kuzzle); should(kuzzle.state).be.exactly('connecting'); - kuzzle.socket.removeAllListeners(); }); }); @@ -290,24 +272,26 @@ describe('Kuzzle constructor', () => { kuzzle.state = 'initializing'; kuzzle.addListener('connected', function () { listenerCalled = true; }); + + networkStub.onConnect = function (cb) { + process.nextTick(function () { + cb(); + }); + }; + kuzzle.connect(); setTimeout(() => { should(listenerCalled).be.true(); - kuzzle.socket.removeAllListeners(); done(); }, 10); }); describe('=> on connection error', () => { beforeEach(function () { - Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client': function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('connect_error', 'error')); - return emitter; - } - }); + networkStub.onConnectError = function (cb) { + process.nextTick(() => cb('error')); + }; }); it('should call the provided callback on a connection error', function (done) { @@ -322,7 +306,6 @@ describe('Kuzzle constructor', () => { should(err.internal).be.exactly('error'); should(res).be.undefined(); should(kuzzle.state).be.exactly('error'); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -339,7 +322,6 @@ describe('Kuzzle constructor', () => { setTimeout(() => { try { should(listenerCalled).be.true(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -350,6 +332,10 @@ describe('Kuzzle constructor', () => { }); describe('=> on connection success', () => { + beforeEach(() => { + networkStub.onConnect = cb => process.nextTick(() => cb()); + }); + it('should call the provided callback on a connection success', function (done) { var kuzzle; this.timeout(50); @@ -359,7 +345,6 @@ describe('Kuzzle constructor', () => { should(err).be.null(); should(res).be.instanceof(Kuzzle); should(res.state).be.exactly('connected'); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -387,7 +372,6 @@ describe('Kuzzle constructor', () => { setTimeout(() => { should(renewed).be.true(); - kuzzle.socket.removeAllListeners(); done(); }, 20); }); @@ -404,34 +388,18 @@ describe('Kuzzle constructor', () => { kuzzle = new KuzzleRewired('nowhere', {connect: 'manual', autoReplay: false, autoQueue: false}, () => { should(kuzzle.state).be.exactly('connected'); should(dequeued).be.true(); - kuzzle.socket.removeAllListeners(); revert(); done(); }); - kuzzle.io = iostub; - + kuzzle.network = networkStub; kuzzle.connect(); }); }); describe('=> on disconnection', () => { beforeEach(function () { - Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client': function () { - var emitter = new EventEmitter; - - /* - since we're stubbing the socket.io socket object, - we need a stubbed 'close' function to make kuzzle.logout() work - */ - emitter.close = function () { - return false; - }; - process.nextTick(() => emitter.emit('disconnect')); - return emitter; - } - }); + networkStub.onDisconnect = cb => process.nextTick(() => cb()); }); it('should enter offline mode and call listeners', function (done) { @@ -449,7 +417,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.queuing).be.false(); should(listenerCalled).be.true(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -467,7 +434,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.state).be.exactly('offline'); should(kuzzle.queuing).be.true(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -486,7 +452,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.state).be.exactly('offline'); should(kuzzle.queuing).be.false(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done('the kuzzle instance should have been invalidated'); } catch (e) { @@ -497,17 +462,8 @@ describe('Kuzzle constructor', () => { }); describe('=> on reconnection', () => { - var - iostub = function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('reconnect')); - return emitter; - }; - beforeEach(function () { - Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client': iostub - }); + networkStub.onReconnect = cb => process.nextTick(() => cb()); }); it('should exit offline mode when reconnecting', function (done) { @@ -527,7 +483,6 @@ describe('Kuzzle constructor', () => { // should not switch queuing to 'false' automatically by default should(kuzzle.queuing).be.true(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -554,7 +509,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.state).be.exactly('connected'); should(renewCalled).be.true(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -583,7 +537,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.state).be.exactly('connected'); should(renewCalled).be.false(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -605,7 +558,6 @@ describe('Kuzzle constructor', () => { should(kuzzle.state).be.exactly('connected'); should(kuzzle.queuing).be.false(); kuzzle.isValid(); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -657,15 +609,10 @@ describe('Kuzzle constructor', () => { cb(null); } } - }, - iostub = function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('connect')); - return emitter; }; - beforeEach(function () { - Kuzzle = proxyquire(kuzzleSource, {'socket.io-client' : iostub}); + beforeEach(() => { + networkStub.onConnect = cb => process.nextTick(() => cb()); }); it('should call the provided callback on a connection & login success', function (done) { @@ -684,7 +631,6 @@ describe('Kuzzle constructor', () => { should(err).be.null(); should(res).be.instanceof(Kuzzle); should(res.state).be.exactly('connected'); - kuzzle.socket.removeAllListeners(); done(); } catch (e) { @@ -718,7 +664,6 @@ describe('Kuzzle constructor', () => { should(res).be.instanceof(Kuzzle); should(res.state).be.exactly('connected'); should(listenerConnected).be.exactly(true); - kuzzle.socket.removeAllListeners(); done(); }); } @@ -819,7 +764,7 @@ describe('Kuzzle constructor', () => { kuzzle.query = function(queryArgs, query, options, cb) { cb(null, {result: {jwt: 'test-toto'}}); }; - console.log('## before'); + kuzzle.login('local', '1h', function() { done(); }); diff --git a/test/kuzzle/methods.test.js b/test/kuzzle/methods.test.js index 785c25d6e..3885c66e7 100644 --- a/test/kuzzle/methods.test.js +++ b/test/kuzzle/methods.test.js @@ -1,7 +1,6 @@ var should = require('should'), rewire = require('rewire'), - proxyquire = require('proxyquire'), sinon = require('sinon'), sandbox = sinon.sandbox.create(), Kuzzle = rewire('../../src/kuzzle'), @@ -411,10 +410,11 @@ describe('Kuzzle methods', function () { it('should clean up and invalidate the instance if called', function () { var kuzzle = new Kuzzle('foo'); + kuzzle.network.close = sinon.stub(kuzzle.network, 'close'); kuzzle.collections = { foo: {}, bar: {}, baz: {} }; kuzzle.disconnect(); - should(kuzzle.socket).be.null(); + should(kuzzle.network.close.called).be.true(); should(kuzzle.collections).be.empty(); should(function () { kuzzle.isValid(); }).throw(Error); }); diff --git a/test/kuzzle/offlineQueue.test.js b/test/kuzzle/offlineQueue.test.js index dbd0866b3..abf20ed8e 100644 --- a/test/kuzzle/offlineQueue.test.js +++ b/test/kuzzle/offlineQueue.test.js @@ -1,23 +1,10 @@ var should = require('should'), rewire = require('rewire'), + sinon = require('sinon'), Kuzzle = rewire('../../src/kuzzle'); describe('Offline queue management', () => { - var sent; - - // deactivate socket.io - before(function () { - Kuzzle.__set__('io', function () { - return { - emit: function () { sent++; }, - close: function () {}, - on: function () {}, - once: function () {} - }; - }); - }); - describe('#cleanQueue', function () { var cleanQueue = Kuzzle.__get__('cleanQueue'), @@ -100,9 +87,8 @@ describe('Offline queue management', () => { var pastTime = 60000; - sent = 0; kuzzle = new Kuzzle('foo'); - kuzzle.socket = { emit: () => { sent++; } }; + kuzzle.network.send = sinon.stub(); kuzzle.queuing = true; // queuing a bunch of requests from 1min ago to right now, 10s apart @@ -122,7 +108,7 @@ describe('Offline queue management', () => { dequeue.call(kuzzle); setTimeout(() => { - should(sent).be.exactly(numRequests); + should(kuzzle.network.send.callCount).be.exactly(numRequests); should(kuzzle.offlineQueue).be.an.Array(); should(kuzzle.offlineQueue.length).be.exactly(0); should(kuzzle.queuing).be.false(); @@ -147,7 +133,7 @@ describe('Offline queue management', () => { dequeue.call(kuzzle); setTimeout(() => { - should(sent).be.exactly(numRequests + 2); + should(kuzzle.network.send.callCount).be.exactly(numRequests + 2); should(kuzzle.offlineQueue).be.an.Array(); should(kuzzle.offlineQueue.length).be.exactly(0); should(kuzzle.queuing).be.false(); @@ -172,7 +158,7 @@ describe('Offline queue management', () => { dequeue.call(kuzzle); setTimeout(() => { - should(sent).be.exactly(numRequests + 1); + should(kuzzle.network.send.callCount).be.exactly(numRequests + 1); should(kuzzle.offlineQueue).be.an.Array(); should(kuzzle.offlineQueue.length).be.exactly(0); should(kuzzle.queuing).be.false(); diff --git a/test/kuzzle/query.test.js b/test/kuzzle/query.test.js index 3c4546809..78b2fd9bd 100644 --- a/test/kuzzle/query.test.js +++ b/test/kuzzle/query.test.js @@ -1,7 +1,8 @@ -var + var should = require('should'), rewire = require('rewire'), - proxyquire = require('proxyquire'), + sinon = require('sinon'), + Kuzzle = require('../../src/kuzzle'), EventEmitter = require('events').EventEmitter, kuzzleSource = '../../src/kuzzle'; @@ -10,58 +11,32 @@ describe('Query management', function () { describe('#emitRequest', function () { var emitRequest = rewire(kuzzleSource).__get__('emitRequest'), - Kuzzle, kuzzle; - before(function () { - Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client': function () { return new EventEmitter; } - }); - }); - beforeEach(function () { kuzzle = new Kuzzle('foo'); + kuzzle.network = new EventEmitter; + kuzzle.network.send = sinon.stub(); }); - it('should emit the request when asked to', function (done) { - var start = Date.now(); - - this.timeout(50); - - kuzzle.socket.on('kuzzle', function () { - // the event is emitted before the historization, so we need to delay our check a bit - process.nextTick(() => { - var end = Date.now(); - - try { - should(kuzzle.requestHistory['bar']).be.within(start, end); - done(); - } - catch (e) { - done(e); - } - }) - }); + it('should emit the request when asked to', function () { + var + start = Date.now(), + request = {requestId: 'bar'}; - emitRequest.call(kuzzle, {requestId: 'bar'}); + emitRequest.call(kuzzle, request); + should(kuzzle.network.send.calledWith(request)).be.true(); + should(kuzzle.requestHistory['bar']).be.within(start, Date.now()); }); it('should fire a jwtTokenExpired event if the token has expired', function (done) { var listenerJwtTokenExpired = false; - Kuzzle = proxyquire(kuzzleSource, { - 'socket.io-client': function () { - var emitter = new EventEmitter; - process.nextTick(() => emitter.emit('bar', { - error: { - message: 'Token expired' - } - })); - return emitter; + kuzzle.network.send = () => process.nextTick(() => kuzzle.network.emit('bar', { + error: { + message: 'Token expired' } - }); - - kuzzle = new Kuzzle('foo'); + })); kuzzle.addListener('jwtTokenExpired', function() { listenerJwtTokenExpired = true; @@ -79,7 +54,9 @@ describe('Query management', function () { }); it('should launch the callback once a response has been received', function (done) { - var response = {result: 'foo', error: 'bar'}, + var + response = {result: 'foo', error: 'bar'}, + request = {requestId: 'someEvent'}, cb = function (err, res) { should(err).be.exactly(response.error); should(res).be.exactly(response); @@ -88,25 +65,8 @@ describe('Query management', function () { this.timeout(50); - kuzzle.socket.on('kuzzle', request => { - kuzzle.socket.emit(request.requestId, response); - }); - - emitRequest.call(kuzzle, {requestId: 'someEvent'}, cb); - }); - - it('should delete older history entries when necessary', function () { - var now = Date.now(); - - kuzzle.requestHistory['foo'] = now - 30000; - kuzzle.requestHistory['bar'] = now - 20000; - kuzzle.requestHistory['baz'] = now - 11000; - kuzzle.requestHistory['qux'] = now - 1000; - - emitRequest.call(kuzzle, {requestId: 'xyz'}); - - should(Object.keys(kuzzle.requestHistory).length).be.exactly(2); - should(Object.keys(kuzzle.requestHistory)).match(['qux', 'xyz']); + kuzzle.network.send = () => process.nextTick(() => kuzzle.network.emit(request.requestId, response)); + emitRequest.call(kuzzle, request, cb); }); }); @@ -158,6 +118,13 @@ describe('Query management', function () { should(callback).be.exactly(cb); }); + it('should invoke the callback with an error if no query is provided', () => { + should(() => kuzzle.query(queryArgs, () => {})).throw(Error); + should(() => kuzzle.query(queryArgs, ['foo', 'bar'])).throw(Error); + should(() => kuzzle.query(queryArgs)).throw(Error); + should(() => kuzzle.query(queryArgs, 'foobar')).throw(Error); + }); + it('should handle options metadata properly', function () { var metadata = { @@ -350,4 +317,40 @@ describe('Query management', function () { should(kuzzle.offlineQueue[0].query.headers).be.undefined(); }); }); + + describe('#cleanHistory', function () { + it('should be started by kuzzle constructor', function () { + var + cleanStub = sinon.stub(), + K = rewire(kuzzleSource); + + K.__set__('cleanHistory', cleanStub); + new K('foo', {connect: 'manual'}); + + should(cleanStub.calledOnce).be.true(); + }); + + it('should clean oldest entries every 1s', function () { + var + i, + clock = sinon.useFakeTimers(), + kuzzle = new Kuzzle('foo', {connect: 'manual'}); + + for(i = 100000; i >= 0; i -= 10000) { + kuzzle.requestHistory[i] = -i; + } + + clock.tick(1000); + + // should only contains i == 0 entry + should(Object.keys(kuzzle.requestHistory)).match(['0']); + + kuzzle.requestHistory['foobar'] = -100000; + + clock.tick(1000); + should(Object.keys(kuzzle.requestHistory)).match(['0']); + + clock.restore(); + }); + }); }); diff --git a/test/network/networkWrapper.test.js b/test/network/networkWrapper.test.js new file mode 100644 index 000000000..0d632b87f --- /dev/null +++ b/test/network/networkWrapper.test.js @@ -0,0 +1,33 @@ +var + should = require('should'), + WSNode = require('../../src/networkWrapper/wrappers/wsnode'), + WSBrowsers = require('../../src/networkWrapper/wrappers/wsbrowsers'), + SocketIO = require('../../src/networkWrapper/wrappers/socketio'), + Wrapper = require('../../src/networkWrapper'); + +describe('Network Wrapper', () => { + afterEach(() => { + window = undefined; + WebSocket = undefined; + }); + + it('should instantiate a WSNode object if not in a Web Browser', () => { + should(Wrapper()).be.instanceof(WSNode); + }); + + it('should instantiate a WSBrowsers object if in a Web Browser with WS support', () => { + window = 'foo'; + WebSocket = 'bar'; + should(Wrapper()).be.instanceof(WSBrowsers); + }); + + it('should instantiate a SocketIO object if in a Web Browser without WS support', () => { + window = { io: 'foobar' }; + should(Wrapper()).be.instanceof(SocketIO); + }); + + it('should throw if in WebBrowser without WS support nor SocketIO library', () => { + window = 'foo'; + should(() => Wrapper()).throw('Aborting: no websocket support detected and no socket.io library loaded either.'); + }); +}); diff --git a/test/network/socketio.test.js b/test/network/socketio.test.js new file mode 100644 index 000000000..4242e4b34 --- /dev/null +++ b/test/network/socketio.test.js @@ -0,0 +1,97 @@ +var + should = require('should'), + sinon = require('sinon'), + SocketIO = require('../../src/networkWrapper/wrappers/socketio'); + +describe('SocketIO networking module', () => { + var + socketIO, + socketStub; + + beforeEach(() => { + socketStub = { + once: sinon.stub(), + on: sinon.stub(), + off: sinon.stub(), + emit: sinon.stub(), + close: sinon.stub() + }; + + socketIO = new SocketIO('address', 'port'); + socketIO.socket = socketStub; + }); + + it('should connect with the right parameters', () => { + window = {io: sinon.stub()}; + socketIO.connect('autoReconnectValue', 'reconnectionDelayValue'); + should(window.io.calledOnce).be.true(); + should(window.io.calledWithMatch('http://address:port', { + reconnection: 'autoReconnectValue', + reconnectionDelay: 'reconnectionDelayValue', + forceNew: true + })).be.true(); + + window = undefined; + }); + + it('should plug onConnect callbacks to the right event', () => { + var cb = () => {}; + socketIO.onConnect(cb); + should(socketStub.on.calledOnce).be.true(); + should(socketStub.on.calledWith('connect', cb)).be.true(); + }); + + it('should plug onConnectError callbacks to the right event', () => { + var cb = () => {}; + socketIO.onConnectError(cb); + should(socketStub.on.calledOnce).be.true(); + should(socketStub.on.calledWith('connect_error', cb)).be.true(); + }); + + it('should plug onDisconnect callbacks to the right event', () => { + var cb = () => {}; + socketIO.onDisconnect(cb); + should(socketStub.on.calledOnce).be.true(); + should(socketStub.on.calledWith('disconnect', cb)).be.true(); + }); + + it('should plug onReconnect callbacks to the right event', () => { + var cb = () => {}; + socketIO.onReconnect(cb); + should(socketStub.on.calledOnce).be.true(); + should(socketStub.on.calledWith('reconnect', cb)).be.true(); + }); + + it('should be able to listen to an event just once', () => { + var cb = () => {}; + socketIO.once('event', cb); + should(socketStub.once.calledOnce).be.true(); + should(socketStub.once.calledWith('event', cb)).be.true(); + }); + + it('should be able to listen to an event', () => { + var cb = () => {}; + socketIO.on('event', cb); + should(socketStub.on.calledOnce).be.true(); + should(socketStub.on.calledWith('event', cb)).be.true(); + }); + + it('should be able to remove an event listener', () => { + var cb = () => {}; + socketIO.off('event', cb); + should(socketStub.off.calledOnce).be.true(); + should(socketStub.off.calledWith('event', cb)).be.true(); + }); + + it('should be able to send a payload', () => { + socketIO.send('some data'); + should(socketStub.emit.calledOnce).be.true(); + should(socketStub.emit.calledWith('kuzzle', 'some data')).be.true(); + }); + + it('should be able to be closed', () => { + socketIO.close(); + should(socketStub.close.calledOnce).be.true(); + should(socketIO.socket).be.null(); + }); +}); diff --git a/test/network/wsbrowsers.test.js b/test/network/wsbrowsers.test.js new file mode 100644 index 000000000..558b12605 --- /dev/null +++ b/test/network/wsbrowsers.test.js @@ -0,0 +1,244 @@ +var + should = require('should'), + sinon = require('sinon'), + WSBrowsers = require('../../src/networkWrapper/wrappers/wsbrowsers'); + +describe('WebSocket Browsers networking module', () => { + var + wsbrowsers, + wsargs, + clientStub; + + beforeEach(() => { + clientStub = { + send: sinon.stub(), + close: sinon.stub() + }; + + WebSocket = function () { + wsargs = Array.prototype.slice.call(arguments); + return clientStub; + }; + + wsbrowsers = new WSBrowsers('address', 'port'); + }); + + afterEach(() => { + WebSocket = undefined; + }); + + it('should initialize a WS connection properly', () => { + clientStub.on = sinon.stub(); + wsbrowsers.connect('autoReconnect', 'reconnectionDelay'); + should(wsargs).match(['ws://address:port']); + should(clientStub.onopen).not.be.undefined(); + should(clientStub.onclose).not.be.undefined(); + should(clientStub.onerror).not.be.undefined(); + should(clientStub.onmessage).not.be.undefined(); + }); + + it('should call listeners on a "open" event', () => { + var cb = sinon.stub(); + + wsbrowsers.retrying = false; + wsbrowsers.onConnect(cb); + wsbrowsers.listeners.reconnect.push(() => {throw(new Error('wrong event called'));}); + should(wsbrowsers.listeners.connect.length).be.eql(1); + + wsbrowsers.connect(); + clientStub.onopen(); + + should(cb.calledOnce).be.true(); + should(wsbrowsers.listeners.connect.length).be.eql(1); + }); + + it('should call listeners on a "reconnect" event', () => { + var cb = sinon.stub(); + + wsbrowsers.retrying = true; + wsbrowsers.onReconnect(cb); + wsbrowsers.listeners.connect.push(() => {throw(new Error('wrong event called'));}); + should(wsbrowsers.listeners.reconnect.length).be.eql(1); + + wsbrowsers.connect(); + clientStub.onopen(); + + should(cb.calledOnce).be.true(); + should(wsbrowsers.listeners.reconnect.length).be.eql(1); + }); + + it('should try to reconnect on a connection error with autoReconnect = true', () => { + var + cb = sinon.stub(), + clock = sinon.useFakeTimers(); + + wsbrowsers.retrying = false; + wsbrowsers.onConnectError(cb); + should(wsbrowsers.listeners.error.length).be.eql(1); + + wsbrowsers.connect(true, 10); + wsbrowsers.connect = sinon.stub(); + clientStub.onerror(); + clock.tick(10); + + should(cb.calledOnce).be.true(); + should(wsbrowsers.listeners.error.length).be.eql(1); + should(wsbrowsers.retrying).be.true(); + should(wsbrowsers.connect.calledOnce).be.true(); + clock.restore(); + }); + + it('should not try to reconnect on a connection error with autoReconnect = false', () => { + var + cb = sinon.stub(), + clock = sinon.useFakeTimers(); + + wsbrowsers.retrying = false; + wsbrowsers.onConnectError(cb); + should(wsbrowsers.listeners.error.length).be.eql(1); + + wsbrowsers.connect(false, 10); + wsbrowsers.connect = sinon.stub(); + clientStub.onerror(); + clock.tick(10); + + should(cb.calledOnce).be.true(); + should(wsbrowsers.listeners.error.length).be.eql(1); + should(wsbrowsers.retrying).be.false(); + should(wsbrowsers.connect.calledOnce).be.false(); + clock.restore(); + }); + + it('should call listeners on a "disconnect" event', () => { + var cb = sinon.stub(); + + wsbrowsers.retrying = false; + wsbrowsers.onDisconnect(cb); + should(wsbrowsers.listeners.disconnect.length).be.eql(1); + + wsbrowsers.connect(); + clientStub.onclose(); + + should(cb.calledOnce).be.true(); + should(wsbrowsers.listeners.disconnect.length).be.eql(1); + }); + + it('should be able to register ephemeral callbacks on an event', () => { + var + cb = sinon.stub(), + payload = {room: 'foobar'}; + + wsbrowsers.once('foobar', cb); + wsbrowsers.once('foobar', cb); + wsbrowsers.once('barfoo', cb); + wsbrowsers.connect(); + + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: false}, {fn: cb, keep: false}]); + should(wsbrowsers.listeners.barfoo).match([{fn: cb, keep: false}]); + + clientStub.onmessage({data: JSON.stringify(payload)}); + + should(wsbrowsers.listeners.foobar).be.undefined(); + should(wsbrowsers.listeners.barfoo).match([{fn: cb, keep: false}]); + should(cb.calledTwice).be.true(); + should(cb.alwaysCalledWithMatch(payload)).be.true(); + }); + + it('should be able to register persistent callbacks on an event', () => { + var + cb = sinon.stub(), + payload = {room: 'foobar'}; + + wsbrowsers.on('foobar', cb); + wsbrowsers.on('foobar', cb); + wsbrowsers.connect(); + + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + clientStub.onmessage({data: JSON.stringify(payload)}); + + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + should(cb.calledTwice).be.true(); + should(cb.alwaysCalledWithMatch(payload)).be.true(); + }); + + it('should be able to unregister a callback on an event', () => { + var + cb = sinon.stub(); + + wsbrowsers.on('foobar', cb); + wsbrowsers.on('foobar', cb); + wsbrowsers.connect(); + + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsbrowsers.off('foobar', cb); + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}]); + + wsbrowsers.off('foobar', cb); + should(wsbrowsers.listeners.foobar).be.undefined(); + }); + + it('should do nothing if trying to unregister an non-existent event/callback', () => { + var + cb = sinon.stub(); + + wsbrowsers.on('foobar', cb); + wsbrowsers.on('foobar', cb); + wsbrowsers.connect(); + + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsbrowsers.off('foo', cb); + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsbrowsers.off('foobar', sinon.stub()); + should(wsbrowsers.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + }); + + it('should send data payload through websocket', () => { + var data = {foo: 'bar'}; + + clientStub.readyState = clientStub.OPEN = true; + wsbrowsers.connect(); + wsbrowsers.send(data); + + should(clientStub.send.calledOnce).be.true(); + should(clientStub.send.calledWith(JSON.stringify(data))).be.true(); + }); + + it('should discard messages if the socket is not ready', () => { + var data = {foo: 'bar'}; + + clientStub.readyState = 'foo'; + clientStub.OPEN = 'bar'; + wsbrowsers.connect(); + wsbrowsers.send(data); + + should(clientStub.send.called).be.false(); + }); + + it('should properly close a connection when asked', () => { + var + cb = sinon.stub(); + + wsbrowsers.on('foobar', cb); + wsbrowsers.onConnect(cb); + wsbrowsers.onDisconnect(cb); + wsbrowsers.onConnectError(cb); + wsbrowsers.onReconnect(cb); + wsbrowsers.retrying = true; + + wsbrowsers.connect(); + wsbrowsers.close(); + + should(wsbrowsers.listeners.foobar).be.undefined(); + should(wsbrowsers.listeners.error).be.empty(); + should(wsbrowsers.listeners.connect).be.empty(); + should(wsbrowsers.listeners.reconnect).be.empty(); + should(wsbrowsers.listeners.disconnect).be.empty(); + should(wsbrowsers.client).be.null(); + should(clientStub.close.called).be.true(); + should(wsbrowsers.retrying).be.false(); + }); +}); diff --git a/test/network/wsnode.test.js b/test/network/wsnode.test.js new file mode 100644 index 000000000..a8896030c --- /dev/null +++ b/test/network/wsnode.test.js @@ -0,0 +1,244 @@ +var + should = require('should'), + EventEmitter = require('events').EventEmitter, + sinon = require('sinon'), + proxyquire = require('proxyquire'); + +describe('WebSocket NodeJS networking module', () => { + var + WSNode, + wsnode, + wsargs, + clientStub; + + beforeEach(() => { + clientStub = new EventEmitter(); + clientStub.send = sinon.stub(); + clientStub.close = sinon.stub(); + + WSNode = proxyquire('../../src/networkWrapper/wrappers/wsnode', { + 'ws': function () { + wsargs = Array.prototype.slice.call(arguments); + return clientStub; + } + }); + + wsnode = new WSNode('address', 'port'); + }); + + it('should initialize a WS connection properly', () => { + clientStub.on = sinon.stub(); + wsnode.connect('autoReconnect', 'reconnectionDelay'); + should(wsargs).match(['ws://address:port', {perMessageDeflate: false}]); + should(clientStub.on.callCount).be.eql(4); + should(clientStub.on.calledWithMatch('open', sinon.match.func)).be.true(); + should(clientStub.on.calledWithMatch('close', sinon.match.func)).be.true(); + should(clientStub.on.calledWithMatch('error', sinon.match.func)).be.true(); + should(clientStub.on.calledWithMatch('message', sinon.match.func)).be.true(); + }); + + it('should call listeners on a "open" event', () => { + var cb = sinon.stub(); + + wsnode.retrying = false; + wsnode.onConnect(cb); + wsnode.listeners.reconnect.push(() => {throw(new Error('wrong event called'));}); + should(wsnode.listeners.connect.length).be.eql(1); + + wsnode.connect(); + clientStub.emit('open'); + + should(cb.calledOnce).be.true(); + should(wsnode.listeners.connect.length).be.eql(1); + }); + + it('should call listeners on a "reconnect" event', () => { + var cb = sinon.stub(); + + wsnode.retrying = true; + wsnode.onReconnect(cb); + wsnode.listeners.connect.push(() => {throw(new Error('wrong event called'));}); + should(wsnode.listeners.reconnect.length).be.eql(1); + + wsnode.connect(); + clientStub.emit('open'); + + should(cb.calledOnce).be.true(); + should(wsnode.listeners.reconnect.length).be.eql(1); + }); + + it('should try to reconnect on a connection error with autoReconnect = true', () => { + var + cb = sinon.stub(), + clock = sinon.useFakeTimers(); + + wsnode.retrying = false; + wsnode.onConnectError(cb); + should(wsnode.listeners.error.length).be.eql(1); + + wsnode.connect(true, 10); + wsnode.connect = sinon.stub(); + clientStub.emit('error'); + clock.tick(10); + + should(cb.calledOnce).be.true(); + should(wsnode.listeners.error.length).be.eql(1); + should(wsnode.retrying).be.true(); + should(wsnode.connect.calledOnce).be.true(); + clock.restore(); + }); + + it('should not try to reconnect on a connection error with autoReconnect = false', () => { + var + cb = sinon.stub(), + clock = sinon.useFakeTimers(); + + wsnode.retrying = false; + wsnode.onConnectError(cb); + should(wsnode.listeners.error.length).be.eql(1); + + wsnode.connect(false, 10); + wsnode.connect = sinon.stub(); + clientStub.emit('error'); + clock.tick(10); + + should(cb.calledOnce).be.true(); + should(wsnode.listeners.error.length).be.eql(1); + should(wsnode.retrying).be.false(); + should(wsnode.connect.calledOnce).be.false(); + clock.restore(); + }); + + it('should call listeners on a "disconnect" event', () => { + var cb = sinon.stub(); + + wsnode.retrying = false; + wsnode.onDisconnect(cb); + should(wsnode.listeners.disconnect.length).be.eql(1); + + wsnode.connect(); + clientStub.emit('close'); + + should(cb.calledOnce).be.true(); + should(wsnode.listeners.disconnect.length).be.eql(1); + }); + + it('should be able to register ephemeral callbacks on an event', () => { + var + cb = sinon.stub(), + payload = {room: 'foobar'}; + + wsnode.once('foobar', cb); + wsnode.once('foobar', cb); + wsnode.once('barfoo', cb); + wsnode.connect(); + + should(wsnode.listeners.foobar).match([{fn: cb, keep: false}, {fn: cb, keep: false}]); + should(wsnode.listeners.barfoo).match([{fn: cb, keep: false}]); + + clientStub.emit('message', JSON.stringify(payload)); + + should(wsnode.listeners.foobar).be.undefined(); + should(wsnode.listeners.barfoo).match([{fn: cb, keep: false}]); + should(cb.calledTwice).be.true(); + should(cb.alwaysCalledWithMatch(payload)).be.true(); + }); + + it('should be able to register persistent callbacks on an event', () => { + var + cb = sinon.stub(), + payload = {room: 'foobar'}; + + wsnode.on('foobar', cb); + wsnode.on('foobar', cb); + wsnode.connect(); + + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + clientStub.emit('message', JSON.stringify(payload)); + + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + should(cb.calledTwice).be.true(); + should(cb.alwaysCalledWithMatch(payload)).be.true(); + }); + + it('should be able to unregister a callback on an event', () => { + var + cb = sinon.stub(); + + wsnode.on('foobar', cb); + wsnode.on('foobar', cb); + wsnode.connect(); + + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsnode.off('foobar', cb); + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}]); + + wsnode.off('foobar', cb); + should(wsnode.listeners.foobar).be.undefined(); + }); + + it('should do nothing if trying to unregister an non-existent event/callback', () => { + var + cb = sinon.stub(); + + wsnode.on('foobar', cb); + wsnode.on('foobar', cb); + wsnode.connect(); + + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsnode.off('foo', cb); + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + + wsnode.off('foobar', sinon.stub()); + should(wsnode.listeners.foobar).match([{fn: cb, keep: true}, {fn: cb, keep: true}]); + }); + + it('should send data payload through websocket', () => { + var data = {foo: 'bar'}; + + clientStub.readyState = clientStub.OPEN = true; + wsnode.connect(); + wsnode.send(data); + + should(clientStub.send.calledOnce).be.true(); + should(clientStub.send.calledWith(JSON.stringify(data))).be.true(); + }); + + it('should discard messages if the socket is not ready', () => { + var data = {foo: 'bar'}; + + clientStub.readyState = 'foo'; + clientStub.OPEN = 'bar'; + wsnode.connect(); + wsnode.send(data); + + should(clientStub.send.called).be.false(); + }); + + it('should properly close a connection when asked', () => { + var + cb = sinon.stub(); + + wsnode.on('foobar', cb); + wsnode.onConnect(cb); + wsnode.onDisconnect(cb); + wsnode.onConnectError(cb); + wsnode.onReconnect(cb); + wsnode.retrying = true; + + wsnode.connect(); + wsnode.close(); + + should(wsnode.listeners.foobar).be.undefined(); + should(wsnode.listeners.error).be.empty(); + should(wsnode.listeners.connect).be.empty(); + should(wsnode.listeners.reconnect).be.empty(); + should(wsnode.listeners.disconnect).be.empty(); + should(wsnode.client).be.null(); + should(clientStub.close.called).be.true(); + should(wsnode.retrying).be.false(); + }); +});