nuwax-file-server 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as N}from"commander";import g from"path";import y from"os";import u from"fs-extra";import{spawn as D}from"cross-spawn";import{fileURLToPath as T}from"url";import{createRequire as b}from"module";var L=g.dirname(T(import.meta.url)),K=b(import.meta.url),E="1.2.
|
|
2
|
+
import{Command as N}from"commander";import g from"path";import y from"os";import u from"fs-extra";import{spawn as D}from"cross-spawn";import{fileURLToPath as T}from"url";import{createRequire as b}from"module";var L=g.dirname(T(import.meta.url)),K=b(import.meta.url),E="1.2.4",l=new N,$={name:"nuwax-file-server",pidDir:g.join(y.tmpdir(),"nuwax-file-server"),logDir:g.join(y.tmpdir(),"nuwax-file-server","logs"),pidFile:g.join(y.tmpdir(),"nuwax-file-server","server.pid")},d={reset:"\x1B[0m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",cyan:"\x1B[36m"};function a(e,o="reset"){console.log(`${d[o]}${e}${d.reset}`)}function f(e){console.error(`${d.red}ERROR: ${e}${d.reset}`)}function r(e){console.log(`${d.green}${e}${d.reset}`)}function s(e){console.log(`${d.blue}${e}${d.reset}`)}function h(){return $.pidFile}function R(){try{let e=h();if(u.existsSync(e)){let o=u.readFileSync(e,"utf8");return JSON.parse(o)}}catch{}return null}function j(e){let o=g.dirname(h());u.ensureDirSync(o),u.writeFileSync(h(),JSON.stringify(e,null,2))}function x(){let e=h();u.existsSync(e)&&u.removeSync(e)}function v(e){try{return process.kill(e,0),!0}catch(o){return o.code==="ESRCH"||o.code==="EPERM",!1}}async function k(e,o=!1){return new Promise(t=>{if(process.platform==="win32"){let i=o?["/F","/PID",String(e)]:["/PID",String(e)],n=D("taskkill",i,{stdio:"pipe"});n.on("error",c=>{f(`\u505C\u6B62\u8FDB\u7A0B\u5931\u8D25: ${c.message}`),t(!1)}),n.on("close",c=>{c===0?(r(`\u8FDB\u7A0B ${e} \u5DF2\u505C\u6B62`),t(!0)):o?D("taskkill",["/F","/PID",String(e)],{stdio:"pipe"}).on("close",m=>{t(m===0)}):t(!1)})}else try{process.kill(-e,o?"SIGKILL":"SIGTERM"),r(`\u8FDB\u7A0B\u7EC4 ${e} \u5DF2\u505C\u6B62`),t(!0)}catch(i){if(i.code==="ESRCH")r(`\u8FDB\u7A0B ${e} \u4E0D\u5B58\u5728\uFF0C\u89C6\u4E3A\u5DF2\u505C\u6B62`),t(!0);else try{process.kill(e,o?"SIGKILL":"SIGTERM"),r(`\u8FDB\u7A0B ${e} \u5DF2\u505C\u6B62`),t(!0)}catch(n){n.code==="ESRCH"?(r(`\u8FDB\u7A0B ${e} \u4E0D\u5B58\u5728\uFF0C\u89C6\u4E3A\u5DF2\u505C\u6B62`),t(!0)):(f(`\u505C\u6B62\u8FDB\u7A0B\u5931\u8D25: ${n.message}`),t(!1))}}})}async function F(e){let{env:o,port:t,config:w}=e,i=new Set(["env","port","config","force","help","version"]);process.argv.slice(2).forEach(p=>{if(p.startsWith("--")&&p.includes("=")){let O=p.indexOf("="),P=p.slice(2,O);if(!i.has(P)){let _=p.slice(O+1);process.env[P]=_,s(`CLI \u53C2\u6570\u8986\u76D6\u73AF\u5883\u53D8\u91CF: ${P}=${_}`)}}}),s(`\u542F\u52A8 ${$.name} \u670D\u52A1...`);let n=R();n&&v(n.pid)&&(f(`\u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D (PID: ${n.pid})`),s("\u8BF7\u4F7F\u7528 'nuwax-file-server stop' \u505C\u6B62\u73B0\u6709\u670D\u52A1\u540E\u518D\u8BD5"),process.exit(1));let c=o||"production";process.env.NODE_ENV=c,s(`\u4F7F\u7528\u73AF\u5883: ${c}`),t&&(process.env.PORT=t,s(`\u4F7F\u7528\u7AEF\u53E3: ${t}`)),w&&(process.env.CONFIG_FILE=w,s(`\u4F7F\u7528\u914D\u7F6E\u6587\u4EF6: ${w}`)),u.ensureDirSync($.logDir);let I=g.join(L,"server.js"),m=D("node",[I],{env:{...process.env,NODE_ENV:c},stdio:"inherit",detached:!0,cwd:process.cwd(),windowsHide:!0});m.on("error",p=>{f(`\u542F\u52A8\u670D\u52A1\u5931\u8D25: ${p.message}`),process.exit(1)}),await new Promise(p=>setTimeout(p,2e3)),v(m.pid)||(f("\u670D\u52A1\u542F\u52A8\u5931\u8D25"),process.exit(1));let S={pid:m.pid,startedAt:new Date().toISOString(),env:o||"production",port:t||process.env.PORT||"60000",version:E,platform:process.platform};j(S),m.unref(),r(`\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${m.pid})`),a(`\u670D\u52A1\u8FD0\u884C\u5728: http://localhost:${S.port}`,"cyan"),a(`\u73AF\u5883: ${S.env}`,"cyan"),a(`\u5E73\u53F0: ${S.platform}`,"cyan"),a(`PID \u6587\u4EF6: ${h()}`,"cyan")}async function C(e){let{force:o}=e;s(`\u505C\u6B62 ${$.name} \u670D\u52A1...`);let t=R();t||(f("\u672A\u627E\u5230\u8FD0\u884C\u4E2D\u7684\u670D\u52A1"),s("\u670D\u52A1\u53EF\u80FD\u672A\u542F\u52A8\u6216 PID \u6587\u4EF6\u5DF2\u4E22\u5931"),process.exit(0)),v(t.pid)||(s("\u670D\u52A1\u8FDB\u7A0B\u5DF2\u505C\u6B62\uFF0C\u6E05\u7406 PID \u6587\u4EF6..."),x(),r("\u670D\u52A1\u5DF2\u505C\u6B62"),process.exit(0)),await k(t.pid,o)&&(await new Promise(n=>setTimeout(n,1e3)),v(t.pid)||(x(),r("\u670D\u52A1\u5DF2\u505C\u6B62"),process.exit(0))),o&&(f("\u5F3A\u5236\u505C\u6B62\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u505C\u6B62\u8FDB\u7A0B"),process.exit(1)),s("\u5C1D\u8BD5\u5F3A\u5236\u505C\u6B62..."),await k(t.pid,!0)&&(await new Promise(n=>setTimeout(n,1e3)),v(t.pid)||(x(),r("\u670D\u52A1\u5DF2\u5F3A\u5236\u505C\u6B62"),process.exit(0))),f("\u505C\u6B62\u670D\u52A1\u5931\u8D25"),process.exit(1)}async function A(e){a(`\u91CD\u542F ${$.name} \u670D\u52A1...`,"yellow"),s("\u505C\u6B62\u73B0\u6709\u670D\u52A1...");try{await C({force:!1})}catch{s("\u670D\u52A1\u672A\u8FD0\u884C\u6216\u5DF2\u505C\u6B62")}await new Promise(o=>setTimeout(o,2e3)),s("\u542F\u52A8\u670D\u52A1..."),await F(e),r("\u670D\u52A1\u5DF2\u91CD\u542F")}function G(){s(`${$.name} \u670D\u52A1\u72B6\u6001:`);let e=R();e||(a("\u670D\u52A1\u672A\u8FD0\u884C","yellow"),process.exit(0));let o=v(e.pid);if(console.log(""),console.log(` \u670D\u52A1\u540D\u79F0: ${$.name}`),console.log(` \u8FD0\u884C\u72B6\u6001: ${o?"\u8FD0\u884C\u4E2D":"\u5DF2\u505C\u6B62"}`),console.log(` \u8FDB\u7A0B ID: ${e.pid}`),console.log(` \u73AF\u5883: ${e.env||"production"}`),console.log(` \u7AEF\u53E3: ${e.port||"60000"}`),console.log(` \u7248\u672C: ${e.version||E}`),console.log(` \u5E73\u53F0: ${e.platform||process.platform}`),console.log(` \u542F\u52A8\u65F6\u95F4: ${e.startedAt||"\u672A\u77E5"}`),e.startedAt){let t=new Date(e.startedAt),i=Math.floor((new Date-t)/1e3),n=Math.floor(i/3600),c=Math.floor(i%3600/60),I=i%60;console.log(` \u8FD0\u884C\u65F6\u95F4: ${n}\u5C0F\u65F6 ${c}\u5206 ${I}\u79D2`)}console.log(` PID \u6587\u4EF6: ${h()}`),console.log(""),o?a("\u670D\u52A1\u8FD0\u884C\u6B63\u5E38","green"):(a("\u8B66\u544A: \u670D\u52A1\u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u4F46 PID \u6587\u4EF6\u4ECD\u5B58\u5728","yellow"),s("\u5EFA\u8BAE\u6267\u884C stop \u547D\u4EE4\u6E05\u7406"))}function H(){l.name("nuwax-file-server").description("\u8DE8\u5E73\u53F0\u6587\u4EF6\u670D\u52A1\u90E8\u7F72\u5DE5\u5177\uFF0C\u652F\u6301 start/stop/restart/status").version(E,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F"),l.command("start").allowUnknownOption().description("\u542F\u52A8\u670D\u52A1").option("--env <environment>","\u73AF\u5883: development|production|test","production").option("--port <port>","\u670D\u52A1\u7AEF\u53E3\u53F7").option("--config <path>","\u81EA\u5B9A\u4E49\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84").action(F),l.command("stop").description("\u505C\u6B62\u670D\u52A1").option("--force","\u5F3A\u5236\u505C\u6B62").action(C),l.command("restart").allowUnknownOption().description("\u91CD\u542F\u670D\u52A1").option("--env <environment>","\u73AF\u5883: development|production|test","production").option("--port <port>","\u670D\u52A1\u7AEF\u53E3\u53F7").option("--config <path>","\u81EA\u5B9A\u4E49\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84").action(A),l.command("status").description("\u67E5\u770B\u670D\u52A1\u72B6\u6001").action(G),l.command("help").description("\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").action(()=>{l.outputHelp()}),l.parse(process.argv),process.argv.slice(2).length||(l.outputHelp(),process.exit(0))}H();
|
package/dist/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import O from"express";import"json-bigint";import m from"swagger-ui-express";import E from"./config/swagger.js";import s from"./appConfig/index.js";import{log as c,logger as I}from"./utils/log/logUtils.js";import S from"./utils/log/logCacheManager.js";import{errorHandler as P,notFoundHandler as
|
|
1
|
+
import O from"express";import"json-bigint";import m from"swagger-ui-express";import E from"./config/swagger.js";import s from"./appConfig/index.js";import{log as c,logger as I}from"./utils/log/logUtils.js";import S from"./utils/log/logCacheManager.js";import{errorHandler as P,notFoundHandler as w}from"./utils/error/errorHandler.js";import R from"./routes/router.js";import{cleanupInitProjectOnStartup as y}from"./utils/project/initProjectCleanupUtils.js";import{startScheduler as N,stopScheduler as D}from"./scheduler/pnpmPruneScheduler.js";import T from"path";const o=O();o.use(O.json({limit:s.REQUEST_BODY_LIMIT,reviver:(t,e)=>typeof e=="number"&&!Number.isSafeInteger(e)?e.toString():e})),o.use(O.urlencoded({extended:!0,limit:s.REQUEST_BODY_LIMIT})),o.use(I);const f=t=>{let e=t;try{for(;;){const n=decodeURIComponent(e);if(n===e)break;e=n}}catch{}return e};o.use("/api/page/static/:projectId",(t,e,n)=>{const{projectId:l}=t.params;let i=t.path||"/";if(!l||i==="/")return e.status(404).send("Not Found");const r=t.headers.origin,a=r||"*";if(e.header("Access-Control-Allow-Origin",a),e.header("Access-Control-Allow-Methods","HEAD,GET,POST,PUT,DELETE,OPTIONS"),e.header("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control, Fragment"),e.header("Access-Control-Expose-Headers","Content-Type"),r&&(e.header("Access-Control-Allow-Credentials","true"),e.header("Vary","Origin")),t.method==="OPTIONS")return e.sendStatus(200);i=i.replace(/^\/+/,"");const p=f(i),A=T.join(s.PROJECT_SOURCE_DIR,l,p),d={"Access-Control-Allow-Origin":a,"Access-Control-Allow-Methods":"HEAD,GET,POST,PUT,DELETE,OPTIONS","Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control, Fragment"};return r&&(d["Access-Control-Allow-Credentials"]="true",d.Vary="Origin"),e.sendFile(A,{dotfiles:"allow",headers:d},u=>{if(u)return n()})}),o.use("/api/computer/static/:userId/:cId",(t,e,n)=>{const{userId:l,cId:i}=t.params;let r=t.path||"/";if(!l||!i||r==="/")return e.status(404).send("Not Found");const a=t.headers.origin,p=a||"*";if(e.header("Access-Control-Allow-Origin",p),e.header("Access-Control-Allow-Methods","HEAD,GET,POST,PUT,DELETE,OPTIONS"),e.header("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control"),e.header("Access-Control-Expose-Headers","Content-Type"),a&&(e.header("Access-Control-Allow-Credentials","true"),e.header("Vary","Origin")),t.method==="OPTIONS")return e.sendStatus(200);r=r.replace(/^\/+/,"");const A=f(r),d=T.join(s.COMPUTER_WORKSPACE_DIR,l,i,A),u={"Access-Control-Allow-Origin":p,"Access-Control-Allow-Methods":"HEAD,GET,POST,PUT,DELETE,OPTIONS","Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control"};return a&&(u["Access-Control-Allow-Credentials"]="true",u.Vary="Origin"),e.sendFile(d,{dotfiles:"allow",headers:u},g=>{if(g)return n()})}),o.use("/api-docs",m.serve,m.setup(E,{customCss:".swagger-ui .topbar { display: none }",customSiteTitle:"nuwax-file-server API \u6587\u6863"})),o.use(R),o.use(w),o.use(P);const h=o.listen(s.PORT,async()=>{c("default","INFO",`Server is running on port ${s.PORT} (${s.NODE_ENV} mode)`),await y(s);try{N()}catch(t){c("default","ERROR",`pnpm prune \u5B9A\u65F6\u4EFB\u52A1\u542F\u52A8\u5931\u8D25: ${t.message}`)}});h.timeout=6e5,h.keepAliveTimeout=61e4,h.headersTimeout=62e4;const C=t=>{c("default","INFO",`\u6536\u5230 ${t} \u4FE1\u53F7\uFF0C\u51C6\u5907\u4F18\u96C5\u9000\u51FA...`),D();try{S.destroy(),c("default","INFO","\u65E5\u5FD7\u7F13\u5B58\u7BA1\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){c("default","ERROR",`\u6E05\u7406\u65E5\u5FD7\u7F13\u5B58\u7BA1\u7406\u5668\u5931\u8D25: ${e.message}`)}h.close(()=>{c("default","INFO","\u670D\u52A1\u5668\u5DF2\u5173\u95ED"),process.exit(0)}),setTimeout(()=>{c("default","ERROR","\u5F3A\u5236\u9000\u51FA\uFF08\u8D85\u65F6\uFF09"),process.exit(1)},3e4)};process.on("SIGTERM",()=>C("SIGTERM")),process.on("SIGINT",()=>C("SIGINT"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import m from"fs";import w from"path";import N from"archiver";import P from"../../appConfig/index.js";import{log as s}from"../log/logUtils.js";import{ValidationError as g,SystemError as F}from"../error/errorHandler.js";function v(l){try{const a=m.readFileSync(l);if(a.includes(0))return!0;const i=a.toString("utf-8");for(let c=0;c<i.length;c++){const r=i.charCodeAt(c);if(r<32&&r!==9&&r!==10&&r!==13)return!0}return!1}catch(a){return s("system","WARN",`\u68C0\u6D4B\u4E8C\u8FDB\u5236\u6587\u4EF6\u5931\u8D25: ${l}`,{error:a.message}),!1}}function j(l){const a=w.extname(l).toLowerCase();return[".jpg",".jpeg",".png",".gif",".bmp",".webp",".svg",".ico",".avif"].includes(a)}async function C(l,a,i,c){const r=[],R=await m.promises.readdir(l,{withFileTypes:!0});R.sort((n,o)=>n.isDirectory()&&!o.isDirectory()?-1:!n.isDirectory()&&o.isDirectory()?1:n.name.toLowerCase().localeCompare(o.name.toLowerCase()));for(const n of R){const o=w.join(l,n.name);if(!(n.name.startsWith(".")||(P.CONTENT_TRAVERSE_EXCLUDE_FILES||[]).includes(n.name))&&!(n.isDirectory()&&P.TRAVERSE_EXCLUDE_DIRS.includes(n.name)))if(n.isDirectory()){const e=await C(o,a,i,c);if(e.length===0){const d=a||l,h=w.relative(d,o).replace(/\\/g,"/");r.push({name:h,isDir:!0})}else r.push(...e)}else try{const e=await m.promises.stat(o),d=a||l,h=w.relative(d,o).replace(/\\/g,"/"),t=v(o),f=n.isSymbolicLink();let p=null;if(c){const y=h.split("/").map(I=>encodeURIComponent(I)).join("/");p=`${c}/${y}`}const E={name:h,isDir:!1,binary:t,fileProxyUrl:p,isLink:f};r.push(E)}catch(e){s(i,"WARN",`\u5904\u7406\u6587\u4EF6\u5931\u8D25: ${o}`,{error:e.message})}}return r}async function A(l,a,i){const c=Date.now(),r=`computer:${l}:${a}`,R=P.COMPUTER_WORKSPACE_DIR;if(!l)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!a)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});const n=String(l),o=String(a),u=w.join(R,n,o);if(!m.existsSync(u))return s(r,"INFO","\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u8FD4\u56DE\u7A7A\u5217\u8868",{targetDir:u,userId:n,cId:o}),{files:[]};s(r,"DEBUG","\u5F00\u59CB\u83B7\u53D6\u7528\u6237\u6587\u4EF6\u5217\u8868",{targetDir:u,userId:n,cId:o});try{const e=await C(u,u,r,i);return s(r,"INFO","\u7528\u6237\u6587\u4EF6\u5217\u8868\u83B7\u53D6\u5B8C\u6210",{fileCount:e.length,targetDir:u,userId:n,cId:o,elapsedMs:Date.now()-c}),{files:e}}catch(e){throw s(r,"ERROR","\u83B7\u53D6\u7528\u6237\u6587\u4EF6\u5217\u8868\u5931\u8D25",{targetDir:u,userId:n,cId:o,error:e.message,elapsedMs:Date.now()-c}),new F(`\u83B7\u53D6\u6587\u4EF6\u5217\u8868\u5931\u8D25: ${e.message}`,{targetDir:u,originalError:e.message})}}async function k(l,a,i){const c=Date.now(),r=`computer:${l}:${a}`,R=P.COMPUTER_WORKSPACE_DIR;if(!l)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!a)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!Array.isArray(i))throw new g("files\u5FC5\u987B\u662F\u6570\u7EC4",{field:"files"});const n=String(l),o=String(a),u=w.join(R,n,o);m.existsSync(u)||m.mkdirSync(u,{recursive:!0});for(let e=0;e<i.length;e++){const d=i[e];if(!d||typeof d.operation!="string")throw new g(`files[${e}].operation \u4E0D\u80FD\u4E3A\u7A7A`,{field:`files[${e}].operation`});if(!d.name||typeof d.name!="string")throw new g(`files[${e}].name \u4E0D\u80FD\u4E3A\u7A7A`,{field:`files[${e}].name`});const h=d.operation.toLowerCase();if(!["create","delete","rename","modify"].includes(h))throw new g(`files[${e}].operation \u5FC5\u987B\u662F create\u3001delete\u3001rename \u6216 modify \u4E4B\u4E00`,{field:`files[${e}].operation`});if(h==="rename"&&!d.renameFrom)throw new g(`files[${e}].renameFrom \u4E0D\u80FD\u4E3A\u7A7A\uFF08\u91CD\u547D\u540D\u64CD\u4F5C\u9700\u8981\uFF09`,{field:`files[${e}].renameFrom`});if(h==="modify"&&d.isDir!==!0&&typeof d.contents!="string")throw new g(`files[${e}].contents \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF08\u4FEE\u6539\u64CD\u4F5C\u9700\u8981\uFF09`,{field:`files[${e}].contents`})}s(r,"DEBUG","\u5F00\u59CB\u66F4\u65B0\u7528\u6237\u6587\u4EF6",{userId:n,cId:o,filesCount:i.length});try{for(const e of i){const d=e.operation.toLowerCase(),h=e.name,t=w.normalize(h).replace(/^[\/\\]+/,""),f=w.join(u,t),p=w.resolve(f),E=w.resolve(u);if(!p.startsWith(E+w.sep)&&p!==E){s(r,"WARN","\u6587\u4EF6\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u8DF3\u8FC7",{filePath:t,resolvedPath:p});continue}switch(d){case"create":{if(e.isDir===!0){if(m.existsSync(f)){if((await m.promises.stat(f)).isFile())throw new g("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55\uFF0C\u5DF2\u5B58\u5728\u540C\u540D\u6587\u4EF6",{filePath:t});s(r,"INFO","\u76EE\u5F55\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521B\u5EFA",{filePath:t});break}await m.promises.mkdir(f,{recursive:!0}),s(r,"INFO","\u76EE\u5F55\u521B\u5EFA\u6210\u529F",{filePath:t});break}if(m.existsSync(f)){if((await m.promises.stat(f)).isDirectory())throw new g("\u65E0\u6CD5\u521B\u5EFA\u6587\u4EF6\uFF0C\u5DF2\u5B58\u5728\u540C\u540D\u76EE\u5F55",{filePath:t});s(r,"INFO","\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521B\u5EFA",{filePath:t});break}await m.promises.mkdir(w.dirname(f),{recursive:!0});const y=e.contents||"";await m.promises.writeFile(f,y,"utf8"),s(r,"INFO","\u6587\u4EF6\u521B\u5EFA\u6210\u529F",{filePath:t});break}case"delete":{m.existsSync(f)?(await m.promises.stat(f)).isDirectory()?(await m.promises.rm(f,{recursive:!0,force:!0}),s(r,"INFO","\u76EE\u5F55\u5220\u9664\u6210\u529F",{filePath:t})):(await m.promises.unlink(f),s(r,"INFO","\u6587\u4EF6\u5220\u9664\u6210\u529F",{filePath:t})):s(r,"WARN","\u8981\u5220\u9664\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728",{filePath:t});break}case"rename":{const y=e.renameFrom;if(!y||typeof y!="string"){s(r,"WARN","\u91CD\u547D\u540D\u64CD\u4F5C\u7F3A\u5C11 renameFrom",{filePath:t});break}const I=w.normalize(y).replace(/^[\/\\]+/,""),D=w.join(u,I),S=w.resolve(D);if(!S.startsWith(E+w.sep)&&S!==E){s(r,"WARN","\u6E90\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u8DF3\u8FC7\u91CD\u547D\u540D",{sourcePath:I,targetPath:t});break}if(m.existsSync(D)){const $=(await m.promises.stat(D)).isDirectory();await m.promises.mkdir(w.dirname(f),{recursive:!0}),await m.promises.rename(D,f),s(r,"INFO",$?"\u76EE\u5F55\u91CD\u547D\u540D\u6210\u529F":"\u6587\u4EF6\u91CD\u547D\u540D\u6210\u529F",{sourcePath:I,targetPath:t})}else s(r,"WARN","\u8981\u91CD\u547D\u540D\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728",{sourcePath:I});break}case"modify":{if(!m.existsSync(f)){s(r,"WARN","\u8981\u4FEE\u6539\u7684\u6587\u4EF6\u4E0D\u5B58\u5728",{filePath:t});break}if((await m.promises.stat(f)).isDirectory()){s(r,"INFO","\u76EE\u6807\u662F\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u4FEE\u6539",{filePath:t});break}const I=typeof e.contents=="string"?e.contents:"";if(await m.promises.readFile(f,"utf8")===I){s(r,"INFO","\u6587\u4EF6\u5185\u5BB9\u65E0\u53D8\u5316\uFF0C\u8DF3\u8FC7\u5199\u5165",{filePath:t});break}await m.promises.writeFile(f,I,"utf8"),s(r,"INFO","\u6587\u4EF6\u4FEE\u6539\u6210\u529F",{filePath:t});break}default:{s(r,"WARN","\u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7C7B\u578B",{operation:d,filePath:t});break}}}return s(r,"INFO","\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u6210\u529F",{userId:n,cId:o,filesCount:i.length,elapsedMs:Date.now()-c}),{success:!0,message:"\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u6210\u529F",userId:n,cId:o,filesCount:i.length}}catch(e){throw s(r,"ERROR","\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u5931\u8D25",{userId:n,cId:o,error:e.message,elapsedMs:Date.now()-c}),new F(`\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u5931\u8D25: ${e.message}`,{userId:n,cId:o,originalError:e.message})}}async function O(l,a,i,c){const r=Date.now(),R=`computer:${l}:${a}`,n=P.COMPUTER_WORKSPACE_DIR;if(!l)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!a)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!i)throw new g("\u6587\u4EF6\u4E0D\u80FD\u4E3A\u7A7A",{field:"file"});if(!c||typeof c!="string")throw new g("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A",{field:"filePath"});const o=String(l),u=String(a),e=w.join(n,o,u);m.existsSync(e)||m.mkdirSync(e,{recursive:!0});const d=w.normalize(c).replace(/^[\/\\]+/,""),h=w.join(e,d),t=w.resolve(h),f=w.resolve(e);if(!t.startsWith(f+w.sep)&&t!==f)throw new g("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u8D85\u51FA\u7528\u6237\u76EE\u5F55",{field:"filePath",providedPath:c,resolvedPath:t});try{if(await m.promises.mkdir(w.dirname(h),{recursive:!0}),i.buffer)await m.promises.writeFile(h,i.buffer);else if(typeof i.contents=="string")await m.promises.writeFile(h,i.contents,"utf8");else throw new g("\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u4E0D\u6B63\u786E",{field:"file",hasBuffer:!!i.buffer,hasContents:typeof i.contents});return s(R,"INFO","\u6587\u4EF6\u4E0A\u4F20\u6210\u529F",{userId:o,cId:u,filePath:d,targetPath:t,fileSize:i.buffer?i.buffer.length:i.contents?i.contents.length:0,elapsedMs:Date.now()-r}),{success:!0,message:"\u6587\u4EF6\u4E0A\u4F20\u6210\u529F",fileSize:i.buffer?i.buffer.length:i.contents?i.contents.length:0}}catch(p){throw s(R,"ERROR","\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",{userId:o,cId:u,filePath:d,error:p.message,elapsedMs:Date.now()-r}),new F(`\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: ${p.message}`,{userId:o,cId:u,filePath:d,originalError:p.message})}}async function b(l,a,i,c){const r=Date.now(),R=`computer:${l}:${a}`;if(!l)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!a)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!Array.isArray(i))throw new g("files \u5FC5\u987B\u662F\u6570\u7EC4",{field:"files"});if(!Array.isArray(c))throw new g("filePaths \u5FC5\u987B\u662F\u6570\u7EC4",{field:"filePaths"});if(i.length!==c.length)throw new g(`\u6587\u4EF6\u6570\u91CF (${i.length}) \u4E0E\u8DEF\u5F84\u6570\u91CF (${c.length}) \u4E0D\u5339\u914D`,{field:"filePaths"});s(R,"DEBUG","\u5F00\u59CB\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6",{userId:l,cId:a,filesCount:i.length});const n=[];try{for(let e=0;e<i.length;e++){const d=i[e],h=c[e];if(!d){s(R,"WARN","\u6279\u91CF\u4E0A\u4F20\u4E2D\u9047\u5230\u7A7A\u6587\u4EF6\u5BF9\u8C61\uFF0C\u8DF3\u8FC7",{index:e,filePath:h}),n.push({success:!1,filePath:h,error:"\u6587\u4EF6\u5BF9\u8C61\u4E3A\u7A7A"});continue}if(!h||typeof h!="string"){s(R,"WARN","\u6279\u91CF\u4E0A\u4F20\u4E2D\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548\uFF0C\u8DF3\u8FC7",{index:e,originalname:d.originalname}),n.push({success:!1,filePath:h||"",originalname:d.originalname,error:"\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548"});continue}try{const t=await O(l,a,d,h);n.push({success:!0,filePath:h,originalname:d.originalname,...t})}catch(t){s(R,"ERROR","\u6279\u91CF\u4E0A\u4F20\u4E2D\u5355\u4E2A\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",{filePath:h,originalname:d.originalname,error:t.message}),n.push({success:!1,filePath:h,originalname:d.originalname,error:t.message})}}const o=n.filter(e=>e.success).length,u=n.filter(e=>!e.success).length;return s(R,"INFO","\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5B8C\u6210",{userId:l,cId:a,totalCount:i.length,successCount:o,failCount:u,elapsedMs:Date.now()-r}),{success:!0,message:"\u6279\u91CF\u4E0A\u4F20\u5B8C\u6210",totalCount:i.length,successCount:o,failCount:u,results:n}}catch(o){throw s(R,"ERROR","\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25",{userId:l,cId:a,error:o.message,elapsedMs:Date.now()-r}),new F(`\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25: ${o.message}`,{userId:l,cId:a,originalError:o.message})}}async function T(l,a){const i=Date.now(),c=`computer:${l}:${a}`,r=P.COMPUTER_WORKSPACE_DIR;if(!l)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!a)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!r)throw new F("COMPUTER_WORKSPACE_DIR \u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u521B\u5EFA\u538B\u7F29\u5305");const R=String(l),n=String(a),o=w.join(r,R,n);if(!m.existsSync(o)){const t=`${R}_${n}.zip`;s(c,"WARN","\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u8FD4\u56DE\u7A7A\u538B\u7F29\u5305",{targetDir:o,userId:R,cId:n,zipFileName:t});const f=N("zip",{zlib:{level:9}});return f.append(null,{name:`${R}_${n}/`,type:"directory"}),f.on("warning",p=>{if(p.code==="ENOENT")s(c,"WARN","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u65F6\u9047\u5230\u6587\u4EF6\u95EE\u9898",{message:p.message,code:p.code});else throw s(c,"ERROR","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u65F6\u53D1\u751F\u8B66\u544A",{message:p.message,code:p.code}),p}),f.on("error",p=>{s(c,"ERROR","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u5931\u8D25",{message:p.message})}),{archive:f,zipFileName:t}}const u=`${R}_${n}.zip`;s(c,"DEBUG","\u5F00\u59CB\u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55\u538B\u7F29\u5305",{targetDir:o,zipFileName:u});const e=N("zip",{zlib:{level:9}}),d=P.CONTENT_TRAVERSE_EXCLUDE_FILES||[],h=P.TRAVERSE_EXCLUDE_DIRS||[];return e.directory(o,`${R}_${n}`,t=>{const f=t.name||"",p=f.split(/[\/\\]/).filter(Boolean);if(p.some(y=>y.startsWith(".")))return!1;const E=p[p.length-1];if(d.includes(E)||p.some(y=>h.includes(y)))return!1;try{const y=w.join(o,f),I=m.lstatSync(y);if(I.isSymbolicLink()||I.nlink>1)return!1}catch(y){return s(c,"WARN","\u68C0\u6D4B\u94FE\u63A5\u6587\u4EF6\u65F6\u51FA\u9519\uFF0C\u8DF3\u8FC7\u8BE5\u6587\u4EF6",{filePath:f,error:y.message}),!1}return t}),e.on("warning",t=>{if(t.code==="ENOENT")s(c,"WARN","\u521B\u5EFA\u538B\u7F29\u5305\u65F6\u9047\u5230\u6587\u4EF6\u95EE\u9898",{message:t.message,code:t.code});else throw s(c,"ERROR","\u521B\u5EFA\u538B\u7F29\u5305\u65F6\u53D1\u751F\u8B66\u544A",{message:t.message,code:t.code}),t}),e.on("error",t=>{s(c,"ERROR","\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25",{message:t.message,elapsedMs:Date.now()-i})}),e.on("end",()=>{s(c,"INFO","\u5DE5\u4F5C\u76EE\u5F55\u538B\u7F29\u5305\u521B\u5EFA\u5B8C\u6210",{targetDir:o,zipFileName:u,elapsedMs:Date.now()-i})}),{archive:e,zipFileName:u}}export{A as getFileList,k as updateFiles,O as uploadFile,b as uploadFiles,T as downloadAllFiles};
|
|
1
|
+
import f from"fs";import w from"path";import S from"archiver";import P from"../../appConfig/index.js";import{log as r}from"../log/logUtils.js";import{ValidationError as g,SystemError as F}from"../error/errorHandler.js";async function O(m,d,o,l){const i=[],p=await f.promises.readdir(m,{withFileTypes:!0});p.sort((s,n)=>s.isDirectory()&&!n.isDirectory()?-1:!s.isDirectory()&&n.isDirectory()?1:s.name.toLowerCase().localeCompare(n.name.toLowerCase()));for(const s of p){const n=w.join(m,s.name);if(!(s.name.startsWith(".")||(P.CONTENT_TRAVERSE_EXCLUDE_FILES||[]).includes(s.name))&&!(s.isDirectory()&&P.TRAVERSE_EXCLUDE_DIRS.includes(s.name)))if(s.isDirectory()){const e=await O(n,d,o,l);if(e.length===0){const c=d||m,h=w.relative(c,n).replace(/\\/g,"/");i.push({name:h,isDir:!0})}else i.push(...e)}else try{const e=d||m,c=w.relative(e,n).replace(/\\/g,"/"),h=s.isSymbolicLink();let t=null;if(l){const R=c.split("/").map(E=>encodeURIComponent(E)).join("/");t=`${l}/${R}`}const a={name:c,isDir:!1,fileProxyUrl:t,isLink:h};i.push(a)}catch(e){r(o,"WARN",`\u5904\u7406\u6587\u4EF6\u5931\u8D25: ${n}`,{error:e.message})}}return i}async function v(m,d,o){const l=Date.now(),i=`computer:${m}:${d}`,p=P.COMPUTER_WORKSPACE_DIR;if(!m)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!d)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});const s=String(m),n=String(d),u=w.join(p,s,n);if(!f.existsSync(u))return r(i,"INFO","\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u8FD4\u56DE\u7A7A\u5217\u8868",{targetDir:u,userId:s,cId:n}),{files:[]};r(i,"DEBUG","\u5F00\u59CB\u83B7\u53D6\u7528\u6237\u6587\u4EF6\u5217\u8868",{targetDir:u,userId:s,cId:n});try{const e=await O(u,u,i,o);return r(i,"INFO","\u7528\u6237\u6587\u4EF6\u5217\u8868\u83B7\u53D6\u5B8C\u6210",{fileCount:e.length,targetDir:u,userId:s,cId:n,elapsedMs:Date.now()-l}),{files:e}}catch(e){throw r(i,"ERROR","\u83B7\u53D6\u7528\u6237\u6587\u4EF6\u5217\u8868\u5931\u8D25",{targetDir:u,userId:s,cId:n,error:e.message,elapsedMs:Date.now()-l}),new F(`\u83B7\u53D6\u6587\u4EF6\u5217\u8868\u5931\u8D25: ${e.message}`,{targetDir:u,originalError:e.message})}}async function A(m,d,o){const l=Date.now(),i=`computer:${m}:${d}`,p=P.COMPUTER_WORKSPACE_DIR;if(!m)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!d)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!Array.isArray(o))throw new g("files\u5FC5\u987B\u662F\u6570\u7EC4",{field:"files"});const s=String(m),n=String(d),u=w.join(p,s,n);f.existsSync(u)||f.mkdirSync(u,{recursive:!0});for(let e=0;e<o.length;e++){const c=o[e];if(!c||typeof c.operation!="string")throw new g(`files[${e}].operation \u4E0D\u80FD\u4E3A\u7A7A`,{field:`files[${e}].operation`});if(!c.name||typeof c.name!="string")throw new g(`files[${e}].name \u4E0D\u80FD\u4E3A\u7A7A`,{field:`files[${e}].name`});const h=c.operation.toLowerCase();if(!["create","delete","rename","modify"].includes(h))throw new g(`files[${e}].operation \u5FC5\u987B\u662F create\u3001delete\u3001rename \u6216 modify \u4E4B\u4E00`,{field:`files[${e}].operation`});if(h==="rename"&&!c.renameFrom)throw new g(`files[${e}].renameFrom \u4E0D\u80FD\u4E3A\u7A7A\uFF08\u91CD\u547D\u540D\u64CD\u4F5C\u9700\u8981\uFF09`,{field:`files[${e}].renameFrom`});if(h==="modify"&&c.isDir!==!0&&typeof c.contents!="string")throw new g(`files[${e}].contents \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF08\u4FEE\u6539\u64CD\u4F5C\u9700\u8981\uFF09`,{field:`files[${e}].contents`})}r(i,"DEBUG","\u5F00\u59CB\u66F4\u65B0\u7528\u6237\u6587\u4EF6",{userId:s,cId:n,filesCount:o.length});try{for(const e of o){const c=e.operation.toLowerCase(),h=e.name,t=w.normalize(h).replace(/^[\/\\]+/,""),a=w.join(u,t),R=w.resolve(a),E=w.resolve(u);if(!R.startsWith(E+w.sep)&&R!==E){r(i,"WARN","\u6587\u4EF6\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u8DF3\u8FC7",{filePath:t,resolvedPath:R});continue}switch(c){case"create":{if(e.isDir===!0){if(f.existsSync(a)){if((await f.promises.stat(a)).isFile())throw new g("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55\uFF0C\u5DF2\u5B58\u5728\u540C\u540D\u6587\u4EF6",{filePath:t});r(i,"INFO","\u76EE\u5F55\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521B\u5EFA",{filePath:t});break}await f.promises.mkdir(a,{recursive:!0}),r(i,"INFO","\u76EE\u5F55\u521B\u5EFA\u6210\u529F",{filePath:t});break}if(f.existsSync(a)){if((await f.promises.stat(a)).isDirectory())throw new g("\u65E0\u6CD5\u521B\u5EFA\u6587\u4EF6\uFF0C\u5DF2\u5B58\u5728\u540C\u540D\u76EE\u5F55",{filePath:t});r(i,"INFO","\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521B\u5EFA",{filePath:t});break}await f.promises.mkdir(w.dirname(a),{recursive:!0});const y=e.contents||"";await f.promises.writeFile(a,y,"utf8"),r(i,"INFO","\u6587\u4EF6\u521B\u5EFA\u6210\u529F",{filePath:t});break}case"delete":{f.existsSync(a)?(await f.promises.stat(a)).isDirectory()?(await f.promises.rm(a,{recursive:!0,force:!0}),r(i,"INFO","\u76EE\u5F55\u5220\u9664\u6210\u529F",{filePath:t})):(await f.promises.unlink(a),r(i,"INFO","\u6587\u4EF6\u5220\u9664\u6210\u529F",{filePath:t})):r(i,"WARN","\u8981\u5220\u9664\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728",{filePath:t});break}case"rename":{const y=e.renameFrom;if(!y||typeof y!="string"){r(i,"WARN","\u91CD\u547D\u540D\u64CD\u4F5C\u7F3A\u5C11 renameFrom",{filePath:t});break}const I=w.normalize(y).replace(/^[\/\\]+/,""),D=w.join(u,I),N=w.resolve(D);if(!N.startsWith(E+w.sep)&&N!==E){r(i,"WARN","\u6E90\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u8DF3\u8FC7\u91CD\u547D\u540D",{sourcePath:I,targetPath:t});break}if(f.existsSync(D)){const $=(await f.promises.stat(D)).isDirectory();await f.promises.mkdir(w.dirname(a),{recursive:!0}),await f.promises.rename(D,a),r(i,"INFO",$?"\u76EE\u5F55\u91CD\u547D\u540D\u6210\u529F":"\u6587\u4EF6\u91CD\u547D\u540D\u6210\u529F",{sourcePath:I,targetPath:t})}else r(i,"WARN","\u8981\u91CD\u547D\u540D\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728",{sourcePath:I});break}case"modify":{if(!f.existsSync(a)){r(i,"WARN","\u8981\u4FEE\u6539\u7684\u6587\u4EF6\u4E0D\u5B58\u5728",{filePath:t});break}if((await f.promises.stat(a)).isDirectory()){r(i,"INFO","\u76EE\u6807\u662F\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u4FEE\u6539",{filePath:t});break}const I=typeof e.contents=="string"?e.contents:"";if(await f.promises.readFile(a,"utf8")===I){r(i,"INFO","\u6587\u4EF6\u5185\u5BB9\u65E0\u53D8\u5316\uFF0C\u8DF3\u8FC7\u5199\u5165",{filePath:t});break}await f.promises.writeFile(a,I,"utf8"),r(i,"INFO","\u6587\u4EF6\u4FEE\u6539\u6210\u529F",{filePath:t});break}default:{r(i,"WARN","\u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7C7B\u578B",{operation:c,filePath:t});break}}}return r(i,"INFO","\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u6210\u529F",{userId:s,cId:n,filesCount:o.length,elapsedMs:Date.now()-l}),{success:!0,message:"\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u6210\u529F",userId:s,cId:n,filesCount:o.length}}catch(e){throw r(i,"ERROR","\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u5931\u8D25",{userId:s,cId:n,error:e.message,elapsedMs:Date.now()-l}),new F(`\u7528\u6237\u6587\u4EF6\u66F4\u65B0\u5931\u8D25: ${e.message}`,{userId:s,cId:n,originalError:e.message})}}async function C(m,d,o,l){const i=Date.now(),p=`computer:${m}:${d}`,s=P.COMPUTER_WORKSPACE_DIR;if(!m)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!d)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!o)throw new g("\u6587\u4EF6\u4E0D\u80FD\u4E3A\u7A7A",{field:"file"});if(!l||typeof l!="string")throw new g("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A",{field:"filePath"});const n=String(m),u=String(d),e=w.join(s,n,u);f.existsSync(e)||f.mkdirSync(e,{recursive:!0});const c=w.normalize(l).replace(/^[\/\\]+/,""),h=w.join(e,c),t=w.resolve(h),a=w.resolve(e);if(!t.startsWith(a+w.sep)&&t!==a)throw new g("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u8D85\u51FA\u7528\u6237\u76EE\u5F55",{field:"filePath",providedPath:l,resolvedPath:t});try{if(await f.promises.mkdir(w.dirname(h),{recursive:!0}),o.buffer)await f.promises.writeFile(h,o.buffer);else if(typeof o.contents=="string")await f.promises.writeFile(h,o.contents,"utf8");else throw new g("\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u4E0D\u6B63\u786E",{field:"file",hasBuffer:!!o.buffer,hasContents:typeof o.contents});return r(p,"INFO","\u6587\u4EF6\u4E0A\u4F20\u6210\u529F",{userId:n,cId:u,filePath:c,targetPath:t,fileSize:o.buffer?o.buffer.length:o.contents?o.contents.length:0,elapsedMs:Date.now()-i}),{success:!0,message:"\u6587\u4EF6\u4E0A\u4F20\u6210\u529F",fileSize:o.buffer?o.buffer.length:o.contents?o.contents.length:0}}catch(R){throw r(p,"ERROR","\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",{userId:n,cId:u,filePath:c,error:R.message,elapsedMs:Date.now()-i}),new F(`\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: ${R.message}`,{userId:n,cId:u,filePath:c,originalError:R.message})}}async function k(m,d,o,l){const i=Date.now(),p=`computer:${m}:${d}`;if(!m)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!d)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!Array.isArray(o))throw new g("files \u5FC5\u987B\u662F\u6570\u7EC4",{field:"files"});if(!Array.isArray(l))throw new g("filePaths \u5FC5\u987B\u662F\u6570\u7EC4",{field:"filePaths"});if(o.length!==l.length)throw new g(`\u6587\u4EF6\u6570\u91CF (${o.length}) \u4E0E\u8DEF\u5F84\u6570\u91CF (${l.length}) \u4E0D\u5339\u914D`,{field:"filePaths"});r(p,"DEBUG","\u5F00\u59CB\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6",{userId:m,cId:d,filesCount:o.length});const s=[];try{for(let e=0;e<o.length;e++){const c=o[e],h=l[e];if(!c){r(p,"WARN","\u6279\u91CF\u4E0A\u4F20\u4E2D\u9047\u5230\u7A7A\u6587\u4EF6\u5BF9\u8C61\uFF0C\u8DF3\u8FC7",{index:e,filePath:h}),s.push({success:!1,filePath:h,error:"\u6587\u4EF6\u5BF9\u8C61\u4E3A\u7A7A"});continue}if(!h||typeof h!="string"){r(p,"WARN","\u6279\u91CF\u4E0A\u4F20\u4E2D\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548\uFF0C\u8DF3\u8FC7",{index:e,originalname:c.originalname}),s.push({success:!1,filePath:h||"",originalname:c.originalname,error:"\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548"});continue}try{const t=await C(m,d,c,h);s.push({success:!0,filePath:h,originalname:c.originalname,...t})}catch(t){r(p,"ERROR","\u6279\u91CF\u4E0A\u4F20\u4E2D\u5355\u4E2A\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",{filePath:h,originalname:c.originalname,error:t.message}),s.push({success:!1,filePath:h,originalname:c.originalname,error:t.message})}}const n=s.filter(e=>e.success).length,u=s.filter(e=>!e.success).length;return r(p,"INFO","\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5B8C\u6210",{userId:m,cId:d,totalCount:o.length,successCount:n,failCount:u,elapsedMs:Date.now()-i}),{success:!0,message:"\u6279\u91CF\u4E0A\u4F20\u5B8C\u6210",totalCount:o.length,successCount:n,failCount:u,results:s}}catch(n){throw r(p,"ERROR","\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25",{userId:m,cId:d,error:n.message,elapsedMs:Date.now()-i}),new F(`\u6279\u91CF\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25: ${n.message}`,{userId:m,cId:d,originalError:n.message})}}async function T(m,d){const o=Date.now(),l=`computer:${m}:${d}`,i=P.COMPUTER_WORKSPACE_DIR;if(!m)throw new g("userId \u4E0D\u80FD\u4E3A\u7A7A",{field:"userId"});if(!d)throw new g("cId \u4E0D\u80FD\u4E3A\u7A7A",{field:"cId"});if(!i)throw new F("COMPUTER_WORKSPACE_DIR \u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u521B\u5EFA\u538B\u7F29\u5305");const p=String(m),s=String(d),n=w.join(i,p,s);if(!f.existsSync(n)){const t=`${p}_${s}.zip`;r(l,"WARN","\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u8FD4\u56DE\u7A7A\u538B\u7F29\u5305",{targetDir:n,userId:p,cId:s,zipFileName:t});const a=S("zip",{zlib:{level:9}});return a.append(null,{name:`${p}_${s}/`,type:"directory"}),a.on("warning",R=>{if(R.code==="ENOENT")r(l,"WARN","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u65F6\u9047\u5230\u6587\u4EF6\u95EE\u9898",{message:R.message,code:R.code});else throw r(l,"ERROR","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u65F6\u53D1\u751F\u8B66\u544A",{message:R.message,code:R.code}),R}),a.on("error",R=>{r(l,"ERROR","\u521B\u5EFA\u7A7A\u538B\u7F29\u5305\u5931\u8D25",{message:R.message})}),{archive:a,zipFileName:t}}const u=`${p}_${s}.zip`;r(l,"DEBUG","\u5F00\u59CB\u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55\u538B\u7F29\u5305",{targetDir:n,zipFileName:u});const e=S("zip",{zlib:{level:9}}),c=P.CONTENT_TRAVERSE_EXCLUDE_FILES||[],h=P.TRAVERSE_EXCLUDE_DIRS||[];return e.directory(n,`${p}_${s}`,t=>{const a=t.name||"",R=a.split(/[\/\\]/).filter(Boolean);if(R.some(y=>y.startsWith(".")))return!1;const E=R[R.length-1];if(c.includes(E)||R.some(y=>h.includes(y)))return!1;try{const y=w.join(n,a),I=f.lstatSync(y);if(I.isSymbolicLink()||I.nlink>1)return!1}catch(y){return r(l,"WARN","\u68C0\u6D4B\u94FE\u63A5\u6587\u4EF6\u65F6\u51FA\u9519\uFF0C\u8DF3\u8FC7\u8BE5\u6587\u4EF6",{filePath:a,error:y.message}),!1}return t}),e.on("warning",t=>{if(t.code==="ENOENT")r(l,"WARN","\u521B\u5EFA\u538B\u7F29\u5305\u65F6\u9047\u5230\u6587\u4EF6\u95EE\u9898",{message:t.message,code:t.code});else throw r(l,"ERROR","\u521B\u5EFA\u538B\u7F29\u5305\u65F6\u53D1\u751F\u8B66\u544A",{message:t.message,code:t.code}),t}),e.on("error",t=>{r(l,"ERROR","\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25",{message:t.message,elapsedMs:Date.now()-o})}),e.on("end",()=>{r(l,"INFO","\u5DE5\u4F5C\u76EE\u5F55\u538B\u7F29\u5305\u521B\u5EFA\u5B8C\u6210",{targetDir:n,zipFileName:u,elapsedMs:Date.now()-o})}),{archive:e,zipFileName:u}}export{v as getFileList,A as updateFiles,C as uploadFile,k as uploadFiles,T as downloadAllFiles};
|