fix: symlink 探测有界并发 + UNC 标记平台中性化(回应 CR/自审)

- fs-tree: symlink 目标 stat 从串行改为 32 并发工作池(readdir 流关闭后统一
  探测),symlink 密集/网络目标目录不再累加延迟;顺序与分类语义不变
- html-route: 解码不再重建反斜杠 UNC,统一重建为平台中性的 //server/share/...
  前斜杠形态(win32/POSIX 均正确 resolve),从而删除 windowsPathStyle 平台信号
  与 client isWindowsStylePath 助手;同时解决无 cwd 时正斜杠 UNC 的往返盲点
- 测试/文档同步;移除未使用的 isPosix
This commit is contained in:
Menghuan1918
2026-08-16 23:35:57 +08:00
parent 9652bbda59
commit be95787c00
10 changed files with 104 additions and 114 deletions
+5 -21
View File
@@ -8,7 +8,6 @@
*/
import { encodeHtmlUrl } from '../html-route.ts'
import type { BrowserProbeResult } from './browser.ts'
import { isWindowsStylePath } from './paths.ts'
/** One wire failure. */
export class SidebarApiError extends Error {
@@ -212,29 +211,14 @@ function fileUrl(scope: SessionScope, path: string, download: boolean): string {
return `/sidebar/file?${params.toString()}`
}
/** A forward-slash UNC share (`//server/share/...`) — ambiguous with a POSIX
* absolute path, so it only counts as Windows-style when the session cwd is
* itself a forward-slash UNC (see htmlUrl). */
function isForwardSlashUnc(path: string): boolean {
return /^\/\/[^/]/.test(path)
}
/**
* Absolute URL of the HTML preview route (see html-route.ts): the path is
* fully encoded so the previewed page's relative assets resolve back into
* the same route with the session scope intact. The platform guard for the
* UNC marker comes from the session cwd's shape (the browser OS may differ
* from the host OS, so no client-side platform detection is used), extended
* by the file path itself: an unambiguous backslash UNC path keeps its '//'
* marker even while the cwd is still hydrating or arrives in forward-slash
* form. A forward-slash `//` path is only marked when the cwd is itself a
* forward-slash UNC — a POSIX session keeps `//server/share/...` as an
* ordinary absolute path.
* the same route with the session scope intact. The UNC marker is
* platform-neutral — the host's requireAbsolute resolves the decoded
* forward-slash `//server/share/...` form on both win32 and POSIX — so no
* client-side platform signal is needed.
*/
export function htmlUrl(scope: SessionScope, path: string): string {
const cwd = scope.cwd ?? ''
const windowsPathStyle = isWindowsStylePath(cwd)
|| isWindowsStylePath(path)
|| (isForwardSlashUnc(path) && isForwardSlashUnc(cwd))
return encodeHtmlUrl(scope.sessionId, path, windowsPathStyle)
return encodeHtmlUrl(scope.sessionId, path)
}