@@ -4,6 +4,7 @@ import { DefermentManagerOptions } from '../operations/options.js'
4
4
5
5
export class DefermentManager {
6
6
private deferments : Map < string , DeferredBase > = new Map ( )
7
+ private timer ?: ReturnType < typeof setTimeout >
7
8
private logger : CustomLogger
8
9
private currentSize = 0
9
10
private disposed = false
@@ -12,6 +13,7 @@ export class DefermentManager {
12
13
private totalDefermentRequests : Map < string , number > = new Map ( )
13
14
14
15
constructor ( private options : DefermentManagerOptions ) {
16
+ this . resetGlobalTimer ( )
15
17
this . logger = options . logger || ( ( ) : void => { } )
16
18
}
17
19
@@ -59,14 +61,6 @@ export class DefermentManager {
59
61
if ( this . disposed ) throw new Error ( 'DefermentManager is disposed' )
60
62
const now = this . now ( )
61
63
this . currentSize += item . size || 0
62
- if ( this . currentSize > this . options . maxSizeInMb * 1024 * 1024 ) {
63
- this . logger (
64
- 'deferments size exceeded, cleaning up' ,
65
- this . currentSize ,
66
- this . options . maxSizeInMb
67
- )
68
- this . cleanDeferments ( )
69
- }
70
64
//order matters here with found before undefer
71
65
const deferredBase = this . deferments . get ( item . baseId )
72
66
if ( deferredBase ) {
@@ -79,9 +73,21 @@ export class DefermentManager {
79
73
}
80
74
}
81
75
76
+ private resetGlobalTimer ( ) : void {
77
+ const run = ( ) : void => {
78
+ this . cleanDeferments ( )
79
+ this . timer = setTimeout ( run , this . options . ttlms )
80
+ }
81
+ this . timer = setTimeout ( run , this . options . ttlms )
82
+ }
83
+
82
84
dispose ( ) : void {
83
85
if ( this . disposed ) return
84
86
this . disposed = true
87
+ if ( this . timer ) {
88
+ clearTimeout ( this . timer )
89
+ this . timer = undefined
90
+ }
85
91
this . clearDeferments ( )
86
92
}
87
93
@@ -99,6 +105,15 @@ export class DefermentManager {
99
105
}
100
106
101
107
private cleanDeferments ( ) : void {
108
+ const maxSizeBytes = this . options . maxSizeInMb * 1024 * 1024
109
+ if ( this . currentSize < maxSizeBytes ) {
110
+ this . logger (
111
+ 'deferments size is ok, no need to clean' ,
112
+ this . currentSize ,
113
+ maxSizeBytes
114
+ )
115
+ return
116
+ }
102
117
const now = this . now ( )
103
118
let cleaned = 0
104
119
const start = performance . now ( )
@@ -115,6 +130,9 @@ export class DefermentManager {
115
130
this . currentSize -= deferredBase . getItem ( ) ?. size || 0
116
131
this . deferments . delete ( deferredBase . getId ( ) )
117
132
cleaned ++
133
+ if ( this . currentSize < maxSizeBytes ) {
134
+ break
135
+ }
118
136
}
119
137
}
120
138
this . logger (
0 commit comments