Просмотр исходного кода

fix: load WASM grammars sequentially to avoid Node 20+ race condition

web-tree-sitter has a known race condition when loading multiple WASM
grammars concurrently on Node.js 19+ (V8 10.8+). External scanner
symbols from one grammar can overwrite another's GOT entries, causing
"bad export type" errors for TypeScript, TSX, and other languages.

Replace Promise.allSettled(entries.map(...)) with a sequential for...of
loop so each grammar fully initializes before the next one starts.

Ref: https://github.com/tree-sitter/tree-sitter/issues/2338
Rafael Vescovi 4 месяцев назад
Родитель
Сommit
267c9e1379
1 измененных файлов с 13 добавлено и 14 удалено
  1. 13 14
      src/extraction/grammars.ts

+ 13 - 14
src/extraction/grammars.ts

@@ -86,21 +86,20 @@ export async function initGrammars(): Promise<void> {
 
   await Parser.init();
 
-  // Load all grammars in parallel
+  // Load grammars sequentially to avoid web-tree-sitter WASM race condition on Node 20+
+  // See: https://github.com/tree-sitter/tree-sitter/issues/2338
   const entries = Object.entries(WASM_GRAMMAR_FILES) as [GrammarLanguage, string][];
-  await Promise.allSettled(
-    entries.map(async ([lang, wasmFile]) => {
-      try {
-        const wasmPath = require.resolve(`tree-sitter-wasms/out/${wasmFile}`);
-        const language = await WasmLanguage.load(wasmPath);
-        languageCache.set(lang, language);
-      } catch (error) {
-        const message = error instanceof Error ? error.message : String(error);
-        console.warn(`[CodeGraph] Failed to load ${lang} grammar — parsing will be unavailable: ${message}`);
-        unavailableGrammarErrors.set(lang, message);
-      }
-    })
-  );
+  for (const [lang, wasmFile] of entries) {
+    try {
+      const wasmPath = require.resolve(`tree-sitter-wasms/out/${wasmFile}`);
+      const language = await WasmLanguage.load(wasmPath);
+      languageCache.set(lang, language);
+    } catch (error) {
+      const message = error instanceof Error ? error.message : String(error);
+      console.warn(`[CodeGraph] Failed to load ${lang} grammar — parsing will be unavailable: ${message}`);
+      unavailableGrammarErrors.set(lang, message);
+    }
+  }
 
   grammarsInitialized = true;
 }