@@ -6,6 +6,7 @@ import type $Refs from "./refs.js";
66import type { DereferenceOptions , ParserOptions } from "./options.js" ;
77import type { JSONSchema } from "./types" ;
88import type $RefParser from "./index" ;
9+ import { TimeoutError } from "./util/errors" ;
910
1011export default dereference ;
1112
@@ -20,6 +21,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
2021 parser : $RefParser < S , O > ,
2122 options : O ,
2223) {
24+ const start = Date . now ( ) ;
2325 // console.log('Dereferencing $ref pointers in %s', parser.$refs._root$Ref.path);
2426 const dereferenced = crawl < S , O > (
2527 parser . schema ,
@@ -30,6 +32,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
3032 new Map ( ) ,
3133 parser . $refs ,
3234 options ,
35+ start ,
3336 ) ;
3437 parser . $refs . circular = dereferenced . circular ;
3538 parser . schema = dereferenced . value ;
@@ -46,6 +49,7 @@ function dereference<S extends object = JSONSchema, O extends ParserOptions<S> =
4649 * @param dereferencedCache - An map of all the dereferenced objects
4750 * @param $refs
4851 * @param options
52+ * @param startTime - The time when the dereferencing started
4953 * @returns
5054 */
5155function 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
5761 dereferencedCache : any ,
5862 $refs : $Refs < S , O > ,
5963 options : O ,
64+ startTime : number ,
6065) {
6166 let dereferenced ;
6267 const result = {
6368 value : obj ,
6469 circular : false ,
6570 } ;
6671
72+ if ( options && options . timeoutMs ) {
73+ if ( Date . now ( ) - startTime > options . timeoutMs ) {
74+ throw new TimeoutError ( options . timeoutMs ) ;
75+ }
76+ }
6777 const derefOptions = ( options . dereference || { } ) as DereferenceOptions ;
6878 const isExcludedPath = derefOptions . excludedPathMatcher || ( ( ) => false ) ;
6979
@@ -82,6 +92,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
8292 dereferencedCache ,
8393 $refs ,
8494 options ,
95+ startTime ,
8596 ) ;
8697 result . circular = dereferenced . circular ;
8798 result . value = dereferenced . value ;
@@ -107,6 +118,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
107118 dereferencedCache ,
108119 $refs ,
109120 options ,
121+ startTime ,
110122 ) ;
111123 circular = dereferenced . circular ;
112124 // Avoid pointless mutations; breaks frozen objects to no profit
@@ -125,6 +137,7 @@ function crawl<S extends object = JSONSchema, O extends ParserOptions<S> = Parse
125137 dereferencedCache ,
126138 $refs ,
127139 options ,
140+ startTime ,
128141 ) ;
129142 circular = dereferenced . circular ;
130143 // Avoid pointless mutations; breaks frozen objects to no profit
@@ -170,6 +183,7 @@ function dereference$Ref<S extends object = JSONSchema, O extends ParserOptions<
170183 dereferencedCache : any ,
171184 $refs : $Refs < S , O > ,
172185 options : O ,
186+ startTime : number ,
173187) {
174188 const isExternalRef = $Ref . isExternal$Ref ( $ref ) ;
175189 const shouldResolveOnCwd = isExternalRef && options ?. dereference ?. externalReferenceResolution === "root" ;
@@ -224,6 +238,7 @@ function dereference$Ref<S extends object = JSONSchema, O extends ParserOptions<
224238 dereferencedCache ,
225239 $refs ,
226240 options ,
241+ startTime ,
227242 ) ;
228243 circular = dereferenced . circular ;
229244 dereferencedValue = dereferenced . value ;
0 commit comments