-
Notifications
You must be signed in to change notification settings - Fork 22
/
save.js
45 lines (42 loc) · 1.22 KB
/
save.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const { createWriteStream } = require("fs");
const { dirname, resolve } = require("path");
const { promisify } = require("util");
const stream = require("stream");
const { ensureDir } = require("./fs");
const finished = promisify(stream.finished);
async function save(outDir, files) {
const asyncEntries = [];
for await (const codeEntry of files) {
const [filePath, file] = codeEntry;
const outPath = resolve(outDir, filePath);
await ensureDir(dirname(outPath));
if ("readSync" in file) {
await saveOne(outPath, { read: async (p) => file.readSync(p) });
} else {
asyncEntries.push(codeEntry);
}
}
await Promise.all(asyncEntries.map(async ([filePath, file]) => {
const outPath = resolve(outDir, filePath);
await saveOne(outPath, file);
}));
}
exports.default = save;
async function saveOne(outPath, reader) {
let gotEOF = false;
const writable = createWriteStream(outPath);
try {
while (!gotEOF) {
const b = new Uint8Array(32 * 1024);
const result = await reader.read(b);
if (result == null) {
gotEOF = true;
} else {
writable.write(b.subarray(0, result));
}
}
} finally {
writable.end();
}
await finished(writable);
}