From 6088eaf9dce0232bfac7786275ffc225478791bc Mon Sep 17 00:00:00 2001 From: JC Brand Date: Fri, 1 May 2015 14:43:31 +0200 Subject: [PATCH] Remove strophe.roster.js and update changelog. --- docs/CHANGES.rst | 5 + src/strophe.roster.js | 444 ------------------------------------------ 2 files changed, 5 insertions(+), 444 deletions(-) delete mode 100644 src/strophe.roster.js diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst index 6fdee51a6..a6ee2549a 100644 --- a/docs/CHANGES.rst +++ b/docs/CHANGES.rst @@ -1,6 +1,11 @@ Changelog ========= +0.9.4 (2015-05-01) +------------------ + +* Refactored in order to remove the strophe.roster.js dependency. [jcbrand] + 0.9.3 (2015-05-01) ------------------ diff --git a/src/strophe.roster.js b/src/strophe.roster.js deleted file mode 100644 index 5fe454d67..000000000 --- a/src/strophe.roster.js +++ /dev/null @@ -1,444 +0,0 @@ -/* - Copyright 2010, François de Metz -*/ -/** - * Roster Plugin - * Allow easily roster management - * - * Features - * * Get roster from server - * * handle presence - * * handle roster iq - * * subscribe/unsubscribe - * * authorize/unauthorize - * * roster versioning (xep 237) - */ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([ - "strophe" - ], function (Strophe) { - factory( - Strophe.Strophe, - Strophe.$build, - Strophe.$iq , - Strophe.$msg, - Strophe.$pres - ); - return Strophe; - }); - } else { - // Browser globals - factory( - root.Strophe, - root.$build, - root.$iq , - root.$msg, - root.$pres - ); - } -}(this, function (Strophe, $build, $iq, $msg, $pres) { - - Strophe.addConnectionPlugin('roster', { - /** Function: init - * Plugin init - * - * Parameters: - * (Strophe.Connection) conn - Strophe connection - */ - init: function(conn) { - this._connection = conn; - this._callbacks = []; - /** Property: items - * Roster items - * [ - * { - * name : "", - * jid : "", - * subscription : "", - * ask : "", - * groups : ["", ""], - * resources : { - * myresource : { - * show : "", - * status : "", - * priority : "" - * } - * } - * } - * ] - */ - this.items = []; - /** Property: ver - * current roster revision - * always null if server doesn't support xep 237 - */ - this.ver = null; - // Override the connect and attach methods to always add presence and roster handlers. - // They are removed when the connection disconnects, so must be added on connection. - var oldCallback, roster = this, _connect = conn.connect, _attach = conn.attach; - var newCallback = function(status) { - if (status == Strophe.Status.ATTACHED || status == Strophe.Status.CONNECTED) { - try { - // Presence subscription - conn.addHandler(roster._onReceivePresence.bind(roster), null, 'presence', null, null, null); - conn.addHandler(roster._onReceiveIQ.bind(roster), Strophe.NS.ROSTER, 'iq', "set", null, null); - } - catch (e) { - Strophe.error(e); - } - } - if (typeof oldCallback === "function") { - oldCallback.apply(this, arguments); - } - }; - - conn.connect = function(jid, pass, callback, wait, hold, route) { - oldCallback = callback; - if (typeof jid == "undefined") - jid = null; - if (typeof pass == "undefined") - pass = null; - callback = newCallback; - _connect.apply(conn, [jid, pass, callback, wait, hold, route]); - }; - - conn.attach = function(jid, sid, rid, callback, wait, hold, wind) { - oldCallback = callback; - if (typeof jid == "undefined") - jid = null; - if (typeof sid == "undefined") - sid = null; - if (typeof rid == "undefined") - rid = null; - callback = newCallback; - _attach.apply(conn, [jid, sid, rid, callback, wait, hold, wind]); - }; - - Strophe.addNamespace('ROSTER_VER', 'urn:xmpp:features:rosterver'); - Strophe.addNamespace('NICK', 'http://jabber.org/protocol/nick'); - }, - - /** Function: supportVersioning - * return true if roster versioning is enabled on server - */ - supportVersioning: function() { - return (this._connection.features && this._connection.features.getElementsByTagName('ver').length > 0); - }, - - /** Function: get - * Get Roster on server - * - * Parameters: - * (Function) userCallback - callback on roster result - * (String) ver - current rev of roster - * (only used if roster versioning is enabled) - * (Array) items - initial items of ver - * (only used if roster versioning is enabled) - * In browser context you can use sessionStorage - * to store your roster in json (JSON.stringify()) - */ - get: function(userCallback, ver, items) { - var attrs = {xmlns: Strophe.NS.ROSTER}; - if (this.supportVersioning()) { - // empty rev because i want an rev attribute in the result - attrs.ver = ver || ''; - this.items = items || []; - } - var iq = $iq({type: 'get', 'id' : this._connection.getUniqueId('roster')}).c('query', attrs); - return this._connection.sendIQ(iq, - this._onReceiveRosterSuccess.bind(this, userCallback), - this._onReceiveRosterError.bind(this, userCallback)); - }, - - /** Function: registerCallback - * register callback on roster (presence and iq) - * - * Parameters: - * (Function) call_back - */ - registerCallback: function(call_back) { - this._callbacks.push(call_back); - }, - - /** Function: findItem - * Find item by JID - * - * Parameters: - * (String) jid - */ - findItem : function(jid) { - try { - for (var i = 0; i < this.items.length; i++) { - if (this.items[i] && this.items[i].jid == jid) { - return this.items[i]; - } - } - } catch (e) { - Strophe.error(e); - } - return false; - }, - - /** Function: removeItem - * Remove item by JID - * - * Parameters: - * (String) jid - */ - removeItem : function(jid) { - for (var i = 0; i < this.items.length; i++) { - if (this.items[i] && this.items[i].jid == jid) { - this.items.splice(i, 1); - return true; - } - } - return false; - }, - - /** Function: subscribe - * Subscribe presence - * - * Parameters: - * (String) jid - * (String) message (optional) - * (String) nick (optional) - */ - subscribe: function(jid, message, nick) { - var pres = $pres({to: jid, type: "subscribe"}); - if (message && message !== "") { - pres.c("status").t(message).up(); - } - if (nick && nick !== "") { - pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up(); - } - this._connection.send(pres); - }, - - /** Function: unsubscribe - * Unsubscribe presence - * - * Parameters: - * (String) jid - * (String) message - */ - unsubscribe: function(jid, message) { - var pres = $pres({to: jid, type: "unsubscribe"}); - if (message && message !== "") - pres.c("status").t(message); - this._connection.send(pres); - }, - - /** Function: authorize - * Authorize presence subscription - * - * Parameters: - * (String) jid - * (String) message - */ - authorize: function(jid, message) { - var pres = $pres({to: jid, type: "subscribed"}); - if (message && message !== "") - pres.c("status").t(message); - this._connection.send(pres); - }, - - /** Function: unauthorize - * Unauthorize presence subscription - * - * Parameters: - * (String) jid - * (String) message - */ - unauthorize: function(jid, message) { - var pres = $pres({to: jid, type: "unsubscribed"}); - if (message && message !== "") - pres.c("status").t(message); - this._connection.send(pres); - }, - - /** Function: add - * Add roster item - * - * Parameters: - * (String) jid - item jid - * (String) name - name - * (Array) groups - * (Function) call_back - */ - add: function(jid, name, groups, call_back) { - var iq = $iq({type: 'set'}).c('query', {xmlns: Strophe.NS.ROSTER}).c('item', {jid: jid, - name: name}); - for (var i = 0; i < groups.length; i++) { - iq.c('group').t(groups[i]).up(); - } - this._connection.sendIQ(iq, call_back, call_back); - }, - - /** Function: update - * Update roster item - * - * Parameters: - * (String) jid - item jid - * (String) name - name - * (Array) groups - * (Function) call_back - */ - update: function(jid, name, groups, call_back) { - var item = this.findItem(jid); - if (!item) { - throw "item not found"; - } - var newName = name || item.name; - var newGroups = groups || item.groups; - var iq = $iq({type: 'set'}).c('query', {xmlns: Strophe.NS.ROSTER}).c('item', {jid: item.jid, - name: newName}); - for (var i = 0; i < newGroups.length; i++) { - iq.c('group').t(newGroups[i]).up(); - } - return this._connection.sendIQ(iq, call_back, call_back); - }, - - /** Function: remove - * Remove roster item - * - * Parameters: - * (String) jid - item jid - * (Function) call_back - */ - remove: function(jid, call_back) { - var item = this.findItem(jid); - if (!item) { - throw "item not found"; - } - var iq = $iq({type: 'set'}).c('query', {xmlns: Strophe.NS.ROSTER}).c('item', {jid: item.jid, - subscription: "remove"}); - this._connection.sendIQ(iq, call_back, call_back); - }, - - /** PrivateFunction: _onReceiveRosterSuccess - * - */ - _onReceiveRosterSuccess: function(userCallback, stanza) { - this._updateItems(stanza); - if (typeof userCallback === "function") { - userCallback(this.items); - } - }, - - /** PrivateFunction: _onReceiveRosterError - * - */ - _onReceiveRosterError: function(userCallback, stanza) { - userCallback(this.items); - }, - - /** PrivateFunction: _onReceivePresence - * Handle presence - */ - _onReceivePresence : function(presence) { - // TODO: from is optional - var jid = presence.getAttribute('from'); - var from = Strophe.getBareJidFromJid(jid); - var item = this.findItem(from); - // not in roster - if (!item) { - return true; - } - var type = presence.getAttribute('type'); - if (type == 'unavailable') { - delete item.resources[Strophe.getResourceFromJid(jid)]; - } else if (!type) { - // TODO: add timestamp - item.resources[Strophe.getResourceFromJid(jid)] = { - show : (presence.getElementsByTagName('show').length !== 0) ? Strophe.getText(presence.getElementsByTagName('show')[0]) : "", - status : (presence.getElementsByTagName('status').length !== 0) ? Strophe.getText(presence.getElementsByTagName('status')[0]) : "", - priority : (presence.getElementsByTagName('priority').length !== 0) ? Strophe.getText(presence.getElementsByTagName('priority')[0]) : "" - }; - } else { - // Stanza is not a presence notification. (It's probably a subscription type stanza.) - return true; - } - this._call_backs(this.items, item); - return true; - }, - - /** PrivateFunction: _call_backs - * - */ - _call_backs : function(items, item) { - for (var i = 0; i < this._callbacks.length; i++) { - this._callbacks[i](items, item); - } - }, - - /** PrivateFunction: _onReceiveIQ - * Handle roster push. - */ - _onReceiveIQ : function(iq) { - var id = iq.getAttribute('id'); - var from = iq.getAttribute('from'); - // Receiving client MUST ignore stanza unless it has no from or from = user's JID. - if (from && from !== "" && from != this._connection.jid && from != Strophe.getBareJidFromJid(this._connection.jid)) - return true; - var iqresult = $iq({type: 'result', id: id, from: this._connection.jid}); - this._connection.send(iqresult); - this._updateItems(iq); - return true; - }, - /** PrivateFunction: _updateItems - * Update items from iq - */ - _updateItems : function(iq) { - var query = iq.getElementsByTagName('query'); - if (query.length !== 0) { - this.ver = query.item(0).getAttribute('ver'); - var self = this; - Strophe.forEachChild(query.item(0), 'item', - function (item) { - self._updateItem(item); - } - ); - } - this._call_backs(this.items); - }, - - /** PrivateFunction: _updateItem - * Update internal representation of roster item - */ - _updateItem : function(item) { - var jid = item.getAttribute("jid"); - var name = item.getAttribute("name"); - var subscription = item.getAttribute("subscription"); - var ask = item.getAttribute("ask"); - var groups = []; - Strophe.forEachChild(item, 'group', - function(group) { - groups.push(Strophe.getText(group)); - } - ); - - if (subscription == "remove") { - this.removeItem(jid); - return; - } - - item = this.findItem(jid); - if (!item) { this.items.push({ - name : name, - jid : jid, - subscription : subscription, - ask : ask, - groups : groups, - resources : {} - }); - } else { - item.name = name; - item.subscription = subscription; - item.ask = ask; - item.groups = groups; - } - } - }); -}));