Skip to content

Commit

Permalink
Update sockjs to 0.3.4. This removes the meteor patch from #339, but …
Browse files Browse the repository at this point in the history
…preserves the patch to do http->https on IE.
  • Loading branch information
n1mmy committed Nov 16, 2012
1 parent 12c338b commit d1ce91d
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 29 deletions.
2 changes: 1 addition & 1 deletion packages/stream/package.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Package.on_use(function (api) {
api.use(['underscore', 'logging', 'uuid', 'json'], ['client', 'server']); api.use(['underscore', 'logging', 'uuid', 'json'], ['client', 'server']);
api.use('reload', 'client'); api.use('reload', 'client');


api.add_files('sockjs-0.3.1.js', 'client'); api.add_files('sockjs-0.3.4.js', 'client');


api.add_files('stream_client.js', 'client'); api.add_files('stream_client.js', 'client');
api.add_files('stream_server.js', 'server'); api.add_files('stream_server.js', 'server');
Expand Down
108 changes: 80 additions & 28 deletions packages/stream/sockjs-0.3.1.js → packages/stream/sockjs-0.3.4.js
Original file line number Original file line Diff line number Diff line change
@@ -1,6 +1,6 @@
// XXX METEOR changes in <METEOR> // XXX METEOR changes in <METEOR>


/* SockJS client, version 0.3.1, http://sockjs.org, MIT License /* SockJS client, version 0.3.4, http://sockjs.org, MIT License
Copyright (c) 2011-2012 VMware, Inc. Copyright (c) 2011-2012 VMware, Inc.
Expand Down Expand Up @@ -136,27 +136,53 @@ SimpleEvent.prototype.toString = function() {
*/ */


var EventEmitter = function(events) { var EventEmitter = function(events) {
this.events = events || []; var that = this;
that._events = events || [];
that._listeners = {};
}; };
EventEmitter.prototype.emit = function(type) { EventEmitter.prototype.emit = function(type) {
var that = this; var that = this;
that._verifyType(type);
if (that._nuked) return;

var args = Array.prototype.slice.call(arguments, 1); var args = Array.prototype.slice.call(arguments, 1);
if (!that.nuked && that['on'+type]) { if (that['on'+type]) {
that['on'+type].apply(that, args); that['on'+type].apply(that, args);
} }
if (utils.arrIndexOf(that.events, type) === -1) { if (type in that._listeners) {
for(var i = 0; i < that._listeners[type].length; i++) {
that._listeners[type][i].apply(that, args);
}
}
};

EventEmitter.prototype.on = function(type, callback) {
var that = this;
that._verifyType(type);
if (that._nuked) return;

if (!(type in that._listeners)) {
that._listeners[type] = [];
}
that._listeners[type].push(callback);
};

EventEmitter.prototype._verifyType = function(type) {
var that = this;
if (utils.arrIndexOf(that._events, type) === -1) {
utils.log('Event ' + JSON.stringify(type) + utils.log('Event ' + JSON.stringify(type) +
' not listed ' + JSON.stringify(that.events) + ' not listed ' + JSON.stringify(that._events) +
' in ' + that); ' in ' + that);
} }
}; };


EventEmitter.prototype.nuke = function(type) { EventEmitter.prototype.nuke = function() {
var that = this; var that = this;
that.nuked = true; that._nuked = true;
for(var i=0; i<that.events.length; i++) { for(var i=0; i<that._events.length; i++) {
delete that[that.events[i]]; delete that[that._events[i]];
} }
that._listeners = {};
}; };
// [*] End of lib/eventemitter.js // [*] End of lib/eventemitter.js


Expand Down Expand Up @@ -578,9 +604,8 @@ var unload_triggered = function() {
trigger_unload_callbacks(); trigger_unload_callbacks();
}; };


// Onbeforeunload alone is not reliable. We could use only 'unload' // 'unload' alone is not reliable in opera within an iframe, but we
// but it's not working in opera within an iframe. Let's use both. // can't use `beforeunload` as IE fires it on javascript: links.
utils.attachEvent('beforeunload', unload_triggered);
utils.attachEvent('unload', unload_triggered); utils.attachEvent('unload', unload_triggered);


utils.unload_add = function(listener) { utils.unload_add = function(listener) {
Expand Down Expand Up @@ -774,13 +799,20 @@ AbstractXHRObject.prototype._start = function(method, url, payload, opts) {
var status = x.status; var status = x.status;
var text = x.responseText; var text = x.responseText;
} catch (x) {}; } catch (x) {};
// IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450
if (status === 1223) status = 204;

// IE does return readystate == 3 for 404 answers. // IE does return readystate == 3 for 404 answers.
if (text && text.length > 0) { if (text && text.length > 0) {
that.emit('chunk', status, text); that.emit('chunk', status, text);
} }
break; break;
case 4: case 4:
that.emit('finish', x.status, x.responseText); var status = x.status;
// IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450
if (status === 1223) status = 204;

that.emit('finish', status, x.responseText);
that._cleanup(false); that._cleanup(false);
break; break;
} }
Expand Down Expand Up @@ -916,6 +948,11 @@ utils.isXHRCorsCapable = function() {
*/ */


var SockJS = function(url, dep_protocols_whitelist, options) { var SockJS = function(url, dep_protocols_whitelist, options) {
if (this === _window) {
// makes `new` optional
return new SockJS(url, dep_protocols_whitelist, options);
}

var that = this, protocols_whitelist; var that = this, protocols_whitelist;
that._options = {devel: false, debug: false, protocols_whitelist: [], that._options = {devel: false, debug: false, protocols_whitelist: [],
info: undefined, rtt: undefined}; info: undefined, rtt: undefined};
Expand Down Expand Up @@ -967,7 +1004,7 @@ var SockJS = function(url, dep_protocols_whitelist, options) {
// Inheritance // Inheritance
SockJS.prototype = new REventTarget(); SockJS.prototype = new REventTarget();


SockJS.version = "0.3.1"; SockJS.version = "0.3.4";


SockJS.CONNECTING = 0; SockJS.CONNECTING = 0;
SockJS.OPEN = 1; SockJS.OPEN = 1;
Expand Down Expand Up @@ -1201,7 +1238,7 @@ var WebSocketTransport = SockJS.websocket = function(ri, trans_url) {
that.ri._didMessage(e.data); that.ri._didMessage(e.data);
}; };
// Firefox has an interesting bug. If a websocket connection is // Firefox has an interesting bug. If a websocket connection is
// created after onbeforeunload, it stays alive even when user // created after onunload, it stays alive even when user
// navigates away from the page. In such situation let's lie - // navigates away from the page. In such situation let's lie -
// let's not open the ws connection at all. See: // let's not open the ws connection at all. See:
// https://github.com/sockjs/sockjs-client/issues/28 // https://github.com/sockjs/sockjs-client/issues/28
Expand Down Expand Up @@ -1287,8 +1324,6 @@ BufferedSender.prototype.send_schedule = function() {
var that = this; var that = this;
if (that.send_buffer.length > 0) { if (that.send_buffer.length > 0) {
var payload = '[' + that.send_buffer.join(',') + ']'; var payload = '[' + that.send_buffer.join(',') + ']';
// <METEOR>
// https://github.com/sockjs/sockjs-client/commit/9ce0d73880f53851412e4a0ed94e203f426ce713
that.send_stop = that.sender(that.trans_url, payload, function(success, abort_reason) { that.send_stop = that.sender(that.trans_url, payload, function(success, abort_reason) {
that.send_stop = null; that.send_stop = null;
if (success === false) { if (success === false) {
Expand All @@ -1297,7 +1332,6 @@ BufferedSender.prototype.send_schedule = function() {
that.send_schedule_wait(); that.send_schedule_wait();
} }
}); });
// </METEOR>
that.send_buffer = []; that.send_buffer = [];
} }
}; };
Expand Down Expand Up @@ -1360,12 +1394,9 @@ var jsonPGenericSender = function(url, payload, callback) {
iframe = null; iframe = null;
}); });
area.value = ''; area.value = '';
// <METEOR>
// https://github.com/sockjs/sockjs-client/commit/9ce0d73880f53851412e4a0ed94e203f426ce713
// It is not possible to detect if the iframe succeeded or // It is not possible to detect if the iframe succeeded or
// failed to submit our form. // failed to submit our form.
callback(true); callback(true);
// </METEOR>
}; };
iframe.onerror = iframe.onload = completed; iframe.onerror = iframe.onload = completed;
iframe.onreadystatechange = function(e) { iframe.onreadystatechange = function(e) {
Expand All @@ -1377,15 +1408,13 @@ var jsonPGenericSender = function(url, payload, callback) {
var createAjaxSender = function(AjaxObject) { var createAjaxSender = function(AjaxObject) {
return function(url, payload, callback) { return function(url, payload, callback) {
var xo = new AjaxObject('POST', url + '/xhr_send', payload); var xo = new AjaxObject('POST', url + '/xhr_send', payload);
// <METEOR>
// https://github.com/sockjs/sockjs-client/commit/9ce0d73880f53851412e4a0ed94e203f426ce713
xo.onfinish = function(status, text) { xo.onfinish = function(status, text) {
callback(status === 200 || status === 204, 'http status ' + status); callback(status === 200 || status === 204,
'http status ' + status);
}; };
return function(abort_reason) { return function(abort_reason) {
callback(false, abort_reason); callback(false, abort_reason);
}; };
// </METEOR>
}; };
}; };
// [*] End of lib/trans-sender.js // [*] End of lib/trans-sender.js
Expand Down Expand Up @@ -1415,6 +1444,8 @@ var jsonPGenericReceiver = function(url, callback) {
} }
if (script) { if (script) {
clearTimeout(tref); clearTimeout(tref);
// Unfortunately, you can't really abort script loading of
// the script.
script.parentNode.removeChild(script); script.parentNode.removeChild(script);
script.onreadystatechange = script.onerror = script.onreadystatechange = script.onerror =
script.onload = script.onclick = null; script.onload = script.onclick = null;
Expand Down Expand Up @@ -1580,16 +1611,36 @@ JsonPTransport.prototype.doCleanup = function() {
var jsonPReceiverWrapper = function(url, constructReceiver, user_callback) { var jsonPReceiverWrapper = function(url, constructReceiver, user_callback) {
var id = 'a' + utils.random_string(6); var id = 'a' + utils.random_string(6);
var url_id = url + '?c=' + escape(WPrefix + '.' + id); var url_id = url + '?c=' + escape(WPrefix + '.' + id);

// Unfortunately it is not possible to abort loading of the
// script. We need to keep track of frake close frames.
var aborting = 0;

// Callback will be called exactly once. // Callback will be called exactly once.
var callback = function(frame) { var callback = function(frame) {
delete _window[WPrefix][id]; switch(aborting) {
user_callback(frame); case 0:
// Normal behaviour - delete hook _and_ emit message.
delete _window[WPrefix][id];
user_callback(frame);
break;
case 1:
// Fake close frame - emit but don't delete hook.
user_callback(frame);
aborting = 2;
break;
case 2:
// Got frame after connection was closed, delete hook, don't emit.
delete _window[WPrefix][id];
break;
}
}; };


var close_script = constructReceiver(url_id, callback); var close_script = constructReceiver(url_id, callback);
_window[WPrefix][id] = close_script; _window[WPrefix][id] = close_script;
var stop = function() { var stop = function() {
if (_window[WPrefix][id]) { if (_window[WPrefix][id]) {
aborting = 1;
_window[WPrefix][id](utils.closeFrame(1000, "JSONP user aborted read")); _window[WPrefix][id](utils.closeFrame(1000, "JSONP user aborted read"));
} }
}; };
Expand Down Expand Up @@ -1979,7 +2030,8 @@ var createInfoReceiver = function(base_url) {
} }
switch (utils.isXHRCorsCapable()) { switch (utils.isXHRCorsCapable()) {
case 1: case 1:
return new InfoReceiver(base_url, utils.XHRCorsObject); // XHRLocalObject -> no_credentials=true
return new InfoReceiver(base_url, utils.XHRLocalObject);
case 2: case 2:
// <METEOR> // <METEOR>
// https://github.com/sockjs/sockjs-client/issues/79 // https://github.com/sockjs/sockjs-client/issues/79
Expand Down

0 comments on commit d1ce91d

Please sign in to comment.