@samitouri / QOSami-HFS / commits / 92496eb3

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 }