Skip to content

Commit e51c0a4

Browse files
committed
fix(copy): use fs.copyFile and reduce concurrent copy tasks
1 parent 776dee0 commit e51c0a4

2 files changed

Lines changed: 33 additions & 15 deletions

File tree

src/compiler/copy/copy-tasks-worker.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ export async function copyTasksWorker(copyTasks: d.CopyTask[]) {
1818

1919
// figure out all the file copy tasks we'll have
2020
// by digging down through any directory copy tasks
21-
await Promise.all(copyTasks.map(async copyTask => {
22-
await processCopyTask(fs, results, allCopyTasks, copyTask);
23-
}));
21+
while (copyTasks.length > 0) {
22+
const tasks = copyTasks.splice(0, 100);
23+
24+
await Promise.all(tasks.map(async copyTask => {
25+
await processCopyTask(fs, results, allCopyTasks, copyTask);
26+
}));
27+
}
2428

2529
// figure out which directories we'll need to make first
2630
const mkDirs = ensureDirs(allCopyTasks);
@@ -30,10 +34,13 @@ export async function copyTasksWorker(copyTasks: d.CopyTask[]) {
3034
} catch (mkDirErr) {}
3135
}
3236

33-
// begin copying all the files
34-
await Promise.all(allCopyTasks.map(async copyTask => {
35-
await fs.copyFile(copyTask.src, copyTask.dest);
36-
}));
37+
while (allCopyTasks.length > 0) {
38+
const tasks = allCopyTasks.splice(0, 100);
39+
40+
await Promise.all(tasks.map(async copyTask => {
41+
await fs.copyFile(copyTask.src, copyTask.dest);
42+
}));
43+
}
3744

3845
} catch (e) {
3946
catchError(results.diagnostics, e);

src/sys/node/node-fs.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,25 @@ export class NodeFs implements d.FileSystem {
66

77
copyFile(src: string, dest: string) {
88
return new Promise<void>((resolve, reject) => {
9-
const readStream = fs.createReadStream(src);
10-
readStream.on('error', reject);
11-
12-
const writeStream = fs.createWriteStream(dest);
13-
writeStream.on('error', reject);
14-
writeStream.on('close', resolve);
15-
16-
readStream.pipe(writeStream);
9+
if (typeof fs.copyFile === 'function') {
10+
fs.copyFile(src, dest, fs.constants.COPYFILE_FICLONE, (err) => {
11+
if (err) {
12+
reject(err);
13+
} else {
14+
resolve();
15+
}
16+
});
17+
18+
} else {
19+
const readStream = fs.createReadStream(src);
20+
readStream.on('error', reject);
21+
22+
const writeStream = fs.createWriteStream(dest);
23+
writeStream.on('error', reject);
24+
writeStream.on('close', resolve);
25+
26+
readStream.pipe(writeStream);
27+
}
1728
});
1829
}
1930

0 commit comments

Comments
 (0)