From cc3bd54510746e4dad12846bc10f5c9f9c370495 Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Wed, 3 Feb 2016 14:40:36 +0100 Subject: [PATCH 01/60] wip - begin security object --- src/KuzzleSecurity.js | 55 +++++++++++++++++++++++++++++++++++++ src/kuzzle.js | 12 +++++--- src/kuzzleDataCollection.js | 1 - 3 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 src/KuzzleSecurity.js diff --git a/src/KuzzleSecurity.js b/src/KuzzleSecurity.js new file mode 100644 index 000000000..027a8511a --- /dev/null +++ b/src/KuzzleSecurity.js @@ -0,0 +1,55 @@ +/** + * Kuzzle security constructor + * + * @param kuzzle + * @param headers + * @returns {KuzzleSecurity} + * @constructor + */ +function KuzzleSecurity(kuzzle, headers) { + + if (!headers) { + headers = kuzzle.headers; + } + + Object.defineProperties(this, { + kuzzle: { + value: kuzzle, + enumerable: true + }, + // writable properties + headers: { + value: JSON.parse(JSON.stringify(headers)), + enumerable: true, + writable: true + } + }); + + return this; +} + + +/** + * + * @param {string} name + * @param {bool} [hydrate] + */ +KuzzleSecurity.prototype.fetchRole = function (name, hydrate) { + +}; +/** + * + * @param {object} filters + * @param {bool} [hydrate] + */ +KuzzleSecurity.prototype.searchRole = function (filters, hydrate) { + +}; + +/** + * + * @param {object} role + */ +KuzzleSecurity.prototype.createRole = function (role) { + +}; \ No newline at end of file diff --git a/src/kuzzle.js b/src/kuzzle.js index 1de23c82b..fe007bf9f 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -1,6 +1,7 @@ var uuid = require('node-uuid'), - KuzzleDataCollection = require('./kuzzleDataCollection'); + KuzzleDataCollection = require('./kuzzleDataCollection'), + KuzzleSecurity = require('./KuzzleSecurity'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. @@ -40,6 +41,10 @@ module.exports = Kuzzle = function (url, options, cb) { value: {}, writable: true }, + security: { + value: new KuzzleSecurity(this), + enumerable: true + }, connectCB: { value: cb }, @@ -654,10 +659,9 @@ Kuzzle.prototype.getStatistics = function (timestamp, options, cb) { * * @param {string} [index] - The name of the data index containing the data collection * @param {string} collection - The name of the data collection you want to manipulate - * @param headers {object} [headers] - Common properties for all future write documents queries * @returns {object} A KuzzleDataCollection instance */ -Kuzzle.prototype.dataCollectionFactory = function(index, collection, headers) { +Kuzzle.prototype.dataCollectionFactory = function(index, collection) { this.isValid(); if (arguments.length === 1) { @@ -679,7 +683,7 @@ Kuzzle.prototype.dataCollectionFactory = function(index, collection, headers) { } if (!this.collections[index][collection]) { - this.collections[index][collection] = new KuzzleDataCollection(this, index, collection, headers); + this.collections[index][collection] = new KuzzleDataCollection(this, index, collection); } return this.collections[index][collection]; diff --git a/src/kuzzleDataCollection.js b/src/kuzzleDataCollection.js index 7207d0a34..cb7ac8e5c 100644 --- a/src/kuzzleDataCollection.js +++ b/src/kuzzleDataCollection.js @@ -226,7 +226,6 @@ KuzzleDataCollection.prototype.createDocument = function (id, document, options, data._id = id; } - data.persist = true; data = self.kuzzle.addHeaders(data, self.headers); if (cb) { From 44bf989ef340ccba21fa4383796cc656491dfe69 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 17:40:16 +0100 Subject: [PATCH 02/60] add functions signature security --- src/KuzzleSecurity.js | 55 ------------------ src/kuzzle.js | 4 +- src/security/KuzzleSecurity.js | 103 +++++++++++++++++++++++++++++++++ src/security/kuzzleProfile.js | 49 ++++++++++++++++ src/security/kuzzleRole.js | 41 +++++++++++++ src/security/kuzzleUser.js | 49 ++++++++++++++++ 6 files changed, 244 insertions(+), 57 deletions(-) delete mode 100644 src/KuzzleSecurity.js create mode 100644 src/security/KuzzleSecurity.js create mode 100644 src/security/kuzzleProfile.js create mode 100644 src/security/kuzzleRole.js create mode 100644 src/security/kuzzleUser.js diff --git a/src/KuzzleSecurity.js b/src/KuzzleSecurity.js deleted file mode 100644 index 027a8511a..000000000 --- a/src/KuzzleSecurity.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Kuzzle security constructor - * - * @param kuzzle - * @param headers - * @returns {KuzzleSecurity} - * @constructor - */ -function KuzzleSecurity(kuzzle, headers) { - - if (!headers) { - headers = kuzzle.headers; - } - - Object.defineProperties(this, { - kuzzle: { - value: kuzzle, - enumerable: true - }, - // writable properties - headers: { - value: JSON.parse(JSON.stringify(headers)), - enumerable: true, - writable: true - } - }); - - return this; -} - - -/** - * - * @param {string} name - * @param {bool} [hydrate] - */ -KuzzleSecurity.prototype.fetchRole = function (name, hydrate) { - -}; -/** - * - * @param {object} filters - * @param {bool} [hydrate] - */ -KuzzleSecurity.prototype.searchRole = function (filters, hydrate) { - -}; - -/** - * - * @param {object} role - */ -KuzzleSecurity.prototype.createRole = function (role) { - -}; \ No newline at end of file diff --git a/src/kuzzle.js b/src/kuzzle.js index fe007bf9f..aae45c53d 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -1,7 +1,7 @@ var uuid = require('node-uuid'), KuzzleDataCollection = require('./kuzzleDataCollection'), - KuzzleSecurity = require('./KuzzleSecurity'); + KuzzleSecurity = require('./security/KuzzleSecurity'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. @@ -19,6 +19,7 @@ var * @param {responseCallback} [cb] - Handles connection response * @constructor */ + module.exports = Kuzzle = function (url, options, cb) { var self = this; @@ -1066,4 +1067,3 @@ Kuzzle.prototype.stopQueuing = function () { return this; }; - diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js new file mode 100644 index 000000000..889a17046 --- /dev/null +++ b/src/security/KuzzleSecurity.js @@ -0,0 +1,103 @@ +/** + * Kuzzle security constructor + * + * @param kuzzle + * @param headers + * @returns {KuzzleSecurity} + * @constructor + */ +function KuzzleSecurity(kuzzle, headers) { + + if (!headers) { + headers = kuzzle.headers; + } + + Object.defineProperties(this, { + kuzzle: { + value: kuzzle, + enumerable: true + }, + // writable properties + headers: { + value: JSON.parse(JSON.stringify(headers)), + enumerable: true, + writable: true + } + }); + + return this; +} + + +/** + * @param {string} name + * @returns {Object} this + */ +KuzzleSecurity.prototype.fetchRole = function (name) { + +}; +/** + * + * @param {object} filters + */ +KuzzleSecurity.prototype.searchRoles = function (filters) { + +}; + +/** + * + * @param {object} role + */ +KuzzleSecurity.prototype.createRole = function (role) { + +}; + +/** + * @param {string} name + * @param {Boolean} hydrate + * @returns {Object} this + */ +KuzzleSecurity.prototype.fetchProfile = function (name, hydrate) { + +}; +/** + * + * @param {object} filters + * @param {Boolean} hydrate + */ +KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate) { + +}; + +/** + * + * @param {object} profile + */ +KuzzleSecurity.prototype.createProfile = function (profile) { + +}; + +/** + * @param {string} name + * @param {Boolean} hydrate + * @returns {Object} this + */ +KuzzleSecurity.prototype.fetchUser = function (name, hydrate) { + +}; +/** + * + * @param {object} filters + * @param {Boolean} hydrate + */ +KuzzleSecurity.prototype.searchUsers = function (filters, hydrate) { + +}; + +/** + * + * @param {object} profile + */ +KuzzleSecurity.prototype.createUser = function (profile) { + +}; \ No newline at end of file diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js new file mode 100644 index 000000000..311739ff6 --- /dev/null +++ b/src/security/kuzzleProfile.js @@ -0,0 +1,49 @@ +function KuzzleProfile() { + // Define properties + Object.defineProperties(this, { + // private properties + // read-only properties + // writable properties + }); + + if (this.kuzzle.bluebird) { + return this.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['getRoles', 'save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } + + return this; +} + +/** + * @param {Boolean} hydrate + * @returns {Object} this + */ +KuzzleProfile.prototype.getRoles = function (hydrate) { + +}; + +/** + * @param {object} [options] - Optional parameters + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleProfile.prototype.save = function (options, cb) { + +}; + +/** + * + * @param {Object} data - New profile content + * @return {Object} this + */ +KuzzleProfile.prototype.setContent = function (data) { + +}; + +module.exports = KuzzleProfile; diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js new file mode 100644 index 000000000..6f1a59f19 --- /dev/null +++ b/src/security/kuzzleRole.js @@ -0,0 +1,41 @@ +function KuzzleRole() { + // Define properties + Object.defineProperties(this, { + // private properties + // read-only properties + // writable properties + }); + + if (this.kuzzle.bluebird) { + return this.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } + + return this; +} + +/** + * @param {object} [options] - Optional parameters + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleRole.prototype.save = function (options, cb) { + +}; + +/** + * + * @param {Object} data - New role content + * @return {Object} this + */ +KuzzleRole.prototype.setContent = function (data) { + +}; + +module.exports = KuzzleRole; diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js new file mode 100644 index 000000000..370f073cd --- /dev/null +++ b/src/security/kuzzleUser.js @@ -0,0 +1,49 @@ +function KuzzleUser() { + // Define properties + Object.defineProperties(this, { + // private properties + // read-only properties + // writable properties + }); + + if (this.kuzzle.bluebird) { + return this.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['getProfiles', 'save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } + + return this; +} + +/** + * @param {Boolean} hydrate + * @returns {Object} this + */ +KuzzleUser.prototype.getProfiles = function (hydrate) { + +}; + +/** + * @param {object} [options] - Optional parameters + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleUser.prototype.save = function (options, cb) { + +}; + +/** + * + * @param {Object} data - New user content + * @return {Object} KuzzleUser + */ +KuzzleUser.prototype.setContent = function (data) { + +}; + +module.exports = KuzzleUser; From f4e7013954b66e3f1ddfc034344a7d9cf7baf50b Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 17:51:40 +0100 Subject: [PATCH 03/60] improve comments in security --- src/security/KuzzleSecurity.js | 59 ++++++++++++++++++++++++++++------ src/security/kuzzleProfile.js | 3 ++ src/security/kuzzleRole.js | 2 ++ src/security/kuzzleUser.js | 3 ++ 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 889a17046..ec1a81194 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -1,3 +1,8 @@ +var + Role = require('./kuzzleRole'), + Profile = require('./kuzzleProfile'), + User = require('./kuzzleUser'); + /** * Kuzzle security constructor * @@ -25,79 +30,115 @@ function KuzzleSecurity(kuzzle, headers) { } }); + if (this.kuzzle.bluebird) { + return this.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var blacklist = ['fetchRole', 'searchRoles', 'createRole', 'fetchProfile', 'searchProfiles', 'createProfile', 'fetchUser', 'searchUsers', 'createUser']; + + return passes && blacklist.indexOf(name) === -1; + } + }); + } + return this; } /** * @param {string} name + * @param {responseCallback} [cb] - returns Kuzzle's response + * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchRole = function (name) { +KuzzleSecurity.prototype.fetchRole = function (name, cb) { }; /** * * @param {object} filters + * @param {object} [options] - Optional parameters + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.searchRoles = function (filters) { +KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { }; /** * * @param {object} role + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.createRole = function (role) { +KuzzleSecurity.prototype.createRole = function (role, cb) { }; /** * @param {string} name * @param {Boolean} hydrate + * @param {responseCallback} [cb] - returns Kuzzle's response + * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchProfile = function (name, hydrate) { +KuzzleSecurity.prototype.fetchProfile = function (name, hydrate, cb) { }; /** * * @param {object} filters * @param {Boolean} hydrate + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate) { +KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { }; /** * * @param {object} profile + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.createProfile = function (profile) { +KuzzleSecurity.prototype.createProfile = function (profile, cb) { }; /** * @param {string} name * @param {Boolean} hydrate + * @param {responseCallback} [cb] - returns Kuzzle's response + * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchUser = function (name, hydrate) { +KuzzleSecurity.prototype.fetchUser = function (name, hydrate, cb) { }; /** * * @param {object} filters * @param {Boolean} hydrate + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.searchUsers = function (filters, hydrate) { +KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { }; /** * * @param {object} profile + * @param {responseCallback} [cb] - returns Kuzzle's response + * + * @returns {Object} this */ -KuzzleSecurity.prototype.createUser = function (profile) { +KuzzleSecurity.prototype.createUser = function (profile, cb) { }; \ No newline at end of file diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 311739ff6..33fddf077 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -22,6 +22,7 @@ function KuzzleProfile() { /** * @param {Boolean} hydrate + * * @returns {Object} this */ KuzzleProfile.prototype.getRoles = function (hydrate) { @@ -31,6 +32,7 @@ KuzzleProfile.prototype.getRoles = function (hydrate) { /** * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response + * * @returns {Object} this */ KuzzleProfile.prototype.save = function (options, cb) { @@ -40,6 +42,7 @@ KuzzleProfile.prototype.save = function (options, cb) { /** * * @param {Object} data - New profile content + * * @return {Object} this */ KuzzleProfile.prototype.setContent = function (data) { diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 6f1a59f19..161a5219a 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -23,6 +23,7 @@ function KuzzleRole() { /** * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response + * * @returns {Object} this */ KuzzleRole.prototype.save = function (options, cb) { @@ -32,6 +33,7 @@ KuzzleRole.prototype.save = function (options, cb) { /** * * @param {Object} data - New role content + * * @return {Object} this */ KuzzleRole.prototype.setContent = function (data) { diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 370f073cd..167eae905 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -22,6 +22,7 @@ function KuzzleUser() { /** * @param {Boolean} hydrate + * * @returns {Object} this */ KuzzleUser.prototype.getProfiles = function (hydrate) { @@ -31,6 +32,7 @@ KuzzleUser.prototype.getProfiles = function (hydrate) { /** * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response + * * @returns {Object} this */ KuzzleUser.prototype.save = function (options, cb) { @@ -40,6 +42,7 @@ KuzzleUser.prototype.save = function (options, cb) { /** * * @param {Object} data - New user content + * * @return {Object} KuzzleUser */ KuzzleUser.prototype.setContent = function (data) { From e2c93da8b50d2e0772c35570d5d42f1db86b85a7 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 17:52:25 +0100 Subject: [PATCH 04/60] nitpick security/user --- src/security/kuzzleUser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 167eae905..fcdfadcc9 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -42,8 +42,8 @@ KuzzleUser.prototype.save = function (options, cb) { /** * * @param {Object} data - New user content - * - * @return {Object} KuzzleUser + * + * @return {Object} this */ KuzzleUser.prototype.setContent = function (data) { From 552712565f4bf8dbc3e066561846939b0c452a50 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 18:25:53 +0100 Subject: [PATCH 05/60] fix problem implement new security --- src/kuzzle.js | 1 - src/security/KuzzleSecurity.js | 19 +++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index aae45c53d..5ea58ee19 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -252,7 +252,6 @@ module.exports = Kuzzle = function (url, options, cb) { }); } - return this; }; diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index ec1a81194..de6a45ed4 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -23,18 +23,18 @@ function KuzzleSecurity(kuzzle, headers) { enumerable: true }, // writable properties - headers: { - value: JSON.parse(JSON.stringify(headers)), - enumerable: true, - writable: true - } + //headers: { + // value: JSON.parse(JSON.stringify(headers)), + // enumerable: true, + // writable: true + //} }); if (this.kuzzle.bluebird) { return this.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var blacklist = ['fetchRole', 'searchRoles', 'createRole', 'fetchProfile', 'searchProfiles', 'createProfile', 'fetchUser', 'searchUsers', 'createUser']; + var blacklist = []; return passes && blacklist.indexOf(name) === -1; } @@ -63,7 +63,7 @@ KuzzleSecurity.prototype.fetchRole = function (name, cb) { * @returns {Object} this */ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { - + }; /** @@ -141,4 +141,7 @@ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { */ KuzzleSecurity.prototype.createUser = function (profile, cb) { -}; \ No newline at end of file +}; + + +module.exports = KuzzleSecurity; \ No newline at end of file From f2c4c2a12c8c83bc2033a9338b0d6b86cdac9ff6 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 18:41:32 +0100 Subject: [PATCH 06/60] add queryArgs function in KuzzleSecurity --- src/security/KuzzleSecurity.js | 54 +++++++++++++++++++++++++++------- src/security/kuzzleRole.js | 30 ++++++++++++++++++- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index de6a45ed4..f8ae2719e 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -11,11 +11,7 @@ var * @returns {KuzzleSecurity} * @constructor */ -function KuzzleSecurity(kuzzle, headers) { - - if (!headers) { - headers = kuzzle.headers; - } +function KuzzleSecurity(kuzzle) { Object.defineProperties(this, { kuzzle: { @@ -23,11 +19,20 @@ function KuzzleSecurity(kuzzle, headers) { enumerable: true }, // writable properties - //headers: { - // value: JSON.parse(JSON.stringify(headers)), - // enumerable: true, - // writable: true - //} + headers: { + value: JSON.parse(JSON.stringify(kuzzle.headers)), + enumerable: true, + writable: true + } + }); + + Object.defineProperty(this, 'buildQueryArgs', { + value: function (action) { + return { + controller: 'security', + action: action + }; + } }); if (this.kuzzle.bluebird) { @@ -63,7 +68,34 @@ KuzzleSecurity.prototype.fetchRole = function (name, cb) { * @returns {Object} this */ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { - + var + query, + self = this; + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); + + query = self.kuzzle.addHeaders({body: filters}, this.headers); + + self.kuzzle.query(this.buildQueryArgs('security', 'searchRoles'), query, options, function (error, result) { + var documents; + + if (error) { + return cb(error); + } + + documents = result.result.hits.map(function (doc) { + return new Role(doc._id, doc._source); + }); + + cb(null, { total: result.result.total, documents: documents }); + }); + + return this; }; /** diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 161a5219a..4022eebea 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -1,11 +1,39 @@ -function KuzzleRole() { +function KuzzleRole(roleId, content) { // Define properties Object.defineProperties(this, { // private properties // read-only properties // writable properties + id: { + value: undefined, + enumerable: true, + writable: true + }, + content: { + value: {}, + writable: true, + enumerable: true + } }); + // handling provided arguments + if (!content && roleId && typeof roleId === 'object') { + content = roleId; + roleId = null; + } + + if (content) { + this.setContent(content); + } + + if (roleId) { + Object.defineProperty(this, 'id', { + value: roleId, + enumerable: true + }); + } + + // promisifying if (this.kuzzle.bluebird) { return this.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', From addddc3e46747c6333b39b6fbd6483722d654840 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 3 Feb 2016 18:42:49 +0100 Subject: [PATCH 07/60] nitpick security --- src/security/KuzzleSecurity.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index f8ae2719e..d4c528fe1 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -1,13 +1,12 @@ var - Role = require('./kuzzleRole'), - Profile = require('./kuzzleProfile'), - User = require('./kuzzleUser'); + KuzzleRole = require('./KuzzleRole'), + KuzzleProfile = require('./kuzzleProfile'), + KuzzleUser = require('./kuzzleUser'); /** * Kuzzle security constructor * * @param kuzzle - * @param headers * @returns {KuzzleSecurity} * @constructor */ @@ -89,7 +88,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { } documents = result.result.hits.map(function (doc) { - return new Role(doc._id, doc._source); + return new KuzzleRole(doc._id, doc._source); }); cb(null, { total: result.result.total, documents: documents }); From 548472fe96600b81fa6bd204ccfe94e7d247ccd0 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 10:27:23 +0100 Subject: [PATCH 08/60] fix passing kuzzle to KuzzleSecurity and KuzzleRole --- src/kuzzle.js | 14 ++++++++------ src/security/KuzzleSecurity.js | 22 +++++----------------- src/security/kuzzleRole.js | 6 +++++- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index 5ea58ee19..4f434fd13 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -42,10 +42,6 @@ module.exports = Kuzzle = function (url, options, cb) { value: {}, writable: true }, - security: { - value: new KuzzleSecurity(this), - enumerable: true - }, connectCB: { value: cb }, @@ -114,7 +110,6 @@ module.exports = Kuzzle = function (url, options, cb) { value: url, enumerable: true }, - // writable properties autoQueue: { value: false, enumerable: true, @@ -222,7 +217,7 @@ module.exports = Kuzzle = function (url, options, cb) { } }); - /* + /** * Some methods (mainly read queries) require a callback function. This function exists to avoid repetition of code, * and is called by these methods */ @@ -234,6 +229,13 @@ module.exports = Kuzzle = function (url, options, cb) { } }); + /** + * Create an attribute security that embed all methods for manage Role, Profile and User + */ + Object.defineProperty(this, 'security', { + value: new KuzzleSecurity(this) + }); + if (!options || !options.connect || options.connect === 'auto') { this.connect(); diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index d4c528fe1..086651fc3 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -1,5 +1,5 @@ var - KuzzleRole = require('./KuzzleRole'), + KuzzleRole = require('./kuzzleRole'), KuzzleProfile = require('./kuzzleProfile'), KuzzleUser = require('./kuzzleUser'); @@ -12,17 +12,8 @@ var */ function KuzzleSecurity(kuzzle) { - Object.defineProperties(this, { - kuzzle: { - value: kuzzle, - enumerable: true - }, - // writable properties - headers: { - value: JSON.parse(JSON.stringify(kuzzle.headers)), - enumerable: true, - writable: true - } + Object.defineProperty(this, 'kuzzle', { + value: kuzzle }); Object.defineProperty(this, 'buildQueryArgs', { @@ -77,10 +68,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { } self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); - - query = self.kuzzle.addHeaders({body: filters}, this.headers); - - self.kuzzle.query(this.buildQueryArgs('security', 'searchRoles'), query, options, function (error, result) { + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, options, function (error, result) { var documents; if (error) { @@ -88,7 +76,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { } documents = result.result.hits.map(function (doc) { - return new KuzzleRole(doc._id, doc._source); + return new KuzzleRole(this, doc._id, doc._source); }); cb(null, { total: result.result.total, documents: documents }); diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 4022eebea..2f2f0eba8 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -1,4 +1,4 @@ -function KuzzleRole(roleId, content) { +function KuzzleRole(kuzzle, roleId, content) { // Define properties Object.defineProperties(this, { // private properties @@ -16,6 +16,10 @@ function KuzzleRole(roleId, content) { } }); + Object.defineProperty(this, 'kuzzle', { + value: kuzzle + }); + // handling provided arguments if (!content && roleId && typeof roleId === 'object') { content = roleId; From f72430b13e836be4cad2613241e483710bbebd82 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 11:02:10 +0100 Subject: [PATCH 09/60] change KuzzleSecurity enumerable --- src/kuzzle.js | 3 ++- src/security/kuzzleRole.js | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index 4f434fd13..5d1d9cff9 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -233,7 +233,8 @@ module.exports = Kuzzle = function (url, options, cb) { * Create an attribute security that embed all methods for manage Role, Profile and User */ Object.defineProperty(this, 'security', { - value: new KuzzleSecurity(this) + value: new KuzzleSecurity(this), + enumerable: true }); diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 2f2f0eba8..1171af44a 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -69,7 +69,9 @@ KuzzleRole.prototype.save = function (options, cb) { * @return {Object} this */ KuzzleRole.prototype.setContent = function (data) { + this.content = data; + return this; }; module.exports = KuzzleRole; From dcc0d92385282c514ba68b7afc4a300b94f83145 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 11:17:36 +0100 Subject: [PATCH 10/60] add comment in searchRoles --- src/security/KuzzleSecurity.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 086651fc3..c3a7325ae 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -50,8 +50,13 @@ KuzzleSecurity.prototype.fetchRole = function (name, cb) { }; /** + * Executes a search on roles according to a filter * - * @param {object} filters + * /!\ There is a small delay between role creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a role that was just been created won’t be returned by this function. + * + * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response * @@ -59,7 +64,6 @@ KuzzleSecurity.prototype.fetchRole = function (name, cb) { */ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { var - query, self = this; if (!cb && typeof options === 'function') { @@ -68,6 +72,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { } self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, options, function (error, result) { var documents; @@ -76,7 +81,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { } documents = result.result.hits.map(function (doc) { - return new KuzzleRole(this, doc._id, doc._source); + return new KuzzleRole(self, doc._id, doc._source); }); cb(null, { total: result.result.total, documents: documents }); From 9d127c323ff4df4b8e327e99391d3f6588f4a773 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 11:21:36 +0100 Subject: [PATCH 11/60] remove option from searchRoles --- src/security/KuzzleSecurity.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index c3a7325ae..f67e3442e 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -49,6 +49,7 @@ function KuzzleSecurity(kuzzle) { KuzzleSecurity.prototype.fetchRole = function (name, cb) { }; + /** * Executes a search on roles according to a filter * @@ -57,23 +58,17 @@ KuzzleSecurity.prototype.fetchRole = function (name, cb) { * That means that a role that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` - * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ -KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { +KuzzleSecurity.prototype.searchRoles = function (filters, cb) { var self = this; - if (!cb && typeof options === 'function') { - cb = options; - options = null; - } - self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); - self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, options, function (error, result) { + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, null, function (error, result) { var documents; if (error) { From 155d3223d9b968ff4727afe5045f2fd82f2f5500 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 12:00:53 +0100 Subject: [PATCH 12/60] add comments for functions in kuzzlesecurity --- src/security/KuzzleSecurity.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index f67e3442e..b097ff45c 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -106,10 +106,16 @@ KuzzleSecurity.prototype.createRole = function (role, cb) { KuzzleSecurity.prototype.fetchProfile = function (name, hydrate, cb) { }; + /** + * Executes a search on profiles according to a filter * - * @param {object} filters - * @param {Boolean} hydrate + * /!\ There is a small delay between profile creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a profile that was just been created won’t be returned by this function. + * + * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` + * @param {Boolean} hydrate - if hydrate is true, profiles will have a list of Role object instead of just a list of role id * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this @@ -139,10 +145,16 @@ KuzzleSecurity.prototype.createProfile = function (profile, cb) { KuzzleSecurity.prototype.fetchUser = function (name, hydrate, cb) { }; + /** + * Executes a search on user according to a filter * - * @param {object} filters - * @param {Boolean} hydrate + * /!\ There is a small delay between user creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a user that was just been created won’t be returned by this function. + * + * @param {Object} filters - same filters as documents filters + * @param {Boolean} hydrate - if hydrate is true, users will have a Profile object instead of just a profile id * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this From 35c48cb041c6ff8d43d2d139ea443e3d53844e96 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 12:02:18 +0100 Subject: [PATCH 13/60] rename getProfiles getRoles in hydrate --- src/security/kuzzleProfile.js | 3 +-- src/security/kuzzleUser.js | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 33fddf077..db042ffd7 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -21,11 +21,10 @@ function KuzzleProfile() { } /** - * @param {Boolean} hydrate * * @returns {Object} this */ -KuzzleProfile.prototype.getRoles = function (hydrate) { +KuzzleProfile.prototype.hydrate = function () { }; diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index fcdfadcc9..25b508048 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -21,11 +21,9 @@ function KuzzleUser() { } /** - * @param {Boolean} hydrate - * * @returns {Object} this */ -KuzzleUser.prototype.getProfiles = function (hydrate) { +KuzzleUser.prototype.hydrate = function () { }; From 5efdf31297aef0fb1c9114f2c0491356b40dc798 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 12:15:39 +0100 Subject: [PATCH 14/60] remove return this from hydrate functions --- src/security/kuzzleProfile.js | 1 - src/security/kuzzleUser.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index db042ffd7..5d8b1feb1 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -22,7 +22,6 @@ function KuzzleProfile() { /** * - * @returns {Object} this */ KuzzleProfile.prototype.hydrate = function () { diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 25b508048..92f20781c 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -21,7 +21,7 @@ function KuzzleUser() { } /** - * @returns {Object} this + * */ KuzzleUser.prototype.hydrate = function () { From c318d1bdfcd90c24cc762cea0d056b58a97bf654 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 13:54:01 +0100 Subject: [PATCH 15/60] add KuzzleRole KuzzleProfile KuzzleUser constructors --- src/kuzzle.js | 1 - src/security/KuzzleSecurity.js | 36 ++++++++++++++++++++++++++++++++++ src/security/kuzzleProfile.js | 35 +++++++++++++++++++++++++++++++-- src/security/kuzzleRole.js | 12 ++++++------ src/security/kuzzleUser.js | 35 +++++++++++++++++++++++++++++++-- 5 files changed, 108 insertions(+), 11 deletions(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index dde18c7b7..63242853f 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -1109,7 +1109,6 @@ Kuzzle.prototype.startQueuing = function () { if (this.state === 'offline' && !this.autoQueue) { this.queuing = true; } - return this; }; diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index b097ff45c..40b704ad8 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -96,6 +96,18 @@ KuzzleSecurity.prototype.createRole = function (role, cb) { }; +/** + * Instantiate a new KuzzleRole object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - role id + * @param {object} content - role content + * @constructor + */ +KuzzleSecurity.prototype.roleFactory = function(id, content) { + return new KuzzleRole(this.kuzzle, id, content); +}; + /** * @param {string} name * @param {Boolean} hydrate @@ -135,6 +147,18 @@ KuzzleSecurity.prototype.createProfile = function (profile, cb) { }; +/** + * Instantiate a new KuzzleProfile object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - profile id + * @param {object} content - profile content + * @constructor + */ +KuzzleSecurity.prototype.profileFactory = function(id, content) { + return new KuzzleProfile(this.kuzzle, id, content); +}; + /** * @param {string} name * @param {Boolean} hydrate @@ -174,5 +198,17 @@ KuzzleSecurity.prototype.createUser = function (profile, cb) { }; +/** + * Instantiate a new KuzzleUser object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - user id + * @param {object} content - user content + * @constructor + */ +KuzzleSecurity.prototype.userFactory = function(id, content) { + return new KuzzleUser(this.kuzzle, id, content); +}; + module.exports = KuzzleSecurity; \ No newline at end of file diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 5d8b1feb1..391efc37a 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,16 +1,47 @@ -function KuzzleProfile() { +function KuzzleProfile(kuzzle, id, content) { // Define properties Object.defineProperties(this, { // private properties // read-only properties // writable properties + id: { + value: undefined, + enumerable: true, + writable: true + }, + content: { + value: {}, + writable: true, + enumerable: true + } }); + Object.defineProperty(this, 'kuzzle', { + value: kuzzle + }); + + // handling provided arguments + if (!content && id && typeof id === 'object') { + content = id; + id = null; + } + + if (content) { + this.setContent(content); + } + + if (id) { + Object.defineProperty(this, 'id', { + value: id, + enumerable: true + }); + } + if (this.kuzzle.bluebird) { return this.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var whitelist = ['getRoles', 'save']; + var whitelist = ['hydrate', 'save']; return passes && whitelist.indexOf(name) !== -1; } diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 1171af44a..ef249459f 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -1,4 +1,4 @@ -function KuzzleRole(kuzzle, roleId, content) { +function KuzzleRole(kuzzle, id, content) { // Define properties Object.defineProperties(this, { // private properties @@ -21,18 +21,18 @@ function KuzzleRole(kuzzle, roleId, content) { }); // handling provided arguments - if (!content && roleId && typeof roleId === 'object') { - content = roleId; - roleId = null; + if (!content && id && typeof id === 'object') { + content = id; + id = null; } if (content) { this.setContent(content); } - if (roleId) { + if (id) { Object.defineProperty(this, 'id', { - value: roleId, + value: id, enumerable: true }); } diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 92f20781c..cb130c1f8 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,16 +1,47 @@ -function KuzzleUser() { +function KuzzleUser(kuzzle, id, content) { // Define properties Object.defineProperties(this, { // private properties // read-only properties // writable properties + id: { + value: undefined, + enumerable: true, + writable: true + }, + content: { + value: {}, + writable: true, + enumerable: true + } }); + Object.defineProperty(this, 'kuzzle', { + value: kuzzle + }); + + // handling provided arguments + if (!content && id && typeof id === 'object') { + content = id; + id = null; + } + + if (content) { + this.setContent(content); + } + + if (id) { + Object.defineProperty(this, 'id', { + value: id, + enumerable: true + }); + } + if (this.kuzzle.bluebird) { return this.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var whitelist = ['getProfiles', 'save']; + var whitelist = ['hydrate', 'save']; return passes && whitelist.indexOf(name) !== -1; } From d15a4f829832c1a10db5fac83c1476df64f723c0 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 4 Feb 2016 14:37:27 +0100 Subject: [PATCH 16/60] add inherit KuzzleDocumentSecurity --- src/security/KuzzleSecurity.js | 1 + src/security/kuzzleProfile.js | 61 +++++------------------- src/security/kuzzleRole.js | 64 ++++++-------------------- src/security/kuzzleSecurityDocument.js | 53 +++++++++++++++++++++ src/security/kuzzleUser.js | 61 +++++------------------- 5 files changed, 91 insertions(+), 149 deletions(-) create mode 100644 src/security/kuzzleSecurityDocument.js diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 40b704ad8..84db8a36e 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -79,6 +79,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { return new KuzzleRole(self, doc._id, doc._source); }); + console.log(documents); cb(null, { total: result.result.total, documents: documents }); }); diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 391efc37a..5b9785723 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,44 +1,12 @@ -function KuzzleProfile(kuzzle, id, content) { - // Define properties - Object.defineProperties(this, { - // private properties - // read-only properties - // writable properties - id: { - value: undefined, - enumerable: true, - writable: true - }, - content: { - value: {}, - writable: true, - enumerable: true - } - }); - - Object.defineProperty(this, 'kuzzle', { - value: kuzzle - }); +var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); - // handling provided arguments - if (!content && id && typeof id === 'object') { - content = id; - id = null; - } - - if (content) { - this.setContent(content); - } +function KuzzleProfile(kuzzle, id, content) { - if (id) { - Object.defineProperty(this, 'id', { - value: id, - enumerable: true - }); - } + KuzzleSecurityDocument.call(this, kuzzle, id, content); - if (this.kuzzle.bluebird) { - return this.kuzzle.bluebird.promisifyAll(this, { + // promisifying + if (kuzzle.bluebird) { + return kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { var whitelist = ['hydrate', 'save']; @@ -48,9 +16,14 @@ function KuzzleProfile(kuzzle, id, content) { }); } - return this; } +KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { + constructor: { + value: KuzzleProfile + } +}); + /** * */ @@ -68,14 +41,4 @@ KuzzleProfile.prototype.save = function (options, cb) { }; -/** - * - * @param {Object} data - New profile content - * - * @return {Object} this - */ -KuzzleProfile.prototype.setContent = function (data) { - -}; - module.exports = KuzzleProfile; diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index ef249459f..361324ad6 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -1,45 +1,14 @@ -function KuzzleRole(kuzzle, id, content) { - // Define properties - Object.defineProperties(this, { - // private properties - // read-only properties - // writable properties - id: { - value: undefined, - enumerable: true, - writable: true - }, - content: { - value: {}, - writable: true, - enumerable: true - } - }); +var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); +var util = require('util'); - Object.defineProperty(this, 'kuzzle', { - value: kuzzle - }); - // handling provided arguments - if (!content && id && typeof id === 'object') { - content = id; - id = null; - } +function KuzzleRole(kuzzleSecurity, id, content) { - if (content) { - this.setContent(content); - } - - if (id) { - Object.defineProperty(this, 'id', { - value: id, - enumerable: true - }); - } + KuzzleSecurityDocument.call(this, kuzzleSecurity.kuzzle, id, content); // promisifying - if (this.kuzzle.bluebird) { - return this.kuzzle.bluebird.promisifyAll(this, { + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { var whitelist = ['save']; @@ -49,9 +18,14 @@ function KuzzleRole(kuzzle, id, content) { }); } - return this; } +KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { + constructor: { + value: KuzzleRole + } +}); + /** * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response @@ -62,16 +36,4 @@ KuzzleRole.prototype.save = function (options, cb) { }; -/** - * - * @param {Object} data - New role content - * - * @return {Object} this - */ -KuzzleRole.prototype.setContent = function (data) { - this.content = data; - - return this; -}; - -module.exports = KuzzleRole; +module.exports = KuzzleRole; \ No newline at end of file diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js new file mode 100644 index 000000000..54bd9e918 --- /dev/null +++ b/src/security/kuzzleSecurityDocument.js @@ -0,0 +1,53 @@ +function KuzzleSecurityDocument(kuzzle, id, content) { + // Define properties + Object.defineProperties(this, { + // private properties + // read-only properties + // writable properties + id: { + value: undefined, + enumerable: true, + writable: true + }, + content: { + value: {}, + writable: true, + enumerable: true + } + }); + + Object.defineProperty(this, 'kuzzle', { + value: kuzzle + }); + + // handling provided arguments + if (!content && id && typeof id === 'object') { + content = id; + id = null; + } + + if (content) { + this.setContent(content); + } + + if (id) { + Object.defineProperty(this, 'id', { + value: id, + enumerable: true + }); + } +} + +/** + * + * @param {Object} data - New securityDocument content + * + * @return {Object} this + */ +KuzzleSecurityDocument.prototype.setContent = function (data) { + this.content = data; + + return this; +}; + +module.exports = KuzzleSecurityDocument; \ No newline at end of file diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index cb130c1f8..cb6cfd74a 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,44 +1,12 @@ -function KuzzleUser(kuzzle, id, content) { - // Define properties - Object.defineProperties(this, { - // private properties - // read-only properties - // writable properties - id: { - value: undefined, - enumerable: true, - writable: true - }, - content: { - value: {}, - writable: true, - enumerable: true - } - }); - - Object.defineProperty(this, 'kuzzle', { - value: kuzzle - }); +var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); - // handling provided arguments - if (!content && id && typeof id === 'object') { - content = id; - id = null; - } - - if (content) { - this.setContent(content); - } +function KuzzleUser(kuzzle, id, content) { - if (id) { - Object.defineProperty(this, 'id', { - value: id, - enumerable: true - }); - } + KuzzleSecurityDocument.call(this, kuzzle, id, content); - if (this.kuzzle.bluebird) { - return this.kuzzle.bluebird.promisifyAll(this, { + // promisifying + if (kuzzle.bluebird) { + return kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { var whitelist = ['hydrate', 'save']; @@ -48,9 +16,14 @@ function KuzzleUser(kuzzle, id, content) { }); } - return this; } +KuzzleUser.prototype = Object.create(KuzzleUser.prototype, { + constructor: { + value: KuzzleUser + } +}); + /** * */ @@ -68,14 +41,4 @@ KuzzleUser.prototype.save = function (options, cb) { }; -/** - * - * @param {Object} data - New user content - * - * @return {Object} this - */ -KuzzleUser.prototype.setContent = function (data) { - -}; - module.exports = KuzzleUser; From 39236f5c4d1cac85e1a84b2aa4b8f3076190d974 Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Thu, 4 Feb 2016 16:12:22 +0100 Subject: [PATCH 17/60] add searchProfile in security --- src/security/KuzzleSecurity.js | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 84db8a36e..99d8c4484 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -128,13 +128,46 @@ KuzzleSecurity.prototype.fetchProfile = function (name, hydrate, cb) { * That means that a profile that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` - * @param {Boolean} hydrate - if hydrate is true, profiles will have a list of Role object instead of just a list of role id + * @param {Boolean} [hydrate] - if hydrate is true, profiles will have a list of Role object instead of just a list of role id * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { + var + self = this; + + + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = false; + } + + filters.hydrate = hydrate; + + self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); + + self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, result) { + var documents; + + if (error) { + return cb(error); + } + + documents = result.result.hits.map(function (doc) { + if (hydrate) { + doc._source.roles = doc._source.roles.map(function(role) { + return new KuzzleRole(self, role._id, role._source); + }); + } + return new KuzzleProfile(self, doc._id, doc._source); + }); + + cb(null, { total: result.result.total, documents: documents }); + }); + + return this; }; /** From 99c1f8f6b9e7d0f0d23c4f59719ca6f7155cb2b6 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 10:41:28 +0100 Subject: [PATCH 18/60] add fetchRole --- src/security/KuzzleSecurity.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 84db8a36e..71920f72d 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -47,7 +47,21 @@ function KuzzleSecurity(kuzzle) { * @returns {Object} this */ KuzzleSecurity.prototype.fetchRole = function (name, cb) { + var + data = {_id: name}, + self = this; + + self.kuzzle.callbackRequired('KuzzleSecurity.fetchRole', cb); + + self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, new KuzzleRole(self, res.result._id, res.result._source)); + }); + return this; }; /** @@ -79,7 +93,6 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { return new KuzzleRole(self, doc._id, doc._source); }); - console.log(documents); cb(null, { total: result.result.total, documents: documents }); }); From 1d1b843c6e1c08a4dddd7724ea89931435af6582 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 10:46:00 +0100 Subject: [PATCH 19/60] rename fetch to get in security + blacklist factory security --- src/security/KuzzleSecurity.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 4e74ec6f4..4e5c9a06a 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -29,7 +29,7 @@ function KuzzleSecurity(kuzzle) { return this.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var blacklist = []; + var blacklist = ['roleFactory', 'profileFactory', 'userFactory']; return passes && blacklist.indexOf(name) === -1; } @@ -41,17 +41,19 @@ function KuzzleSecurity(kuzzle) { /** - * @param {string} name + * Retrieve a single Role using its unique role ID. + * + * @param {string} id * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchRole = function (name, cb) { +KuzzleSecurity.prototype.getRole = function (id, cb) { var - data = {_id: name}, + data = {_id: id}, self = this; - self.kuzzle.callbackRequired('KuzzleSecurity.fetchRole', cb); + self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, res) { if (err) { @@ -207,13 +209,13 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { }; /** - * @param {string} name + * @param {string} id * @param {Boolean} hydrate * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchUser = function (name, hydrate, cb) { +KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { }; From 7def2132db8a54578f107a55a4be64934bd403ca Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Fri, 5 Feb 2016 10:52:29 +0100 Subject: [PATCH 20/60] add getProfile into kuzzleSecurity --- src/security/KuzzleSecurity.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 99d8c4484..b23072b1d 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -110,14 +110,30 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { }; /** - * @param {string} name - * @param {Boolean} hydrate + * @param {string} id * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ -KuzzleSecurity.prototype.fetchProfile = function (name, hydrate, cb) { +KuzzleSecurity.prototype.getProfile = function (id, cb) { + var + self = this; + + self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); + + self.kuzzle.query(this.buildQueryArgs('getProfile'), {_id: id}, null, function (error, response) { + if (error) { + return cb(error); + } + response.result._source.roles = response.result._source.roles.map(function(role) { + return new KuzzleRole(self, role._id, role._source); + }); + + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); + }); + + return this; }; /** @@ -137,7 +153,6 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { var self = this; - if (!cb && typeof hydrate === 'function') { cb = hydrate; hydrate = false; @@ -147,14 +162,14 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); - self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, result) { + self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, response) { var documents; if (error) { return cb(error); } - documents = result.result.hits.map(function (doc) { + documents = response.result.hits.map(function (doc) { if (hydrate) { doc._source.roles = doc._source.roles.map(function(role) { return new KuzzleRole(self, role._id, role._source); @@ -164,7 +179,7 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { return new KuzzleProfile(self, doc._id, doc._source); }); - cb(null, { total: result.result.total, documents: documents }); + cb(null, { total: response.result.total, documents: documents }); }); return this; From 9a3397a12d744f4bdbde8bdc3fe289a6aa812c24 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 10:58:51 +0100 Subject: [PATCH 21/60] add createRole function --- src/security/KuzzleSecurity.js | 62 +++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 4e5c9a06a..438c00f21 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -102,14 +102,68 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { }; /** - * - * @param {object} role - * @param {responseCallback} [cb] - returns Kuzzle's response + * Create a new role in Kuzzle. + * + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same role already exists: throw an error if sets to false. + * Replace the existing role otherwise * + * @param {string} [id] - (optional) document identifier + * @param {object} role - either an instance of a KuzzleRole object, or a plain javascript object + * @param {object} [options] - optional arguments + * @param {responseCallback} [cb] - Handles the query response * @returns {Object} this */ -KuzzleSecurity.prototype.createRole = function (role, cb) { +KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { + var + self = this, + data = {}, + action = 'createRole'; + + if (id && typeof id !== 'string') { + cb = options; + options = role; + role = id; + id = null; + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + if (role instanceof KuzzleRole) { + data = role.toJSON(); + } else { + data.body = role; + } + + if (options) { + action = options.updateIfExist ? 'createOrReplaceRole' : 'createRole'; + } + if (id) { + data._id = id; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleRole(self, res.result._id, res.result._source); + doc.version = res.result._version; + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } + + return this; }; /** From f4cb75e68f10fa9097ec93b343f03f14049b03f1 Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Fri, 5 Feb 2016 10:59:43 +0100 Subject: [PATCH 22/60] Change getProfile doc --- src/security/KuzzleSecurity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index d6aaa23a1..04277a6bd 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -126,7 +126,7 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** * @param {string} id - * @param {responseCallback} [cb] - returns Kuzzle's response + * @param {responseCallback} cb - returns Kuzzle's response * * @returns {Object} this */ From b57e064aae72cd78939eca7fd1c77ad913b55515 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 11:56:19 +0100 Subject: [PATCH 23/60] remove version from createRole --- src/security/KuzzleSecurity.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 60ff0af3f..dad163115 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -156,7 +156,6 @@ KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { } doc = new KuzzleRole(self, res.result._id, res.result._source); - doc.version = res.result._version; cb(null, doc); }); } else { From f9ef1bceee0cd1603538267241f0e3e8b6b19871 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:07:35 +0100 Subject: [PATCH 24/60] change updateIfExist into replaceIfExist in security --- src/security/KuzzleSecurity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index dad163115..b5675dab7 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -140,7 +140,7 @@ KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { } if (options) { - action = options.updateIfExist ? 'createOrReplaceRole' : 'createRole'; + action = options.replaceIfExist ? 'createOrReplaceRole' : 'createRole'; } if (id) { From 31454995111ef03b94b22c930960b01ee5f5bc50 Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Fri, 5 Feb 2016 14:23:23 +0100 Subject: [PATCH 25/60] add kuzzleSecurityDocument:toJSON method & update createProfile & update createRole --- src/security/KuzzleSecurity.js | 83 ++++++++++++++++++++++---- src/security/kuzzleSecurityDocument.js | 19 ++++++ 2 files changed, 90 insertions(+), 12 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index f359fa4bc..e60afcd41 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -109,23 +109,28 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { * If the same role already exists: throw an error if sets to false. * Replace the existing role otherwise * - * @param {string} [id] - (optional) document identifier * @param {object} role - either an instance of a KuzzleRole object, or a plain javascript object + * @param {string} [id] - document identifier * @param {object} [options] - optional arguments * @param {responseCallback} [cb] - Handles the query response * @returns {Object} this */ -KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { +KuzzleSecurity.prototype.createRole = function (role, id, options, cb) { var self = this, data = {}, action = 'createRole'; if (id && typeof id !== 'string') { - cb = options; - options = role; - role = id; - id = null; + if (role instanceof KuzzleRole) { + cb = options; + options = role; + role = id; + id = null; + } + else { + throw new Error('KuzzleSecurity.createRole: cannot create a role without a role ID'); + } } if (!cb && typeof options === 'function') { @@ -136,6 +141,7 @@ KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { if (role instanceof KuzzleRole) { data = role.toJSON(); } else { + data._id = id; data.body = role; } @@ -143,10 +149,6 @@ KuzzleSecurity.prototype.createRole = function (id, role, options, cb) { action = options.updateIfExist ? 'createOrReplaceRole' : 'createRole'; } - if (id) { - data._id = id; - } - if (cb) { self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { var doc; @@ -255,14 +257,71 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { }; /** + * Create a new profile in Kuzzle. + * + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same role already exists: throw an error if sets to false. + * Replace the existing role otherwise * * @param {object} profile - * @param {responseCallback} [cb] - returns Kuzzle's response + * @param {string} [id] - document identifier + * @param {object} [options] - optional arguments + * @param {responseCallback} [cb] - Handles the query response * * @returns {Object} this */ -KuzzleSecurity.prototype.createProfile = function (profile, cb) { +KuzzleSecurity.prototype.createProfile = function (profile, id, options, cb) { + var + self = this, + data = {}, + action = 'createProfile'; + if (id && typeof id !== 'string') { + if (profile instanceof KuzzleProfile) { + cb = options; + options = profile; + profile = id; + id = null; + } + else { + throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a role ID'); + } + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + if (profile instanceof KuzzleProfile) { + data = profile.toJSON(); + } else { + data._id = id; + data.body = profile; + } + + if (options) { + action = options.updateIfExist ? 'createOrReplaceProfile' : 'createProfile'; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleProfile(self, res.result._id, res.result._source); + doc.version = res.result._version; + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } + + return this; }; /** diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 54bd9e918..128fedbac 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -50,4 +50,23 @@ KuzzleSecurityDocument.prototype.setContent = function (data) { return this; }; +/** + * Serialize this object into a JSON object + * + * @return {object} JSON object representing this securityDocument + */ +KuzzleSecurityDocument.prototype.toJSON = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + + return data; +}; + + module.exports = KuzzleSecurityDocument; \ No newline at end of file From 90a0666e6e54cd18189d68328696438fbb886761 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:23:45 +0100 Subject: [PATCH 26/60] add method save for role --- src/security/kuzzleRole.js | 28 +++++++++++++++++++++++--- src/security/kuzzleSecurityDocument.js | 18 +++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 361324ad6..78b1b80b9 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -27,13 +27,35 @@ KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { }); /** - * @param {object} [options] - Optional parameters + * Saves this role into Kuzzle. + * + * If this is a new role, this function will create it in Kuzzle and the id property will be made available. + * Otherwise, this method will replace the latest version of this role in Kuzzle by the current content + * of this object. + * * @param {responseCallback} [cb] - Handles the query response * - * @returns {Object} this + * @returns {*} this */ -KuzzleRole.prototype.save = function (options, cb) { +KuzzleRole.prototype.save = function (cb) { + var + data = this.toJSON(), + self = this; + + + self.kuzzle.query(this.dataCollection.buildQueryArgs('createOrReplace'), data, null, function (error, res) { + if (error) { + return cb ? cb(error) : false; + } + + self.id = res.result._id; + + if (cb) { + cb(null, self); + } + }); + return self; }; module.exports = KuzzleRole; \ No newline at end of file diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 54bd9e918..e2b23cdc6 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -50,4 +50,22 @@ KuzzleSecurityDocument.prototype.setContent = function (data) { return this; }; +/** + * Serialize this object (Role, Profile or User) into a JSON object + * + * @return {object} JSON object representing this document + */ +KuzzleSecurityDocument.prototype.toJSON = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + + return data; +}; + module.exports = KuzzleSecurityDocument; \ No newline at end of file From bfe60a658887e90d6966b30b090067d12a3ade1e Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:36:26 +0100 Subject: [PATCH 27/60] add tojson to user --- src/security/kuzzleUser.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index cb6cfd74a..1532da2e7 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -41,4 +41,26 @@ KuzzleUser.prototype.save = function (options, cb) { }; +/** + * Serialize this object into a JSON object + * + * @return {object} JSON object representing this User + */ +KuzzleUser.prototype.toJSON = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + + if (data.body.profile && data.body.profile._id) { + data.body.profile = data.body.profile._id; + } + + return data; +}; + module.exports = KuzzleUser; From 648fc1d03886a03982db45bc8d2d708aac4cc2cb Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:44:23 +0100 Subject: [PATCH 28/60] mandatory id in role --- src/security/kuzzleRole.js | 6 ++---- src/security/kuzzleSecurityDocument.js | 18 ++++-------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 78b1b80b9..8a13b49b3 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -29,7 +29,7 @@ KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { /** * Saves this role into Kuzzle. * - * If this is a new role, this function will create it in Kuzzle and the id property will be made available. + * If this is a new role, this function will create it in Kuzzle. * Otherwise, this method will replace the latest version of this role in Kuzzle by the current content * of this object. * @@ -43,13 +43,11 @@ KuzzleRole.prototype.save = function (cb) { self = this; - self.kuzzle.query(this.dataCollection.buildQueryArgs('createOrReplace'), data, null, function (error, res) { + self.kuzzle.query(this.dataCollection.buildQueryArgs('createOrReplace'), data, null, function (error) { if (error) { return cb ? cb(error) : false; } - self.id = res.result._id; - if (cb) { cb(null, self); } diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index ac6fb318f..da8eb57a7 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -5,9 +5,8 @@ function KuzzleSecurityDocument(kuzzle, id, content) { // read-only properties // writable properties id: { - value: undefined, - enumerable: true, - writable: true + value: id, + enumerable: true }, content: { value: {}, @@ -20,21 +19,12 @@ function KuzzleSecurityDocument(kuzzle, id, content) { value: kuzzle }); - // handling provided arguments - if (!content && id && typeof id === 'object') { - content = id; - id = null; - } - if (content) { this.setContent(content); } - if (id) { - Object.defineProperty(this, 'id', { - value: id, - enumerable: true - }); + if (!id) { + throw new Error('A security document ' + typeof this + ' must have an id'); } } From 253ccb0c5f25d3f4f1c59833a559722e3d70f201 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:53:28 +0100 Subject: [PATCH 29/60] pass kuzzleSecurity to constructor and add deleteRole --- src/security/KuzzleSecurity.js | 32 ++++++++++++++++++++++++++ src/security/kuzzleRole.js | 4 ++-- src/security/kuzzleSecurityDocument.js | 14 +++++++---- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 967f7cb8d..b3916d305 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -167,6 +167,36 @@ KuzzleSecurity.prototype.createRole = function (role, id, options, cb) { return this; }; +/** + * Delete role. + * + * There is a small delay between role deletion and their existence in our advanced search layer, + * usually a couple of seconds. + * That means that a role that was just been delete will be returned by this function + * + * + * @param {string} id - Role id to delete + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleSecurity.prototype.deleteRole = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data); + } + + return this; +}; + /** * Instantiate a new KuzzleRole object. Workaround to the module.exports limitation, preventing multiple * constructors to be exposed without having to use a factory or a composed object. @@ -179,6 +209,8 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { return new KuzzleRole(this.kuzzle, id, content); }; + + /** * @param {string} id * @param {responseCallback} cb - returns Kuzzle's response diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 8a13b49b3..dcb759572 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -4,7 +4,7 @@ var util = require('util'); function KuzzleRole(kuzzleSecurity, id, content) { - KuzzleSecurityDocument.call(this, kuzzleSecurity.kuzzle, id, content); + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); // promisifying if (kuzzleSecurity.kuzzle.bluebird) { @@ -43,7 +43,7 @@ KuzzleRole.prototype.save = function (cb) { self = this; - self.kuzzle.query(this.dataCollection.buildQueryArgs('createOrReplace'), data, null, function (error) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplace'), data, null, function (error) { if (error) { return cb ? cb(error) : false; } diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index da8eb57a7..9acdfd25c 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -1,7 +1,13 @@ -function KuzzleSecurityDocument(kuzzle, id, content) { +function KuzzleSecurityDocument(kuzzleSecurity, id, content) { // Define properties Object.defineProperties(this, { // private properties + kuzzle: { + value: kuzzleSecurity.kuzzle + }, + kuzzleSecurity: { + value: kuzzleSecurity + }, // read-only properties // writable properties id: { @@ -15,10 +21,6 @@ function KuzzleSecurityDocument(kuzzle, id, content) { } }); - Object.defineProperty(this, 'kuzzle', { - value: kuzzle - }); - if (content) { this.setContent(content); } @@ -40,6 +42,8 @@ KuzzleSecurityDocument.prototype.setContent = function (data) { return this; }; + + /** * Serialize this object into a JSON object * From 2e67a1d5696dbf792244e550f79061272caf4373 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:56:22 +0100 Subject: [PATCH 30/60] add deleteProfile and deleteUser --- src/security/KuzzleSecurity.js | 62 +++++++++++++++++++++++++++++++++- src/security/kuzzleRole.js | 2 +- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index b3916d305..298244613 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -170,7 +170,7 @@ KuzzleSecurity.prototype.createRole = function (role, id, options, cb) { /** * Delete role. * - * There is a small delay between role deletion and their existence in our advanced search layer, + * There is a small delay between role deletion and their deletion in our advanced search layer, * usually a couple of seconds. * That means that a role that was just been delete will be returned by this function * @@ -355,6 +355,36 @@ KuzzleSecurity.prototype.createProfile = function (profile, id, options, cb) { return this; }; +/** + * Delete profile. + * + * There is a small delay between profile deletion and their deletion in our advanced search layer, + * usually a couple of seconds. + * That means that a profile that was just been delete will be returned by this function + * + * + * @param {string} id - Profile id to delete + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleSecurity.prototype.deleteRole = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data); + } + + return this; +}; + /** * Instantiate a new KuzzleProfile object. Workaround to the module.exports limitation, preventing multiple * constructors to be exposed without having to use a factory or a composed object. @@ -406,6 +436,36 @@ KuzzleSecurity.prototype.createUser = function (profile, cb) { }; +/** + * Delete user. + * + * There is a small delay between user deletion and their deletion in our advanced search layer, + * usually a couple of seconds. + * That means that a user that was just been delete will be returned by this function + * + * + * @param {string} id - Profile id to delete + * @param {responseCallback} [cb] - Handles the query response + * @returns {Object} this + */ +KuzzleSecurity.prototype.deleteUser = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data); + } + + return this; +}; + /** * Instantiate a new KuzzleUser object. Workaround to the module.exports limitation, preventing multiple * constructors to be exposed without having to use a factory or a composed object. diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index dcb759572..5c315d989 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -43,7 +43,7 @@ KuzzleRole.prototype.save = function (cb) { self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplace'), data, null, function (error) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, null, function (error) { if (error) { return cb ? cb(error) : false; } From b2e2f50d6cfa1bf3772ede2bf2a8f55026b78763 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:57:48 +0100 Subject: [PATCH 31/60] add User.save() --- src/security/kuzzleUser.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 1532da2e7..a050e35f0 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -32,13 +32,33 @@ KuzzleUser.prototype.hydrate = function () { }; /** - * @param {object} [options] - Optional parameters + * Saves this user into Kuzzle. + * + * If this is a new user, this function will create it in Kuzzle. + * Otherwise, this method will replace the latest version of this user in Kuzzle by the current content + * of this object. + * * @param {responseCallback} [cb] - Handles the query response * - * @returns {Object} this + * @returns {*} this */ -KuzzleUser.prototype.save = function (options, cb) { +KuzzleUser.prototype.save = function (cb) { + var + data = this.toJSON(), + self = this; + + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, null, function (error) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, self); + } + }); + return self; }; /** From b8ea4c5886a427ccf41a5c632bfd0581cb9d78f9 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 14:59:35 +0100 Subject: [PATCH 32/60] fix kuzzleSecurity in kuzzleSecurityDocument constructor --- src/security/KuzzleSecurity.js | 6 +++--- src/security/kuzzleProfile.js | 8 ++++---- src/security/kuzzleUser.js | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 298244613..663811b51 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -206,7 +206,7 @@ KuzzleSecurity.prototype.deleteRole = function (id, cb) { * @constructor */ KuzzleSecurity.prototype.roleFactory = function(id, content) { - return new KuzzleRole(this.kuzzle, id, content); + return new KuzzleRole(this, id, content); }; @@ -394,7 +394,7 @@ KuzzleSecurity.prototype.deleteRole = function (id, cb) { * @constructor */ KuzzleSecurity.prototype.profileFactory = function(id, content) { - return new KuzzleProfile(this.kuzzle, id, content); + return new KuzzleProfile(this, id, content); }; /** @@ -475,7 +475,7 @@ KuzzleSecurity.prototype.deleteUser = function (id, cb) { * @constructor */ KuzzleSecurity.prototype.userFactory = function(id, content) { - return new KuzzleUser(this.kuzzle, id, content); + return new KuzzleUser(this, id, content); }; diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 5b9785723..92abb42f1 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,12 +1,12 @@ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); -function KuzzleProfile(kuzzle, id, content) { +function KuzzleProfile(kuzzleSecurity, id, content) { - KuzzleSecurityDocument.call(this, kuzzle, id, content); + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); // promisifying - if (kuzzle.bluebird) { - return kuzzle.bluebird.promisifyAll(this, { + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { var whitelist = ['hydrate', 'save']; diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index a050e35f0..33408c443 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,12 +1,12 @@ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); -function KuzzleUser(kuzzle, id, content) { +function KuzzleUser(kuzzleSecurity, id, content) { - KuzzleSecurityDocument.call(this, kuzzle, id, content); + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); // promisifying - if (kuzzle.bluebird) { - return kuzzle.bluebird.promisifyAll(this, { + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { var whitelist = ['hydrate', 'save']; From 035f0eec824ba224d315640e2f770e9109bc31b3 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 15:20:30 +0100 Subject: [PATCH 33/60] move hydrate from getUser and getProfile in constructor --- src/security/KuzzleSecurity.js | 28 +++++++++++++++++--------- src/security/kuzzleProfile.js | 15 +++++++++++++- src/security/kuzzleRole.js | 2 -- src/security/kuzzleSecurityDocument.js | 3 +-- src/security/kuzzleUser.js | 9 ++++++++- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 663811b51..aad7ee330 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -55,12 +55,12 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); - self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, res) { + self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, response) { if (err) { return cb(err); } - cb(null, new KuzzleRole(self, res.result._id, res.result._source)); + cb(null, new KuzzleRole(self, response.result._id, response.result._source)); }); return this; @@ -210,7 +210,6 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { }; - /** * @param {string} id * @param {responseCallback} cb - returns Kuzzle's response @@ -228,10 +227,6 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { return cb(error); } - response.result._source.roles = response.result._source.roles.map(function(role) { - return new KuzzleRole(self, role._id, role._source); - }); - cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); @@ -398,14 +393,29 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { }; /** + * Retrieve a single User using its unique user ID. + * * @param {string} id - * @param {Boolean} hydrate * @param {responseCallback} [cb] - returns Kuzzle's response * * @returns {Object} this */ -KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { +KuzzleSecurity.prototype.getUser = function (id, cb) { + var + data = {_id: id}, + self = this; + + self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); + self.kuzzle.query(this.buildQueryArgs('getUser'), data, null, function (err, response) { + if (err) { + return cb(err); + } + + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); + }); + + return this; }; /** diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 92abb42f1..9ecf707c7 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,9 +1,22 @@ -var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); +var + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), + KuzzleRole = require('./kuzzleRole'); function KuzzleProfile(kuzzleSecurity, id, content) { KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + // Hydrate profile with roles if roles are not only string but objects with `_id` and `_source` + if (content && content.roles) { + content.roles = content.roles.map(function (role) { + if (!role._id || !role._source) { + return role; + } + + return new KuzzleRole(kuzzleSecurity, role._id, role._source); + }) + } + // promisifying if (kuzzleSecurity.kuzzle.bluebird) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 5c315d989..077330ccc 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -1,6 +1,4 @@ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); -var util = require('util'); - function KuzzleRole(kuzzleSecurity, id, content) { diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 9acdfd25c..2a78fc5eb 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -42,8 +42,6 @@ KuzzleSecurityDocument.prototype.setContent = function (data) { return this; }; - - /** * Serialize this object into a JSON object * @@ -62,4 +60,5 @@ KuzzleSecurityDocument.prototype.toJSON = function () { return data; }; + module.exports = KuzzleSecurityDocument; \ No newline at end of file diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 33408c443..1657da189 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,9 +1,16 @@ -var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); +var + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), + KuzzleProfile = requrie('./kuzzleProfile'); function KuzzleUser(kuzzleSecurity, id, content) { KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + // Hydrate user with profile if profile is not only a string but an object with `_id` and `_source` + if (content.profile && content.profile._id && content.profile._source) { + content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source) + } + // promisifying if (kuzzleSecurity.kuzzle.bluebird) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { From dde25583b439beaa0aa8c419521592f904ad7f72 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 15:22:59 +0100 Subject: [PATCH 34/60] nitpick require --- src/security/kuzzleUser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 1657da189..176867e13 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,6 +1,6 @@ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), - KuzzleProfile = requrie('./kuzzleProfile'); + KuzzleProfile = require('./kuzzleProfile'); function KuzzleUser(kuzzleSecurity, id, content) { From 92f9d37174f4f2857e13dfeda189f906d8bd20b7 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 15:26:31 +0100 Subject: [PATCH 35/60] add searchUsers method --- src/security/KuzzleSecurity.js | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index aad7ee330..4798c869e 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -267,12 +267,6 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { } documents = response.result.hits.map(function (doc) { - if (hydrate) { - doc._source.roles = doc._source.roles.map(function(role) { - return new KuzzleRole(self, role._id, role._source); - }); - } - return new KuzzleProfile(self, doc._id, doc._source); }); @@ -432,7 +426,33 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { * @returns {Object} this */ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { + var + self = this; + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = false; + } + + filters.hydrate = hydrate; + + self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); + + self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, null, function (error, response) { + var documents; + + if (error) { + return cb(error); + } + + documents = response.result.hits.map(function (doc) { + return new KuzzleUser(self, doc._id, doc._source); + }); + + cb(null, { total: response.result.total, documents: documents }); + }); + + return this; }; /** From 1a7d5b631564aaf8af03bdf1eda84a9510e94f3a Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Fri, 5 Feb 2016 15:45:30 +0100 Subject: [PATCH 36/60] update createProfile & createRole + add save & toJson & hydrate on kuzzleProfile --- src/security/KuzzleSecurity.js | 57 ++++++++------------------- src/security/kuzzleProfile.js | 70 +++++++++++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 46 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 967f7cb8d..70a485bbf 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -109,28 +109,20 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { * If the same role already exists: throw an error if sets to false. * Replace the existing role otherwise * - * @param {object} role - either an instance of a KuzzleRole object, or a plain javascript object - * @param {string} [id] - document identifier - * @param {object} [options] - optional arguments - * @param {responseCallback} [cb] - Handles the query response + * @param {string} id - role identifier + * @param {object} content - a plain javascript object representing the role + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response * @returns {Object} this */ -KuzzleSecurity.prototype.createRole = function (role, id, options, cb) { +KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { var self = this, data = {}, action = 'createRole'; if (id && typeof id !== 'string') { - if (role instanceof KuzzleRole) { - cb = options; - options = role; - role = id; - id = null; - } - else { - throw new Error('KuzzleSecurity.createRole: cannot create a role without a role ID'); - } + throw new Error('KuzzleSecurity.createRole: cannot create a role without a role ID'); } if (!cb && typeof options === 'function') { @@ -138,12 +130,8 @@ KuzzleSecurity.prototype.createRole = function (role, id, options, cb) { options = null; } - if (role instanceof KuzzleRole) { - data = role.toJSON(); - } else { - data._id = id; - data.body = role; - } + data._id = id; + data.body = content; if (options) { action = options.replaceIfExist ? 'createOrReplaceRole' : 'createRole'; @@ -263,29 +251,21 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { * If the same role already exists: throw an error if sets to false. * Replace the existing role otherwise * - * @param {object} profile - * @param {string} [id] - document identifier - * @param {object} [options] - optional arguments - * @param {responseCallback} [cb] - Handles the query response + * @param {string} id - profile identifier + * @param {object} content + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response * * @returns {Object} this */ -KuzzleSecurity.prototype.createProfile = function (profile, id, options, cb) { +KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { var self = this, data = {}, action = 'createProfile'; if (id && typeof id !== 'string') { - if (profile instanceof KuzzleProfile) { - cb = options; - options = profile; - profile = id; - id = null; - } - else { - throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a role ID'); - } + throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a role ID'); } if (!cb && typeof options === 'function') { @@ -293,12 +273,8 @@ KuzzleSecurity.prototype.createProfile = function (profile, id, options, cb) { options = null; } - if (profile instanceof KuzzleProfile) { - data = profile.toJSON(); - } else { - data._id = id; - data.body = profile; - } + data._id = id; + data.body = content; if (options) { action = options.updateIfExist ? 'createOrReplaceProfile' : 'createProfile'; @@ -313,7 +289,6 @@ KuzzleSecurity.prototype.createProfile = function (profile, id, options, cb) { } doc = new KuzzleProfile(self, res.result._id, res.result._source); - doc.version = res.result._version; cb(null, doc); }); } else { diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 5b9785723..4a9783440 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,4 +1,7 @@ -var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); +var + q = require('q'), + KuzzlRole = require('./kuzzleRole'), + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); function KuzzleProfile(kuzzle, id, content) { @@ -25,20 +28,77 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { }); /** + * @param {object} [options] - Optional parameters + * @param {responseCallback} [cb] - Handles the query response * + * @returns {Object} this */ -KuzzleProfile.prototype.hydrate = function () { +KuzzleProfile.prototype.save = function (options, cb) { + var + data = this.toJSON(), + self = this; + + self.kuzzle.callbackRequired('KuzzleProfile.save', cb); + + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, null, function (error) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, self); + } + }); + return self; }; + /** - * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleProfile.prototype.hydrate = function (cb) { + + var + self = this, + data = {ids: self.content.roles}; + + self.kuzzle.callbackRequired('KuzzleProfile.hydrate', cb); + + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), data, null, function (error, response) { + if (error) { + return cb(error); + } + + self.content.roles = response.result.hits.map(function(role) { + return new KuzzlRole(self.kuzzleSecurity, role._id, role._source); + }); + + cb(null, self); + }); +}; + +/** + * Serialize this object into a JSON object * - * @returns {Object} this + * @return {object} JSON object representing this securityDocument */ -KuzzleProfile.prototype.save = function (options, cb) { +KuzzleSecurityDocument.prototype.toJSON = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + data.body = this.content; + + data.body.roles = data.body.roles.map(function(role) { + return role.id; + }); + + return data; }; + module.exports = KuzzleProfile; From 472e52b0131d9fc81af8f5e2cd5f59dca5bd45b6 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 15:48:04 +0100 Subject: [PATCH 37/60] add User.hydrate() --- src/security/kuzzleUser.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 176867e13..e7dac2664 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -32,10 +32,28 @@ KuzzleUser.prototype = Object.create(KuzzleUser.prototype, { }); /** + * This function allow to get the hydrated user of the corresponding current user. + * The hydrated user has profiles and roles. * + * @param {responseCallback} [cb] - Handles the query response */ -KuzzleUser.prototype.hydrate = function () { +KuzzleUser.prototype.hydrate = function (cb) { + var + self = this; + + self.kuzzle.callbackRequired('KuzzleUser.hydrate', cb); + + if (!this.content.profile || typeof this.content.profile !== 'string') { + throw new Error('The User must contains a profile as string in order to be hydrated'); + } + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { + if (error) { + return cb(error); + } + + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); + }); }; /** From 99e0fc21872d905478e2aa0049afc2b1b0a2d140 Mon Sep 17 00:00:00 2001 From: STAFYNIAK Sacha Date: Fri, 5 Feb 2016 15:49:03 +0100 Subject: [PATCH 38/60] fix: deleteProfile --- src/security/KuzzleSecurity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index 63a2d8dd1..c5e231332 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -331,7 +331,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { * @param {responseCallback} [cb] - Handles the query response * @returns {Object} this */ -KuzzleSecurity.prototype.deleteRole = function (id, cb) { +KuzzleSecurity.prototype.deleteProfile = function (id, cb) { var data = {_id: id}; if (cb) { From 96be80bdfbc1fa026342615b9e5ccfdd504efe17 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 16:03:10 +0100 Subject: [PATCH 39/60] add createUser method --- src/security/KuzzleSecurity.js | 60 +++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/src/security/KuzzleSecurity.js b/src/security/KuzzleSecurity.js index c5e231332..844976fae 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/KuzzleSecurity.js @@ -269,11 +269,11 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { * * Takes an optional argument object with the following property: * - replaceIfExist (boolean, default: false): - * If the same role already exists: throw an error if sets to false. - * Replace the existing role otherwise + * If the same profile already exists: throw an error if sets to false. + * Replace the existing profile otherwise * * @param {string} id - profile identifier - * @param {object} content + * @param {object} content - attribute `roles` in `content` must only contains an array of role id * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - (optional) Handles the query response * @@ -286,7 +286,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { action = 'createProfile'; if (id && typeof id !== 'string') { - throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a role ID'); + throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a profile ID'); } if (!cb && typeof options === 'function') { @@ -298,7 +298,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { data.body = content; if (options) { - action = options.updateIfExist ? 'createOrReplaceProfile' : 'createProfile'; + action = options.replaceIfExist ? 'createOrReplaceProfile' : 'createProfile'; } if (cb) { @@ -431,14 +431,58 @@ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { }; /** + * Create a new user in Kuzzle. * - * @param {object} profile - * @param {responseCallback} [cb] - returns Kuzzle's response + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same user already exists: throw an error if sets to false. + * Replace the existing user otherwise + * + * @param {string} id - user identifier + * @param {object} content - attribute `profile` in `content` must only contains the profile id + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response * * @returns {Object} this */ -KuzzleSecurity.prototype.createUser = function (profile, cb) { +KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { + var + self = this, + data = {}, + action = 'createUser'; + + if (id && typeof id !== 'string') { + throw new Error('KuzzleSecurity.createUser: cannot create a user without a user ID'); + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + data._id = id; + data.body = content; + + if (options) { + action = options.replaceIfExist ? 'createOrReplaceUser' : 'createUser'; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleUser(self, res.result._id, res.result._source); + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } + return this; }; /** From 4947b5288067767634a8622cc7f9219358dc6a9c Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 16:09:09 +0100 Subject: [PATCH 40/60] move check id on top of constructor KuzzleSecurityDocument --- src/security/kuzzleSecurityDocument.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 2a78fc5eb..7861d7650 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -1,4 +1,9 @@ function KuzzleSecurityDocument(kuzzleSecurity, id, content) { + + if (!id) { + throw new Error('A security document ' + typeof this + ' must have an id'); + } + // Define properties Object.defineProperties(this, { // private properties @@ -24,10 +29,6 @@ function KuzzleSecurityDocument(kuzzleSecurity, id, content) { if (content) { this.setContent(content); } - - if (!id) { - throw new Error('A security document ' + typeof this + ' must have an id'); - } } /** From ec5db089805bbed0dbf601342cf52d98f7406522 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Fri, 5 Feb 2016 18:02:17 +0100 Subject: [PATCH 41/60] unit test kuzzleSecurity wip --- src/kuzzle.js | 2 +- .../{KuzzleSecurity.js => kuzzleSecurity.js} | 25 +- src/security/kuzzleSecurityDocument.js | 2 +- test/kuzzle/methods.test.js | 15 +- .../kuzzleSecurity/constructor.test.js | 48 + test/security/kuzzleSecurity/methods.test.js | 905 ++++++++++++++++++ .../constructor.test.js | 60 ++ 7 files changed, 1051 insertions(+), 6 deletions(-) rename src/security/{KuzzleSecurity.js => kuzzleSecurity.js} (96%) create mode 100644 test/security/kuzzleSecurity/constructor.test.js create mode 100644 test/security/kuzzleSecurity/methods.test.js create mode 100644 test/security/kuzzleSecurityDocument/constructor.test.js diff --git a/src/kuzzle.js b/src/kuzzle.js index 63242853f..38bea829d 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -1,7 +1,7 @@ var uuid = require('node-uuid'), KuzzleDataCollection = require('./kuzzleDataCollection'), - KuzzleSecurity = require('./security/KuzzleSecurity'); + KuzzleSecurity = require('./security/kuzzleSecurity'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. diff --git a/src/security/KuzzleSecurity.js b/src/security/kuzzleSecurity.js similarity index 96% rename from src/security/KuzzleSecurity.js rename to src/security/kuzzleSecurity.js index 844976fae..a23550e24 100644 --- a/src/security/KuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -50,9 +50,15 @@ function KuzzleSecurity(kuzzle) { */ KuzzleSecurity.prototype.getRole = function (id, cb) { var - data = {_id: id}, + data, self = this; + if (!id) { + throw new Error('Id parameter is mandatory for getRole function'); + } + + data = {_id: id}; + self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, response) { @@ -206,11 +212,18 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { */ KuzzleSecurity.prototype.getProfile = function (id, cb) { var + data, self = this; + if (!id) { + throw new Error('Id parameter is mandatory for getProfile function'); + } + + data = {_id: id}; + self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); - self.kuzzle.query(this.buildQueryArgs('getProfile'), {_id: id}, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('getProfile'), data, null, function (error, response) { if (error) { return cb(error); } @@ -371,9 +384,15 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { */ KuzzleSecurity.prototype.getUser = function (id, cb) { var - data = {_id: id}, + data, self = this; + if (!id) { + throw new Error('Id parameter is mandatory for getUser function'); + } + + data = {_id: id}; + self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); self.kuzzle.query(this.buildQueryArgs('getUser'), data, null, function (err, response) { diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 7861d7650..ed7ff922e 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -1,7 +1,7 @@ function KuzzleSecurityDocument(kuzzleSecurity, id, content) { if (!id) { - throw new Error('A security document ' + typeof this + ' must have an id'); + throw new Error('A security document must have an id'); } // Define properties diff --git a/test/kuzzle/methods.test.js b/test/kuzzle/methods.test.js index 67897d960..d22032001 100644 --- a/test/kuzzle/methods.test.js +++ b/test/kuzzle/methods.test.js @@ -2,7 +2,8 @@ var should = require('should'), rewire = require('rewire'), Kuzzle = rewire('../../src/kuzzle'), - KuzzleDataCollection = require('../../src/kuzzleDataCollection'); + KuzzleDataCollection = require('../../src/kuzzleDataCollection'), + KuzzleSecurity = require('../../src/security/kuzzleSecurity'); describe('Kuzzle methods', function () { var @@ -562,4 +563,16 @@ describe('Kuzzle methods', function () { should(kuzzle.offlineQueue[0].query.controller).be.exactly('auth'); }); }); + + describe('#security', function () { + it('should be an instance of KuzzleSecurity', function () { + var kuzzle; + + kuzzle = new Kuzzle('nowhere', { + connect: 'manual' + }); + + should(kuzzle.security).be.an.instanceOf(KuzzleSecurity); + }); + }); }); diff --git a/test/security/kuzzleSecurity/constructor.test.js b/test/security/kuzzleSecurity/constructor.test.js new file mode 100644 index 000000000..95f7738c4 --- /dev/null +++ b/test/security/kuzzleSecurity/constructor.test.js @@ -0,0 +1,48 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = rewire('../../../src/kuzzle'), + KuzzleSecurity = rewire('../../../src/security/kuzzleSecurity'); + +describe('kuzzleSecurity constructor', function () { + it('should initialize properties and return a valid kuzzleSecurity object', function () { + var + kuzzle = new Kuzzle('foo'), + security; + + security = new KuzzleSecurity(kuzzle); + + should(security).be.instanceof(KuzzleSecurity); + should(security).have.propertyWithDescriptor('kuzzle', { enumerable: false, writable: false, configurable: false }); + should(security).have.propertyWithDescriptor('buildQueryArgs', { enumerable: false, writable: false, configurable: false }); + should(security.kuzzle).be.exactly(kuzzle); + }); + + it('should promisify the right functions', () => { + var + kuzzle, + security; + + Kuzzle.prototype.bluebird = bluebird; + kuzzle = new Kuzzle('foo'); + security = new KuzzleSecurity(kuzzle, 'foo', 'bar'); + + should.exist(security.createRolePromise); + should.exist(security.getRolePromise); + should.exist(security.searchRolesPromise); + should.exist(security.deleteRolePromise); + should.exist(security.createProfilePromise); + should.exist(security.getProfilePromise); + should.exist(security.searchProfilesPromise); + should.exist(security.deleteProfilePromise); + should.exist(security.createUserPromise); + should.exist(security.getUserPromise); + should.exist(security.searchUsersPromise); + should.exist(security.deleteUserPromise); + + should.not.exist(security.roleFactoryPromise); + should.not.exist(security.profileFactoryPromise); + should.not.exist(security.userFactoryPromise); + }); +}); \ No newline at end of file diff --git a/test/security/kuzzleSecurity/methods.test.js b/test/security/kuzzleSecurity/methods.test.js new file mode 100644 index 000000000..16890ac83 --- /dev/null +++ b/test/security/kuzzleSecurity/methods.test.js @@ -0,0 +1,905 @@ +var + should = require('should'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleRole = require('../../../src/security/kuzzleRole'), + KuzzleProfile = require('../../../src/security/kuzzleRole'), + KuzzleUser = require('../../../src/security/kuzzleRole'); + +describe('KuzzleSecurity methods', function () { + var + kuzzle, + expectedQuery, + result, + error, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#getRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar', _source: {} }}; + expectedQuery = { + action: 'getRole', + controller: 'security', + _id: 'foobar' + }; + }); + + it('should send the right getRole query to Kuzzle', function (done) { + should(kuzzle.security.getRole(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleRole); + done(); + })).be.exactly(kuzzle.security); + }); + + it('should raise an error if no callback is provided', function () { + should(function () { kuzzle.security.getRole('test'); }).throw(Error); + }); + + it('should throw an error when no id is provided', function () { + should(function () { kuzzle.security.getRole(null, function () {}); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'error'; + this.timeout(50); + + kuzzle.security.getRole('foobar', function (err, res) { + should(err).be.exactly('error'); + should(res).be.undefined(); + done(); + }); + }); + }); + + //describe('#advancedSearch', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // }); + // + // it('should send the right search query to kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = {queuable: false}, + // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; + // + // this.timeout(50); + // expectedQuery.options = options; + // expectedQuery.body = filters; + // + // should(collection.advancedSearch(filters, options, function (err, res) { + // should(err).be.null(); + // should(res).be.an.Object(); + // should(res.total).be.a.Number().and.be.exactly(result.result.total); + // should(res.documents).be.an.Array(); + // should(res.documents.length).be.exactly(result.result.hits.length); + // + // res.documents.forEach(function (item) { + // should(item).be.instanceof(KuzzleDocument); + // }); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should raise an error if no callback is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // should(function () { collection.advancedSearch(); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.advancedSearch({}); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.advancedSearch({}, {}); }).throw(Error); + // should(emitted).be.false(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.advancedSearch({}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.advancedSearch({}, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.advancedSearch({}, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#count', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {count: 42 }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'count', + // controller: 'read', + // body: {} + // }; + // }); + // + // it('should send the right count query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }, + // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; + // expectedQuery.options = options; + // expectedQuery.body = filters; + // + // should(collection.count(filters, options, function (err, res) { + // should(err).be.null(); + // should(res).be.a.Number().and.be.exactly(result.result.count); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should raise an error if no callback is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // should(function () { collection.count(); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.count({}); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.count({}, {}); }).throw(Error); + // should(emitted).be.false(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.count({}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.count({}, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.count({}, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#create', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {acknowledged: true }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'createCollection', + // controller: 'write' + // }; + // }); + // + // it('should send the right createCollection query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.create(options, function (err, res) { + // should(err).be.null(); + // should(res).be.an.Object().and.be.exactly(result); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.create(function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.create({}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.create(function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#createDocument', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {_id: 'foobar', _source: { foo: 'bar' }, _version: 1} }; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'create', + // controller: 'write', + // body: {} + // }; + // }); + // + // it('should send the right createDocument query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.createDocument(result.result._source, options, function (err, res) { + // should(err).be.null(); + // should(res).be.instanceof(KuzzleDocument); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.createDocument('id', {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument('id', {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument('id', {}, {}, function () {}); + // should(emitted).be.true(); + // + // collection.createDocument(null, {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument(null, {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument(null, {}, {}, function () {}); + // should(emitted).be.true(); + // + // collection.createDocument(undefined, {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument(undefined, {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument(undefined, {}, {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument({}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.createDocument({}, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should handle a document ID if one is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // expectedQuery._id = 'foo'; + // + // collection.createDocument('foo', {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.createDocument({}, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + // + // it('should be able to handle a KuzzleDocument argument', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // document = new KuzzleDocument(collection, result.result._source); + // + // should(collection.createDocument(document, function (err, res) { + // should(err).be.null(); + // should(res).be.instanceof(KuzzleDocument); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should be able to handle the updateIfExist option', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // expectedQuery.action = 'createOrReplace'; + // + // collection.createDocument(result.result._source, {updateIfExist: true}); + // should(emitted).be.true(); + // }); + //}); + // + //describe('#delete', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { acknowledged: true }; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'deleteCollection', + // controller: 'admin' + // }; + // }); + // + // it('should send the right deleteCollection query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.delete(options, function (err, res) { + // should(err).be.null(); + // should(res).be.an.Object().and.be.exactly(result); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.delete(function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.delete({}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.delete(function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#deleteDocument', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {_id: 'foobar' } }; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'delete', + // controller: 'write', + // body: {} + // }; + // }); + // + // it('should send the right delete query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.deleteDocument(result.result._id, options, function (err, res) { + // should(err).be.null(); + // should(res).be.an.Array().and.match([result.result._id]); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle arguments correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.deleteDocument(result.result._id); + // should(emitted).be.true(); + // + // collection.deleteDocument(result.result._id, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.deleteDocument(result.result._id, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.deleteDocument(result.result._id, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + // + // it('should execute a deleteByQuery if a set of filters is provided', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; + // + // this.timeout(50); + // expectedQuery.body = filters; + // expectedQuery.action = 'deleteByQuery'; + // result = { result: {ids: ['foo', 'bar'] }}; + // + // collection.deleteDocument(filters, function (err, res) { + // should(err).be.null(); + // should(res).be.an.Array().and.match(result.result.ids); + // done(); + // }); + // should(emitted).be.true(); + // }); + //}); + // + //describe('#fetchAllDocuments', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // emitted = false; + // }); + // + // it('should forward the query to the advancedSearch method', function () { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // + // collection.advancedSearch = function () { emitted = true; }; + // expectedQuery.options = options; + // + // should(collection.fetchAllDocuments(options, function () {})).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should raise an error if no callback is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // should(function () { collection.fetchAllDocuments(); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.fetchAllDocuments({}); }).throw(Error); + // should(emitted).be.false(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.advancedSearch = function () { emitted = true; }; + // + // collection.fetchAllDocuments(function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.fetchAllDocuments({}, function () {}); + // should(emitted).be.true(); + // }); + //}); + // + //describe('#getMapping', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {'bar': { mappings: { foo: { properties: {}}}} }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'getMapping', + // controller: 'admin', + // body: {} + // }; + // }); + // + // it('should instantiate a new KuzzleDataMapping object', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // + // expectedQuery.options = options; + // + // should(collection.getMapping(options, function (err, res) { + // should(err).be.null(); + // should(res).be.instanceof(KuzzleDataMapping); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should raise an error if no callback is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // should(function () { collection.getMapping(); }).throw(Error); + // should(emitted).be.false(); + // should(function () { collection.getMapping({}); }).throw(Error); + // should(emitted).be.false(); + // }); + // + // it('should handle the callback argument correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.getMapping(function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.getMapping({}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.getMapping({}, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#publishMessage', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {_source: {foo: 'bar'} }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'publish', + // controller: 'write', + // body: {} + // }; + // }); + // + // it('should send the right publish query to Kuzzle', function () { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // + // expectedQuery.options = options; + // + // collection.publishMessage(result.result._source, options); + // should(emitted).be.true(); + // }); + // + // it('should handle a KuzzleDocument object as an argument', function () { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // + // expectedQuery.options = options; + // + // collection.publishMessage(new KuzzleDocument(collection, result.result._source), options); + // should(emitted).be.true(); + // }); + //}); + // + //describe('#replaceDocument', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {_id: 'foobar', _source: { foo: 'bar' } }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'createOrReplace', + // controller: 'write', + // body: {} + // }; + // }); + // + // it('should send the right replaceDocument query to Kuzzle', function (done) { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.replaceDocument(result.result._id, result.result._source, options, function (err, res) { + // should(err).be.null(); + // should(res).be.instanceof(KuzzleDocument); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle arguments correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.replaceDocument('foo'); + // should(emitted).be.true(); + // + // emitted = false; + // collection.replaceDocument('foo', {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.replaceDocument('foo', {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.replaceDocument('foo', {}, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.replaceDocument(result.result._id, result.result._source, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#subscribe', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.state = 'connected'; + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {roomId: 'foobar' }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'on', + // controller: 'subscribe', + // body: {} + // }; + // }); + // + // it('should instantiate a new KuzzleRoom object', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // should(collection.subscribe(expectedQuery.body, {}, function () {})).be.instanceof(KuzzleRoom); + // should(emitted).be.true(); + // }); + // + // it('should handle arguments correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // should(collection.subscribe(expectedQuery.body, function () {})).be.instanceof(KuzzleRoom); + // should(emitted).be.true(); + // }); + // + // it('should raise an error if no callback is provided', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // should(function () { collection.subscribe({}); }).throw(Error); + // should(emitted).be.false(); + // }); + //}); + // + //describe('#truncate', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // emitted = false; + // result = { result: {acknowledged: true }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'truncateCollection', + // controller: 'admin', + // body: {} + // }; + // }); + // + // it('should send the right truncate query to Kuzzle', function () { + // var + // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), + // options = { queuable: false }; + // + // expectedQuery.options = options; + // + // should(collection.truncate(options, function () {})).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle arguments correctly', function () { + // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); + // + // collection.truncate(); + // should(emitted).be.true(); + // + // emitted = false; + // collection.truncate({}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.truncate({}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.truncate(function () {}); + // should(emitted).be.true(); + // }); + //}); + // + //describe('#updateDocument', function () { + // var + // revert, + // refreshed = false; + // + // beforeEach(function () { + // revert = KuzzleDataCollection.__set__('KuzzleDocument', function (collection) { + // var doc = new KuzzleDocument(collection, 'foo', {}); + // + // doc.refresh = function (cb) { + // refreshed = true; + // cb(null, doc); + // }; + // + // return doc; + // }); + // + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // kuzzle.query = queryStub; + // + // emitted = false; + // result = { result: {_id: 'foobar', _source: { foo: 'bar' } }}; + // error = null; + // expectedQuery = { + // index: 'bar', + // collection: 'foo', + // action: 'update', + // controller: 'write', + // body: {} + // }; + // }); + // + // afterEach(function () { + // revert(); + // }); + // + // it('should send the right updateDocument query to Kuzzle', function (done) { + // var + // collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection), + // options = { queuable: false }; + // expectedQuery.options = options; + // + // should(collection.updateDocument(result.result._id, result.result._source, options, function (err, res) { + // should(err).be.null(); + // should(res).be.instanceof(KuzzleDocument); + // should(refreshed).be.true(); + // done(); + // })).be.exactly(collection); + // should(emitted).be.true(); + // }); + // + // it('should handle arguments correctly', function () { + // var collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection); + // + // collection.updateDocument('foo'); + // should(emitted).be.true(); + // + // emitted = false; + // collection.updateDocument('foo', {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.updateDocument('foo', {}, function () {}); + // should(emitted).be.true(); + // + // emitted = false; + // collection.updateDocument('foo', {}, {}, function () {}); + // should(emitted).be.true(); + // }); + // + // it('should call the callback with an error if one occurs', function (done) { + // var collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection); + // error = 'foobar'; + // this.timeout(50); + // + // collection.updateDocument(result.result._id, result.result._source, function (err, res) { + // should(err).be.exactly('foobar'); + // should(res).be.undefined(); + // done(); + // }); + // }); + //}); + // + //describe('#factories', function () { + // beforeEach(function () { + // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + // }); + // + // it('documentFactory should return a new KuzzleDocument object', function () { + // should(kuzzle.dataCollectionFactory('foo').documentFactory('foo', { foo: 'bar'})).be.instanceof(KuzzleDocument); + // }); + // + // it('roomFactory should return a new KuzzleRoom object', function () { + // should(kuzzle.dataCollectionFactory('foo').roomFactory()).be.instanceof(KuzzleRoom); + // }); + // + // it('dataMappingFactory should return a KuzzleDataMapping object', function () { + // should(kuzzle.dataCollectionFactory('foo').dataMappingFactory({})).be.instanceof(KuzzleDataMapping); + // }); + //}); +}); \ No newline at end of file diff --git a/test/security/kuzzleSecurityDocument/constructor.test.js b/test/security/kuzzleSecurityDocument/constructor.test.js new file mode 100644 index 000000000..3273e7768 --- /dev/null +++ b/test/security/kuzzleSecurityDocument/constructor.test.js @@ -0,0 +1,60 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = rewire('../../../src/kuzzle'), + KuzzleSecurityDocument = rewire('../../../src/security/kuzzleSecurityDocument'); + +describe('KuzzleSecurityDocument constructor', function () { + var + kuzzle; + + before(function () { + Kuzzle.prototype.bluebird = bluebird; + }); + + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + }); + + it('should throw an error if no id is provided', done => { + try { + new KuzzleSecurityDocument(kuzzle.security, null, null); + } + catch (e) { + should(e).be.Error(); + return done(); + } + + return done(new Error('Constructor doesn\'t throw an Error')); + }); + + + it('should expose securityDocument properties with the right permissions', function () { + var securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'test', {}); + + should(securityDocument).have.propertyWithDescriptor('kuzzle', { enumerable: false, writable: false, configurable: false }); + should(securityDocument).have.propertyWithDescriptor('kuzzleSecurity', { enumerable: false, writable: false, configurable: false }); + should(securityDocument).have.propertyWithDescriptor('id', { enumerable: true, writable: false, configurable: false }); + should(securityDocument).have.propertyWithDescriptor('content', { enumerable: true, writable: true, configurable: false }); + }); + + it('should expose functions', function () { + var securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'test', {}); + + should.exist(securityDocument.setContent); + should.exist(securityDocument.toJSON); + }); + + it('should handle provided arguments correctly', function () { + var securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'test', {}); + + should(securityDocument).be.instanceof(KuzzleSecurityDocument); + should(securityDocument.id).be.exactly('test'); + should(securityDocument.content).be.empty(); + + securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'test', {some: 'content'}); + should(securityDocument.id).be.exactly('test'); + should(securityDocument.content).match({some: 'content'}); + }); +}); \ No newline at end of file From 5394ebb9b16aee7954e910d838309accc2344aa5 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Mon, 8 Feb 2016 11:36:15 +0100 Subject: [PATCH 42/60] add test in security for roles methods --- src/security/kuzzleSecurity.js | 53 +- .../kuzzleSecurity/constructor.test.js | 52 +- .../{methods.test.js => rolesMethods.test.js} | 578 +++++------------- 3 files changed, 172 insertions(+), 511 deletions(-) rename test/security/kuzzleSecurity/{methods.test.js => rolesMethods.test.js} (50%) diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index a23550e24..d568fe02a 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -45,8 +45,6 @@ function KuzzleSecurity(kuzzle) { * * @param {string} id * @param {responseCallback} [cb] - returns Kuzzle's response - * - * @returns {Object} this */ KuzzleSecurity.prototype.getRole = function (id, cb) { var @@ -68,8 +66,6 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { cb(null, new KuzzleRole(self, response.result._id, response.result._source)); }); - - return this; }; /** @@ -82,7 +78,6 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` * @param {responseCallback} [cb] - returns Kuzzle's response * - * @returns {Object} this */ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { var @@ -103,8 +98,6 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { cb(null, { total: result.result.total, documents: documents }); }); - - return this; }; /** @@ -119,7 +112,6 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { * @param {object} content - a plain javascript object representing the role * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - (optional) Handles the query response - * @returns {Object} this */ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { var @@ -127,7 +119,7 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { data = {}, action = 'createRole'; - if (id && typeof id !== 'string') { + if (!id || typeof id !== 'string') { throw new Error('KuzzleSecurity.createRole: cannot create a role without a role ID'); } @@ -157,8 +149,6 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { } else { self.kuzzle.query(this.buildQueryArgs(action), data); } - - return this; }; /** @@ -171,7 +161,6 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { * * @param {string} id - Role id to delete * @param {responseCallback} [cb] - Handles the query response - * @returns {Object} this */ KuzzleSecurity.prototype.deleteRole = function (id, cb) { var data = {_id: id}; @@ -187,8 +176,6 @@ KuzzleSecurity.prototype.deleteRole = function (id, cb) { } else { this.kuzzle.query(this.buildQueryArgs('deleteRole'), data); } - - return this; }; /** @@ -207,15 +194,13 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** * @param {string} id * @param {responseCallback} cb - returns Kuzzle's response - * - * @returns {Object} this */ KuzzleSecurity.prototype.getProfile = function (id, cb) { var data, self = this; - if (!id) { + if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getProfile function'); } @@ -230,8 +215,6 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); - - return this; }; /** @@ -244,8 +227,6 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` * @param {Boolean} [hydrate] - if hydrate is true, profiles will have a list of Role object instead of just a list of role id * @param {responseCallback} [cb] - returns Kuzzle's response - * - * @returns {Object} this */ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { var @@ -273,8 +254,6 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { cb(null, { total: response.result.total, documents: documents }); }); - - return this; }; /** @@ -289,8 +268,6 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { * @param {object} content - attribute `roles` in `content` must only contains an array of role id * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - (optional) Handles the query response - * - * @returns {Object} this */ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { var @@ -298,7 +275,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { data = {}, action = 'createProfile'; - if (id && typeof id !== 'string') { + if (!id || typeof id !== 'string') { throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a profile ID'); } @@ -328,8 +305,6 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { } else { self.kuzzle.query(this.buildQueryArgs(action), data); } - - return this; }; /** @@ -342,7 +317,6 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { * * @param {string} id - Profile id to delete * @param {responseCallback} [cb] - Handles the query response - * @returns {Object} this */ KuzzleSecurity.prototype.deleteProfile = function (id, cb) { var data = {_id: id}; @@ -358,8 +332,6 @@ KuzzleSecurity.prototype.deleteProfile = function (id, cb) { } else { this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data); } - - return this; }; /** @@ -379,15 +351,13 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { * * @param {string} id * @param {responseCallback} [cb] - returns Kuzzle's response - * - * @returns {Object} this */ KuzzleSecurity.prototype.getUser = function (id, cb) { var data, self = this; - if (!id) { + if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getUser function'); } @@ -402,8 +372,6 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { cb(null, new KuzzleUser(self, response.result._id, response.result._source)); }); - - return this; }; /** @@ -416,8 +384,6 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { * @param {Object} filters - same filters as documents filters * @param {Boolean} hydrate - if hydrate is true, users will have a Profile object instead of just a profile id * @param {responseCallback} [cb] - returns Kuzzle's response - * - * @returns {Object} this */ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { var @@ -445,8 +411,6 @@ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { cb(null, { total: response.result.total, documents: documents }); }); - - return this; }; /** @@ -461,8 +425,6 @@ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { * @param {object} content - attribute `profile` in `content` must only contains the profile id * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - (optional) Handles the query response - * - * @returns {Object} this */ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { var @@ -470,7 +432,7 @@ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { data = {}, action = 'createUser'; - if (id && typeof id !== 'string') { + if (!id || typeof id !== 'string') { throw new Error('KuzzleSecurity.createUser: cannot create a user without a user ID'); } @@ -500,8 +462,6 @@ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { } else { self.kuzzle.query(this.buildQueryArgs(action), data); } - - return this; }; /** @@ -514,7 +474,6 @@ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { * * @param {string} id - Profile id to delete * @param {responseCallback} [cb] - Handles the query response - * @returns {Object} this */ KuzzleSecurity.prototype.deleteUser = function (id, cb) { var data = {_id: id}; @@ -530,8 +489,6 @@ KuzzleSecurity.prototype.deleteUser = function (id, cb) { } else { this.kuzzle.query(this.buildQueryArgs('deleteUser'), data); } - - return this; }; /** diff --git a/test/security/kuzzleSecurity/constructor.test.js b/test/security/kuzzleSecurity/constructor.test.js index 95f7738c4..10804f91c 100644 --- a/test/security/kuzzleSecurity/constructor.test.js +++ b/test/security/kuzzleSecurity/constructor.test.js @@ -1,48 +1,42 @@ var should = require('should'), - rewire = require('rewire'), bluebird = require('bluebird'), - Kuzzle = rewire('../../../src/kuzzle'), - KuzzleSecurity = rewire('../../../src/security/kuzzleSecurity'); + Kuzzle = require('../../../src/kuzzle'), + KuzzleSecurity = require('../../../src/security/kuzzleSecurity'); describe('kuzzleSecurity constructor', function () { it('should initialize properties and return a valid kuzzleSecurity object', function () { var - kuzzle = new Kuzzle('foo'), - security; + kuzzle = new Kuzzle('foo'); - security = new KuzzleSecurity(kuzzle); - - should(security).be.instanceof(KuzzleSecurity); - should(security).have.propertyWithDescriptor('kuzzle', { enumerable: false, writable: false, configurable: false }); - should(security).have.propertyWithDescriptor('buildQueryArgs', { enumerable: false, writable: false, configurable: false }); - should(security.kuzzle).be.exactly(kuzzle); + should(kuzzle.security).be.instanceof(KuzzleSecurity); + should(kuzzle.security).have.propertyWithDescriptor('kuzzle', { enumerable: false, writable: false, configurable: false }); + should(kuzzle.security).have.propertyWithDescriptor('buildQueryArgs', { enumerable: false, writable: false, configurable: false }); + should(kuzzle.security.kuzzle).be.exactly(kuzzle); }); it('should promisify the right functions', () => { var - kuzzle, - security; + kuzzle; Kuzzle.prototype.bluebird = bluebird; kuzzle = new Kuzzle('foo'); - security = new KuzzleSecurity(kuzzle, 'foo', 'bar'); - should.exist(security.createRolePromise); - should.exist(security.getRolePromise); - should.exist(security.searchRolesPromise); - should.exist(security.deleteRolePromise); - should.exist(security.createProfilePromise); - should.exist(security.getProfilePromise); - should.exist(security.searchProfilesPromise); - should.exist(security.deleteProfilePromise); - should.exist(security.createUserPromise); - should.exist(security.getUserPromise); - should.exist(security.searchUsersPromise); - should.exist(security.deleteUserPromise); + should.exist(kuzzle.security.createRolePromise); + should.exist(kuzzle.security.getRolePromise); + should.exist(kuzzle.security.searchRolesPromise); + should.exist(kuzzle.security.deleteRolePromise); + should.exist(kuzzle.security.createProfilePromise); + should.exist(kuzzle.security.getProfilePromise); + should.exist(kuzzle.security.searchProfilesPromise); + should.exist(kuzzle.security.deleteProfilePromise); + should.exist(kuzzle.security.createUserPromise); + should.exist(kuzzle.security.getUserPromise); + should.exist(kuzzle.security.searchUsersPromise); + should.exist(kuzzle.security.deleteUserPromise); - should.not.exist(security.roleFactoryPromise); - should.not.exist(security.profileFactoryPromise); - should.not.exist(security.userFactoryPromise); + should.not.exist(kuzzle.security.roleFactoryPromise); + should.not.exist(kuzzle.security.profileFactoryPromise); + should.not.exist(kuzzle.security.userFactoryPromise); }); }); \ No newline at end of file diff --git a/test/security/kuzzleSecurity/methods.test.js b/test/security/kuzzleSecurity/rolesMethods.test.js similarity index 50% rename from test/security/kuzzleSecurity/methods.test.js rename to test/security/kuzzleSecurity/rolesMethods.test.js index 16890ac83..a1c88bfae 100644 --- a/test/security/kuzzleSecurity/methods.test.js +++ b/test/security/kuzzleSecurity/rolesMethods.test.js @@ -1,11 +1,9 @@ var should = require('should'), Kuzzle = require('../../../src/kuzzle'), - KuzzleRole = require('../../../src/security/kuzzleRole'), - KuzzleProfile = require('../../../src/security/kuzzleRole'), - KuzzleUser = require('../../../src/security/kuzzleRole'); + KuzzleRole = require('../../../src/security/kuzzleRole'); -describe('KuzzleSecurity methods', function () { +describe('KuzzleSecurity roles methods', function () { var kuzzle, expectedQuery, @@ -60,7 +58,7 @@ describe('KuzzleSecurity methods', function () { should(err).be.null(); should(res).be.instanceof(KuzzleRole); done(); - })).be.exactly(kuzzle.security); + })); }); it('should raise an error if no callback is provided', function () { @@ -83,435 +81,147 @@ describe('KuzzleSecurity methods', function () { }); }); - //describe('#advancedSearch', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // }); - // - // it('should send the right search query to kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = {queuable: false}, - // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; - // - // this.timeout(50); - // expectedQuery.options = options; - // expectedQuery.body = filters; - // - // should(collection.advancedSearch(filters, options, function (err, res) { - // should(err).be.null(); - // should(res).be.an.Object(); - // should(res.total).be.a.Number().and.be.exactly(result.result.total); - // should(res.documents).be.an.Array(); - // should(res.documents.length).be.exactly(result.result.hits.length); - // - // res.documents.forEach(function (item) { - // should(item).be.instanceof(KuzzleDocument); - // }); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should raise an error if no callback is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // should(function () { collection.advancedSearch(); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.advancedSearch({}); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.advancedSearch({}, {}); }).throw(Error); - // should(emitted).be.false(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.advancedSearch({}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.advancedSearch({}, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.advancedSearch({}, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#count', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {count: 42 }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'count', - // controller: 'read', - // body: {} - // }; - // }); - // - // it('should send the right count query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }, - // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; - // expectedQuery.options = options; - // expectedQuery.body = filters; - // - // should(collection.count(filters, options, function (err, res) { - // should(err).be.null(); - // should(res).be.a.Number().and.be.exactly(result.result.count); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should raise an error if no callback is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // should(function () { collection.count(); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.count({}); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.count({}, {}); }).throw(Error); - // should(emitted).be.false(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.count({}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.count({}, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.count({}, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#create', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {acknowledged: true }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'createCollection', - // controller: 'write' - // }; - // }); - // - // it('should send the right createCollection query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.create(options, function (err, res) { - // should(err).be.null(); - // should(res).be.an.Object().and.be.exactly(result); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.create(function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.create({}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.create(function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#createDocument', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {_id: 'foobar', _source: { foo: 'bar' }, _version: 1} }; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'create', - // controller: 'write', - // body: {} - // }; - // }); - // - // it('should send the right createDocument query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.createDocument(result.result._source, options, function (err, res) { - // should(err).be.null(); - // should(res).be.instanceof(KuzzleDocument); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.createDocument('id', {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument('id', {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument('id', {}, {}, function () {}); - // should(emitted).be.true(); - // - // collection.createDocument(null, {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument(null, {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument(null, {}, {}, function () {}); - // should(emitted).be.true(); - // - // collection.createDocument(undefined, {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument(undefined, {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument(undefined, {}, {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument({}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.createDocument({}, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should handle a document ID if one is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // expectedQuery._id = 'foo'; - // - // collection.createDocument('foo', {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.createDocument({}, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - // - // it('should be able to handle a KuzzleDocument argument', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // document = new KuzzleDocument(collection, result.result._source); - // - // should(collection.createDocument(document, function (err, res) { - // should(err).be.null(); - // should(res).be.instanceof(KuzzleDocument); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should be able to handle the updateIfExist option', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // expectedQuery.action = 'createOrReplace'; - // - // collection.createDocument(result.result._source, {updateIfExist: true}); - // should(emitted).be.true(); - // }); - //}); - // - //describe('#delete', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { acknowledged: true }; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'deleteCollection', - // controller: 'admin' - // }; - // }); - // - // it('should send the right deleteCollection query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.delete(options, function (err, res) { - // should(err).be.null(); - // should(res).be.an.Object().and.be.exactly(result); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.delete(function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.delete({}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.delete(function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#deleteDocument', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {_id: 'foobar' } }; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'delete', - // controller: 'write', - // body: {} - // }; - // }); - // - // it('should send the right delete query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.deleteDocument(result.result._id, options, function (err, res) { - // should(err).be.null(); - // should(res).be.an.Array().and.match([result.result._id]); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle arguments correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.deleteDocument(result.result._id); - // should(emitted).be.true(); - // - // collection.deleteDocument(result.result._id, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.deleteDocument(result.result._id, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.deleteDocument(result.result._id, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - // - // it('should execute a deleteByQuery if a set of filters is provided', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // filters = { and: [ {term: {foo: 'bar'}}, { ids: ['baz', 'qux'] } ] }; - // - // this.timeout(50); - // expectedQuery.body = filters; - // expectedQuery.action = 'deleteByQuery'; - // result = { result: {ids: ['foo', 'bar'] }}; - // - // collection.deleteDocument(filters, function (err, res) { - // should(err).be.null(); - // should(res).be.an.Array().and.match(result.result.ids); - // done(); - // }); - // should(emitted).be.true(); - // }); - //}); + describe('#searchRoles', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: { total: 123, hits: [ {_id: 'myRole', _source: {indexes : {}}} ]}}; + expectedQuery = { + action: 'searchRoles', + controller: 'security' + }; + }); + + it('should send the right search query to kuzzle', function (done) { + var + filters = { indexes: ['test'] }; + + this.timeout(50); + expectedQuery.body = filters; + + should(kuzzle.security.searchRoles(filters, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.documents).be.an.Array(); + should(res.documents).not.be.empty(); + should(res.documents.length).be.exactly(result.result.hits.length); + + res.documents.forEach(function (item) { + should(item).be.instanceof(KuzzleRole); + }); + + done(); + })); + }); + + it('should raise an error if no callback is provided', function () { + var + filters = { indexes: ['test'] }; + + should(function () { kuzzle.security.searchRoles(filters); }).throw(Error); + }); + }); + + + describe('#createRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'myRole', _source: {indexes : {}}} }; + expectedQuery = { + action: 'createRole', + controller: 'security' + }; + }); + + it('should send the right createRole query to Kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzle.security.createRole(result.result._id, result.result._source, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleRole); + done(); + })); + }); + + it('should construct a createOrReplaceRole action if option replaceIfExist is set', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createOrReplaceRole'; + + should(kuzzle.security.createRole(result.result._id, result.result._source, {replaceIfExist: true}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleRole); + done(); + })); + }); + + it('should throw an error if no id provided', function () { + should(function () { kuzzle.security.createRole(null); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + error = 'foobar'; + this.timeout(50); + + kuzzle.security.createRole(result.result._id, result.result._source, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#deleteRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'myRole'} }; + expectedQuery = { + action: 'deleteRole', + controller: 'security', + _id: result.result._id + }; + }); + + it('should send the right delete query to Kuzzle', function (done) { + should(kuzzle.security.deleteRole(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'foobar'; + this.timeout(50); + + kuzzle.security.deleteRole(result.result._id, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#roleFactory', function () { + it('should return an instance of Role', function (done) { + var role = kuzzle.security.roleFactory('test', {index: {}}); + should(role).instanceof(KuzzleRole); + done(); + }); + + it('should throw an error if no id is provided', function (done) { + should((function () { kuzzle.security.roleFactory(null) })).throw(Error); + done(); + }); + }); // //describe('#fetchAllDocuments', function () { // beforeEach(function () { From 4093b7cb780d3b0bfc6197b88a859b175b92d54c Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Mon, 8 Feb 2016 16:10:32 +0100 Subject: [PATCH 43/60] add functions addRole setRoles addProfile --- src/security/kuzzleProfile.js | 45 +- src/security/kuzzleUser.js | 21 +- .../kuzzleSecurity/profilesMethods.test.js | 259 ++++++++++++ .../kuzzleSecurity/rolesMethods.test.js | 392 +----------------- .../kuzzleSecurity/userMethods.test.js | 271 ++++++++++++ 5 files changed, 593 insertions(+), 395 deletions(-) create mode 100644 test/security/kuzzleSecurity/profilesMethods.test.js create mode 100644 test/security/kuzzleSecurity/userMethods.test.js diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 3fee7bbcf..600b4ac0c 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -38,6 +38,8 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { }); /** + * Persist to the persistent layer the current profile + * * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response * @@ -64,6 +66,45 @@ KuzzleProfile.prototype.save = function (options, cb) { }; +/** + * Add a role in the roles list + * @param {KuzzleRole|string} role - can be an instance of KuzzleRole or an id in string + * + * @returns {KuzzleProfile} this + */ +KuzzleProfile.prototype.addRole = function (role) { + + if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { + throw new Error('Parameter "roles" must be a KuzzleRole or a id string'); + } + + if (!this.content.roles) { + this.content.roles = []; + } + + this.content.roles.push(role); + + return this; +}; + +/** + * Set roles list + * @param {Array} roles - can be an array of KuzzleRole or an array of string + * + * @returns {KuzzleProfile} this + */ +KuzzleProfile.prototype.setRoles = function (roles) { + + if (!Array.isArray(roles)) { + throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + } + + this.content.roles = roles; + + return this; +}; + + /** * @param {responseCallback} [cb] - Handles the query response */ @@ -81,7 +122,7 @@ KuzzleProfile.prototype.hydrate = function (cb) { } self.content.roles = response.result.hits.map(function(role) { - return new KuzzlRole(self.kuzzleSecurity, role._id, role._source); + return new KuzzleRole(self.kuzzleSecurity, role._id, role._source); }); cb(null, self); @@ -93,7 +134,7 @@ KuzzleProfile.prototype.hydrate = function (cb) { * * @return {object} JSON object representing this securityDocument */ -KuzzleSecurityDocument.prototype.toJSON = function () { +KuzzleProfile.prototype.toJSON = function () { var data = {}; diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index e7dac2664..226f0a51e 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -25,7 +25,7 @@ function KuzzleUser(kuzzleSecurity, id, content) { } -KuzzleUser.prototype = Object.create(KuzzleUser.prototype, { +KuzzleUser.prototype = Object.create(KuzzleSecurityDocument.prototype, { constructor: { value: KuzzleUser } @@ -47,7 +47,7 @@ KuzzleUser.prototype.hydrate = function (cb) { throw new Error('The User must contains a profile as string in order to be hydrated'); } - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile, hydrate: true}, null, function (error, response) { if (error) { return cb(error); } @@ -56,6 +56,23 @@ KuzzleUser.prototype.hydrate = function (cb) { }); }; +/** + * Set profile in content + * @param {KuzzleProfile|string} profile - can be a KuzzleProfile or an id string + * + * @returns {KuzzleUser} this + */ +KuzzleUser.prototype.setProfile = function (profile) { + + if (typeof profile !== 'string' && !(profile instanceof KuzzleProfile)) { + throw new Error('Parameter "profile" must be a KuzzleProfile or a string'); + } + + this.content.profile = profile; + + return this; +}; + /** * Saves this user into Kuzzle. * diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js new file mode 100644 index 000000000..b631385ec --- /dev/null +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -0,0 +1,259 @@ +var + should = require('should'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleRole = require('../../../src/security/kuzzleRole'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'); + +describe('KuzzleSecurity profiles methods', function () { + var + kuzzle, + expectedQuery, + result, + error, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#getProfile', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar', _source: {} }}; + expectedQuery = { + action: 'getProfile', + controller: 'security', + _id: 'foobar' + }; + }); + + it('should send the right query to Kuzzle', function (done) { + should(kuzzle.security.getProfile(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + + it('should raise an error if no callback is provided', function () { + should(function () { kuzzle.security.getProfile('test'); }).throw(Error); + }); + + it('should throw an error when no id is provided', function () { + should(function () { kuzzle.security.getProfile(null, function () {}); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'error'; + this.timeout(50); + + kuzzle.security.getProfile('foobar', function (err, res) { + should(err).be.exactly('error'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#searchProfiles', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {roles : [{_id: 'myRole', _source: {indexes: {}}}]}} ]}}; + expectedQuery = { + action: 'searchProfiles', + controller: 'security' + }; + }); + + it('should send the right search query to kuzzle and return profile', function (done) { + var + filters = {}; + + result = { result: { total: 123, hits: [{_id: 'foobar', _source: {roles : ['myRole']}}]} }; + + this.timeout(50); + expectedQuery.body = filters; + + should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.documents).be.an.Array(); + should(res.documents).not.be.empty(); + should(res.documents.length).be.exactly(result.result.hits.length); + + res.documents.forEach(function (item) { + should(item).be.instanceof(KuzzleProfile); + + item.content.roles.forEach(function (role) { + should(role).be.String() + }) + }); + + done(); + })); + }); + + it('should send the right search query to kuzzle and return profile with roles', function (done) { + var + filters = {}; + + this.timeout(50); + expectedQuery.body = filters; + + should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.documents).be.an.Array(); + should(res.documents).not.be.empty(); + should(res.documents.length).be.exactly(result.result.hits.length); + + res.documents.forEach(function (item) { + should(item).be.instanceof(KuzzleProfile); + + item.content.roles.forEach(function (role) { + should(role).be.instanceof(KuzzleRole); + }) + }); + + done(); + })); + }); + + it('should raise an error if no callback is provided', function () { + var + filters = {}; + + should(function () { kuzzle.security.searchProfiles(filters); }).throw(Error); + }); + }); + + + describe('#createProfile', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar', _source: {roles: ['myRole']}} }; + expectedQuery = { + action: 'createProfile', + controller: 'security' + }; + }); + + it('should send the right query to Kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzle.security.createProfile(result.result._id, result.result._source, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + + it('should construct a createOrReplaceRole action if option replaceIfExist is set', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createOrReplaceProfile'; + + should(kuzzle.security.createProfile(result.result._id, result.result._source, {replaceIfExist: true}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + + it('should throw an error if no id provided', function () { + should(function () { kuzzle.security.createProfile(null); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + error = 'foobar'; + this.timeout(50); + + kuzzle.security.createProfile(result.result._id, result.result._source, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#deleteRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar'} }; + expectedQuery = { + action: 'deleteProfile', + controller: 'security', + _id: result.result._id + }; + }); + + it('should send the right delete query to Kuzzle', function (done) { + should(kuzzle.security.deleteProfile(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'foobar'; + this.timeout(50); + + kuzzle.security.deleteProfile(result.result._id, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#ProfileFactory', function () { + it('should return an instance of Profile', function (done) { + var role = kuzzle.security.profileFactory('test', {roles: ['myRole']}); + should(role).instanceof(KuzzleProfile); + done(); + }); + + it('should throw an error if no id is provided', function (done) { + should((function () { kuzzle.security.profileFactory(null) })).throw(Error); + done(); + }); + }); +}); \ No newline at end of file diff --git a/test/security/kuzzleSecurity/rolesMethods.test.js b/test/security/kuzzleSecurity/rolesMethods.test.js index a1c88bfae..96b6bc1ba 100644 --- a/test/security/kuzzleSecurity/rolesMethods.test.js +++ b/test/security/kuzzleSecurity/rolesMethods.test.js @@ -53,7 +53,7 @@ describe('KuzzleSecurity roles methods', function () { }; }); - it('should send the right getRole query to Kuzzle', function (done) { + it('should send the right query to Kuzzle', function (done) { should(kuzzle.security.getRole(result.result._id, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleRole); @@ -222,394 +222,4 @@ describe('KuzzleSecurity roles methods', function () { done(); }); }); - // - //describe('#fetchAllDocuments', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // emitted = false; - // }); - // - // it('should forward the query to the advancedSearch method', function () { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // - // collection.advancedSearch = function () { emitted = true; }; - // expectedQuery.options = options; - // - // should(collection.fetchAllDocuments(options, function () {})).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should raise an error if no callback is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // should(function () { collection.fetchAllDocuments(); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.fetchAllDocuments({}); }).throw(Error); - // should(emitted).be.false(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.advancedSearch = function () { emitted = true; }; - // - // collection.fetchAllDocuments(function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.fetchAllDocuments({}, function () {}); - // should(emitted).be.true(); - // }); - //}); - // - //describe('#getMapping', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {'bar': { mappings: { foo: { properties: {}}}} }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'getMapping', - // controller: 'admin', - // body: {} - // }; - // }); - // - // it('should instantiate a new KuzzleDataMapping object', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // - // expectedQuery.options = options; - // - // should(collection.getMapping(options, function (err, res) { - // should(err).be.null(); - // should(res).be.instanceof(KuzzleDataMapping); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should raise an error if no callback is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // should(function () { collection.getMapping(); }).throw(Error); - // should(emitted).be.false(); - // should(function () { collection.getMapping({}); }).throw(Error); - // should(emitted).be.false(); - // }); - // - // it('should handle the callback argument correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.getMapping(function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.getMapping({}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.getMapping({}, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#publishMessage', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {_source: {foo: 'bar'} }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'publish', - // controller: 'write', - // body: {} - // }; - // }); - // - // it('should send the right publish query to Kuzzle', function () { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // - // expectedQuery.options = options; - // - // collection.publishMessage(result.result._source, options); - // should(emitted).be.true(); - // }); - // - // it('should handle a KuzzleDocument object as an argument', function () { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // - // expectedQuery.options = options; - // - // collection.publishMessage(new KuzzleDocument(collection, result.result._source), options); - // should(emitted).be.true(); - // }); - //}); - // - //describe('#replaceDocument', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {_id: 'foobar', _source: { foo: 'bar' } }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'createOrReplace', - // controller: 'write', - // body: {} - // }; - // }); - // - // it('should send the right replaceDocument query to Kuzzle', function (done) { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.replaceDocument(result.result._id, result.result._source, options, function (err, res) { - // should(err).be.null(); - // should(res).be.instanceof(KuzzleDocument); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle arguments correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.replaceDocument('foo'); - // should(emitted).be.true(); - // - // emitted = false; - // collection.replaceDocument('foo', {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.replaceDocument('foo', {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.replaceDocument('foo', {}, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.replaceDocument(result.result._id, result.result._source, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#subscribe', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.state = 'connected'; - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {roomId: 'foobar' }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'on', - // controller: 'subscribe', - // body: {} - // }; - // }); - // - // it('should instantiate a new KuzzleRoom object', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // should(collection.subscribe(expectedQuery.body, {}, function () {})).be.instanceof(KuzzleRoom); - // should(emitted).be.true(); - // }); - // - // it('should handle arguments correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // should(collection.subscribe(expectedQuery.body, function () {})).be.instanceof(KuzzleRoom); - // should(emitted).be.true(); - // }); - // - // it('should raise an error if no callback is provided', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // should(function () { collection.subscribe({}); }).throw(Error); - // should(emitted).be.false(); - // }); - //}); - // - //describe('#truncate', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // emitted = false; - // result = { result: {acknowledged: true }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'truncateCollection', - // controller: 'admin', - // body: {} - // }; - // }); - // - // it('should send the right truncate query to Kuzzle', function () { - // var - // collection = kuzzle.dataCollectionFactory(expectedQuery.collection), - // options = { queuable: false }; - // - // expectedQuery.options = options; - // - // should(collection.truncate(options, function () {})).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle arguments correctly', function () { - // var collection = kuzzle.dataCollectionFactory(expectedQuery.collection); - // - // collection.truncate(); - // should(emitted).be.true(); - // - // emitted = false; - // collection.truncate({}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.truncate({}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.truncate(function () {}); - // should(emitted).be.true(); - // }); - //}); - // - //describe('#updateDocument', function () { - // var - // revert, - // refreshed = false; - // - // beforeEach(function () { - // revert = KuzzleDataCollection.__set__('KuzzleDocument', function (collection) { - // var doc = new KuzzleDocument(collection, 'foo', {}); - // - // doc.refresh = function (cb) { - // refreshed = true; - // cb(null, doc); - // }; - // - // return doc; - // }); - // - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // kuzzle.query = queryStub; - // - // emitted = false; - // result = { result: {_id: 'foobar', _source: { foo: 'bar' } }}; - // error = null; - // expectedQuery = { - // index: 'bar', - // collection: 'foo', - // action: 'update', - // controller: 'write', - // body: {} - // }; - // }); - // - // afterEach(function () { - // revert(); - // }); - // - // it('should send the right updateDocument query to Kuzzle', function (done) { - // var - // collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection), - // options = { queuable: false }; - // expectedQuery.options = options; - // - // should(collection.updateDocument(result.result._id, result.result._source, options, function (err, res) { - // should(err).be.null(); - // should(res).be.instanceof(KuzzleDocument); - // should(refreshed).be.true(); - // done(); - // })).be.exactly(collection); - // should(emitted).be.true(); - // }); - // - // it('should handle arguments correctly', function () { - // var collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection); - // - // collection.updateDocument('foo'); - // should(emitted).be.true(); - // - // emitted = false; - // collection.updateDocument('foo', {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.updateDocument('foo', {}, function () {}); - // should(emitted).be.true(); - // - // emitted = false; - // collection.updateDocument('foo', {}, {}, function () {}); - // should(emitted).be.true(); - // }); - // - // it('should call the callback with an error if one occurs', function (done) { - // var collection = new KuzzleDataCollection(kuzzle, expectedQuery.index, expectedQuery.collection); - // error = 'foobar'; - // this.timeout(50); - // - // collection.updateDocument(result.result._id, result.result._source, function (err, res) { - // should(err).be.exactly('foobar'); - // should(res).be.undefined(); - // done(); - // }); - // }); - //}); - // - //describe('#factories', function () { - // beforeEach(function () { - // kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); - // }); - // - // it('documentFactory should return a new KuzzleDocument object', function () { - // should(kuzzle.dataCollectionFactory('foo').documentFactory('foo', { foo: 'bar'})).be.instanceof(KuzzleDocument); - // }); - // - // it('roomFactory should return a new KuzzleRoom object', function () { - // should(kuzzle.dataCollectionFactory('foo').roomFactory()).be.instanceof(KuzzleRoom); - // }); - // - // it('dataMappingFactory should return a KuzzleDataMapping object', function () { - // should(kuzzle.dataCollectionFactory('foo').dataMappingFactory({})).be.instanceof(KuzzleDataMapping); - // }); - //}); }); \ No newline at end of file diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js new file mode 100644 index 000000000..9e26eb2fa --- /dev/null +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -0,0 +1,271 @@ +var + should = require('should'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleRole = require('../../../src/security/kuzzleRole'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'), + KuzzleUser = require('../../../src/security/kuzzleUser'); + +describe('KuzzleSecurity user methods', function () { + var + kuzzle, + expectedQuery, + result, + error, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#getUser', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar', _source: {} }}; + expectedQuery = { + action: 'getUser', + controller: 'security', + _id: 'foobar' + }; + }); + + it('should send the right query to Kuzzle', function (done) { + should(kuzzle.security.getUser(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + + it('should raise an error if no callback is provided', function () { + should(function () { kuzzle.security.getUser('test'); }).throw(Error); + }); + + it('should throw an error when no id is provided', function () { + should(function () { kuzzle.security.getUser(null, function () {}); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'error'; + this.timeout(50); + + kuzzle.security.getUser('foobar', function (err, res) { + should(err).be.exactly('error'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#searchUser', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {profile : 'myProfile'}} ]}}; + expectedQuery = { + action: 'searchUser', + controller: 'security' + }; + }); + + it('should send the right search query to kuzzle and return user with profile', function (done) { + var + filters = {}; + + this.timeout(50); + expectedQuery.body = filters; + + should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.documents).be.an.Array(); + should(res.documents).not.be.empty(); + should(res.documents.length).be.exactly(result.result.hits.length); + + res.documents.forEach(function (item) { + should(item).be.instanceof(KuzzleUser); + + should(item.content.profile).be.instanceof(KuzzleProfile); + should(item.content.profile.roles).be.an.Array(); + should(item.content.profile.roles[0]).be.a.String(); + }); + + done(); + })); + }); + + it('should send the right search query to kuzzle and return user with profile and role if the user is hydrated', function (done) { + var + filters = {}; + + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: { + profile: { + _id: 'myProfile', + roles: [ + { + _id: 'myRole', + indexes: {} + } + ] + } + }}]}}; + + this.timeout(50); + expectedQuery.body = filters; + + should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.documents).be.an.Array(); + should(res.documents).not.be.empty(); + should(res.documents.length).be.exactly(result.result.hits.length); + + res.documents.forEach(function (item) { + should(item).be.instanceof(KuzzleUser); + + should(item.content.profile).be.instanceof(KuzzleProfile); + item.content.profile.roles.map(function (role) { + should(role).instanceof(KuzzleRole); + }); + }); + + done(); + })); + }); + + it('should raise an error if no callback is provided', function () { + var + filters = {}; + + should(function () { kuzzle.security.searchProfiles(filters); }).throw(Error); + }); + }); + + + describe('#createUser', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar', _source: {profile: ['myRole']}} }; + expectedQuery = { + action: 'createProfile', + controller: 'security' + }; + }); + + it('should send the right query to Kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzle.security.createUser(result.result._id, result.result._source, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + + it('should construct a createOrReplaceUser action if option replaceIfExist is set', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createOrReplaceUser'; + + should(kuzzle.security.createProfile(result.result._id, result.result._source, {replaceIfExist: true}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + + it('should throw an error if no id provided', function () { + should(function () { kuzzle.security.createUser(null); }).throw(Error); + }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + error = 'foobar'; + this.timeout(50); + + kuzzle.security.createUser(result.result._id, result.result._source, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#deleteRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + kuzzle.query = queryStub; + error = null; + result = { result: {_id: 'foobar'} }; + expectedQuery = { + action: 'deleteUser', + controller: 'security', + _id: result.result._id + }; + }); + + it('should send the right delete query to Kuzzle', function (done) { + should(kuzzle.security.deleteUser(result.result._id, function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'foobar'; + this.timeout(50); + + kuzzle.security.deleteUser(result.result._id, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); + }); + + describe('#ProfileFactory', function () { + it('should return an instance of Profile', function (done) { + var role = kuzzle.security.userFactory('test', {profile: ['myProfile']}); + should(role).instanceof(KuzzleUser); + done(); + }); + + it('should throw an error if no id is provided', function (done) { + should((function () { kuzzle.security.userFactory(null) })).throw(Error); + done(); + }); + }); +}); \ No newline at end of file From 252ac801c6038f8be4b054ce98f2bd2c98f7289b Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Mon, 8 Feb 2016 16:26:51 +0100 Subject: [PATCH 44/60] add unit test user --- .../kuzzleSecurity/userMethods.test.js | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index 9e26eb2fa..f50a628d7 100644 --- a/test/security/kuzzleSecurity/userMethods.test.js +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -83,26 +83,26 @@ describe('KuzzleSecurity user methods', function () { }); }); - describe('#searchUser', function () { + describe('#searchUsers', function () { beforeEach(function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {profile : 'myProfile'}} ]}}; expectedQuery = { - action: 'searchUser', + action: 'searchUsers', controller: 'security' }; }); - it('should send the right search query to kuzzle and return user with profile', function (done) { + it('should send the right search query to kuzzle and return user with string', function (done) { var filters = {}; this.timeout(50); expectedQuery.body = filters; - should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(kuzzle.security.searchUsers(filters, function (err, res) { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); @@ -113,9 +113,8 @@ describe('KuzzleSecurity user methods', function () { res.documents.forEach(function (item) { should(item).be.instanceof(KuzzleUser); - should(item.content.profile).be.instanceof(KuzzleProfile); - should(item.content.profile.roles).be.an.Array(); - should(item.content.profile.roles[0]).be.a.String(); + should(item.content.profile).be.String(); + should(item.content.profile.roles).be.undefined(); }); done(); @@ -129,19 +128,23 @@ describe('KuzzleSecurity user methods', function () { result = { result: { total: 123, hits: [ {_id: 'foobar', _source: { profile: { _id: 'myProfile', - roles: [ - { - _id: 'myRole', - indexes: {} - } - ] + _source: { + roles: [ + { + _id: 'myRole', + _source: { + indexes: {} + } + } + ] + } } }}]}}; this.timeout(50); expectedQuery.body = filters; - should(kuzzle.security.searchProfiles(filters, function (err, res) { + should(kuzzle.security.searchUsers(filters, function (err, res) { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); @@ -153,7 +156,10 @@ describe('KuzzleSecurity user methods', function () { should(item).be.instanceof(KuzzleUser); should(item.content.profile).be.instanceof(KuzzleProfile); - item.content.profile.roles.map(function (role) { + should(item.content.profile.content.roles).be.an.Array(); + should(item.content.profile.content.roles).not.be.empty(); + + item.content.profile.content.roles.map(function (role) { should(role).instanceof(KuzzleRole); }); }); @@ -166,7 +172,7 @@ describe('KuzzleSecurity user methods', function () { var filters = {}; - should(function () { kuzzle.security.searchProfiles(filters); }).throw(Error); + should(function () { kuzzle.security.searchUsers(filters); }).throw(Error); }); }); @@ -178,7 +184,7 @@ describe('KuzzleSecurity user methods', function () { error = null; result = { result: {_id: 'foobar', _source: {profile: ['myRole']}} }; expectedQuery = { - action: 'createProfile', + action: 'createUser', controller: 'security' }; }); @@ -199,7 +205,7 @@ describe('KuzzleSecurity user methods', function () { expectedQuery._id = result.result._id; expectedQuery.action = 'createOrReplaceUser'; - should(kuzzle.security.createProfile(result.result._id, result.result._source, {replaceIfExist: true}, function (err, res) { + should(kuzzle.security.createUser(result.result._id, result.result._source, {replaceIfExist: true}, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleUser); done(); From 8b19cc22717d3fe703a8fedfe8655b77586f62c0 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Mon, 8 Feb 2016 18:18:03 +0100 Subject: [PATCH 45/60] add kuzzleRole tests --- src/security/kuzzleProfile.js | 4 +- src/security/kuzzleRole.js | 27 +++++- src/security/kuzzleSecurity.js | 6 +- src/security/kuzzleSecurityDocument.js | 6 +- src/security/kuzzleUser.js | 4 +- test/security/kuzzleRole/constructor.test.js | 51 ++++++++++ test/security/kuzzleRole/methods.test.js | 97 +++++++++++++++++++ .../kuzzleSecurity/profilesMethods.test.js | 16 +-- .../kuzzleSecurity/rolesMethods.test.js | 8 +- .../kuzzleSecurity/userMethods.test.js | 16 +-- .../constructor.test.js | 7 +- .../kuzzleSecurityDocument/methods.test.js | 42 ++++++++ 12 files changed, 246 insertions(+), 38 deletions(-) create mode 100644 test/security/kuzzleRole/constructor.test.js create mode 100644 test/security/kuzzleRole/methods.test.js create mode 100644 test/security/kuzzleSecurityDocument/methods.test.js diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 600b4ac0c..bf742259b 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -47,7 +47,7 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { */ KuzzleProfile.prototype.save = function (options, cb) { var - data = this.toJSON(), + data = this.serialize(), self = this; self.kuzzle.callbackRequired('KuzzleProfile.save', cb); @@ -134,7 +134,7 @@ KuzzleProfile.prototype.hydrate = function (cb) { * * @return {object} JSON object representing this securityDocument */ -KuzzleProfile.prototype.toJSON = function () { +KuzzleProfile.prototype.serialize = function () { var data = {}; diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 077330ccc..c24cdca6e 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -32,12 +32,10 @@ KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { * of this object. * * @param {responseCallback} [cb] - Handles the query response - * - * @returns {*} this */ KuzzleRole.prototype.save = function (cb) { var - data = this.toJSON(), + data = this.serialize(), self = this; @@ -50,8 +48,29 @@ KuzzleRole.prototype.save = function (cb) { cb(null, self); } }); +}; + +/** + * Delete the current role into Kuzzle. + * + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleRole.prototype.delete = function (cb) { + var + self = this; + - return self; + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('deleteRole'), {_id: this.id}, null, function (error, res) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, res.result._id); + } + }); }; + + module.exports = KuzzleRole; \ No newline at end of file diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index d568fe02a..069804723 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -96,7 +96,7 @@ KuzzleSecurity.prototype.searchRoles = function (filters, cb) { return new KuzzleRole(self, doc._id, doc._source); }); - cb(null, { total: result.result.total, documents: documents }); + cb(null, { total: result.result.total, roles: documents }); }); }; @@ -252,7 +252,7 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { return new KuzzleProfile(self, doc._id, doc._source); }); - cb(null, { total: response.result.total, documents: documents }); + cb(null, { total: response.result.total, profiles: documents }); }); }; @@ -409,7 +409,7 @@ KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { return new KuzzleUser(self, doc._id, doc._source); }); - cb(null, { total: response.result.total, documents: documents }); + cb(null, { total: response.result.total, users: documents }); }); }; diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index ed7ff922e..1a8aeac6a 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -44,11 +44,11 @@ KuzzleSecurityDocument.prototype.setContent = function (data) { }; /** - * Serialize this object into a JSON object + * Serialize this object into a pojo * - * @return {object} JSON object representing this securityDocument + * @return {object} pojo representing this securityDocument */ -KuzzleSecurityDocument.prototype.toJSON = function () { +KuzzleSecurityDocument.prototype.serialize = function () { var data = {}; diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 226f0a51e..fe534e557 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -86,7 +86,7 @@ KuzzleUser.prototype.setProfile = function (profile) { */ KuzzleUser.prototype.save = function (cb) { var - data = this.toJSON(), + data = this.serialize(), self = this; @@ -108,7 +108,7 @@ KuzzleUser.prototype.save = function (cb) { * * @return {object} JSON object representing this User */ -KuzzleUser.prototype.toJSON = function () { +KuzzleUser.prototype.serialize = function () { var data = {}; diff --git a/test/security/kuzzleRole/constructor.test.js b/test/security/kuzzleRole/constructor.test.js new file mode 100644 index 000000000..1325c6c81 --- /dev/null +++ b/test/security/kuzzleRole/constructor.test.js @@ -0,0 +1,51 @@ +var + should = require('should'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'), + KuzzleRole = require('../../../src/security/kuzzleRole'); + +describe('KuzzleRole constructor', function () { + var + kuzzle; + + before(function () { + Kuzzle.prototype.bluebird = bluebird; + }); + + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + }); + + it('should throw an error if no id is provided', done => { + try { + new KuzzleRole(kuzzle.security, null, null); + } + catch (e) { + should(e).be.Error(); + return done(); + } + + return done(new Error('Constructor doesn\'t throw an Error')); + }); + + it('should expose functions', function () { + var kuzzleRole = new KuzzleRole(kuzzle.security, 'test', {}); + + should.exist(kuzzleRole.setContent); + should.exist(kuzzleRole.serialize); + should.exist(kuzzleRole.savePromise); + }); + + it('should handle provided arguments correctly', function () { + var kuzzleRole = new KuzzleRole(kuzzle.security, 'test', {}); + + should(kuzzleRole).be.instanceof(KuzzleRole); + should(kuzzleRole.id).be.exactly('test'); + should(kuzzleRole.content).be.empty(); + + kuzzleRole = new KuzzleRole(kuzzle.security, 'test', {some: 'content'}); + should(kuzzleRole.id).be.exactly('test'); + should(kuzzleRole.content).match({some: 'content'}); + }); +}); \ No newline at end of file diff --git a/test/security/kuzzleRole/methods.test.js b/test/security/kuzzleRole/methods.test.js new file mode 100644 index 000000000..46ea5c03f --- /dev/null +++ b/test/security/kuzzleRole/methods.test.js @@ -0,0 +1,97 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleRole = require('../../../src/security/kuzzleRole'); + +describe('KuzzleRole methods', function () { + var + kuzzle, + kuzzleRole, + result, + expectedQuery, + error = false, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#save', function () { + before(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myRole', _source: {indexes : {}}} }; + kuzzleRole = new KuzzleRole(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'createOrReplaceRole', + controller: 'security' + }; + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleRole.save(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleRole); + done(); + })); + }); + }); + + describe('#delete', function () { + before(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myRole'} }; + kuzzleRole = new KuzzleRole(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'deleteRole', + controller: 'security' + }; + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleRole.delete(function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + }); +}); diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js index b631385ec..88a73cd13 100644 --- a/test/security/kuzzleSecurity/profilesMethods.test.js +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -107,11 +107,11 @@ describe('KuzzleSecurity profiles methods', function () { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); - should(res.documents).be.an.Array(); - should(res.documents).not.be.empty(); - should(res.documents.length).be.exactly(result.result.hits.length); + should(res.profiles).be.an.Array(); + should(res.profiles).not.be.empty(); + should(res.profiles.length).be.exactly(result.result.hits.length); - res.documents.forEach(function (item) { + res.profiles.forEach(function (item) { should(item).be.instanceof(KuzzleProfile); item.content.roles.forEach(function (role) { @@ -134,11 +134,11 @@ describe('KuzzleSecurity profiles methods', function () { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); - should(res.documents).be.an.Array(); - should(res.documents).not.be.empty(); - should(res.documents.length).be.exactly(result.result.hits.length); + should(res.profiles).be.an.Array(); + should(res.profiles).not.be.empty(); + should(res.profiles.length).be.exactly(result.result.hits.length); - res.documents.forEach(function (item) { + res.profiles.forEach(function (item) { should(item).be.instanceof(KuzzleProfile); item.content.roles.forEach(function (role) { diff --git a/test/security/kuzzleSecurity/rolesMethods.test.js b/test/security/kuzzleSecurity/rolesMethods.test.js index 96b6bc1ba..d85282130 100644 --- a/test/security/kuzzleSecurity/rolesMethods.test.js +++ b/test/security/kuzzleSecurity/rolesMethods.test.js @@ -104,11 +104,11 @@ describe('KuzzleSecurity roles methods', function () { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); - should(res.documents).be.an.Array(); - should(res.documents).not.be.empty(); - should(res.documents.length).be.exactly(result.result.hits.length); + should(res.roles).be.an.Array(); + should(res.roles).not.be.empty(); + should(res.roles.length).be.exactly(result.result.hits.length); - res.documents.forEach(function (item) { + res.roles.forEach(function (item) { should(item).be.instanceof(KuzzleRole); }); diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index f50a628d7..e65656a5b 100644 --- a/test/security/kuzzleSecurity/userMethods.test.js +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -106,11 +106,11 @@ describe('KuzzleSecurity user methods', function () { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); - should(res.documents).be.an.Array(); - should(res.documents).not.be.empty(); - should(res.documents.length).be.exactly(result.result.hits.length); + should(res.users).be.an.Array(); + should(res.users).not.be.empty(); + should(res.users.length).be.exactly(result.result.hits.length); - res.documents.forEach(function (item) { + res.users.forEach(function (item) { should(item).be.instanceof(KuzzleUser); should(item.content.profile).be.String(); @@ -148,11 +148,11 @@ describe('KuzzleSecurity user methods', function () { should(err).be.null(); should(res).be.an.Object(); should(res.total).be.a.Number().and.be.exactly(result.result.total); - should(res.documents).be.an.Array(); - should(res.documents).not.be.empty(); - should(res.documents.length).be.exactly(result.result.hits.length); + should(res.users).be.an.Array(); + should(res.users).not.be.empty(); + should(res.users.length).be.exactly(result.result.hits.length); - res.documents.forEach(function (item) { + res.users.forEach(function (item) { should(item).be.instanceof(KuzzleUser); should(item.content.profile).be.instanceof(KuzzleProfile); diff --git a/test/security/kuzzleSecurityDocument/constructor.test.js b/test/security/kuzzleSecurityDocument/constructor.test.js index 3273e7768..9e1ad8c6f 100644 --- a/test/security/kuzzleSecurityDocument/constructor.test.js +++ b/test/security/kuzzleSecurityDocument/constructor.test.js @@ -1,9 +1,8 @@ var should = require('should'), - rewire = require('rewire'), bluebird = require('bluebird'), - Kuzzle = rewire('../../../src/kuzzle'), - KuzzleSecurityDocument = rewire('../../../src/security/kuzzleSecurityDocument'); + Kuzzle = require('../../../src/kuzzle'), + KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'); describe('KuzzleSecurityDocument constructor', function () { var @@ -43,7 +42,7 @@ describe('KuzzleSecurityDocument constructor', function () { var securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'test', {}); should.exist(securityDocument.setContent); - should.exist(securityDocument.toJSON); + should.exist(securityDocument.serialize); }); it('should handle provided arguments correctly', function () { diff --git a/test/security/kuzzleSecurityDocument/methods.test.js b/test/security/kuzzleSecurityDocument/methods.test.js new file mode 100644 index 000000000..738b69664 --- /dev/null +++ b/test/security/kuzzleSecurityDocument/methods.test.js @@ -0,0 +1,42 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'); + +describe('KuzzleDocument methods', function () { + var + securityDocument, + kuzzle = new Kuzzle('http://localhost:7512'); + + describe('#toJSON', function () { + before(function () { + securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'myId', {some: 'content'}); + }); + + it('should serialize itself properly', function () { + var + serialized = securityDocument.serialize(); + + should(serialized._id).be.exactly('myId'); + should(serialized.body).match({some: 'content'}); + }); + }); + + + describe('#setContent', function () { + before(function () { + securityDocument = new KuzzleSecurityDocument('myId', {some: 'content'}); + }); + + it('should replace the current security document', function () { + var serialized; + + securityDocument.setContent({other: 'content'}); + serialized = securityDocument.serialize(); + + should(serialized.body).match({other: 'content'}); + }); + }); +}); From 6bef724009c05fc608b5073498b45f385373acd2 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Tue, 9 Feb 2016 12:11:18 +0100 Subject: [PATCH 46/60] unit tests kuzzleProfile --- src/security/kuzzleProfile.js | 56 +++- src/security/kuzzleRole.js | 32 +-- src/security/kuzzleSecurityDocument.js | 19 ++ src/security/kuzzleUser.js | 9 +- .../kuzzleProfile/constructor.test.js | 65 +++++ test/security/kuzzleProfile/methods.test.js | 266 ++++++++++++++++++ test/security/kuzzleRole/constructor.test.js | 11 + 7 files changed, 421 insertions(+), 37 deletions(-) create mode 100644 test/security/kuzzleProfile/constructor.test.js create mode 100644 test/security/kuzzleProfile/methods.test.js diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index bf742259b..5f69300e1 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -6,6 +6,14 @@ function KuzzleProfile(kuzzleSecurity, id, content) { KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteProfile' + } + }); + // Hydrate profile with roles if roles are not only string but objects with `_id` and `_source` if (content && content.roles) { content.roles = content.roles.map(function (role) { @@ -40,17 +48,20 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { /** * Persist to the persistent layer the current profile * - * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response * * @returns {Object} this */ -KuzzleProfile.prototype.save = function (options, cb) { +KuzzleProfile.prototype.save = function (cb) { var - data = this.serialize(), + data, self = this; - self.kuzzle.callbackRequired('KuzzleProfile.save', cb); + if (!this.content.roles) { + throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string'); + } + + data = this.serialize(); self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, null, function (error) { if (error) { @@ -99,6 +110,12 @@ KuzzleProfile.prototype.setRoles = function (roles) { throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); } + roles.map(function (role) { + if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { + throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + } + }); + this.content.roles = roles; return this; @@ -106,26 +123,34 @@ KuzzleProfile.prototype.setRoles = function (roles) { /** + * Hydrate the profile - get real KuzzleRole and not just ids + * Warning: do not try to hydrate a profile with newly added role which is not created in kuzzle * @param {responseCallback} [cb] - Handles the query response */ KuzzleProfile.prototype.hydrate = function (cb) { var self = this, - data = {ids: self.content.roles}; + data = {ids: []}; + + data.ids = this.content.roles.map(function (role) { + if (typeof role === 'string') { + return role; + } + + if (role instanceof KuzzleRole) { + return role.id; + } + }); self.kuzzle.callbackRequired('KuzzleProfile.hydrate', cb); - self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), data, null, function (error, response) { + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, null, function (error, response) { if (error) { return cb(error); } - self.content.roles = response.result.hits.map(function(role) { - return new KuzzleRole(self.kuzzleSecurity, role._id, role._source); - }); - - cb(null, self); + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); }; @@ -143,9 +168,16 @@ KuzzleProfile.prototype.serialize = function () { } data.body = this.content; + if (!data.body.roles || !Array.isArray(data.body.roles)) { + return data; + } data.body.roles = data.body.roles.map(function(role) { - return role.id; + if (role instanceof KuzzleRole) { + return role.id; + } + + return role; }); return data; diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index c24cdca6e..45cdc4b8d 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -4,6 +4,14 @@ function KuzzleRole(kuzzleSecurity, id, content) { KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteRole' + } + }); + // promisifying if (kuzzleSecurity.kuzzle.bluebird) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { @@ -38,7 +46,6 @@ KuzzleRole.prototype.save = function (cb) { data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, null, function (error) { if (error) { return cb ? cb(error) : false; @@ -50,27 +57,4 @@ KuzzleRole.prototype.save = function (cb) { }); }; -/** - * Delete the current role into Kuzzle. - * - * @param {responseCallback} [cb] - Handles the query response - */ -KuzzleRole.prototype.delete = function (cb) { - var - self = this; - - - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('deleteRole'), {_id: this.id}, null, function (error, res) { - if (error) { - return cb ? cb(error) : false; - } - - if (cb) { - cb(null, res.result._id); - } - }); -}; - - - module.exports = KuzzleRole; \ No newline at end of file diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 1a8aeac6a..1d360b611 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -61,5 +61,24 @@ KuzzleSecurityDocument.prototype.serialize = function () { return data; }; +/** + * Delete the current KuzzleSecurityDocument into Kuzzle. + * + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleSecurityDocument.prototype.delete = function (cb) { + var + self = this; + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, null, function (error, res) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, res.result._id); + } + }); +}; module.exports = KuzzleSecurityDocument; \ No newline at end of file diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index fe534e557..b1449e713 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -11,6 +11,14 @@ function KuzzleUser(kuzzleSecurity, id, content) { content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source) } + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteUser' + } + }); + // promisifying if (kuzzleSecurity.kuzzle.bluebird) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { @@ -89,7 +97,6 @@ KuzzleUser.prototype.save = function (cb) { data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, null, function (error) { if (error) { return cb ? cb(error) : false; diff --git a/test/security/kuzzleProfile/constructor.test.js b/test/security/kuzzleProfile/constructor.test.js new file mode 100644 index 000000000..ecf9a7fb5 --- /dev/null +++ b/test/security/kuzzleProfile/constructor.test.js @@ -0,0 +1,65 @@ +var + should = require('should'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'); + +describe('KuzzleRole constructor', function () { + var + kuzzle; + + before(function () { + Kuzzle.prototype.bluebird = bluebird; + }); + + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + }); + + it('should throw an error if no id is provided', done => { + try { + new KuzzleProfile(kuzzle.security, null, null); + } + catch (e) { + should(e).be.Error(); + return done(); + } + + return done(new Error('Constructor doesn\'t throw an Error')); + }); + + it('should initialize properties and return a valid KuzzleProfile object', function () { + var + kuzzle = new Kuzzle('foo'), + kuzzlePorfile = new KuzzleProfile(kuzzle.security, 'id', {some: 'content'}); + + + should(kuzzlePorfile).be.instanceof(KuzzleProfile); + should(kuzzlePorfile).have.propertyWithDescriptor('deleteActionName', { enumerable: false, writable: false, configurable: false }); + should(kuzzlePorfile.deleteActionName).be.exactly('deleteProfile'); + }); + + it('should expose functions', function () { + var kuzzlePorfile = new KuzzleProfile(kuzzle.security, 'test', {}); + + should.exist(kuzzlePorfile.save); + should.exist(kuzzlePorfile.addRole); + should.exist(kuzzlePorfile.savePromise); + should.exist(kuzzlePorfile.setRoles); + should.exist(kuzzlePorfile.hydratePromise); + should.exist(kuzzlePorfile.serialize); + }); + + it('should handle provided arguments correctly', function () { + var kuzzleProfile = new KuzzleProfile(kuzzle.security, 'test', {}); + + should(kuzzleProfile).be.instanceof(KuzzleProfile); + should(kuzzleProfile.id).be.exactly('test'); + should(kuzzleProfile.content).be.empty(); + + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'test', {some: 'content'}); + should(kuzzleProfile.id).be.exactly('test'); + should(kuzzleProfile.content).match({some: 'content'}); + }); +}); \ No newline at end of file diff --git a/test/security/kuzzleProfile/methods.test.js b/test/security/kuzzleProfile/methods.test.js new file mode 100644 index 000000000..b9633e8c5 --- /dev/null +++ b/test/security/kuzzleProfile/methods.test.js @@ -0,0 +1,266 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'), + KuzzleRole = require('../../../src/security/kuzzleRole'); + +describe('KuzzleRole methods', function () { + var + kuzzle, + kuzzleProfile, + result, + expectedQuery, + error = false, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#save', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myProfile', _source: {roles : []}} }; + kuzzleProfile = new KuzzleProfile(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'createOrReplaceProfile', + controller: 'security' + }; + }); + + it('should throw an error if the profile has not roles parameter', function (done) { + kuzzleProfile = new KuzzleProfile(kuzzle.security, result.result._id, {some: 'content'}); + + should((function () { + kuzzleProfile.save(); + })).throw(Error); + + done(); + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleProfile.save(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + }); + + describe('#addRole', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {roles: ['role1']}); + }); + + it('should throw an error if the role is not an id or a KuzzleRole', function (done) { + should((function () { + kuzzleProfile.addRole(null); + })).throw(Error); + + done(); + }); + + it('should add the id string in roles list', function (done) { + kuzzleProfile.addRole('role2'); + should(kuzzleProfile.content.roles).be.an.Array().match(['role1', 'role2']); + done(); + }); + + it('should add the KuzzleRole in roles list', function (done) { + var + kuzzleRole = new KuzzleRole(kuzzle.security, 'role3', {indexes: {}}); + + kuzzleProfile.addRole(kuzzleRole); + should(kuzzleProfile.content.roles).be.an.Array(); + should(kuzzleProfile.content.roles.length).be.exactly(2); + done(); + }); + }); + + describe('#setRoles', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {roles: ['role1']}); + }); + + it('should throw an error if the roles parameter is null', function (done) { + should((function () { + kuzzleProfile.setRoles(null); + })).throw(Error); + + done(); + }); + + it('should throw an error if the role parameter is not a array of string', function (done) { + should((function () { + kuzzleProfile.setRoles([1, 2, 3]); + })).throw(Error); + + done(); + }); + + it('should add the id string in roles list', function (done) { + kuzzleProfile.setRoles(['role2']); + should(kuzzleProfile.content.roles).be.an.Array().match(['role2']); + done(); + }); + + it('should add the KuzzleRole in roles list', function (done) { + var + kuzzleRole1 = new KuzzleRole(kuzzle.security, 'role2', {indexes: {}}), + kuzzleRole2 = new KuzzleRole(kuzzle.security, 'role3', {indexes: {}}); + + kuzzleProfile.setRoles([kuzzleRole1, kuzzleRole2]); + should(kuzzleProfile.content.roles).be.an.Array(); + should(kuzzleProfile.content.roles.length).be.exactly(2); + done(); + }); + }); + + describe('#hydrate', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myProfile', _source: {roles : ['role1', 'role2']}} }; + kuzzleProfile = new KuzzleProfile(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'mGetRoles', + controller: 'security' + }; + }); + + it('should raise an error if no callback is provided', function () { + should(function () { kuzzleProfile.hydrate(); }).throw(Error); + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = {ids: result.result._source.roles}; + + should(kuzzleProfile.hydrate(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + + it('should send the right query to kuzzle when a KuzzleRole is added', function (done) { + var kuzzleRole = new KuzzleRole(kuzzle.security, 'role3', {indexes: {}}); + expectedQuery.body = {ids: ['role1', 'role3']}; + + kuzzleProfile.setRoles(['role1', kuzzleRole]); + + should(kuzzleProfile.hydrate(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + }); + + describe('#serialize', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles: ['role1']}); + }); + + it('should serialize with correct attributes', function (done) { + var serialized = kuzzleProfile.serialize(); + + should(serialized._id).be.exactly('myProfile'); + should(serialized.body).be.match({some: 'content', roles: ['role1']}); + done(); + }); + + it('should serialize with correct attributes when a role is hydrate', function (done) { + var + kuzzleRole = new KuzzleRole(kuzzle.security, 'role2', {indexes: {}}), + serialized; + + kuzzleProfile.setRoles([kuzzleRole]); + + serialized = kuzzleProfile.serialize(); + + should(serialized._id).be.exactly('myProfile'); + should(serialized.body).be.match({some: 'content', roles: ['role2']}); + done(); + }); + + it('should serialize without roles if no roles attribute is defined', function (done) { + var + serialized; + + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content'}); + + serialized = kuzzleProfile.serialize(); + + should(serialized._id).be.exactly('myProfile'); + should.exist(serialized.body.some); + should.not.exist(serialized.body.roles); + done(); + }); + }); + + describe('#delete', function () { + before(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myProfile'} }; + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles: ['role1']}); + expectedQuery = { + action: 'deleteProfile', + controller: 'security' + }; + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleProfile.delete(function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + }); + +}); diff --git a/test/security/kuzzleRole/constructor.test.js b/test/security/kuzzleRole/constructor.test.js index 1325c6c81..ee233d821 100644 --- a/test/security/kuzzleRole/constructor.test.js +++ b/test/security/kuzzleRole/constructor.test.js @@ -29,6 +29,17 @@ describe('KuzzleRole constructor', function () { return done(new Error('Constructor doesn\'t throw an Error')); }); + it('should initialize properties and return a valid KuzzleProfile object', function () { + var + kuzzle = new Kuzzle('foo'), + kuzzleRole = new KuzzleRole(kuzzle.security, 'id', {some: 'content'}); + + + should(kuzzleRole).be.instanceof(KuzzleRole); + should(kuzzleRole).have.propertyWithDescriptor('deleteActionName', { enumerable: false, writable: false, configurable: false }); + should(kuzzleRole.deleteActionName).be.exactly('deleteRole'); + }); + it('should expose functions', function () { var kuzzleRole = new KuzzleRole(kuzzle.security, 'test', {}); From ccac8c28371f34ea8cb7d92a5833f8577b0fb875 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Tue, 9 Feb 2016 18:38:59 +0100 Subject: [PATCH 47/60] add user tests --- src/security/kuzzleUser.js | 7 +- .../kuzzleProfile/constructor.test.js | 2 +- test/security/kuzzleProfile/methods.test.js | 2 +- test/security/kuzzleUser/constructor.test.js | 63 +++++ test/security/kuzzleUser/methods.test.js | 228 ++++++++++++++++++ 5 files changed, 296 insertions(+), 6 deletions(-) create mode 100644 test/security/kuzzleUser/constructor.test.js create mode 100644 test/security/kuzzleUser/methods.test.js diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index b1449e713..22165febb 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -30,7 +30,6 @@ function KuzzleUser(kuzzleSecurity, id, content) { } }); } - } KuzzleUser.prototype = Object.create(KuzzleSecurityDocument.prototype, { @@ -55,7 +54,7 @@ KuzzleUser.prototype.hydrate = function (cb) { throw new Error('The User must contains a profile as string in order to be hydrated'); } - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile, hydrate: true}, null, function (error, response) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { if (error) { return cb(error); } @@ -125,8 +124,8 @@ KuzzleUser.prototype.serialize = function () { data.body = this.content; - if (data.body.profile && data.body.profile._id) { - data.body.profile = data.body.profile._id; + if (data.body.profile && data.body.profile.id) { + data.body.profile = data.body.profile.id; } return data; diff --git a/test/security/kuzzleProfile/constructor.test.js b/test/security/kuzzleProfile/constructor.test.js index ecf9a7fb5..bcfdbf187 100644 --- a/test/security/kuzzleProfile/constructor.test.js +++ b/test/security/kuzzleProfile/constructor.test.js @@ -5,7 +5,7 @@ var KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'), KuzzleProfile = require('../../../src/security/kuzzleProfile'); -describe('KuzzleRole constructor', function () { +describe('KuzzleProfile constructor', function () { var kuzzle; diff --git a/test/security/kuzzleProfile/methods.test.js b/test/security/kuzzleProfile/methods.test.js index b9633e8c5..3681e33f4 100644 --- a/test/security/kuzzleProfile/methods.test.js +++ b/test/security/kuzzleProfile/methods.test.js @@ -208,7 +208,7 @@ describe('KuzzleRole methods', function () { done(); }); - it('should serialize with correct attributes when a role is hydrate', function (done) { + it('should serialize with correct attributes when a role is serialized', function (done) { var kuzzleRole = new KuzzleRole(kuzzle.security, 'role2', {indexes: {}}), serialized; diff --git a/test/security/kuzzleUser/constructor.test.js b/test/security/kuzzleUser/constructor.test.js new file mode 100644 index 000000000..b26d44bda --- /dev/null +++ b/test/security/kuzzleUser/constructor.test.js @@ -0,0 +1,63 @@ +var + should = require('should'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'), + KuzzleUser = require('../../../src/security/kuzzleUser'); + +describe('KuzzleUser constructor', function () { + var + kuzzle; + + before(function () { + Kuzzle.prototype.bluebird = bluebird; + }); + + beforeEach(function () { + kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); + }); + + it('should throw an error if no id is provided', done => { + try { + new KuzzleUser(kuzzle.security, null, null); + } + catch (e) { + should(e).be.Error(); + return done(); + } + + return done(new Error('Constructor doesn\'t throw an Error')); + }); + + it('should initialize properties and return a valid KuzzleProfile object', function () { + var + kuzzle = new Kuzzle('foo'), + kuzzleUser = new KuzzleUser(kuzzle.security, 'id', {some: 'content'}); + + + should(kuzzleUser).be.instanceof(KuzzleUser); + should(kuzzleUser).have.propertyWithDescriptor('deleteActionName', { enumerable: false, writable: false, configurable: false }); + should(kuzzleUser.deleteActionName).be.exactly('deleteUser'); + }); + + it('should expose functions', function () { + var kuzzleUser = new KuzzleUser(kuzzle.security, 'test', {}); + + should.exist(kuzzleUser.setProfile); + should.exist(kuzzleUser.savePromise); + should.exist(kuzzleUser.hydratePromise); + should.exist(kuzzleUser.serialize); + }); + + it('should handle provided arguments correctly', function () { + var kuzzleUser = new KuzzleUser(kuzzle.security, 'test', {}); + + should(kuzzleUser).be.instanceof(KuzzleUser); + should(kuzzleUser.id).be.exactly('test'); + should(kuzzleUser.content).be.empty(); + + kuzzleUser = new KuzzleUser(kuzzle.security, 'test', {some: 'content'}); + should(kuzzleUser.id).be.exactly('test'); + should(kuzzleUser.content).match({some: 'content'}); + }); +}); \ No newline at end of file diff --git a/test/security/kuzzleUser/methods.test.js b/test/security/kuzzleUser/methods.test.js new file mode 100644 index 000000000..65fc24551 --- /dev/null +++ b/test/security/kuzzleUser/methods.test.js @@ -0,0 +1,228 @@ +var + should = require('should'), + rewire = require('rewire'), + bluebird = require('bluebird'), + Kuzzle = require('../../../src/kuzzle'), + KuzzleProfile = require('../../../src/security/kuzzleProfile'), + KuzzleRole = require('../../../src/security/kuzzleRole'), + KuzzleUser = require('../../../src/security/kuzzleUser'); + +describe('KuzzleRole methods', function () { + var + kuzzle, + kuzzleUser, + result, + expectedQuery, + error = false, + queryStub = function (args, query, options, cb) { + should(args.controller).be.exactly(expectedQuery.controller); + should(args.action).be.exactly(expectedQuery.action); + + if (expectedQuery.options) { + should(options).match(expectedQuery.options); + } + + if (expectedQuery.body) { + if (!query.body) { + query.body = {}; + } + + should(query.body).match(expectedQuery.body); + } else { + should(query.body).be.undefined(); + } + + if (expectedQuery._id) { + should(query._id).be.exactly(expectedQuery._id); + } + + if (cb) { + if (error) { + return cb(error); + } + + cb(error, result); + } + }; + + describe('#save', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'myUser', _source: {some: 'content', profile: 'myProfile'}} }; + kuzzleUser = new KuzzleUser(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'createOrReplaceUser', + controller: 'security' + }; + }); + + it('should throw an error if the user has not profile parameter', function (done) { + kuzzleUser = new KuzzleUser(kuzzle.security, result.result._id, {some: 'content'}); + + should((function () { + kuzzleUser.save(); + })).throw(Error); + + done(); + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleUser.save(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + }); + + describe('#setProfile', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleUser = new KuzzleUser(kuzzle.security, 'myUser', {profile: 'profile1'}); + }); + + it('should throw an error if the profile parameter is null', function (done) { + should((function () { + kuzzleUser.setProfile(null); + })).throw(Error); + + done(); + }); + + it('should throw an error if the profile parameter is not a string', function (done) { + should((function () { + kuzzleUser.setProfile(1); + })).throw(Error); + + done(); + }); + + it('should add the id string in profile', function (done) { + kuzzleUser.setProfile('role2'); + should(kuzzleUser.content.profile).be.exactly('role2'); + done(); + }); + + it('should add the KuzzleProfile in profile', function (done) { + var + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'profile2', {roles: ['role1']}); + + kuzzleUser.setProfile(kuzzleProfile); + should(kuzzleUser.content.profile).match({id: 'profile2', content: {roles: ['role1']}}); + should(kuzzleUser.content.profile).be.instanceOf(KuzzleProfile); + done(); + }); + }); + + describe('#hydrate', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'user', _source: {profile : 'profile1'}} }; + kuzzleUser = new KuzzleUser(kuzzle.security, result.result._id, result.result._source); + expectedQuery = { + action: 'getProfile', + controller: 'security' + }; + }); + + it('should raise an error if no callback is provided', function () { + should(function () { kuzzleUser.hydrate(); }).throw(Error); + }); + + it('should send the right query to kuzzle', function (done) { + should(kuzzleUser.hydrate(function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + + it('should throw an error when the profile is already a KuzzleProfile', function (done) { + var kuzzleProfile = new KuzzleProfile(kuzzle.security, 'profile', {roles: ['role1']}); + kuzzleUser.setProfile(kuzzleProfile); + + should(function () { kuzzleUser.hydrate(function () {}); }).throw(Error); + done(); + }); + }); + + describe('#serialize', function () { + beforeEach(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profile: 'profile'}); + }); + + it('should serialize with correct attributes', function (done) { + var serialized = kuzzleUser.serialize(); + + should(serialized._id).be.exactly('user'); + should(serialized.body).be.match({some: 'content', profile: 'profile'}); + done(); + }); + + it('should serialize with correct attributes when a user is serialized', function (done) { + var + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'profile1', {some: 'content', roles: ['role1']}), + serialized; + + kuzzleUser.setProfile(kuzzleProfile); + + serialized = kuzzleUser.serialize(); + + should(serialized._id).be.exactly('user'); + should(serialized.body).be.match({some: 'content', profile: 'profile1'}); + done(); + }); + + it('should serialize without roles if no profile attribute is defined', function (done) { + var + serialized; + + kuzzleUser = new KuzzleProfile(kuzzle.security, 'user', {some: 'content'}); + + serialized = kuzzleUser.serialize(); + + should(serialized._id).be.exactly('user'); + should.exist(serialized.body.some); + should.not.exist(serialized.body.profile); + done(); + }); + }); + + describe('#delete', function () { + before(function () { + kuzzle = new Kuzzle('http://localhost:7512'); + kuzzle.query = queryStub; + error = false; + + result = { result: {_id: 'user'} }; + kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profile: 'role1'}); + expectedQuery = { + action: 'deleteUser', + controller: 'security' + }; + }); + + it('should send the right query to kuzzle', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + should(kuzzleUser.delete(function (err, res) { + should(err).be.null(); + should(res).be.exactly(result.result._id); + done(); + })); + }); + }); + +}); From b8b7a7341e6cbbc449f1265b49e7e299f4ec7043 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Tue, 9 Feb 2016 18:40:33 +0100 Subject: [PATCH 48/60] fix eshint --- src/security/kuzzleProfile.js | 2 +- src/security/kuzzleUser.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 5f69300e1..4dfe015c9 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -22,7 +22,7 @@ function KuzzleProfile(kuzzleSecurity, id, content) { } return new KuzzleRole(kuzzleSecurity, role._id, role._source); - }) + }); } // promisifying diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 22165febb..9ee684857 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -8,7 +8,7 @@ function KuzzleUser(kuzzleSecurity, id, content) { // Hydrate user with profile if profile is not only a string but an object with `_id` and `_source` if (content.profile && content.profile._id && content.profile._source) { - content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source) + content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source); } // Define properties From 3a91c1dc2e1b1f61d6b871c8cf43630a6a813689 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 10:36:43 +0100 Subject: [PATCH 49/60] fix unit testing --- dist/kuzzle.js | 1020 ++++++++++++++++- dist/kuzzle.min.js | 3 +- dist/kuzzle.min.map | 2 +- src/security/kuzzleSecurityDocument.js | 12 + .../kuzzleProfile/constructor.test.js | 27 +- test/security/kuzzleRole/constructor.test.js | 5 +- .../kuzzleSecurity/constructor.test.js | 3 +- .../constructor.test.js | 3 +- .../kuzzleSecurityDocument/methods.test.js | 4 +- test/security/kuzzleUser/constructor.test.js | 4 +- 10 files changed, 1049 insertions(+), 34 deletions(-) diff --git a/dist/kuzzle.js b/dist/kuzzle.js index 68bf476f2..cac6ca54c 100644 --- a/dist/kuzzle.js +++ b/dist/kuzzle.js @@ -275,7 +275,8 @@ },{}],2:[function(require,module,exports){ var uuid = require('node-uuid'), - KuzzleDataCollection = require('./kuzzleDataCollection'); + KuzzleDataCollection = require('./kuzzleDataCollection'), + KuzzleSecurity = require('./security/kuzzleSecurity'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. @@ -293,6 +294,7 @@ var * @param {responseCallback} [cb] - Handles connection response * @constructor */ + module.exports = Kuzzle = function (url, options, cb) { var self = this; @@ -386,7 +388,6 @@ module.exports = Kuzzle = function (url, options, cb) { value: url, enumerable: true }, - // writable properties autoQueue: { value: false, enumerable: true, @@ -494,7 +495,7 @@ module.exports = Kuzzle = function (url, options, cb) { } }); - /* + /** * Some methods (mainly read queries) require a callback function. This function exists to avoid repetition of code, * and is called by these methods */ @@ -506,7 +507,15 @@ module.exports = Kuzzle = function (url, options, cb) { } }); - /* + /** + * Create an attribute security that embed all methods for manage Role, Profile and User + */ + Object.defineProperty(this, 'security', { + value: new KuzzleSecurity(this), + enumerable: true + }); + + /** * Emit an event to all registered listeners * An event cannot be emitted multiple times before a timeout has been reached. */ @@ -548,7 +557,6 @@ module.exports = Kuzzle = function (url, options, cb) { }); } - return this; }; @@ -983,10 +991,9 @@ Kuzzle.prototype.getStatistics = function (timestamp, options, cb) { * * @param {string} [index] - The name of the data index containing the data collection * @param {string} collection - The name of the data collection you want to manipulate - * @param headers {object} [headers] - Common properties for all future write documents queries * @returns {object} A KuzzleDataCollection instance */ -Kuzzle.prototype.dataCollectionFactory = function(index, collection, headers) { +Kuzzle.prototype.dataCollectionFactory = function(index, collection) { this.isValid(); if (arguments.length === 1) { @@ -1008,7 +1015,7 @@ Kuzzle.prototype.dataCollectionFactory = function(index, collection, headers) { } if (!this.collections[index][collection]) { - this.collections[index][collection] = new KuzzleDataCollection(this, index, collection, headers); + this.collections[index][collection] = new KuzzleDataCollection(this, index, collection); } return this.collections[index][collection]; @@ -1377,7 +1384,6 @@ Kuzzle.prototype.startQueuing = function () { if (this.state === 'offline' && !this.autoQueue) { this.queuing = true; } - return this; }; @@ -1392,7 +1398,7 @@ Kuzzle.prototype.stopQueuing = function () { return this; }; -},{"./kuzzleDataCollection":3,"node-uuid":1,"socket.io-client":undefined}],3:[function(require,module,exports){ +},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":undefined}],3:[function(require,module,exports){ var KuzzleDocument = require('./kuzzleDocument'), KuzzleDataMapping = require('./kuzzleDataMapping'), @@ -1621,7 +1627,6 @@ KuzzleDataCollection.prototype.createDocument = function (id, document, options, data._id = id; } - data.persist = true; data = self.kuzzle.addHeaders(data, self.headers); if (cb) { @@ -2894,4 +2899,995 @@ function dequeue () { module.exports = KuzzleRoom; -},{"node-uuid":1}]},{},[2]); +},{"node-uuid":1}],7:[function(require,module,exports){ +var + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), + KuzzleRole = require('./kuzzleRole'); + +function KuzzleProfile(kuzzleSecurity, id, content) { + + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteProfile' + } + }); + + // Hydrate profile with roles if roles are not only string but objects with `_id` and `_source` + if (content && content.roles) { + content.roles = content.roles.map(function (role) { + if (!role._id || !role._source) { + return role; + } + + return new KuzzleRole(kuzzleSecurity, role._id, role._source); + }); + } + + // promisifying + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['hydrate', 'save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } + +} + +KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { + constructor: { + value: KuzzleProfile + } +}); + +/** + * Persist to the persistent layer the current profile + * + * @param {responseCallback} [cb] - Handles the query response + * + * @returns {Object} this + */ +KuzzleProfile.prototype.save = function (cb) { + var + data, + self = this; + + if (!this.content.roles) { + throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string'); + } + + data = this.serialize(); + + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, null, function (error) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, self); + } + }); + + return self; +}; + + +/** + * Add a role in the roles list + * @param {KuzzleRole|string} role - can be an instance of KuzzleRole or an id in string + * + * @returns {KuzzleProfile} this + */ +KuzzleProfile.prototype.addRole = function (role) { + + if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { + throw new Error('Parameter "roles" must be a KuzzleRole or a id string'); + } + + if (!this.content.roles) { + this.content.roles = []; + } + + this.content.roles.push(role); + + return this; +}; + +/** + * Set roles list + * @param {Array} roles - can be an array of KuzzleRole or an array of string + * + * @returns {KuzzleProfile} this + */ +KuzzleProfile.prototype.setRoles = function (roles) { + + if (!Array.isArray(roles)) { + throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + } + + roles.map(function (role) { + if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { + throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + } + }); + + this.content.roles = roles; + + return this; +}; + + +/** + * Hydrate the profile - get real KuzzleRole and not just ids + * Warning: do not try to hydrate a profile with newly added role which is not created in kuzzle + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleProfile.prototype.hydrate = function (cb) { + + var + self = this, + data = {ids: []}; + + data.ids = this.content.roles.map(function (role) { + if (typeof role === 'string') { + return role; + } + + if (role instanceof KuzzleRole) { + return role.id; + } + }); + + self.kuzzle.callbackRequired('KuzzleProfile.hydrate', cb); + + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, null, function (error, response) { + if (error) { + return cb(error); + } + + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); + }); +}; + +/** + * Serialize this object into a JSON object + * + * @return {object} JSON object representing this securityDocument + */ +KuzzleProfile.prototype.serialize = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + if (!data.body.roles || !Array.isArray(data.body.roles)) { + return data; + } + + data.body.roles = data.body.roles.map(function(role) { + if (role instanceof KuzzleRole) { + return role.id; + } + + return role; + }); + + return data; +}; + + +module.exports = KuzzleProfile; + +},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(require,module,exports){ +var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); + +function KuzzleRole(kuzzleSecurity, id, content) { + + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteRole' + } + }); + + // promisifying + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } + +} + +KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { + constructor: { + value: KuzzleRole + } +}); + +/** + * Saves this role into Kuzzle. + * + * If this is a new role, this function will create it in Kuzzle. + * Otherwise, this method will replace the latest version of this role in Kuzzle by the current content + * of this object. + * + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleRole.prototype.save = function (cb) { + var + data = this.serialize(), + self = this; + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, null, function (error) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, self); + } + }); +}; + +module.exports = KuzzleRole; +},{"./kuzzleSecurityDocument":10}],9:[function(require,module,exports){ +var + KuzzleRole = require('./kuzzleRole'), + KuzzleProfile = require('./kuzzleProfile'), + KuzzleUser = require('./kuzzleUser'); + +/** + * Kuzzle security constructor + * + * @param kuzzle + * @returns {KuzzleSecurity} + * @constructor + */ +function KuzzleSecurity(kuzzle) { + + Object.defineProperty(this, 'kuzzle', { + value: kuzzle + }); + + Object.defineProperty(this, 'buildQueryArgs', { + value: function (action) { + return { + controller: 'security', + action: action + }; + } + }); + + if (this.kuzzle.bluebird) { + return this.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var blacklist = ['roleFactory', 'profileFactory', 'userFactory']; + + return passes && blacklist.indexOf(name) === -1; + } + }); + } + + return this; +} + + +/** + * Retrieve a single Role using its unique role ID. + * + * @param {string} id + * @param {responseCallback} [cb] - returns Kuzzle's response + */ +KuzzleSecurity.prototype.getRole = function (id, cb) { + var + data, + self = this; + + if (!id) { + throw new Error('Id parameter is mandatory for getRole function'); + } + + data = {_id: id}; + + self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); + + self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, response) { + if (err) { + return cb(err); + } + + cb(null, new KuzzleRole(self, response.result._id, response.result._source)); + }); +}; + +/** + * Executes a search on roles according to a filter + * + * /!\ There is a small delay between role creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a role that was just been created won’t be returned by this function. + * + * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` + * @param {responseCallback} [cb] - returns Kuzzle's response + * + */ +KuzzleSecurity.prototype.searchRoles = function (filters, cb) { + var + self = this; + + self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); + + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, null, function (error, result) { + var documents; + + if (error) { + return cb(error); + } + + documents = result.result.hits.map(function (doc) { + return new KuzzleRole(self, doc._id, doc._source); + }); + + cb(null, { total: result.result.total, roles: documents }); + }); +}; + +/** + * Create a new role in Kuzzle. + * + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same role already exists: throw an error if sets to false. + * Replace the existing role otherwise + * + * @param {string} id - role identifier + * @param {object} content - a plain javascript object representing the role + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response + */ +KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { + var + self = this, + data = {}, + action = 'createRole'; + + if (!id || typeof id !== 'string') { + throw new Error('KuzzleSecurity.createRole: cannot create a role without a role ID'); + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + data._id = id; + data.body = content; + + if (options) { + action = options.replaceIfExist ? 'createOrReplaceRole' : 'createRole'; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleRole(self, res.result._id, res.result._source); + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } +}; + +/** + * Delete role. + * + * There is a small delay between role deletion and their deletion in our advanced search layer, + * usually a couple of seconds. + * That means that a role that was just been delete will be returned by this function + * + * + * @param {string} id - Role id to delete + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleSecurity.prototype.deleteRole = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data); + } +}; + +/** + * Instantiate a new KuzzleRole object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - role id + * @param {object} content - role content + * @constructor + */ +KuzzleSecurity.prototype.roleFactory = function(id, content) { + return new KuzzleRole(this, id, content); +}; + + +/** + * @param {string} id + * @param {responseCallback} cb - returns Kuzzle's response + */ +KuzzleSecurity.prototype.getProfile = function (id, cb) { + var + data, + self = this; + + if (!id || typeof id !== 'string') { + throw new Error('Id parameter is mandatory for getProfile function'); + } + + data = {_id: id}; + + self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); + + self.kuzzle.query(this.buildQueryArgs('getProfile'), data, null, function (error, response) { + if (error) { + return cb(error); + } + + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); + }); +}; + +/** + * Executes a search on profiles according to a filter + * + * /!\ There is a small delay between profile creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a profile that was just been created won’t be returned by this function. + * + * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` + * @param {Boolean} [hydrate] - if hydrate is true, profiles will have a list of Role object instead of just a list of role id + * @param {responseCallback} [cb] - returns Kuzzle's response + */ +KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { + var + self = this; + + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = false; + } + + filters.hydrate = hydrate; + + self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); + + self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, response) { + var documents; + + if (error) { + return cb(error); + } + + documents = response.result.hits.map(function (doc) { + return new KuzzleProfile(self, doc._id, doc._source); + }); + + cb(null, { total: response.result.total, profiles: documents }); + }); +}; + +/** + * Create a new profile in Kuzzle. + * + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same profile already exists: throw an error if sets to false. + * Replace the existing profile otherwise + * + * @param {string} id - profile identifier + * @param {object} content - attribute `roles` in `content` must only contains an array of role id + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response + */ +KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { + var + self = this, + data = {}, + action = 'createProfile'; + + if (!id || typeof id !== 'string') { + throw new Error('KuzzleSecurity.createProfile: cannot create a profile without a profile ID'); + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + data._id = id; + data.body = content; + + if (options) { + action = options.replaceIfExist ? 'createOrReplaceProfile' : 'createProfile'; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleProfile(self, res.result._id, res.result._source); + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } +}; + +/** + * Delete profile. + * + * There is a small delay between profile deletion and their deletion in our advanced search layer, + * usually a couple of seconds. + * That means that a profile that was just been delete will be returned by this function + * + * + * @param {string} id - Profile id to delete + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleSecurity.prototype.deleteProfile = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data); + } +}; + +/** + * Instantiate a new KuzzleProfile object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - profile id + * @param {object} content - profile content + * @constructor + */ +KuzzleSecurity.prototype.profileFactory = function(id, content) { + return new KuzzleProfile(this, id, content); +}; + +/** + * Retrieve a single User using its unique user ID. + * + * @param {string} id + * @param {responseCallback} [cb] - returns Kuzzle's response + */ +KuzzleSecurity.prototype.getUser = function (id, cb) { + var + data, + self = this; + + if (!id || typeof id !== 'string') { + throw new Error('Id parameter is mandatory for getUser function'); + } + + data = {_id: id}; + + self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); + + self.kuzzle.query(this.buildQueryArgs('getUser'), data, null, function (err, response) { + if (err) { + return cb(err); + } + + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); + }); +}; + +/** + * Executes a search on user according to a filter + * + * /!\ There is a small delay between user creation and their existence in our persistent search layer, + * usually a couple of seconds. + * That means that a user that was just been created won’t be returned by this function. + * + * @param {Object} filters - same filters as documents filters + * @param {Boolean} hydrate - if hydrate is true, users will have a Profile object instead of just a profile id + * @param {responseCallback} [cb] - returns Kuzzle's response + */ +KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { + var + self = this; + + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = false; + } + + filters.hydrate = hydrate; + + self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); + + self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, null, function (error, response) { + var documents; + + if (error) { + return cb(error); + } + + documents = response.result.hits.map(function (doc) { + return new KuzzleUser(self, doc._id, doc._source); + }); + + cb(null, { total: response.result.total, users: documents }); + }); +}; + +/** + * Create a new user in Kuzzle. + * + * Takes an optional argument object with the following property: + * - replaceIfExist (boolean, default: false): + * If the same user already exists: throw an error if sets to false. + * Replace the existing user otherwise + * + * @param {string} id - user identifier + * @param {object} content - attribute `profile` in `content` must only contains the profile id + * @param {object} [options] - (optional) arguments + * @param {responseCallback} [cb] - (optional) Handles the query response + */ +KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { + var + self = this, + data = {}, + action = 'createUser'; + + if (!id || typeof id !== 'string') { + throw new Error('KuzzleSecurity.createUser: cannot create a user without a user ID'); + } + + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + + data._id = id; + data.body = content; + + if (options) { + action = options.replaceIfExist ? 'createOrReplaceUser' : 'createUser'; + } + + if (cb) { + self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + var doc; + + if (err) { + return cb(err); + } + + doc = new KuzzleUser(self, res.result._id, res.result._source); + cb(null, doc); + }); + } else { + self.kuzzle.query(this.buildQueryArgs(action), data); + } +}; + +/** + * Delete user. + * + * There is a small delay between user deletion and their deletion in our advanced search layer, + * usually a couple of seconds. + * That means that a user that was just been delete will be returned by this function + * + * + * @param {string} id - Profile id to delete + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleSecurity.prototype.deleteUser = function (id, cb) { + var data = {_id: id}; + + if (cb) { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, null, function (err, res) { + if (err) { + return cb(err); + } + + cb(null, res.result._id); + }); + } else { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data); + } +}; + +/** + * Instantiate a new KuzzleUser object. Workaround to the module.exports limitation, preventing multiple + * constructors to be exposed without having to use a factory or a composed object. + * + * @param {string} id - user id + * @param {object} content - user content + * @constructor + */ +KuzzleSecurity.prototype.userFactory = function(id, content) { + return new KuzzleUser(this, id, content); +}; + + +module.exports = KuzzleSecurity; +},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(require,module,exports){ +function KuzzleSecurityDocument(kuzzleSecurity, id, content) { + + if (!id) { + throw new Error('A security document must have an id'); + } + + // Define properties + Object.defineProperties(this, { + // private properties + kuzzle: { + value: kuzzleSecurity.kuzzle + }, + kuzzleSecurity: { + value: kuzzleSecurity + }, + // read-only properties + // writable properties + id: { + value: id, + enumerable: true + }, + content: { + value: {}, + writable: true, + enumerable: true + } + }); + + if (content) { + this.setContent(content); + } + + // promisifying + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['delete']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } +} + +/** + * + * @param {Object} data - New securityDocument content + * + * @return {Object} this + */ +KuzzleSecurityDocument.prototype.setContent = function (data) { + this.content = data; + + return this; +}; + +/** + * Serialize this object into a pojo + * + * @return {object} pojo representing this securityDocument + */ +KuzzleSecurityDocument.prototype.serialize = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + + return data; +}; + +/** + * Delete the current KuzzleSecurityDocument into Kuzzle. + * + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleSecurityDocument.prototype.delete = function (cb) { + var + self = this; + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, null, function (error, res) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, res.result._id); + } + }); +}; + +module.exports = KuzzleSecurityDocument; +},{}],11:[function(require,module,exports){ +var + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), + KuzzleProfile = require('./kuzzleProfile'); + +function KuzzleUser(kuzzleSecurity, id, content) { + + KuzzleSecurityDocument.call(this, kuzzleSecurity, id, content); + + // Hydrate user with profile if profile is not only a string but an object with `_id` and `_source` + if (content.profile && content.profile._id && content.profile._source) { + content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source); + } + + // Define properties + Object.defineProperties(this, { + // private properties + deleteActionName: { + value: 'deleteUser' + } + }); + + // promisifying + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['hydrate', 'save']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } +} + +KuzzleUser.prototype = Object.create(KuzzleSecurityDocument.prototype, { + constructor: { + value: KuzzleUser + } +}); + +/** + * This function allow to get the hydrated user of the corresponding current user. + * The hydrated user has profiles and roles. + * + * @param {responseCallback} [cb] - Handles the query response + */ +KuzzleUser.prototype.hydrate = function (cb) { + var + self = this; + + self.kuzzle.callbackRequired('KuzzleUser.hydrate', cb); + + if (!this.content.profile || typeof this.content.profile !== 'string') { + throw new Error('The User must contains a profile as string in order to be hydrated'); + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { + if (error) { + return cb(error); + } + + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); + }); +}; + +/** + * Set profile in content + * @param {KuzzleProfile|string} profile - can be a KuzzleProfile or an id string + * + * @returns {KuzzleUser} this + */ +KuzzleUser.prototype.setProfile = function (profile) { + + if (typeof profile !== 'string' && !(profile instanceof KuzzleProfile)) { + throw new Error('Parameter "profile" must be a KuzzleProfile or a string'); + } + + this.content.profile = profile; + + return this; +}; + +/** + * Saves this user into Kuzzle. + * + * If this is a new user, this function will create it in Kuzzle. + * Otherwise, this method will replace the latest version of this user in Kuzzle by the current content + * of this object. + * + * @param {responseCallback} [cb] - Handles the query response + * + * @returns {*} this + */ +KuzzleUser.prototype.save = function (cb) { + var + data = this.serialize(), + self = this; + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, null, function (error) { + if (error) { + return cb ? cb(error) : false; + } + + if (cb) { + cb(null, self); + } + }); + + return self; +}; + +/** + * Serialize this object into a JSON object + * + * @return {object} JSON object representing this User + */ +KuzzleUser.prototype.serialize = function () { + var + data = {}; + + if (this.id) { + data._id = this.id; + } + + data.body = this.content; + + if (data.body.profile && data.body.profile.id) { + data.body.profile = data.body.profile.id; + } + + return data; +}; + +module.exports = KuzzleUser; + +},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 626f7e8fd..1c45121cb 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,3 +1,4 @@ // Official Javascript SDK for Kuzzle v1.4.1 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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,"emitEvent",{value:function(a){var b=Date.now(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):this},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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(){a.state="connected",a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")}),this)},Kuzzle.prototype.setJwtToken=function(a){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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,{},function(c){null===c?(b.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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,c){if(this.isValid(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(c=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b,c)),this.collections[a][b]},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.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&&(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?e.call(this,i,f):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():g.body=b,c&&(h=c.updateIfExist?"createOrReplace":"create"),a&&(g._id=a),g.persist=!0,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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{queue:{value:[],writable:!0},refreshing:{value:!1,writable:!0},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&&-1!==e.indexOf(a)}}):this}function e(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"delete",args:[a,b]}),this;if(!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"refresh",args:[a,b]}),this;if(!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");return c.refreshing=!0,c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,d){return a?(c.refreshing=!1,c.queue=[],b?b(a):!1):(c.version=d.result._version,c.content=d.result._source,b&&b(null,c),c.refreshing=!1,void e.call(c))}),this},d.prototype.save=function(a,b){var c=this.toJSON(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.refreshing?(d.queue.push({action:"save",args:[a,b]}),d):(c.persist=!0,d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d)},d.prototype.publish=function(a){var b=this.toJSON();return this.refreshing?(this.queue.push({action:"publish",args:[a]}),this):(this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this)},d.prototype.setContent=function(a,b){var c=this;return this.refreshing?(this.queue.push({action:"setContent",args:[a,b]}),this):(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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(g.lastRenewal=c,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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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.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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}]},{},[2]); +!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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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(){a.state="connected",a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")}),this)},Kuzzle.prototype.setJwtToken=function(a){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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,{},function(c){null===c?(b.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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&&(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?e.call(this,i,f):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{queue:{value:[],writable:!0},refreshing:{value:!1,writable:!0},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&&-1!==e.indexOf(a)}}):this}function e(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"delete",args:[a,b]}),this;if(!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"refresh",args:[a,b]}),this;if(!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");return c.refreshing=!0,c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,d){return a?(c.refreshing=!1,c.queue=[],b?b(a):!1):(c.version=d.result._version,c.content=d.result._source,b&&b(null,c),c.refreshing=!1,void e.call(c))}),this},d.prototype.save=function(a,b){var c=this.toJSON(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.refreshing?(d.queue.push({action:"save",args:[a,b]}),d):(c.persist=!0,d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d)},d.prototype.publish=function(a){var b=this.toJSON();return this.refreshing?(this.queue.push({action:"publish",args:[a]}),this):(this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this)},d.prototype.setContent=function(a,b){var c=this;return this.refreshing?(this.queue.push({action:"setContent",args:[a,b]}),this):(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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(g.lastRenewal=c,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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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.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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this; +if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index 154f87351..d21046dc2 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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","result","jwt","logout","checkToken","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","err","res","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","queuable","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","persist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"queue","refreshing","dataCollection","setContent","element","save","publish","values",6,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval"],"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","_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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","result","jwt","logout","checkToken","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","err","res","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","queuable","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"queue","refreshing","dataCollection","setContent","element","save","persist","publish","values",6,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 1d360b611..9215d90a5 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -29,6 +29,18 @@ function KuzzleSecurityDocument(kuzzleSecurity, id, content) { if (content) { this.setContent(content); } + + // promisifying + if (kuzzleSecurity.kuzzle.bluebird) { + return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { + suffix: 'Promise', + filter: function (name, func, target, passes) { + var whitelist = ['delete']; + + return passes && whitelist.indexOf(name) !== -1; + } + }); + } } /** diff --git a/test/security/kuzzleProfile/constructor.test.js b/test/security/kuzzleProfile/constructor.test.js index bcfdbf187..4770f16ff 100644 --- a/test/security/kuzzleProfile/constructor.test.js +++ b/test/security/kuzzleProfile/constructor.test.js @@ -1,8 +1,8 @@ var should = require('should'), bluebird = require('bluebird'), - Kuzzle = require('../../../src/kuzzle'), - KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'), + rewire = require('rewire'), + Kuzzle = rewire('../../../src/kuzzle'), KuzzleProfile = require('../../../src/security/kuzzleProfile'); describe('KuzzleProfile constructor', function () { @@ -32,23 +32,24 @@ describe('KuzzleProfile constructor', function () { it('should initialize properties and return a valid KuzzleProfile object', function () { var kuzzle = new Kuzzle('foo'), - kuzzlePorfile = new KuzzleProfile(kuzzle.security, 'id', {some: 'content'}); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'id', {some: 'content'}); - should(kuzzlePorfile).be.instanceof(KuzzleProfile); - should(kuzzlePorfile).have.propertyWithDescriptor('deleteActionName', { enumerable: false, writable: false, configurable: false }); - should(kuzzlePorfile.deleteActionName).be.exactly('deleteProfile'); + should(kuzzleProfile).be.instanceof(KuzzleProfile); + should(kuzzleProfile).have.propertyWithDescriptor('deleteActionName', { enumerable: false, writable: false, configurable: false }); + should(kuzzleProfile.deleteActionName).be.exactly('deleteProfile'); }); it('should expose functions', function () { - var kuzzlePorfile = new KuzzleProfile(kuzzle.security, 'test', {}); + var kuzzleProfile = new KuzzleProfile(kuzzle.security, 'test', {}); - should.exist(kuzzlePorfile.save); - should.exist(kuzzlePorfile.addRole); - should.exist(kuzzlePorfile.savePromise); - should.exist(kuzzlePorfile.setRoles); - should.exist(kuzzlePorfile.hydratePromise); - should.exist(kuzzlePorfile.serialize); + should.exist(kuzzleProfile.save); + should.exist(kuzzleProfile.addRole); + should.exist(kuzzleProfile.savePromise); + should.exist(kuzzleProfile.setRoles); + should.exist(kuzzleProfile.hydratePromise); + should.exist(kuzzleProfile.deletePromise); + should.exist(kuzzleProfile.serialize); }); it('should handle provided arguments correctly', function () { diff --git a/test/security/kuzzleRole/constructor.test.js b/test/security/kuzzleRole/constructor.test.js index ee233d821..e81cd8e40 100644 --- a/test/security/kuzzleRole/constructor.test.js +++ b/test/security/kuzzleRole/constructor.test.js @@ -1,8 +1,8 @@ var should = require('should'), bluebird = require('bluebird'), - Kuzzle = require('../../../src/kuzzle'), - KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'), + rewire = require('rewire'), + Kuzzle = rewire('../../../src/kuzzle'), KuzzleRole = require('../../../src/security/kuzzleRole'); describe('KuzzleRole constructor', function () { @@ -46,6 +46,7 @@ describe('KuzzleRole constructor', function () { should.exist(kuzzleRole.setContent); should.exist(kuzzleRole.serialize); should.exist(kuzzleRole.savePromise); + should.exist(kuzzleRole.deletePromise); }); it('should handle provided arguments correctly', function () { diff --git a/test/security/kuzzleSecurity/constructor.test.js b/test/security/kuzzleSecurity/constructor.test.js index 10804f91c..28172b3bf 100644 --- a/test/security/kuzzleSecurity/constructor.test.js +++ b/test/security/kuzzleSecurity/constructor.test.js @@ -1,7 +1,8 @@ var should = require('should'), bluebird = require('bluebird'), - Kuzzle = require('../../../src/kuzzle'), + rewire = require('rewire'), + Kuzzle = rewire('../../../src/kuzzle'), KuzzleSecurity = require('../../../src/security/kuzzleSecurity'); describe('kuzzleSecurity constructor', function () { diff --git a/test/security/kuzzleSecurityDocument/constructor.test.js b/test/security/kuzzleSecurityDocument/constructor.test.js index 9e1ad8c6f..f4baf5aad 100644 --- a/test/security/kuzzleSecurityDocument/constructor.test.js +++ b/test/security/kuzzleSecurityDocument/constructor.test.js @@ -1,7 +1,8 @@ var should = require('should'), bluebird = require('bluebird'), - Kuzzle = require('../../../src/kuzzle'), + rewire = require('rewire'), + Kuzzle = rewire('../../../src/kuzzle'), KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'); describe('KuzzleSecurityDocument constructor', function () { diff --git a/test/security/kuzzleSecurityDocument/methods.test.js b/test/security/kuzzleSecurityDocument/methods.test.js index 738b69664..ab5ccd13d 100644 --- a/test/security/kuzzleSecurityDocument/methods.test.js +++ b/test/security/kuzzleSecurityDocument/methods.test.js @@ -5,7 +5,7 @@ var Kuzzle = require('../../../src/kuzzle'), KuzzleSecurityDocument = require('../../../src/security/kuzzleSecurityDocument'); -describe('KuzzleDocument methods', function () { +describe('KuzzleSecurityDocument methods', function () { var securityDocument, kuzzle = new Kuzzle('http://localhost:7512'); @@ -27,7 +27,7 @@ describe('KuzzleDocument methods', function () { describe('#setContent', function () { before(function () { - securityDocument = new KuzzleSecurityDocument('myId', {some: 'content'}); + securityDocument = new KuzzleSecurityDocument(kuzzle.security, 'myId', {some: 'content'}); }); it('should replace the current security document', function () { diff --git a/test/security/kuzzleUser/constructor.test.js b/test/security/kuzzleUser/constructor.test.js index b26d44bda..917d85524 100644 --- a/test/security/kuzzleUser/constructor.test.js +++ b/test/security/kuzzleUser/constructor.test.js @@ -1,7 +1,8 @@ var should = require('should'), bluebird = require('bluebird'), - Kuzzle = require('../../../src/kuzzle'), + rewire = require('rewire'), + Kuzzle = rewire('../../../src/kuzzle'), KuzzleProfile = require('../../../src/security/kuzzleProfile'), KuzzleUser = require('../../../src/security/kuzzleUser'); @@ -47,6 +48,7 @@ describe('KuzzleUser constructor', function () { should.exist(kuzzleUser.savePromise); should.exist(kuzzleUser.hydratePromise); should.exist(kuzzleUser.serialize); + should.exist(kuzzleUser.deletePromise); }); it('should handle provided arguments correctly', function () { From ae30fc196c296b57135770cdde9d1520e5c46ca0 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 10:39:19 +0100 Subject: [PATCH 50/60] generate after merge --- dist/kuzzle.min.js | 6 +++--- dist/kuzzle.min.map | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 1c45121cb..5450f4f04 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ -// Official Javascript SDK for Kuzzle v1.4.1 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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(){a.state="connected",a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")}),this)},Kuzzle.prototype.setJwtToken=function(a){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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,{},function(c){null===c?(b.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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&&(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?e.call(this,i,f):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{queue:{value:[],writable:!0},refreshing:{value:!1,writable:!0},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&&-1!==e.indexOf(a)}}):this}function e(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"delete",args:[a,b]}),this;if(!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"refresh",args:[a,b]}),this;if(!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");return c.refreshing=!0,c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,d){return a?(c.refreshing=!1,c.queue=[],b?b(a):!1):(c.version=d.result._version,c.content=d.result._source,b&&b(null,c),c.refreshing=!1,void e.call(c))}),this},d.prototype.save=function(a,b){var c=this.toJSON(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.refreshing?(d.queue.push({action:"save",args:[a,b]}),d):(c.persist=!0,d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d)},d.prototype.publish=function(a){var b=this.toJSON();return this.refreshing?(this.queue.push({action:"publish",args:[a]}),this):(this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this)},d.prototype.setContent=function(a,b){var c=this;return this.refreshing?(this.queue.push({action:"setContent",args:[a,b]}),this):(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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(g.lastRenewal=c,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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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.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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this; -if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); +// Official Javascript SDK for Kuzzle v1.4.4 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{queue:{value:[],writable:!0},refreshing:{value:!1,writable:!0},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&&-1!==e.indexOf(a)}}):this}function e(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"delete",args:[a,b]}),this;if(!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"refresh",args:[a,b]}),this;if(!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");return c.refreshing=!0,c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,d){return a?(c.refreshing=!1,c.queue=[],b?b(a):!1):(c.version=d.result._version,c.content=d.result._source,b&&b(null,c),c.refreshing=!1,void e.call(c))}),this},d.prototype.save=function(a,b){var c=this.toJSON(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.refreshing?(d.queue.push({action:"save",args:[a,b]}),d):(c.persist=!0,d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d)},d.prototype.publish=function(a){var b=this.toJSON();return this.refreshing?(this.queue.push({action:"publish",args:[a]}),this):(this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this)},d.prototype.setContent=function(a,b){var c=this;return this.refreshing?(this.queue.push({action:"setContent",args:[a,b]}),this):(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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index d21046dc2..0789fd9b8 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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","result","jwt","logout","checkToken","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","err","res","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","queuable","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"queue","refreshing","dataCollection","setContent","element","save","persist","publish","values",6,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"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","_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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"queue","refreshing","dataCollection","setContent","element","save","persist","publish","values",6,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file From f670a31bf5551b62924e1c8743961bbf9c0fe32a Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 10:42:31 +0100 Subject: [PATCH 51/60] generate after merge --- dist/kuzzle.min.js | 4 ++-- dist/kuzzle.min.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 5450f4f04..51d52416a 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ // Official Javascript SDK for Kuzzle v1.4.4 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{queue:{value:[],writable:!0},refreshing:{value:!1,writable:!0},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&&-1!==e.indexOf(a)}}):this}function e(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"delete",args:[a,b]}),this;if(!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),this.refreshing)return this.queue.push({action:"refresh",args:[a,b]}),this;if(!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");return c.refreshing=!0,c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,d){return a?(c.refreshing=!1,c.queue=[],b?b(a):!1):(c.version=d.result._version,c.content=d.result._source,b&&b(null,c),c.refreshing=!1,void e.call(c))}),this},d.prototype.save=function(a,b){var c=this.toJSON(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.refreshing?(d.queue.push({action:"save",args:[a,b]}),d):(c.persist=!0,d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d)},d.prototype.publish=function(a){var b=this.toJSON();return this.refreshing?(this.queue.push({action:"publish",args:[a]}),this):(this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this)},d.prototype.setContent=function(a,b){var c=this;return this.refreshing?(this.queue.push({action:"setContent",args:[a,b]}),this):(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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); +!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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[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&&-1!==e.indexOf(a)}}):this}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},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.toJSON(),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):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.toJSON();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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){ +return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index b399cb919..cd5e7bfb8 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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"queue","refreshing","dataCollection","setContent","element","save","persist","publish","values",6,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"mappings":"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","file":"kuzzle.min.js"} +{"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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"dataCollection","setContent","save","publish","values",6,"channel","lastRenewal","notifier","queue","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file From 31ce3daea034dafcc87360b5c1d83623cd1d2af1 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 11:04:38 +0100 Subject: [PATCH 52/60] increase test coverage security --- test/security/kuzzleProfile/methods.test.js | 54 +++++++++++++++++ test/security/kuzzleRole/methods.test.js | 27 +++++++++ .../kuzzleSecurity/profilesMethods.test.js | 43 +++++++++++++- .../kuzzleSecurity/rolesMethods.test.js | 43 +++++++++++++- .../kuzzleSecurity/userMethods.test.js | 58 ++++++++++++++++++- test/security/kuzzleUser/methods.test.js | 35 +++++++++++ 6 files changed, 257 insertions(+), 3 deletions(-) diff --git a/test/security/kuzzleProfile/methods.test.js b/test/security/kuzzleProfile/methods.test.js index 3681e33f4..a58559e11 100644 --- a/test/security/kuzzleProfile/methods.test.js +++ b/test/security/kuzzleProfile/methods.test.js @@ -78,6 +78,19 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + error = 'foobar'; + this.timeout(50); + + kuzzleProfile.save(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#addRole', function () { @@ -109,6 +122,18 @@ describe('KuzzleRole methods', function () { should(kuzzleProfile.content.roles.length).be.exactly(2); done(); }); + + it('should initialize roles with array if no role was set before', function (done) { + var + kuzzleRole = new KuzzleRole(kuzzle.security, 'role3', {indexes: {}}); + + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content'}); + + kuzzleProfile.addRole(kuzzleRole); + should(kuzzleProfile.content.roles).be.an.Array(); + should(kuzzleProfile.content.roles.length).be.exactly(1); + done(); + }); }); describe('#setRoles', function () { @@ -192,6 +217,22 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + var kuzzleRole = new KuzzleRole(kuzzle.security, 'role3', {indexes: {}}); + expectedQuery.body = {ids: ['role1', 'role3']}; + + error = 'foobar'; + this.timeout(50); + + kuzzleProfile.setRoles(['role1', kuzzleRole]); + + kuzzleProfile.hydrate(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#serialize', function () { @@ -261,6 +302,19 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + error = 'foobar'; + + kuzzleProfile.delete(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); }); diff --git a/test/security/kuzzleRole/methods.test.js b/test/security/kuzzleRole/methods.test.js index 46ea5c03f..95dff8a39 100644 --- a/test/security/kuzzleRole/methods.test.js +++ b/test/security/kuzzleRole/methods.test.js @@ -67,6 +67,20 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + error = 'foobar'; + this.timeout(50); + + kuzzleRole.save(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#delete', function () { @@ -93,5 +107,18 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + error = 'foobar'; + + kuzzleRole.delete(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); }); diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js index 88a73cd13..9d9f5af2a 100644 --- a/test/security/kuzzleSecurity/profilesMethods.test.js +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -156,6 +156,22 @@ describe('KuzzleSecurity profiles methods', function () { should(function () { kuzzle.security.searchProfiles(filters); }).throw(Error); }); + + it('should call the callback with an error if one occurs', function (done) { + var + filters = {}; + + expectedQuery.body = filters; + + error = 'foobar'; + this.timeout(50); + + kuzzle.security.searchProfiles(filters, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); @@ -182,7 +198,15 @@ describe('KuzzleSecurity profiles methods', function () { })); }); - it('should construct a createOrReplaceRole action if option replaceIfExist is set', function (done) { + it('should send the right query to Kuzzle even without callback', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + kuzzle.security.createProfile(result.result._id, result.result._source); + done(); + }); + + it('should construct a createOrReplaceProfile action if option replaceIfExist is set to true', function (done) { expectedQuery.body = result.result._source; expectedQuery._id = result.result._id; expectedQuery.action = 'createOrReplaceProfile'; @@ -194,6 +218,18 @@ describe('KuzzleSecurity profiles methods', function () { })); }); + it('should construct a createProfile action if option replaceIfExist is set to true', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createProfile'; + + should(kuzzle.security.createProfile(result.result._id, result.result._source, {replaceIfExist: false}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + done(); + })); + }); + it('should throw an error if no id provided', function () { should(function () { kuzzle.security.createProfile(null); }).throw(Error); }); @@ -232,6 +268,11 @@ describe('KuzzleSecurity profiles methods', function () { })); }); + it('should send the right delete query to Kuzzle even without callback', function (done) { + kuzzle.security.deleteProfile(result.result._id); + done(); + }); + it('should call the callback with an error if one occurs', function (done) { error = 'foobar'; this.timeout(50); diff --git a/test/security/kuzzleSecurity/rolesMethods.test.js b/test/security/kuzzleSecurity/rolesMethods.test.js index d85282130..f29d523c8 100644 --- a/test/security/kuzzleSecurity/rolesMethods.test.js +++ b/test/security/kuzzleSecurity/rolesMethods.test.js @@ -122,6 +122,22 @@ describe('KuzzleSecurity roles methods', function () { should(function () { kuzzle.security.searchRoles(filters); }).throw(Error); }); + + it('should call the callback with an error if one occurs', function (done) { + var + filters = { indexes: ['test'] }; + + expectedQuery.body = filters; + + error = 'foobar'; + this.timeout(50); + + kuzzle.security.searchRoles(filters, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); @@ -148,7 +164,15 @@ describe('KuzzleSecurity roles methods', function () { })); }); - it('should construct a createOrReplaceRole action if option replaceIfExist is set', function (done) { + it('should send the right createRole query to Kuzzle even without callback', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + kuzzle.security.createRole(result.result._id, result.result._source); + done(); + }); + + it('should construct a createOrReplaceRole action if option replaceIfExist is set to true', function (done) { expectedQuery.body = result.result._source; expectedQuery._id = result.result._id; expectedQuery.action = 'createOrReplaceRole'; @@ -160,6 +184,18 @@ describe('KuzzleSecurity roles methods', function () { })); }); + it('should construct a createRole action if option replaceIfExist is set to false', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createRole'; + + should(kuzzle.security.createRole(result.result._id, result.result._source, {replaceIfExist: false}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleRole); + done(); + })); + }); + it('should throw an error if no id provided', function () { should(function () { kuzzle.security.createRole(null); }).throw(Error); }); @@ -198,6 +234,11 @@ describe('KuzzleSecurity roles methods', function () { })); }); + it('should send the right delete query to Kuzzle even without callback', function (done) { + kuzzle.security.deleteRole(result.result._id); + done(); + }); + it('should call the callback with an error if one occurs', function (done) { error = 'foobar'; this.timeout(50); diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index e65656a5b..3936e6e4d 100644 --- a/test/security/kuzzleSecurity/userMethods.test.js +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -174,6 +174,37 @@ describe('KuzzleSecurity user methods', function () { should(function () { kuzzle.security.searchUsers(filters); }).throw(Error); }); + + it('should call the callback with an error if one occurs', function (done) { + var + filters = {}; + + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: { + profile: { + _id: 'myProfile', + _source: { + roles: [ + { + _id: 'myRole', + _source: { + indexes: {} + } + } + ] + } + } + }}]}}; + + expectedQuery.body = filters; + error = 'foobar'; + this.timeout(50); + + kuzzle.security.searchUsers(filters, function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); @@ -200,7 +231,15 @@ describe('KuzzleSecurity user methods', function () { })); }); - it('should construct a createOrReplaceUser action if option replaceIfExist is set', function (done) { + it('should send the right query to Kuzzle even without callback', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + kuzzle.security.createUser(result.result._id, result.result._source); + done(); + }); + + it('should construct a createOrReplaceUser action if option replaceIfExist is set to true', function (done) { expectedQuery.body = result.result._source; expectedQuery._id = result.result._id; expectedQuery.action = 'createOrReplaceUser'; @@ -212,6 +251,18 @@ describe('KuzzleSecurity user methods', function () { })); }); + it('should construct a createUser action if option replaceIfExist is set to false', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + expectedQuery.action = 'createUser'; + + should(kuzzle.security.createUser(result.result._id, result.result._source, {replaceIfExist: false}, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + done(); + })); + }); + it('should throw an error if no id provided', function () { should(function () { kuzzle.security.createUser(null); }).throw(Error); }); @@ -250,6 +301,11 @@ describe('KuzzleSecurity user methods', function () { })); }); + it('should send the right delete query to Kuzzle even without callback', function (done) { + kuzzle.security.deleteUser(result.result._id); + done(); + }); + it('should call the callback with an error if one occurs', function (done) { error = 'foobar'; this.timeout(50); diff --git a/test/security/kuzzleUser/methods.test.js b/test/security/kuzzleUser/methods.test.js index 65fc24551..f40dafe2c 100644 --- a/test/security/kuzzleUser/methods.test.js +++ b/test/security/kuzzleUser/methods.test.js @@ -79,6 +79,18 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + error = 'foobar'; + + kuzzleUser.save(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#setProfile', function () { @@ -154,6 +166,16 @@ describe('KuzzleRole methods', function () { should(function () { kuzzleUser.hydrate(function () {}); }).throw(Error); done(); }); + + it('should call the callback with an error if one occurs', function (done) { + error = 'foobar'; + + kuzzleUser.hydrate(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#serialize', function () { @@ -223,6 +245,19 @@ describe('KuzzleRole methods', function () { done(); })); }); + + it('should call the callback with an error if one occurs', function (done) { + expectedQuery.body = result.result._source; + expectedQuery._id = result.result._id; + + error = 'foobar'; + + kuzzleUser.delete(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); }); From fa25009225a535142735a7a4f72017f8f6aac485 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 11:07:06 +0100 Subject: [PATCH 53/60] 100% test coverage --- test/kuzzle/methods.test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/kuzzle/methods.test.js b/test/kuzzle/methods.test.js index d22032001..915fbdb78 100644 --- a/test/kuzzle/methods.test.js +++ b/test/kuzzle/methods.test.js @@ -575,4 +575,18 @@ describe('Kuzzle methods', function () { should(kuzzle.security).be.an.instanceOf(KuzzleSecurity); }); }); + + describe('#getJwtToken', function () { + it('should return the current jwt token', function () { + var kuzzle; + + kuzzle = new Kuzzle('nowhere', { + connect: 'manual' + }); + + kuzzle.jwtToken = 'testToken'; + + should(kuzzle.getJwtToken()).be.exactly('testToken'); + }); + }); }); From 5509245edf2d4ec7b6300bf510eae803b0b66b11 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 14:21:09 +0100 Subject: [PATCH 54/60] add hydrate parameter in getter --- dist/kuzzle.js | 26 ++++++++++++++++++++++++-- dist/kuzzle.min.js | 2 +- dist/kuzzle.min.map | 2 +- src/security/kuzzleSecurity.js | 26 ++++++++++++++++++++++++-- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/dist/kuzzle.js b/dist/kuzzle.js index 8942df162..fc7bcaa8f 100644 --- a/dist/kuzzle.js +++ b/dist/kuzzle.js @@ -3312,9 +3312,10 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** * @param {string} id + * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getProfile = function (id, cb) { +KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { var data, self = this; @@ -3323,6 +3324,11 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { throw new Error('Id parameter is mandatory for getProfile function'); } + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = true; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); @@ -3332,6 +3338,12 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { return cb(error); } + if (!hydrate) { + response.result._source.roles = response.result._source.roles.map(function (role) { + return role._id; + }); + } + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); }; @@ -3469,9 +3481,10 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { * Retrieve a single User using its unique user ID. * * @param {string} id + * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.getUser = function (id, cb) { +KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { var data, self = this; @@ -3480,6 +3493,11 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { throw new Error('Id parameter is mandatory for getUser function'); } + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = true; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); @@ -3489,6 +3507,10 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { return cb(err); } + if (!hydrate) { + response.result._source.profile = response.result._source.profile._id; + } + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); }); }; diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 51d52416a..a60f8fe66 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ // Official Javascript SDK for Kuzzle v1.4.4 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[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&&-1!==e.indexOf(a)}}):this}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},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.toJSON(),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):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.toJSON();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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){ -return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getProfile",b),d.kuzzle.query(this.buildQueryArgs("getProfile"),c,null,function(a,c){return a?b(a):void b(null,new f(d,c.result._id,c.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b){var c,d=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getUser",b),d.kuzzle.query(this.buildQueryArgs("getUser"),c,null,function(a,c){return a?b(a):void b(null,new g(d,c.result._id,c.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); +return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c||"function"!=typeof b||(c=b,b=!0),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,null,function(a,d){return a?c(a):(b||(d.result._source.roles=d.result._source.roles.map(function(a){return a._id})),void c(null,new f(e,d.result._id,d.result._source)))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},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=!0),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getUser",c),e.kuzzle.query(this.buildQueryArgs("getUser"),d,null,function(a,d){return a?c(a):(b||(d.result._source.profile=d.result._source.profile._id),void c(null,new g(e,d.result._id,d.result._source)))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index cd5e7bfb8..25da7280e 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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"dataCollection","setContent","save","publish","values",6,"channel","lastRenewal","notifier","queue","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"profile","setProfile"],"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","_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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"dataCollection","setContent","save","publish","values",6,"channel","lastRenewal","notifier","queue","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","profile","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"setProfile"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index 069804723..2f21c2a44 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -193,9 +193,10 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** * @param {string} id + * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getProfile = function (id, cb) { +KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { var data, self = this; @@ -204,6 +205,11 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { throw new Error('Id parameter is mandatory for getProfile function'); } + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = true; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); @@ -213,6 +219,12 @@ KuzzleSecurity.prototype.getProfile = function (id, cb) { return cb(error); } + if (!hydrate) { + response.result._source.roles = response.result._source.roles.map(function (role) { + return role._id; + }); + } + cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); }; @@ -350,9 +362,10 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { * Retrieve a single User using its unique user ID. * * @param {string} id + * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.getUser = function (id, cb) { +KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { var data, self = this; @@ -361,6 +374,11 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { throw new Error('Id parameter is mandatory for getUser function'); } + if (!cb && typeof hydrate === 'function') { + cb = hydrate; + hydrate = true; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); @@ -370,6 +388,10 @@ KuzzleSecurity.prototype.getUser = function (id, cb) { return cb(err); } + if (!hydrate) { + response.result._source.profile = response.result._source.profile._id; + } + cb(null, new KuzzleUser(self, response.result._id, response.result._source)); }); }; From 1d61126e9fabc3cf59c86632339bb6734177440c Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 14:32:34 +0100 Subject: [PATCH 55/60] add unit test getProfile/getUser with hydrate false --- .../kuzzleSecurity/profilesMethods.test.js | 24 ++++++++++++++++++- .../kuzzleSecurity/userMethods.test.js | 22 ++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js index 9d9f5af2a..2bc59064b 100644 --- a/test/security/kuzzleSecurity/profilesMethods.test.js +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -46,7 +46,7 @@ describe('KuzzleSecurity profiles methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: {_id: 'foobar', _source: {} }}; + result = { result: {_id: 'foobar', _source: {roles: [{_id: 'role1', _source: {indexes: {}}}]} }}; expectedQuery = { action: 'getProfile', controller: 'security', @@ -58,6 +58,28 @@ describe('KuzzleSecurity profiles methods', function () { should(kuzzle.security.getProfile(result.result._id, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleProfile); + + should(res.content.roles).be.an.Array(); + should(res.content.roles).not.be.empty(); + + res.content.roles.forEach(function (role) { + should(role).instanceof(KuzzleRole); + }); + done(); + })); + }); + + it('should send the right query to Kuzzle with id as roles when hydrate is false', function (done) { + should(kuzzle.security.getProfile(result.result._id, false, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleProfile); + + should(res.content.roles).be.an.Array(); + should(res.content.roles).not.be.empty(); + + res.content.roles.forEach(function (role) { + should(role).be.a.String(); + }); done(); })); }); diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index 3936e6e4d..976339f97 100644 --- a/test/security/kuzzleSecurity/userMethods.test.js +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -47,7 +47,7 @@ describe('KuzzleSecurity user methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: {_id: 'foobar', _source: {} }}; + result = { result: {_id: 'foobar', _source: {profile: {_id: 'profile', _source: {roles: [{_id: 'role', _source: {indexes: {}}}]}}} }}; expectedQuery = { action: 'getUser', controller: 'security', @@ -59,6 +59,26 @@ describe('KuzzleSecurity user methods', function () { should(kuzzle.security.getUser(result.result._id, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleUser); + + + should(res.content.profile).instanceof(KuzzleProfile); + should(res.content.profile.content.roles).be.an.Array(); + should(res.content.profile.content.roles).not.be.empty(); + + res.content.profile.content.roles.forEach(function (role) { + should(role).instanceof(KuzzleRole); + }); + + done(); + })); + }); + + it('should send the right query to Kuzzle with id as profile when hydrate is false', function (done) { + should(kuzzle.security.getUser(result.result._id, false, function (err, res) { + should(err).be.null(); + should(res).be.instanceof(KuzzleUser); + + should(res.content.profile).be.a.String(); done(); })); }); From a9fae5f1823471251c7d29aa0d6fbfc84a22b56a Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Wed, 10 Feb 2016 15:54:52 +0100 Subject: [PATCH 56/60] fix call to auth/checkToken not send token --- src/kuzzle.js | 2 +- test/kuzzle/query.test.js | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index a3fd0b6e7..b05006039 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -983,7 +983,7 @@ Kuzzle.prototype.query = function (queryArgs, query, options, cb) { * Do not add the token for the checkToken route, to avoid getting a token error when * a developer simply wish to verify his token */ - if (self.jwtToken !== undefined && object.controller !== 'auth' && object.action !== 'checkToken') { + if (self.jwtToken !== undefined && !(object.controller === 'auth' && object.action === 'checkToken')) { object.headers = object.headers || {}; object.headers.authorization = 'Bearer ' + self.jwtToken; } diff --git a/test/kuzzle/query.test.js b/test/kuzzle/query.test.js index 522d01161..3a3603feb 100644 --- a/test/kuzzle/query.test.js +++ b/test/kuzzle/query.test.js @@ -292,5 +292,28 @@ describe('Query management', function () { should(emitted).be.false(); should(kuzzle.offlineQueue.length).be.exactly(0); }); + + it('should not set jwtToken if we execute auth/checkToken', function () { + var + kuzzle, + query = { body: { some: 'query'}}, + now = Date.now(); + + this.timeout(200); + + Kuzzle = rewire(kuzzleSource); + + kuzzle = new Kuzzle('nowhere', { + connect: 'manual' + }); + + kuzzle.queuing = true; + kuzzle.jwtToken = 'fake-token'; + + kuzzle.query({collection: 'collection', controller: 'auth', action: 'checkToken', index: 'index'}, {}); + + should(kuzzle.offlineQueue.length).be.exactly(1); + should(kuzzle.offlineQueue[0].query.headers).be.undefined(); + }); }); }); From 07e7e012bf8f21665cfada65cb8e3beefa72dabc Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 11 Feb 2016 09:41:41 +0100 Subject: [PATCH 57/60] nitpick --- src/kuzzle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index b05006039..b93ef3a46 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -233,7 +233,7 @@ module.exports = Kuzzle = function (url, options, cb) { }); /** - * Create an attribute security that embed all methods for manage Role, Profile and User + * Create an attribute security that embed all methods to manage Role, Profile and User */ Object.defineProperty(this, 'security', { value: new KuzzleSecurity(this), From 89b1c8b7fe70d104e20ccd876ca83419e811e96e Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 11 Feb 2016 12:39:42 +0100 Subject: [PATCH 58/60] add options in security methods --- src/security/kuzzleProfile.js | 22 ++- src/security/kuzzleRole.js | 10 +- src/security/kuzzleSecurity.js | 166 +++++++++++++----- src/security/kuzzleSecurityDocument.js | 10 +- src/security/kuzzleUser.js | 21 ++- .../kuzzleSecurity/profilesMethods.test.js | 33 +++- .../kuzzleSecurity/userMethods.test.js | 30 +++- 7 files changed, 227 insertions(+), 65 deletions(-) diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 4dfe015c9..1e3ed5543 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -48,11 +48,11 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { /** * Persist to the persistent layer the current profile * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response - * * @returns {Object} this */ -KuzzleProfile.prototype.save = function (cb) { +KuzzleProfile.prototype.save = function (options, cb) { var data, self = this; @@ -61,9 +61,14 @@ KuzzleProfile.prototype.save = function (cb) { throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string'); } + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + data = this.serialize(); - self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, null, function (error) { + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } @@ -125,9 +130,11 @@ KuzzleProfile.prototype.setRoles = function (roles) { /** * Hydrate the profile - get real KuzzleRole and not just ids * Warning: do not try to hydrate a profile with newly added role which is not created in kuzzle + * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleProfile.prototype.hydrate = function (cb) { +KuzzleProfile.prototype.hydrate = function (options, cb) { var self = this, @@ -143,9 +150,14 @@ KuzzleProfile.prototype.hydrate = function (cb) { } }); + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleProfile.hydrate', cb); - self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, null, function (error, response) { + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, options, function (error, response) { if (error) { return cb(error); } diff --git a/src/security/kuzzleRole.js b/src/security/kuzzleRole.js index 45cdc4b8d..eb75d038e 100644 --- a/src/security/kuzzleRole.js +++ b/src/security/kuzzleRole.js @@ -39,14 +39,20 @@ KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { * Otherwise, this method will replace the latest version of this role in Kuzzle by the current content * of this object. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleRole.prototype.save = function (cb) { +KuzzleRole.prototype.save = function (options, cb) { var data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, null, function (error) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index 2f21c2a44..3503bcd4c 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -44,9 +44,10 @@ function KuzzleSecurity(kuzzle) { * Retrieve a single Role using its unique role ID. * * @param {string} id + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.getRole = function (id, cb) { +KuzzleSecurity.prototype.getRole = function (id, options, cb) { var data, self = this; @@ -55,11 +56,16 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { throw new Error('Id parameter is mandatory for getRole function'); } + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); - self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, response) { + self.kuzzle.query(this.buildQueryArgs('getRole'), data, options, function (err, response) { if (err) { return cb(err); } @@ -76,16 +82,22 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { * That means that a role that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response * */ -KuzzleSecurity.prototype.searchRoles = function (filters, cb) { +KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { var self = this; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); - self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, null, function (error, result) { + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, options, function (error, result) { var documents; if (error) { @@ -136,7 +148,7 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { } if (cb) { - self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + self.kuzzle.query(this.buildQueryArgs(action), data, options, function (err, res) { var doc; if (err) { @@ -160,13 +172,19 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { * * * @param {string} id - Role id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteRole = function (id, cb) { +KuzzleSecurity.prototype.deleteRole = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, options, function (err, res) { if (err) { return cb(err); } @@ -174,7 +192,7 @@ KuzzleSecurity.prototype.deleteRole = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteRole'), data); + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, options); } }; @@ -192,29 +210,41 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** + * Get a specific profile from kuzzle + * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * * @param {string} id - * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true + * @param {object} [options] - (optional) arguments * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { +KuzzleSecurity.prototype.getProfile = function (id, options, cb) { var data, - self = this; + self = this, + hydrate = true; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getProfile function'); } - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = true; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else { + if (options.hydrate !== undefined) { + hydrate = options.hydrate; + } } data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); - self.kuzzle.query(this.buildQueryArgs('getProfile'), data, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('getProfile'), data, options, function (error, response) { if (error) { return cb(error); } @@ -232,28 +262,38 @@ KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { /** * Executes a search on profiles according to a filter * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * Because hydrate need to fetch all related KuzzleRole object, leave hydrate to true will have a performance cost + * * /!\ There is a small delay between profile creation and their existence in our persistent search layer, * usually a couple of seconds. * That means that a profile that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` - * @param {Boolean} [hydrate] - if hydrate is true, profiles will have a list of Role object instead of just a list of role id + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { +KuzzleSecurity.prototype.searchProfiles = function (filters, options, cb) { var self = this; - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = false; - } + filters.hydrate = true; - filters.hydrate = hydrate; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else { + if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; + } + } self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); - self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, options, function (error, response) { var documents; if (error) { @@ -304,7 +344,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { } if (cb) { - self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + self.kuzzle.query(this.buildQueryArgs(action), data, options, function (err, res) { var doc; if (err) { @@ -328,13 +368,19 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { * * * @param {string} id - Profile id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteProfile = function (id, cb) { +KuzzleSecurity.prototype.deleteProfile = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, options, function (err, res) { if (err) { return cb(err); } @@ -342,7 +388,7 @@ KuzzleSecurity.prototype.deleteProfile = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data); + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, options); } }; @@ -359,31 +405,41 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { }; /** - * Retrieve a single User using its unique user ID. + * Get a specific user from kuzzle using its unique ID + * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. * * @param {string} id - * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true - * @param {responseCallback} [cb] - returns Kuzzle's response + * @param {object} [options] - (optional) arguments + * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { +KuzzleSecurity.prototype.getUser = function (id, options, cb) { var data, - self = this; + self = this, + hydrate = true; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getUser function'); } - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = true; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else { + if (options.hydrate !== undefined) { + hydrate = options.hydrate; + } } data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); - self.kuzzle.query(this.buildQueryArgs('getUser'), data, null, function (err, response) { + self.kuzzle.query(this.buildQueryArgs('getUser'), data, options, function (err, response) { if (err) { return cb(err); } @@ -399,28 +455,38 @@ KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { /** * Executes a search on user according to a filter * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * Because hydrate need to fetch all related KuzzleRole object, leave hydrate to true will have a performance cost + * * /!\ There is a small delay between user creation and their existence in our persistent search layer, * usually a couple of seconds. * That means that a user that was just been created won’t be returned by this function. * * @param {Object} filters - same filters as documents filters - * @param {Boolean} hydrate - if hydrate is true, users will have a Profile object instead of just a profile id + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { +KuzzleSecurity.prototype.searchUsers = function (filters, options, cb) { var self = this; - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = false; - } + filters.hydrate = true; - filters.hydrate = hydrate; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else { + if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; + } + } self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); - self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, options, function (error, response) { var documents; if (error) { @@ -495,13 +561,19 @@ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { * * * @param {string} id - Profile id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteUser = function (id, cb) { +KuzzleSecurity.prototype.deleteUser = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, options, function (err, res) { if (err) { return cb(err); } @@ -509,7 +581,7 @@ KuzzleSecurity.prototype.deleteUser = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteUser'), data); + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, options); } }; diff --git a/src/security/kuzzleSecurityDocument.js b/src/security/kuzzleSecurityDocument.js index 9215d90a5..0932c0836 100644 --- a/src/security/kuzzleSecurityDocument.js +++ b/src/security/kuzzleSecurityDocument.js @@ -76,13 +76,19 @@ KuzzleSecurityDocument.prototype.serialize = function () { /** * Delete the current KuzzleSecurityDocument into Kuzzle. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurityDocument.prototype.delete = function (cb) { +KuzzleSecurityDocument.prototype.delete = function (options, cb) { var self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, null, function (error, res) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, options, function (error, res) { if (error) { return cb ? cb(error) : false; } diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 9ee684857..d58dd1039 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -42,19 +42,25 @@ KuzzleUser.prototype = Object.create(KuzzleSecurityDocument.prototype, { * This function allow to get the hydrated user of the corresponding current user. * The hydrated user has profiles and roles. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleUser.prototype.hydrate = function (cb) { +KuzzleUser.prototype.hydrate = function (options, cb) { var self = this; + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleUser.hydrate', cb); if (!this.content.profile || typeof this.content.profile !== 'string') { throw new Error('The User must contains a profile as string in order to be hydrated'); } - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, options, function (error, response) { if (error) { return cb(error); } @@ -88,15 +94,20 @@ KuzzleUser.prototype.setProfile = function (profile) { * of this object. * * @param {responseCallback} [cb] - Handles the query response - * + * @param {object} [options] - Optional parameters * @returns {*} this */ -KuzzleUser.prototype.save = function (cb) { +KuzzleUser.prototype.save = function (options, cb) { var data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, null, function (error) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js index 2bc59064b..0871065de 100644 --- a/test/security/kuzzleSecurity/profilesMethods.test.js +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -70,7 +70,7 @@ describe('KuzzleSecurity profiles methods', function () { }); it('should send the right query to Kuzzle with id as roles when hydrate is false', function (done) { - should(kuzzle.security.getProfile(result.result._id, false, function (err, res) { + should(kuzzle.security.getProfile(result.result._id, {hydrate: false}, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleProfile); @@ -123,7 +123,7 @@ describe('KuzzleSecurity profiles methods', function () { result = { result: { total: 123, hits: [{_id: 'foobar', _source: {roles : ['myRole']}}]} }; this.timeout(50); - expectedQuery.body = filters; + expectedQuery.body = {hydrate: true}; should(kuzzle.security.searchProfiles(filters, function (err, res) { should(err).be.null(); @@ -145,6 +145,35 @@ describe('KuzzleSecurity profiles methods', function () { })); }); + it('should send the right search query non hydrated to kuzzle and return profile', function (done) { + var + filters = {}; + + result = { result: { total: 123, hits: [{_id: 'foobar', _source: {roles : ['myRole']}}]} }; + + this.timeout(50); + expectedQuery.body = {hydrate: false}; + + should(kuzzle.security.searchProfiles(filters, {hydrate: false}, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.profiles).be.an.Array(); + should(res.profiles).not.be.empty(); + should(res.profiles.length).be.exactly(result.result.hits.length); + + res.profiles.forEach(function (item) { + should(item).be.instanceof(KuzzleProfile); + + item.content.roles.forEach(function (role) { + should(role).be.String() + }) + }); + + done(); + })); + }); + it('should send the right search query to kuzzle and return profile with roles', function (done) { var filters = {}; diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index 976339f97..606c355d6 100644 --- a/test/security/kuzzleSecurity/userMethods.test.js +++ b/test/security/kuzzleSecurity/userMethods.test.js @@ -74,7 +74,7 @@ describe('KuzzleSecurity user methods', function () { }); it('should send the right query to Kuzzle with id as profile when hydrate is false', function (done) { - should(kuzzle.security.getUser(result.result._id, false, function (err, res) { + should(kuzzle.security.getUser(result.result._id, {hydrate: false}, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleUser); @@ -120,7 +120,7 @@ describe('KuzzleSecurity user methods', function () { filters = {}; this.timeout(50); - expectedQuery.body = filters; + expectedQuery.body = {hydrate: true}; should(kuzzle.security.searchUsers(filters, function (err, res) { should(err).be.null(); @@ -141,6 +141,32 @@ describe('KuzzleSecurity user methods', function () { })); }); + it('should send the right search query not hydrated to kuzzle and return user with string', function (done) { + var + filters = {}; + + this.timeout(50); + expectedQuery.body = {hydrate: false}; + + should(kuzzle.security.searchUsers(filters, {hydrate: false}, function (err, res) { + should(err).be.null(); + should(res).be.an.Object(); + should(res.total).be.a.Number().and.be.exactly(result.result.total); + should(res.users).be.an.Array(); + should(res.users).not.be.empty(); + should(res.users.length).be.exactly(result.result.hits.length); + + res.users.forEach(function (item) { + should(item).be.instanceof(KuzzleUser); + + should(item.content.profile).be.String(); + should(item.content.profile.roles).be.undefined(); + }); + + done(); + })); + }); + it('should send the right search query to kuzzle and return user with profile and role if the user is hydrated', function (done) { var filters = {}; From a449dc1ed9564577698fa4ac63b0084b5e34e1e0 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 11 Feb 2016 13:03:56 +0100 Subject: [PATCH 59/60] whoami return KuzzleUser --- src/kuzzle.js | 14 ++++++++---- test/kuzzle/methods.test.js | 43 +++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/kuzzle.js b/src/kuzzle.js index b93ef3a46..01da620f0 100644 --- a/src/kuzzle.js +++ b/src/kuzzle.js @@ -1,7 +1,8 @@ var uuid = require('node-uuid'), KuzzleDataCollection = require('./kuzzleDataCollection'), - KuzzleSecurity = require('./security/kuzzleSecurity'); + KuzzleSecurity = require('./security/kuzzleSecurity'), + KuzzleUser = require('./security/kuzzleUser'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. @@ -512,13 +513,18 @@ Kuzzle.prototype.checkToken = function (token, callback) { Kuzzle.prototype.whoAmI = function (callback) { var self = this; - this.callbackRequired('Kuzzle.whoAmI', callback); + self.callbackRequired('Kuzzle.whoAmI', callback); - this.query({controller: 'auth', action: 'getCurrentUser'}, {}, {}, callback); + self.query({controller: 'auth', action: 'getCurrentUser'}, {}, {}, function (err, response) { + if (err) { + return callback(err); + } + + callback(null, new KuzzleUser(self.security, response.result._id, response.result._source)); + }); return self; }; - /** * Clean up the queue, ensuring the queryTTL and queryMaxSize properties are respected */ diff --git a/test/kuzzle/methods.test.js b/test/kuzzle/methods.test.js index 915fbdb78..8f722a6d5 100644 --- a/test/kuzzle/methods.test.js +++ b/test/kuzzle/methods.test.js @@ -3,7 +3,8 @@ var rewire = require('rewire'), Kuzzle = rewire('../../src/kuzzle'), KuzzleDataCollection = require('../../src/kuzzleDataCollection'), - KuzzleSecurity = require('../../src/security/kuzzleSecurity'); + KuzzleSecurity = require('../../src/security/kuzzleSecurity'), + KuzzleUser = require('../../src/security/kuzzleUser'); describe('Kuzzle methods', function () { var @@ -17,7 +18,6 @@ describe('Kuzzle methods', function () { should(args.index).be.eql(expectedQuery.index); should(args.controller).be.exactly(expectedQuery.controller); should(args.action).be.exactly(expectedQuery.action); - if (passedOptions) { should(options).match(passedOptions); } @@ -562,6 +562,45 @@ describe('Kuzzle methods', function () { should(kuzzle.offlineQueue[0].query.action).be.exactly('getCurrentUser'); should(kuzzle.offlineQueue[0].query.controller).be.exactly('auth'); }); + + it('should send correct query and return a KuzzleUser', function (done) { + var kuzzle; + + kuzzle = new Kuzzle('nowhere', { + connect: 'manual' + }); + kuzzle.query = queryStub; + + error = false; + result = {result: {_id: 'user', _source: {firstName: 'Ada'}}}; + expectedQuery = { + controller: 'auth', + action: 'getCurrentUser' + }; + + kuzzle.whoAmI(function (err, res) { + should(res).instanceof(KuzzleUser); + done(); + }); + }); + + it('should execute the callback with an error if an error occurs', function (done) { + var kuzzle; + + kuzzle = new Kuzzle('nowhere', { + connect: 'manual' + }); + kuzzle.query = queryStub; + + this.timeout(50); + error = 'foobar'; + + kuzzle.whoAmI(function (err, res) { + should(err).be.exactly('foobar'); + should(res).be.undefined(); + done(); + }); + }); }); describe('#security', function () { From 8548ffd190a71e289d5bbe0b44c04164ccf2da56 Mon Sep 17 00:00:00 2001 From: Anthony Sendra Date: Thu, 11 Feb 2016 13:09:50 +0100 Subject: [PATCH 60/60] fix eslint --- dist/kuzzle.js | 241 +++++++++++++++++++++++---------- dist/kuzzle.min.js | 4 +- dist/kuzzle.min.map | 2 +- src/security/kuzzleSecurity.js | 24 ++-- 4 files changed, 184 insertions(+), 87 deletions(-) diff --git a/dist/kuzzle.js b/dist/kuzzle.js index fc7bcaa8f..f3ebb0b9b 100644 --- a/dist/kuzzle.js +++ b/dist/kuzzle.js @@ -276,7 +276,8 @@ var uuid = require('node-uuid'), KuzzleDataCollection = require('./kuzzleDataCollection'), - KuzzleSecurity = require('./security/kuzzleSecurity'); + KuzzleSecurity = require('./security/kuzzleSecurity'), + KuzzleUser = require('./security/kuzzleUser'); /** * This is a global callback pattern, called by all asynchronous functions of the Kuzzle object. @@ -508,7 +509,7 @@ module.exports = Kuzzle = function (url, options, cb) { }); /** - * Create an attribute security that embed all methods for manage Role, Profile and User + * Create an attribute security that embed all methods to manage Role, Profile and User */ Object.defineProperty(this, 'security', { value: new KuzzleSecurity(this), @@ -787,13 +788,18 @@ Kuzzle.prototype.checkToken = function (token, callback) { Kuzzle.prototype.whoAmI = function (callback) { var self = this; - this.callbackRequired('Kuzzle.whoAmI', callback); + self.callbackRequired('Kuzzle.whoAmI', callback); - this.query({controller: 'auth', action: 'getCurrentUser'}, {}, {}, callback); + self.query({controller: 'auth', action: 'getCurrentUser'}, {}, {}, function (err, response) { + if (err) { + return callback(err); + } + + callback(null, new KuzzleUser(self.security, response.result._id, response.result._source)); + }); return self; }; - /** * Clean up the queue, ensuring the queryTTL and queryMaxSize properties are respected */ @@ -1258,7 +1264,7 @@ Kuzzle.prototype.query = function (queryArgs, query, options, cb) { * Do not add the token for the checkToken route, to avoid getting a token error when * a developer simply wish to verify his token */ - if (self.jwtToken !== undefined && object.controller !== 'auth' && object.action !== 'checkToken') { + if (self.jwtToken !== undefined && !(object.controller === 'auth' && object.action === 'checkToken')) { object.headers = object.headers || {}; object.headers.authorization = 'Bearer ' + self.jwtToken; } @@ -1422,7 +1428,7 @@ Kuzzle.prototype.stopQueuing = function () { return this; }; -},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":undefined}],3:[function(require,module,exports){ +},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"./security/kuzzleUser":11,"node-uuid":1,"socket.io-client":undefined}],3:[function(require,module,exports){ var KuzzleDocument = require('./kuzzleDocument'), KuzzleDataMapping = require('./kuzzleDataMapping'), @@ -2917,11 +2923,11 @@ KuzzleProfile.prototype = Object.create(KuzzleSecurityDocument.prototype, { /** * Persist to the persistent layer the current profile * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response - * * @returns {Object} this */ -KuzzleProfile.prototype.save = function (cb) { +KuzzleProfile.prototype.save = function (options, cb) { var data, self = this; @@ -2930,9 +2936,14 @@ KuzzleProfile.prototype.save = function (cb) { throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string'); } + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + data = this.serialize(); - self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, null, function (error) { + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('createOrReplaceProfile'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } @@ -2994,9 +3005,11 @@ KuzzleProfile.prototype.setRoles = function (roles) { /** * Hydrate the profile - get real KuzzleRole and not just ids * Warning: do not try to hydrate a profile with newly added role which is not created in kuzzle + * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleProfile.prototype.hydrate = function (cb) { +KuzzleProfile.prototype.hydrate = function (options, cb) { var self = this, @@ -3012,9 +3025,14 @@ KuzzleProfile.prototype.hydrate = function (cb) { } }); + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleProfile.hydrate', cb); - self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, null, function (error, response) { + self.kuzzle.query(self.kuzzleSecurity.buildQueryArgs('mGetRoles'), {body: data}, options, function (error, response) { if (error) { return cb(error); } @@ -3097,14 +3115,20 @@ KuzzleRole.prototype = Object.create(KuzzleSecurityDocument.prototype, { * Otherwise, this method will replace the latest version of this role in Kuzzle by the current content * of this object. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleRole.prototype.save = function (cb) { +KuzzleRole.prototype.save = function (options, cb) { var data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, null, function (error) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceRole'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } @@ -3163,9 +3187,10 @@ function KuzzleSecurity(kuzzle) { * Retrieve a single Role using its unique role ID. * * @param {string} id + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.getRole = function (id, cb) { +KuzzleSecurity.prototype.getRole = function (id, options, cb) { var data, self = this; @@ -3174,11 +3199,16 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { throw new Error('Id parameter is mandatory for getRole function'); } + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getRole', cb); - self.kuzzle.query(this.buildQueryArgs('getRole'), data, null, function (err, response) { + self.kuzzle.query(this.buildQueryArgs('getRole'), data, options, function (err, response) { if (err) { return cb(err); } @@ -3195,16 +3225,22 @@ KuzzleSecurity.prototype.getRole = function (id, cb) { * That means that a role that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `indexes` with a list of index id, a integer `from` and a integer `size` + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - returns Kuzzle's response * */ -KuzzleSecurity.prototype.searchRoles = function (filters, cb) { +KuzzleSecurity.prototype.searchRoles = function (filters, options, cb) { var self = this; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleSecurity.searchRoles', cb); - self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, null, function (error, result) { + self.kuzzle.query(this.buildQueryArgs('searchRoles'), {body: filters}, options, function (error, result) { var documents; if (error) { @@ -3255,7 +3291,7 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { } if (cb) { - self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + self.kuzzle.query(this.buildQueryArgs(action), data, options, function (err, res) { var doc; if (err) { @@ -3279,13 +3315,19 @@ KuzzleSecurity.prototype.createRole = function (id, content, options, cb) { * * * @param {string} id - Role id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteRole = function (id, cb) { +KuzzleSecurity.prototype.deleteRole = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, options, function (err, res) { if (err) { return cb(err); } @@ -3293,7 +3335,7 @@ KuzzleSecurity.prototype.deleteRole = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteRole'), data); + this.kuzzle.query(this.buildQueryArgs('deleteRole'), data, options); } }; @@ -3311,29 +3353,39 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { /** + * Get a specific profile from kuzzle + * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * * @param {string} id - * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true + * @param {object} [options] - (optional) arguments * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { +KuzzleSecurity.prototype.getProfile = function (id, options, cb) { var data, - self = this; + self = this, + hydrate = true; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getProfile function'); } - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = true; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else if (options.hydrate !== undefined) { + hydrate = options.hydrate; } data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); - self.kuzzle.query(this.buildQueryArgs('getProfile'), data, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('getProfile'), data, options, function (error, response) { if (error) { return cb(error); } @@ -3351,28 +3403,36 @@ KuzzleSecurity.prototype.getProfile = function (id, hydrate, cb) { /** * Executes a search on profiles according to a filter * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * Because hydrate need to fetch all related KuzzleRole object, leave hydrate to true will have a performance cost + * * /!\ There is a small delay between profile creation and their existence in our persistent search layer, * usually a couple of seconds. * That means that a profile that was just been created won’t be returned by this function. * * @param {Object} filters - this object can contains an array `roles` with a list of roles id, a integer `from` and a integer `size` - * @param {Boolean} [hydrate] - if hydrate is true, profiles will have a list of Role object instead of just a list of role id + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.searchProfiles = function (filters, hydrate, cb) { +KuzzleSecurity.prototype.searchProfiles = function (filters, options, cb) { var self = this; - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = false; - } + filters.hydrate = true; - filters.hydrate = hydrate; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; + } self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); - self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('searchProfiles'), {body: filters}, options, function (error, response) { var documents; if (error) { @@ -3423,7 +3483,7 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { } if (cb) { - self.kuzzle.query(this.buildQueryArgs(action), data, null, function (err, res) { + self.kuzzle.query(this.buildQueryArgs(action), data, options, function (err, res) { var doc; if (err) { @@ -3447,13 +3507,19 @@ KuzzleSecurity.prototype.createProfile = function (id, content, options, cb) { * * * @param {string} id - Profile id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteProfile = function (id, cb) { +KuzzleSecurity.prototype.deleteProfile = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, options, function (err, res) { if (err) { return cb(err); } @@ -3461,7 +3527,7 @@ KuzzleSecurity.prototype.deleteProfile = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data); + this.kuzzle.query(this.buildQueryArgs('deleteProfile'), data, options); } }; @@ -3478,31 +3544,39 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { }; /** - * Retrieve a single User using its unique user ID. + * Get a specific user from kuzzle using its unique ID + * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. * * @param {string} id - * @param {Boolean} hydrate - if is set to false, return a list id in role instead of KuzzleRole. Default true - * @param {responseCallback} [cb] - returns Kuzzle's response + * @param {object} [options] - (optional) arguments + * @param {responseCallback} cb - returns Kuzzle's response */ -KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { +KuzzleSecurity.prototype.getUser = function (id, options, cb) { var data, - self = this; + self = this, + hydrate = true; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getUser function'); } - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = true; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else if (options.hydrate !== undefined) { + hydrate = options.hydrate; } data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getUser', cb); - self.kuzzle.query(this.buildQueryArgs('getUser'), data, null, function (err, response) { + self.kuzzle.query(this.buildQueryArgs('getUser'), data, options, function (err, response) { if (err) { return cb(err); } @@ -3518,28 +3592,36 @@ KuzzleSecurity.prototype.getUser = function (id, hydrate, cb) { /** * Executes a search on user according to a filter * + * Takes an optional argument object with the following property: + * - hydrate (boolean, default: true): + * if is set to false, return a list id in role instead of KuzzleRole. + * Because hydrate need to fetch all related KuzzleRole object, leave hydrate to true will have a performance cost + * * /!\ There is a small delay between user creation and their existence in our persistent search layer, * usually a couple of seconds. * That means that a user that was just been created won’t be returned by this function. * * @param {Object} filters - same filters as documents filters - * @param {Boolean} hydrate - if hydrate is true, users will have a Profile object instead of just a profile id + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - returns Kuzzle's response */ -KuzzleSecurity.prototype.searchUsers = function (filters, hydrate, cb) { +KuzzleSecurity.prototype.searchUsers = function (filters, options, cb) { var self = this; - if (!cb && typeof hydrate === 'function') { - cb = hydrate; - hydrate = false; - } + filters.hydrate = true; - filters.hydrate = hydrate; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + else if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; + } self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); - self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, null, function (error, response) { + self.kuzzle.query(this.buildQueryArgs('searchUsers'), {body: filters}, options, function (error, response) { var documents; if (error) { @@ -3614,13 +3696,19 @@ KuzzleSecurity.prototype.createUser = function (id, content, options, cb) { * * * @param {string} id - Profile id to delete + * @param {object} [options] - (optional) arguments * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurity.prototype.deleteUser = function (id, cb) { +KuzzleSecurity.prototype.deleteUser = function (id, options, cb) { var data = {_id: id}; + if (!cb && typeof options === 'function') { + cb = options; + options = null; + } + if (cb) { - this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, null, function (err, res) { + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, options, function (err, res) { if (err) { return cb(err); } @@ -3628,7 +3716,7 @@ KuzzleSecurity.prototype.deleteUser = function (id, cb) { cb(null, res.result._id); }); } else { - this.kuzzle.query(this.buildQueryArgs('deleteUser'), data); + this.kuzzle.query(this.buildQueryArgs('deleteUser'), data, options); } }; @@ -3725,13 +3813,19 @@ KuzzleSecurityDocument.prototype.serialize = function () { /** * Delete the current KuzzleSecurityDocument into Kuzzle. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleSecurityDocument.prototype.delete = function (cb) { +KuzzleSecurityDocument.prototype.delete = function (options, cb) { var self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, null, function (error, res) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName), {_id: this.id}, options, function (error, res) { if (error) { return cb ? cb(error) : false; } @@ -3788,19 +3882,25 @@ KuzzleUser.prototype = Object.create(KuzzleSecurityDocument.prototype, { * This function allow to get the hydrated user of the corresponding current user. * The hydrated user has profiles and roles. * + * @param {object} [options] - Optional parameters * @param {responseCallback} [cb] - Handles the query response */ -KuzzleUser.prototype.hydrate = function (cb) { +KuzzleUser.prototype.hydrate = function (options, cb) { var self = this; + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + self.kuzzle.callbackRequired('KuzzleUser.hydrate', cb); if (!this.content.profile || typeof this.content.profile !== 'string') { throw new Error('The User must contains a profile as string in order to be hydrated'); } - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, null, function (error, response) { + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, options, function (error, response) { if (error) { return cb(error); } @@ -3834,15 +3934,20 @@ KuzzleUser.prototype.setProfile = function (profile) { * of this object. * * @param {responseCallback} [cb] - Handles the query response - * + * @param {object} [options] - Optional parameters * @returns {*} this */ -KuzzleUser.prototype.save = function (cb) { +KuzzleUser.prototype.save = function (options, cb) { var data = this.serialize(), self = this; - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, null, function (error) { + if (options && cb === undefined && typeof options === 'function') { + cb = options; + options = null; + } + + self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('createOrReplaceUser'), data, options, function (error) { if (error) { return cb ? cb(error) : false; } diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index a60f8fe66..3363faff3 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ // Official Javascript SDK for Kuzzle v1.4.4 - 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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return this.callbackRequired("Kuzzle.whoAmI",a),this.query({controller:"auth",action:"getCurrentUser"},{},{},a),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[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&&-1!==e.indexOf(a)}}):this}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},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.toJSON(),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):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.toJSON();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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b,c=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');return b=this.serialize(),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a){var b=this,c={ids:[]};c.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),b.kuzzle.callbackRequired("KuzzleProfile.hydrate",a),b.kuzzle.query(b.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:c},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a){var b=this.serialize(),c=this;c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b){var c,d=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c={_id:a},d.kuzzle.callbackRequired("KuzzleSecurity.getRole",b),d.kuzzle.query(this.buildQueryArgs("getRole"),c,null,function(a,c){ -return a?b(a):void b(null,new e(d,c.result._id,c.result._source))})},d.prototype.searchRoles=function(a,b){var c=this;c.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",b),c.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},null,function(a,d){var f;return a?b(a):(f=d.result.hits.map(function(a){return new e(c,a._id,a._source)}),void b(null,{total:d.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,null,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.deleteRole=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteRole"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),c)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c||"function"!=typeof b||(c=b,b=!0),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,null,function(a,d){return a?c(a):(b||(d.result._source.roles=d.result._source.roles.map(function(a){return a._id})),void c(null,new f(e,d.result._id,d.result._source)))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},null,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,null,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.deleteProfile=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),c)},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=!0),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getUser",c),e.kuzzle.query(this.buildQueryArgs("getUser"),d,null,function(a,d){return a?c(a):(b||(d.result._source.profile=d.result._source.profile._id),void c(null,new g(e,d.result._id,d.result._source)))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=!1),a.hydrate=b,d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},null,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.deleteUser=function(a,b){var c={_id:a};b?this.kuzzle.query(this.buildQueryArgs("deleteUser"),c,null,function(a,c){return a?b(a):void b(null,c.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),c)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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){var b=this;b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},null,function(b,c){return b?a?a(b):!1:void(a&&a(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a){var b=this;if(b.kuzzle.callbackRequired("KuzzleUser.hydrate",a),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");b.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},null,function(c,e){return c?a(c):void a(null,new d(b,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=a,this},d.prototype.save=function(a){var b=this.serialize(),c=this;return c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),b,null,function(b){return b?a?a(b):!1:void(a&&a(null,c))}),c},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); +!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;gb;b++)0===(3&b)&&(a=4294967296*Math.random()),e[b]=a>>>((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){16>e&&(b[d+e++]=q[a])});16>e;)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(0>j&&null==a.clockseq&&(f=f+1&16383),(0>j||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;6>n;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;16>f;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;256>r;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(){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)}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){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(a,a.offlineQueue[0].query,a.offlineQueue[0].cb),a.offlineQueue.shift(),setTimeout(function(){f.call(a)},Math.max(0,a.replayInterval))):a.queuing=!1}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("./security/kuzzleUser");b.exports=Kuzzle=function(b,c,d){var e=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,c,d);if(d||"function"!=typeof c||(d=c,c=null),!b||""===b)throw new Error("URL 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:[]}}},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:c&&"boolean"==typeof c.autoReconnect?c.autoReconnect:!0,enumerable:!0},defaultIndex:{value:c&&"string"==typeof c.defaultIndex?c.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:c&&"number"==typeof c.reconnectionDelay?c.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}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),c&&(Object.keys(c).forEach(function(a){e.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(e,a).writable&&(e[a]=c[a])}),"auto"===c.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===e.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(),c=Array.prototype.slice.call(arguments,1);return this.eventListeners[a].lastEmitted&&this.eventListeners[a].lastEmitted>=b-this.eventTimeout?!1:(this.eventListeners[a].listeners.forEach(function(a){a.fn.apply(this,c)}),void(this.eventListeners[a].lastEmitted=b))}}),c&&c.connect&&"auto"!==c.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&&-1!==e.indexOf(a)}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return-1===["initializing","ready","disconnected","error","offline"].indexOf(this.state)?(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){a.state="error",a.emitEvent("error"),a.connectCB&&a.connectCB(b)}),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){return this.jwtToken=a,this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a,b,c,d){var e=this,f={strategy:a};return d||"function"!=typeof c||(d=c,c=null),Object.keys(b).forEach(function(a){f[a]=b[a]}),-1!==["number","string"].indexOf(typeof c)&&(f.expiresIn=c),this.query({controller:"auth",action:"login"},{body:f},{queuable:!1},function(a,b){if(null===a)e.setJwtToken(b.result.jwt),g.call(e),"function"==typeof d&&d(null,e);else{if("function"!=typeof d)throw new Error(a.message);d(a)}}),e},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.setJwtToken(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,{},b),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 k(b.security,d.result._id,d.result._source))}),b},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-1===d.indexOf(a))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(),1===arguments.length?(b=arguments[0],a=this.defaultIndex):2===arguments.length&&"object"==typeof b&&(headers=b,b=a,a=this.defaultIndex),!a)throw new Error("Unable to create a new data collection object: no index specified");return this.collections[a]||(this.collections[a]={}),this.collections[a][b]||(this.collections[a][b]=new i(this,a,b)),this.collections[a][b]},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.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: "+i)):(j.queuing||-1!==["initializing","connecting"].indexOf(j.state))&&(d.call(this,i,f),j.queueFilter?j.queueFilter(i)&&j.offlineQueue.push({ts:Date.now(),query:i,cb:f}):j.offlineQueue.push({ts:Date.now(),query:i,cb:f})),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(-1===b.indexOf(a))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(-1===c.indexOf(a))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}},{"./kuzzleDataCollection":3,"./security/kuzzleSecurity":9,"./security/kuzzleUser":11,"node-uuid":1,"socket.io-client":void 0}],3:[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&&-1===e.indexOf(a)}}):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.toJSON():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["delete"]=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","deleteCollection"),c,a,b),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};return"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),this},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){return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch({},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){var c={};return a instanceof e?c=a.toJSON():c.body=a,c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),c,b),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":4,"./kuzzleDocument":5,"./kuzzleRoom":6}],4:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,eunmerable:!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&&-1===e.indexOf(a)}}):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):!1: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):!1: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(b&&b(null,c))):b?b(new Error("No mapping found for collection "+c.collection.collection)):!1:b?b(new Error("No mapping found for index "+c.collection.index)):!1}),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},{}],5:[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&&-1!==e.indexOf(a)}}):this}d.prototype.toJSON=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.toJSON())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!this.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");return b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a,function(a){return a?b(a):void b(null,c)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.toJSON(),a),this},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.toJSON(),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):!1:(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.toJSON();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},{}],6:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:g.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:!0,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&&-1!==e.indexOf(a)}}):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)}var g=a("node-uuid");d.prototype.count=function(a){var b;return this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),this.subscribing?(this.queue.push({action:"count",args:[a]}),this):(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.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.kuzzle.callbackRequired("KuzzleRoom.renew",b),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 b.subscribing?(b.queue.push({action:"unsubscribe",args:[]}),b):(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)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],7:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"}}),c&&c.roles&&(c.roles=c.roles.map(function(b){return b._id&&b._source?new f(a,b._id,b._source):b})),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleRole");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c,d=this;if(!this.content.roles)throw new Error('Argument "roles" is mandatory in a profile. This argument contains an array of KuzzleRole or an array of id string');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):!1:void(b&&b(null,d))}),d},d.prototype.addRole=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be a KuzzleRole or a id string');return this.content.roles||(this.content.roles=[]),this.content.roles.push(a),this},d.prototype.setRoles=function(a){if(!Array.isArray(a))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string');return a.map(function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string')}),this.content.roles=a,this},d.prototype.hydrate=function(a,b){var c=this,e={ids:[]};e.ids=this.content.roles.map(function(a){return"string"==typeof a?a:a instanceof f?a.id:void 0}),a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c.kuzzle.callbackRequired("KuzzleProfile.hydrate",b),c.kuzzle.query(c.kuzzleSecurity.buildQueryArgs("mGetRoles"),{body:e},a,function(a,e){return a?b(a):void b(null,new d(c,e.result._id,e.result._source))})},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.roles&&Array.isArray(a.body.roles)?(a.body.roles=a.body.roles.map(function(a){return a instanceof f?a.id:a}),a):a},b.exports=d},{"./kuzzleRole":8,"./kuzzleSecurityDocument":10}],8:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&-1!==e.indexOf(a)}}):void 0}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):!1:void(b&&b(null,d))})},b.exports=d},{"./kuzzleSecurityDocument":10}],9:[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"];return d&&-1===e.indexOf(a)}}):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.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,g=!0;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");c||"function"!=typeof b?void 0!==b.hydrate&&(g=b.hydrate):(c=b,b=null),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,b,function(a,b){return a?c(a):(g||(b.result._source.roles=b.result._source.roles.map(function(a){return a._id})),void c(null,new f(e,b.result._id,b.result._source)))})},d.prototype.searchProfiles=function(a,b,c){var d=this;a.hydrate=!0,c||"function"!=typeof b?void 0!==b.hydrate&&(a.hydrate=b.hydrate):(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.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,f=!0;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c||"function"!=typeof b?void 0!==b.hydrate&&(f=b.hydrate):(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):(f||(b.result._source.profile=b.result._source.profile._id),void c(null,new g(e,b.result._id,b.result._source)))})},d.prototype.searchUsers=function(a,b,c){var d=this;a.hydrate=!0,c||"function"!=typeof b?void 0!==b.hydrate&&(a.hydrate=b.hydrate):(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.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)},b.exports=d},{"./kuzzleProfile":7,"./kuzzleRole":8,"./kuzzleUser":11}],10:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");return 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),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete"];return d&&-1!==e.indexOf(a)}}):void 0}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):!1:void(b&&b(null,c.result._id))})},b.exports=d},{}],11:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(c.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"}}),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&-1!==e.indexOf(a)}}):void 0}var e=a("./kuzzleSecurityDocument"),f=a("./kuzzleProfile");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.hydrate=function(a,b){var c=this;if(a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c.kuzzle.callbackRequired("KuzzleUser.hydrate",b),!this.content.profile||"string"!=typeof this.content.profile)throw new Error("The User must contains a profile as string in order to be hydrated");c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("getProfile"),{_id:this.content.profile},a,function(a,e){return a?b(a):void b(null,new d(c,e.result._id,e.result._source))})},d.prototype.setProfile=function(a){if("string"!=typeof a&&!(a instanceof f))throw new Error('Parameter "profile" must be a KuzzleProfile or a string');return this.content.profile=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):!1:void(b&&b(null,d))}),d},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a.body.profile&&a.body.profile.id&&(a.body.profile=a.body.profile.id),a},b.exports=d},{"./kuzzleProfile":7,"./kuzzleSecurityDocument":10}]},{},[2]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index 25da7280e..c5784e983 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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_id","_source","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"dataCollection","setContent","save","publish","values",6,"channel","lastRenewal","notifier","queue","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"KuzzleUser","getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","profile","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"setProfile"],"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","_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,"cleanQueue","self","this","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","once","requestId","response","error","message","emitEvent","emit","requestHistory","Object","keys","key","dequeue","shift","setTimeout","max","replayInterval","queuing","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","KuzzleUser","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","hasOwnProperty","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","args","prototype","slice","arguments","listener","fn","apply","connect","bluebird","promisifyAll","suffix","filter","name","func","target","passes","whitelist","indexOf","reconnection","forceNew","on","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","getJwtToken","login","strategy","credentials","expiresIn","controller","action","body","queuable","result","jwt","logout","callbackRequired","whoAmI","security","_id","_source","addListener","listenerId","knownEvents","listenerType","isValid","push","id","getAllStatistics","hits","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","queryArgs","attr","object","meta","addHeaders","authorization","removeAllListeners","eventName","removeListener","replayQueue","setDefaultIndex","setHeaders","content","isArray","startQueuing","stopQueuing","./kuzzleDataCollection","./security/kuzzleSecurity","./security/kuzzleUser","node-uuid","socket.io-client",3,"kuzzle","JSON","stringify","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","version","_version","total","count","create","data","createDocument","document","toJSON","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",4,"kuzzleDataCollection","eunmerable","properties","mappings","set","field",5,"dataCollection","setContent","save","publish","values",6,"channel","lastRenewal","notifier","queue","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","subscribeQuery","unsubscribe","bind","interval","off","setInterval","clearInterval",7,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","roles","map","role","KuzzleRole","constructor","serialize","addRole","setRoles","hydrate","./kuzzleRole","./kuzzleSecurityDocument",8,9,"getRole","searchRoles","createRole","replaceIfExist","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","deleteProfile","profileFactory","getUser","profile","searchUsers","createUser","deleteUser","userFactory","./kuzzleProfile","./kuzzleUser",10,11,"setProfile"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index 3503bcd4c..7253db62a 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -234,10 +234,8 @@ KuzzleSecurity.prototype.getProfile = function (id, options, cb) { cb = options; options = null; } - else { - if (options.hydrate !== undefined) { - hydrate = options.hydrate; - } + else if (options.hydrate !== undefined) { + hydrate = options.hydrate; } data = {_id: id}; @@ -285,10 +283,8 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, options, cb) { cb = options; options = null; } - else { - if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } + else if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; } self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); @@ -429,10 +425,8 @@ KuzzleSecurity.prototype.getUser = function (id, options, cb) { cb = options; options = null; } - else { - if (options.hydrate !== undefined) { - hydrate = options.hydrate; - } + else if (options.hydrate !== undefined) { + hydrate = options.hydrate; } data = {_id: id}; @@ -478,10 +472,8 @@ KuzzleSecurity.prototype.searchUsers = function (filters, options, cb) { cb = options; options = null; } - else { - if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } + else if (options.hydrate !== undefined) { + filters.hydrate = options.hydrate; } self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb);