GithubHelp home page GithubHelp logo

strophe / strophejs Goto Github PK

View Code? Open in Web Editor NEW
1.4K 77.0 356.0 3.6 MB

Strophe.js is an XMPP library for JavaScript

Home Page: http://strophe.im/strophejs

License: MIT License

JavaScript 99.12% Makefile 0.88%
xmpp xmpp-library javascript

strophejs's People

Contributors

aeon avatar alexhancock avatar benlangfeld avatar benv avatar damencho avatar dependabot[bot] avatar diegocr avatar dodo avatar exavolt avatar francois2metz avatar ggozad avatar gordin avatar greenkeeperio-bot avatar guusdk avatar icholy avatar jcbrand avatar lboynton avatar learts avatar mattblickem-evoluno avatar metajack avatar mweibel avatar omichelsen avatar paulsd avatar saeedseyfi avatar sualko avatar sudrien avatar thepug avatar twonds avatar vinaynadig avatar vog avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

strophejs's Issues

60 seconds of inactivity timesout, but the connect callback isn't called to change status

With websockets, if there's absolutely no traffic for 60 seconds then the connection gets dropped, and I think that's caused by Strophe, not the XMPP server, am I right?

In either case, I don't see my Strophe connection's callback get called, despite the fact that the connection's status changed (so I would need to update the browser's display).

But maybe it's the server that's doing it, and it's dropping the connection so silently that Strophe doesn't notice.

Is that the case? Please advise.

Similarly, I tried stopping my server process completely, so obviously the Strophe client must have disconnected, yet connect's callback wasn't called. Is it because Strophe doesn't want the connection to be deemed as closed just because of a temporary disconnect?

If that's the case, how do I configure Strophe to consider websocket disconnect as a disconnect from the server? Because that's how I've configured my server (a temporary disconnect will close the session).

Also, how do I configure how much time needs to pass before Strophe considers a connection as disconnected?

Also, how do I change the 60-seconds timeout duration?

XEPs and RFCs support page with version

Don't have 'xmlunescape' method

Hi there, I see 'xmlescape' method in library, but there isn't 'xmlunescape' method

Can you please add it, here is an implementation

/*  Function: xmlunescape
 *  Unexcapes invalid xml characters.
 *
 *  Parameters:
 *     (String) text - text to unescape.
 *
 *  Returns:
 *      Unescaped text.
 */
xmlunescape: function(text)
{
    text = text.replace(/\&/g, "&");
    text = text.replace(/&lt;/g,  "<");
    text = text.replace(/&gt;/g,  ">");
    text = text.replace(/&apos;/g,  "'");
    text = text.replace(/&quot;/g,  "\"");
    return text;
},

Punjab and Openfire

I am using strophe for the web and punjab and openfire for the server.

My strophejs version is master from source. I've been experiencing weird occurrences for session binding. If I send a message and reload the session suddenly gets dropped. When I just keep refreshing no message sent, All goes well.

I also noticed that the rid keep increment correctly but there are also times that it goes back to the first rid. I have put the initial rid and sid on a cookie, then I use those data on my javascript code.

It is just weird that sometimes it works well, and sometimes it does not. Or maybe I do not understand pre-binding very well. It pre-binding done like authenticate together with the web login then store the rid,sid and jid in cookie. That cookie will be reused by the strophe on each page reload? Or do I have to prebind every page refresh?

Another weird thing is that strophe sends multiple messages when I send one message and reload the page immediately after sending. It sends like 2 or 3 dupes and the RID's are all the same. After that I lost connection.

But when I view the page (without sending anything) and keep on reloading it, everything works well. Still keeps sending dupes, but also not getting disconnected.

Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable. in IE / Chrome

We use strophe.js in our application, after some minutes in Chrome/IE (not in Firefox) when the application try to reconnect , strophe.js throw the following exception

 Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable. 

according to SO http://stackoverflow.com/questions/17182816/ajax-php-javascript-error-when-using-post-method it seems the solution is to add

                req.xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

just after the req.xhr.open (line 2247)

item-not-found error caused by long term request

If the first request (not an empty polling request) from queue hangs (does not get response immediately because of request size, network delay, whatever), then it makes possible to send as many subsequent requests from queue as possible till the first request gets response at last. This, in turn, is causing session drop with item-not-found error (http status 404).

