Skip to content

Commit

Permalink
Merge PR #184 'connectivity-check'
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonWoolf committed Dec 18, 2015
2 parents b29d5d4 + 3215e27 commit 8bdce7b
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 6 deletions.
3 changes: 3 additions & 0 deletions browser/lib/transport/iframetransport.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ var IframeTransport = (function() {
return (window.postMessage !== undefined);
};

/* No Iframe rest requests -- if xhr not supported then falls back to jsonp rest requests */
IframeTransport.checkConnectivity = JSONPTransport.checkConnectivity;

if(IframeTransport.isAvailable())
ConnectionManager.httpTransports['iframe'] = ConnectionManager.transports['iframe'] = IframeTransport;

Expand Down
13 changes: 10 additions & 3 deletions browser/lib/transport/jsonptransport.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,17 @@ var JSONPTransport = (function() {
}
checksInProgress = [callback];
Logger.logAction(Logger.LOG_MICRO, 'JSONPTransport.checkConnectivity()', 'Sending; ' + upUrl);
request(upUrl, null, null, null, false, function(err, response) {

var req = new Request('_isTheInternetUp', upUrl, null, null, null, CometTransport.REQ_SEND, Defaults.TIMEOUTS);
req.once('complete', function(err, response) {
var result = !err && response;
Logger.logAction(Logger.LOG_MICRO, 'JSONPTransport.checkConnectivity()', 'Result: ' + result);
for(var i = 0; i < checksInProgress.length; i++) checksInProgress[i](null, result);
checksInProgress = null;
});
Utils.nextTick(function() {
req.exec();
})
};

JSONPTransport.tryConnect = function(connectionManager, auth, params, callback) {
Expand Down Expand Up @@ -147,10 +152,12 @@ var JSONPTransport = (function() {
this.emit('disposed');
};

var request = Http.Request = function(uri, headers, params, body, callback) {
Http.Request = function(uri, headers, params, body, callback) {
var req = createRequest(uri, headers, params, body, CometTransport.REQ_SEND);
req.once('complete', callback);
req.exec();
Utils.nextTick(function() {
req.exec();
})
return req;
};

Expand Down
3 changes: 2 additions & 1 deletion common/lib/transport/comettransport.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ var CometTransport = (function() {
/* binary not supported for comet, so just fall back to default */
params.format = undefined;
Transport.call(this, connectionManager, auth, params);
/* streaming defaults to true */
this.stream = ('stream' in params) ? params.stream : true;
this.sendRequest = null;
this.recvRequest = null;
this.pendingCallback = null;
this.pendingItems = null;
this.disposed = false;
this.stream = true;
}
Utils.inherits(CometTransport, Transport);

Expand Down
2 changes: 2 additions & 0 deletions common/lib/transport/connectionmanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ var ConnectionManager = (function() {
params.echo = 'false';
if(this.format !== undefined)
params.format = this.format;
if(this.stream !== undefined)
params.stream = this.stream;
if(options.transportParams !== undefined) {
Utils.mixin(params, options.transportParams);
}
Expand Down
6 changes: 4 additions & 2 deletions nodejs/lib/transport/nodecomettransport.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ var NodeCometTransport = (function() {
ConnectionManager.httpTransports['comet'] = ConnectionManager.transports['comet'] = NodeCometTransport;

NodeCometTransport.checkConnectivity = function(callback) {
new Request('http://live.cdn.ably-realtime.com/is-the-internet-up.txt', null, null, CometTransport.REQ_RECV, false, function(err, responseText) {
callback(null, (!err && responseText == 'yes'));
var upUrl = Defaults.internetUpUrlWithoutExtension + '.txt';
/* NodeCometTransport unsuited to rest requests; just use node http package */
Http.getUri(null, upUrl, null, null, function(err, responseText) {
callback(null, (!err && responseText.toString().trim() === 'yes'));
});
};

Expand Down
67 changes: 67 additions & 0 deletions spec/realtime/connectivity.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
"use strict";

define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
var exports = {},
closeAndFinish = helper.closeAndFinish,
monitorConnection = helper.monitorConnection,
// Ably.Realtime.ConnectionManager not defined in node
availableHttpTransports = typeof Ably.Realtime.ConnectionManager === 'undefined' ? Ably.Realtime.Defaults.httpTransports : Object.keys(Ably.Realtime.ConnectionManager.httpTransports);


exports.setupConnectivity = function(test) {
test.expect(1);
helper.setupApp(function(err) {
if(err) {
test.ok(false, helper.displayError(err));
} else {
test.ok(true, 'app set up');
}
test.done();
});
};

/*
* Connect with available http transports; internet connectivity check should work
*/
exports.http_connectivity_check = function(test) {
test.expect(availableHttpTransports.length);
try {
var connectivity_test = function(transports) {
return function(cb) {
var realtime = helper.AblyRealtime({transports: transports});
/* Not strictly necessary to connect before doing connectivity check,
* but it's a simple way to get a reference to the transport */
realtime.connection.on('connected', function() {
//console.log("Transport " + transports + " connected, trying connectivity check");
var transport = realtime.connection.connectionManager.activeProtocol.transport.constructor;
transport.checkConnectivity(function(err, res) {
//console.log("Transport " + transports + " connectivity check returned ", err, res)
if(err)
cb(err, realtime);
test.ok(res, 'Connectivity check for ' + transports);
cb(null, realtime);
})
});
monitorConnection(test, realtime);
};
};
async.parallel(
availableHttpTransports.map(function(transport) {
return connectivity_test([transport]);
}),
function(err, realtimes) {
if(err) {
console.log("errrrr", err)
test.ok(false, helper.displayError(err));
}
closeAndFinish(test, realtimes);
}
);
} catch(e) {
test.ok(false, 'connection failed with exception: ' + e.stack);
closeAndFinish(test, realtime);
}
};

return module.exports = helper.withTimeout(exports);
});

0 comments on commit 8bdce7b

Please sign in to comment.