summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js')
-rw-r--r--src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js
new file mode 100644
index 00000000000..d8ab1e8eb9f
--- /dev/null
+++ b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/client/resources/js/poller.js
@@ -0,0 +1,130 @@
+function Poller(config)
+{
+ // CONFIGURABLE
+ var endpoints = {
+ up: "/status/poll", // url to poll when the server is up
+ down: "/status" // url to poll at regular intervals when the server is down
+ };
+ var timeout = 60000 * 2; // how many ms between polling attempts
+ var intervalMs = 1000; // ms between polls when the server is down
+
+ // INTERNAL STATE
+ var up = true; // whether or not we can connect to the server
+ var req; // the pending ajax request
+ var downPoller; // the setInterval for polling when the server is down
+ var self = this;
+
+ if (typeof config === 'object')
+ {
+ if (typeof config.endpoints === 'object')
+ {
+ endpoints.up = config.endpoints.up;
+ endpoints.down = config.endpoints.down;
+ }
+ if (config.timeout)
+ timeout = config.timeout;
+ if (config.interval)
+ intervalMs = config.interval;
+ }
+
+ $(self).on('pollstart', function(event, data) {
+ log("Started poller");
+ }).on('pollstop', function(event, data) {
+ log("Stopped poller");
+ });
+
+
+ this.start = function()
+ {
+ if (req)
+ return false;
+ doPoll();
+ $(self).trigger('pollstart', {url: endpoints.up, timeout: timeout});
+ return true;
+ };
+
+ this.stop = function()
+ {
+ if (!req)
+ return false;
+ req.abort();
+ req = undefined;
+ stopped = true;
+ stopDownPoller();
+ $(self).trigger('pollstop', {});
+ return true;
+ };
+
+ this.setTimeout = function(tmout)
+ {
+ timeout = tmout; // takes effect at next poll
+ };
+
+ this.isUp = function()
+ {
+ return up;
+ };
+
+ function doPoll()
+ {
+ req = $.ajax({
+ url: endpoints.up + "?timeout=" + timeout,
+ timeout: timeout
+ }).done(pollSuccess).fail(pollFailed);
+ }
+
+ function pollSuccess(data, message, jqxhr)
+ {
+ stopDownPoller();
+ doPoll();
+
+ var wasUp = up;
+ up = true;
+ status = data;
+
+ var arg = {
+ status: status,
+ data: data,
+ jqxhr: jqxhr
+ };
+
+ if (!wasUp)
+ $(convey.poller).trigger('serverstarting', arg);
+ else
+ $(self).trigger('pollsuccess', arg);
+ }
+
+ function pollFailed(jqxhr, message, exception)
+ {
+ if (message === "timeout")
+ {
+ log("Poller timeout; re-polling...", req);
+ doPoll(); // in our case, timeout actually means no activity; poll again
+ return;
+ }
+
+ up = false;
+
+ downPoller = setInterval(function()
+ {
+ // If the server is still down, do a ping to see
+ // if it's up; pollSuccess() will do the rest.
+ if (!up)
+ $.get(endpoints.down).done(pollSuccess);
+ }, intervalMs);
+
+ $(self).trigger('pollfail', {
+ exception: exception,
+ message: message,
+ jqxhr: jqxhr
+ });
+ }
+
+ function stopDownPoller()
+ {
+ if (!downPoller)
+ return;
+ clearInterval(downPoller);
+ downPoller = undefined;
+ }
+}