This is caused by calling _processRequest() directly from _onIdle() instead of calling _throttledRequestHandler() (here is fix):

3572c3572
<             this._throttledRequestHandler();

---
>             this._processRequest(this._requests.length - 1);

Status issue when connecting a down server

When the XMPP server is down and a client try to connect, after 5 attempts it call the _doDisconnect method.

_doDisconnect: function ()
{
    /* ... */

    // tell the parent we disconnected
    if (this.connected) {
        this._changeConnectStatus(Strophe.Status.DISCONNECTED, null);
        this.connected = false;
    }

   /* ... */
},

The problem is that the _changeConnectStatus is surrounded by a this.connected check and Strophe will stay forever in a connecting status.
What the point of this check ? Could it be removed without any side effect ?

AMD Support

I created a pull request in the old repository for AMD support (metajack/strophejs#99). Is this something that people are interested in? I can rebase my changes on the current master if so and submit a PR.

Base64 encoding problem in some older browsers.. (base64.js)

Hi,

Even though the base64 encoder works in most modern browsers, we had a problem with my password, when it base64 encodes it via an older browser (Ant galio).

The problem lies in the way not-a-number (NaN) is handled.
In Chrome and other modern browsers shifting NaN gives 0. Whereas in Ant Galio: NaN >> 4 yields e.g. -134217728 (random undefined number in memory).

So in case of enc2 = ((chr1 & 3) << 4) | (chr2 >> 4) it will effectively give: enc2 = ((chr1 & 3) << 4)

The fix is therefore straight forward. In line 30/31 in base64.js (master), we just need to take care of the encoded2 part. So adding this one line in base64.js will fix it. Of course it still works flawless in all the modern browsers as well. :-)


if (isNaN(chr2)) {
enc2 = ((chr1 & 3) << 4); // this line need to be added
enc3 = enc4 = 64;
}

Question: having big trouble implementing auto-reconnect on websocket

I don't know where to place the addHandler statements. Anywhere I try, problems errupt. deleteHandler doesn't seem to be doing anything. And I'll file a bug about this soon. So I have this question for the developers (the answer is not in the documentation, so please answer):

If I execute Connection.connect(...) 10 times while disconnected, and then the connection happens, how many times will the function(status) callback be executed every time the status changes from then on?

connection.deleteHandler does absolutely nothing in websockets jabber connection

connection is my jabber connection variable, handler is my handler variable which I got as a return value from the last addHandler, and so I run: connection.deleteHandler(handler) and absolutely nothing happens, the handler doesn't disappear, the handler just keeps on handling.

I tried it many times, and I'm positive I'm right. I kindly ask you to try it on a websockets jabber connection.

Last time I posted this error, someone told me: "put it up on a plnkr, and show us" - but I would have to post a Jabber user's credentials in public to do that. I would also need to find to Jabber server open to registrations that also won't be angry if I post my credentials in public. So I ask you, please, try it once, and if it fails then tell me to post it in public. But it won't fail, I'm positive. You'll see.

Register user from web client using locally hosted openfire

when I try to register from web client using locally hosted openfire I got registration failed without any error notification or error stanza .
What is the reason behind this registration failed?
I have response of message below:

SENT: <body rid='2426896877' xmlns='http://jabber.org/protocol/httpbind' to='localhost' xml:lang='en' wait='60' hold='1' content='text/xml; charset=utf-8' ver='1.6' xmpp:version='1.0' xmlns:xmpp='urn:xmpp:xbosh'/>
RECV: <body xmlns='http://jabber.org/protocol/httpbind' xmlns:stream='http://etherx.jabber.org/streams' authid='99f5151b' sid='99f5151b' secure='true' requests='2' inactivity='30' polling='5' wait='60' hold='1' ack='2426896877' maxpause='300' ver='1.6'><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5<mechanism>JIVE-SHAREDSECRET<mechanism>PLAIN<mechanism>ANONYMOUS<mechanism>CRAM-MD5<compression xmlns='http://jabber.org/features/compress'>zlib<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></stream:features></body>

How Filetransfer is done using stroph

