mirror of
https://github.com/moparisthebest/kaiwa
synced 2024-11-22 09:12:19 -05:00
Cache roster per account.
This commit is contained in:
parent
dd3f1a27da
commit
67fc48f9be
@ -208,7 +208,7 @@ module.exports = function (client, app) {
|
|||||||
|
|
||||||
contact.messages.add(message);
|
contact.messages.add(message);
|
||||||
if (!contact.lockedResource) {
|
if (!contact.lockedResource) {
|
||||||
contact.lockedResource = msg.from;
|
contact.lockedResource = msg.from.full;
|
||||||
} else if (msg.from !== contact.lockedResource) {
|
} else if (msg.from !== contact.lockedResource) {
|
||||||
contact.lockedResource = undefined;
|
contact.lockedResource = undefined;
|
||||||
}
|
}
|
||||||
@ -261,7 +261,7 @@ module.exports = function (client, app) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
client.on('disco:caps', function (pres) {
|
client.on('disco:caps', function (pres) {
|
||||||
if (pres.from !== client.jid && pres.caps.hash) {
|
if (pres.caps.hash) {
|
||||||
log.debug('Caps from ' + pres.from + ' ver: ' + pres.caps.ver);
|
log.debug('Caps from ' + pres.from + ' ver: ' + pres.caps.ver);
|
||||||
discoCapsQueue.push(pres);
|
discoCapsQueue.push(pres);
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,8 @@ function Client(opts) {
|
|||||||
WildEmitter.call(this);
|
WildEmitter.call(this);
|
||||||
|
|
||||||
this.config = opts || {};
|
this.config = opts || {};
|
||||||
|
this.jid = new JID();
|
||||||
|
|
||||||
this._idPrefix = uuid.v4();
|
this._idPrefix = uuid.v4();
|
||||||
this._idCount = 0;
|
this._idCount = 0;
|
||||||
|
|
||||||
@ -169,7 +171,7 @@ function Client(opts) {
|
|||||||
}, function (err, resp) {
|
}, function (err, resp) {
|
||||||
self.negotiatedFeatures.bind = true;
|
self.negotiatedFeatures.bind = true;
|
||||||
self.emit('session:bound', resp.bind.jid);
|
self.emit('session:bound', resp.bind.jid);
|
||||||
self.jid = resp.bind.jid;
|
self.jid = new JID(resp.bind.jid);
|
||||||
if (!features._extensions.session) {
|
if (!features._extensions.session) {
|
||||||
self.sessionStarted = true;
|
self.sessionStarted = true;
|
||||||
self.emit('session:started', resp.bind.jid);
|
self.emit('session:started', resp.bind.jid);
|
||||||
@ -372,10 +374,10 @@ Client.prototype.discoverBindings = function (server, cb) {
|
|||||||
|
|
||||||
Client.prototype.getCredentials = function () {
|
Client.prototype.getCredentials = function () {
|
||||||
var creds = this.config.credentials || {};
|
var creds = this.config.credentials || {};
|
||||||
var requestedJID = this.config.jid;
|
var requestedJID = new JID(this.config.jid);
|
||||||
|
|
||||||
var username = creds.username || requestedJID.slice(0, requestedJID.indexOf('@'));
|
var username = creds.username || requestedJID.local;
|
||||||
var server = creds.server || requestedJID.slice(requestedJID.indexOf('@') + 1);
|
var server = creds.server || requestedJID.domain;
|
||||||
|
|
||||||
var defaultCreds = {
|
var defaultCreds = {
|
||||||
username: username,
|
username: username,
|
||||||
@ -463,6 +465,7 @@ Client.prototype.sendPresence = function (data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Client.prototype.sendIq = function (data, cb) {
|
Client.prototype.sendIq = function (data, cb) {
|
||||||
|
var self = this;
|
||||||
data = data || {};
|
data = data || {};
|
||||||
cb = cb || function () {};
|
cb = cb || function () {};
|
||||||
if (!data.id) {
|
if (!data.id) {
|
||||||
@ -481,14 +484,30 @@ Client.prototype.sendIq = function (data, cb) {
|
|||||||
var timeoutCheck = this.timeoutMonitor.insure(function () {
|
var timeoutCheck = this.timeoutMonitor.insure(function () {
|
||||||
rescb({type: 'error', error: {condition: 'timeout'}}, null);
|
rescb({type: 'error', error: {condition: 'timeout'}}, null);
|
||||||
});
|
});
|
||||||
this.once('id:' + data.id, 'session', function (resp) {
|
|
||||||
|
var dest = new JID(data.to);
|
||||||
|
var allowed = {};
|
||||||
|
allowed[''] = true;
|
||||||
|
allowed[dest.full] = true;
|
||||||
|
allowed[dest.bare] = true;
|
||||||
|
allowed[dest.domain] = true;
|
||||||
|
allowed[self.jid.bare] = true;
|
||||||
|
allowed[self.jid.domain] = true;
|
||||||
|
|
||||||
|
var handler = function (resp) {
|
||||||
|
var source = resp.from;
|
||||||
|
if (!allowed[source.full]) return;
|
||||||
|
|
||||||
timeoutCheck.check_in();
|
timeoutCheck.check_in();
|
||||||
|
self.off('id:' + data.id, handler);
|
||||||
if (resp._extensions.error) {
|
if (resp._extensions.error) {
|
||||||
rescb(resp, null);
|
rescb(resp, null);
|
||||||
} else {
|
} else {
|
||||||
rescb(null, resp);
|
rescb(null, resp);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
this.on('id:' + data.id, 'session', handler);
|
||||||
}
|
}
|
||||||
this.send(new Iq(data));
|
this.send(new Iq(data));
|
||||||
|
|
||||||
@ -556,8 +575,15 @@ module.exports = Client;
|
|||||||
|
|
||||||
},{"../vendor/lodash":92,"./jid":3,"./stanza/bind":24,"./stanza/error":31,"./stanza/iq":34,"./stanza/message":36,"./stanza/presence":38,"./stanza/roster":42,"./stanza/sasl":44,"./stanza/session":45,"./stanza/sm":46,"./stanza/stream":47,"./stanza/streamError":48,"./stanza/streamFeatures":49,"./websocket":53,"async":54,"hostmeta":68,"node-uuid":77,"paddle":78,"sasl-anonymous":80,"sasl-digest-md5":82,"sasl-external":84,"sasl-plain":86,"sasl-scram-sha-1":88,"saslmechanisms":90,"wildemitter":91}],3:[function(require,module,exports){
|
},{"../vendor/lodash":92,"./jid":3,"./stanza/bind":24,"./stanza/error":31,"./stanza/iq":34,"./stanza/message":36,"./stanza/presence":38,"./stanza/roster":42,"./stanza/sasl":44,"./stanza/session":45,"./stanza/sm":46,"./stanza/stream":47,"./stanza/streamError":48,"./stanza/streamFeatures":49,"./websocket":53,"async":54,"hostmeta":68,"node-uuid":77,"paddle":78,"sasl-anonymous":80,"sasl-digest-md5":82,"sasl-external":84,"sasl-plain":86,"sasl-scram-sha-1":88,"saslmechanisms":90,"wildemitter":91}],3:[function(require,module,exports){
|
||||||
function JID(jid) {
|
function JID(jid) {
|
||||||
this.jid = jid;
|
jid = jid || '';
|
||||||
this.parts = {};
|
|
||||||
|
if (typeof jid === 'string') {
|
||||||
|
this.jid = jid;
|
||||||
|
this.parts = {};
|
||||||
|
} else {
|
||||||
|
this.jid = jid.jid;
|
||||||
|
this.parts = jid.parts;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JID.prototype = {
|
JID.prototype = {
|
||||||
@ -583,7 +609,7 @@ JID.prototype = {
|
|||||||
}
|
}
|
||||||
return this.parts.bare;
|
return this.parts.bare;
|
||||||
},
|
},
|
||||||
get resource () {
|
get resource() {
|
||||||
if (this.parts.resource) {
|
if (this.parts.resource) {
|
||||||
return this.parts.resource;
|
return this.parts.resource;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@ module.exports = HumanModel.define({
|
|||||||
type: 'contact',
|
type: 'contact',
|
||||||
props: {
|
props: {
|
||||||
inRoster: ['bool', true, false],
|
inRoster: ['bool', true, false],
|
||||||
|
owner: ['string', true, ''],
|
||||||
|
storageId: ['string', true, ''],
|
||||||
jid: ['string', true],
|
jid: ['string', true],
|
||||||
name: ['string', true, ''],
|
name: ['string', true, ''],
|
||||||
subscription: ['string', true, 'none'],
|
subscription: ['string', true, 'none'],
|
||||||
@ -195,6 +197,8 @@ module.exports = HumanModel.define({
|
|||||||
if (!this.inRoster) return;
|
if (!this.inRoster) return;
|
||||||
|
|
||||||
var data = {
|
var data = {
|
||||||
|
storageId: this.storageId,
|
||||||
|
owner: this.owner,
|
||||||
jid: this.jid,
|
jid: this.jid,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
groups: this.groups,
|
groups: this.groups,
|
||||||
|
@ -44,21 +44,6 @@ module.exports = BaseCollection.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
initialize: function (model, options) {
|
initialize: function (model, options) {
|
||||||
var self = this;
|
this.bind('change', this.sort, this);
|
||||||
this.bind('change', this.orderChange, this);
|
|
||||||
|
|
||||||
app.storage.roster.getAll(function (err, contacts) {
|
|
||||||
if (err) return;
|
|
||||||
|
|
||||||
contacts.forEach(function (contact) {
|
|
||||||
contact = new Contact(contact);
|
|
||||||
contact.inRoster = true;
|
|
||||||
contact.save();
|
|
||||||
self.add(contact);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
orderChange: function () {
|
|
||||||
this.sort();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -4,9 +4,13 @@
|
|||||||
var HumanModel = require('human-model');
|
var HumanModel = require('human-model');
|
||||||
var Contacts = require('./contacts');
|
var Contacts = require('./contacts');
|
||||||
var Contact = require('./contact');
|
var Contact = require('./contact');
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
|
|
||||||
module.exports = HumanModel.define({
|
module.exports = HumanModel.define({
|
||||||
|
initialize: function () {
|
||||||
|
this.bind('change:jid', this.loadContacts, this);
|
||||||
|
},
|
||||||
session: {
|
session: {
|
||||||
jid: ['object', true],
|
jid: ['object', true],
|
||||||
status: ['string', true, ''],
|
status: ['string', true, ''],
|
||||||
@ -30,6 +34,9 @@ module.exports = HumanModel.define({
|
|||||||
contact.save();
|
contact.save();
|
||||||
} else if (create) {
|
} else if (create) {
|
||||||
contact = new Contact(data);
|
contact = new Contact(data);
|
||||||
|
contact.inRoster = true;
|
||||||
|
contact.owner = this.jid.bare;
|
||||||
|
contact.storageId = uuid.v4();
|
||||||
contact.save();
|
contact.save();
|
||||||
this.contacts.add(contact);
|
this.contacts.add(contact);
|
||||||
}
|
}
|
||||||
@ -38,6 +45,23 @@ module.exports = HumanModel.define({
|
|||||||
this.contacts.remove(jid.bare);
|
this.contacts.remove(jid.bare);
|
||||||
app.storage.roster.remove(jid.bare);
|
app.storage.roster.remove(jid.bare);
|
||||||
},
|
},
|
||||||
|
loadContacts: function () {
|
||||||
|
if (!this.jid.bare) return;
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
app.storage.roster.getAll(this.jid.bare, function (err, contacts) {
|
||||||
|
if (err) return;
|
||||||
|
|
||||||
|
contacts.forEach(function (contact) {
|
||||||
|
contact = new Contact(contact);
|
||||||
|
contact.owner = self.jid.bare;
|
||||||
|
contact.inRoster = true;
|
||||||
|
contact.save();
|
||||||
|
self.contacts.add(contact);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
isMe: function (jid) {
|
isMe: function (jid) {
|
||||||
return jid.bare === this.jid.bare;
|
return jid.bare === this.jid.bare;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
/*global, IDBKeyRange*/
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// SCHEMA
|
// SCHEMA
|
||||||
@ -17,9 +18,10 @@ RosterStorage.prototype = {
|
|||||||
value: RosterStorage
|
value: RosterStorage
|
||||||
},
|
},
|
||||||
setup: function (db) {
|
setup: function (db) {
|
||||||
db.createObjectStore('roster', {
|
var store = db.createObjectStore('roster', {
|
||||||
keyPath: 'jid'
|
keyPath: 'storageId'
|
||||||
});
|
});
|
||||||
|
store.createIndex("owner", "owner", {unique: false});
|
||||||
},
|
},
|
||||||
transaction: function (mode) {
|
transaction: function (mode) {
|
||||||
var trans = this.storage.db.transaction('roster', mode);
|
var trans = this.storage.db.transaction('roster', mode);
|
||||||
@ -48,11 +50,12 @@ RosterStorage.prototype = {
|
|||||||
};
|
};
|
||||||
request.onerror = cb;
|
request.onerror = cb;
|
||||||
},
|
},
|
||||||
getAll: function (cb) {
|
getAll: function (owner, cb) {
|
||||||
cb = cb || function () {};
|
cb = cb || function () {};
|
||||||
var results = [];
|
var results = [];
|
||||||
|
|
||||||
var request = this.transaction('readonly').openCursor();
|
var store = this.transaction('readonly');
|
||||||
|
var request = store.index('owner').openCursor(IDBKeyRange.only(owner));
|
||||||
request.onsuccess = function (e) {
|
request.onsuccess = function (e) {
|
||||||
var cursor = e.target.result;
|
var cursor = e.target.result;
|
||||||
if (cursor) {
|
if (cursor) {
|
||||||
|
Loading…
Reference in New Issue
Block a user