@fps-games/editor-deployment 0.2.3-beta.11 → 0.2.3-beta.12
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/bin/fps-editor-agent.mjs +2 -2
- package/licenses/THIRD_PARTY_NOTICES.txt +2 -2
- package/manifest.json +53 -53
- package/npm-shrinkwrap.json +2 -2
- package/package.json +6 -6
- package/public/assets/index-Ca6iR0Pp.js +1 -0
- package/public/assets/index-Ca6iR0Pp.js.br +0 -0
- package/public/assets/index-Ca6iR0Pp.js.gz +0 -0
- package/public/assets/playable-sdk-DZtFJ_6m.js +8 -0
- package/public/assets/playable-sdk-DZtFJ_6m.js.br +0 -0
- package/public/assets/playable-sdk-DZtFJ_6m.js.gz +0 -0
- package/public/assets/playable-standard-project-CKDs9tbl.js +5150 -0
- package/public/assets/playable-standard-project-CKDs9tbl.js.br +0 -0
- package/public/assets/playable-standard-project-CKDs9tbl.js.gz +0 -0
- package/public/index.html +3 -3
- package/public/index.html.br +0 -0
- package/public/index.html.gz +0 -0
- package/runtime/editor-control-plane.mjs +5 -5
- package/runtime/runtime-debug-authoring-bridge.mjs +1 -1
- package/worker/editor-service-worker.mjs +23 -23
- package/public/assets/index-DPWw7XQg.js +0 -1
- package/public/assets/index-DPWw7XQg.js.br +0 -0
- package/public/assets/index-DPWw7XQg.js.gz +0 -0
- package/public/assets/playable-sdk-x4OgoAVh.js +0 -8
- package/public/assets/playable-sdk-x4OgoAVh.js.br +0 -0
- package/public/assets/playable-sdk-x4OgoAVh.js.gz +0 -0
- package/public/assets/playable-standard-project-ZEkeio_2.js +0 -5140
- package/public/assets/playable-standard-project-ZEkeio_2.js.br +0 -0
- package/public/assets/playable-standard-project-ZEkeio_2.js.gz +0 -0
|
Binary file
|
|
Binary file
|
package/public/index.html
CHANGED
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
html, body { width: 100%; height: 100%; margin: 0; overflow: hidden; background: #101018; }
|
|
11
11
|
#renderCanvas { width: 100%; height: 100%; display: block; outline: none; }
|
|
12
12
|
</style>
|
|
13
|
-
<script type="importmap">{"imports":{"@fps-games/editor/playable-sdk":"./assets/playable-sdk-
|
|
14
|
-
<script type="module" crossorigin src="./assets/index-
|
|
13
|
+
<script type="importmap">{"imports":{"@fps-games/editor/playable-sdk":"./assets/playable-sdk-DZtFJ_6m.js","@babylonjs/core":"./assets/babylon-core-S0gBQJVe.js","@fps-games/editor-core/plugin-host":"./assets/editor-core-plugin-host-c2002442.js"}}</script>
|
|
14
|
+
<script type="module" crossorigin src="./assets/index-Ca6iR0Pp.js"></script>
|
|
15
15
|
<link rel="modulepreload" crossorigin href="./assets/dynamicTexture-Cuby-VOT.js">
|
|
16
|
-
<link rel="modulepreload" crossorigin href="./assets/playable-standard-project-
|
|
16
|
+
<link rel="modulepreload" crossorigin href="./assets/playable-standard-project-CKDs9tbl.js">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<canvas id="renderCanvas"></canvas>
|
package/public/index.html.br
CHANGED
|
Binary file
|
package/public/index.html.gz
CHANGED
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{readFile as ot}from"node:fs/promises";import he from"node:path";var D="/__fps_editor_agent/v1",Q="/__fps_editor_agent/v1/asset-source-grants";var st=32*1024;var ct=8*1024*1024;var dt=256*1024;import{createHash as je,randomBytes as ee,randomUUID as fe}from"node:crypto";import{once as ce}from"node:events";import{createReadStream as Le}from"node:fs";import{mkdir as me,open as de,readFile as M,realpath as Ue,rename as Ge,rm as B,stat as re,writeFile as Me}from"node:fs/promises";import{createServer as $e}from"node:http";import{spawn as Fe}from"node:child_process";import f from"node:path";async function Ee(e){let n=await Ue(e.projectRoot),i=e.projectEpoch?.trim()||je("sha256").update(n).digest("hex").slice(0,32),a=e.host?.trim()||"127.0.0.1",s=tt(e.port??3012),_=f.resolve(n,e.workerEntry);if(Ie(n,_,"worker entry"),!(await re(_).catch(()=>null))?.isFile())throw new Error(`Editor worker entry is missing: ${_}`);let w=Be(e.projectDefinition),S=Ve(e.pluginSnapshots),m=new Map(e.builds.map(t=>[t.release,We(n,t)]));if(m.size===0||m.size!==e.builds.length)throw new Error("Editor Server requires uniquely named built Editor releases.");let d=e.activeRelease?.trim()||e.builds[0].release;if(!m.has(d))throw new Error(`Unknown active Editor release: ${d}`);let y=e.logger??console,$=fe(),oe=new Date().toISOString(),J=ee(32).toString("base64url"),z=ee(32).toString("base64url"),we=await ze(f.resolve(n,e.runtimeBridgeTokenPath??".fps-editor/state/runtime-bridge-token")),K=e.testControl?e.controlToken?.trim()||ee(32).toString("base64url"):null,Se=e.runtimeUrl?.trim()||"http://127.0.0.1:3011",F=f.join(n,".fps-editor/state/agent-runtime.json"),Y=`${F}.owner`,ie=await Ke(Y,$),Oe=te(e.workerReadyTimeoutMs,3e4),ae=te(e.workerHeartbeatTimeoutMs,1e4),ge=te(e.workerRestartLimit,3),E=null,H=new WeakSet,C=!1,p="starting",P=0,O=null,A=null,x=0,b=null,X,j=null,k=null,L=null,N=$e((t,r)=>{ve(t,r).catch(o=>{y.error?.(`[fps-editor-server] request failed: ${G(o)}`),r.headersSent?r.destroy(o instanceof Error?o:void 0):u(r,500,{ok:!1,error:G(o)})})});N.on("error",t=>y.error?.(`[fps-editor-server] ${G(t)}`));try{await new Promise((t,r)=>{N.once("error",r),N.listen(s,a,()=>{N.off("error",r),t()})}),await Z()}catch(t){throw await pe(N).catch(()=>{}),await ue(Y,ie).catch(()=>{}),t}j=setInterval(()=>{C||p!=="ready"||!b||!E||Date.now()-Date.parse(b)<=ae||(y.warn?.("[fps-editor-server] Editor worker heartbeat timed out; restarting worker."),p="restarting",E.kill("SIGKILL"))},Math.min(1e3,Math.max(100,Math.floor(ae/3)))),j.unref?.();let se=`http://${a}:${s}`;y.info?.(`[fps-editor-server] ready at ${se}`);function V(){let t=m.get(d);return{ok:p==="ready",serverInstanceId:$,pid:process.pid,startedAt:oe,projectEpoch:i,host:a,port:s,worker:{status:p,generation:P,pid:E?.pid??null,serviceInstanceId:O,restartCount:x,lastHeartbeatAt:b,...X?{lastExit:X}:{}},editor:{activeRelease:d,artifactId:t.artifactId,build:t.build}}}async function Z(){if(C)return;P+=1,p=P===1?"starting":"restarting",O=null,A=null,b=null;let t=m.get(d),r=Fe(process.execPath,[_],{cwd:n,stdio:["ignore","inherit","inherit","ipc"],env:{...process.env,FPS_EDITOR_WORKER_AGENT_TOKEN:J,FPS_EDITOR_WORKER_BROWSER_TOKEN:z,FPS_EDITOR_WORKER_RUNTIME_DEBUG_TOKEN:we,FPS_EDITOR_WORKER_BUILD:JSON.stringify(t.build),FPS_EDITOR_WORKER_GENERATION:String(P),FPS_EDITOR_WORKER_PROJECT_DEFINITION:JSON.stringify(w),FPS_EDITOR_WORKER_PLUGIN_SNAPSHOTS:JSON.stringify(S),...e.workerJournalPath?.trim()?{FPS_EDITOR_WORKER_JOURNAL_PATH:e.workerJournalPath.trim()}:{}}});E=r,r.on("message",c=>{ye(r,c).catch(l=>{y.error?.(`[fps-editor-server] invalid worker message: ${G(l)}`),r.kill("SIGKILL")})}),r.once("exit",(c,l)=>{Ae(r,c,l)});let o=Date.now()+Oe;for(;!C&&E===r&&p!=="ready"&&Date.now()<o;)await new Promise(c=>setTimeout(c,25));if(p!=="ready")throw H.add(r),r.kill("SIGKILL"),new Error("Editor Service worker did not become ready before the startup deadline.")}async function ye(t,r){if(t!==E||!Ze(r))return;if(r.type==="heartbeat"){r.serviceInstanceId===O&&(b=new Date().toISOString());return}let o=new URL(r.internalUrl);if(o.protocol!=="http:"||o.hostname!=="127.0.0.1")throw new Error("Editor worker internal URL must use loopback HTTP.");O=r.serviceInstanceId,A=o.toString(),b=new Date().toISOString(),p="ready",L={schemaVersion:1,protocolVersion:2,canonicalProjectRoot:n,serviceInstanceId:r.serviceInstanceId,pid:process.pid,endpoint:`${rt(a,s)}${D}`,startedAt:oe,packageName:"@fps-games/editor",packageVersion:m.get(d).build.version,buildKey:m.get(d).build.buildId,token:J,tokenScopes:["read","write"]},await Xe(F,L)}async function Ae(t,r,o){let c=H.has(t);if(H.delete(t),E===t&&(E=null),X={code:r,signal:o,at:new Date().toISOString()},A=null,O=null,await _e(F,L),L=null,C||c){p="stopped";return}if(x+=1,x>ge){p="fused",y.error?.("[fps-editor-server] Editor worker restart fuse opened.");return}p="restarting";let l=[100,500,2e3][Math.min(x-1,2)];k=setTimeout(()=>{k=null,Z().catch(I=>{y.error?.(`[fps-editor-server] worker restart failed: ${G(I)}`)})},l),k.unref?.()}async function ve(t,r){let o=new URL(t.url??"/",`http://${a}:${s}`);if(qe(r),t.method==="GET"&&o.pathname==="/__fps_editor/health"){u(r,p==="ready"?200:503,V());return}if(t.method==="GET"&&o.pathname==="/__fps_editor/status"){u(r,200,V());return}if(t.method==="GET"&&o.pathname==="/__fps_editor/bootstrap.json"){if(!O){u(r,503,{ok:!1,error:"editor_worker_unavailable"});return}let c=m.get(d);u(r,200,{ok:!0,serverInstanceId:$,projectEpoch:i,workerGeneration:P,projectDefinition:w,runtime:{protocolVersion:2,serviceInstanceId:O,gatewayPath:D,token:z},build:c.build});return}if((t.method==="GET"||t.method==="HEAD")&&(o.pathname==="/"||o.pathname==="/index.html"||o.pathname==="/__fps_editor/document")){await Pe(r,o.searchParams.get("instanceId"),o.searchParams.get("release"),t.method==="HEAD");return}if((t.method==="GET"||t.method==="HEAD")&&o.pathname.startsWith("/__fps_editor/build/")){await be(t,r,o);return}if((t.method==="GET"||t.method==="HEAD")&&o.pathname.startsWith("/src/")){await ke(t,r,o);return}if(t.method==="POST"&&o.pathname.startsWith("/__fps_editor/control/")){await De(t,r,o.pathname);return}if(o.pathname===D||o.pathname===Q||o.pathname.startsWith("/__fps_editor_authoring")||o.pathname.startsWith("/__fps_editor/assets/")){await Ne(t,r,o);return}u(r,404,{ok:!1,error:"not_found"})}async function Pe(t,r,o,c=!1){if(!O){u(t,503,{ok:!1,error:"editor_worker_unavailable"});return}let l=m.get(d);if(o?.trim()&&o.trim()!==d){u(t,409,{ok:!1,error:"editor_build_incompatible",activeRelease:d,requestedRelease:o.trim(),activeBuild:l.build});return}let I=await M(f.join(l.rootPath,"index.html"),"utf8"),R=`/__fps_editor/build/${encodeURIComponent(l.artifactId)}/`,h=[`<base href="${nt(R)}">`,"<script>","window.__FPS_EDITOR_HOSTED_SANDBOX__=true;",'window.__BOOT_MODE="edit";',`window.__FPS_EDITOR_AGENT_RUNTIME__=${U({protocolVersion:2,serviceInstanceId:O,gatewayPath:D,token:z})};`,`window.__FPS_EDITOR_SERVER__=${U({serverInstanceId:$,workerGeneration:P,instanceId:r?.trim()||null,release:l.release,artifactId:l.artifactId,build:l.build})};`,`window.__FPS_EDITOR_PROJECT_DEFINITION__=${U(w)};`,`window.__FPS_EDITOR_PLUGIN_SNAPSHOTS__=${U(S)};`,`window.__FPS_EDITOR_RUNTIME_URL__=${U(Se)};`,"window.__FPS_EDITOR_SERVER_MONITOR__=setInterval(async()=>{",'try{const response=await fetch("/__fps_editor/bootstrap.json",{cache:"no-store"});',"if(!response.ok)return;const next=await response.json();","if(next.serverInstanceId!==window.__FPS_EDITOR_SERVER__.serverInstanceId","||next.workerGeneration!==window.__FPS_EDITOR_SERVER__.workerGeneration){",'const url=new URL(location.href);url.searchParams.set("__fpsWorkerGeneration",String(next.workerGeneration));','url.searchParams.set("__fpsServerInstance",String(next.serverInstanceId));',"location.replace(url);}","}catch{}","},1000);",'addEventListener("pagehide",()=>clearInterval(window.__FPS_EDITOR_SERVER_MONITOR__),{once:true});',"</script>"].join(""),v=/<head[^>]*>/i.test(I)?I.replace(/<head[^>]*>/i,Ce=>`${Ce}${h}`):`${h}${I}`;t.statusCode=200,t.setHeader("Cache-Control","no-store"),t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(c?void 0:v)}async function be(t,r,o){let c=o.pathname.split("/").filter(Boolean),l=decodeURIComponent(c[2]??""),I=[...m.values()].find(h=>h.artifactId===l);if(!I){u(r,404,{ok:!1,error:"editor_build_not_found"});return}let R=c.slice(3).map(decodeURIComponent).join("/");await le(t,r,I.rootPath,R,!0)}async function ke(t,r,o){let c=decodeURIComponent(o.pathname.slice(1));await le(t,r,n,c,!1,o.searchParams.has("v"))}async function Ne(t,r,o){if(!A||p!=="ready"){u(r,503,{ok:!1,error:"editor_worker_unavailable"});return}let c=o.pathname===Q&&t.method==="POST",l=t.method==="GET"||t.method==="HEAD"||c?void 0:await Qe(t,32*1024*1024),I={};for(let h of["accept","authorization","content-type","if-none-match","range"]){let v=t.headers[h];typeof v=="string"&&(I[h]=v)}let R=await fetch(new URL(`${o.pathname}${o.search}`,A),{method:t.method,headers:I,...c?{body:t,duplex:"half"}:l?{body:new Uint8Array(l)}:{}});r.statusCode=R.status;for(let h of["content-type","content-length","etag","content-range","accept-ranges","server-timing"]){let v=R.headers.get(h);v&&r.setHeader(h,v)}r.setHeader("Cache-Control","no-store"),r.end(t.method==="HEAD"?void 0:Buffer.from(await R.arrayBuffer()))}async function De(t,r,o){if(!K||t.headers["x-fps-editor-control-token"]!==K){u(r,404,{ok:!1,error:"not_found"});return}if(o==="/__fps_editor/control/worker/crash"){if(!E){u(r,409,{ok:!1,error:"worker_unavailable"});return}E.kill("SIGKILL"),u(r,202,{ok:!0});return}let c=decodeURIComponent(o.slice(31));if(o.startsWith("/__fps_editor/control/activate/")&&m.has(c)){let l=await He();if(l.dirty){u(r,409,{ok:!1,error:"editor_document_dirty",documentRevision:l.documentRevision,activeRelease:d,requestedRelease:c});return}let I=d;if(d=c,x=0,E){let R=E;p="restarting",H.add(R);let h=ce(R,"exit");R.kill("SIGTERM"),await h}await Z(),u(r,200,{ok:!0,previousRelease:I,activeRelease:d,status:V()});return}u(r,404,{ok:!1,error:"control_not_found"})}async function He(){if(!A||p!=="ready")throw new Error("Editor worker is unavailable for release compatibility checks.");let t=await fetch(new URL(D,A),{method:"POST",headers:{authorization:`Bearer ${J}`,"content-type":"application/json"},body:JSON.stringify({kind:"status"})}),r=await t.json();if(!t.ok||r.ok!==!0||r.kind!=="status"||typeof r.status?.dirty!="boolean"||!Number.isSafeInteger(r.status.documentRevision))throw new Error("Editor worker returned an invalid status during release compatibility checks.");return{dirty:r.status.dirty,documentRevision:r.status.documentRevision}}let W=null;return Object.freeze({url:se,controlToken:K,status:V,dispose(){return W||(W=(async()=>{C=!0,j&&clearInterval(j),k&&clearTimeout(k),j=null,k=null;let t=E;if(t){H.add(t);let r=ce(t,"exit").catch(()=>[]);t.kill("SIGTERM"),await Promise.race([r,new Promise(o=>setTimeout(o,5e3))]),t.exitCode===null&&t.signalCode===null&&t.kill("SIGKILL")}await pe(N),await _e(F,L),await ue(Y,ie)})(),W)}})}function Ve(e){if(e===void 0)return Object.freeze({});if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Editor Server Plugin snapshots must be an object.");return Object.freeze(structuredClone(e))}function We(e,n){let i=f.resolve(e,n.rootPath);if(Ie(e,i,"built Editor root"),!n.release.trim()||!n.artifactId.trim())throw new Error("Editor build identity is incomplete.");return Object.freeze({...n,rootPath:i,build:Object.freeze({...n.build})})}function Be(e){if(!e||typeof e!="object"||Array.isArray(e)||e.schemaVersion!==1||typeof e.projectId!="string"||typeof e.projectName!="string"||!e.authoring||!Array.isArray(e.plugins))throw new Error("Editor Server Project definition is invalid.");return structuredClone(e)}async function le(e,n,i,a,s,_=!1){if(!a||a.includes("\\")||a.split("/").includes("..")){u(n,404,{ok:!1,error:"file_not_found"});return}let T=f.resolve(i,a),w=f.relative(i,T);if(!w||w===".."||w.startsWith(`..${f.sep}`)||f.isAbsolute(w)){u(n,404,{ok:!1,error:"file_not_found"});return}let S=await re(T).catch(()=>null);if(!S?.isFile()){u(n,404,{ok:!1,error:"file_not_found"});return}let m=e.headers["accept-encoding"]??"",d=await Je(T,m);n.statusCode=200,n.setHeader("Cache-Control",s||_?"public, max-age=31536000, immutable":"no-cache"),n.setHeader("Content-Type",et(T)),n.setHeader("Content-Length",String(d?.stat.size??S.size)),d&&(n.setHeader("Content-Encoding",d.encoding),n.setHeader("Vary","Accept-Encoding")),e.method==="HEAD"?n.end():Le(d?.path??T).pipe(n)}async function Je(e,n){let i=n.toLowerCase().split(",").map(s=>s.trim()),a=s=>i.some(_=>{let[T,...w]=_.split(";").map(S=>S.trim());return T!==s&&T!=="*"?!1:!w.some(S=>S==="q=0"||S==="q=0.0")});for(let s of a("br")?[{suffix:".br",encoding:"br"},{suffix:".gz",encoding:"gzip"}]:[{suffix:".gz",encoding:"gzip"}]){if(s.encoding==="gzip"&&!a("gzip"))continue;let _=`${e}${s.suffix}`,T=await re(_).catch(()=>null);if(T?.isFile())return{path:_,encoding:s.encoding,stat:T}}return null}async function ze(e){let n=(await M(e,"utf8")).trim();if(!n)throw new Error(`Editor Server secret is empty: ${e}`);return n}async function Ke(e,n){await me(f.dirname(e),{recursive:!0,mode:448});let i={pid:process.pid,serverInstanceId:n,createdAt:new Date().toISOString()};try{let a=await de(e,"wx",384);return await a.writeFile(`${JSON.stringify(i)}
|
|
2
|
-
`,"utf8"),await a.close(),i}catch{let
|
|
3
|
-
`,"utf8"),await
|
|
4
|
-
`,{encoding:"utf8",mode:384}),await
|
|
5
|
-
`)}function
|
|
1
|
+
import{readFile as _t}from"node:fs/promises";import ge from"node:path";var v="/__fps_editor_agent/v1",te="/__fps_editor_agent/v1/asset-source-grants";var Et=32*1024;var ht=8*1024*1024;var It=256*1024;import{createHash as Ge,randomBytes as ne,randomUUID as Ie}from"node:crypto";import{once as pe}from"node:events";import{createReadStream as Me}from"node:fs";import{mkdir as Te,open as _e,readFile as $,realpath as $e,rename as Fe,rm as K,stat as ae,writeFile as Ve}from"node:fs/promises";import{createServer as We}from"node:http";import{spawn as Be}from"node:child_process";import{promisify as ze}from"node:util";import{gzip as Je}from"node:zlib";import E from"node:path";var Ke=ze(Je),Ye=1024;async function Re(e){let n=await $e(e.projectRoot),i=e.projectEpoch?.trim()||Ge("sha256").update(n).digest("hex").slice(0,32),a=e.host?.trim()||"127.0.0.1",d=lt(e.port??3012),p=E.resolve(n,e.workerEntry);if(we(n,p,"worker entry"),!(await ae(p).catch(()=>null))?.isFile())throw new Error(`Editor worker entry is missing: ${p}`);let T=Ze(e.projectDefinition),g=Xe(e.pluginSnapshots),_=new Map(e.builds.map(t=>[t.release,Qe(n,t)]));if(_.size===0||_.size!==e.builds.length)throw new Error("Editor Server requires uniquely named built Editor releases.");let s=e.activeRelease?.trim()||e.builds[0].release;if(!_.has(s))throw new Error(`Unknown active Editor release: ${s}`);let y=e.logger??console,F=Ie(),ce=new Date().toISOString(),Y=ne(32).toString("base64url"),X=ne(32).toString("base64url"),ye=await rt(E.resolve(n,e.runtimeBridgeTokenPath??".fps-editor/state/runtime-bridge-token")),Q=e.testControl?e.controlToken?.trim()||ne(32).toString("base64url"):null,Ae=e.runtimeUrl?.trim()||"http://127.0.0.1:3011",V=E.join(n,".fps-editor/state/agent-runtime.json"),Z=`${V}.owner`,de=await nt(Z,F),ve=oe(e.workerReadyTimeoutMs,3e4),le=oe(e.workerHeartbeatTimeoutMs,1e4),be=oe(e.workerRestartLimit,3),h=null,C=new WeakSet,D=!1,f="starting",b=0,w=null,A=null,H=0,P=null,q,x=null,k=null,L=null,N=We((t,r)=>{Ne(t,r).catch(o=>{y.error?.(`[fps-editor-server] request failed: ${M(o)}`),r.headersSent?r.destroy(o instanceof Error?o:void 0):u(r,500,{ok:!1,error:M(o)})})});N.on("error",t=>y.error?.(`[fps-editor-server] ${M(t)}`));try{await new Promise((t,r)=>{N.once("error",r),N.listen(d,a,()=>{N.off("error",r),t()})}),await ee()}catch(t){throw await he(N).catch(()=>{}),await me(Z,de).catch(()=>{}),t}x=setInterval(()=>{D||f!=="ready"||!P||!h||Date.now()-Date.parse(P)<=le||(y.warn?.("[fps-editor-server] Editor worker heartbeat timed out; restarting worker."),f="restarting",h.kill("SIGKILL"))},Math.min(1e3,Math.max(100,Math.floor(le/3)))),x.unref?.();let ue=`http://${a}:${d}`;y.info?.(`[fps-editor-server] ready at ${ue}`);function W(){let t=_.get(s);return{ok:f==="ready",serverInstanceId:F,pid:process.pid,startedAt:ce,projectEpoch:i,host:a,port:d,worker:{status:f,generation:b,pid:h?.pid??null,serviceInstanceId:w,restartCount:H,lastHeartbeatAt:P,...q?{lastExit:q}:{}},editor:{activeRelease:s,artifactId:t.artifactId,build:t.build}}}async function ee(){if(D)return;b+=1,f=b===1?"starting":"restarting",w=null,A=null,P=null;let t=_.get(s),r=Be(process.execPath,[p],{cwd:n,stdio:["ignore","inherit","inherit","ipc"],env:{...process.env,FPS_EDITOR_WORKER_AGENT_TOKEN:Y,FPS_EDITOR_WORKER_BROWSER_TOKEN:X,FPS_EDITOR_WORKER_RUNTIME_DEBUG_TOKEN:ye,FPS_EDITOR_WORKER_BUILD:JSON.stringify(t.build),FPS_EDITOR_WORKER_GENERATION:String(b),FPS_EDITOR_WORKER_PROJECT_DEFINITION:JSON.stringify(T),FPS_EDITOR_WORKER_PLUGIN_SNAPSHOTS:JSON.stringify(g),...e.workerJournalPath?.trim()?{FPS_EDITOR_WORKER_JOURNAL_PATH:e.workerJournalPath.trim()}:{}}});h=r,r.on("message",c=>{Pe(r,c).catch(l=>{y.error?.(`[fps-editor-server] invalid worker message: ${M(l)}`),r.kill("SIGKILL")})}),r.once("exit",(c,l)=>{ke(r,c,l)});let o=Date.now()+ve;for(;!D&&h===r&&f!=="ready"&&Date.now()<o;)await new Promise(c=>setTimeout(c,25));if(f!=="ready")throw C.add(r),r.kill("SIGKILL"),new Error("Editor Service worker did not become ready before the startup deadline.")}async function Pe(t,r){if(t!==h||!at(r))return;if(r.type==="heartbeat"){r.serviceInstanceId===w&&(P=new Date().toISOString());return}let o=new URL(r.internalUrl);if(o.protocol!=="http:"||o.hostname!=="127.0.0.1")throw new Error("Editor worker internal URL must use loopback HTTP.");w=r.serviceInstanceId,A=o.toString(),P=new Date().toISOString(),f="ready",L={schemaVersion:1,protocolVersion:3,canonicalProjectRoot:n,serviceInstanceId:r.serviceInstanceId,pid:process.pid,endpoint:`${ut(a,d)}${v}`,startedAt:ce,packageName:"@fps-games/editor",packageVersion:_.get(s).build.version,buildKey:_.get(s).build.buildId,token:Y,tokenScopes:["read","write"]},await it(V,L)}async function ke(t,r,o){let c=C.has(t);if(C.delete(t),h===t&&(h=null),q={code:r,signal:o,at:new Date().toISOString()},A=null,w=null,await Ee(V,L),L=null,D||c){f="stopped";return}if(H+=1,H>be){f="fused",y.error?.("[fps-editor-server] Editor worker restart fuse opened.");return}f="restarting";let l=[100,500,2e3][Math.min(H-1,2)];k=setTimeout(()=>{k=null,ee().catch(I=>{y.error?.(`[fps-editor-server] worker restart failed: ${M(I)}`)})},l),k.unref?.()}async function Ne(t,r){let o=new URL(t.url??"/",`http://${a}:${d}`);if(ct(r),t.method==="GET"&&o.pathname==="/__fps_editor/health"){u(r,f==="ready"?200:503,W());return}if(t.method==="GET"&&o.pathname==="/__fps_editor/status"){u(r,200,W());return}if(t.method==="GET"&&o.pathname==="/__fps_editor/bootstrap.json"){if(!w){u(r,503,{ok:!1,error:"editor_worker_unavailable"});return}let c=_.get(s);u(r,200,{ok:!0,serverInstanceId:F,projectEpoch:i,workerGeneration:b,projectDefinition:T,runtime:{protocolVersion:3,serviceInstanceId:w,gatewayPath:v,token:X},build:c.build});return}if((t.method==="GET"||t.method==="HEAD")&&(o.pathname==="/"||o.pathname==="/index.html"||o.pathname==="/__fps_editor/document")){await Ce(r,o.searchParams.get("instanceId"),o.searchParams.get("release"),t.method==="HEAD");return}if((t.method==="GET"||t.method==="HEAD")&&o.pathname.startsWith("/__fps_editor/build/")){await De(t,r,o);return}if((t.method==="GET"||t.method==="HEAD")&&o.pathname.startsWith("/src/")){await He(t,r,o);return}if(t.method==="POST"&&o.pathname.startsWith("/__fps_editor/control/")){await Le(t,r,o.pathname);return}if(o.pathname===v||o.pathname===te||o.pathname.startsWith("/__fps_editor_authoring")||o.pathname.startsWith("/__fps_editor/assets/")){await xe(t,r,o);return}u(r,404,{ok:!1,error:"not_found"})}async function Ce(t,r,o,c=!1){if(!w){u(t,503,{ok:!1,error:"editor_worker_unavailable"});return}let l=_.get(s);if(o?.trim()&&o.trim()!==s){u(t,409,{ok:!1,error:"editor_build_incompatible",activeRelease:s,requestedRelease:o.trim(),activeBuild:l.build});return}let I=await $(E.join(l.rootPath,"index.html"),"utf8"),m=`/__fps_editor/build/${encodeURIComponent(l.artifactId)}/`,R=[`<base href="${pt(m)}">`,"<script>","window.__FPS_EDITOR_HOSTED_SANDBOX__=true;",'window.__BOOT_MODE="edit";',`window.__FPS_EDITOR_AGENT_RUNTIME__=${G({protocolVersion:3,serviceInstanceId:w,gatewayPath:v,token:X})};`,`window.__FPS_EDITOR_SERVER__=${G({serverInstanceId:F,workerGeneration:b,instanceId:r?.trim()||null,release:l.release,artifactId:l.artifactId,build:l.build})};`,`window.__FPS_EDITOR_PROJECT_DEFINITION__=${G(T)};`,`window.__FPS_EDITOR_PLUGIN_SNAPSHOTS__=${G(g)};`,`window.__FPS_EDITOR_RUNTIME_URL__=${G(Ae)};`,"window.__FPS_EDITOR_SERVER_MONITOR__=setInterval(async()=>{",'try{const response=await fetch("/__fps_editor/bootstrap.json",{cache:"no-store"});',"if(!response.ok)return;const next=await response.json();","if(next.serverInstanceId!==window.__FPS_EDITOR_SERVER__.serverInstanceId","||next.workerGeneration!==window.__FPS_EDITOR_SERVER__.workerGeneration){",'const url=new URL(location.href);url.searchParams.set("__fpsWorkerGeneration",String(next.workerGeneration));','url.searchParams.set("__fpsServerInstance",String(next.serverInstanceId));',"location.replace(url);}","}catch{}","},1000);",'addEventListener("pagehide",()=>clearInterval(window.__FPS_EDITOR_SERVER_MONITOR__),{once:true});',"</script>"].join(""),z=/<head[^>]*>/i.test(I)?I.replace(/<head[^>]*>/i,J=>`${J}${R}`):`${R}${I}`;t.statusCode=200,t.setHeader("Cache-Control","no-store"),t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(c?void 0:z)}async function De(t,r,o){let c=o.pathname.split("/").filter(Boolean),l=decodeURIComponent(c[2]??""),I=[..._.values()].find(R=>R.artifactId===l);if(!I){u(r,404,{ok:!1,error:"editor_build_not_found"});return}let m=c.slice(3).map(decodeURIComponent).join("/");await fe(t,r,I.rootPath,m,!0)}async function He(t,r,o){let c=decodeURIComponent(o.pathname.slice(1));await fe(t,r,n,c,!1,o.searchParams.has("v"))}async function xe(t,r,o){if(!A||f!=="ready"){u(r,503,{ok:!1,error:"editor_worker_unavailable"});return}let c=o.pathname===te&&t.method==="POST",l=t.method==="GET"||t.method==="HEAD"||c?void 0:await st(t,32*1024*1024),I={};for(let j of["accept","authorization","content-type","if-none-match","range","origin","access-control-request-method","access-control-request-headers"]){let U=t.headers[j];typeof U=="string"&&(I[j]=U)}let m=await fetch(new URL(`${o.pathname}${o.search}`,A),{method:t.method,headers:I,...c?{body:t,duplex:"half"}:l?{body:new Uint8Array(l)}:{}});r.statusCode=m.status;for(let j of["content-type","content-length","content-encoding","etag","content-range","accept-ranges","server-timing","access-control-allow-origin","access-control-allow-methods","access-control-allow-headers","access-control-expose-headers","vary"]){let U=m.headers.get(j);U&&r.setHeader(j,U)}let R=t.method==="HEAD"?null:Buffer.from(await m.arrayBuffer()),z=o.pathname===v&&R!==null&&R.byteLength>=Ye&&et(m.headers.get("content-type"))&&!t.headers.range&&!m.headers.has("content-range")&&!m.headers.has("content-encoding")&&ie(t.headers["accept-encoding"]??"","gzip"),J=z?await Ke(R):R;z&&(r.setHeader("Content-Encoding","gzip"),r.setHeader("Content-Length",String(J.byteLength)),r.setHeader("Vary",tt(m.headers.get("vary"),"Accept-Encoding"))),r.setHeader("Cache-Control","no-store"),r.end(J??void 0)}async function Le(t,r,o){if(!Q||t.headers["x-fps-editor-control-token"]!==Q){u(r,404,{ok:!1,error:"not_found"});return}if(o==="/__fps_editor/control/worker/crash"){if(!h){u(r,409,{ok:!1,error:"worker_unavailable"});return}h.kill("SIGKILL"),u(r,202,{ok:!0});return}let c=decodeURIComponent(o.slice(31));if(o.startsWith("/__fps_editor/control/activate/")&&_.has(c)){let l=await je();if(l.dirty){u(r,409,{ok:!1,error:"editor_document_dirty",documentRevision:l.documentRevision,activeRelease:s,requestedRelease:c});return}let I=s;if(s=c,H=0,h){let m=h;f="restarting",C.add(m);let R=pe(m,"exit");m.kill("SIGTERM"),await R}await ee(),u(r,200,{ok:!0,previousRelease:I,activeRelease:s,status:W()});return}u(r,404,{ok:!1,error:"control_not_found"})}async function je(){if(!A||f!=="ready")throw new Error("Editor worker is unavailable for release compatibility checks.");let t=await fetch(new URL(v,A),{method:"POST",headers:{authorization:`Bearer ${Y}`,"content-type":"application/json"},body:JSON.stringify({kind:"status"})}),r=await t.json();if(!t.ok||r.ok!==!0||r.kind!=="status"||typeof r.status?.dirty!="boolean"||!Number.isSafeInteger(r.status.documentRevision))throw new Error("Editor worker returned an invalid status during release compatibility checks.");return{dirty:r.status.dirty,documentRevision:r.status.documentRevision}}let B=null;return Object.freeze({url:ue,controlToken:Q,status:W,dispose(){return B||(B=(async()=>{D=!0,x&&clearInterval(x),k&&clearTimeout(k),x=null,k=null;let t=h;if(t){C.add(t);let r=pe(t,"exit").catch(()=>[]);t.kill("SIGTERM"),await Promise.race([r,new Promise(o=>setTimeout(o,5e3))]),t.exitCode===null&&t.signalCode===null&&t.kill("SIGKILL")}await he(N),await Ee(V,L),await me(Z,de)})(),B)}})}function Xe(e){if(e===void 0)return Object.freeze({});if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Editor Server Plugin snapshots must be an object.");return Object.freeze(structuredClone(e))}function Qe(e,n){let i=E.resolve(e,n.rootPath);if(we(e,i,"built Editor root"),!n.release.trim()||!n.artifactId.trim())throw new Error("Editor build identity is incomplete.");return Object.freeze({...n,rootPath:i,build:Object.freeze({...n.build})})}function Ze(e){if(!e||typeof e!="object"||Array.isArray(e)||e.schemaVersion!==1||typeof e.projectId!="string"||typeof e.projectName!="string"||!e.authoring||!Array.isArray(e.plugins))throw new Error("Editor Server Project definition is invalid.");return structuredClone(e)}async function fe(e,n,i,a,d,p=!1){if(!a||a.includes("\\")||a.split("/").includes("..")){u(n,404,{ok:!1,error:"file_not_found"});return}let S=E.resolve(i,a),T=E.relative(i,S);if(!T||T===".."||T.startsWith(`..${E.sep}`)||E.isAbsolute(T)){u(n,404,{ok:!1,error:"file_not_found"});return}let g=await ae(S).catch(()=>null);if(!g?.isFile()){u(n,404,{ok:!1,error:"file_not_found"});return}let _=e.headers["accept-encoding"]??"",s=await qe(S,_);n.statusCode=200,n.setHeader("Cache-Control",d||p?"public, max-age=31536000, immutable":"no-cache"),n.setHeader("Content-Type",dt(S)),n.setHeader("Content-Length",String(s?.stat.size??g.size)),s&&(n.setHeader("Content-Encoding",s.encoding),n.setHeader("Vary","Accept-Encoding")),e.method==="HEAD"?n.end():Me(s?.path??S).pipe(n)}async function qe(e,n){for(let i of ie(n,"br")?[{suffix:".br",encoding:"br"},{suffix:".gz",encoding:"gzip"}]:[{suffix:".gz",encoding:"gzip"}]){if(i.encoding==="gzip"&&!ie(n,"gzip"))continue;let a=`${e}${i.suffix}`,d=await ae(a).catch(()=>null);if(d?.isFile())return{path:a,encoding:i.encoding,stat:d}}return null}function ie(e,n){let i=typeof e=="string"?e:e.join(","),a=null;for(let d of i.toLowerCase().split(",")){let[p="",...S]=d.split(";").map(s=>s.trim());if(p!==n&&p!=="*")continue;let T=S.find(s=>s.startsWith("q=")),g=T?Number(T.slice(2)):1,_=Number.isFinite(g)?g:0;if(p===n)return _>0;a=_}return(a??0)>0}function et(e){return e?.split(";",1)[0]?.trim().toLowerCase()==="application/json"}function tt(e,n){if(e?.trim()==="*")return"*";let i=e?.split(",").map(a=>a.trim()).filter(Boolean)??[];return i.some(a=>a.toLowerCase()===n.toLowerCase())||i.push(n),i.join(", ")}async function rt(e){let n=(await $(e,"utf8")).trim();if(!n)throw new Error(`Editor Server secret is empty: ${e}`);return n}async function nt(e,n){await Te(E.dirname(e),{recursive:!0,mode:448});let i={pid:process.pid,serverInstanceId:n,createdAt:new Date().toISOString()};try{let a=await _e(e,"wx",384);return await a.writeFile(`${JSON.stringify(i)}
|
|
2
|
+
`,"utf8"),await a.close(),i}catch{let d=await $(e,"utf8").then(JSON.parse).catch(()=>null);if(typeof d?.pid=="number"&&ot(d.pid))throw new Error(`Editor Server project lock is already owned by PID ${d.pid}.`);await K(e,{force:!0});let p=await _e(e,"wx",384);return await p.writeFile(`${JSON.stringify(i)}
|
|
3
|
+
`,"utf8"),await p.close(),i}}async function me(e,n){(await $(e,"utf8").then(JSON.parse).catch(()=>null))?.serverInstanceId===n.serverInstanceId&&await K(e,{force:!0})}function ot(e){try{return process.kill(e,0),!0}catch{return!1}}async function it(e,n){await Te(E.dirname(e),{recursive:!0,mode:448});let i=`${e}.${process.pid}.${Ie()}.tmp`;try{await Ve(i,`${JSON.stringify(n,null,2)}
|
|
4
|
+
`,{encoding:"utf8",mode:384}),await Fe(i,e)}finally{await K(i,{force:!0}).catch(()=>{})}}async function Ee(e,n){if(!n)return;let i=await $(e,"utf8").then(JSON.parse).catch(()=>null);i?.serviceInstanceId===n.serviceInstanceId&&i.pid===n.pid&&await K(e,{force:!0})}function at(e){if(!e||typeof e!="object")return!1;let n=e;return n.type==="heartbeat"?typeof n.serviceInstanceId=="string":n.type==="ready"&&typeof n.serviceInstanceId=="string"&&typeof n.internalUrl=="string"}async function st(e,n){let i=[],a=0;for await(let d of e){let p=Buffer.isBuffer(d)?d:Buffer.from(d);if(a+=p.byteLength,a>n)throw new Error("Editor Server request body is too large.");i.push(p)}return Buffer.concat(i)}function ct(e){e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Expose-Headers","content-length, server-timing"),e.setHeader("Cross-Origin-Resource-Policy","cross-origin"),e.setHeader("Cross-Origin-Embedder-Policy","credentialless"),e.setHeader("X-Content-Type-Options","nosniff")}function u(e,n,i){e.statusCode=n,e.setHeader("Cache-Control","no-store"),e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(`${JSON.stringify(i)}
|
|
5
|
+
`)}function dt(e){switch(E.extname(e).toLowerCase()){case".js":case".mjs":return"text/javascript; charset=utf-8";case".css":return"text/css; charset=utf-8";case".json":return"application/json; charset=utf-8";case".html":return"text/html; charset=utf-8";case".svg":return"image/svg+xml";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".glb":return"model/gltf-binary";case".gltf":return"model/gltf+json";default:return"application/octet-stream"}}function we(e,n,i){let a=E.relative(e,n);if(!a||a===".."||a.startsWith(`..${E.sep}`)||E.isAbsolute(a))throw new Error(`Editor Server ${i} must be inside the canonical project root.`)}function lt(e){if(!Number.isSafeInteger(e)||e<1||e>65535)throw new Error("Editor Server port is invalid.");return e}function oe(e,n){return Number.isSafeInteger(e)&&e>0?e:n}function ut(e,n){return`http://${e==="0.0.0.0"?"127.0.0.1":e}:${n}`}function G(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(/>/g,"\\u003e")}function pt(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<")}async function he(e){e.listening&&await new Promise((n,i)=>e.close(a=>a?i(a):n()))}function M(e){return e instanceof Error?e.message:String(e)}ft();var Oe=ge.resolve(process.cwd()),O=JSON.parse(await _t(ge.join(Oe,".fps-editor/current.json"),"utf8").catch(e=>{throw new Error("Editor deployment is not prepared. Run npm run prepare:server first.",{cause:e})}));if(O.schemaVersion!==3||typeof O.workerEntry!="string"||!O.projectDefinition||!Array.isArray(O.builds))throw new Error("Editor deployment state is invalid. Run npm run prepare:server again.");var se=await Re({projectRoot:Oe,workerEntry:O.workerEntry,projectDefinition:O.projectDefinition,pluginSnapshots:O.pluginSnapshots,builds:O.builds,activeRelease:process.env.FPS_EDITOR_RELEASE?.trim()||"a",host:process.env.FPS_EDITOR_SERVER_HOST?.trim()||"127.0.0.1",port:mt(process.env.FPS_EDITOR_SERVER_PORT,3012),runtimeUrl:process.env.FPS_EDITOR_RUNTIME_URL?.trim()||"http://127.0.0.1:3011",runtimeBridgeTokenPath:".fps-editor/state/runtime-bridge-token",workerJournalPath:process.env.FPS_EDITOR_SERVER_JOURNAL_PATH,workerReadyTimeoutMs:6e4,workerHeartbeatTimeoutMs:1e4,workerRestartLimit:3,testControl:process.env.FPS_EDITOR_SERVER_TEST_CONTROL==="true",controlToken:process.env.FPS_EDITOR_SERVER_CONTROL_TOKEN});se.controlToken&&console.log(`[fps-editor-server] test control token: ${se.controlToken}`);var Se=!1;for(let e of["SIGINT","SIGTERM"])process.once(e,()=>{Se||(Se=!0,se.dispose().finally(()=>{process.exitCode=e==="SIGINT"?130:143}))});function ft(){let e=Number.parseInt(process.versions.node.split(".")[0]??"",10);if(!Number.isSafeInteger(e)||e<24||e>=27)throw new Error(`fps-editor-server requires Node.js >=24 <27; current version is ${process.versions.node}.`)}function mt(e,n){if(!e?.trim())return n;let i=Number(e);if(!Number.isSafeInteger(i)||i<1||i>65535)throw new Error(`FPS_EDITOR_SERVER_PORT must be a valid port, got ${e}.`);return i}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var l="/__fps_editor_agent/v1";var S=32*1024;var O=8*1024*1024;var v=256*1024;var h="/__fps_runtime/debug-authoring";function I(t){let n=t.token.trim();if(!n)throw new Error("runtime_debug_authoring_token_required");let e=
|
|
1
|
+
var l="/__fps_editor_agent/v1";var S=32*1024;var O=8*1024*1024;var v=256*1024;var h="/__fps_runtime/debug-authoring";function I(t){let n=t.token.trim();if(!n)throw new Error("runtime_debug_authoring_token_required");let e=f(t.path),r=new URL(l,_(t.editorUrl)),i=t.fetch??globalThis.fetch,a=new Set,s=[],u=()=>{a.clear(),s.length=0};return{name:"fps-editor-runtime-debug-authoring-bridge",apply:"serve",closeBundle:u,configureServer(c){c.httpServer?.once("close",u),c.middlewares.use(async(m,o,E)=>{if(A(m)!==e)return E();if(m.method!=="POST"){o.statusCode=405,o.setHeader("Allow","POST"),o.end();return}if(!R(m)){o.statusCode=403,o.end();return}try{let d=b(await T(m),a),p=await i(r,{method:"POST",headers:{authorization:`Bearer ${n}`,"content-type":"application/json"},body:JSON.stringify(d)}),g=await p.text();y(d,g,a,s),o.statusCode=p.status,o.setHeader("Content-Type","application/json; charset=utf-8"),o.end(g)}catch(d){t.logger?.warn?.(`[fps-editor] Runtime Debug authoring bridge failed: ${d instanceof Error?d.message:String(d)}`),o.statusCode=400,o.setHeader("Content-Type","application/json; charset=utf-8"),o.end(JSON.stringify({ok:!1,diagnostics:[{severity:"error",source:"transport",code:"runtimeDebug.bridgeRejected",message:d instanceof Error?d.message:String(d)}]}))}})}}}function b(t,n){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("runtime_debug_authoring_payload_invalid");let e=t;if(e.kind==="authoring.snapshot")return{kind:"authoring.snapshot"};if(e.kind==="operation.get"&&"operationId"in e&&typeof e.operationId=="string"&&n.has(e.operationId))return{kind:"operation.get",operationId:e.operationId};if(e.kind==="command.invoke"&&(e.invocation.commandId==="document.companionState.get"||e.invocation.commandId==="runtimeDebug.commitAndSave"))return e;throw new Error("runtime_debug_authoring_request_not_allowed")}function y(t,n,e,r){let i;try{i=JSON.parse(n)}catch{return}if(!i||typeof i!="object"||Array.isArray(i))return;let a=i.operation;if(!a||typeof a!="object"||Array.isArray(a))return;let s=a.operationId,u=a.status;if(typeof s=="string"){if(u==="accepted"||u==="running"){if(t.kind==="command.invoke"&&!e.has(s))for(e.add(s),r.push(s);r.length>256;){let c=r.shift();c&&e.delete(c)}return}if(t.kind==="operation.get"){e.delete(s);let c=r.indexOf(s);c>=0&&r.splice(c,1)}}}function f(t){let n=t?.trim()||h;if(!n.startsWith("/")||n.startsWith("//"))throw new Error("runtime_debug_authoring_path_invalid");return n}function _(t){let n=new URL(t.trim());if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("runtime_debug_authoring_editor_url_invalid");return n.toString()}function A(t){if(!t.url)return null;try{return new URL(t.url,"http://runtime.local").pathname}catch{return null}}function R(t){let n=t.headers.origin,e=t.headers.host;if(!n||!e)return!0;try{return new URL(n).host===e}catch{return!1}}async function T(t){let n=[],e=0;for await(let r of t){let i=Buffer.isBuffer(r)?r:Buffer.from(r);if(e+=i.byteLength,e>8*1024*1024)throw new Error("runtime_debug_authoring_body_too_large");n.push(i)}try{return JSON.parse(Buffer.concat(n).toString("utf8"))}catch{throw new Error("runtime_debug_authoring_json_invalid")}}export{I as createFpsGameEditorRuntimeDebugAuthoringBridgePlugin};
|