I have seen that when we login to xmpp server using jid(jabber id) after successful login our connection.jid and our loginjid is difference some extra information is added like jid@somedomain/randomvalue.
I want to know that is that extra part and what is the significance of that in xmpp chat.

Digest MD5 error due to Base64.js

When using SASL Digest-MD5 mechanism, the user will recieve a bad-protocol error because the second challenge response will be:

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>AA==</response>

instead of:

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'></response>

I believe I have traced this down to the Base64 encode implementation. In Base64.js the encode function is implemented as a do while(), this means that the empty challenge response of "" gets encoded to AA== which then gets sent to the server and results in failure. This implementation of Base64 encoding does not cause this error.
http://www.webtoolkit.info/javascript-base64.html#.Up0Pr8Try4E

addHandler issue with register plugin

Hi,

I'm using Strophe.js AMD with the Register plugin (works perfect so far) and I have noticed that the addHandler method/function does not get fired until the connection status becomes CONNECTED?

I can understand why you would have it firing up AFTER being connected, but I think in the case of registration, it would be useful to have this method fire up at any given stage (i.e. before being connected) so that you can analyse the server response more accurately and better instead of relying on the CONNECTION status.

Quite frustrating when you realise that you have to work with the RAW OUTPUT instead of the addHandler method.

Please see the register plugin page where it shows you how to deal with server response (which is now the right way to do IMO): https://github.com/metajack/strophejs-plugins/tree/master/register

If anybody else has encountered this issue, please comment and share your thoughts and solutions.

Farax

Connection over 3G

Hi, I have problems with 3G connection to xmpp server. When I try to login, status change to connecting but nothing more happens. Over WiFi connection all works well and with native apps (no web/js code) connection works.

bind

XMPP Resource bind, doesn't allow other elements to be returned, and it assumes that bind is immediately returned which makes the server have to do a synchronous response for bind, which is not correct. It means that offline messages can't be flushed at that point in time.

EM

Populate element ...

Hello guys.

I have a noob question - I'm working on ban list admin tool. Can someone tell me how is the response from the iq request parsed, as I need to populate the list. I've managed to create the iq request and to recieve the list of baned users ... but how and more precisly where can I populate the table?

getUniqueId is documented as resetting to 0 but actually resets to a random number

Hi! I'm doing a security review of Cryptocat, which uses Strophe (https://github.com/cryptocat/cryptocat/blob/master/src/core/js/lib/strophe/strophe.js). I see that getUniqueId is documented as "The counter resets to 0 for every new connection for the same reason." (the reason being nicer debug messages, especially when looking at multiple similar runs), but the implementation (

this._uniqueId = Math.round(Math.random() * 10000);
) actually resets it to a random number between 0 (inclusive) and 10,000 (exclusive).

Get last RID before page unload

Is it possible to get the last RID and store it into local storage so I can continue the session after the page reload? I always get disconnected every time I do a few page reload.

Any suggestions?

iq 'from' attributes are not checked everywhere

I've been looking into XMPP implementations and whether they verify the source of iq replies. See http://mail.jabber.org/pipermail/jdev/2014-January/089824.html and http://mail.jabber.org/pipermail/jdev/2014-January/089838.html for more discussion.

The sendIQ function in https://github.com/strophe/strophejs/blob/master/src/core.js#L1938 does not verify whether the from on an incoming iq packet matches the to from the outgoing packet. This means for example that a roster reply is not checked to actually originate from the user's server. An attacker can, if timed right, spoof the roster for a user by making sure their fake reply reaches strophe before the real reply does. This can also lead to spoofing of vcards, intercepting file transfers, etc.

I have verified that calling connection.roster.get(function (roster) ... ) does indeed cause the callback to be called even when the origin is not the user's server.

Bump up version?

Hi Guys,

Should we not bump up the version to 1.0.3 or 1.1.0 (because of the major changes) and update the Changelog? Websockets have been implemented and core.js and a lot of other changes have happened.

Right now it seems like a mess. If you already have 1.0.2 you do not think that something have happened since that.

Latest versions break reconnecting after lost connection

It looks like the latest Strophe has some issues with dealing with reconnects due to what appear to be one or more bugs in the new code.

