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 }