Files
oops-plugin-framework/dist/tools/VSCodeRelatedPefab.js

2 lines
9.0 KiB
JavaScript

"use strict";var Q=Object.create;var m=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var Z=(o,e)=>{for(var t in e)m(o,t,{get:e[t],enumerable:!0})},T=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of K(e))!V.call(o,s)&&s!==t&&m(o,s,{get:()=>e[s],enumerable:!(r=z(e,s))||r.enumerable});return o};var v=(o,e,t)=>(t=o!=null?Q(X(o)):{},T(e||!o||!o.__esModule?m(t,"default",{value:o,enumerable:!0}):t,o)),tt=o=>T(m({},"__esModule",{value:!0}),o);var ot={};Z(ot,{VSCodeRelatedPefab:()=>C,vscodeRelatedPefab:()=>st});module.exports=tt(ot);var u=v(require("fs")),P=v(require("path"));var w=v(require("http")),b=class{constructor(e){this.server=null;this.host=e.host,this.defaultPort=e.defaultPort,this.port=this.defaultPort,this.requestHandler=e.requestHandler,this.logger=e.logger||console.log,this.onPortInUse=e.onPortInUse,this.onStart=e.onStart,this.onError=e.onError}getState(){return{running:this.isRunning(),port:this.port,host:this.host}}getPort(){return this.port}isRunning(){return!!this.server}start(e){this.stop();let t=e||this.defaultPort;this.createServer(t)}stop(){this.server&&(this.server.close(),this.server=null)}createServer(e){this.server=w.createServer((t,r)=>{this.handleRequest(t,r)}),this.server.once("error",t=>{if((t==null?void 0:t.code)==="EADDRINUSE"&&e<65535){this.onPortInUse&&this.onPortInUse(e,e+1),this.createServer(e+1);return}this.onError&&this.onError(t)}),this.server.listen(e,this.host,()=>{var r;let t=(r=this.server)==null?void 0:r.address();t&&typeof t=="object"?this.port=Number(t.port||e):this.port=e,this.onStart&&this.onStart(this.port)})}handleRequest(e,t){Promise.resolve(this.requestHandler(e,t)).catch(r=>{t.headersSent||(t.statusCode=500,t.setHeader("Content-Type","application/json; charset=utf-8"),t.end(JSON.stringify({ok:!1,message:(r==null?void 0:r.message)||"internal error"})))})}};function j(o){return new Promise((e,t)=>{let r="",s=!1;o.on("data",n=>{s||(r+=n.toString())}),o.on("end",()=>{s||e(r)}),o.on("error",n=>{s||(s=!0,t(n))})})}function p(o,e,t){o.statusCode=e,o.setHeader("Content-Type","application/json; charset=utf-8"),o.end(JSON.stringify(t))}function H(o){return(o||"").split("?")[0]}function M(o){return(o.method||"").toUpperCase()}var _="\u3010Oops Framework\u3011",L="bridge.json",N=".oops",D="oops-framework-project-id",d="asset-db",B="query-uuid-by-url",$="query-url-by-uuid",W="query-asset-info",F="query-asset-meta",k="open-asset",S="db://",A="assets";var c=class{constructor(){this.projectId="";this.projectPath=""}setProjectPath(e){this.projectPath=e}getProjectPath(){return this.projectPath}setProjectId(e){this.projectId=e}getProjectId(){return this.projectId}validateProjectId(e){return e===this.projectId}getRequestMethod(e){return e.method||"GET"}checkRequest(e,t){let r=this.getMethodName(e),s=this.getApiPath();return r==="GET"&&s===e.url?(this.handleRequest(e,t),!0):!1}getMethodName(e){return(e.method||"GET").toUpperCase()}};var I=class extends c{constructor(){super(...arguments);this.port=56688;this.running=!1}setPort(t){this.port=t}getPort(){return this.port}setRunning(t){this.running=t}isRunning(){return this.running}getState(){return{projectId:this.projectId,projectPath:this.projectPath,port:this.port,running:this.running}}async handleRequest(t,r){let s={ok:!0,state:this.getState()};p(r,200,s)}getApiPath(){return"/api/State"}getMethod(){return"GET"}},U=null;function g(){return U||(U=new I),U}var y=v(require("path"));var E=class extends c{constructor(){super(...arguments);this.logCallback=null;this.focusWindowCallback=null;this.editorRequestCallback=null}setLogCallback(t){this.logCallback=t}setFocusWindowCallback(t){this.focusWindowCallback=t}setEditorRequestCallback(t){this.editorRequestCallback=t}log(t){this.logCallback&&this.logCallback(t)}focusWindow(){return this.focusWindowCallback?this.focusWindowCallback():!1}async requestEditor(t,r,...s){if(this.editorRequestCallback)return await this.editorRequestCallback(t,r,...s)}normalizeAssetUrl(t){if(!t)return null;let r=t.replace(/\\/g,"/").trim();if(!r)return null;if(r.startsWith(S))return r;if(r.startsWith(`${A}/`))return`${S}${r}`;let s=y.isAbsolute(r)?r.replace(/\\/g,"/"):y.join(this.projectPath,r).replace(/\\/g,"/"),n=`${this.projectPath.replace(/\\/g,"/")}/${A}/`,i=s.toLowerCase(),a=n.toLowerCase();return i.startsWith(a)?`${S}${A}/${s.slice(n.length)}`:null}async getAssetUrlByUuid(t){let r=await this.requestEditor(d,$,t);return typeof r=="string"?r:r&&typeof r.url=="string"?r.url:""}async resolveUuid(t,r){if(t.uuid)return t.uuid;if(!r)return null;let s=await this.requestEditor(d,B,r);if(typeof s=="string"&&s)return s;if(s&&typeof s.uuid=="string")return s.uuid;let n=await this.requestEditor(d,W,r);if(n&&typeof n.uuid=="string")return n.uuid;let i=await this.requestEditor(d,F,r);return i&&typeof i.uuid=="string"?i.uuid:null}async tryOpenByRequest(t,...r){try{return await this.requestEditor(d,t,...r),!0}catch(s){return!1}}async openAsset(t,r,s){let n=t?await this.getAssetUrlByUuid(t):r||"",i=!1,a="";return t&&await this.tryOpenByRequest(k,t)&&(i=!0,a="\u901A\u8FC7 UUID \u6253\u5F00"),!i&&n&&await this.tryOpenByRequest(k,n)&&(i=!0,a="\u901A\u8FC7\u8D44\u6E90 URL \u6253\u5F00"),i||(a=`\u6253\u5F00\u8D44\u6E90\u5931\u8D25 uuid=${t||"<\u65E0>"} assetUrl=${n||"<\u65E0>"}`),{ok:i,focused:s,opened:i,assetUrl:n,message:a}}async handleRequest(t,r){try{let s=await j(t),n=s?JSON.parse(s):{},i=String(t.headers[D]||"").trim(),a=String(n.projectId||i).trim();if(!a){p(r,400,{ok:!1,message:"\u7F3A\u5C11\u9879\u76EE\u7F16\u53F7"});return}if(!this.validateProjectId(a)){let G={ok:!1,message:"\u9879\u76EE\u7F16\u53F7\u4E0D\u5339\u914D",projectId:this.projectId};p(r,409,G);return}let h=this.normalizeAssetUrl(n.assetPath),O=await this.resolveUuid(n,h||null);if(!O&&!h){p(r,400,{ok:!1,message:"\u65E0\u6548\u7684\u8D44\u6E90\u8DEF\u5F84\u6216 UUID"});return}let J=this.focusWindow(),l=await this.openAsset(O,h||null,J),Y={ok:l.ok,uuid:O,focused:l.focused,opened:l.opened,assetUrl:l.assetUrl,message:l.message};p(r,l.ok?200:500,Y)}catch(s){p(r,500,{ok:!1,message:(s==null?void 0:s.message)||"\u6253\u5F00\u5931\u8D25"})}}getApiPath(){return"/api/OpenAsset"}getMethod(){return"POST"}},q=null;function R(){return q||(q=new E),q}var C=class{constructor(){this.httpServer=null;this.currentProjectPath="";this.currentProjectId=""}getEditor(){return global.Editor}bridgeLog(e){let t=this.getEditor();if(t&&typeof t.log=="function"){t.log(`${_} ${e}`);return}console.log(`${_} ${e}`)}getSettingsPath(){let e=P.join(this.currentProjectPath,N);return u.existsSync(e)||u.mkdirSync(e,{recursive:!0}),P.join(e,L)}normalizeProjectPath(e){return P.resolve(e).replace(/\\/g,"/").toLowerCase()}createProjectId(e){let t=this.normalizeProjectPath(e),r=2166136261;for(let s=0;s<t.length;s++)r^=t.charCodeAt(s),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24);return`${"p_"}${(r>>>0).toString(16)}`}readSavedPort(){try{let e=this.getSettingsPath();if(!u.existsSync(e))return 56688;let t=u.readFileSync(e,"utf8"),r=JSON.parse(t),s=Number(r.port);return!Number.isInteger(s)||s<1||s>65535?56688:s}catch(e){return 56688}}savePort(e){let t=this.getSettingsPath();u.writeFileSync(t,JSON.stringify({port:e,projectId:this.currentProjectId,projectPath:this.currentProjectPath,updatedAt:Date.now()},null,2),"utf8")}focusCreatorWindow(){let e=this.getEditor();if(e&&e.Window&&typeof e.Window.focus=="function")try{return e.Window.focus(),!0}catch(t){return!1}return!1}async requestEditor(e,t,...r){let s=this.getEditor();if(!(!s||!s.Message||typeof s.Message.request!="function"))try{return await s.Message.request(e,t,...r)}catch(n){return}}initApiModules(){let e=g(),t=R();e.setProjectPath(this.currentProjectPath),e.setProjectId(this.currentProjectId),t.setProjectPath(this.currentProjectPath),t.setProjectId(this.currentProjectId),t.setLogCallback(r=>this.bridgeLog(r)),t.setFocusWindowCallback(()=>this.focusCreatorWindow()),t.setEditorRequestCallback((r,s,...n)=>this.requestEditor(r,s,...n))}async handleRequest(e,t){let r=M(e),s=H(e.url),n=g(),i=R();if(r==="GET"&&s==="/api/State"){await n.handleRequest(e,t);return}if(r==="POST"&&s==="/api/OpenAsset"){await i.handleRequest(e,t);return}t.statusCode=404,t.setHeader("Content-Type","application/json; charset=utf-8"),t.end(JSON.stringify({ok:!1,message:"not found"}))}createHttpServer(e){let t=g();this.httpServer=new b({defaultPort:e,logger:r=>this.bridgeLog(r),requestHandler:(r,s)=>this.handleRequest(r,s),onPortInUse:(r,s)=>{this.bridgeLog(`port ${r} in use, retry ${s}`)},onStart:r=>{this.savePort(r),t.setPort(r),t.setRunning(!0),this.bridgeLog(`listening on 127.0.0.1:${r} projectId=${this.currentProjectId}`)}}),this.httpServer.start(e)}stopHttpServer(){let e=g();this.httpServer&&(this.httpServer.stop(),e.setRunning(!1),this.httpServer=null)}load(){let e=this.getEditor();this.currentProjectPath=e.Project.path,this.currentProjectId=this.createProjectId(this.currentProjectPath),this.initApiModules();let t=this.readSavedPort();this.createHttpServer(t)}unload(){this.stopHttpServer()}},st=new C;0&&(module.exports={VSCodeRelatedPefab,vscodeRelatedPefab});