Firstly the hitError function:

   _hitError: function (reqStatus)
    {
        this.errors++;
        Strophe.warn("request errored, status: " + reqStatus +
                     ", number of errors: " + this.errors);
        if (this.errors > 4) {
            this._onDisconnectTimeout();
        }
    },

This now lives in Strophe.Bosh, however errors is only initialised to 0 in Strophe.Connection, so errors is NaN here, and onDisconnectTimeout() is therefore never called.
However, even with this fixed, it seems there is another issue in onDisconnectTimeout, which in the latest code looks like this:

  _onDisconnectTimeout: function ()
    {
        var req;
        while (this._requests.length > 0) {
            req = this._requests.pop();
            req.abort = true;
            req.xhr.abort();
            // jslint complains, but this is fine. setting to empty func
            // is necessary for IE6
            req.xhr.onreadystatechange = function () {}; // jshint ignore:line
        }
    },

The old version of strophe looked like this:

_onDisconnectTimeout: function ()
    {
        Strophe.info("_onDisconnectTimeout was called");

        // cancel all remaining requests and clear the queue
        var req;
        while (this._requests.length > 0) {
            req = this._requests.pop();
            req.abort = true;
            req.xhr.abort();
            // jslint complains, but this is fine. setting to empty func
            // is necessary for IE6
            req.xhr.onreadystatechange = function () {};
        }

        // actually disconnect
        this._doDisconnect();

        return false;
    },

So the old version explicitly called doDisconnect which reset the state to DISCONNECTED allowing any code that was designed to listen to this , and attempt to reconnect to get called.

What appears to happen now is that after max errors is reached attempt to reconnect, strophe simply stops trying, without raising any state change that could alert the programmer that they now need to explicitly try to reconnect, as strophe has now officially given up the attempt.

What I do to reproduce this problem is:

  • Load page and Connect to ejabberd.
  • Once the connection has started, and some communication has occurred, turn off my wireless connection, thus breaking the strophe connection to the server.
  • I have some code that detects the loss of connection via intermittent pings, when the first ping times out, the code calls disconnect.
  • The disconnect notification arrives in my client code, and now triggers an attempt to
    reconnect.
  • After several attempts to reconnect, strophe gives up, and fires no more state changes, which prevents recovery in the client code. Turning the wireless back on after this state has been reached will not lead to a reconnect, and an explicit page reload is required.

I have removed the backoff on resend (or rather set it to a fixed 5000 ms) which speeds up the reproduction of the problem, but may be creating other issue, although AFAIKs the code mentioned above has problems irrespective of this.
I attempted to put the doDisconnect call back in
_onDisconnectTimeout, but had some issues with that (seemed I ended up with two attempts to reconnect, but that may have been a bug in my own reconnect code).

Note that the error I get in this code, and the code calling hitError:

   if (reqStatus === 0 ||
                    (reqStatus >= 400 && reqStatus < 600) ||
                    reqStatus >= 12000) {
                    this._hitError(reqStatus);
                    if (reqStatus >= 400 && reqStatus < 500) {
                        this._conn._changeConnectStatus(Strophe.Status.DISCONNECTING,
                                                  null);
                        this._conn._doDisconnect();
                    }
                }

is reqStatus 0. If I was getting an error code in the 400 to 500 range, this would probably all work, but the 0 reqStatus code means the push into disconnecting state, and call to doDisconnect doesn't happen (which makes sense, but the hitError then needs to be able to eventually trigger a doDisconnect I think).

Please let me know if you need more details.

TypeError: req is undefined

Hi,

I got following javascript error, when i try to login converse.js. when i run separately, it works fine.
When i integrate with my application it make the problem. I think the problem is with "Function.prototype.bind" in strophe.js. Can you please help me to fix this.

TypeError: req is undefined @ http://localhost:8033/js/converse/components/strophe/strophe.js:3045

