| /* |
| * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| BubbleQueue = function(queueServer, id, info) |
| { |
| BaseObject.call(this); |
| |
| console.assert(queueServer); |
| console.assert(id); |
| |
| this.queueServer = queueServer; |
| this.id = id; |
| this.shortName = info.shortName || id; |
| this.title = info.title || "\xa0"; |
| |
| this.platform = info.platform ? info.platform.name : "unknown"; |
| }; |
| |
| BaseObject.addConstructorFunctions(BubbleQueue); |
| |
| BubbleQueue.Event = { |
| Updated: "updated" |
| }; |
| |
| BubbleQueue.prototype = { |
| constructor: BubbleQueue, |
| __proto__: BaseObject.prototype, |
| |
| get statusPageURL() |
| { |
| return this.queueServer.queueStatusURL(this.id); |
| }, |
| |
| get chartsPageURL() |
| { |
| return this._chartsPageURL; |
| }, |
| |
| get patchCount() |
| { |
| return this._patchCount; |
| }, |
| |
| get loadedDetailedStatus() |
| { |
| return this._loadedDetailedStatus; |
| }, |
| |
| get patches() |
| { |
| console.assert(this._loadedDetailedStatus); |
| return this._queue; |
| }, |
| |
| get bots() |
| { |
| console.assert(this._loadedDetailedStatus); |
| return this._bots; |
| }, |
| |
| update: function() |
| { |
| this._loadedDetailedStatus = false; |
| |
| JSON.load(this.queueServer.jsonQueueLengthURL(this.id), function(data) { |
| var newPatchCount = data.queue_length; |
| if (this._patchCount == newPatchCount) |
| return; |
| this._patchCount = newPatchCount; |
| this.dispatchEventToListeners(BubbleQueue.Event.Updated, null); |
| }.bind(this)); |
| }, |
| |
| loadDetailedStatus: function(callback) |
| { |
| JSON.load(this.queueServer.jsonQueueStatusURL(this.id), function(data) { |
| this._queue = []; |
| for (var i = 0, end = data.queue.length; i < end; ++i) { |
| var patch = data.queue[i]; |
| var activeSinceTime = patch.active_since ? Date.parse(patch.active_since) : 0; |
| this._queue.push({ |
| attachmentID: patch.attachment_id, |
| statusPageURL: patch.status_page, |
| latestMessage: patch.latest_message, |
| latestMessageTime: patch.latest_message_time ? new Date(patch.latest_message_time) : null, |
| detailedResultsURLForLatestMessage: patch.latest_results, |
| retryCount: patch.retry_count, |
| active: patch.active, |
| activeSince: new Date(activeSinceTime), |
| }); |
| } |
| |
| this._bots = []; |
| for (var i = 0, end = data.bots.length; i < end; ++i) { |
| var bot = data.bots[i]; |
| var latestMessageTime = bot.latest_message_time ? Date.parse(bot.latest_message_time) : 0; |
| |
| var oneDayInMilliseconds = 24 * 60 * 60 * 1000; |
| var botIsCurrentlyActive = Date.now() < latestMessageTime + oneDayInMilliseconds; |
| if (!botIsCurrentlyActive) |
| continue; |
| |
| // Sometimes (rarely), there are status messages with an empty bot name added to the database. |
| if (!bot.bot_id.length) |
| bot.bot_id = "<empty name>"; |
| |
| this._bots.push({ |
| id: bot.bot_id, |
| statusPageURL: bot.status_page, |
| latestMessageTime: new Date(latestMessageTime), |
| }); |
| } |
| |
| console.assert(this.statusPageURL.replace(/https?:\/\//g, "") === data.status_page.replace(/https?:\/\//g, "")); |
| this._chartsPageURL = data.charts_page; |
| |
| this._loadedDetailedStatus = true; |
| callback(); |
| }.bind(this)); |
| }, |
| }; |