@@ -18,45 +18,53 @@ class ParserWorker {
1818 new URL ( "./worker.ts" , import . meta. url ) ,
1919 { type : "module" } ,
2020 ) ;
21+ #cachedSource = "" ;
22+ #cachedDictionary: Dictionary = new Map ( ) ;
2123 [ Symbol . dispose ] ( ) {
2224 this . #worker. terminate ( ) ;
2325 }
2426 parse ( position : number , source : string ) : Promise < Dictionary > {
25- return new Promise ( ( resolve , reject ) => {
26- const messageCallback = ( event : MessageEvent ) => {
27- const result = event . data as Result ;
28- switch ( result . type ) {
29- case "value" :
30- resolve ( result . value ) ;
31- break ;
32- case "error" :
33- reject (
34- new AggregateError (
35- result . error . map ( ( result ) =>
36- new PositionedError ( result . message , {
37- position : mapNullable (
38- result . position ,
39- ( { position : offsetPosition , length } ) => ( {
40- position : position + offsetPosition ,
41- length,
42- } ) ,
43- ) ?? undefined ,
44- } )
27+ if ( this . #cachedSource === source ) {
28+ return Promise . resolve ( this . #cachedDictionary) ;
29+ } 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+ ) ,
4553 ) ,
46- ) ,
47- ) ;
48- break ;
49- }
50- this . #worker . removeEventListener ( "message" , messageCallback ) ;
51- } ;
52- this . #worker . addEventListener ( "message" , messageCallback ) ;
53- const errorCallback = ( event : ErrorEvent ) => {
54- reject ( event . error ) ;
55- this . #worker . removeEventListener ( "error" , errorCallback ) ;
56- } ;
57- this . #worker. addEventListener ( "error" , errorCallback ) ;
58- this . #worker . postMessage ( source ) ;
59- } ) ;
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+ } ) ;
67+ }
6068 }
6169}
6270export class Parser {
0 commit comments