@@ -23,47 +23,50 @@ class ParserWorker {
2323 [ Symbol . dispose ] ( ) {
2424 this . #worker. terminate ( ) ;
2525 }
26- parse ( position : number , source : string ) : Promise < Dictionary > {
26+ #rawParse( position : number , source : string ) : Promise < Dictionary > {
27+ return new Promise ( ( resolve , reject ) => {
28+ const messageCallback = ( event : MessageEvent ) => {
29+ const result = event . data as Result ;
30+ switch ( result . type ) {
31+ case "value" :
32+ resolve ( result . value ) ;
33+ this . #cachedSource = source ;
34+ this . #cachedDictionary = result . value ;
35+ break ;
36+ case "error" :
37+ reject (
38+ new AggregateError (
39+ result . error . map ( ( result ) =>
40+ new PositionedError ( result . message , {
41+ position : mapNullable (
42+ result . position ,
43+ ( { position : offsetPosition , length } ) => ( {
44+ position : position + offsetPosition ,
45+ length,
46+ } ) ,
47+ ) ?? undefined ,
48+ } )
49+ ) ,
50+ ) ,
51+ ) ;
52+ break ;
53+ }
54+ this . #worker. removeEventListener ( "message" , messageCallback ) ;
55+ } ;
56+ this . #worker. addEventListener ( "message" , messageCallback ) ;
57+ const errorCallback = ( event : ErrorEvent ) => {
58+ reject ( event . error ) ;
59+ this . #worker. removeEventListener ( "error" , errorCallback ) ;
60+ } ;
61+ this . #worker. addEventListener ( "error" , errorCallback ) ;
62+ this . #worker. postMessage ( source ) ;
63+ } ) ;
64+ }
65+ async parse ( position : number , source : string ) : Promise < Dictionary > {
2766 if ( this . #cachedSource === source ) {
28- return Promise . resolve ( this . #cachedDictionary) ;
67+ return this . #cachedDictionary;
2968 } else {
30- return new Promise ( ( resolve , reject ) => {
31- const messageCallback = ( event : MessageEvent ) => {
32- const result = event . data as Result ;
33- switch ( result . type ) {
34- case "value" :
35- resolve ( result . value ) ;
36- this . #cachedSource = source ;
37- this . #cachedDictionary = result . value ;
38- break ;
39- case "error" :
40- reject (
41- new AggregateError (
42- result . error . map ( ( result ) =>
43- new PositionedError ( result . message , {
44- position : mapNullable (
45- result . position ,
46- ( { position : offsetPosition , length } ) => ( {
47- position : position + offsetPosition ,
48- length,
49- } ) ,
50- ) ?? undefined ,
51- } )
52- ) ,
53- ) ,
54- ) ;
55- break ;
56- }
57- this . #worker. removeEventListener ( "message" , messageCallback ) ;
58- } ;
59- this . #worker. addEventListener ( "message" , messageCallback ) ;
60- const errorCallback = ( event : ErrorEvent ) => {
61- reject ( event . error ) ;
62- this . #worker. removeEventListener ( "error" , errorCallback ) ;
63- } ;
64- this . #worker. addEventListener ( "error" , errorCallback ) ;
65- this . #worker. postMessage ( source ) ;
66- } ) ;
69+ return await this . #rawParse( position , source ) ;
6770 }
6871 }
6972}
0 commit comments