@@ -4,10 +4,10 @@ import {API} from '/js/msg';
44import * as prefs from '/js/prefs' ;
55import { calcStyleDigest , styleSectionsEqual } from '/js/sections-util' ;
66import { chromeLocal } from '/js/storage-util' ;
7- import { extractUsoaId , isLocalhost , usoApi } from '/js/urls' ;
8- import { debounce , deepMerge } from '/js/util' ;
7+ import { extractUsoaId , isCdnUrl , isLocalhost , usoApi } from '/js/urls' ;
8+ import { debounce , deepMerge , getHost , resolvedPromise , sleep } from '/js/util' ;
99import { ignoreChromeError } from '/js/util-webext' ;
10- import { bgBusy , safeTimeout } from './common' ;
10+ import { bgBusy } from './common' ;
1111import { db } from './db' ;
1212import download from './download' ;
1313import * as styleMan from './style-manager' ;
@@ -27,6 +27,7 @@ const STATES = /** @namespace UpdaterStates */ {
2727 ERROR_VERSION : 'error: version is older than installed style' ,
2828} ;
2929export const getStates = ( ) => STATES ;
30+ const safeSleep = __ . MV3 ? ms => __ . KEEP_ALIVE ( sleep ( ms ) ) : sleep ;
3031const RH_ETAG = { responseHeaders : [ 'etag' ] } ; // a hashsum of file contents
3132const RX_DATE2VER = new RegExp ( [
3233 / ^ ( \d { 4 } ) / ,
@@ -41,6 +42,8 @@ const RETRY_ERRORS = [
4142 503 , // service unavailable
4243 429 , // too many requests
4344] ;
45+ const HOST_THROTTLE = 1000 ; // ms
46+ const hostJobs = { } ;
4447let lastUpdateTime ;
4548let checkingAll = false ;
4649let logQueue = [ ] ;
@@ -227,19 +230,28 @@ export async function checkStyle(opts) {
227230
228231}
229232
230- async function tryDownload ( url , params , { retryDelay = 1000 } = { } ) {
233+ async function tryDownload ( url , params , { retryDelay = HOST_THROTTLE } = { } ) {
231234 while ( true ) {
235+ let host , job ;
232236 try {
233237 params = deepMerge ( params || { } , { headers : { 'Cache-Control' : 'no-cache' } } ) ;
234- return await download ( url , params ) ;
238+ host = getHost ( url ) ;
239+ job = hostJobs [ host ] ;
240+ job = hostJobs [ host ] = ( job
241+ ? job . then ( ( ) => safeSleep ( HOST_THROTTLE / ( isCdnUrl ( url ) ? 4 : 1 ) ) )
242+ : resolvedPromise ( )
243+ ) . then ( ( ) => download ( url , params ) ) ;
244+ return await job ;
235245 } catch ( code ) {
236246 if ( ! RETRY_ERRORS . includes ( code ) ||
237247 retryDelay > MIN_INTERVAL_MS ) {
238- return Promise . reject ( code ) ;
248+ throw code ;
239249 }
250+ } finally {
251+ if ( hostJobs [ host ] === job ) delete hostJobs [ host ] ;
240252 }
241253 retryDelay *= 1.25 ;
242- await new Promise ( resolve => safeTimeout ( resolve , retryDelay ) ) ;
254+ await safeSleep ( retryDelay ) ;
243255 }
244256}
245257
0 commit comments