_onRequestStateChange: function (func, req)
{
Strophe.debug("request id " + req.id +
"." + req.sends + " state changed to " +
req.xhr.readyState);

Thanks in advance.

attach() for websockets?

Is this possible to I attach Strophe to a an existing session via websockets?

I need this to auto-login users that are already logged in an app.

Under what circumstances do all Handlers get flushed?

I noticed that sometimes when I call connection.disconnect(), the handlers disappear (when I reconnect, the handlers are not there). But not always.

I would like to know when Handlers get flushed away, so I can plan my software accordingly.

Thanks

How do you compare to node-xmpp

Hi,

I'm starting a project that requires to develop a client side xmpp chat. I found node-xmpp and strophe.js. After some research, it is not perfectly clear which one I should pick.

Can you explain what the main differences are and which one is most suited for browser development?

Thanks a lot

SCRAM-SHA-1 auth is not working when initializing multiple connections at the same time

Test case/demo:
https://gist.github.com/lpetrov/8351277

Expected to see both calls to result in a Connected message in the console.
What I got instead, was Auth fail for the first call and Connected for the second one.

I'd tried to trace the problem, but it got really messy when i got into the SASLSHA1's onChallenge black magic :)

The most interesting thing that I'd found is that both AUTH stanzas are almost identical (same generated hashes).
So, maybe this has to do something with the global (missing 'var') variables somewhere in the code?

For now, my solution is to disable the SASLSHA1 locally and use MD5.

Allowing wildcard in connection URI to void browser's concurrent connection

Every browser has a concurrent connection limit to a domain. To avoid this and allow multiple connection from each browser's tab, we should allow wildcard in connection uri: first browser's tab would connect to myservice1.mywebsite.com, second myservice2.mywebsite.com, n myserviceN.mywebsite.com.

What do you think about?

load presence after attaching the connection

i have been dealing with these issue for a while and i could not get any result. I want to resume the connection when the page is refresh. I use the attach function, but for some reason it fails to load the presence of each roster. Please need help. I could see from the console that the it has queried the roster but the connection stops there.

Add jshint linting

Hi,

by accident I ran a jshint on the Strophe source files and it seems that the code contains quite some unused and undefined variables (among other things).
I think it would be good to define a .jshintrc file with the Strophe standards and clean up the things.

Example output:

src/base64.js: line 5, col 11, 'Base64' is defined but never used.

src/bosh.js: line 8, col 1, Bad option value.
src/bosh.js: line 419, col 56, Don't make functions within a loop.
src/bosh.js: line 441, col 13, 'body' is not defined.
src/bosh.js: line 442, col 18, 'i' is not defined.
src/bosh.js: line 442, col 25, 'i' is not defined.
src/bosh.js: line 442, col 42, 'i' is not defined.
src/bosh.js: line 443, col 26, 'i' is not defined.
src/bosh.js: line 444, col 30, 'i' is not defined.
src/bosh.js: line 445, col 25, 'body' is not defined.
src/bosh.js: line 452, col 25, 'body' is not defined.
src/bosh.js: line 452, col 41, 'i' is not defined.
src/bosh.js: line 459, col 37, 'body' is not defined.
src/bosh.js: line 462, col 37, 'body' is not defined.
src/bosh.js: line 467, col 13, 'time_elapsed' is not defined.
src/bosh.js: line 475, col 17, 'time_elapsed' is not defined.
src/bosh.js: line 12, col 41, 'document' is defined but never used.
src/bosh.js: line 12, col 41, 'console' is defined but never used.
src/bosh.js: line 12, col 41, 'Base64' is defined but never used.
src/bosh.js: line 12, col 41, 'MD5' is defined but never used.
src/bosh.js: line 12, col 41, '$msg' is defined but never used.
src/bosh.js: line 12, col 41, '$iq' is defined but never used.
src/bosh.js: line 12, col 41, '$pres' is defined but never used.

