





















@@ -1,6 +1,7 @@
11import { promises as fs } from "node:fs";
22import path from "node:path";
334+const DEFAULT_SOURCE_FILE_READ_CONCURRENCY = 32;
45const scanCache = new Map();
5667function normalizeRepoPath(repoRoot, filePath) {
@@ -34,7 +35,35 @@ async function walkFiles(params, rootDir) {
3435return out;
3536}
363738+function normalizeConcurrency(value) {
39+if (!Number.isInteger(value) || value < 1) {
40+return DEFAULT_SOURCE_FILE_READ_CONCURRENCY;
41+}
42+return value;
43+}
44+45+export async function mapWithConcurrency(items, concurrency, mapper) {
46+const out = Array.from({ length: items.length });
47+const workerCount = Math.min(normalizeConcurrency(concurrency), items.length);
48+let nextIndex = 0;
49+50+async function worker() {
51+for (;;) {
52+const index = nextIndex;
53+nextIndex += 1;
54+if (index >= items.length) {
55+return;
56+}
57+out[index] = await mapper(items[index], index);
58+}
59+}
60+61+await Promise.all(Array.from({ length: workerCount }, () => worker()));
62+return out;
63+}
64+3765export async function collectSourceFileContents(params) {
66+const useCache = !params.readFile;
3867const cacheKey = JSON.stringify({
3968repoRoot: params.repoRoot,
4069scanRoots: params.scanRoots,
@@ -43,9 +72,11 @@ export async function collectSourceFileContents(params) {
4372left.localeCompare(right),
4473),
4574});
46-const cached = scanCache.get(cacheKey);
47-if (cached) {
48-return await cached;
75+if (useCache) {
76+const cached = scanCache.get(cacheKey);
77+if (cached) {
78+return await cached;
79+}
4980}
50815182const promise = (async () => {
@@ -59,22 +90,29 @@ export async function collectSourceFileContents(params) {
5990normalizeRepoPath(params.repoRoot, left).localeCompare(
6091normalizeRepoPath(params.repoRoot, right),
6192),
62- );
93+);
639464-return await Promise.all(
65-files.map(async (filePath) => ({
95+const readFile = params.readFile ?? fs.readFile;
96+return await mapWithConcurrency(
97+files,
98+params.maxConcurrentReads,
99+async (filePath) => ({
66100 filePath,
67101relativeFile: normalizeRepoPath(params.repoRoot, filePath),
68-content: await fs.readFile(filePath, "utf8"),
69-})),
102+content: await readFile(filePath, "utf8"),
103+}),
70104);
71105})();
7210673-scanCache.set(cacheKey, promise);
107+if (useCache) {
108+scanCache.set(cacheKey, promise);
109+}
74110try {
75111return await promise;
76112} catch (error) {
77-scanCache.delete(cacheKey);
113+if (useCache) {
114+scanCache.delete(cacheKey);
115+}
78116throw error;
79117}
80118}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。