Regarding your WebSocket problem: this is what disable('websocket') was designed for, though obviously better automated error detection would be good. Faye does fall back to other transports if WebSockets don't work, but the definition of 'not working' may need changing -- if it manages to make a connection, it assumes WebSockets are working. It might need to instead fall back if it doesn't receive replies to messages, for example.
I'd like you to find out the following for me -- you'll need to edit the JS client code for this. In browsers where WebSockets don't work:
* Does the WebSocket connection ever receive messages?
* When the client connects, how much time elapses between the `new WebSocket` call and the `onopen` event?
* When it disconnects, how long after the `onopen` event does `onclose` fire? Is this constant?
* Does the socket trigger the `onerror` event? What error code does it yield? (The argument to onerror is an error object with a `code` property in recent browsers)
Is it only broken in production, over the public internet, or do you also have problems in development on a local network? Is the problem likely due to bad proxies, or simple latency? I'm a little puzzled as to why WebSocket would be broken but HTTP would be snappy, unless proxies are messing with the socket connection?
Could you try the latest `master` version and run it with disable('websocket')? This will switch to the EventSource transport if your Faye server is on the same origin as the current page (check the connectionType of /meta/connect messages), and I'm curious to know if this works better for you.