src/core.js: line 8, col 1, Bad option value.
src/core.js: line 1601, col 35, Don't make functions within a loop.
src/core.js: line 575, col 13, 'parser' is not defined.
src/core.js: line 575, col 26, 'DOMParser' is not defined.
src/core.js: line 576, col 13, 'node' is not defined.
src/core.js: line 576, col 20, 'parser' is not defined.
src/core.js: line 578, col 13, 'node' is not defined.
src/core.js: line 579, col 13, 'node' is not defined.
src/core.js: line 580, col 13, 'node' is not defined.
src/core.js: line 582, col 16, 'node' is not defined.
src/core.js: line 3157, col 18, 'core_hmac_sha1' is not defined.
src/core.js: line 3159, col 11, 'core_hmac_sha1' is not defined.
src/core.js: line 3159, col 43, 'binb2str' is not defined.
src/core.js: line 3165, col 10, 'binb2str' is not defined.
src/core.js: line 3167, col 17, 'core_hmac_sha1' is not defined.
src/core.js: line 3168, col 17, 'str_hmac_sha1' is not defined.
src/core.js: line 3169, col 23, 'core_hmac_sha1' is not defined.
src/core.js: line 3169, col 38, 'str_sha1' is not defined.
src/core.js: line 3169, col 47, 'binb2str' is not defined.
src/core.js: line 3170, col 49, 'b64_hmac_sha1' is not defined.
src/core.js: line 3176, col 43, 'binb2str' is not defined.
src/core.js: line 661, col 94, 'children' is defined but never used.
src/core.js: line 661, col 101, 'child' is defined but never used.
src/core.js: line 866, col 30, 'msg' is defined but never used.
src/core.js: line 866, col 25, 'level' is defined but never used.
src/core.js: line 1807, col 29, 'elem' is defined but never used.
src/core.js: line 1830, col 30, 'elem' is defined but never used.
src/core.js: line 1847, col 29, 'data' is defined but never used.
src/core.js: line 1864, col 30, 'data' is defined but never used.
src/core.js: line 2396, col 30, 'auth_str' is defined but never used.
src/core.js: line 2396, col 47, 'hashed_auth_str' is defined but never used.
src/core.js: line 2537, col 30, 'elem' is defined but never used.
src/core.js: line 2751, col 37, 'elem' is defined but never used.
src/core.js: line 2900, col 17, 'body' is defined but never used.
src/core.js: line 2900, col 31, 'time_elapsed' is defined but never used.
src/core.js: line 2992, col 28, 'connection' is defined but never used.
src/core.js: line 3018, col 46, 'challenge' is defined but never used.
src/core.js: line 3018, col 35, 'connection' is defined but never used.
src/core.js: line 3072, col 73, 'challenge' is defined but never used.
src/core.js: line 3267, col 53, 'challenge' is defined but never used.
src/core.js: line 3267, col 42, 'connection' is defined but never used.
src/core.js: line 12, col 41, 'XMLHttpRequest' is defined but never used.
src/core.js: line 12, col 41, 'Strophe' is defined but never used.
src/core.js: line 12, col 41, '$build' is defined but never used.
src/core.js: line 12, col 41, '$msg' is defined but never used.
src/core.js: line 12, col 41, '$iq' is defined but never used.
src/core.js: line 12, col 41, '$pres' is defined but never used.

src/md5.js: line 14, col 8, 'MD5' is defined but never used.

src/sha1.js: line 16, col 18, 'b64_sha1' is defined but never used.
src/sha1.js: line 17, col 18, 'str_sha1' is defined but never used.
src/sha1.js: line 18, col 23, 'b64_hmac_sha1' is defined but never used.
src/sha1.js: line 19, col 23, 'str_hmac_sha1' is defined but never used.

