fix(web): show file metadata in preview header (#1450)

This commit is contained in:
Ananovo
2026-08-10 10:47:58 +08:00
committed by GitHub
parent ad7f2a4084
commit 044d72fdc0
5 changed files with 69 additions and 3 deletions
@@ -0,0 +1,49 @@
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { mkdir, rm, stat, writeFile } from 'fs/promises'
import { join } from 'path'
import { tmpdir } from 'os'
import { RpcHandlerManager } from '../../../api/rpc/RpcHandlerManager'
import { registerFileHandlers } from './files'
async function createTempDir(prefix: string): Promise<string> {
const path = join(tmpdir(), `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}`)
await mkdir(path, { recursive: true })
return path
}
describe('file RPC handlers', () => {
let rootDir: string
let rpc: RpcHandlerManager
beforeEach(async () => {
rootDir = await createTempDir('hapi-file-handler')
rpc = new RpcHandlerManager({ scopePrefix: 'session-test' })
registerFileHandlers(rpc, rootDir)
})
afterEach(async () => {
await rm(rootDir, { recursive: true, force: true })
})
it('returns file metadata alongside content', async () => {
const filePath = join(rootDir, 'README.md')
await writeFile(filePath, '# test')
const expectedStats = await stat(filePath)
const response = await rpc.handleRequest({
method: 'session-test:readFile',
params: JSON.stringify({ path: 'README.md' })
})
const parsed = JSON.parse(response) as {
success: boolean
content?: string
size?: number
modified?: number
}
expect(parsed.success).toBe(true)
expect(parsed.content).toBe(Buffer.from('# test').toString('base64'))
expect(parsed.size).toBe(expectedStats.size)
expect(parsed.modified).toBe(expectedStats.mtime.getTime())
})
})
+7 -1
View File
@@ -44,9 +44,15 @@ export function registerFileHandlers(rpcHandlerManager: RpcHandlerManager, worki
try {
const resolvedPath = resolve(workingDirectory, data.path)
const stats = await stat(resolvedPath)
const buffer = await readFile(resolvedPath)
const content = buffer.toString('base64')
return { success: true, content }
return {
success: true,
content,
size: stats.size,
modified: stats.mtime.getTime()
}
} catch (error) {
logger.debug('Failed to read file:', error)
return rpcError(getErrorMessage(error, 'Failed to read file'))