LEFT | RIGHT |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 "use strict"; | 18 "use strict"; |
19 | 19 |
20 /** | 20 /** |
21 * @fileOverview Downloads a set of URLs in regular time intervals. | 21 * @fileOverview Downloads a set of URLs in regular time intervals. |
22 */ | 22 */ |
23 | 23 |
24 const {Utils} = require("utils"); | 24 const {Utils} = require("utils"); |
25 | 25 |
26 let MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; | 26 const MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; |
27 let MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; | 27 const MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; |
28 let MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; | 28 const MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; |
29 let MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; | 29 const MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; |
30 | 30 |
31 let Downloader = | 31 let Downloader = |
32 /** | 32 /** |
33 * Creates a new downloader instance. | 33 * Creates a new downloader instance. |
34 * @param {Function} dataSource Function that will yield downloadable objects | 34 * @param {Function} dataSource |
35 * on each check | 35 * Function that will yield downloadable objects on each check |
36 * @param {number} initialDelay Number of milliseconds to wait before the | 36 * @param {number} initialDelay |
37 * first check | 37 * Number of milliseconds to wait before the first check |
38 * @param {number} checkInterval Interval between the checks | 38 * @param {number} checkInterval |
| 39 * Interval between the checks |
39 * @constructor | 40 * @constructor |
40 */ | 41 */ |
41 exports.Downloader = function(dataSource, initialDelay, checkInterval) | 42 exports.Downloader = function(dataSource, initialDelay, checkInterval) |
42 { | 43 { |
43 this.dataSource = dataSource; | 44 this.dataSource = dataSource; |
44 this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 45 this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); |
45 this._timer.initWithCallback(() => | 46 this._timer.initWithCallback(() => |
46 { | 47 { |
47 this._timer.delay = checkInterval; | 48 this._timer.delay = checkInterval; |
48 this._doCheck(); | 49 this._doCheck(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 * Checks whether anything needs downloading. | 124 * Checks whether anything needs downloading. |
124 */ | 125 */ |
125 _doCheck() | 126 _doCheck() |
126 { | 127 { |
127 let now = Date.now(); | 128 let now = Date.now(); |
128 for (let downloadable of this.dataSource()) | 129 for (let downloadable of this.dataSource()) |
129 { | 130 { |
130 if (downloadable.lastCheck && | 131 if (downloadable.lastCheck && |
131 now - downloadable.lastCheck > this.maxAbsenceInterval) | 132 now - downloadable.lastCheck > this.maxAbsenceInterval) |
132 { | 133 { |
133 // No checks for a long time interval - user must have been | 134 // No checks for a long time interval - user must have been offline, |
134 // offline, e.g. during a weekend. Increase soft expiration | 135 // e.g. during a weekend. Increase soft expiration to prevent load |
135 // to prevent load peaks on the server. | 136 // peaks on the server. |
136 downloadable.softExpiration += now - downloadable.lastCheck; | 137 downloadable.softExpiration += now - downloadable.lastCheck; |
137 } | 138 } |
138 downloadable.lastCheck = now; | 139 downloadable.lastCheck = now; |
139 | 140 |
140 // Sanity check: do expiration times make sense? Make sure people changing | 141 // Sanity check: do expiration times make sense? Make sure people changing |
141 // system clock don't get stuck with outdated subscriptions. | 142 // system clock don't get stuck with outdated subscriptions. |
142 if (downloadable.hardExpiration - now > this.maxExpirationInterval) | 143 if (downloadable.hardExpiration - now > this.maxExpirationInterval) |
143 downloadable.hardExpiration = now + this.maxExpirationInterval; | 144 downloadable.hardExpiration = now + this.maxExpirationInterval; |
144 if (downloadable.softExpiration - now > this.maxExpirationInterval) | 145 if (downloadable.softExpiration - now > this.maxExpirationInterval) |
145 downloadable.softExpiration = now + this.maxExpirationInterval; | 146 downloadable.softExpiration = now + this.maxExpirationInterval; |
146 | 147 |
147 // Notify the caller about changes to expiration parameters | 148 // Notify the caller about changes to expiration parameters |
148 if (this.onExpirationChange) | 149 if (this.onExpirationChange) |
149 this.onExpirationChange(downloadable); | 150 this.onExpirationChange(downloadable); |
150 | 151 |
151 // Does that object need downloading? | 152 // Does that object need downloading? |
152 if (downloadable.softExpiration > now && | 153 if (downloadable.softExpiration > now && |
153 downloadable.hardExpiration > now) | 154 downloadable.hardExpiration > now) |
| 155 { |
154 continue; | 156 continue; |
| 157 } |
155 | 158 |
156 // Do not retry downloads too often | 159 // Do not retry downloads too often |
157 if (downloadable.lastError && | 160 if (downloadable.lastError && |
158 now - downloadable.lastError < this.minRetryInterval) | 161 now - downloadable.lastError < this.minRetryInterval) |
| 162 { |
159 continue; | 163 continue; |
| 164 } |
160 | 165 |
161 this._download(downloadable, 0); | 166 this._download(downloadable, 0); |
162 } | 167 } |
163 }, | 168 }, |
164 | 169 |
165 /** | 170 /** |
166 * Stops the periodic checks. | 171 * Stops the periodic checks. |
167 */ | 172 */ |
168 cancel() | 173 cancel() |
169 { | 174 { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 "Download address: " + downloadUrl + "\n" + | 249 "Download address: " + downloadUrl + "\n" + |
245 "Channel status: " + channelStatus + "\n" + | 250 "Channel status: " + channelStatus + "\n" + |
246 "Server response: " + responseStatus); | 251 "Server response: " + responseStatus); |
247 | 252 |
248 if (this.onDownloadError) | 253 if (this.onDownloadError) |
249 { | 254 { |
250 // Allow one extra redirect if the error handler gives us a redirect URL | 255 // Allow one extra redirect if the error handler gives us a redirect URL |
251 let redirectCallback = null; | 256 let redirectCallback = null; |
252 if (redirects <= this.maxRedirects) | 257 if (redirects <= this.maxRedirects) |
253 { | 258 { |
254 redirectCallback = (url) => | 259 redirectCallback = url => |
255 { | 260 { |
256 downloadable.redirectURL = url; | 261 downloadable.redirectURL = url; |
257 this._download(downloadable, redirects + 1); | 262 this._download(downloadable, redirects + 1); |
258 }; | 263 }; |
259 } | 264 } |
260 | 265 |
261 this.onDownloadError(downloadable, downloadUrl, error, channelStatus, | 266 this.onDownloadError(downloadable, downloadUrl, error, channelStatus, |
262 responseStatus, redirectCallback); | 267 responseStatus, redirectCallback); |
263 } | 268 } |
264 }.bind(this); | 269 }.bind(this); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 * @type {number} | 412 * @type {number} |
408 */ | 413 */ |
409 hardExpiration: 0, | 414 hardExpiration: 0, |
410 | 415 |
411 /** | 416 /** |
412 * Number indicating how often the object was downloaded. | 417 * Number indicating how often the object was downloaded. |
413 * @type {number} | 418 * @type {number} |
414 */ | 419 */ |
415 downloadCount: 0 | 420 downloadCount: 0 |
416 }; | 421 }; |
LEFT | RIGHT |