src/websocket.js: line 106, col 9, 'ns' is not defined.
src/websocket.js: line 107, col 14, 'i' is not defined.
src/websocket.js: line 107, col 21, 'i' is not defined.
src/websocket.js: line 107, col 50, 'i' is not defined.
src/websocket.js: line 108, col 13, 'e' is not defined.
src/websocket.js: line 108, col 34, 'i' is not defined.
src/websocket.js: line 109, col 17, 'e' is not defined.
src/websocket.js: line 109, col 45, 'ns' is not defined.
src/websocket.js: line 111, col 19, 'e' is not defined.
src/websocket.js: line 112, col 24, 'e' is not defined.
src/websocket.js: line 114, col 29, 'e' is not defined.
src/websocket.js: line 118, col 9, 'errorString' is not defined.
src/websocket.js: line 121, col 13, 'errorString' is not defined.
src/websocket.js: line 123, col 13, 'errorString' is not defined.
src/websocket.js: line 127, col 13, 'errorString' is not defined.
src/websocket.js: line 130, col 23, 'errorString' is not defined.
src/websocket.js: line 160, col 27, 'WebSocket' is not defined.
src/websocket.js: line 238, col 35, 'DOMParser' is not defined.
src/websocket.js: line 254, col 70, 'error' is not defined.
src/websocket.js: line 259, col 28, 'DOMParser' is not defined.
src/websocket.js: line 275, col 40, 'WebSocket' is not defined.
src/websocket.js: line 394, col 18, 'i' is not defined.
src/websocket.js: line 394, col 25, 'i' is not defined.
src/websocket.js: line 394, col 42, 'i' is not defined.
src/websocket.js: line 395, col 26, 'i' is not defined.
src/websocket.js: line 397, col 30, 'i' is not defined.
src/websocket.js: line 402, col 39, 'i' is not defined.
src/websocket.js: line 439, col 13, 'data' is not defined.
src/websocket.js: line 440, col 24, 'DOMParser' is not defined.
src/websocket.js: line 440, col 52, 'data' is not defined.
src/websocket.js: line 446, col 13, 'data' is not defined.
src/websocket.js: line 447, col 24, 'DOMParser' is not defined.
src/websocket.js: line 447, col 52, 'data' is not defined.
src/websocket.js: line 342, col 29, 'event' is defined but never used.
src/websocket.js: line 11, col 41, 'setTimeout' is defined but never used.
src/websocket.js: line 11, col 41, 'console' is defined but never used.
src/websocket.js: line 11, col 41, 'XMLHttpRequest' is defined but never used.
src/websocket.js: line 11, col 41, 'ActiveXObject' is defined but never used.
src/websocket.js: line 11, col 41, 'Base64' is defined but never used.
src/websocket.js: line 11, col 41, 'MD5' is defined but never used.
src/websocket.js: line 11, col 41, '$msg' is defined but never used.
src/websocket.js: line 11, col 41, '$iq' is defined but never used.
src/websocket.js: line 11, col 41, '$pres' is defined but never used.

118 errors

While for sure some of them are entirely just global definitions which are missing in the source files, there are also very valid ones and IMO we should fix them to make Strophe more robust and also (in case of the unused variables) less big in the size.

Do you agree with me?

  • Michael

1.0.3 release

We started to use Strophe 1.0.2 but encountered a bug related to double-escaping which is specific to this version and is already fixed in the master branch. We then tried to revert to 1.0.1, but without success, because of a problem when disconnecting which is also already fixed in master.

Are you planning to release version 1.0.3 anytime soon? We use bower for the project dependencies and would like to add the new version to the bower-strophejs repo.

WebSocket support

I open this discussion to pursue the one in metajack's branch (metajack/strophejs#68)
I agree with michfield, I would also suggest to merge @Gordin branch.
Is there any reason not to merge this branch/support websocket in strophe yet?

Not accepting messages if stanza doesn't have type attribute.

I was working on converse plugin(for php and Openfire) for Multi user chat. But there is one restriction on line number 1338, that checks if stanza has type attribute or not, and it filter outs such stanzas. So in muc chat we were not gettings messages of new room. Can you please check this issue? I have removed that line in my code and its working fine. Please check the code of isMatch function in strophe.js. I know this attribute is optional but recommended, but still so many chat clients are not supporting this attribute. Let me know if I can help with this. Thanks

Strophe doesn't send disconnect in case of unreachable URL

Greetings!!

Strophe does not return a disconnect in case the URL being connected to is unreachable, it is trying reconnect 5 times but at the end of the retries, no disconnect event is passed to the calling API.

I tried connecting to an unavailable URL for fail over testing of my application, but in case the server is unresponsive I do not get a disconnect...here are the logs.

