fix: EISDIR error while zipping
Massimo Melina committed
Jan 2, 2022 at 22:54 UTC
04ea3ff64cb3ec002fcd5ffa161ca97c925f68b8
2 files changed
+10
-6
src/vfs.ts
+2
-2
@@ -1,7 +1,7 @@
1
import fs from 'fs/promises'
2
import { basename } from 'path'
3
import { isMatch } from 'micromatch'
4
-import { complySlashes, enforceFinal, prefix, wantArray } from './misc'
4
+import { complySlashes, enforceFinal, isDirectory, prefix, wantArray } from './misc'
5
import { getCurrentUsernameExpanded } from './perm'
6
import Koa from 'koa'
7
import glob from 'fast-glob'
@@ -107,7 +107,7 @@ export async function* walkNode(parent:VfsNode, ctx: Koa.Context, depth:number=0
107
if (c.hidden || forbidden(c, ctx._who))
108
continue
109
yield prefixPath ? { ...c, name: prefixPath+c.name } : c
110
- if (depth > 0 && c)
110
+ if (depth > 0 && c && (c.children || c.source && await isDirectory(c.source)))
111
yield* walkNode(c, ctx, depth - 1, prefixPath+c.name+'/')
112
}
113
if (!source)
src/zip.ts
+8
-4
@@ -13,10 +13,14 @@ export async function zipStreamFromFolder(node: VfsNode, ctx: Koa.Context) {
13
const walker = filterMapGenerator(walkNode(node, ctx, Infinity), async (el:VfsNode) => {
14
if (!el.source || ctx.req.aborted)
15
return
16
- const st = await fs.stat(el.source)
17
- if (!st?.isFile())
18
- return
19
- return { path:el.name, size:st.size, ts:st.mtime||st.ctime, data: createReadStream(el.source) }
16
+ try {
17
+ const st = await fs.stat(el.source)
18
+ if (!st || !st.isFile())
19
+ return
20
+ return { path:el.name, size:st.size, ts:st.mtime||st.ctime, data: createReadStream(el.source) }
21
+ }
22
+ catch(e) {}
23
+
24
})
25
ctx.body = new QuickZipStream(walker)
26
}