@@ -6,6 +6,7 @@ import type $Refs from "./refs.js";
6
6
import type { DereferenceOptions , ParserOptions } from "./options.js" ;
7
7
import type { JSONSchema } from "./types" ;
8
8
import type $RefParser from "./index" ;
9
+ import { TimeoutError } from "./util/errors" ;
9
10
10
11
export default dereference ;
11
12
@@ -20,6 +21,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
20
21
parser : $RefParser < S , O > ,
21
22
options : O ,
22
23
) {
24
+ const start = Date . now ( ) ;
23
25
// console.log('Dereferencing $ref pointers in %s', parser.$refs._root$Ref.path);
24
26
const dereferenced = crawl < S , O > (
25
27
parser . schema ,
@@ -30,6 +32,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
30
32
new Map ( ) ,
31
33
parser . $refs ,
32
34
options ,
35
+ start ,
33
36
) ;
34
37
parser . $refs . circular = dereferenced . circular ;
35
38
parser . schema = dereferenced . value ;
@@ -46,6 +49,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
46
49
* @param dereferencedCache - An map of all the dereferenced objects
47
50
* @param $refs
48
51
* @param options
52
+ * @param startTime - The time when the dereferencing started
49
53
* @returns
50
54
*/
51
55
function crawl < S extends object = JSONSchema , O extends ParserOptions < S > = ParserOptions < S > > (
@@ -57,13 +61,19 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
57
61
dereferencedCache : any ,
58
62
$refs : $Refs < S , O > ,
59
63
options : O ,
64
+ startTime : number ,
60
65
) {
61
66
let dereferenced ;
62
67
const result = {
63
68
value : obj ,
64
69
circular : false ,
65
70
} ;
66
71
72
+ if ( options && options . timeoutMs ) {
73
+ if ( Date . now ( ) - startTime > options . timeoutMs ) {
74
+ throw new TimeoutError ( options . timeoutMs ) ;
75
+ }
76
+ }
67
77
const derefOptions = ( options . dereference || { } ) as DereferenceOptions ;
68
78
const isExcludedPath = derefOptions . excludedPathMatcher || ( ( ) => false ) ;
69
79
@@ -82,6 +92,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
82
92
dereferencedCache ,
83
93
$refs ,
84
94
options ,
95
+ startTime ,
85
96
) ;
86
97
result . circular = dereferenced . circular ;
87
98
result . value = dereferenced . value ;
@@ -107,6 +118,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
107
118
dereferencedCache ,
108
119
$refs ,
109
120
options ,
121
+ startTime ,
110
122
) ;
111
123
circular = dereferenced . circular ;
112
124
// Avoid pointless mutations; breaks frozen objects to no profit
@@ -125,6 +137,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
125
137
dereferencedCache ,
126
138
$refs ,
127
139
options ,
140
+ startTime ,
128
141
) ;
129
142
circular = dereferenced . circular ;
130
143
// Avoid pointless mutations; breaks frozen objects to no profit
@@ -170,6 +183,7 @@ function dereference$Ref<S extends object = JSONSchema, O extends ParserOptions<
170
183
dereferencedCache : any ,
171
184
$refs : $Refs < S , O > ,
172
185
options : O ,
186
+ startTime : number ,
173
187
) {
174
188
const isExternalRef = $Ref . isExternal$Ref ( $ref ) ;
175
189
const shouldResolveOnCwd = isExternalRef && options ?. dereference ?. externalReferenceResolution === "root" ;
@@ -224,6 +238,7 @@ function dereference$Ref<S extends object = JSONSchema, O extends ParserOptions<
224
238
dereferencedCache ,
225
239
$refs ,
226
240
options ,
241
+ startTime ,
227
242
) ;
228
243
circular = dereferenced . circular ;
229
244
dereferencedValue = dereferenced . value ;
0 commit comments