Use xo-collection.
This commit is contained in:
parent
c763794ef3
commit
9d05653f5b
@ -1,160 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
|
|
||||||
// ===================================================================
|
|
||||||
|
|
||||||
var forEach = require('lodash.foreach')
|
|
||||||
var indexOf = require('lodash.indexof')
|
|
||||||
|
|
||||||
// ===================================================================
|
|
||||||
|
|
||||||
function deleteProperties (obj) {
|
|
||||||
/* jshint forin: false */
|
|
||||||
var prop
|
|
||||||
for (prop in obj) {
|
|
||||||
delete obj[prop]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================================================================
|
|
||||||
|
|
||||||
function defaultKey (item) {
|
|
||||||
return item.id || item._id || item
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================================================================
|
|
||||||
|
|
||||||
function getAll () {
|
|
||||||
/* jshint validthis: true */
|
|
||||||
return this._data
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIndexes () {
|
|
||||||
/* jshint validthis: true */
|
|
||||||
return this._indexes
|
|
||||||
}
|
|
||||||
|
|
||||||
function Collection (opts) {
|
|
||||||
if (!opts) {
|
|
||||||
opts = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._key = opts.key || defaultKey
|
|
||||||
|
|
||||||
this._indexes = Object.create(null)
|
|
||||||
if (opts.indexes) {
|
|
||||||
forEach(opts.indexes, function (field) {
|
|
||||||
this[field] = Object.create(null)
|
|
||||||
}, this._indexes)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._data = Object.create(null)
|
|
||||||
|
|
||||||
// Expose public properties.
|
|
||||||
Object.defineProperties(this, {
|
|
||||||
all: {
|
|
||||||
enumerable: true,
|
|
||||||
get: getAll
|
|
||||||
},
|
|
||||||
indexes: {
|
|
||||||
enumerable: true,
|
|
||||||
get: getIndexes
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection.prototype.clear = function () {
|
|
||||||
deleteProperties(this._data)
|
|
||||||
forEach(this._indexes, deleteProperties)
|
|
||||||
}
|
|
||||||
|
|
||||||
function unsetItemFromIndex (index, field) {
|
|
||||||
/* jshint validthis: true */
|
|
||||||
|
|
||||||
var prop = this[field]
|
|
||||||
if (!prop) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = index[prop]
|
|
||||||
|
|
||||||
var i = indexOf(items, this)
|
|
||||||
if (i === -1) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// The index contains only this one item for this prop.
|
|
||||||
if (items.length === 1) {
|
|
||||||
delete index[prop]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove this item.
|
|
||||||
items.splice(i, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal unset method.
|
|
||||||
function unset (item, key) {
|
|
||||||
/* jshint validthis: true */
|
|
||||||
|
|
||||||
delete this._data[key]
|
|
||||||
|
|
||||||
forEach(this._indexes, unsetItemFromIndex, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
function setItemToIndex (index, field) {
|
|
||||||
/* jshint validthis: true */
|
|
||||||
|
|
||||||
var prop = this[field]
|
|
||||||
if (!prop) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = index[prop]
|
|
||||||
if (items) {
|
|
||||||
// Update the items list.
|
|
||||||
items.push(this)
|
|
||||||
} else {
|
|
||||||
// Create the items list.
|
|
||||||
index[prop] = [this]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection.prototype.set = function (item) {
|
|
||||||
var key = this._key(item)
|
|
||||||
if (!key) {
|
|
||||||
// Ignore empty keys.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var previous = this._data[key]
|
|
||||||
if (previous) {
|
|
||||||
unset.call(this, previous, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._data[key] = item
|
|
||||||
forEach(this._indexes, setItemToIndex, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection.prototype.unset = function (item) {
|
|
||||||
var key = this._key(item)
|
|
||||||
item = this._data[key]
|
|
||||||
if (!item) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
unset.call(this, item, this._key(item))
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection.prototype.setMultiple = function (items) {
|
|
||||||
forEach(items, this.set, this)
|
|
||||||
}
|
|
||||||
Collection.prototype.unsetMultiple = function (items) {
|
|
||||||
forEach(items, this.unset, this)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================================================================
|
|
||||||
|
|
||||||
function createCollection (opts) {
|
|
||||||
return new Collection(opts)
|
|
||||||
}
|
|
||||||
module.exports = createCollection
|
|
@ -28,12 +28,12 @@
|
|||||||
"exec-promise": "^0.5.1",
|
"exec-promise": "^0.5.1",
|
||||||
"lodash.assign": "^3.0.0",
|
"lodash.assign": "^3.0.0",
|
||||||
"lodash.foreach": "^3.0.1",
|
"lodash.foreach": "^3.0.1",
|
||||||
"lodash.indexof": "^3.0.0",
|
|
||||||
"lodash.isstring": "^3.0.0",
|
"lodash.isstring": "^3.0.0",
|
||||||
"lodash.startswith": "^3.0.0",
|
"lodash.startswith": "^3.0.0",
|
||||||
"make-error": "^0.3.0",
|
"make-error": "^0.3.0",
|
||||||
"pw": "0.0.4",
|
"pw": "0.0.4",
|
||||||
"ws": "^0.7.1"
|
"ws": "^0.7.1",
|
||||||
|
"xo-collection": "^0.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mocha": "^2.1.0",
|
"mocha": "^2.1.0",
|
||||||
|
@ -3,13 +3,15 @@
|
|||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
var Bluebird = require('bluebird')
|
var Bluebird = require('bluebird')
|
||||||
|
var Collection = require('xo-collection').default
|
||||||
|
var forEach = require('lodash.foreach')
|
||||||
|
var Index = require('xo-collection/index')
|
||||||
var isString = require('lodash.isstring')
|
var isString = require('lodash.isstring')
|
||||||
var startsWith = require('lodash.startswith')
|
var startsWith = require('lodash.startswith')
|
||||||
|
|
||||||
var Api = require('./api')
|
var Api = require('./api')
|
||||||
var BackOff = require('./back-off')
|
var BackOff = require('./back-off')
|
||||||
var ConnectionError = require('./connection-error')
|
var ConnectionError = require('./connection-error')
|
||||||
var createCollection = require('./collection')
|
|
||||||
var SessionError = require('./session-error')
|
var SessionError = require('./session-error')
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
@ -29,6 +31,18 @@ function makeStandaloneDeferred () {
|
|||||||
|
|
||||||
function noop () {}
|
function noop () {}
|
||||||
|
|
||||||
|
function setMultiple (collection, items) {
|
||||||
|
forEach(items, function (item) {
|
||||||
|
collection.set(item)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function unsetMultiple (collection, items) {
|
||||||
|
forEach(items, function (item) {
|
||||||
|
collection.unset(item)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
function Xo (opts) {
|
function Xo (opts) {
|
||||||
@ -61,27 +75,23 @@ function Xo (opts) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var method = (
|
var method = notification.params.type === 'exit' ?
|
||||||
notification.params.type === 'exit' ?
|
unsetMultiple :
|
||||||
'unset' :
|
setMultiple
|
||||||
'set'
|
|
||||||
) + 'Multiple'
|
|
||||||
|
|
||||||
this.objects[method](notification.params.items)
|
method(this.objects, notification.params.items)
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
this.objects = createCollection({
|
var objects = this.objects = new Collection()
|
||||||
indexes: [
|
objects.getKey = function (item) {
|
||||||
'ref',
|
return item.UUID || item.ref || 'undefined'
|
||||||
'type',
|
}
|
||||||
'UUID'
|
objects.createIndex('ref', new Index('ref'))
|
||||||
],
|
objects.createIndex('type', new Index('type'))
|
||||||
key: function (item) {
|
objects.createIndex('UUID', new Index('UUID'))
|
||||||
return item.UUID || item.ref
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.status = 'disconnected'
|
this.status = 'disconnected'
|
||||||
this.user = null
|
this.user = null
|
||||||
|
|
||||||
@ -177,7 +187,7 @@ Xo.prototype._tryToOpenSession = function () {
|
|||||||
|
|
||||||
this._api.call('xo.getAllObjects').bind(this).then(function (objects) {
|
this._api.call('xo.getAllObjects').bind(this).then(function (objects) {
|
||||||
this.objects.clear()
|
this.objects.clear()
|
||||||
this.objects.setMultiple(objects)
|
setMultiple(this.objects, objects)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Validate the sign in.
|
// Validate the sign in.
|
||||||
|
Loading…
Reference in New Issue
Block a user