From 5de857aca8ec916c54b1770af681bf8f60c1ca83 Mon Sep 17 00:00:00 2001 From: xion Date: Sun, 11 May 2025 15:56:06 +0800 Subject: [PATCH] add resource proxy --- package.json | 2 +- src/module/get-user-app.ts | 49 ++++++++++-------------------------- src/module/index.ts | 2 +- src/module/proxy/ai-proxy.ts | 14 ++++++++--- 4 files changed, 26 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 5a119a5..743e8d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "page-proxy", - "version": "0.0.4", + "version": "0.0.5", "description": "", "main": "index.js", "type": "module", diff --git a/src/module/get-user-app.ts b/src/module/get-user-app.ts index 349dc00..5a5ae1c 100644 --- a/src/module/get-user-app.ts +++ b/src/module/get-user-app.ts @@ -14,14 +14,19 @@ import { downloadFileFromMinio } from './proxy/http-proxy.ts'; const pipelineAsync = promisify(pipeline); const { resources } = config?.proxy || { resources: 'https://minio.xiongxiao.me/resources' }; - +const wrapperResources = (resources: string, urlpath: string) => { + if (urlpath.startsWith('http')) { + return urlpath; + } + return `${resources}/${urlpath}`; +}; const demoData = { user: 'root', key: 'codeflow', appType: 'web-single', // version: '1.0.0', domain: null, - type: 'local', // local, oss, 默认是oss + type: 'oss', // oss, 默认是oss data: { files: [ { @@ -221,9 +226,9 @@ export class UserApp { // 将文件名和路径添加到 `data` 对象中 files.forEach((file) => { if (file.name === 'index.html') { - indexHtml = resources + '/' + file.path; + indexHtml = wrapperResources(resources, file.path); } - data[file.name] = resources + '/' + file.path; + data[file.name] = wrapperResources(resources, file.path); }); await redis.set('user:app:exist:' + app + ':' + user, indexHtml + '||etag||true', 'EX', 60 * 60 * 24 * 7); // 7天 await redis.set('user:app:permission:' + app + ':' + user, JSON.stringify(permission), 'EX', 60 * 60 * 24 * 7); // 7天 @@ -326,38 +331,9 @@ export const downloadUserAppFiles = async (user: string, app: string, data: type fs.mkdirSync(uploadFiles, { recursive: true }); } const newFiles = []; - try { - if (data.type === 'local') { - // local copy file - for (let i = 0; i < files.length; i++) { - const file = files[i]; - const copyFile = path.join(fileStore, file.path); - const destFile = path.join(uploadFiles, file.name); - const destDir = path.dirname(destFile); // 获取目标文件所在的目录路径 - // 检查目录是否存在,如果不存在则创建 - if (!checkFileExistsSync(destDir)) { - fs.mkdirSync(destDir, { recursive: true }); // 递归创建目录 - } - fs.copyFileSync(copyFile, destFile); - // const etag = await setEtag(fs.readFileSync(destFile, 'utf-8')); - const etag = nanoid(); - newFiles.push({ - name: file.name, - path: destFile.replace(fileStore, '') + '||' + etag, - }); - } - } - } catch (err) { - const userApp = new UserApp({ user, app }); - userApp.clearCacheData(); - return { - data: { - files: [], - }, - }; - } + if (data.type === 'oss') { - let serverPath = new URL(resources).href + '/'; + let serverPath = new URL(resources).href; let hasIndexHtml = false; // server download file for (let i = 0; i < files.length; i++) { @@ -371,8 +347,9 @@ export const downloadUserAppFiles = async (user: string, app: string, data: type if (!checkFileExistsSync(destDir)) { fs.mkdirSync(destDir, { recursive: true }); // 递归创建目录 } + const downloadURL = wrapperResources(serverPath, file.path); // 下载文件到 destFile - await downloadFile(serverPath + file.path, destFile); + await downloadFile(downloadURL, destFile); const etag = nanoid(); newFiles.push({ name: file.name, diff --git a/src/module/index.ts b/src/module/index.ts index a9b6a53..bb7c177 100644 --- a/src/module/index.ts +++ b/src/module/index.ts @@ -227,7 +227,7 @@ export const handleRequest = async (req: http.IncomingMessage, res: http.ServerR res.write(msg || 'Not Found App\n'); res.end(); }; - if (app === 'ai') { + if (app === 'ai' || user === 'resources') { return aiProxy(req, res, { createNotFoundPage, }); diff --git a/src/module/proxy/ai-proxy.ts b/src/module/proxy/ai-proxy.ts index c0e3566..125e8bb 100644 --- a/src/module/proxy/ai-proxy.ts +++ b/src/module/proxy/ai-proxy.ts @@ -18,16 +18,24 @@ export const aiProxy = async ( const pathname = _u.pathname; const params = _u.searchParams; const password = params.get('p'); - const version = params.get('version') || '1.0.0'; + let objectName = ''; + let owner = ''; const { user, app } = getUserFromRequest(req); - const objectName = pathname.replace(`/${user}/${app}/`, `${user}/${app}/${version}/`); + if (user === 'ai') { + const version = params.get('version') || '1.0.0'; // root/ai + objectName = pathname.replace(`/${user}/${app}/`, `${user}/${app}/${version}/`); + owner = user; + } else { + objectName = pathname.replace(`/${user}`, ``); // resources/root/ + owner = app; + } try { const stat = await minioClient.statObject(bucketName, objectName); if (stat.size === 0) { createNotFoundPage('Invalid proxy url'); return true; } - const permissionInstance = new UserPermission({ permission: stat.metaData as Permission, owner: user }); + const permissionInstance = new UserPermission({ permission: stat.metaData as Permission, owner: owner }); const loginUser = await getLoginUser(req); const checkPermission = permissionInstance.checkPermissionSuccess({ username: loginUser?.tokenUser?.username || '',