@mrxkun/mcfast-mcp 3.3.5 → 3.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,9 @@
1
1
  /**
2
- * Tree-sitter Language Loader
2
+ * Tree-sitter Language Loader (v4.0+)
3
+ *
4
+ * Performance Optimization:
5
+ * - Cache Parser instances per language to avoid WASM re-initialization overhead
6
+ * - Reusing parsers significantly reduces latency for repeated operations
3
7
  */
4
8
  import path from 'path';
5
9
  import { createRequire } from 'module';
@@ -12,36 +16,31 @@ const require = createRequire(import.meta.url);
12
16
  const _Parser = require('web-tree-sitter');
13
17
 
14
18
  let Parser = _Parser;
15
- // If default export exists, use it
16
19
  if (Parser.default) {
17
20
  Parser = Parser.default;
18
21
  }
19
- // If Parser property exists and Parser itself isn't the constructor
20
22
  if (typeof Parser !== 'function' && Parser.Parser) {
21
23
  Parser = Parser.Parser;
22
24
  }
23
25
 
24
26
  let isInitialized = false;
25
27
  const languageCache = new Map();
28
+ const parserCache = new Map();
26
29
 
27
- // Map internal language IDs to WASM filenames
28
30
  const WASM_MAP = {
29
31
  'go': 'tree-sitter-go.wasm',
30
32
  'rust': 'tree-sitter-rust.wasm',
31
33
  'java': 'tree-sitter-java.wasm',
32
34
  'javascript': 'tree-sitter-javascript.wasm',
33
- 'typescript': 'tree-sitter-javascript.wasm', // TS often uses JS or its own, using JS for now as fallback/compatible
35
+ 'typescript': 'tree-sitter-javascript.wasm',
34
36
  'python': 'tree-sitter-python.wasm',
35
37
  'cpp': 'tree-sitter-cpp.wasm',
36
- 'c': 'tree-sitter-cpp.wasm', // C typically uses C++ parser or its own. Using CPP for now as it handles C.
38
+ 'c': 'tree-sitter-cpp.wasm',
37
39
  'csharp': 'tree-sitter-c-sharp.wasm',
38
40
  'php': 'tree-sitter-php.wasm',
39
41
  'ruby': 'tree-sitter-ruby.wasm',
40
42
  };
41
43
 
42
- /**
43
- * Initialize web-tree-sitter
44
- */
45
44
  async function init() {
46
45
  if (isInitialized) return;
47
46
  try {
@@ -52,7 +51,6 @@ async function init() {
52
51
  isInitialized = true;
53
52
  } catch (e) {
54
53
  console.error('Failed to initialize web-tree-sitter:', e);
55
- // Fallback: try without explicit path (may work if in same dir)
56
54
  try {
57
55
  await Parser.init();
58
56
  isInitialized = true;
@@ -62,10 +60,6 @@ async function init() {
62
60
  }
63
61
  }
64
62
 
65
- /**
66
- * Load language parser
67
- * @param {string} language - 'go', 'rust', 'java', etc.
68
- */
69
63
  export async function loadLanguage(language) {
70
64
  if (!isInitialized) await init();
71
65
 
@@ -78,12 +72,7 @@ export async function loadLanguage(language) {
78
72
  throw new Error(`Unsupported tree-sitter language: ${language}`);
79
73
  }
80
74
 
81
- // Resolve path to wasm file
82
- // Assuming this file is at packages/mcp-client/src/strategies/tree-sitter/languages.js
83
- // and wasm files are at packages/mcp-client/src/strategies/tree-sitter/wasm/
84
75
  const wasmPath = path.resolve(__dirname, 'wasm', wasmFile);
85
-
86
- // Resolve Language class
87
76
  let Language = Parser.Language;
88
77
  if (!Language && _Parser.Language) {
89
78
  Language = _Parser.Language;
@@ -94,20 +83,50 @@ export async function loadLanguage(language) {
94
83
  languageCache.set(language, lang);
95
84
  return lang;
96
85
  } catch (e) {
97
- // Fallback for different environments where __dirname might behave differently
98
- // Try relative path if absolute fails, or check common locations
99
86
  console.error(`Failed to load language ${language} from ${wasmPath}`, e);
100
87
  throw e;
101
88
  }
102
89
  }
103
90
 
91
+ /**
92
+ * Get cached Parser instance for language (v4.0 optimization)
93
+ * Reuses Parser instances instead of creating new ones each time
94
+ */
104
95
  export async function getParser(language) {
96
+ if (!isInitialized) await init();
97
+
98
+ if (parserCache.has(language)) {
99
+ return parserCache.get(language);
100
+ }
101
+
105
102
  const lang = await loadLanguage(language);
106
103
  const parser = new Parser();
107
104
  parser.setLanguage(lang);
105
+ parserCache.set(language, parser);
108
106
  return parser;
109
107
  }
110
108
 
109
+ /**
110
+ * Clear parser cache (useful for testing or memory management)
111
+ */
112
+ export function clearParserCache() {
113
+ for (const parser of parserCache.values()) {
114
+ parser.delete?.();
115
+ }
116
+ parserCache.clear();
117
+ }
118
+
119
+ /**
120
+ * Get cache statistics
121
+ */
122
+ export function getCacheStats() {
123
+ return {
124
+ languagesLoaded: languageCache.size,
125
+ parsersCached: parserCache.size,
126
+ supportedLanguages: Object.keys(WASM_MAP)
127
+ };
128
+ }
129
+
111
130
  /**
112
131
  * Get compiled query for language
113
132
  */