diff --git a/dist/kuzzle.js b/dist/kuzzle.js index c67341039..c039d167e 100644 --- a/dist/kuzzle.js +++ b/dist/kuzzle.js @@ -1,97 +1,4 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],2:[function(require,module,exports){ // uuid.js // // Copyright (c) 2010-2012 Robert Kieffer @@ -365,6 +272,127 @@ process.umask = function() { return 0; }; } })('undefined' !== typeof window ? window : null); +},{}],2:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +(function () { + try { + cachedSetTimeout = setTimeout; + } catch (e) { + cachedSetTimeout = function () { + throw new Error('setTimeout is not defined'); + } + } + try { + cachedClearTimeout = clearTimeout; + } catch (e) { + cachedClearTimeout = function () { + throw new Error('clearTimeout is not defined'); + } + } +} ()) +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = cachedSetTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + cachedClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + cachedSetTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + },{}],3:[function(require,module,exports){ (function (process){ var @@ -1812,7 +1840,7 @@ Kuzzle.prototype.stopQueuing = function () { }; }).call(this,require('_process')) -},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,"_process":1,"node-uuid":2,"socket.io-client":undefined}],4:[function(require,module,exports){ +},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,"_process":2,"node-uuid":1,"socket.io-client":undefined}],4:[function(require,module,exports){ var KuzzleDocument = require('./kuzzleDocument'), KuzzleDataMapping = require('./kuzzleDataMapping'), @@ -3498,10 +3526,9 @@ function isReady() { module.exports = KuzzleRoom; -},{"node-uuid":2}],9:[function(require,module,exports){ +},{"node-uuid":1}],9:[function(require,module,exports){ var - KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), - KuzzleRole = require('./kuzzleRole'); + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); function KuzzleProfile(kuzzleSecurity, id, content) { @@ -3518,17 +3545,6 @@ function KuzzleProfile(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, { @@ -3561,8 +3577,8 @@ KuzzleProfile.prototype.save = function (options, cb) { 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'); + if (!this.content.policies) { + throw new Error('Argument "policies" is mandatory in a profile. This argument contains an array of objects.'); } if (options && cb === undefined && typeof options === 'function') { @@ -3587,89 +3603,49 @@ 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 + * Add a policy in the policies list + * @param {Object} policy - must be an object containing at least a "roleId" member which must be a string. * * @returns {KuzzleProfile} this */ -KuzzleProfile.prototype.addRole = function (role) { +KuzzleProfile.prototype.addPolicy = function (policy) { - if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { - throw new Error('Parameter "roles" must be a KuzzleRole or a id string'); + if (typeof policy !== 'object' || typeof policy.roleId !== 'string') { + throw new Error('Parameter "policies" must be an object containing at least a "roleId" member which must be a string.'); } - if (!this.content.roles) { - this.content.roles = []; + if (!this.content.policies) { + this.content.policies = []; } - this.content.roles.push(role); + this.content.policies.push(policy); return this; }; /** - * Set roles list - * @param {Array} roles - can be an array of KuzzleRole or an array of string + * Set policies list + * @param {Array} policies - must be an array of objects containing at least a "roleId" member which must be a string * * @returns {KuzzleProfile} this */ -KuzzleProfile.prototype.setRoles = function (roles) { +KuzzleProfile.prototype.setPolicies = function (policies) { - if (!Array.isArray(roles)) { - throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + if (!Array.isArray(policies)) { + throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a 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'); + policies.map(function (policy) { + if (typeof policy !== 'object' || typeof policy.roleId !== 'string') { + throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string'); } }); - this.content.roles = roles; + this.content.policies = policies; 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 {object} [options] - Optional parameters - * @param {responseCallback} [cb] - Handles the query response - */ -KuzzleProfile.prototype.hydrate = function (options, 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; - } - }); - - 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}, options, function (error, response) { - if (error) { - return cb(error); - } - - cb(null, new KuzzleProfile(self, self.id, {roles: response.result.hits})); - }); -}; - /** * Serialize this object into a JSON object * @@ -3684,34 +3660,23 @@ 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) { - if (role instanceof KuzzleRole) { - return role.id; - } - - return role; - }); return data; }; /** - * Returns the list of roles associated to this profile. - * Each role element can be either a string or a KuzzleRole object + * Returns the list of policies associated to this profile. + * Each policy element is an array of objects containing at least a "roleId" member which must be a string * - * @return {object} an array of roles + * @return {object} an array of policies */ -KuzzleProfile.prototype.getRoles = function () { - return this.content.roles; +KuzzleProfile.prototype.getPolicies = function () { + return this.content.policies; }; module.exports = KuzzleProfile; -},{"./kuzzleRole":10,"./kuzzleSecurityDocument":12}],10:[function(require,module,exports){ +},{"./kuzzleSecurityDocument":12}],10:[function(require,module,exports){ var KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); function KuzzleRole(kuzzleSecurity, id, content) { @@ -4036,9 +4001,6 @@ 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 {object} [options] - (optional) arguments @@ -4047,21 +4009,18 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { KuzzleSecurity.prototype.getProfile = function (id, options, cb) { var data, - self = this, - hydrate = true; - - if (!id || typeof id !== 'string') { - throw new Error('Id parameter is mandatory for getProfile function'); - } + self = this; if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - hydrate = options.hydrate; + + if (!id || typeof id !== 'string') { + throw new Error('Id parameter is mandatory for getProfile function'); } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); @@ -4071,20 +4030,6 @@ KuzzleSecurity.prototype.getProfile = function (id, options, cb) { return cb(error); } - if (!hydrate) { - response.result._source.roles = response.result._source.roles.map(function (role) { - var formattedRole = {_id: role._id}; - if (role._source.restrictedTo !== undefined) { - formattedRole.restrictedTo = role._source.restrictedTo; - } - if (role._source.allowInternalIndex !== undefined) { - formattedRole.allowInternalIndex = role._source.allowInternalIndex; - } - - return formattedRole; - }); - } - cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); }; @@ -4092,10 +4037,6 @@ KuzzleSecurity.prototype.getProfile = function (id, options, 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. @@ -4109,15 +4050,10 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, options, cb) { var self = this; - filters.hydrate = true; - if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); @@ -4223,13 +4159,7 @@ KuzzleSecurity.prototype.updateProfile = function (id, content, options, cb) { } Object.keys(res.result._source).forEach(function (property) { - if (property !== 'roles') { - updatedContent[property] = res.result._source[property]; - } - }); - - updatedContent.roles = res.result._source.roles.map(function (role) { - return role._id; + updatedContent[property] = res.result._source[property]; }); cb(null, new KuzzleProfile(self, res.result._id, updatedContent)); @@ -4287,10 +4217,6 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { /** * 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 {object} [options] - (optional) arguments * @param {responseCallback} cb - returns Kuzzle's response @@ -4298,8 +4224,7 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { KuzzleSecurity.prototype.getUser = function (id, options, cb) { var data, - self = this, - hydrate = true; + self = this; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getUser function'); @@ -4309,9 +4234,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, cb) { cb = options; options = null; } - else if (options.hydrate !== undefined) { - hydrate = options.hydrate; - } data = {_id: id}; @@ -4322,10 +4244,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, 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)); }); }; @@ -4333,11 +4251,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, 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. @@ -4350,15 +4263,10 @@ KuzzleSecurity.prototype.searchUsers = function (filters, options, cb) { var self = this; - filters.hydrate = true; - if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); @@ -4572,8 +4480,9 @@ KuzzleSecurity.prototype.isActionAllowed = function(rights, controller, action, /** * Gets the rights array of a given user. * - * @param {string} userId The id of the user. - * @param {function} cb The callback containing the normalized array of rights. + * @param {string} userId The id of the user. + * @param {object} [options] - (optional) arguments + * @param {function} cb The callback containing the normalized array of rights. */ KuzzleSecurity.prototype.getUserRights = function (userId, options, cb) { var @@ -4581,7 +4490,7 @@ KuzzleSecurity.prototype.getUserRights = function (userId, options, cb) { self = this; if (!userId || typeof userId !== 'string') { - throw new Error('userId parameter is mandatory for isActionAllowed function'); + throw new Error('userId parameter is mandatory for getUserRights function'); } if (!cb && typeof options === 'function') { @@ -4744,18 +4653,12 @@ KuzzleSecurityDocument.prototype.update = function (content, options, cb) { module.exports = KuzzleSecurityDocument; },{}],13:[function(require,module,exports){ var - KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), - KuzzleProfile = require('./kuzzleProfile'); + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); 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) { - this.content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source); - } - // Define properties Object.defineProperties(this, { // private properties @@ -4772,7 +4675,7 @@ function KuzzleUser(kuzzleSecurity, id, content) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var whitelist = ['hydrate', 'save']; + var whitelist = ['save']; return passes && whitelist.indexOf(name) !== -1; } @@ -4787,54 +4690,39 @@ 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. + * Set profiles in content + * @param {array} profile - an array of profiles ids string * - * @param {object} [options] - Optional parameters - * @param {responseCallback} [cb] - Handles the query response + * @returns {KuzzleUser} this */ -KuzzleUser.prototype.hydrate = function (options, cb) { - var - self = this; - - if (options && cb === undefined && typeof options === 'function') { - cb = options; - options = null; +KuzzleUser.prototype.setProfiles = function (profilesIds) { + if (!Array.isArray(profilesIds) || typeof profilesIds[0] !== 'string') { + throw new Error('Parameter "profilesIds" must be an array of strings'); } - 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}, options, function (error, response) { - var hydratedUser; - - if (error) { - return cb(error); - } - - hydratedUser = new KuzzleUser(self.kuzzleSecurity, self.id, self.content); - hydratedUser.setProfile(new KuzzleProfile(self.kuzzleSecurity, response.result._id, response.result._source)); + this.content.profilesIds = profilesIds; - cb(null, hydratedUser); - }); + return this; }; /** - * Set profile in content - * @param {KuzzleProfile|string} profile - can be a KuzzleProfile or an id string + * Add a profile + * @param {string} profile - a profile ids string * * @returns {KuzzleUser} this */ -KuzzleUser.prototype.setProfile = function (profile) { +KuzzleUser.prototype.addProfile = function (profileId) { + if (typeof profileId !== 'string') { + throw new Error('Parameter "profileId" must be a string'); + } - if (typeof profile !== 'string' && !(profile instanceof KuzzleProfile)) { - throw new Error('Parameter "profile" must be a KuzzleProfile or a string'); + if (!this.content.profilesIds) { + this.content.profilesIds = []; } - this.content.profile = profile; + if (this.content.profilesIds.indexOf(profileId) === -1) { + this.content.profilesIds.push(profileId); + } return this; }; @@ -4888,22 +4776,18 @@ KuzzleUser.prototype.serialize = function () { data.body = this.content; - if (data.body.profile && data.body.profile.id) { - data.body.profile = data.body.profile.id; - } - return data; }; /** - * Return the associated profiles + * Return the associated profiles IDs * - * @return {object} either the associated profile ID or the KuzzleProfile instance + * @return {array} the associated profiles IDs */ KuzzleUser.prototype.getProfiles = function () { - return this.content.profile; + return this.content.profilesIds; }; module.exports = KuzzleUser; -},{"./kuzzleProfile":9,"./kuzzleSecurityDocument":12}]},{},[3]); +},{"./kuzzleSecurityDocument":12}]},{},[3]); diff --git a/dist/kuzzle.min.js b/dist/kuzzle.min.js index 5a390daa9..063102991 100644 --- a/dist/kuzzle.min.js +++ b/dist/kuzzle.min.js @@ -1,4 +1,4 @@ // Official Javascript SDK for Kuzzle v1.9.3 - License: Apache-2.0 -!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g1)for(var c=1;cb;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)},{}],3:[function(a,b,c){(function(c){function d(){var a=this,b=Date.now(),c=-1;a.queueTTL>0&&(a.offlineQueue.forEach(function(d,e){d.ts0&&a.offlineQueue.length>a.queueMaxSize&&a.offlineQueue.splice(0,a.offlineQueue.length-a.queueMaxSize).forEach(function(b){a.emitEvent("offlineQueuePop",b.query)})}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){"logout"!==a.action&&c.error&&"Token expired"===c.error.message&&(d.jwtToken=void 0,d.emitEvent("jwtTokenExpired",a,b)),b&&b(c.error,c)}),d.socket.emit("kuzzle",a),d.requestHistory[a.requestId]=c,Object.keys(d.requestHistory).forEach(function(a){d.requestHistory[a]0?(e.call(b,b.offlineQueue[0].query,b.offlineQueue[0].cb),b.emitEvent("offlineQueuePop",b.offlineQueue.shift()),setTimeout(function(){d()},Math.max(0,b.replayInterval))):b.queuing=!1};if(b.offlineQueueLoader){if("function"!=typeof b.offlineQueueLoader)throw new Error("Invalid value for offlineQueueLoader property. Expected: function. Got: "+typeof b.offlineQueueLoader);if(a=b.offlineQueueLoader(),!Array.isArray(a))throw new Error("Invalid value returned by the offlineQueueLoader function. Expected: array. Got: "+typeof a);b.offlineQueue=a.concat(b.offlineQueue).filter(function(a){if(!a.query||void 0===a.query.requestId||!a.query.action||!a.query.controller)throw new Error("Invalid offline queue request. One or more missing properties: requestId, action, controller.");return c.hasOwnProperty(a.query.requestId)?!1:c[a.query.requestId]=!0})}d()}function g(){var a=this;Object.keys(a.subscriptions).forEach(function(b){Object.keys(a.subscriptions[b]).forEach(function(c){var d=a.subscriptions[b][c];d.renew(d.callback)})})}var h=a("node-uuid"),i=a("./kuzzleDataCollection"),j=a("./security/kuzzleSecurity"),k=a("./kuzzleMemoryStorage"),l=a("./security/kuzzleUser");b.exports=Kuzzle=function(b,d,e){var f=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,d,e);if(e||"function"!=typeof d||(e=d,d=null),!b||""===b)throw new Error("URL argument missing");return Object.defineProperties(this,{collections:{value:{},writable:!0},connectCB:{value:e},eventListeners:{value:{connected:{lastEmitted:null,listeners:[]},error:{lastEmitted:null,listeners:[]},disconnected:{lastEmitted:null,listeners:[]},reconnected:{lastEmitted:null,listeners:[]},jwtTokenExpired:{lastEmitted:null,listeners:[]},loginAttempt:{lastEmitted:null,listeners:[]},offlineQueuePush:{listeners:[]},offlineQueuePop:{listeners:[]}}},eventTimeout:{value:200},io:{value:null,writable:!0},queuing:{value:!1,writable:!0},requestHistory:{value:{},writable:!0},socket:{value:null,writable:!0},state:{value:"initializing",writable:!0},subscriptions:{value:{pending:{}},writable:!0},autoReconnect:{value:d&&"boolean"==typeof d.autoReconnect?d.autoReconnect:!0,enumerable:!0},defaultIndex:{value:d&&"string"==typeof d.defaultIndex?d.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:d&&"number"==typeof d.reconnectionDelay?d.reconnectionDelay:1e3,enumerable:!0},url:{value:b,enumerable:!0},autoQueue:{value:!1,enumerable:!0,writable:!0},autoReplay:{value:!1,enumerable:!0,writable:!0},autoResubscribe:{value:!0,enumerable:!0,writable:!0},headers:{value:{},enumerable:!0,writable:!0},metadata:{value:{},enumerable:!0,writable:!0},offlineQueue:{value:[],enumerable:!0,writable:!0},queueFilter:{value:null,enumerable:!0,writable:!0},queueMaxSize:{value:500,enumerable:!0,writable:!0},queueTTL:{value:12e4,enumerable:!0,writable:!0},replayInterval:{value:10,enumerable:!0,writable:!0},jwtToken:{value:void 0,enumerable:!0,writable:!0},offlineQueueLoader:{value:null,enumerable:!0,writable:!0}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),d&&(Object.keys(d).forEach(function(a){f.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(f,a).writable&&(f[a]=d[a])}),"auto"===d.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===f.state)throw new Error("This Kuzzle object has been invalidated. Did you try to access it after a disconnect call?")}}),Object.defineProperty(this,"addHeaders",{value:function(a,b){return Object.keys(b).forEach(function(c){a[c]||(a[c]=b[c])}),a}}),Object.defineProperty(this,"callbackRequired",{value:function(a,b){if(!b||"function"!=typeof b)throw new Error(a+": a callback argument is required for read queries")}}),Object.defineProperty(this,"security",{value:new j(this),enumerable:!0}),Object.defineProperty(this,"emitEvent",{value:function(a){var b=Date.now(),d=Array.prototype.slice.call(arguments,1),e=this.eventListeners[a];return e.lastEmitted&&e.lastEmitted>=b-this.eventTimeout?!1:(e.listeners.forEach(function(a){c.nextTick(function(){a.fn.apply(void 0,d)})}),void(void 0!==e.lastEmitted&&(e.lastEmitted=b)))}}),Object.defineProperty(this,"memoryStorage",{value:new k(this),enumerable:!0}),d&&d.connect&&"auto"!==d.connect?this.state="ready":this.connect(),this.bluebird?this.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["getAllStatistics","getServerInfo","getStatistics","listCollections","listIndexes","login","logout","now","query","checkToken","whoAmI"];return d&&-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){var c=new Error('Unable to connect to kuzzle server at "'+a.url+'"');c.internal=b,a.state="error",a.emitEvent("error",c),a.connectCB&&a.connectCB(c)}),a.socket.on("disconnect",function(){a.state="offline",a.autoReconnect||a.disconnect(),a.autoQueue&&(a.queuing=!0),a.emitEvent("disconnected")}),a.socket.on("reconnect",function(){var b=function(){a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")};a.state="connected",a.jwtToken?a.checkToken(a.jwtToken,function(c,d){(c||!d.valid)&&(a.jwtToken=void 0,a.emitEvent("jwtTokenExpired")),b()}):b()}),this)},Kuzzle.prototype.setJwtToken=function(a){if("string"==typeof a)this.jwtToken=a;else{if("object"!=typeof a)return this.emitEvent("loginAttempt",{success:!1,error:"Invalid token argument: "+a}),this;if(!a.result||!a.result.jwt||"string"!=typeof a.result.jwt)return this.emitEvent("loginAttempt",{success:!1,error:"Cannot find a valid JWT token in the following object: "+JSON.stringify(a)}),this;this.jwtToken=a.result.jwt}return g.call(this),this.emitEvent("loginAttempt",{success:!0}),this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a){var b,c,d=this,e={strategy:a};return arguments[1]&&("object"==typeof arguments[1]?b=arguments[1]:"number"==typeof arguments[1]||"string"==typeof arguments[1]?e.expiresIn=arguments[1]:"function"==typeof arguments[1]&&(c=arguments[1])),arguments[2]&&("number"==typeof arguments[2]||"string"==typeof arguments[2]?e.expiresIn=arguments[2]:"function"==typeof arguments[2]&&(c=arguments[2])),arguments[3]&&"function"==typeof arguments[3]&&(c=arguments[3]),"object"==typeof b&&Object.keys(b).forEach(function(a){e[a]=b[a]}),this.query({controller:"auth",action:"login"},{body:e},{queuable:!1},function(a,b){a?(c&&"function"==typeof c&&c(a),d.emitEvent("loginAttempt",{success:!1,error:a.message})):(b.result.jwt&&d.setJwtToken(b.result.jwt),c&&"function"==typeof c&&c(null,b.result))}),d},Kuzzle.prototype.logout=function(a){var b=this,c={action:"logout",controller:"auth",requestId:h.v4(),body:{}};return this.query({controller:"auth",action:"logout"},c,{queuable:!1},function(c){null===c?(b.jwtToken=void 0,"function"==typeof a&&a(null,b)):"function"==typeof a&&a(c)}),b},Kuzzle.prototype.checkToken=function(a,b){var c=this,d={body:{token:a}};return this.callbackRequired("Kuzzle.checkToken",b),this.query({controller:"auth",action:"checkToken"},d,{queuable:!1},function(a,c){return a?b(a):void b(null,c.result)}),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return b.callbackRequired("Kuzzle.whoAmI",a),b.query({controller:"auth",action:"getCurrentUser"},{},{},function(c,d){return c?a(c):void a(null,new l(b.security,d.result._id,d.result._source))}),b},Kuzzle.prototype.getMyRights=function(a,b){var c=this;b||"function"!=typeof a||(b=a,a=null),c.callbackRequired("Kuzzle.getMyRights",b),c.query({controller:"auth",action:"getMyRights"},{},null,function(a,c){return a?b(a):void b(null,c.result.hits)})},Kuzzle.prototype.updateSelf=function(a,b,c){var d=this,e={},f={controller:"auth",action:"updateSelf"};c||"function"!=typeof b||(c=b,b=null),e.body=a,c?d.query(f,e,b,function(a,b){return a?c(a):void c(null,b.result)}):d.query(f,e,b)},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),-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(),!b){if(!this.defaultIndex)throw new Error("Unable to create a new data collection object: no index specified");b=this.defaultIndex}if("string"!=typeof b)throw new Error('Invalid "index" argument: string expected, got '+typeof b);if("string"!=typeof a)throw new Error('Invalid "collection" argument: string expected, got '+typeof a);return this.collections[b]||(this.collections[b]={}),this.collections[b][a]||(this.collections[b][a]=new i(this,b,a)),this.collections[b][a]},Kuzzle.prototype.flushQueue=function(){return this.offlineQueue=[],this},Kuzzle.prototype.listCollections=function(){var a,b,c,d="all",e=Array.prototype.slice.call(arguments);if(e.forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.listCollections: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.listCollections",c),b&&b.type&&(d=b.type),this.query({index:a,controller:"read",action:"listCollections"},{body:{type:d}},b,function(a,b){return a?c(a):c(null,b.result.collections)}),this},Kuzzle.prototype.listIndexes=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.listIndexes",b),this.query({controller:"read",action:"listIndexes"},{},a,function(a,c){return a?b(a):b(null,c.result.indexes)}),this},Kuzzle.prototype.disconnect=function(){var a;this.logout(),this.state="disconnected",this.socket.close(),this.socket=null;for(a in this.collections)this.collections.hasOwnProperty(a)&&delete this.collections[a]},Kuzzle.prototype.getServerInfo=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getServerInfo",b),this.query({controller:"read",action:"serverInfo"},{},a,function(a,c){return a?b(a):void b(null,c.result.serverInfo)}),this},Kuzzle.prototype.refreshIndex=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.refreshIndex: index required");a=this.defaultIndex}return this.query({index:a,controller:"admin",action:"refreshIndex"},{},b,c),this},Kuzzle.prototype.getAutoRefresh=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.getAutoRefresh: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.getAutoRefresh",c),this.query({index:a,controller:"admin",action:"getAutoRefresh"},{},b,c),this},Kuzzle.prototype.setAutoRefresh=function(){var a,b,c,d;if(Array.prototype.slice.call(arguments).forEach(function(e){switch(typeof e){case"string":a=e;break;case"boolean":b=e;break;case"object":c=e;break;case"function":d=e}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.setAutoRefresh: index required");a=this.defaultIndex}if(void 0===b)throw new Error("Kuzzle.setAutoRefresh: autoRefresh value is required");return this.query({index:a,controller:"admin",action:"setAutoRefresh"},{body:{autoRefresh:b}},c,d),this},Kuzzle.prototype.now=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.now",b),this.query({controller:"read",action:"now"},{},a,function(a,c){return a?b(a):void b(null,c.result.now)}),this},Kuzzle.prototype.query=function(a,b,c,f){var g,i={action:a.action,controller:a.controller,metadata:this.metadata},j=this;if(this.isValid(),f||"function"!=typeof c||(f=c,c=null),c&&(c.metadata&&Object.keys(c.metadata).forEach(function(a){i.metadata[a]=c.metadata[a]}),c.queuable===!1&&"offline"===j.state))return j;b.metadata&&Object.keys(b.metadata).forEach(function(a){i.metadata[a]=b.metadata[a]});for(g in b)"metadata"!==g&&b.hasOwnProperty(g)&&(i[g]=b[g]);return i=j.addHeaders(i,this.headers),void 0===j.jwtToken||"auth"===i.controller&&"checkToken"===i.action||(i.headers=i.headers||{},i.headers.authorization="Bearer "+j.jwtToken),a.collection&&(i.collection=a.collection),a.index&&(i.index=a.index),i.requestId||(i.requestId=h.v4()),"connected"===j.state||c&&c.queuable===!1?"connected"===j.state?e.call(this,i,f):f&&f(new Error("Unable to execute request: not connected to a Kuzzle server.\nDiscarded request: "+JSON.stringify(i))):(j.queuing||-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.emitEvent("offlineQueuePush",{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}}).call(this,a("_process"))},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,_process:1,"node-uuid":2,"socket.io-client":void 0}],4:[function(a,b,c){function d(a,b,c){if(!b||!c)throw new Error("The KuzzleDataCollection object constructor needs an index and a collection arguments");return Object.defineProperties(this,{collection:{value:c,enumerable:!0},index:{value:b,enumerable:!0},kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),Object.defineProperty(this,"buildQueryArgs",{value:function(a,b){return{controller:a,action:b,collection:this.collection,index:this.index}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["publishMessage","setHeaders","subscribe"];return d&&-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.serialize():g.body=b,c&&(h=c.updateIfExist?"createOrReplace":"create"),a&&(g._id=a),g=f.kuzzle.addHeaders(g,f.headers),d?f.kuzzle.query(this.buildQueryArgs("write",h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write",h),g,c),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};"string"==typeof a?(e._id=a,d="delete"):(e.body=a,d="deleteByQuery"),c||"function"!=typeof b||(c=b,b=null),e=this.kuzzle.addHeaders(e,this.headers),c?this.kuzzle.query(this.buildQueryArgs("write",d),e,b,function(a,b){return a?c(a):void("delete"===d?c(null,[b.result._id]):c(null,b.result.ids))}):this.kuzzle.query(this.buildQueryArgs("write",d),e,b)},d.prototype.fetchDocument=function(a,b,c){var d={_id:a},f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.fetch",c),d=f.kuzzle.addHeaders(d,this.headers),f.kuzzle.query(this.buildQueryArgs("read","get"),d,b,function(a,b){var d;return a?c(a):(d=new e(f,b.result._id,b.result._source),d.version=b.result._version,void c(null,d))}),this},d.prototype.fetchAllDocuments=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),a&&(a.from&&(c.from=a.from),a.size&&(c.size=a.size)),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch(c,a,b),this},d.prototype.getMapping=function(a,b){var c;return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.getMapping",b),c=new f(this),c.refresh(a,b),this},d.prototype.publishMessage=function(a,b,c){var d={};return a instanceof e?d=a.serialize():d.body=a,d=this.kuzzle.addHeaders(d,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),d,b,c),this},d.prototype.replaceDocument=function(a,b,c,d){var f=this,g={_id:a,body:b};return d||"function"!=typeof c||(d=c,c=null),g=f.kuzzle.addHeaders(g,this.headers),d?f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c),this},d.prototype.subscribe=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.subscribe",c),d=new g(this,b),d.renew(a,c)},d.prototype.truncate=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("admin","truncateCollection"),c,a,b),this},d.prototype.updateDocument=function(a,b,c,d){var f={_id:a,body:b},g=this;return d||"function"!=typeof c||(d=c,c=null),f=g.kuzzle.addHeaders(f,this.headers),d?g.kuzzle.query(this.buildQueryArgs("write","update"),f,c,function(a,b){var c;return a?d(a):(c=new e(g,b.result._id),void c.refresh(d))}):g.kuzzle.query(this.buildQueryArgs("write","update"),f,c),g},d.prototype.documentFactory=function(a,b){return new e(this,a,b)},d.prototype.roomFactory=function(a){return new g(this,a)},d.prototype.dataMappingFactory=function(a){return new f(this,a)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"./kuzzleDataMapping":5,"./kuzzleDocument":6,"./kuzzleRoom":8}],5:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},mapping:{value:b||{},enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["set","setHeaders"];return d&&-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 0===c.mapping&&(c.mapping={}),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},{}],6:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{collection:{value:a.collection,enumerable:!0},dataCollection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},id:{value:void 0,enumerable:!0,writable:!0},content:{value:{},writable:!0,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},version:{value:void 0,enumerable:!0,writable:!0}}),!c&&b&&"object"==typeof b&&(c=b,b=null),c&&(c._version&&(this.version=c._version,delete c._version),this.setContent(c,!0)),b&&Object.defineProperty(this,"id",{value:b,enumerable:!0}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","refresh","save"];return d&&-1!==e.indexOf(a)}}):this}d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a._version=this.version,a=this.kuzzle.addHeaders(a,this.headers)},d.prototype.toString=function(){return JSON.stringify(this.serialize())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a,function(a){return a?b(a):void b(null,c.id)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a)},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");this.kuzzle.callbackRequired("KuzzleDocument.refresh",b),c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,e){var f;return a?b(a):(f=new d(c.dataCollection,c.id,e.result._source),f.version=e.result._version,void b(null,f))})},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?b?b(a):!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.serialize();return this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this},d.prototype.setContent=function(a,b){var c=this;return b?this.content=a:Object.keys(a).forEach(function(b){c.content[b]=a[b]}),this},d.prototype.subscribe=function(a,b){var c;if(a&&!b&&"function"==typeof a&&(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDocument.subscribe",b),!this.id)throw new Error("KuzzleDocument.subscribe: cannot subscribe to a document if no ID has been provided");return c={ids:{values:[this.id]}},this.dataCollection.subscribe(c,a,b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],7:[function(a,b,c){function d(a){return Object.defineProperties(this,{kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),this.setHeaders=a.setHeaders.bind(this),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["setHeaders"];return d&&-1===e.indexOf(a)}}):this}!function(){var a=["id","value"],b=["id","keys"],c={append:a,bgrewriteaof:[],bgsave:[],bitcount:["id","start","end"],bitop:["operation","destkey",b],bitpos:["id","bit",{__opts__:["start","end"]}],blpop:[b,"timeout"],brpoplpush:["source","destination"],dbsize:[],decrby:a,del:[b],discard:[],exec:[],exists:[b],expire:["id","seconds"],expireat:["id","timestamp"],flushdb:[],getbit:["id","offset"],getrange:["id","start","end"],hdel:["id",["field","fields"]],hexists:["id","field"],hincrby:["id","field","value"],hmset:["id","values"],hset:["id","field","value"],info:["section"],keys:["pattern"],lastsave:[],lindex:["id","idx"],linsert:["id","position","pivot","value"],lpush:["id",["value","values"]],lrange:["id","start","stop"],lrem:["id","count","value"],lset:["id","idx","value"],ltrim:["id","start","stop"],mset:["values"],multi:[],object:["subcommand","args"],pexpire:["id","milliseconds"],pexpireat:["id","timestamp"],pfadd:["id",["element","elements"]],pfmerge:["destkey",["sourcekey","sourcekeys"]],ping:[],psetex:["id","milliseconds","value"],publish:["channel","message"],randomkey:[],rename:["id","newkey"],renamenx:["id","newkey"],restore:["id","ttl","content"],rpoplpush:["source","destination"],sadd:["id",["member","members"]],save:[],set:["id","value",{__opts__:["ex","px","nx","xx"]}],sdiffstore:["destination",b],setbit:["id","offset","value"],setex:["id","seconds","value"],setrange:["id","offset","value"],sinterstore:["destination",b],sismember:["id","member"],smove:["id","destination","member"],sort:["id",{__opts__:["by","offset","count","get","direction","alpha","store"]}],spop:["id","count"],srem:["id",["member","members"]], -sunionstore:["destination",b],unwatch:[],wait:["numslaves","timeout"],zadd:["id",{__opts__:["nx","xx","ch","incr","score","member","members"]}],zcount:["id","min","max"],zincrby:["id","value","member"],zinterstore:["destination",b,{__opts__:["weight","weights","aggregate"]}],zlexcount:["id","min","max"],zrange:["id","start","stop",{__opts__:["withscores"]}],zrangebylex:["id","min","max",{__opts__:["offset","count"]}],zrangebyscore:["id","min","max",{__opts__:["withscores","offset","count"]}],zrem:["id","member"],zremrangebylex:["id","min","max"],zremrangebyscore:["id","min","max"],zrevrangebylex:["id","max","min",{__opts__:["offset","count"]}],zrevrangebyscore:["id","max","min",{__opts__:["withscores","offset","count"]}],zrevrank:["id","member"]};c.decr=c.get=c.dump=c.hgetall=c.hkeys=c.hlen=c.hstrlen=c.hvals=c.incr=c.llen=c.lpop=c.persist=c.pttl=c.rpop=c.scard=c.smembers=c.strlen=c.ttl=c.type=c.zcard=["id"],c.getset=c.lpushx=a,c.del=c.exists=c.mget=c.pfcount=c.sdiff=c.sinter=c.sunion=c.watch=[b],c.incrby=c.incrbyfloat=c.decrby,c.brpop=c.blpop,c.hget=c.hexists,c.hmget=c.hdel,c.hsetnx=c.hset,c.msetnx=c.mset,c.rpush=c.lpush,c.hincrbyfloat=c.hincrby,c.srandmember=c.spop,c.zrevrange=c.zrange,c.zscore=c.zrevrank,Object.keys(c).forEach(function(a){d.prototype[a]=function(){var b,d=Array.prototype.slice.call(arguments),e=null,f={controller:"ms",action:a},g={};return"function"==typeof d[d.length-1]&&(b=d.pop()),d.length&&"object"==typeof d[d.length-1]&&1===Object.keys(d[d.length-1]).length&&void 0!==d[d.length-1].queuable&&(e=d.pop()),c[a].forEach(function(a,b){void 0!==d[b]&&(Array.isArray(a)&&(a=Array.isArray(d[b])?a[1]:a[0]),"id"===a?g._id=d[b]:(g.body||(g.body={}),"object"==typeof a&&void 0!==a.__opts__?a.__opts__.forEach(function(a){void 0!==d[b][a]&&(g.body[a]=d[b][a])}):g.body[a]=d[b]))}),this.kuzzle.query(f,g,e,b),this}})}(),b.exports=d},{}],8:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:h.v4()},lastRenewal:{value:null,writable:!0},notifier:{value:null,writable:!0},queue:{value:[],writable:!0},renewalDelay:{value:500},scope:{value:b&&b.scope?b.scope:"all"},state:{value:b&&b.state?b.state:"done"},subscribing:{value:!1,writable:!0},users:{value:b&&b.users?b.users:"none"},collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},filters:{value:null,enumerable:!0,writable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},metadata:{value:b&&b.metadata?b.metadata:{},enumerable:!0,writable:!0},roomId:{value:null,enumerable:!0,writable:!0},subscribeToSelf:{value:b&&"boolean"==typeof b.subscribeToSelf?b.subscribeToSelf:!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)}function g(){return"connected"!==this.kuzzle.state||this.subscribing?!1:!0}var h=a("node-uuid");d.prototype.count=function(a){var b;if(this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),!g.call(this))return this.queue.push({action:"count",args:[a]}),this;if(!this.roomId)throw new Error("KuzzleRoom.count: cannot count subscriptions on an inactive room");return this.kuzzle.query(this.collection.buildQueryArgs("subscribe","count"),b,function(b,c){return b?a(b):void a(null,c.result.count)}),this},d.prototype.renew=function(a,b){var c=Date.now(),d={scope:this.scope,state:this.state,users:this.users},g=this;return!b&&a&&"function"==typeof a&&(b=a,a=null),g.kuzzle.callbackRequired("KuzzleRoom.renew",b),g.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(a&&(g.filters=a),"connected"!==g.kuzzle.state?(g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,g):g.subscribing?(g.queue.push({action:"renew",args:[a,b]}),g):(g.unsubscribe(),g.roomId=null,g.subscribing=!0,g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,d.body=g.filters,d=g.kuzzle.addHeaders(d,this.headers),g.kuzzle.query(g.collection.buildQueryArgs("subscribe","on"),d,{metadata:g.metadata},function(a,b){if(delete g.kuzzle.subscriptions.pending[g.id],g.subscribing=!1,a)throw g.queue=[],new Error("Error during Kuzzle subscription: "+a.message);g.lastRenewal=c,g.roomId=b.result.roomId,g.channel=b.result.channel,g.kuzzle.subscriptions[g.roomId]||(g.kuzzle.subscriptions[g.roomId]={}),g.kuzzle.subscriptions[g.roomId][g.id]=g,g.notifier=e.bind(g),g.kuzzle.socket.on(g.channel,g.notifier),f.call(g)}),g))},d.prototype.unsubscribe=function(){var a,b=this,c=b.roomId;return g.call(this)?(c&&(b.kuzzle.socket.off(b.channel,this.notifier),1===Object.keys(b.kuzzle.subscriptions[c]).length?(delete b.kuzzle.subscriptions[c],0===Object.keys(b.kuzzle.subscriptions.pending).length?b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}):a=setInterval(function(){0===Object.keys(b.kuzzle.subscriptions.pending).length&&(b.kuzzle.subscriptions[c]||b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}),clearInterval(a))},100)):delete b.kuzzle.subscriptions[c][b.id],b.roomId=null),b):(b.queue.push({action:"unsubscribe",args:[]}),b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":2}],9:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"},updateActionName:{value:"updateProfile"}}),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,c.id,{roles:e.result.hits}))})},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},d.prototype.getRoles=function(){return this.content.roles},b.exports=d},{"./kuzzleRole":10,"./kuzzleSecurityDocument":12}],10:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"},updateActionName:{value:"updateRole"}}),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":12}],11:[function(a,b,c){function d(a){return Object.defineProperty(this,"kuzzle",{value:a}),Object.defineProperty(this,"buildQueryArgs",{value:function(a){return{controller:"security",action:a}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["roleFactory","profileFactory","userFactory","isActionAllowed"];return d&&-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.updateRole=function(a,b,c,d){var f=this,g={},h="updateRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateRole: cannot update a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(c){return c?d(c):void d(null,new e(f,a,b))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteRole=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this,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){var b={_id:a._id};return void 0!==a._source.restrictedTo&&(b.restrictedTo=a._source.restrictedTo),void 0!==a._source.allowInternalIndex&&(b.allowInternalIndex=a._source.allowInternalIndex),b})),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.updateProfile=function(a,b,c,d){var e=this,g={},h="updateProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateProfile: cannot update a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c={};return a?d(a):(Object.keys(b.result._source).forEach(function(a){"roles"!==a&&(c[a]=b.result._source[a])}),c.roles=b.result._source.roles.map(function(a){return a._id}),void d(null,new f(e,b.result._id,c)))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteProfile=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b,c){var d,e=this,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.updateUser=function(a,b,c,d){var e=this,f={},h="updateUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateUser: cannot update an user without an user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),f,c,function(a,b){return a?d(a):void d(null,new g(e,b.result._id,b.result._source))}):e.kuzzle.query(this.buildQueryArgs(h),f,c)},d.prototype.deleteUser=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},d.prototype.isActionAllowed=function(a,b,c,d,e){var f;if(!a||"object"!=typeof a)throw new Error("rights parameter is mandatory for isActionAllowed function");if(!b||"string"!=typeof b)throw new Error("controller parameter is mandatory for isActionAllowed function");if(!c||"string"!=typeof c)throw new Error("action parameter is mandatory for isActionAllowed function");return f=a.filter(function(a){return a.controller===b||"*"===a.controller}).filter(function(a){return a.action===c||"*"===a.action}).filter(function(a){return a.index===d||"*"===a.index}).filter(function(a){return a.collection===e||"*"===a.collection}),f.some(function(a){return"allowed"===a.value})?"allowed":f.some(function(a){return"conditional"===a.value})?"conditional":"denied"},d.prototype.getUserRights=function(a,b,c){var d={_id:a},e=this;if(!a||"string"!=typeof a)throw new Error("userId parameter is mandatory for isActionAllowed function");c||"function"!=typeof b||(c=b,b=null),e.kuzzle.callbackRequired("Kuzzle.getUserRights",c),this.kuzzle.query(this.buildQueryArgs("getUserRights"),d,b,function(a,b){return a?c(a):void c(null,b.result.hits)})},b.exports=d},{"./kuzzleProfile":9,"./kuzzleRole":10,"./kuzzleUser":13}],12:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");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,!0),a.kuzzle.bluebird?a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","update"];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))})},d.prototype.update=function(a,b,c){var d={},e=this;if("object"!=typeof a)throw new Error('Parameter "content" must be a object');b&&void 0===c&&"function"==typeof b&&(c=b,b=null),d._id=e.id,d.body=a,e.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.updateActionName),d,b,function(a,b){return a?c?c(a):!1:(e.setContent(b.result._source),void(c&&c(null,e)))})},b.exports=d},{}],13:[function(a,b,c){function d(a,b,c){return e.call(this,a,b,c),c.profile&&c.profile._id&&c.profile._source&&(this.content.profile=new f(a,c.profile._id,c.profile._source)),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"},updateActionName:{value:"updateUser"}}),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){var g;return a?b(a):(g=new d(c.kuzzleSecurity,c.id,c.content),g.setProfile(new f(c.kuzzleSecurity,e.result._id,e.result._source)),void b(null,g))})},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},d.prototype.getProfiles=function(){return this.content.profile},b.exports=d},{"./kuzzleProfile":9,"./kuzzleSecurityDocument":12}]},{},[3]); +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>>((3&b)<<3)&255;return e},"undefined"!=typeof console&&console.warn&&console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()")}}function e(){if("function"==typeof a)try{var b=a("crypto").randomBytes;l=j=b&&function(){return b(16)},j()}catch(c){}}function f(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=q[a])});e<16;)b[d+e++]=0;return b}function g(a,b){var c=b||0,d=p;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function h(a,b,c){var d=b&&c||0,e=b||[];a=a||{};var f=null!=a.clockseq?a.clockseq:u,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:w+1,j=h-v+(i-w)/1e4;if(j<0&&null==a.clockseq&&(f=f+1&16383),(j<0||h>v)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=h,w=i,u=f,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;e[d++]=k>>>24&255,e[d++]=k>>>16&255,e[d++]=k>>>8&255,e[d++]=255&k;var l=h/4294967296*1e4&268435455;e[d++]=l>>>8&255,e[d++]=255&l,e[d++]=l>>>24&15|16,e[d++]=l>>>16&255,e[d++]=f>>>8|128,e[d++]=255&f;for(var m=a.node||t,n=0;n<6;n++)e[d+n]=m[n];return b?b:g(e)}function i(a,b,c){var d=b&&c||0;"string"==typeof a&&(b="binary"===a?new o(16):null,a=null),a=a||{};var e=a.random||(a.rng||j)();if(e[6]=15&e[6]|64,e[8]=63&e[8]|128,b)for(var f=0;f<16;f++)b[d+f]=e[f];return b||g(e)}var j,k,l,m,n;c?d():e();for(var o="function"==typeof Buffer?Buffer:Array,p=[],q={},r=0;r<256;r++)p[r]=(r+256).toString(16).substr(1),q[p[r]]=r;var s=j(),t=[1|s[0],s[1],s[2],s[3],s[4],s[5]],u=16383&(s[6]<<8|s[7]),v=0,w=0,x=i;x.v1=h,x.v4=i,x.parse=f,x.unparse=g,x.BufferClass=o,x._rng=j,x._mathRNG=k,x._nodeRNG=l,x._whatwgRNG=m,"undefined"!=typeof b&&b.exports?b.exports=x:"function"==typeof define&&define.amd?define(function(){return x}):(n=c.uuid,x.noConflict=function(){return c.uuid=n,x},c.uuid=x)}("undefined"!=typeof window?window:null)},{}],2:[function(a,b,c){function d(){m&&k&&(m=!1,k.length?l=k.concat(l):n=-1,l.length&&e())}function e(){if(!m){var a=h(d);m=!0;for(var b=l.length;b;){for(k=l,l=[];++n1)for(var c=1;c0&&(a.offlineQueue.forEach(function(d,e){d.ts0&&a.offlineQueue.length>a.queueMaxSize&&a.offlineQueue.splice(0,a.offlineQueue.length-a.queueMaxSize).forEach(function(b){a.emitEvent("offlineQueuePop",b.query)})}function e(a,b){var c=Date.now(),d=this;(void 0!==d.jwtToken||b)&&d.socket.once(a.requestId,function(c){"logout"!==a.action&&c.error&&"Token expired"===c.error.message&&(d.jwtToken=void 0,d.emitEvent("jwtTokenExpired",a,b)),b&&b(c.error,c)}),d.socket.emit("kuzzle",a),d.requestHistory[a.requestId]=c,Object.keys(d.requestHistory).forEach(function(a){d.requestHistory[a]0?(e.call(b,b.offlineQueue[0].query,b.offlineQueue[0].cb),b.emitEvent("offlineQueuePop",b.offlineQueue.shift()),setTimeout(function(){d()},Math.max(0,b.replayInterval))):b.queuing=!1};if(b.offlineQueueLoader){if("function"!=typeof b.offlineQueueLoader)throw new Error("Invalid value for offlineQueueLoader property. Expected: function. Got: "+typeof b.offlineQueueLoader);if(a=b.offlineQueueLoader(),!Array.isArray(a))throw new Error("Invalid value returned by the offlineQueueLoader function. Expected: array. Got: "+typeof a);b.offlineQueue=a.concat(b.offlineQueue).filter(function(a){if(!a.query||void 0===a.query.requestId||!a.query.action||!a.query.controller)throw new Error("Invalid offline queue request. One or more missing properties: requestId, action, controller.");return!c.hasOwnProperty(a.query.requestId)&&(c[a.query.requestId]=!0)})}d()}function g(){var a=this;Object.keys(a.subscriptions).forEach(function(b){Object.keys(a.subscriptions[b]).forEach(function(c){var d=a.subscriptions[b][c];d.renew(d.callback)})})}var h=a("node-uuid"),i=a("./kuzzleDataCollection"),j=a("./security/kuzzleSecurity"),k=a("./kuzzleMemoryStorage"),l=a("./security/kuzzleUser");b.exports=Kuzzle=function(b,d,e){var f=this;if(!(this instanceof Kuzzle))return new Kuzzle(b,d,e);if(e||"function"!=typeof d||(e=d,d=null),!b||""===b)throw new Error("URL argument missing");return Object.defineProperties(this,{collections:{value:{},writable:!0},connectCB:{value:e},eventListeners:{value:{connected:{lastEmitted:null,listeners:[]},error:{lastEmitted:null,listeners:[]},disconnected:{lastEmitted:null,listeners:[]},reconnected:{lastEmitted:null,listeners:[]},jwtTokenExpired:{lastEmitted:null,listeners:[]},loginAttempt:{lastEmitted:null,listeners:[]},offlineQueuePush:{listeners:[]},offlineQueuePop:{listeners:[]}}},eventTimeout:{value:200},io:{value:null,writable:!0},queuing:{value:!1,writable:!0},requestHistory:{value:{},writable:!0},socket:{value:null,writable:!0},state:{value:"initializing",writable:!0},subscriptions:{value:{pending:{}},writable:!0},autoReconnect:{value:!d||"boolean"!=typeof d.autoReconnect||d.autoReconnect,enumerable:!0},defaultIndex:{value:d&&"string"==typeof d.defaultIndex?d.defaultIndex:void 0,writable:!0,enumerable:!0},reconnectionDelay:{value:d&&"number"==typeof d.reconnectionDelay?d.reconnectionDelay:1e3,enumerable:!0},url:{value:b,enumerable:!0},autoQueue:{value:!1,enumerable:!0,writable:!0},autoReplay:{value:!1,enumerable:!0,writable:!0},autoResubscribe:{value:!0,enumerable:!0,writable:!0},headers:{value:{},enumerable:!0,writable:!0},metadata:{value:{},enumerable:!0,writable:!0},offlineQueue:{value:[],enumerable:!0,writable:!0},queueFilter:{value:null,enumerable:!0,writable:!0},queueMaxSize:{value:500,enumerable:!0,writable:!0},queueTTL:{value:12e4,enumerable:!0,writable:!0},replayInterval:{value:10,enumerable:!0,writable:!0},jwtToken:{value:void 0,enumerable:!0,writable:!0},offlineQueueLoader:{value:null,enumerable:!0,writable:!0}}),"undefined"!=typeof window&&window.io?this.io=window.io:this.io=a("socket.io-client"),d&&(Object.keys(d).forEach(function(a){f.hasOwnProperty(a)&&Object.getOwnPropertyDescriptor(f,a).writable&&(f[a]=d[a])}),"auto"===d.offlineMode&&this.autoReconnect&&(this.autoQueue=this.autoReplay=this.autoResubscribe=!0)),Object.defineProperty(this,"isValid",{value:function(){if("disconnected"===f.state)throw new Error("This Kuzzle object has been invalidated. Did you try to access it after a disconnect call?")}}),Object.defineProperty(this,"addHeaders",{value:function(a,b){return Object.keys(b).forEach(function(c){a[c]||(a[c]=b[c])}),a}}),Object.defineProperty(this,"callbackRequired",{value:function(a,b){if(!b||"function"!=typeof b)throw new Error(a+": a callback argument is required for read queries")}}),Object.defineProperty(this,"security",{value:new j(this),enumerable:!0}),Object.defineProperty(this,"emitEvent",{value:function(a){var b=Date.now(),d=Array.prototype.slice.call(arguments,1),e=this.eventListeners[a];return!(e.lastEmitted&&e.lastEmitted>=b-this.eventTimeout)&&(e.listeners.forEach(function(a){c.nextTick(function(){a.fn.apply(void 0,d)})}),void(void 0!==e.lastEmitted&&(e.lastEmitted=b)))}}),Object.defineProperty(this,"memoryStorage",{value:new k(this),enumerable:!0}),d&&d.connect&&"auto"!==d.connect?this.state="ready":this.connect(),this.bluebird?this.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["getAllStatistics","getServerInfo","getStatistics","listCollections","listIndexes","login","logout","now","query","checkToken","whoAmI"];return d&&e.indexOf(a)!==-1}}):void 0},Kuzzle.prototype.connect=function(){var a=this;return["initializing","ready","disconnected","error","offline"].indexOf(this.state)===-1?(a.connectCB&&a.connectCB(null,a),a):(a.state="connecting",a.socket=a.io(a.url,{reconnection:a.autoReconnect,reconnectionDelay:a.reconnectionDelay,forceNew:!0}),a.socket.once("connect",function(){a.state="connected",g.call(a),f.call(a),a.emitEvent("connected"),a.connectCB&&a.connectCB(null,a)}),a.socket.on("connect_error",function(b){var c=new Error('Unable to connect to kuzzle server at "'+a.url+'"');c.internal=b,a.state="error",a.emitEvent("error",c),a.connectCB&&a.connectCB(c)}),a.socket.on("disconnect",function(){a.state="offline",a.autoReconnect||a.disconnect(),a.autoQueue&&(a.queuing=!0),a.emitEvent("disconnected")}),a.socket.on("reconnect",function(){var b=function(){a.autoResubscribe&&g.call(a),a.autoReplay&&(d.call(a),f.call(a)),a.emitEvent("reconnected")};a.state="connected",a.jwtToken?a.checkToken(a.jwtToken,function(c,d){!c&&d.valid||(a.jwtToken=void 0,a.emitEvent("jwtTokenExpired")),b()}):b()}),this)},Kuzzle.prototype.setJwtToken=function(a){if("string"==typeof a)this.jwtToken=a;else{if("object"!=typeof a)return this.emitEvent("loginAttempt",{success:!1,error:"Invalid token argument: "+a}),this;if(!a.result||!a.result.jwt||"string"!=typeof a.result.jwt)return this.emitEvent("loginAttempt",{success:!1,error:"Cannot find a valid JWT token in the following object: "+JSON.stringify(a)}),this;this.jwtToken=a.result.jwt}return g.call(this),this.emitEvent("loginAttempt",{success:!0}),this},Kuzzle.prototype.getJwtToken=function(){return this.jwtToken},Kuzzle.prototype.login=function(a){var b,c,d=this,e={strategy:a};return arguments[1]&&("object"==typeof arguments[1]?b=arguments[1]:"number"==typeof arguments[1]||"string"==typeof arguments[1]?e.expiresIn=arguments[1]:"function"==typeof arguments[1]&&(c=arguments[1])),arguments[2]&&("number"==typeof arguments[2]||"string"==typeof arguments[2]?e.expiresIn=arguments[2]:"function"==typeof arguments[2]&&(c=arguments[2])),arguments[3]&&"function"==typeof arguments[3]&&(c=arguments[3]),"object"==typeof b&&Object.keys(b).forEach(function(a){e[a]=b[a]}),this.query({controller:"auth",action:"login"},{body:e},{queuable:!1},function(a,b){a?(c&&"function"==typeof c&&c(a),d.emitEvent("loginAttempt",{success:!1,error:a.message})):(b.result.jwt&&d.setJwtToken(b.result.jwt),c&&"function"==typeof c&&c(null,b.result))}),d},Kuzzle.prototype.logout=function(a){var b=this,c={action:"logout",controller:"auth",requestId:h.v4(),body:{}};return this.query({controller:"auth",action:"logout"},c,{queuable:!1},function(c){null===c?(b.jwtToken=void 0,"function"==typeof a&&a(null,b)):"function"==typeof a&&a(c)}),b},Kuzzle.prototype.checkToken=function(a,b){var c=this,d={body:{token:a}};return this.callbackRequired("Kuzzle.checkToken",b),this.query({controller:"auth",action:"checkToken"},d,{queuable:!1},function(a,c){return a?b(a):void b(null,c.result)}),c},Kuzzle.prototype.whoAmI=function(a){var b=this;return b.callbackRequired("Kuzzle.whoAmI",a),b.query({controller:"auth",action:"getCurrentUser"},{},{},function(c,d){return c?a(c):void a(null,new l(b.security,d.result._id,d.result._source))}),b},Kuzzle.prototype.getMyRights=function(a,b){var c=this;b||"function"!=typeof a||(b=a,a=null),c.callbackRequired("Kuzzle.getMyRights",b),c.query({controller:"auth",action:"getMyRights"},{},null,function(a,c){return a?b(a):void b(null,c.result.hits)})},Kuzzle.prototype.updateSelf=function(a,b,c){var d=this,e={},f={controller:"auth",action:"updateSelf"};c||"function"!=typeof b||(c=b,b=null),e.body=a,c?d.query(f,e,b,function(a,b){return a?c(a):void c(null,b.result)}):d.query(f,e,b)},Kuzzle.prototype.addListener=function(a,b){var c,d=Object.keys(this.eventListeners),e=typeof b;if(this.isValid(),d.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+d.toString());if("function"!==e)throw new Error("Invalid listener type: expected a function, got a "+e);return c=h.v1(),this.eventListeners[a].listeners.push({id:c,fn:b}),c},Kuzzle.prototype.getAllStatistics=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getAllStatistics",b),this.query({controller:"admin",action:"getAllStats"},{},a,function(a,c){return a?b(a):void b(null,c.result.hits)}),this},Kuzzle.prototype.getStatistics=function(a,b,c){var d;return c||(1===arguments.length?(c=arguments[0],b=null,a=null):(c=arguments[1],"object"==typeof arguments[0]?(b=arguments[0],a=null):(a=arguments[0],b=null))),d=function(b,d){return b?c(b):void(a?c(null,d.result.hits):c(null,[d.result]))},this.callbackRequired("Kuzzle.getStatistics",c),a?this.query({controller:"admin",action:"getStats"},{body:{startTime:a}},b,d):this.query({controller:"admin",action:"getLastStats"},{},b,d),this},Kuzzle.prototype.dataCollectionFactory=function(a,b){if(this.isValid(),!b){if(!this.defaultIndex)throw new Error("Unable to create a new data collection object: no index specified");b=this.defaultIndex}if("string"!=typeof b)throw new Error('Invalid "index" argument: string expected, got '+typeof b);if("string"!=typeof a)throw new Error('Invalid "collection" argument: string expected, got '+typeof a);return this.collections[b]||(this.collections[b]={}),this.collections[b][a]||(this.collections[b][a]=new i(this,b,a)),this.collections[b][a]},Kuzzle.prototype.flushQueue=function(){return this.offlineQueue=[],this},Kuzzle.prototype.listCollections=function(){var a,b,c,d="all",e=Array.prototype.slice.call(arguments);if(e.forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.listCollections: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.listCollections",c),b&&b.type&&(d=b.type),this.query({index:a,controller:"read",action:"listCollections"},{body:{type:d}},b,function(a,b){return a?c(a):c(null,b.result.collections)}),this},Kuzzle.prototype.listIndexes=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.listIndexes",b),this.query({controller:"read",action:"listIndexes"},{},a,function(a,c){return a?b(a):b(null,c.result.indexes)}),this},Kuzzle.prototype.disconnect=function(){var a;this.logout(),this.state="disconnected",this.socket.close(),this.socket=null;for(a in this.collections)this.collections.hasOwnProperty(a)&&delete this.collections[a]},Kuzzle.prototype.getServerInfo=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.getServerInfo",b),this.query({controller:"read",action:"serverInfo"},{},a,function(a,c){return a?b(a):void b(null,c.result.serverInfo)}),this},Kuzzle.prototype.refreshIndex=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.refreshIndex: index required");a=this.defaultIndex}return this.query({index:a,controller:"admin",action:"refreshIndex"},{},b,c),this},Kuzzle.prototype.getAutoRefresh=function(){var a,b,c;if(Array.prototype.slice.call(arguments).forEach(function(d){switch(typeof d){case"string":a=d;break;case"object":b=d;break;case"function":c=d}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.getAutoRefresh: index required");a=this.defaultIndex}return this.callbackRequired("Kuzzle.getAutoRefresh",c),this.query({index:a,controller:"admin",action:"getAutoRefresh"},{},b,c),this},Kuzzle.prototype.setAutoRefresh=function(){var a,b,c,d;if(Array.prototype.slice.call(arguments).forEach(function(e){switch(typeof e){case"string":a=e;break;case"boolean":b=e;break;case"object":c=e;break;case"function":d=e}}),!a){if(!this.defaultIndex)throw new Error("Kuzzle.setAutoRefresh: index required");a=this.defaultIndex}if(void 0===b)throw new Error("Kuzzle.setAutoRefresh: autoRefresh value is required");return this.query({index:a,controller:"admin",action:"setAutoRefresh"},{body:{autoRefresh:b}},c,d),this},Kuzzle.prototype.now=function(a,b){return b||"function"!=typeof a||(b=a,a=null),this.callbackRequired("Kuzzle.now",b),this.query({controller:"read",action:"now"},{},a,function(a,c){return a?b(a):void b(null,c.result.now)}),this},Kuzzle.prototype.query=function(a,b,c,f){var g,i={action:a.action,controller:a.controller,metadata:this.metadata},j=this;if(this.isValid(),f||"function"!=typeof c||(f=c,c=null),c&&(c.metadata&&Object.keys(c.metadata).forEach(function(a){i.metadata[a]=c.metadata[a]}),c.queuable===!1&&"offline"===j.state))return j;b.metadata&&Object.keys(b.metadata).forEach(function(a){i.metadata[a]=b.metadata[a]});for(g in b)"metadata"!==g&&b.hasOwnProperty(g)&&(i[g]=b[g]);return i=j.addHeaders(i,this.headers),void 0===j.jwtToken||"auth"===i.controller&&"checkToken"===i.action||(i.headers=i.headers||{},i.headers.authorization="Bearer "+j.jwtToken),a.collection&&(i.collection=a.collection),a.index&&(i.index=a.index),i.requestId||(i.requestId=h.v4()),"connected"===j.state||c&&c.queuable===!1?"connected"===j.state?e.call(this,i,f):f&&f(new Error("Unable to execute request: not connected to a Kuzzle server.\nDiscarded request: "+JSON.stringify(i))):(j.queuing||["initializing","connecting"].indexOf(j.state)!==-1)&&(d.call(this,i,f),j.queueFilter&&!j.queueFilter(i)||(j.offlineQueue.push({ts:Date.now(),query:i,cb:f}),j.emitEvent("offlineQueuePush",{query:i,cb:f}))),j},Kuzzle.prototype.removeAllListeners=function(a){var b=Object.keys(this.eventListeners),c=this;if(a){if(b.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+b.toString());this.eventListeners[a].listeners=[]}else b.forEach(function(a){c.eventListeners[a].listeners=[]})},Kuzzle.prototype.removeListener=function(a,b){var c=Object.keys(this.eventListeners),d=this;if(c.indexOf(a)===-1)throw new Error("["+a+"] is not a known event. Known events: "+c.toString());this.eventListeners[a].listeners.forEach(function(c,e){c.id===b&&d.eventListeners[a].listeners.splice(e,1)})},Kuzzle.prototype.replayQueue=function(){return"offline"===this.state||this.autoReplay||(d.call(this),f.call(this)),this},Kuzzle.prototype.setDefaultIndex=function(a){if("string"!=typeof a)throw new Error("Invalid default index: ["+a+"] (an index name is expected)");if(0===a.length)throw new Error("Cannot set an empty index as the default index");return this.defaultIndex=a,this},Kuzzle.prototype.setHeaders=function(a,b){var c=this;if("object"!=typeof a||Array.isArray(a))throw new Error("Expected a content object, received a "+typeof a);return b?c.headers=a:Object.keys(a).forEach(function(b){c.headers[b]=a[b]}),c},Kuzzle.prototype.startQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!0),this},Kuzzle.prototype.stopQueuing=function(){return"offline"!==this.state||this.autoQueue||(this.queuing=!1),this}}).call(this,a("_process"))},{"./kuzzleDataCollection":4,"./kuzzleMemoryStorage":7,"./security/kuzzleSecurity":11,"./security/kuzzleUser":13,_process:2,"node-uuid":1,"socket.io-client":void 0}],4:[function(a,b,c){function d(a,b,c){if(!b||!c)throw new Error("The KuzzleDataCollection object constructor needs an index and a collection arguments");return Object.defineProperties(this,{collection:{value:c,enumerable:!0},index:{value:b,enumerable:!0},kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),Object.defineProperty(this,"buildQueryArgs",{value:function(a,b){return{controller:a,action:b,collection:this.collection,index:this.index}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["publishMessage","setHeaders","subscribe"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleDocument"),f=a("./kuzzleDataMapping"),g=a("./kuzzleRoom");d.prototype.advancedSearch=function(a,b,c){var d,f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.advancedSearch",c),d=f.kuzzle.addHeaders({body:a},this.headers),f.kuzzle.query(this.buildQueryArgs("read","search"),d,b,function(a,b){var d=[];return a?c(a):(b.result.hits.forEach(function(a){var b=new e(f,a._id,a._source);b.version=a._version,d.push(b)}),void c(null,{total:b.result.total,documents:d}))}),this},d.prototype.count=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.count",c),d=this.kuzzle.addHeaders({body:a},this.headers),this.kuzzle.query(this.buildQueryArgs("read","count"),d,b,function(a,b){return a?c(a):void c(null,b.result.count)}),this},d.prototype.create=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("write","createCollection"),c,a,b),this},d.prototype.createDocument=function(a,b,c,d){var f=this,g={},h="create";return a&&"string"!=typeof a&&(d=c,c=b,b=a,a=null),d||"function"!=typeof c||(d=c,c=null),b instanceof e?g=b.serialize():g.body=b,c&&(h=c.updateIfExist?"createOrReplace":"create"),a&&(g._id=a),g=f.kuzzle.addHeaders(g,f.headers),d?f.kuzzle.query(this.buildQueryArgs("write",h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write",h),g,c),this},d.prototype.deleteDocument=function(a,b,c){var d,e={};"string"==typeof a?(e._id=a,d="delete"):(e.body=a,d="deleteByQuery"),c||"function"!=typeof b||(c=b,b=null),e=this.kuzzle.addHeaders(e,this.headers),c?this.kuzzle.query(this.buildQueryArgs("write",d),e,b,function(a,b){return a?c(a):void("delete"===d?c(null,[b.result._id]):c(null,b.result.ids))}):this.kuzzle.query(this.buildQueryArgs("write",d),e,b)},d.prototype.fetchDocument=function(a,b,c){var d={_id:a},f=this;return c||"function"!=typeof b||(c=b,b=null),f.kuzzle.callbackRequired("KuzzleDataCollection.fetch",c),d=f.kuzzle.addHeaders(d,this.headers),f.kuzzle.query(this.buildQueryArgs("read","get"),d,b,function(a,b){var d;return a?c(a):(d=new e(f,b.result._id,b.result._source),d.version=b.result._version,void c(null,d))}),this},d.prototype.fetchAllDocuments=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),a&&(a.from&&(c.from=a.from),a.size&&(c.size=a.size)),this.kuzzle.callbackRequired("KuzzleDataCollection.fetchAll",b),this.advancedSearch(c,a,b),this},d.prototype.getMapping=function(a,b){var c;return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDataCollection.getMapping",b),c=new f(this),c.refresh(a,b),this},d.prototype.publishMessage=function(a,b,c){var d={};return a instanceof e?d=a.serialize():d.body=a,d=this.kuzzle.addHeaders(d,this.headers),this.kuzzle.query(this.buildQueryArgs("write","publish"),d,b,c),this},d.prototype.replaceDocument=function(a,b,c,d){var f=this,g={_id:a,body:b};return d||"function"!=typeof c||(d=c,c=null),g=f.kuzzle.addHeaders(g,this.headers),d?f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),c.version=b.result._version,void d(null,c))}):f.kuzzle.query(this.buildQueryArgs("write","createOrReplace"),g,c),this},d.prototype.subscribe=function(a,b,c){var d;return c||"function"!=typeof b||(c=b,b=null),this.kuzzle.callbackRequired("KuzzleDataCollection.subscribe",c),d=new g(this,b),d.renew(a,c)},d.prototype.truncate=function(a,b){var c={};return b||"function"!=typeof a||(b=a,a=null),c=this.kuzzle.addHeaders(c,this.headers),this.kuzzle.query(this.buildQueryArgs("admin","truncateCollection"),c,a,b),this},d.prototype.updateDocument=function(a,b,c,d){var f={_id:a,body:b},g=this;return d||"function"!=typeof c||(d=c,c=null),f=g.kuzzle.addHeaders(f,this.headers),d?g.kuzzle.query(this.buildQueryArgs("write","update"),f,c,function(a,b){var c;return a?d(a):(c=new e(g,b.result._id),void c.refresh(d))}):g.kuzzle.query(this.buildQueryArgs("write","update"),f,c),g},d.prototype.documentFactory=function(a,b){return new e(this,a,b)},d.prototype.roomFactory=function(a){return new g(this,a)},d.prototype.dataMappingFactory=function(a){return new f(this,a)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"./kuzzleDataMapping":5,"./kuzzleDocument":6,"./kuzzleRoom":8}],5:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},mapping:{value:b||{},enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["set","setHeaders"];return d&&e.indexOf(a)===-1}}):this}d.prototype.apply=function(a,b){var c=this,d=this.kuzzle.addHeaders({body:{properties:this.mapping}},this.headers);return b||"function"!=typeof a||(b=a,a=null),c.kuzzle.query(this.collection.buildQueryArgs("admin","updateMapping"),d,a,function(d){return d?!!b&&b(d):void c.refresh(a,b)}),this},d.prototype.refresh=function(a,b){var c=this,d=this.kuzzle.addHeaders({},this.headers);return b||"function"!=typeof a||(b=a,a=null),this.kuzzle.query(this.collection.buildQueryArgs("admin","getMapping"),d,a,function(a,d){return a?!!b&&b(a):d.result[c.collection.index]?d.result[c.collection.index].mappings[c.collection.collection]?(c.mapping=d.result[c.collection.index].mappings[c.collection.collection].properties,void 0===c.mapping&&(c.mapping={}),void(b&&b(null,c))):!!b&&b(new Error("No mapping found for collection "+c.collection.collection)):!!b&&b(new Error("No mapping found for index "+c.collection.index))}),this},d.prototype.set=function(a,b){return this.mapping[a]=b,this},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],6:[function(a,b,c){function d(a,b,c){return Object.defineProperties(this,{collection:{value:a.collection,enumerable:!0},dataCollection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},id:{value:void 0,enumerable:!0,writable:!0},content:{value:{},writable:!0,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},version:{value:void 0,enumerable:!0,writable:!0}}),!c&&b&&"object"==typeof b&&(c=b,b=null),c&&(c._version&&(this.version=c._version,delete c._version),this.setContent(c,!0)),b&&Object.defineProperty(this,"id",{value:b,enumerable:!0}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","refresh","save"];return d&&e.indexOf(a)!==-1}}):this}d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a._version=this.version,a=this.kuzzle.addHeaders(a,this.headers)},d.prototype.toString=function(){return JSON.stringify(this.serialize())},d.prototype["delete"]=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.delete: cannot delete a document without a document ID");b?this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a,function(a){return a?b(a):void b(null,c.id)}):this.kuzzle.query(this.dataCollection.buildQueryArgs("write","delete"),this.serialize(),a)},d.prototype.refresh=function(a,b){var c=this;if(b||"function"!=typeof a||(b=a,a=null),!c.id)throw new Error("KuzzleDocument.refresh: cannot retrieve a document if no ID has been provided");this.kuzzle.callbackRequired("KuzzleDocument.refresh",b),c.kuzzle.query(c.dataCollection.buildQueryArgs("read","get"),{_id:c.id},a,function(a,e){var f;return a?b(a):(f=new d(c.dataCollection,c.id,e.result._source),f.version=e.result._version,void b(null,f))})},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.dataCollection.buildQueryArgs("write","createOrReplace"),c,a,function(a,c){return a?!!b&&b(a):(d.id=c.result._id,d.version=c.result._version,void(b&&b(null,d)))}),d},d.prototype.publish=function(a){var b=this.serialize();return this.kuzzle.query(this.dataCollection.buildQueryArgs("write","publish"),b,a),this},d.prototype.setContent=function(a,b){var c=this;return b?this.content=a:Object.keys(a).forEach(function(b){c.content[b]=a[b]}),this},d.prototype.subscribe=function(a,b){var c;if(a&&!b&&"function"==typeof a&&(b=a,a=null),this.kuzzle.callbackRequired("KuzzleDocument.subscribe",b),!this.id)throw new Error("KuzzleDocument.subscribe: cannot subscribe to a document if no ID has been provided");return c={ids:{values:[this.id]}},this.dataCollection.subscribe(c,a,b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{}],7:[function(a,b,c){function d(a){return Object.defineProperties(this,{kuzzle:{value:a,enumerable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0}}),this.setHeaders=a.setHeaders.bind(this),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["setHeaders"];return d&&e.indexOf(a)===-1}}):this}!function(){var a=["id","value"],b=["id","keys"],c={append:a,bgrewriteaof:[],bgsave:[],bitcount:["id","start","end"],bitop:["operation","destkey",b],bitpos:["id","bit",{__opts__:["start","end"]}],blpop:[b,"timeout"],brpoplpush:["source","destination"],dbsize:[],decrby:a,del:[b],discard:[],exec:[],exists:[b],expire:["id","seconds"],expireat:["id","timestamp"],flushdb:[],getbit:["id","offset"],getrange:["id","start","end"],hdel:["id",["field","fields"]],hexists:["id","field"],hincrby:["id","field","value"],hmset:["id","values"],hset:["id","field","value"],info:["section"],keys:["pattern"],lastsave:[],lindex:["id","idx"],linsert:["id","position","pivot","value"],lpush:["id",["value","values"]],lrange:["id","start","stop"],lrem:["id","count","value"],lset:["id","idx","value"],ltrim:["id","start","stop"],mset:["values"],multi:[],object:["subcommand","args"],pexpire:["id","milliseconds"],pexpireat:["id","timestamp"],pfadd:["id",["element","elements"]],pfmerge:["destkey",["sourcekey","sourcekeys"]],ping:[],psetex:["id","milliseconds","value"],publish:["channel","message"],randomkey:[],rename:["id","newkey"],renamenx:["id","newkey"],restore:["id","ttl","content"],rpoplpush:["source","destination"],sadd:["id",["member","members"]],save:[],set:["id","value",{__opts__:["ex","px","nx","xx"]}],sdiffstore:["destination",b],setbit:["id","offset","value"],setex:["id","seconds","value"],setrange:["id","offset","value"],sinterstore:["destination",b],sismember:["id","member"], +smove:["id","destination","member"],sort:["id",{__opts__:["by","offset","count","get","direction","alpha","store"]}],spop:["id","count"],srem:["id",["member","members"]],sunionstore:["destination",b],unwatch:[],wait:["numslaves","timeout"],zadd:["id",{__opts__:["nx","xx","ch","incr","score","member","members"]}],zcount:["id","min","max"],zincrby:["id","value","member"],zinterstore:["destination",b,{__opts__:["weight","weights","aggregate"]}],zlexcount:["id","min","max"],zrange:["id","start","stop",{__opts__:["withscores"]}],zrangebylex:["id","min","max",{__opts__:["offset","count"]}],zrangebyscore:["id","min","max",{__opts__:["withscores","offset","count"]}],zrem:["id","member"],zremrangebylex:["id","min","max"],zremrangebyscore:["id","min","max"],zrevrangebylex:["id","max","min",{__opts__:["offset","count"]}],zrevrangebyscore:["id","max","min",{__opts__:["withscores","offset","count"]}],zrevrank:["id","member"]};c.decr=c.get=c.dump=c.hgetall=c.hkeys=c.hlen=c.hstrlen=c.hvals=c.incr=c.llen=c.lpop=c.persist=c.pttl=c.rpop=c.scard=c.smembers=c.strlen=c.ttl=c.type=c.zcard=["id"],c.getset=c.lpushx=a,c.del=c.exists=c.mget=c.pfcount=c.sdiff=c.sinter=c.sunion=c.watch=[b],c.incrby=c.incrbyfloat=c.decrby,c.brpop=c.blpop,c.hget=c.hexists,c.hmget=c.hdel,c.hsetnx=c.hset,c.msetnx=c.mset,c.rpush=c.lpush,c.hincrbyfloat=c.hincrby,c.srandmember=c.spop,c.zrevrange=c.zrange,c.zscore=c.zrevrank,Object.keys(c).forEach(function(a){d.prototype[a]=function(){var b,d=Array.prototype.slice.call(arguments),e=null,f={controller:"ms",action:a},g={};return"function"==typeof d[d.length-1]&&(b=d.pop()),d.length&&"object"==typeof d[d.length-1]&&1===Object.keys(d[d.length-1]).length&&void 0!==d[d.length-1].queuable&&(e=d.pop()),c[a].forEach(function(a,b){void 0!==d[b]&&(Array.isArray(a)&&(a=Array.isArray(d[b])?a[1]:a[0]),"id"===a?g._id=d[b]:(g.body||(g.body={}),"object"==typeof a&&void 0!==a.__opts__?a.__opts__.forEach(function(a){void 0!==d[b][a]&&(g.body[a]=d[b][a])}):g.body[a]=d[b]))}),this.kuzzle.query(f,g,e,b),this}})}(),b.exports=d},{}],8:[function(a,b,c){function d(a,b){return Object.defineProperties(this,{callback:{value:null,writable:!0},channel:{value:null,writable:!0},id:{value:h.v4()},lastRenewal:{value:null,writable:!0},notifier:{value:null,writable:!0},queue:{value:[],writable:!0},renewalDelay:{value:500},scope:{value:b&&b.scope?b.scope:"all"},state:{value:b&&b.state?b.state:"done"},subscribing:{value:!1,writable:!0},users:{value:b&&b.users?b.users:"none"},collection:{value:a,enumerable:!0},kuzzle:{value:a.kuzzle,enumerable:!0},filters:{value:null,enumerable:!0,writable:!0},headers:{value:JSON.parse(JSON.stringify(a.headers)),enumerable:!0,writable:!0},metadata:{value:b&&b.metadata?b.metadata:{},enumerable:!0,writable:!0},roomId:{value:null,enumerable:!0,writable:!0},subscribeToSelf:{value:!b||"boolean"!=typeof b.subscribeToSelf||b.subscribeToSelf,enumerable:!0,writable:!0}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["count"];return d&&e.indexOf(a)!==-1}}):this}function e(a){return a.error?this.callback(a.error):"jwtTokenExpired"===a.action?(this.kuzzle.jwtToken=void 0,this.kuzzle.emitEvent("jwtTokenExpired")):void(this.kuzzle.requestHistory[a.requestId]?(this.subscribeToSelf&&this.callback(null,a),delete this.kuzzle.requestHistory[a.requestId]):this.callback(null,a))}function f(){for(var a;this.queue.length>0;)a=this.queue.shift(),this[a.action].apply(this,a.args)}function g(){return"connected"===this.kuzzle.state&&!this.subscribing}var h=a("node-uuid");d.prototype.count=function(a){var b;if(this.kuzzle.callbackRequired("KuzzleRoom.count",a),b=this.kuzzle.addHeaders({body:{roomId:this.roomId}},this.headers),!g.call(this))return this.queue.push({action:"count",args:[a]}),this;if(!this.roomId)throw new Error("KuzzleRoom.count: cannot count subscriptions on an inactive room");return this.kuzzle.query(this.collection.buildQueryArgs("subscribe","count"),b,function(b,c){return b?a(b):void a(null,c.result.count)}),this},d.prototype.renew=function(a,b){var c=Date.now(),d={scope:this.scope,state:this.state,users:this.users},g=this;return!b&&a&&"function"==typeof a&&(b=a,a=null),g.kuzzle.callbackRequired("KuzzleRoom.renew",b),g.lastRenewal&&c-g.lastRenewal<=g.renewalDelay?g:(a&&(g.filters=a),"connected"!==g.kuzzle.state?(g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,g):g.subscribing?(g.queue.push({action:"renew",args:[a,b]}),g):(g.unsubscribe(),g.roomId=null,g.subscribing=!0,g.callback=b,g.kuzzle.subscriptions.pending[g.id]=g,d.body=g.filters,d=g.kuzzle.addHeaders(d,this.headers),g.kuzzle.query(g.collection.buildQueryArgs("subscribe","on"),d,{metadata:g.metadata},function(a,b){if(delete g.kuzzle.subscriptions.pending[g.id],g.subscribing=!1,a)throw g.queue=[],new Error("Error during Kuzzle subscription: "+a.message);g.lastRenewal=c,g.roomId=b.result.roomId,g.channel=b.result.channel,g.kuzzle.subscriptions[g.roomId]||(g.kuzzle.subscriptions[g.roomId]={}),g.kuzzle.subscriptions[g.roomId][g.id]=g,g.notifier=e.bind(g),g.kuzzle.socket.on(g.channel,g.notifier),f.call(g)}),g))},d.prototype.unsubscribe=function(){var a,b=this,c=b.roomId;return g.call(this)?(c&&(b.kuzzle.socket.off(b.channel,this.notifier),1===Object.keys(b.kuzzle.subscriptions[c]).length?(delete b.kuzzle.subscriptions[c],0===Object.keys(b.kuzzle.subscriptions.pending).length?b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}):a=setInterval(function(){0===Object.keys(b.kuzzle.subscriptions.pending).length&&(b.kuzzle.subscriptions[c]||b.kuzzle.query(b.collection.buildQueryArgs("subscribe","off"),{body:{roomId:c}}),clearInterval(a))},100)):delete b.kuzzle.subscriptions[c][b.id],b.roomId=null),b):(b.queue.push({action:"unsubscribe",args:[]}),b)},d.prototype.setHeaders=function(a,b){return this.kuzzle.setHeaders.call(this,a,b),this},b.exports=d},{"node-uuid":1}],9:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteProfile"},updateActionName:{value:"updateProfile"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["hydrate","save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c,d=this;if(!this.content.policies)throw new Error('Argument "policies" is mandatory in a profile. This argument contains an array of objects.');return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c=this.serialize(),d.kuzzle.query(d.kuzzleSecurity.buildQueryArgs("createOrReplaceProfile"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.addPolicy=function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an object containing at least a "roleId" member which must be a string.');return this.content.policies||(this.content.policies=[]),this.content.policies.push(a),this},d.prototype.setPolicies=function(a){if(!Array.isArray(a))throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string');return a.map(function(a){if("object"!=typeof a||"string"!=typeof a.roleId)throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string')}),this.content.policies=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getPolicies=function(){return this.content.policies},b.exports=d},{"./kuzzleSecurityDocument":12}],10:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteRole"},updateActionName:{value:"updateRole"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.save=function(a,b){var c=this.serialize(),d=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceRole"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))})},b.exports=d},{"./kuzzleSecurityDocument":12}],11:[function(a,b,c){function d(a){return Object.defineProperty(this,"kuzzle",{value:a}),Object.defineProperty(this,"buildQueryArgs",{value:function(a){return{controller:"security",action:a}}}),this.kuzzle.bluebird?this.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["roleFactory","profileFactory","userFactory","isActionAllowed"];return d&&e.indexOf(a)===-1}}):this}var e=a("./kuzzleRole"),f=a("./kuzzleProfile"),g=a("./kuzzleUser");d.prototype.getRole=function(a,b,c){var d,f=this;if(!a)throw new Error("Id parameter is mandatory for getRole function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},f.kuzzle.callbackRequired("KuzzleSecurity.getRole",c),f.kuzzle.query(this.buildQueryArgs("getRole"),d,b,function(a,b){return a?c(a):void c(null,new e(f,b.result._id,b.result._source))})},d.prototype.searchRoles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchRoles",c),d.kuzzle.query(this.buildQueryArgs("searchRoles"),{body:a},b,function(a,b){var f;return a?c(a):(f=b.result.hits.map(function(a){return new e(d,a._id,a._source)}),void c(null,{total:b.result.total,roles:f}))})},d.prototype.createRole=function(a,b,c,d){var f=this,g={},h="createRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createRole: cannot create a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceRole":"createRole"),d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new e(f,b.result._id,b.result._source),void d(null,c))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateRole=function(a,b,c,d){var f=this,g={},h="updateRole";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateRole: cannot update a role without a role ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?f.kuzzle.query(this.buildQueryArgs(h),g,c,function(c){return c?d(c):void d(null,new e(f,a,b))}):f.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteRole=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteRole"),d,b)},d.prototype.roleFactory=function(a,b){return new e(this,a,b)},d.prototype.getProfile=function(a,b,c){var d,e=this;if(c||"function"!=typeof b||(c=b,b=null),!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getProfile function");d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getProfile",c),e.kuzzle.query(this.buildQueryArgs("getProfile"),d,b,function(a,b){return a?c(a):void c(null,new f(e,b.result._id,b.result._source))})},d.prototype.searchProfiles=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchProfiles",c),d.kuzzle.query(this.buildQueryArgs("searchProfiles"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new f(d,a._id,a._source)}),void c(null,{total:b.result.total,profiles:e}))})},d.prototype.createProfile=function(a,b,c,d){var e=this,g={},h="createProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createProfile: cannot create a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,c&&(h=c.replaceIfExist?"createOrReplaceProfile":"createProfile"),d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c;return a?d(a):(c=new f(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.updateProfile=function(a,b,c,d){var e=this,g={},h="updateProfile";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateProfile: cannot update a profile without a profile ID");d||"function"!=typeof c||(d=c,c=null),g._id=a,g.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),g,c,function(a,b){var c={};return a?d(a):(Object.keys(b.result._source).forEach(function(a){c[a]=b.result._source[a]}),void d(null,new f(e,b.result._id,c)))}):e.kuzzle.query(this.buildQueryArgs(h),g)},d.prototype.deleteProfile=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteProfile"),d,b)},d.prototype.profileFactory=function(a,b){return new f(this,a,b)},d.prototype.getUser=function(a,b,c){var d,e=this;if(!a||"string"!=typeof a)throw new Error("Id parameter is mandatory for getUser function");c||"function"!=typeof b||(c=b,b=null),d={_id:a},e.kuzzle.callbackRequired("KuzzleSecurity.getUser",c),e.kuzzle.query(this.buildQueryArgs("getUser"),d,b,function(a,b){return a?c(a):void c(null,new g(e,b.result._id,b.result._source))})},d.prototype.searchUsers=function(a,b,c){var d=this;c||"function"!=typeof b||(c=b,b=null),d.kuzzle.callbackRequired("KuzzleSecurity.searchUsers",c),d.kuzzle.query(this.buildQueryArgs("searchUsers"),{body:a},b,function(a,b){var e;return a?c(a):(e=b.result.hits.map(function(a){return new g(d,a._id,a._source)}),void c(null,{total:b.result.total,users:e}))})},d.prototype.createUser=function(a,b,c,d){var e=this,f={},h="createUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.createUser: cannot create a user without a user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,c&&(h=c.replaceIfExist?"createOrReplaceUser":"createUser"),d?e.kuzzle.query(this.buildQueryArgs(h),f,null,function(a,b){var c;return a?d(a):(c=new g(e,b.result._id,b.result._source),void d(null,c))}):e.kuzzle.query(this.buildQueryArgs(h),f)},d.prototype.updateUser=function(a,b,c,d){var e=this,f={},h="updateUser";if(!a||"string"!=typeof a)throw new Error("KuzzleSecurity.updateUser: cannot update an user without an user ID");d||"function"!=typeof c||(d=c,c=null),f._id=a,f.body=b,d?e.kuzzle.query(this.buildQueryArgs(h),f,c,function(a,b){return a?d(a):void d(null,new g(e,b.result._id,b.result._source))}):e.kuzzle.query(this.buildQueryArgs(h),f,c)},d.prototype.deleteUser=function(a,b,c){var d={_id:a};c||"function"!=typeof b||(c=b,b=null),c?this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b,function(a,b){return a?c(a):void c(null,b.result._id)}):this.kuzzle.query(this.buildQueryArgs("deleteUser"),d,b)},d.prototype.userFactory=function(a,b){return new g(this,a,b)},d.prototype.isActionAllowed=function(a,b,c,d,e){var f;if(!a||"object"!=typeof a)throw new Error("rights parameter is mandatory for isActionAllowed function");if(!b||"string"!=typeof b)throw new Error("controller parameter is mandatory for isActionAllowed function");if(!c||"string"!=typeof c)throw new Error("action parameter is mandatory for isActionAllowed function");return f=a.filter(function(a){return a.controller===b||"*"===a.controller}).filter(function(a){return a.action===c||"*"===a.action}).filter(function(a){return a.index===d||"*"===a.index}).filter(function(a){return a.collection===e||"*"===a.collection}),f.some(function(a){return"allowed"===a.value})?"allowed":f.some(function(a){return"conditional"===a.value})?"conditional":"denied"},d.prototype.getUserRights=function(a,b,c){var d={_id:a},e=this;if(!a||"string"!=typeof a)throw new Error("userId parameter is mandatory for getUserRights function");c||"function"!=typeof b||(c=b,b=null),e.kuzzle.callbackRequired("Kuzzle.getUserRights",c),this.kuzzle.query(this.buildQueryArgs("getUserRights"),d,b,function(a,b){return a?c(a):void c(null,b.result.hits)})},b.exports=d},{"./kuzzleProfile":9,"./kuzzleRole":10,"./kuzzleUser":13}],12:[function(a,b,c){function d(a,b,c){if(!b)throw new Error("A security document must have an id");if(Object.defineProperties(this,{kuzzle:{value:a.kuzzle},kuzzleSecurity:{value:a},id:{value:b,enumerable:!0},content:{value:{},writable:!0,enumerable:!0}}),c&&this.setContent(c,!0),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["delete","update"];return d&&e.indexOf(a)!==-1}})}d.prototype.setContent=function(a){return this.content=a,this},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype["delete"]=function(a,b){var c=this;a&&void 0===b&&"function"==typeof a&&(b=a,a=null),c.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.deleteActionName),{_id:this.id},a,function(a,c){return a?!!b&&b(a):void(b&&b(null,c.result._id))})},d.prototype.update=function(a,b,c){var d={},e=this;if("object"!=typeof a)throw new Error('Parameter "content" must be a object');b&&void 0===c&&"function"==typeof b&&(c=b,b=null),d._id=e.id,d.body=a,e.kuzzle.query(this.kuzzleSecurity.buildQueryArgs(this.updateActionName),d,b,function(a,b){return a?!!c&&c(a):(e.setContent(b.result._source),void(c&&c(null,e)))})},b.exports=d},{}],13:[function(a,b,c){function d(a,b,c){if(e.call(this,a,b,c),Object.defineProperties(this,{deleteActionName:{value:"deleteUser"},updateActionName:{value:"updateUser"}}),a.kuzzle.bluebird)return a.kuzzle.bluebird.promisifyAll(this,{suffix:"Promise",filter:function(a,b,c,d){var e=["save"];return d&&e.indexOf(a)!==-1}})}var e=a("./kuzzleSecurityDocument");d.prototype=Object.create(e.prototype,{constructor:{value:d}}),d.prototype.setProfiles=function(a){if(!Array.isArray(a)||"string"!=typeof a[0])throw new Error('Parameter "profilesIds" must be an array of strings');return this.content.profilesIds=a,this},d.prototype.addProfile=function(a){if("string"!=typeof a)throw new Error('Parameter "profileId" must be a string');return this.content.profilesIds||(this.content.profilesIds=[]),this.content.profilesIds.indexOf(a)===-1&&this.content.profilesIds.push(a),this},d.prototype.save=function(a,b){var c=this.serialize(),d=this;return a&&void 0===b&&"function"==typeof a&&(b=a,a=null),d.kuzzle.query(this.kuzzleSecurity.buildQueryArgs("createOrReplaceUser"),c,a,function(a){return a?!!b&&b(a):void(b&&b(null,d))}),d},d.prototype.serialize=function(){var a={};return this.id&&(a._id=this.id),a.body=this.content,a},d.prototype.getProfiles=function(){return this.content.profilesIds},b.exports=d},{"./kuzzleSecurityDocument":12}]},{},[3]); //# sourceMappingURL=kuzzle.min.map \ No newline at end of file diff --git a/dist/kuzzle.min.map b/dist/kuzzle.min.map index 6c3e570b0..b3929288d 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","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","setTimeout","len","run","clearTimeout","Item","fun","array","this","noop","process","nextTick","args","Array","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask",2,"_window","setupBrowser","_crypto","crypto","msCrypto","_rng","getRandomValues","_rnds8","Uint8Array","_whatwgRNG","_rnds","_mathRNG","Math","random","console","warn","setupNode","_rb","randomBytes","_nodeRNG","parse","buf","offset","ii","toLowerCase","replace","oct","_hexToByte","unparse","bth","_byteToHex","v1","options","b","clockseq","_clockseq","msecs","Date","getTime","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","node","_nodeId","v4","BufferClass","rnds","rng","_previousRoot","Buffer","toString","substr","_seedBytes","uuid","define","amd","noConflict","window",3,"cleanQueue","self","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","droppedRequest","emitEvent","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","requestId","response","action","error","message","requestHistory","Object","keys","key","dequeue","additionalQueue","uniqueQueue","dequeuingProcess","shift","max","replayInterval","queuing","offlineQueueLoader","isArray","filter","controller","hasOwnProperty","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","KuzzleMemoryStorage","KuzzleUser","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","loginAttempt","offlineQueuePush","offlineQueuePop","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","slice","eventProperties","listener","fn","connect","bluebird","promisifyAll","suffix","func","target","passes","whitelist","indexOf","reconnection","forceNew","connectionError","internal","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","success","result","jwt","JSON","stringify","getJwtToken","login","strategy","credentials","expiresIn","body","queuable","logout","callbackRequired","whoAmI","security","_id","_source","getMyRights","hits","updateSelf","content","data","queryArgs","listenerId","knownEvents","listenerType","isValid","id","getAllStatistics","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","refreshIndex","getAutoRefresh","setAutoRefresh","autoRefresh","attr","object","meta","addHeaders","authorization","eventName","replayQueue","setDefaultIndex","setHeaders","startQueuing","stopQueuing","./kuzzleDataCollection","./kuzzleMemoryStorage","./security/kuzzleSecurity","./security/kuzzleUser","_process","node-uuid","socket.io-client",4,"kuzzle","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_version","total","count","create","createDocument","document","serialize","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","from","size","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom",5,"kuzzleDataCollection","properties","mappings","set","field",6,"dataCollection","setContent","save","publish","values",7,"bind","keyVal","idOrKeys","commands","append","bgrewriteaof","bgsave","bitcount","bitop","bitpos","__opts__","blpop","brpoplpush","dbsize","decrby","del","discard","exec","exists","expire","expireat","flushdb","getbit","getrange","hdel","hexists","hincrby","hmset","hset","info","lastsave","lindex","linsert","lpush","lrange","lrem","lset","ltrim","mset","multi","pexpire","pexpireat","pfadd","pfmerge","ping","psetex","randomkey","rename","renamenx","restore","rpoplpush","sadd","sdiffstore","setbit","setex","setrange","sinterstore","sismember","smove","sort","spop","srem","sunionstore","unwatch","wait","zadd","zcount","zincrby","zinterstore","zlexcount","zrange","zrangebylex","zrangebyscore","zrem","zremrangebylex","zremrangebyscore","zrevrangebylex","zrevrangebyscore","zrevrank","decr","get","dump","hgetall","hkeys","hlen","hstrlen","hvals","incr","llen","lpop","persist","pttl","rpop","scard","smembers","strlen","ttl","zcard","getset","lpushx","mget","pfcount","sdiff","sinter","sunion","watch","incrby","incrbyfloat","brpop","hget","hmget","hsetnx","msetnx","rpush","hincrbyfloat","srandmember","zrevrange","zscore","command","pop","v",8,"channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","isReady","subscribeQuery","unsubscribe","interval","setInterval","clearInterval",9,"KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","updateActionName","roles","map","role","KuzzleRole","constructor","addRole","setRoles","hydrate","getRoles","./kuzzleRole","./kuzzleSecurityDocument",10,11,"getRole","searchRoles","createRole","replaceIfExist","updateRole","deleteRole","roleFactory","getProfile","formattedRole","restrictedTo","allowInternalIndex","searchProfiles","profiles","createProfile","updateProfile","updatedContent","property","deleteProfile","profileFactory","getUser","profile","searchUsers","createUser","updateUser","deleteUser","userFactory","isActionAllowed","rights","filteredRights","right","some","item","getUserRights","userId","./kuzzleProfile","./kuzzleUser",12,"update",13,"hydratedUser","setProfile","getProfiles"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file +{"version":3,"sources":["kuzzle.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_window","setupBrowser","_crypto","crypto","msCrypto","_rng","getRandomValues","_rnds8","Uint8Array","_whatwgRNG","_rnds","Array","_mathRNG","Math","random","console","warn","setupNode","_rb","randomBytes","_nodeRNG","parse","buf","offset","ii","toLowerCase","replace","oct","_hexToByte","unparse","bth","_byteToHex","v1","options","b","clockseq","_clockseq","msecs","Date","getTime","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","node","_nodeId","v4","BufferClass","rnds","rng","_previousRoot","Buffer","toString","substr","_seedBytes","uuid","define","amd","noConflict","window","2","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","cachedSetTimeout","len","run","cachedClearTimeout","Item","fun","array","this","noop","process","setTimeout","clearTimeout","nextTick","args","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask","3","cleanQueue","self","now","lastDocumentIndex","queueTTL","offlineQueue","forEach","query","index","ts","splice","droppedRequest","emitEvent","queueMaxSize","emitRequest","request","cb","undefined","jwtToken","socket","requestId","response","action","error","message","requestHistory","Object","keys","key","dequeue","additionalQueue","uniqueQueue","dequeuingProcess","shift","max","replayInterval","queuing","offlineQueueLoader","isArray","filter","controller","hasOwnProperty","renewAllSubscriptions","subscriptions","roomId","subscriptionId","subscription","renew","callback","KuzzleDataCollection","KuzzleSecurity","KuzzleMemoryStorage","KuzzleUser","Kuzzle","url","defineProperties","collections","value","writable","connectCB","eventListeners","connected","lastEmitted","listeners","disconnected","reconnected","jwtTokenExpired","loginAttempt","offlineQueuePush","offlineQueuePop","eventTimeout","io","state","pending","autoReconnect","enumerable","defaultIndex","reconnectionDelay","autoQueue","autoReplay","autoResubscribe","headers","metadata","queueFilter","opt","getOwnPropertyDescriptor","offlineMode","defineProperty","header","errorMessagePrefix","event","slice","eventProperties","listener","fn","connect","bluebird","promisifyAll","suffix","func","target","passes","whitelist","indexOf","reconnection","forceNew","connectionError","internal","disconnect","reconnect","checkToken","err","res","valid","setJwtToken","token","success","result","jwt","JSON","stringify","getJwtToken","login","strategy","credentials","expiresIn","body","queuable","logout","callbackRequired","whoAmI","security","_id","_source","getMyRights","hits","updateSelf","content","data","queryArgs","listenerId","knownEvents","listenerType","isValid","id","getAllStatistics","getStatistics","timestamp","queryCB","startTime","dataCollectionFactory","collection","flushQueue","listCollections","collectionType","arg","type","listIndexes","indexes","close","getServerInfo","serverInfo","refreshIndex","getAutoRefresh","setAutoRefresh","autoRefresh","attr","object","meta","addHeaders","authorization","eventName","replayQueue","setDefaultIndex","setHeaders","startQueuing","stopQueuing","./kuzzleDataCollection","./kuzzleMemoryStorage","./security/kuzzleSecurity","./security/kuzzleUser","_process","node-uuid","socket.io-client","4","kuzzle","blacklist","KuzzleDocument","KuzzleDataMapping","KuzzleRoom","advancedSearch","filters","buildQueryArgs","documents","doc","newDocument","_version","total","count","create","createDocument","document","serialize","updateIfExist","deleteDocument","ids","fetchDocument","documentId","fetchAllDocuments","from","size","getMapping","kuzzleMapping","refresh","publishMessage","replaceDocument","subscribe","room","truncate","updateDocument","documentFactory","roomFactory","dataMappingFactory","mapping","./kuzzleDataMapping","./kuzzleDocument","./kuzzleRoom","5","kuzzleDataCollection","properties","mappings","set","field","6","dataCollection","setContent","save","publish","values","7","bind","keyVal","idOrKeys","commands","append","bgrewriteaof","bgsave","bitcount","bitop","bitpos","__opts__","blpop","brpoplpush","dbsize","decrby","del","discard","exec","exists","expire","expireat","flushdb","getbit","getrange","hdel","hexists","hincrby","hmset","hset","info","lastsave","lindex","linsert","lpush","lrange","lrem","lset","ltrim","mset","multi","pexpire","pexpireat","pfadd","pfmerge","ping","psetex","randomkey","rename","renamenx","restore","rpoplpush","sadd","sdiffstore","setbit","setex","setrange","sinterstore","sismember","smove","sort","spop","srem","sunionstore","unwatch","wait","zadd","zcount","zincrby","zinterstore","zlexcount","zrange","zrangebylex","zrangebyscore","zrem","zremrangebylex","zremrangebyscore","zrevrangebylex","zrevrangebyscore","zrevrank","decr","get","dump","hgetall","hkeys","hlen","hstrlen","hvals","incr","llen","lpop","persist","pttl","rpop","scard","smembers","strlen","ttl","zcard","getset","lpushx","mget","pfcount","sdiff","sinter","sunion","watch","incrby","incrbyfloat","brpop","hget","hmget","hsetnx","msetnx","rpush","hincrbyfloat","srandmember","zrevrange","zscore","command","pop","v","8","channel","lastRenewal","notifier","renewalDelay","scope","subscribing","users","subscribeToSelf","notificationCallback","element","isReady","subscribeQuery","unsubscribe","interval","setInterval","clearInterval","9","KuzzleProfile","kuzzleSecurity","KuzzleSecurityDocument","deleteActionName","updateActionName","constructor","policies","addPolicy","policy","roleId","setPolicies","map","getPolicies","./kuzzleSecurityDocument","10","KuzzleRole","11","getRole","searchRoles","roles","createRole","replaceIfExist","updateRole","deleteRole","roleFactory","getProfile","searchProfiles","profiles","createProfile","updateProfile","updatedContent","property","deleteProfile","profileFactory","getUser","searchUsers","createUser","updateUser","deleteUser","userFactory","isActionAllowed","rights","filteredRights","right","some","item","getUserRights","userId","./kuzzleProfile","./kuzzleRole","./kuzzleUser","12","update","13","setProfiles","profilesIds","addProfile","profileId","getProfiles"],"mappings":"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","file":"kuzzle.min.js"} \ No newline at end of file diff --git a/src/security/kuzzleProfile.js b/src/security/kuzzleProfile.js index 27fd3ce02..a98f10a0b 100644 --- a/src/security/kuzzleProfile.js +++ b/src/security/kuzzleProfile.js @@ -1,6 +1,5 @@ var - KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), - KuzzleRole = require('./kuzzleRole'); + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); function KuzzleProfile(kuzzleSecurity, id, content) { @@ -17,17 +16,6 @@ function KuzzleProfile(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, { @@ -60,8 +48,8 @@ KuzzleProfile.prototype.save = function (options, cb) { 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'); + if (!this.content.policies) { + throw new Error('Argument "policies" is mandatory in a profile. This argument contains an array of objects.'); } if (options && cb === undefined && typeof options === 'function') { @@ -86,89 +74,49 @@ 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 + * Add a policy in the policies list + * @param {Object} policy - must be an object containing at least a "roleId" member which must be a string. * * @returns {KuzzleProfile} this */ -KuzzleProfile.prototype.addRole = function (role) { +KuzzleProfile.prototype.addPolicy = function (policy) { - if (typeof role !== 'string' && !(role instanceof KuzzleRole)) { - throw new Error('Parameter "roles" must be a KuzzleRole or a id string'); + if (typeof policy !== 'object' || typeof policy.roleId !== 'string') { + throw new Error('Parameter "policies" must be an object containing at least a "roleId" member which must be a string.'); } - if (!this.content.roles) { - this.content.roles = []; + if (!this.content.policies) { + this.content.policies = []; } - this.content.roles.push(role); + this.content.policies.push(policy); return this; }; /** - * Set roles list - * @param {Array} roles - can be an array of KuzzleRole or an array of string + * Set policies list + * @param {Array} policies - must be an array of objects containing at least a "roleId" member which must be a string * * @returns {KuzzleProfile} this */ -KuzzleProfile.prototype.setRoles = function (roles) { +KuzzleProfile.prototype.setPolicies = function (policies) { - if (!Array.isArray(roles)) { - throw new Error('Parameter "roles" must be an array of KuzzleRole or an array of string'); + if (!Array.isArray(policies)) { + throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a 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'); + policies.map(function (policy) { + if (typeof policy !== 'object' || typeof policy.roleId !== 'string') { + throw new Error('Parameter "policies" must be an array of objects containing at least a "roleId" member which must be a string'); } }); - this.content.roles = roles; + this.content.policies = policies; 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 {object} [options] - Optional parameters - * @param {responseCallback} [cb] - Handles the query response - */ -KuzzleProfile.prototype.hydrate = function (options, 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; - } - }); - - 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}, options, function (error, response) { - if (error) { - return cb(error); - } - - cb(null, new KuzzleProfile(self, self.id, {roles: response.result.hits})); - }); -}; - /** * Serialize this object into a JSON object * @@ -183,29 +131,18 @@ 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) { - if (role instanceof KuzzleRole) { - return role.id; - } - - return role; - }); return data; }; /** - * Returns the list of roles associated to this profile. - * Each role element can be either a string or a KuzzleRole object + * Returns the list of policies associated to this profile. + * Each policy element is an array of objects containing at least a "roleId" member which must be a string * - * @return {object} an array of roles + * @return {object} an array of policies */ -KuzzleProfile.prototype.getRoles = function () { - return this.content.roles; +KuzzleProfile.prototype.getPolicies = function () { + return this.content.policies; }; module.exports = KuzzleProfile; diff --git a/src/security/kuzzleSecurity.js b/src/security/kuzzleSecurity.js index ac220f814..26f1fd65d 100644 --- a/src/security/kuzzleSecurity.js +++ b/src/security/kuzzleSecurity.js @@ -252,9 +252,6 @@ 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 {object} [options] - (optional) arguments @@ -263,21 +260,18 @@ KuzzleSecurity.prototype.roleFactory = function(id, content) { KuzzleSecurity.prototype.getProfile = function (id, options, cb) { var data, - self = this, - hydrate = true; - - if (!id || typeof id !== 'string') { - throw new Error('Id parameter is mandatory for getProfile function'); - } + self = this; if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - hydrate = options.hydrate; + + if (!id || typeof id !== 'string') { + throw new Error('Id parameter is mandatory for getProfile function'); } + data = {_id: id}; self.kuzzle.callbackRequired('KuzzleSecurity.getProfile', cb); @@ -287,20 +281,6 @@ KuzzleSecurity.prototype.getProfile = function (id, options, cb) { return cb(error); } - if (!hydrate) { - response.result._source.roles = response.result._source.roles.map(function (role) { - var formattedRole = {_id: role._id}; - if (role._source.restrictedTo !== undefined) { - formattedRole.restrictedTo = role._source.restrictedTo; - } - if (role._source.allowInternalIndex !== undefined) { - formattedRole.allowInternalIndex = role._source.allowInternalIndex; - } - - return formattedRole; - }); - } - cb(null, new KuzzleProfile(self, response.result._id, response.result._source)); }); }; @@ -308,10 +288,6 @@ KuzzleSecurity.prototype.getProfile = function (id, options, 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. @@ -325,15 +301,10 @@ KuzzleSecurity.prototype.searchProfiles = function (filters, options, cb) { var self = this; - filters.hydrate = true; - if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } self.kuzzle.callbackRequired('KuzzleSecurity.searchProfiles', cb); @@ -439,13 +410,7 @@ KuzzleSecurity.prototype.updateProfile = function (id, content, options, cb) { } Object.keys(res.result._source).forEach(function (property) { - if (property !== 'roles') { - updatedContent[property] = res.result._source[property]; - } - }); - - updatedContent.roles = res.result._source.roles.map(function (role) { - return role._id; + updatedContent[property] = res.result._source[property]; }); cb(null, new KuzzleProfile(self, res.result._id, updatedContent)); @@ -503,10 +468,6 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { /** * 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 {object} [options] - (optional) arguments * @param {responseCallback} cb - returns Kuzzle's response @@ -514,8 +475,7 @@ KuzzleSecurity.prototype.profileFactory = function(id, content) { KuzzleSecurity.prototype.getUser = function (id, options, cb) { var data, - self = this, - hydrate = true; + self = this; if (!id || typeof id !== 'string') { throw new Error('Id parameter is mandatory for getUser function'); @@ -525,9 +485,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, cb) { cb = options; options = null; } - else if (options.hydrate !== undefined) { - hydrate = options.hydrate; - } data = {_id: id}; @@ -538,10 +495,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, 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)); }); }; @@ -549,11 +502,6 @@ KuzzleSecurity.prototype.getUser = function (id, options, 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. @@ -566,15 +514,10 @@ KuzzleSecurity.prototype.searchUsers = function (filters, options, cb) { var self = this; - filters.hydrate = true; - if (!cb && typeof options === 'function') { cb = options; options = null; } - else if (options.hydrate !== undefined) { - filters.hydrate = options.hydrate; - } self.kuzzle.callbackRequired('KuzzleSecurity.searchUsers', cb); @@ -788,8 +731,9 @@ KuzzleSecurity.prototype.isActionAllowed = function(rights, controller, action, /** * Gets the rights array of a given user. * - * @param {string} userId The id of the user. - * @param {function} cb The callback containing the normalized array of rights. + * @param {string} userId The id of the user. + * @param {object} [options] - (optional) arguments + * @param {function} cb The callback containing the normalized array of rights. */ KuzzleSecurity.prototype.getUserRights = function (userId, options, cb) { var @@ -797,7 +741,7 @@ KuzzleSecurity.prototype.getUserRights = function (userId, options, cb) { self = this; if (!userId || typeof userId !== 'string') { - throw new Error('userId parameter is mandatory for isActionAllowed function'); + throw new Error('userId parameter is mandatory for getUserRights function'); } if (!cb && typeof options === 'function') { diff --git a/src/security/kuzzleUser.js b/src/security/kuzzleUser.js index 2f87fbe64..c0f77a43b 100644 --- a/src/security/kuzzleUser.js +++ b/src/security/kuzzleUser.js @@ -1,16 +1,10 @@ var - KuzzleSecurityDocument = require('./kuzzleSecurityDocument'), - KuzzleProfile = require('./kuzzleProfile'); + KuzzleSecurityDocument = require('./kuzzleSecurityDocument'); 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) { - this.content.profile = new KuzzleProfile(kuzzleSecurity, content.profile._id, content.profile._source); - } - // Define properties Object.defineProperties(this, { // private properties @@ -27,7 +21,7 @@ function KuzzleUser(kuzzleSecurity, id, content) { return kuzzleSecurity.kuzzle.bluebird.promisifyAll(this, { suffix: 'Promise', filter: function (name, func, target, passes) { - var whitelist = ['hydrate', 'save']; + var whitelist = ['save']; return passes && whitelist.indexOf(name) !== -1; } @@ -42,54 +36,39 @@ 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. + * Set profiles in content + * @param {array} profile - an array of profiles ids string * - * @param {object} [options] - Optional parameters - * @param {responseCallback} [cb] - Handles the query response + * @returns {KuzzleUser} this */ -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'); +KuzzleUser.prototype.setProfiles = function (profilesIds) { + if (!Array.isArray(profilesIds) || typeof profilesIds[0] !== 'string') { + throw new Error('Parameter "profilesIds" must be an array of strings'); } - self.kuzzle.query(this.kuzzleSecurity.buildQueryArgs('getProfile'), {_id: this.content.profile}, options, function (error, response) { - var hydratedUser; - - if (error) { - return cb(error); - } - - hydratedUser = new KuzzleUser(self.kuzzleSecurity, self.id, self.content); - hydratedUser.setProfile(new KuzzleProfile(self.kuzzleSecurity, response.result._id, response.result._source)); + this.content.profilesIds = profilesIds; - cb(null, hydratedUser); - }); + return this; }; /** - * Set profile in content - * @param {KuzzleProfile|string} profile - can be a KuzzleProfile or an id string + * Add a profile + * @param {string} profile - a profile ids string * * @returns {KuzzleUser} this */ -KuzzleUser.prototype.setProfile = function (profile) { +KuzzleUser.prototype.addProfile = function (profileId) { + if (typeof profileId !== 'string') { + throw new Error('Parameter "profileId" must be a string'); + } - if (typeof profile !== 'string' && !(profile instanceof KuzzleProfile)) { - throw new Error('Parameter "profile" must be a KuzzleProfile or a string'); + if (!this.content.profilesIds) { + this.content.profilesIds = []; } - this.content.profile = profile; + if (this.content.profilesIds.indexOf(profileId) === -1) { + this.content.profilesIds.push(profileId); + } return this; }; @@ -143,20 +122,16 @@ KuzzleUser.prototype.serialize = function () { data.body = this.content; - if (data.body.profile && data.body.profile.id) { - data.body.profile = data.body.profile.id; - } - return data; }; /** - * Return the associated profiles + * Return the associated profiles IDs * - * @return {object} either the associated profile ID or the KuzzleProfile instance + * @return {array} the associated profiles IDs */ KuzzleUser.prototype.getProfiles = function () { - return this.content.profile; + return this.content.profilesIds; }; module.exports = KuzzleUser; diff --git a/test/security/kuzzleProfile/constructor.test.js b/test/security/kuzzleProfile/constructor.test.js index 4770f16ff..c82abd549 100644 --- a/test/security/kuzzleProfile/constructor.test.js +++ b/test/security/kuzzleProfile/constructor.test.js @@ -17,7 +17,7 @@ describe('KuzzleProfile constructor', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); }); - it('should throw an error if no id is provided', done => { + it('should throw an error if no id is provided', function(done) { try { new KuzzleProfile(kuzzle.security, null, null); } @@ -44,10 +44,9 @@ describe('KuzzleProfile constructor', function () { var kuzzleProfile = new KuzzleProfile(kuzzle.security, 'test', {}); should.exist(kuzzleProfile.save); - should.exist(kuzzleProfile.addRole); + should.exist(kuzzleProfile.addPolicy); should.exist(kuzzleProfile.savePromise); - should.exist(kuzzleProfile.setRoles); - should.exist(kuzzleProfile.hydratePromise); + should.exist(kuzzleProfile.setPolicies); should.exist(kuzzleProfile.deletePromise); should.exist(kuzzleProfile.serialize); }); diff --git a/test/security/kuzzleProfile/methods.test.js b/test/security/kuzzleProfile/methods.test.js index 79f1b03a6..fea133e11 100644 --- a/test/security/kuzzleProfile/methods.test.js +++ b/test/security/kuzzleProfile/methods.test.js @@ -50,7 +50,7 @@ describe('KuzzleRole methods', function () { kuzzle.query = queryStub; error = false; - result = { result: {_id: 'myProfile', _source: {roles : []}} }; + result = { result: {_id: 'myProfile', _source: {policies : []}} }; kuzzleProfile = new KuzzleProfile(kuzzle.security, result.result._id, result.result._source); expectedQuery = { action: 'createOrReplaceProfile', @@ -148,184 +148,96 @@ describe('KuzzleRole methods', function () { }); }); - describe('#addRole', function () { + describe('#addPolicy', function () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {roles: ['role1']}); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {policies: [{roleId:'role1'}]}); }); - it('should throw an error if the role is not an id or a KuzzleRole', function (done) { + it('should throw an error if the policy parameter is not an object', function (done) { should((function () { - kuzzleProfile.addRole(null); + kuzzleProfile.addPolicy(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']); + it('should throw an error if the policy.roleId parameter is not a string', function (done) { + should((function () { + kuzzleProfile.addPolicy({roleId: null}); + })).throw(Error); + 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); + it('should add the right policy in policies list', function (done) { + kuzzleProfile.addPolicy({roleId: 'role2'}); + should(kuzzleProfile.content.policies).be.an.Array().match([{roleId: 'role1'}, {roleId: 'role2'}]); + should(kuzzleProfile.content.policies.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: {}}); - + it('should initialize policies with array if no policy was set before', function (done) { 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); + kuzzleProfile.addPolicy({roleId: 'role'}); + should(kuzzleProfile.content.policies).be.an.Array(); + should(kuzzleProfile.content.policies.length).be.exactly(1); done(); }); }); - describe('#setRoles', function () { + describe('#setPolicies', function () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {roles: ['role1']}); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {policies: [{roleId:'role1'}]}); }); - it('should throw an error if the roles parameter is null', function (done) { + it('should throw an error if the policies parameter is null', function (done) { should((function () { - kuzzleProfile.setRoles(null); + kuzzleProfile.setPolicies(null); })).throw(Error); done(); }); - it('should throw an error if the role parameter is not a array of string', function (done) { + it('should throw an error if the role parameter is not a array of objects', function (done) { should((function () { - kuzzleProfile.setRoles([1, 2, 3]); + kuzzleProfile.setPolicies([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']); + it('should add the policy in policies list', function (done) { + kuzzleProfile.setPolicies([{roleId:'role2'}]); + should(kuzzleProfile.content.policies).be.an.Array().match([{roleId:'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); + kuzzleProfile.setPolicies([{roleId:'role1'}, {roleId:'role2'}]); + should(kuzzleProfile.content.policies).be.an.Array(); + should(kuzzleProfile.content.policies.length).be.exactly(2); done(); }); }); - describe('#hydrate', function () { - beforeEach(function () { - kuzzle = new Kuzzle('http://localhost:7512'); - - kuzzle.query = queryStub; - error = false; - - result = { result: {hits: [{_id: 'role1', _source: {indexes: {}}}, {_id: 'role2', _source: {indexes: {}}}]}}; - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'profile', {roles: result.result.hits}); - 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: ['role1', 'role2']}; - - should(kuzzleProfile.hydrate(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 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(); - })); - }); - - 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 () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles: ['role1']}); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', policies: [{roleId:'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 serialized', 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']}); + should(serialized.body).be.match({some: 'content', policies: [{roleId:'role1'}]}); done(); }); - it('should serialize without roles if no roles attribute is defined', function (done) { + it('should serialize without policies if no policies attribute is defined', function (done) { var serialized; @@ -335,7 +247,7 @@ describe('KuzzleRole methods', function () { should(serialized._id).be.exactly('myProfile'); should.exist(serialized.body.some); - should.not.exist(serialized.body.roles); + should.not.exist(serialized.body.policies); done(); }); }); @@ -347,7 +259,7 @@ describe('KuzzleRole methods', function () { error = false; result = { result: {_id: 'myProfile'} }; - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles: ['role1']}); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles: [{roleId:'role1'}]}); expectedQuery = { action: 'deleteProfile', controller: 'security' @@ -379,13 +291,13 @@ describe('KuzzleRole methods', function () { }); }); - describe('#getRoles', function () { - it('should return the associated roles', function () { - var roles = ['role1', 'role2', 'role3']; + describe('#getPolicies', function () { + it('should return the associated policies', function () { + var policies = [{roleId:'role1'}, {roleId:'role2'}, {roleId:'role3'}]; kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', roles}); - should(kuzzleProfile.getRoles()).be.eql(roles); + kuzzleProfile = new KuzzleProfile(kuzzle.security, 'myProfile', {some: 'content', policies: policies}); + should(kuzzleProfile.getPolicies()).be.eql(policies); }); }); }); diff --git a/test/security/kuzzleSecurity/profilesMethods.test.js b/test/security/kuzzleSecurity/profilesMethods.test.js index 6350a580c..a820ad0d3 100644 --- a/test/security/kuzzleSecurity/profilesMethods.test.js +++ b/test/security/kuzzleSecurity/profilesMethods.test.js @@ -50,14 +50,11 @@ describe('KuzzleSecurity profiles methods', function () { result: { _id: 'foobar', _source: { - roles: [ + policies: [ { - _id: 'role1', - _source: { - controllers: {'*': {actions: {'*': true}}}, - restrictedTo: [{index: 'foo', collections: ['bar']}], - allowInternalIndex: false - } + roleId: 'role1', + restrictedTo: [{index: 'foo', collections: ['bar']}], + allowInternalIndex: false } ] } @@ -75,32 +72,32 @@ describe('KuzzleSecurity profiles methods', function () { should(err).be.null(); should(res).be.instanceof(KuzzleProfile); - should(res.content.roles).be.an.Array(); - should(res.content.roles).not.be.empty(); + should(res.content.policies).be.an.Array(); + should(res.content.policies).not.be.empty(); - res.content.roles.forEach(function (role) { - should(role).instanceof(KuzzleRole); + res.content.policies.forEach(function (policy) { + should(policy).be.an.Object(); + should(policy.roleId).be.a.String(); }); 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, {hydrate: false}, function (err, res) { + 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._id).not.be.empty().and.be.a.String(); - should(role.controllers).be.empty(); - should(role.allowInternalIndex).be.false(); - should(role.restrictedTo).not.be.empty().and.be.an.Array(); - should(role.restrictedTo[0].index).be.equal('foo'); - should(role.restrictedTo[0].collections).not.be.empty().and.be.an.Array(); - should(role.restrictedTo[0].collections[0]).be.equal('bar'); + should(res.content.policies).be.an.Array(); + should(res.content.policies).not.be.empty(); + + res.content.policies.forEach(function (policy) { + should(policy.roleId).not.be.empty().and.be.a.String(); + should(policy.controllers).be.empty(); + should(policy.restrictedTo).not.be.empty().and.be.an.Array(); + should(policy.restrictedTo[0].index).be.equal('foo'); + should(policy.restrictedTo[0].collections).not.be.empty().and.be.an.Array(); + should(policy.restrictedTo[0].collections[0]).be.equal('bar'); }); done(); })); @@ -131,7 +128,7 @@ describe('KuzzleSecurity profiles methods', 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: {}}}]}} ]}}; + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {policies: [ {roleId: 'myRole'} ]}} ]}}; expectedQuery = { action: 'searchProfiles', controller: 'security' @@ -142,10 +139,10 @@ describe('KuzzleSecurity profiles methods', function () { var filters = {}; - result = { result: { total: 123, hits: [{_id: 'foobar', _source: {roles : ['myRole']}}]} }; + result = { result: { total: 123, hits: [{_id: 'foobar', _source: {policies : [{roleId: 'myRole'}]}}]} }; this.timeout(50); - expectedQuery.body = {hydrate: true}; + expectedQuery.body = {}; should(kuzzle.security.searchProfiles(filters, function (err, res) { should(err).be.null(); @@ -158,9 +155,10 @@ describe('KuzzleSecurity profiles methods', function () { res.profiles.forEach(function (item) { should(item).be.instanceof(KuzzleProfile); - item.content.roles.forEach(function (role) { - should(role).be.String() - }) + item.content.policies.forEach(function (policy) { + should(policy).be.an.Object(); + should(policy.roleId).be.String(); + }); }); done(); @@ -171,12 +169,12 @@ describe('KuzzleSecurity profiles methods', function () { var filters = {}; - result = { result: { total: 123, hits: [{_id: 'foobar', _source: {roles : ['myRole']}}]} }; + result = { result: { total: 123, hits: [{_id: 'foobar', _source: {policies : [{roleId: 'myRole'}]}}]} }; this.timeout(50); - expectedQuery.body = {hydrate: false}; + expectedQuery.body = {}; - should(kuzzle.security.searchProfiles(filters, {hydrate: false}, function (err, res) { + 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); @@ -187,9 +185,10 @@ describe('KuzzleSecurity profiles methods', function () { res.profiles.forEach(function (item) { should(item).be.instanceof(KuzzleProfile); - item.content.roles.forEach(function (role) { - should(role).be.String() - }) + item.content.policies.forEach(function (policy) { + should(policy).be.an.Object(); + should(policy.roleId).be.String(); + }); }); done(); @@ -214,9 +213,10 @@ describe('KuzzleSecurity profiles methods', function () { res.profiles.forEach(function (item) { should(item).be.instanceof(KuzzleProfile); - item.content.roles.forEach(function (role) { - should(role).be.instanceof(KuzzleRole); - }) + item.content.policies.forEach(function (policy) { + should(policy).be.an.Object(); + should(policy.roleId).be.String(); + }); }); done(); @@ -253,7 +253,7 @@ describe('KuzzleSecurity profiles methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: {_id: 'foobar', _source: {roles: ['myRole']}} }; + result = { result: {_id: 'foobar', _source: {policies: [{roleId: 'myRole'}]}} }; expectedQuery = { action: 'createProfile', controller: 'security' @@ -331,7 +331,7 @@ describe('KuzzleSecurity profiles methods', function () { _index: '%kuzzle', _type: 'profiles', _source: { - roles: [{_id: 'foo'}], + policies: [{roleId: 'foo'}], foo: 'bar' } } @@ -353,7 +353,7 @@ describe('KuzzleSecurity profiles methods', function () { })); }); - it('should send the right query to Kuzzle even without callback', () => { + it('should send the right query to Kuzzle even without callback', function () { expectedQuery.body = {'foo': 'bar'}; expectedQuery._id = result.result._id; @@ -417,7 +417,7 @@ describe('KuzzleSecurity profiles methods', function () { describe('#ProfileFactory', function () { it('should return an instance of Profile', function (done) { - var role = kuzzle.security.profileFactory('test', {roles: ['myRole']}); + var role = kuzzle.security.profileFactory('test', {policies: [{roleId:'myRole'}]}); should(role).instanceof(KuzzleProfile); done(); }); diff --git a/test/security/kuzzleSecurity/userMethods.test.js b/test/security/kuzzleSecurity/userMethods.test.js index 764a14f15..b79eb767a 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: {profile: {_id: 'profile', _source: {roles: [{_id: 'role', _source: {indexes: {}}}]}}} }}; + result = { result: {_id: 'foobar', _source: {profilesIds: ['profile']}}}; expectedQuery = { action: 'getUser', controller: 'security', @@ -60,25 +60,21 @@ describe('KuzzleSecurity user methods', function () { 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); - }); + should(res.content.profilesIds).be.an.Array(); + should(res.content.profilesIds[0]).be.a.String(); 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, {hydrate: false}, function (err, res) { + it('should send the right query to Kuzzle with id as profile', function (done) { + should(kuzzle.security.getUser(result.result._id, function (err, res) { should(err).be.null(); should(res).be.instanceof(KuzzleUser); - should(res.content.profile).be.a.String(); + should(res.content.profilesIds).be.an.Array(); + should(res.content.profilesIds[0]).be.a.String(); + done(); })); }); @@ -108,7 +104,7 @@ describe('KuzzleSecurity user methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {profile : 'myProfile'}} ]}}; + result = { result: { total: 123, hits: [ {_id: 'foobar', _source: {profilesIds : ['myProfile']}} ]}}; expectedQuery = { action: 'searchUsers', controller: 'security' @@ -120,7 +116,7 @@ describe('KuzzleSecurity user methods', function () { filters = {}; this.timeout(50); - expectedQuery.body = {hydrate: true}; + expectedQuery.body = {}; should(kuzzle.security.searchUsers(filters, function (err, res) { should(err).be.null(); @@ -133,58 +129,20 @@ describe('KuzzleSecurity user methods', function () { res.users.forEach(function (item) { should(item).be.instanceof(KuzzleUser); - should(item.content.profile).be.String(); - should(item.content.profile.roles).be.undefined(); + should(item.content.profilesIds).be.an.Array(); + should(item.content.profilesIds[0]).be.a.String(); }); done(); })); }); - 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) { + it('should send the right search query to kuzzle and return user', function (done) { var filters = {}; result = { result: { total: 123, hits: [ {_id: 'foobar', _source: { - profile: { - _id: 'myProfile', - _source: { - roles: [ - { - _id: 'myRole', - _source: { - indexes: {} - } - } - ] - } - } + profilesIds: ['myProfile'] }}]}}; this.timeout(50); @@ -201,13 +159,8 @@ describe('KuzzleSecurity user methods', function () { res.users.forEach(function (item) { should(item).be.instanceof(KuzzleUser); - should(item.content.profile).be.instanceof(KuzzleProfile); - 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); - }); + should(item.content.profilesIds).be.an.Array(); + should(item.content.profilesIds[0]).be.a.String(); }); done(); @@ -226,19 +179,7 @@ describe('KuzzleSecurity user methods', function () { filters = {}; result = { result: { total: 123, hits: [ {_id: 'foobar', _source: { - profile: { - _id: 'myProfile', - _source: { - roles: [ - { - _id: 'myRole', - _source: { - indexes: {} - } - } - ] - } - } + profilesIds: ['myProfile'] }}]}}; expectedQuery.body = filters; @@ -258,7 +199,7 @@ describe('KuzzleSecurity user methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: {_id: 'foobar', _source: {profile: ['myRole']}} }; + result = { result: {_id: 'foobar', _source: {profilesIds: ['myRole']}} }; expectedQuery = { action: 'createUser', controller: 'security' @@ -330,7 +271,7 @@ describe('KuzzleSecurity user methods', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); kuzzle.query = queryStub; error = null; - result = { result: {_id: 'foobar', _index: '%kuzzle', _type: 'users', _source: {profile: 'foobar'} } }; + result = { result: {_id: 'foobar', _index: '%kuzzle', _type: 'users', _source: {profilesIds: ['foobar']} } }; expectedQuery = { action: 'updateUser', controller: 'security' @@ -412,10 +353,10 @@ describe('KuzzleSecurity user methods', function () { }); }); - describe('#ProfileFactory', function () { + describe('#UserFactory', function () { it('should return an instance of Profile', function (done) { - var role = kuzzle.security.userFactory('test', {profile: ['myProfile']}); - should(role).instanceof(KuzzleUser); + var user = kuzzle.security.userFactory('test', {profilesIds: ['myProfile']}); + should(user).instanceof(KuzzleUser); done(); }); diff --git a/test/security/kuzzleUser/constructor.test.js b/test/security/kuzzleUser/constructor.test.js index 917d85524..13fd408f8 100644 --- a/test/security/kuzzleUser/constructor.test.js +++ b/test/security/kuzzleUser/constructor.test.js @@ -18,7 +18,7 @@ describe('KuzzleUser constructor', function () { kuzzle = new Kuzzle('foo', {defaultIndex: 'bar'}); }); - it('should throw an error if no id is provided', done => { + it('should throw an error if no id is provided', function (done) { try { new KuzzleUser(kuzzle.security, null, null); } @@ -44,9 +44,8 @@ describe('KuzzleUser constructor', function () { it('should expose functions', function () { var kuzzleUser = new KuzzleUser(kuzzle.security, 'test', {}); - should.exist(kuzzleUser.setProfile); + should.exist(kuzzleUser.setProfiles); should.exist(kuzzleUser.savePromise); - should.exist(kuzzleUser.hydratePromise); should.exist(kuzzleUser.serialize); should.exist(kuzzleUser.deletePromise); }); diff --git a/test/security/kuzzleUser/methods.test.js b/test/security/kuzzleUser/methods.test.js index ca960f954..5f30eb668 100644 --- a/test/security/kuzzleUser/methods.test.js +++ b/test/security/kuzzleUser/methods.test.js @@ -7,7 +7,7 @@ var KuzzleRole = require('../../../src/security/kuzzleRole'), KuzzleUser = require('../../../src/security/kuzzleUser'); -describe('KuzzleRole methods', function () { +describe('KuzzleUser methods', function () { var kuzzle, kuzzleUser, @@ -51,7 +51,7 @@ describe('KuzzleRole methods', function () { kuzzle.query = queryStub; error = false; - result = { result: {_id: 'myUser', _source: {some: 'content', profile: 'myProfile'}} }; + result = { result: {_id: 'myUser', _source: {some: 'content', profileIds: ['myProfile']}} }; kuzzleUser = new KuzzleUser(kuzzle.security, result.result._id, result.result._source); expectedQuery = { action: 'createOrReplaceUser', @@ -148,130 +148,101 @@ describe('KuzzleRole methods', function () { }); }); - describe('#setProfile', function () { + describe('#setProfiles', function () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleUser = new KuzzleUser(kuzzle.security, 'myUser', {profile: 'profile1'}); + kuzzleUser = new KuzzleUser(kuzzle.security, 'myUser', {profilesIds: ['profile1']}); }); - it('should throw an error if the profile parameter is null', function (done) { + it('should throw an error if the profilesIds parameter is null', function (done) { should((function () { - kuzzleUser.setProfile(null); + kuzzleUser.setProfiles(null); })).throw(Error); done(); }); - it('should throw an error if the profile parameter is not a string', function (done) { + it('should throw an error if the profilesIds parameter is not an array', function (done) { should((function () { - kuzzleUser.setProfile(1); + kuzzleUser.setProfiles(1); })).throw(Error); done(); }); - it('should add the id string in profile', function (done) { - kuzzleUser.setProfile('role2'); - should(kuzzleUser.content.profile).be.exactly('role2'); + it('should throw an error if the profilesIds parameter is not an array of strings', function (done) { + should((function () { + kuzzleUser.setProfiles([1]); + })).throw(Error); + 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); + it('should add the rights profiles IDs in profilesIds', function (done) { + kuzzleUser.setProfiles(['profile2']); + should(kuzzleUser.content.profilesIds[0]).be.exactly('profile2'); done(); }); }); - describe('#hydrate', function () { + + describe('#addProfile', function () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); + kuzzleUser = new KuzzleUser(kuzzle.security, 'myUser', {profilesIds: ['profile1']}); + }); - kuzzle.query = queryStub; - error = false; + it('should throw an error if the profileId parameter is null', function (done) { + should((function () { + kuzzleUser.addProfile(null); + })).throw(Error); - result = { result: {_id: 'user', _source: {profile : 'profile1'}} }; - kuzzleUser = new KuzzleUser(kuzzle.security, result.result._id, result.result._source); - expectedQuery = { - action: 'getProfile', - controller: 'security' - }; + done(); }); - it('should raise an error if no callback is provided', function () { - should(function () { kuzzleUser.hydrate(); }).throw(Error); + it('should throw an error if the profileId parameter is not a string', function (done) { + should((function () { + kuzzleUser.addProfile(42); + })).throw(Error); + + done(); }); - 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 add the profile if it does not already exists in list', function (done) { + kuzzleUser.addProfile('profile2'); + + should(kuzzleUser.content.profilesIds).be.eql(['profile1', 'profile2']); + 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); + it('should not add the profile if it already exists in list', function (done) { + kuzzleUser.addProfile('profile1'); - should(function () { kuzzleUser.hydrate(function () {}); }).throw(Error); + should(kuzzleUser.content.profilesIds).be.eql(['profile1']); done(); }); - it('should call the callback with an error if one occurs', function (done) { - error = 'foobar'; + it('should add the profile even if no profilesIds are currently set', function (done) { + delete kuzzleUser.content.profilesIds; + kuzzleUser.addProfile('profile1'); - kuzzleUser.hydrate(function (err, res) { - should(err).be.exactly('foobar'); - should(res).be.undefined(); - done(); - }); + should(kuzzleUser.content.profilesIds).be.eql(['profile1']); + done(); }); + }); describe('#serialize', function () { beforeEach(function () { kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profile: 'profile'}); + kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profilesIds: ['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); + should(serialized.body).be.match({some: 'content', profilesIds: ['profile']}); done(); }); }); @@ -283,7 +254,7 @@ describe('KuzzleRole methods', function () { error = false; result = { result: {_id: 'user'} }; - kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profile: 'role1'}); + kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profilesIds: ['profile']}); expectedQuery = { action: 'deleteUser', controller: 'security' @@ -317,10 +288,10 @@ describe('KuzzleRole methods', function () { describe('#getProfiles', function () { it('should return the associated profiles', function () { - var profile = 'profile'; + var profilesIds = ['profile']; kuzzle = new Kuzzle('http://localhost:7512'); - kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profile}); - should(kuzzleUser.getProfiles()).be.eql(profile); + kuzzleUser = new KuzzleUser(kuzzle.security, 'user', {some: 'content', profilesIds}); + should(kuzzleUser.getProfiles()).be.eql(profilesIds); }); }); });