11:39:14.131 "start" poc:9
11:39:39.646 POST http://server.unreachable.com/ [669ms]
11:39:39.589 "Strophe:0:request id 1.1 state changed to 2" poc:29
11:39:39.590 "Strophe:0:request id 1.1 state changed to 4" poc:29
11:39:39.590 "Strophe:3:request id 1.1 error 0 happened" poc:29
11:39:39.590 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29
11:39:39.590 "Strophe:0:_throttledRequestHandler called with 1 requests" poc:29
11:39:39.591 "Strophe:0:request id 2.1 posting" poc:29
11:39:39.592 "Strophe:0:request id 2.1 state changed to 1" poc:29
11:40:01.261 "Strophe:0:request id 2.2 state changed to 2" poc:29
11:40:01.261 "Strophe:0:request id 2.2 state changed to 4" poc:29
11:40:01.261 "Strophe:3:request id 2.2 error 0 happened" poc:29
11:40:01.262 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29
11:40:01.262 "Strophe:0:_throttledRequestHandler called with 1 requests" poc:29
11:40:01.263 "Strophe:0:request id 3.2 posting" poc:29
11:40:01.263 "Strophe:0:request id 3.2 state changed to 1" poc:29
11:40:09.317 POST http://server.unreachable.com/ [255ms]
11:40:43.508 "Strophe:0:request id 3.3 state changed to 2" poc:29
11:40:43.509 "Strophe:0:request id 3.3 state changed to 4" poc:29
11:40:43.509 "Strophe:3:request id 3.3 error 0 happened" poc:29
11:40:43.509 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29
11:40:43.510 "Strophe:0:_throttledRequestHandler called with 1 requests" poc:29
11:40:43.510 "Strophe:0:request id 4.3 posting" poc:29
11:40:43.511 "Strophe:0:request id 4.3 state changed to 1" poc:29
11:41:10.564 POST http://server.unreachable.com/ [255ms]
11:41:33.270 "Strophe:0:request id 4.4 state changed to 2" poc:29
11:41:33.270 "Strophe:0:request id 4.4 state changed to 4" poc:29
11:41:33.270 "Strophe:3:request id 4.4 error 0 happened" poc:29
11:41:33.270 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29
11:41:33.271 "Strophe:0:_throttledRequestHandler called with 1 requests" poc:29
11:41:33.271 "Strophe:0:request id 5.4 posting" poc:29
11:41:33.271 "Strophe:0:request id 5.4 state changed to 1" poc:29
11:42:37.326 POST http://server.unreachable.com/ [730ms]
11:43:19.756 "Strophe:0:request id 5.5 state changed to 2" poc:29
11:43:19.757 "Strophe:0:request id 5.5 state changed to 4" poc:29
11:43:19.757 "Strophe:3:request id 5.5 error 0 happened" poc:29
11:43:19.757 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29
11:43:19.757 "Strophe:0:_throttledRequestHandler called with 1 requests" poc:29
11:43:19.758 "Strophe:0:request id 6.5 posting" poc:29
11:43:19.758 "Strophe:0:request id 6.5 state changed to 1" poc:29
11:44:25.812 POST http://server.unreachable.com/ [666ms]
11:45:08.188 "Strophe:0:request id 6.6 state changed to 2" poc:29
11:45:08.188 "Strophe:0:request id 6.6 state changed to 4" poc:29
11:45:08.189 "Strophe:0:removing request" poc:29
11:45:08.189 "Strophe:0:_throttledRequestHandler called with 0 requests" poc:29
11:45:08.189 "Strophe:0:request id 6 should now be removed" poc:29
11:45:08.189 "Strophe:3:request id 6.6 error 0 happened" poc:29
11:45:08.190 "Strophe:2:request errored, status: 0, number of errors: NaN" poc:29

The disconnect never gets called.

Strophe tries re connection 5 times but no disconnect event is sent, This is a problem for us because we want to reconnect to another URL in case one is down, so we need a signal whenever strophe fails to connect.

In case of unreachable URLs the reqStatus variable in _onRequestStateChange function becomes 0.
Ideally after 5 retries a disconnect should be sent for this state [for that matter it should be sent for every possible state]. Like a disconnect is being sent for reqStatus >= 400 && reqStatus < 500.

stropheobj.connect() with different JID from different domain will not work.

For example:

stropheobj = new Strophe.Connection(url);

stropheobj.connect("[email protected]", "testpwd", connectHandler);  // Passed
stropheobj.disconnect(); 
stropheobj.connect("[email protected]", "testpwd", connectHandler);  // Passed
stropheobj.disconnect(); 

// Failed, because it actually connect with '[email protected]'.
stropheobj.connect("[email protected]", "testpwd", connectHandler); 

I found the source code of src/core.js line 1753 may caused this problem https://github.com/strophe/strophejs/blob/master/src/core.js#L1753

      this.domain = this.domain || Strophe.getDomainFromJid(this.jid);

I do not know if this is a bug?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.