small optimization
Massimo Melina committed
Oct 8, 2024 at 14:48 UTC
92496eb38d6f2ec1d3bcb9b99d69281dde7ad767
1 file changed
+17
-5
src/vfs.ts
+17
-5
@@ -3,13 +3,13 @@
3
import fs from 'fs/promises'
4
import { basename, dirname, join, resolve } from 'path'
5
import {
6
- dirStream, getOrSet, isDirectory, makeMatcher, setHidden, onlyTruthy, isValidFileName, throw_, VfsPerms, Who,
6
+ dirStream, getOrSet, makeMatcher, setHidden, onlyTruthy, isValidFileName, throw_, VfsPerms, Who,
7
isWhoObject, WHO_ANY_ACCOUNT, defaultPerms, PERM_KEYS, removeStarting, HTTP_SERVER_ERROR, try_
8
} from './misc'
9
import Koa from 'koa'
10
import _ from 'lodash'
11
import { defineConfig, setConfig } from './config'
12
-import { HTTP_FORBIDDEN, HTTP_UNAUTHORIZED, IS_MAC, IS_WINDOWS, MIME_AUTO } from './const'
12
+import { HTTP_FORBIDDEN, HTTP_UNAUTHORIZED, IS_MAC, IS_WINDOWS } from './const'
13
import events from './events'
14
import { expandUsername } from './perm'
15
import { getCurrentUsername } from './auth'
@@ -115,8 +115,7 @@ export async function urlToNode(url: string, ctx?: Koa.Context, parent: VfsNode=
115
try {
116
if (!showHiddenFiles.get() && await isHiddenFile(ret.source))
117
throw 'hiddenFile'
118
- const st = ret.stats || await fs.stat(ret.source) // check existence
119
- ret.isFolder = st.isDirectory()
118
+ ret.isFolder = (await nodeStats(ret))!.isDirectory() // throws if doesn't exist on disk
119
}
120
catch {
121
if (!getRest)
@@ -128,6 +127,15 @@ export async function urlToNode(url: string, ctx?: Koa.Context, parent: VfsNode=
127
return ret
128
}
129
130
+async function nodeStats(ret: VfsNode) {
131
+ if (ret.stats)
132
+ if (_.isPlainObject(ret.stats)) delete ret.stats // legacy pre-55-alpha1
133
+ else return ret.stats
134
+ const stats = ret.source ? await fs.stat(ret.source) : undefined
135
+ setHidden(ret, { stats })
136
+ return stats
137
+}
138
+
139
async function isHiddenFile(path: string) {
140
return IS_WINDOWS ? new Promise(res => fswin.getAttributes(path, x => res(x?.IS_HIDDEN)))
141
: path[0] === '.'
@@ -191,7 +199,11 @@ export function getNodeName(node: VfsNode) {
199
export async function nodeIsDirectory(node: VfsNode) {
200
if (node.isFolder !== undefined)
201
return node.isFolder
194
- const isFolder = Boolean(node.children?.length || !nodeIsLink(node) && (node.stats?.isDirectory() ?? (!node.source || await isDirectory(node.source))))
202
+ if (node.children?.length || !node.source)
203
+ return true
204
+ if (nodeIsLink(node))
205
+ return false
206
+ const isFolder = await nodeStats(node).then(x => x!.isDirectory(), () => false)
207
setHidden(node, { isFolder }) // don't make it to the storage (a node.isTemp doesn't need it to be hidden)
208
return isFolder
209
}