Mercurial > eldonilo > lightstring
diff lightstring.js @ 67:1c8f326fe3ef
Several fixes and comments updated/added.
author | Sonny Piers <sonny.piers@gmail.com> |
---|---|
date | Wed, 01 Feb 2012 22:45:48 +0100 |
parents | 2e8fbf3bce7f |
children | e1ccfb580228 |
line wrap: on
line diff
--- a/lightstring.js +++ b/lightstring.js @@ -35,7 +35,7 @@ var Lightstring = { stanzas: { stream: { open: function(aService) { - //FIXME no ending "/" - node-xmpp-bosh bug + //WORKAROUND: no ending "/" - node-xmpp-bosh bug return "<stream:stream to='" + aService + "'" + " xmlns='" + Lightstring.ns['jabber_client'] + "'" + " xmlns:stream='" + Lightstring.ns['streams'] + "'" + @@ -58,6 +58,9 @@ var Lightstring = { } } }, + /** + * @namespace Holds Lightstring plugins + */ plugins: {}, /** * @private @@ -78,7 +81,7 @@ var Lightstring = { DOM = this.parser.parseFromString(aString, 'text/xml').documentElement; } catch (e) { - alert(e); + //TODO: error } finally { return DOM; @@ -95,7 +98,7 @@ var Lightstring = { XML = this.serializer.serializeToString(aElement); } catch (e) { - //TODO throw error + //TODO: error } finally { return XML; @@ -124,7 +127,13 @@ var Lightstring = { Lightstring.Connection = function(aService) { if (aService) this.service = aService; + /** + * @namespace Holds connection events handlers + */ this.handlers = {}; + /** + * @namespace Holds connection iq callbacks + */ this.callbacks = {}; }; Lightstring.Connection.prototype = { @@ -140,9 +149,9 @@ Lightstring.Connection.prototype = { this.password = aPassword; if (!this.jid.bare) - throw 'Lightstring: Connection.jid is undefined.'; + return; //TODO: error if (!this.service) - throw 'Lightstring: Connection.service is undefined.'; + return; //TODO: error if(typeof(WebSocket) === "function") { this.socket = new WebSocket(this.service, 'xmpp'); @@ -151,39 +160,41 @@ Lightstring.Connection.prototype = { this.socket = new MozWebSocket(this.service, 'xmpp'); } else { - throw new Error('WebSocket not available.'); + return; //TODO: error } - var that = this; + var Conn = this; this.socket.addEventListener('open', function() { - //TODO: if (this.protocol !== 'xmpp') + if (this.protocol !== 'xmpp') + return; //TODO: error - var stream = Lightstring.stanzas.stream.open(that.jid.domain); - //TODO: Use Lightstring.Connection.send (problem with parsing steam); - that.socket.send(stream); + var stream = Lightstring.stanzas.stream.open(Conn.jid.domain); + //FIXME: Use Lightstring.Connection.send (problem with parsing steam); + Conn.socket.send(stream); var stanza = { XML: stream }; - that.emit('output', stanza); + Conn.emit('output', stanza); }); this.socket.addEventListener('error', function(e) { - that.emit('error', e.data); - console.log(e.data); + Conn.emit('disconnecting', e.data); + //TODO: error }); this.socket.addEventListener('close', function(e) { - that.emit('disconnected', e.data); + Conn.emit('disconnected', e.data); }); this.socket.addEventListener('message', function(e) { var stanza = new Lightstring.Stanza(e.data); - //TODO node-xmpp-bosh sends a self-closing stream:stream tag; it is wrong! - that.emit('input', stanza); + //FIXME: node-xmpp-bosh sends a self-closing stream:stream tag; it is wrong! + Conn.emit('input', stanza); if(!stanza.DOM) return; + var name = stanza.DOM.localName; - var name = stanza.DOM.localName; + //Authentication //FIXME SASL mechanisms and XMPP features can be both in a stream:features if (name === 'features') { //SASL mechanisms @@ -192,55 +203,45 @@ Lightstring.Connection.prototype = { var nodes = stanza.DOM.querySelectorAll('mechanism'); for (var i = 0; i < nodes.length; i++) stanza.mechanisms.push(nodes[i].textContent); - that.emit('mechanisms', stanza); + Conn.emit('mechanisms', stanza); } //XMPP features else { //TODO: stanza.features - that.emit('features', stanza); + Conn.emit('features', stanza); } } else if (name === 'challenge') { - that.emit('challenge', stanza); - } - else if (name === 'response') { - - + Conn.emit('challenge', stanza); } else if (name === 'failure') { - that.emit('failure', stanza); + Conn.emit('failure', stanza); } else if (name === 'success') { - that.emit('success', stanza); + Conn.emit('success', stanza); } - else if(name === 'stream') { - - - } - - //Iq callbacks else if (name === 'iq') { var payload = stanza.DOM.firstChild; if (payload) - that.emit('iq/' + payload.namespaceURI + ':' + payload.localName, stanza); + Conn.emit('iq/' + payload.namespaceURI + ':' + payload.localName, stanza); var id = stanza.DOM.getAttributeNS(null, 'id'); - if (!(id && id in that.callbacks)) + if (!(id && id in Conn.callbacks)) return; var type = stanza.DOM.getAttributeNS(null, 'type'); if (type !== 'result' && type !== 'error') - return; //TODO: emit an warning, perhaps. + return; //TODO: warning - var callback = that.callbacks[id]; + var callback = Conn.callbacks[id]; if (type === 'result' && callback.success) callback.success(stanza); else if (type === 'error' && callback.error) callback.error(stanza); - delete that.callbacks[id]; + delete Conn.callbacks[id]; } }); }, @@ -261,21 +262,21 @@ Lightstring.Connection.prototype = { if (stanza.DOM.tagName === 'iq') { var type = stanza.DOM.getAttributeNS(null, 'type'); if (type !== 'get' || type !== 'set') - ; //TODO: emit an error. + ; //TODO: error var callback = {success: aSuccess, error: aError}; var id = stanza.DOM.getAttributeNS(null, 'id'); if (!id) - ; //TODO: emit an warning. + ; //TODO: warning else this.callbacks[id] = callback; } else if (aSuccess || aError) - ; //TODO: callback can’t be called with non-iq stanza. + ; //TODO: warning (no callback without iq) - //TODO this.socket.send(stanza.XML); (need some work on Lightstring.Stanza) + //FIXME this.socket.send(stanza.XML); (need some work on Lightstring.Stanza) var fixme = Lightstring.DOM2XML(stanza.DOM); stanza.XML = fixme; this.socket.send(fixme); @@ -295,7 +296,7 @@ Lightstring.Connection.prototype = { for (var i = 0; i < arguments.length; i++) { var name = arguments[i]; if (!(name in Lightstring.plugins)) - continue; //TODO: throw an error? + continue; //TODO: error var plugin = Lightstring.plugins[name]; @@ -342,7 +343,7 @@ Lightstring.Connection.prototype = { for (var i = 0; i < handlers.length; i++) { ret = handlers[i].call(this, aData); if (typeof ret !== 'boolean') - return; //TODO: emit a big error! + return; //TODO: error if (ret) return;