@@ -13,34 +13,46 @@ pref.ready().then(() => {
13
13
} ) ;
14
14
15
15
const lock = createLockPool ( { maxActiveReader : 3 } ) ;
16
- let meta = new Map ;
16
+ let rules = [ ] ;
17
17
18
18
function update ( ) {
19
- const newMeta = new Map ;
19
+ const newRules = [ ] ;
20
20
for ( const lines of parseText ( pref . get ( 'fetchDelay' ) ) ) {
21
21
const [ origin , delay ] = lines [ 0 ] . trim ( ) . split ( / \s + / ) ;
22
22
const delayMs = Number ( delay ) * 1000 ;
23
- newMeta . set ( origin , {
24
- ...meta . get ( origin ) ,
23
+ const oldRule = rules . find ( rule => rule . origin === origin ) ;
24
+ newRules . push ( {
25
+ ...oldRule ,
26
+ origin,
25
27
delayMs
26
28
} ) ;
27
29
}
28
- meta = newMeta ;
30
+ rules = newRules ;
31
+ }
32
+
33
+ function matchGlob ( pattern , string ) {
34
+ if ( ! pattern . includes ( "*" ) ) {
35
+ return pattern === string ;
36
+ }
37
+ return new RegExp ( `^${ pattern . replace ( / \* / g, ".*" ) } $` ) . test ( string ) ;
29
38
}
30
39
31
40
export async function fetchDelay ( url , cb ) {
32
41
const origin = new URL ( url ) . origin ;
33
- if ( meta . has ( origin ) ) {
34
- return await lock . write ( [ origin ] , async ( ) => {
35
- const t = ( meta . get ( origin ) . lastFetch || 0 ) + meta . get ( origin ) . delayMs - Date . now ( ) ;
42
+ const rule = rules . find ( rule => matchGlob ( rule . origin , origin ) ) ;
43
+ // calculate the delay if there is a matching rule
44
+ if ( rule ) {
45
+ return await lock . write ( [ rule . origin ] , async ( ) => {
46
+ const t = ( rule . lastFetch || 0 ) + rule . delayMs - Date . now ( ) ;
36
47
await delay ( t > 0 ? t : 0 ) ;
37
48
try {
38
49
return await cb ( ) ;
39
50
} finally {
40
- meta . get ( origin ) . lastFetch = Date . now ( ) ;
51
+ rule . lastFetch = Date . now ( ) ;
41
52
}
42
53
} ) ;
43
54
}
55
+ // no matching rule, just fetch, still restricted by the maxActiveReader
44
56
return await lock . read ( [ origin ] , cb ) ;
45
57
}
46
58
0 commit comments