@netless/appliance-plugin 1.1.44-beta.0 → 1.1.44
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/appliance-plugin.js +1 -1
- package/dist/appliance-plugin.mjs +12 -12
- package/dist/{bridge-CskJoX5M.js → bridge-B7BW1lpB.js} +1 -1
- package/dist/{bridge-rKHCYJ6m.mjs → bridge-DQud78k4.mjs} +1 -1
- package/dist/bridge.js +1 -1
- package/dist/bridge.mjs +1 -1
- package/dist/collector/types.d.ts +0 -3
- package/dist/component/textEditor/types.d.ts +0 -5
- package/dist/core/mainThread/base.d.ts +5 -1
- package/dist/core/mainThread/snapshotThread.d.ts +2 -3
- package/dist/core/mainThread/subLocalThread.d.ts +2 -5
- package/dist/core/mainThread/subServiceThread.d.ts +2 -1
- package/dist/core/mainThread/subTopThread.d.ts +2 -2
- package/dist/core/tools/arrow.d.ts +1 -423
- package/dist/core/tools/base.d.ts +2 -444
- package/dist/core/tools/ellipse.d.ts +1 -423
- package/dist/core/tools/eraser.d.ts +2 -846
- package/dist/core/tools/eraserFaces.d.ts +0 -2
- package/dist/core/tools/image.d.ts +1 -0
- package/dist/core/tools/laserPen.d.ts +2 -846
- package/dist/core/tools/pencil.d.ts +2 -848
- package/dist/core/tools/pencilEraser.d.ts +4 -1692
- package/dist/core/tools/pencilEraserBitMap.d.ts +5 -2115
- package/dist/core/tools/polygon.d.ts +1 -423
- package/dist/core/tools/rectangle.d.ts +1 -423
- package/dist/core/tools/selector.d.ts +7 -2121
- package/dist/core/tools/speechBalloon.d.ts +1 -423
- package/dist/core/tools/star.d.ts +1 -423
- package/dist/core/tools/straight.d.ts +1 -423
- package/dist/core/tools/text.d.ts +3 -3
- package/dist/core/tools/utils.d.ts +2 -2
- package/dist/core/types.d.ts +0 -9
- package/dist/core/utils/index.d.ts +0 -2
- package/dist/core/utils/serviceImageRecovery.d.ts +9 -0
- package/dist/core/vNodeManager.d.ts +1 -1
- package/dist/core/worker/base.d.ts +6 -2
- package/dist/core/worker/fullWorkerLocal.d.ts +0 -1
- package/dist/core/worker/fullWorkerService.d.ts +4 -2
- package/dist/core/worker/simpleWorker.d.ts +2 -2
- package/dist/core/worker/subWorkerTopLayer.d.ts +2 -2
- package/dist/fullWorker.js +148 -149
- package/dist/{index-Ca2t53R7.mjs → index-4ZI3GxVI.mjs} +1 -1
- package/dist/{index-ZMuKk-bl.js → index-AJCkfnUu.js} +1 -1
- package/dist/{index-ConirzkM.mjs → index-B8Ls8sf_.mjs} +1 -1
- package/dist/{index-BbBSxLGe.mjs → index-BBtV40zU.mjs} +563 -490
- package/dist/{index-C-tBYq0K.js → index-BOzOWS7h.js} +1 -1
- package/dist/index-BQiBrpib.js +1 -0
- package/dist/index-BYriQtGa.js +1 -0
- package/dist/{index-_3yxgNoj.mjs → index-C2tUvh2a.mjs} +11964 -12224
- package/dist/{index-DWevrjrE.mjs → index-DSFxl2wM.mjs} +11917 -12168
- package/dist/index-DnJkIouU.js +570 -0
- package/dist/index-DptnZ-h8.js +570 -0
- package/dist/{index-LcCU1tMV.mjs → index-ZUpKkvbD.mjs} +563 -490
- package/dist/subWorker.js +132 -133
- package/package.json +3 -4
- package/dist/core/utils/affineMatrix.d.ts +0 -33
- package/dist/core/utils/fontFamily.d.ts +0 -8
- package/dist/core/utils/selectorMatrix.d.ts +0 -4
- package/dist/core/utils/selectorRefresh.d.ts +0 -8
- package/dist/core/utils/textRaster.d.ts +0 -2
- package/dist/index-B0SB7Efu.js +0 -570
- package/dist/index-BIVRfc_x.js +0 -570
- package/dist/index-Bzg5OMdP.js +0 -1
- package/dist/index-CsNG_bzI.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var q=Object.defineProperty;var G=(b,e,t)=>e in b?q(b,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):b[e]=t;var u=(b,e,t)=>G(b,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./index-DptnZ-h8.js"),O=require("lodash");require("clipper-lib");require("lineclip");require("rbush");require("xss");require("react-dom");require("react");class K{constructor(){u(this,"jobs",new Map)}request(e,t,r,o,a){const i=this.jobs.get(e);if((i==null?void 0:i.src)===t)return;this.cancel(e);const n={src:t};this.jobs.set(e,n),(async()=>{if(this.jobs.get(e)!==n)return;if(!o()){this.cancel(e);return}let l;try{l=await r()}catch{}if(this.jobs.get(e)===n){if(!o()){this.cancel(e);return}l&&(this.jobs.delete(e),a(l))}})()}cancel(e){this.jobs.delete(e)}clear(){for(const e of this.jobs.keys())this.cancel(e)}}class _{constructor(e){u(this,"vNodes");u(this,"thread");u(this,"serviceWorkShapes",new Map);u(this,"localWorkShapes",new Map);u(this,"tmpOpt");u(this,"animationId");u(this,"syncUnitTime",s.DefaultAppliancePluginExtrasOptions.syncOpt.interval);this.vNodes=e.vNodes,this.thread=e.thread}createLocalWork(e){const{workId:t,opt:r,toolsType:o}=e;if(t&&r){const a=t.toString();!this.getToolsOpt()&&o&&this.setToolsOpt({toolsType:o,toolsOpt:r}),this.setWorkOptions(a,r)}}getLocalWorkShape(e){return this.localWorkShapes.get(e)}createLocalWorkShape(e,t){if(e&&this.tmpOpt){const r={toolsType:this.tmpOpt.toolsType,toolsOpt:t||this.tmpOpt.toolsOpt},o=this.createWorkShapeNode({...r,workId:e});return o&&this.localWorkShapes.set(e,{node:o,toolsType:o.toolsType,workState:s.EventWorkState.Start}),o}}canUseTopLayer(e){return e===s.EToolsKey.LaserPen}destroy(){this.clearAll()}clearAll(){this.thread.topLayer.children.length&&(this.thread.topLayer.parent.children.forEach(e=>{e.name!=="viewport"&&e.remove()}),s.removeAllChildren(this.thread.serviceLayer,this.thread.serviceLayer.parent)),this.serviceWorkShapes.clear(),this.localWorkShapes.clear()}consumeDraw(e){const{workId:t,dataType:r}=e;if(r===s.EDataType.Service)this.activeServiceWorkShape(e);else{const o=t==null?void 0:t.toString(),a=o&&this.localWorkShapes.get(o);if(!a)return;const i=a.node.consume({data:e,isFullWork:!1,isSubWorker:!0});i.rect&&(a.result=i,a.workState=s.EventWorkState.Doing,o&&this.localWorkShapes.set(o,a))}this.runAnimation()}setToolsOpt(e){var t;this.tmpOpt=e,(t=e.toolsOpt)!=null&&t.syncUnitTime&&(this.syncUnitTime=e.toolsOpt.syncUnitTime)}getToolsOpt(){return this.tmpOpt}createWorkShapeNode(e){const{toolsType:t}=e;if(t===s.EToolsKey.LaserPen)return s.getShapeInstance({...e,vNodes:this.vNodes,fullLayer:this.thread.topLayer,drawLayer:this.thread.topLayer})}setNodeKey(e,t,r,o){return t.toolsType=r,t.node=this.createWorkShapeNode({workId:e,toolsType:r,toolsOpt:o}),t}activeServiceWorkShape(e){var p,y;const{workId:t,opt:r,toolsType:o,type:a,updateNodeOpt:i,ops:n,op:c}=e;if(!t)return;const l=t.toString(),d=(p=this.vNodes.get(l))==null?void 0:p.rect;if(!((y=this.serviceWorkShapes)!=null&&y.has(l))){let f={toolsType:o,animationWorkData:c||[],animationIndex:0,type:a,updateNodeOpt:i,ops:n,oldRect:d};o&&r&&(f=this.setNodeKey(l,f,o,r)),this.serviceWorkShapes.set(l,f)}const h=this.serviceWorkShapes.get(l);a&&(h.type=a),n&&(h.animationWorkData=s.transformToNormalData(n),h.ops=n),i&&(h.updateNodeOpt=i),c&&(h.animationWorkData=c),h.node&&h.node.getWorkId()!==l&&h.node.setWorkId(l),d&&(h.oldRect=d),o&&r&&(h.toolsType!==o&&o&&r&&this.setNodeKey(l,h,o,r),h.node&&h.node.setWorkOptions(r))}computNextAnimationIndex(e,t){var a;const r=((a=e.node)==null?void 0:a.syncUnitTime)||this.syncUnitTime,o=Math.floor((e.animationWorkData||[]).slice(e.animationIndex).length*32/t/r)*t;return Math.min((e.animationIndex||0)+(o||t),(e.animationWorkData||[]).length)}animationDraw(){var o,a,i,n;this.animationId=void 0;let e=!1;const t=new Map,r=[];for(const[c,l]of this.serviceWorkShapes.entries())switch(l.toolsType){case s.EToolsKey.LaserPen:{const h=this.computNextAnimationIndex(l,8),p=Math.max(0,l.animationIndex||0),y=(l.animationWorkData||[]).slice(p,h);if((l.animationIndex||0)<h&&((o=l.node)==null||o.consumeService({op:y,isFullWork:!1}),l.animationIndex=h,y.length&&t.set(c,{workState:p===0?s.EventWorkState.Start:h===((a=l.animationWorkData)==null?void 0:a.length)?s.EventWorkState.Done:s.EventWorkState.Doing,op:y.slice(-2)})),l.isDel){(i=l.node)==null||i.clearTmpPoints(),this.serviceWorkShapes.delete(c);break}l.ops&&l.animationIndex===((n=l.animationWorkData)==null?void 0:n.length)&&!l.isDel&&(this.thread.topLayer.getElementsByName(c.toString())[0]||(l.isDel=!0,this.serviceWorkShapes.set(c,l))),e=!0;break}}for(const[c,l]of this.localWorkShapes.entries()){const{result:d,toolsType:h,isDel:p,workState:y}=l;switch(h){case s.EToolsKey.LaserPen:{if(p){l.node.clearTmpPoints(),this.localWorkShapes.delete(c),r.push({removeIds:[c.toString()],type:s.EPostMessageType.RemoveNode});break}d&&((d.op||d.ops)&&r.push(d),l.result=void 0),!this.thread.topLayer.getElementsByName(c.toString())[0]&&y===s.EventWorkState.Done&&(l.isDel=!0,this.localWorkShapes.set(c,l)),e=!0;break}}}e&&this.runAnimation(),t.size&&t.forEach((c,l)=>{r.push({type:s.EPostMessageType.Cursor,uid:l.split(s.Storage_Splitter)[0],op:c.op,workState:c.workState,viewId:this.thread.viewId})}),r.length&&this.thread.post({sp:r})}runAnimation(){this.animationId||(this.animationId=requestAnimationFrame(this.animationDraw.bind(this)))}setWorkOptions(e,t){var o;let r=(o=this.localWorkShapes.get(e))==null?void 0:o.node;if(!r&&this.tmpOpt){const{toolsType:a}=this.tmpOpt;this.tmpOpt.toolsOpt=t,r=this.createWorkShapeNode({workId:e,toolsType:a,toolsOpt:t}),r&&this.localWorkShapes.set(e,{node:r,toolsType:a,workState:s.EventWorkState.Start}),this.setToolsOpt(this.tmpOpt)}t!=null&&t.syncUnitTime||(t.syncUnitTime=this.syncUnitTime),r&&r.setWorkOptions(t)}consumeDrawAll(e){const{workId:t,dataType:r}=e;if(r===s.EDataType.Service)this.activeServiceWorkShape(e);else{const o=t==null?void 0:t.toString(),a=o&&this.localWorkShapes.get(o);if(!a)return;const i=a.node.consumeAll({data:e});a.result=i,a.workState=s.EventWorkState.Done,o&&this.localWorkShapes.set(o,a)}this.runAnimation()}}class z{constructor(e){u(this,"vNodes");u(this,"thread");u(this,"workShapes",new Map);u(this,"effectSelectNodeData",new Set);u(this,"batchEraserRemoveNodes",new Set);u(this,"batchEraserWorks",new Set);u(this,"tmpOpt");u(this,"syncUnitTime",s.DefaultAppliancePluginExtrasOptions.syncOpt.interval);u(this,"fullWorkerDrawCount",0);u(this,"drawWorkActiveId");u(this,"consumeCount",0);u(this,"combineDrawActiveId");u(this,"eraserBatchScheduler",new s.MaxDelayBatchScheduler);u(this,"disposeVNodeRevisionObserver");u(this,"bitmapEraserRenderQueue",Promise.resolve());u(this,"bitmapEraserRevalidationQueued",!1);this.vNodes=e.vNodes,this.thread=e.thread,this.disposeVNodeRevisionObserver=this.vNodes.observeRevision(()=>{this.scheduleActiveBitmapEraserRevalidation()})}scheduleActiveBitmapEraserRevalidation(){const e=this.combineDrawActiveId;if(!e)return;const t=this.getWorkShape(e);(t==null?void 0:t.toolsType)!==s.EToolsKey.BitMapEraser||!t.shouldRevalidateVNodeRevision()||this.bitmapEraserRevalidationQueued||(this.bitmapEraserRevalidationQueued=!0,this.enqueueBitmapEraserRender(e).catch(r=>{this.thread.master.Logger.error(`[Appliance]: Bitmap Eraser revision revalidation failed; viewId=${this.thread.viewId}; workId=${e}; error=${r instanceof Error?r.message:String(r)}`)}).finally(()=>{this.bitmapEraserRevalidationQueued=!1}))}async loadImageBitMap(e){return await this.thread.loadImageBitMap(e)}createLocalWork(e){const{workId:t,opt:r,toolsType:o}=e;if(t&&r){const a=t.toString();!this.getToolsOpt()&&o&&this.setToolsOpt({toolsType:o,toolsOpt:r}),this.setWorkOptions(a,r)}}async updateSelector(e){var y;const t=this.workShapes.get(s.Storage_Selector_key);if(!((y=t==null?void 0:t.selectIds)!=null&&y.length))return;const{callback:r,...o}=e,{updateSelectorOpt:a,willSerializeData:i,smoothSync:n}=o,c=await(t==null?void 0:t.updateSelector({updateSelectorOpt:a,selectIds:O.cloneDeep(t.selectIds),vNodes:this.vNodes,willSerializeData:i,worker:this})),l=new Map;let d;c!=null&&c.selectIds&&(d=O.xor(t.selectIds,c.selectIds),c.selectIds.forEach(f=>{const T=this.vNodes.get(f);if(T){const{toolsType:k,op:I,opt:w}=T;l.set(f,{opt:w,toolsType:k,ops:(I==null?void 0:I.length)&&s.transformToSerializableData(I)||void 0})}}),t.selectIds=c.selectIds);const h=[],p=r&&r({res:c,workShapeNode:t,param:o,postData:{sp:h},newServiceStore:l,smoothSync:n})||{sp:h};d&&p.sp.push({type:s.EPostMessageType.RemoveNode,removeIds:d,viewId:this.thread.viewId}),p.sp.length&&this.thread.post(p)}destroy(){var e;(e=this.disposeVNodeRevisionObserver)==null||e.call(this),this.disposeVNodeRevisionObserver=void 0,this.eraserBatchScheduler.cancel(),this.clearAll()}clearAll(){if(this.eraserBatchScheduler.cancel(),this.thread.localLayer.children.length&&(this.thread.topLayer.parent.children.forEach(t=>{t.name!=="viewport"&&t.remove()}),s.removeAllChildren(this.thread.localLayer,this.thread.localLayer.parent)),this.workShapes.get(s.Storage_Selector_key)){const t=[];t.push({type:s.EPostMessageType.Select,dataType:s.EDataType.Local,selectIds:[],willSyncService:!1}),this.thread.post({sp:t})}this.workShapes.forEach(t=>t.clearTmpPoints()),this.workShapes.clear(),this.effectSelectNodeData.clear(),this.batchEraserWorks.clear(),this.batchEraserRemoveNodes.clear()}async checkTextActive(e){const{op:t,viewId:r,dataType:o}=e;if(t!=null&&t.length){let a;for(const i of this.vNodes.curNodeMap.values()){const{rect:n,name:c,toolsType:l,opt:d}=i,h=t[0]*this.thread.fullLayer.worldScaling[0]+this.thread.fullLayer.worldPosition[0],p=t[1]*this.thread.fullLayer.worldScaling[1]+this.thread.fullLayer.worldPosition[1];if(l===s.EToolsKey.Text&&s.isIntersectForPoint([h,p],n)&&d.workState===s.EventWorkState.Done){a=c;break}}a&&(await this.blurSelector({viewId:r,msgType:s.EPostMessageType.Select,dataType:o,isSync:!0}),this.thread.post({sp:[{type:s.EPostMessageType.GetTextActive,toolsType:s.EToolsKey.Text,workId:a}]}))}}cursorHover(e){const{opt:t,toolsType:r,point:o}=e,a=this.setFullWork({workId:s.Cursor_Hover_Id,toolsType:r,opt:t});a&&o&&a.cursorHover(o)}cursorBlur(){var t;const e=this.getWorkShape(s.Cursor_Hover_Id);e&&((t=e.selectIds)!=null&&t.length)&&(e.cursorBlur(),this.clearWorkShapeNodeCache(s.Cursor_Hover_Id)),this.thread.fullLayer.parent.children.forEach(r=>{r.name==="Cursor_Hover_Id"&&r.remove()})}async updateFullSelectWork(e){var o,a,i,n,c;const t=this.workShapes.get(s.Storage_Selector_key),{selectIds:r}=e;if(!(r!=null&&r.length)){await this.blurSelector(e);return}if(!t){this.setFullWork({workId:s.Storage_Selector_key,toolsType:s.EToolsKey.Selector,opt:e.opt||(((o=this.tmpOpt)==null?void 0:o.toolsType)===s.EToolsKey.Selector?this.tmpOpt.toolsOpt:{})})&&await this.updateFullSelectWork(e);return}if(t&&(r!=null&&r.length)){const{selectRect:l}=t.updateSelectIds(r),d=[{selectorColor:((a=e.opt)==null?void 0:a.strokeColor)||t.selectorColor,strokeColor:((i=e.opt)==null?void 0:i.strokeColor)||t.strokeColor,fillColor:((n=e.opt)==null?void 0:n.fillColor)||t.fillColor,textOpt:((c=e.opt)==null?void 0:c.textOpt)||t.textOpt,canTextEdit:t.canTextEdit,canRotate:t.canRotate,scaleType:t.scaleType,type:s.EPostMessageType.Select,viewId:this.thread.viewId,dataType:s.EDataType.Local,selectIds:r,selectRect:l,points:t.getChildrenPoints(),willSyncService:(e==null?void 0:e.willSyncService)||!1,opt:(e==null?void 0:e.willSyncService)&&t.getWorkOptions()||void 0,canLock:t.canLock,isLocked:t.isLocked,toolsTypes:t.toolsTypes,shapeOpt:t.shapeOpt,thickness:t.thickness,useStroke:t.useStroke,strokeType:t.strokeType}];this.thread.post({sp:d})}}async removeSelector(e){const{willSyncService:t,needUndoTicker:r}=e,o=[],a=[],i=this.workShapes.get(s.Storage_Selector_key);if(!i)return;const n=i.selectIds&&[...i.selectIds]||[];for(const c of n){const l=this.vNodes.get(c);if(l)switch(l.toolsType){case s.EToolsKey.Text:{o.push({type:s.EPostMessageType.TextUpdate,toolsType:s.EToolsKey.Text,workId:c,dataType:s.EDataType.Local});break}case s.EToolsKey.BackgroundSVG:o.push({type:s.EPostMessageType.BackgroundSVGDelete,toolsType:s.EToolsKey.BackgroundSVG,workId:c,dataType:s.EDataType.Local,viewId:this.thread.viewId});break}this.removeNode(c),a.push(c)}a.length&&o.push({type:s.EPostMessageType.RemoveNode,removeIds:a,needUndoTicker:r,emitEventType:e.emitEventType,requestId:e.requestId}),o.push({type:s.EPostMessageType.Select,selectIds:[],willSyncService:t}),await this.blurSelector(),r&&o.push({type:s.EPostMessageType.None,needUndoTicker:r}),o.length&&this.thread.post({sp:o})}removeWork(e){const{workId:t}=e,r=t==null?void 0:t.toString();r&&this.removeNode(r)}removeNode(e){var o;const t=this.vNodes.get(e);t&&(t.toolsType===s.EToolsKey.BackgroundSVG&&this.thread.post({sp:[{type:s.EPostMessageType.BackgroundSVGDelete,toolsType:s.EToolsKey.BackgroundSVG,workId:e,dataType:s.EDataType.Local,viewId:this.thread.viewId}]}),(o=this.thread.fullLayer)==null||o.getElementsByName(e).forEach(a=>{a.remove(),s.removeTexture(a,this.thread.fullLayer.parent)}),this.vNodes.delete(e)),this.workShapes.has(e)&&(this.thread.localLayer.getElementsByName(e).forEach(a=>{a.remove(),s.removeTexture(a,this.thread.localLayer.parent)}),this.clearWorkShapeNodeCache(e))}setFullWork(e){const{workId:t,opt:r,toolsType:o}=e;if(t&&r&&o){const a=t.toString();let i;return t&&this.workShapes.has(a)?(i=this.workShapes.get(a),(i==null?void 0:i.toolsType)!==o?(i==null||i.clearTmpPoints(),this.workShapes.delete(a),i=void 0):i==null||i.setWorkOptions(r)):i=this.createWorkShapeNode({toolsOpt:r,toolsType:o,workId:a}),i||(i=this.createWorkShapeNode({toolsOpt:r,toolsType:o,workId:a})),i?(this.workShapes.set(a,i),i):void 0}}async consumeFull(e){var i,n;const t=(i=e.workId)==null?void 0:i.toString(),r=(n=e.updateNodeOpt)==null?void 0:n.eraserGeometryDelta;if(t){const c=this.vNodes.get(t),l=e.ops&&s.transformToNormalData(e.ops)||e.op||[];if(r){if(!c||!e.centerPos||!s.acceptIncomingEraserGeometryDelta(this.vNodes,t,r,c,{op:l,centerPos:e.centerPos})){s.cancelDoingForGeometryMismatch(this.vNodes,t);return}}else c&&e.centerPos&&s.hasDoingGeometryTransform(this.vNodes,t)&&s.geometryDigest(c.op,c.centerPos)!==s.geometryDigest(l,e.centerPos)&&s.cancelDoingForGeometryMismatch(this.vNodes,t)}const o=this.setFullWork(e),a=e.ops&&s.transformToNormalData(e.ops);if(o){t&&e.clearPreviewLocalWork&&this.thread.localLayer.getElementsByName(t).forEach(l=>{l.remove(),s.removeTexture(l,this.thread.localLayer.parent)}),o.toolsType===s.EToolsKey.BackgroundSVG?o.consumeService({isFullWork:!0,replaceId:t}):o.toolsType===s.EToolsKey.Image?await o.consumeServiceAsync({isFullWork:!0,replaceId:t,worker:this}):o.toolsType===s.EToolsKey.Text?await o.consumeServiceAsync({isFullWork:!0,replaceId:t,boxRect:this.thread.getSceneRect()}):o.consumeService({op:a,isFullWork:!0,replaceId:t}),e!=null&&e.updateNodeOpt&&o.updataOptService(e.updateNodeOpt);const c=[];e.workId&&this.workShapes.delete(e.workId.toString()),e.willSyncService&&c.push({opt:e.opt,toolsType:e.toolsType,type:s.EPostMessageType.FullWork,workId:e.workId,ops:e.ops,updateNodeOpt:e.updateNodeOpt,viewId:this.thread.viewId,needUndoTicker:e.needUndoTicker,requestId:e.requestId,emitEventType:e.emitEventType,scenePath:e.scenePath}),e.isLockSentEventCursor&&c.push({type:s.EPostMessageType.None,isLockSentEventCursor:!0,scenePath:e.scenePath}),e.needUndoTicker&&c.push({type:s.EPostMessageType.None,needUndoTicker:e.needUndoTicker,emitEventType:e.emitEventType,requestId:e.requestId,scenePath:e.scenePath}),c.length&&this.thread.post({sp:c})}}async colloctEffectSelectWork(e){const t=this.workShapes.get(s.Storage_Selector_key),{workId:r,msgType:o}=e;if(t&&r&&t.selectIds&&t.selectIds.includes(r.toString())){o===s.EPostMessageType.RemoveNode?t.selectIds=t.selectIds.filter(a=>a!==r.toString()):this.effectSelectNodeData.add(e),await this.runEffectSelectWork(!0);return}return e}async runEffectSelectWork(e){var t;for await(const r of this.effectSelectNodeData.values()){const o=this.setFullWork(r);if(o){const a=(t=r.workId)==null?void 0:t.toString();if(o.toolsType===s.EToolsKey.BackgroundSVG)o.consumeService({isFullWork:!0,replaceId:a});else if(o.toolsType===s.EToolsKey.Image)await o.consumeServiceAsync({isFullWork:!0,replaceId:a,worker:this});else if(o.toolsType===s.EToolsKey.Text)await o.consumeServiceAsync({isFullWork:!0,replaceId:a,boxRect:this.thread.getSceneRect()});else{const i=r.ops&&s.transformToNormalData(r.ops);o.consumeService({op:i,isFullWork:!0,replaceId:a}),r!=null&&r.updateNodeOpt&&o.updataOptService(r.updateNodeOpt)}r.workId&&this.workShapes.delete(r.workId.toString())}this.effectSelectNodeData.delete(r)}this.reRenderSelector(e)}hasSelector(){return this.workShapes.has(s.Storage_Selector_key)}getSelector(){return this.workShapes.get(s.Storage_Selector_key)}reRenderSelector(e=!1){var o;const t=this.workShapes.get(s.Storage_Selector_key);if(!t)return;if(t&&!((o=t.selectIds)!=null&&o.length))return this.blurSelector();const r=t.reRenderSelector();r&&this.thread.post({sp:[{type:s.EPostMessageType.Select,selectIds:t.selectIds,selectRect:r,willSyncService:e,viewId:this.thread.viewId,points:t.getChildrenPoints(),textOpt:t.textOpt,selectorColor:t.selectorColor,strokeColor:t.strokeColor,fillColor:t.fillColor,canTextEdit:t.canTextEdit,canRotate:t.canRotate,scaleType:t.scaleType,opt:t.getWorkOptions()||void 0,canLock:t.canLock,isLocked:t.isLocked,toolsTypes:t.toolsTypes,shapeOpt:t.shapeOpt,thickness:t.thickness,useStroke:t.useStroke,strokeType:t.strokeType}]})}async blurSelector(e){var o;const t=this.workShapes.get(s.Storage_Selector_key),r=t==null?void 0:t.blurSelector();if(this.clearWorkShapeNodeCache(s.Storage_Selector_key),((o=this.thread.fullLayer)==null?void 0:o.parent).children.forEach(a=>{a.name===s.Storage_Selector_key&&a.remove()}),r){const a=[];a.push({...r,isSync:e==null?void 0:e.isSync,scenePath:e==null?void 0:e.scenePath}),this.thread.post({sp:a})}}clearWorkShapeNodeCache(e){var t;(t=this.getWorkShape(e))==null||t.clearTmpPoints(),this.workShapes.delete(e)}abortBitmapEraser(e){const t=this.workShapes.get(e);(t==null?void 0:t.toolsType)===s.EToolsKey.BitMapEraser&&(t.clearTmpPoints(),this.workShapes.delete(e),this.combineDrawActiveId===e&&(this.combineDrawActiveId=void 0),this.drawWorkActiveId===e&&(this.drawWorkActiveId=void 0),this.bitmapEraserRenderQueue=Promise.resolve())}publishBitmapEraserBeforeImages(e,t){t.size&&this.thread.post({sp:[{type:s.EPostMessageType.None,viewId:this.thread.viewId,eraseTxnId:e,eraseTxnBeforeImages:new Map(t)}]})}async drawBitMapEraserFull(e,t,r,o){const{willUpdateNodes:a,willDeleteNodes:i,eraseTxnRecoveryRequired:n,eraseTxnBeforeImages:c}=t,l=e.getWorkId(),d=[...a?Array.from(a.keys()).map(p=>String(p)):[],...i?Array.from(i):[]],h=[];if(o&&h.push({type:s.EPostMessageType.None,needUndoTicker:o,undoScopeIds:d,undoScopePhase:"finalize",eraseTxnId:l,eraseTxnRecoveryRequired:n,eraseTxnBeforeImages:c}),h.push({type:s.EPostMessageType.RemoveNode,removeIds:[l],eraseTxnId:l,viewId:this.thread.viewId,needUndoTicker:o,eraseTxnRecoveryRequired:n,eraseTxnBeforeImages:c}),r&&h.push({type:s.EPostMessageType.None,isLockSentEventCursor:r}),a!=null&&a.size||i!=null&&i.size){if(a!=null&&a.size)for(const[p,y]of a)h.push({type:s.EPostMessageType.UpdateNode,dataType:s.EDataType.Local,opt:y.opt,workId:p,updateNodeOpt:{useAnimation:!1},eraseTxnId:l,needUndoTicker:o});i!=null&&i.size&&h.push({type:s.EPostMessageType.RemoveNode,removeIds:[...i],eraseTxnId:l,viewId:this.thread.viewId,needUndoTicker:o})}h.push({type:s.EPostMessageType.None,viewId:this.thread.viewId,eraseTxnId:l,eraseTxnPhase:t.eraseTxnCommitStatus==="failed"||n?"failed":"applied",eraseTxnRecoveryRequired:n,eraseTxnBeforeImages:c}),h.length&&this.thread.post({sp:h})}drawPencilEraserFull(e,t,r,o){const{willNewNodes:a,willDeleteNodes:i}=t,n=e.getWorkId(),c=[...a?Array.from(a.keys()).map(d=>String(d)):[],...i?Array.from(i):[]],l=[];if(o&&c.length&&l.push({type:s.EPostMessageType.None,needUndoTicker:o,undoScopeIds:c}),l.push({type:s.EPostMessageType.RemoveNode,removeIds:[n],viewId:this.thread.viewId,needUndoTicker:o}),r&&l.push({type:s.EPostMessageType.None,isLockSentEventCursor:r}),a!=null&&a.size||i!=null&&i.size){if(a!=null&&a.size)for(const[d,h]of a)l.push({type:s.EPostMessageType.FullWork,dataType:s.EDataType.Local,toolsType:h.toolsType,ops:s.transformToSerializableData(h.op),opt:h.opt,workId:d,updateNodeOpt:{useAnimation:!1},needUndoTicker:o});i!=null&&i.size&&l.push({type:s.EPostMessageType.RemoveNode,removeIds:[...i],viewId:this.thread.viewId,needUndoTicker:o})}l.length&&this.thread.post({sp:l})}drawEraser(e,t,r,o){const a=[],i=e.removeIds||[];o&&i.length&&a.push({type:s.EPostMessageType.None,collectUndoTicker:o,undoScopeIds:i,undoScopePhase:"collect"}),e.removeIds&&a.push({...e,needUndoTicker:r,collectUndoTicker:o}),t&&a.push({type:s.EPostMessageType.None,isLockSentEventCursor:t}),r&&a.push({type:s.EPostMessageType.None,needUndoTicker:r,undoScopePhase:"finalize"}),this.thread.post({sp:a,consumeCount:this.consumeCount})}getWorkShape(e){return this.workShapes.get(e)}getWorkShapes(){return this.workShapes}async consumeDraw(e,t){const{op:r,workId:o,scenePath:a,postCount:i,smoothSync:n}=e;if(r!=null&&r.length&&o){const c=o.toString(),l=this.workShapes.get(c);if(!l)return;const d=l.toolsType;if(d===s.EToolsKey.LaserPen)return;if(this.combineDrawActiveId&&this.combineDrawActiveId!==c){const h=this.combineDrawActiveId;this.eraserBatchScheduler.cancel(),this.combineDrawActiveId=void 0,await this.consumeDrawAll({workId:h,scenePath:a,viewId:this.thread.viewId,msgType:s.EPostMessageType.DrawWork,dataType:s.EDataType.Local},t)}switch(this.drawWorkActiveId&&this.drawWorkActiveId!==c&&(await this.consumeDrawAll({workId:this.drawWorkActiveId,scenePath:a,viewId:this.thread.viewId,msgType:s.EPostMessageType.DrawWork,dataType:s.EDataType.Local},t),this.drawWorkActiveId=void 0),!this.drawWorkActiveId&&c!==s.Storage_Selector_key&&(this.drawWorkActiveId=c),O.isNumber(i)&&(this.consumeCount=i),d){case s.EToolsKey.Selector:{const h=l.consume({data:e,isFullWork:!0,isMainThread:!0});this.fullWorkerDrawCount++;const p=[];h.type===s.EPostMessageType.Select&&(h.selectIds&&t.runReverseSelectWork(h.selectIds),p.push({...h,scenePath:a})),await this.thread.fullLayer.parent.prepareRender,this.thread.post({consumeCount:this.consumeCount,fullWorkerDrawCount:this.fullWorkerDrawCount,sp:p});break}case s.EToolsKey.PencilEraser:{l.consume({data:e,isFullWork:!1,isMainThread:!0}),this.fullWorkerDrawCount++,await this.thread.localLayer.parent.prepareRender,this.thread.post({sp:void 0,consumeCount:this.consumeCount,fullWorkerDrawCount:this.fullWorkerDrawCount}),this.combineDrawActiveId=c,this.eraserBatchScheduler.schedule(()=>{this.drawPencilEraserCombine(c,e.needUndoTicker,e.collectUndoTicker)},s.getEraserBatchDelay(this.thread.master.maxCombineEraserTime));break}case s.EToolsKey.BitMapEraser:{l.consume({data:e,isFullWork:!1,isMainThread:!0}),this.fullWorkerDrawCount++,this.combineDrawActiveId=c,await this.enqueueBitmapEraserRender(c,e.needUndoTicker,e.collectUndoTicker,{consumeCount:this.consumeCount,consumeWorkId:c});break}case s.EToolsKey.Eraser:{const h=l.consume({data:e,isFullWork:!0});await this.thread.fullLayer.parent.prepareRender,this.drawEraser(h,void 0,e.needUndoTicker,e.collectUndoTicker)}break;case s.EToolsKey.Arrow:case s.EToolsKey.Straight:case s.EToolsKey.Ellipse:case s.EToolsKey.Rectangle:case s.EToolsKey.Star:case s.EToolsKey.Polygon:case s.EToolsKey.SpeechBalloon:case s.EToolsKey.Pencil:{const h=l.consume({data:e,isFullWork:!1,isMainThread:!0,smoothSync:n});h&&(this.fullWorkerDrawCount++,await this.thread.localLayer.parent.prepareRender,this.thread.post({consumeCount:this.consumeCount,fullWorkerDrawCount:this.fullWorkerDrawCount,sp:h.op&&[{...h,scenePath:a}]||void 0}))}break}}}enqueueBitmapEraserRender(e,t,r,o){const a=this.bitmapEraserRenderQueue.then(async()=>{this.combineDrawActiveId!==e||!this.getWorkShape(e)||await this.postEraserBatch(e,t,r,o)});return this.bitmapEraserRenderQueue=a.catch(()=>{}),a}async drawPencilEraserCombine(e,t,r){await this.postEraserBatch(e,t,r)}async postEraserBatch(e,t,r,o){var i,n,c,l,d,h;const a=(i=this.workShapes.get(e))==null?void 0:i.combineConsume({workerEngine:this});if(a||o){const p=a==null?void 0:a.willDeleteNodes,y=a==null?void 0:a.willNewNodes,f=[...p?Array.from(p):[]],T={render:[],sp:[],...o};if(a!=null&&a.rect){const k=s.getSafetyRect(a.rect);(n=T.render)==null||n.push({rect:k,isClear:!0,clearCanvas:s.ECanvasShowType.Bg,viewId:this.thread.viewId,eraseTxnId:e},{rect:k,drawCanvas:s.ECanvasShowType.Bg,viewId:this.thread.viewId,eraseTxnId:e})}if(r&&f.length&&((c=this.getWorkShape(e))==null?void 0:c.toolsType)===s.EToolsKey.BitMapEraser&&((l=T.sp)==null||l.push({type:s.EPostMessageType.None,collectUndoTicker:r,undoScopeIds:f,undoScopePhase:"collect"})),p!=null&&p.size&&((d=T.sp)==null||d.push({type:s.EPostMessageType.RemoveNode,removeIds:[...p],viewId:this.thread.viewId,needUndoTicker:t,collectUndoTicker:r})),y!=null&&y.size)for(const[k,I]of y)(h=T.sp)==null||h.push({type:s.EPostMessageType.FullWork,dataType:s.EDataType.Local,toolsType:I.toolsType,ops:s.transformToSerializableData(I.op),opt:I.opt,workId:k,updateNodeOpt:{useAnimation:!1},needUndoTicker:t,collectUndoTicker:r});a!=null&&a.rect&&await this.thread.fullLayer.parent.prepareRender,this.thread.post(T)}}async consumeDrawAll(e,t){var n,c,l;this.eraserBatchScheduler.cancel();const{workId:r,scenePath:o,isLockSentEventCursor:a}=e,i=e.needUndoTicker;if(r){this.combineDrawActiveId===r.toString()&&(this.combineDrawActiveId=void 0);const d=r.toString();this.drawWorkActiveId===d&&(this.drawWorkActiveId=void 0);const h=this.workShapes.get(d);if(!h)return;const p=h.toolsType;if(p===s.EToolsKey.LaserPen)return;p===s.EToolsKey.BitMapEraser&&await this.bitmapEraserRenderQueue;const y=this.workShapes.get(s.Cursor_Hover_Id),f=(n=y==null?void 0:y.selectIds)==null?void 0:n[0],T=await h.consumeAll({data:e,workerEngine:this});switch(p){case s.EToolsKey.Selector:{T.selectIds&&f&&((c=T.selectIds)!=null&&c.includes(f))&&y.cursorBlur();const k=[];a&&k.push({type:s.EPostMessageType.None,isLockSentEventCursor:a,scenePath:o}),T.type===s.EPostMessageType.Select&&(T.selectIds&&t.runReverseSelectWork(T.selectIds),k.push({...T,scenePath:o})),k.length&&this.thread.post({sp:k}),(l=h.selectIds)!=null&&l.length?h.clearTmpPoints():this.clearWorkShapeNodeCache(d)}break;case s.EToolsKey.PencilEraser:await this.drawPencilEraserFull(h,T,a,i),this.fullWorkerDrawCount=0,this.clearWorkShapeNodeCache(d);break;case s.EToolsKey.BitMapEraser:await this.drawBitMapEraserFull(h,T,a,i),this.fullWorkerDrawCount=0,this.clearWorkShapeNodeCache(d);break;case s.EToolsKey.Eraser:await this.drawEraser({...T,scenePath:o},a,i,e.collectUndoTicker),h.clearTmpPoints();break;case s.EToolsKey.Arrow:case s.EToolsKey.Straight:case s.EToolsKey.Ellipse:case s.EToolsKey.Rectangle:case s.EToolsKey.Star:case s.EToolsKey.Polygon:case s.EToolsKey.SpeechBalloon:case s.EToolsKey.Pencil:{const k=[];if(a&&k.push({type:s.EPostMessageType.None,isLockSentEventCursor:a,scenePath:o}),T){const w=p===s.EToolsKey.Pencil&&T.type===s.EPostMessageType.RemoveNode;w?s.removeAllChildren(this.thread.localLayer,this.thread.localLayer.parent):k.push({...T,scenePath:o,needUndoTicker:e.needUndoTicker,undoScopeIds:T.undoScopeIds||(T.workId!==void 0?[T.workId.toString()]:void 0),undoScopePhase:T.undoScopePhase||"finalize"}),this.fullWorkerDrawCount=0,e.needUndoTicker&&k.push({type:s.EPostMessageType.None,needUndoTicker:e.needUndoTicker,scenePath:o,undoScopeIds:w?[]:void 0,undoScopePhase:w?"finalize":void 0}),(w?this.thread.localLayer:this.thread.fullLayer).parent.prepareRender.then(()=>{this.thread.post({fullWorkerDrawCount:this.fullWorkerDrawCount,sp:k})})}this.clearWorkShapeNodeCache(d);break}}}}getToolsOpt(){return this.tmpOpt}setToolsOpt(e){var t,r;if((t=this.tmpOpt)!=null&&t.toolsType&&this.tmpOpt.toolsType!==e.toolsType){this.eraserBatchScheduler.cancel();for(const[o,a]of this.workShapes)o!==s.Storage_Selector_key&&(a.clearTmpPoints(),this.workShapes.delete(o))}this.tmpOpt=e,(r=e.toolsOpt)!=null&&r.syncUnitTime&&(this.syncUnitTime=e.toolsOpt.syncUnitTime)}setWorkOptions(e,t){let r=this.workShapes.get(e);if(!r&&this.tmpOpt){const{toolsType:o}=this.tmpOpt;this.tmpOpt.toolsOpt=t,r=this.createWorkShapeNode({workId:e,toolsType:o,toolsOpt:t}),r&&this.workShapes.set(e,r),this.setToolsOpt(this.tmpOpt)}t.syncUnitTime||(t.syncUnitTime=this.syncUnitTime),r==null||r.setWorkOptions(t)}createWorkShapeNode(e){return s.getShapeInstance({...e,vNodes:this.vNodes,fullLayer:this.thread.fullLayer,drawLayer:this.thread.localLayer},this.thread.serviceWork)}}class V{constructor(e){u(this,"vNodes");u(this,"thread");u(this,"workShapes",new Map);u(this,"selectorWorkShapes",new Map);u(this,"willRunEffectSelectorIds",new Set);u(this,"syncUnitTime",s.DefaultAppliancePluginExtrasOptions.syncOpt.interval);u(this,"animationScheduler");u(this,"effectScheduler");u(this,"imageRecovery",new K);u(this,"readyImages",new Map);this.vNodes=e.vNodes,this.thread=e.thread,this.animationScheduler=new s.ServiceRenderScheduler({run:async()=>{try{await this.animationDraw()}catch(t){throw s.toRendererBusinessError(t,{business:"service-render",stage:"animation-draw"})}},schedule:t=>requestAnimationFrame(t),cancel:t=>cancelAnimationFrame(t),onError:t=>this.thread.reportRendererBusinessError(t,{business:"service-render",stage:"animation-draw"})}),this.effectScheduler=new s.ServiceRenderScheduler({run:async()=>{try{await this.effectRunSelector()}catch(t){throw s.toRendererBusinessError(t,{business:"service-render",stage:"selector-effect"})}},schedule:t=>setTimeout(t,0),cancel:t=>clearTimeout(t),onError:t=>this.thread.reportRendererBusinessError(t,{business:"service-render",stage:"selector-effect"})})}async loadImageBitMap(e){return await this.thread.loadImageBitMap(e)}destroy(){this.animationScheduler.destroy(),this.effectScheduler.destroy(),this.clearAll()}clearAll(){this.imageRecovery.clear(),this.readyImages.clear(),this.thread.serviceLayer.children.length&&(this.thread.serviceLayer.parent.children.forEach(e=>{e.name!=="viewport"&&e.remove()}),s.removeAllChildren(this.thread.serviceLayer,this.thread.serviceLayer.parent)),this.workShapes.clear(),this.selectorWorkShapes.clear(),this.willRunEffectSelectorIds.clear()}runEffect(){this.effectScheduler.request()}effectRunSelector(){this.willRunEffectSelectorIds.forEach(e=>{var r,o;const t=this.selectorWorkShapes.get(e);t&&t.selectIds&&((r=t.node)==null||r.selectServiceNode(e,t,!0)),(o=t==null?void 0:t.selectIds)!=null&&o.length||this.selectorWorkShapes.delete(e)}),this.willRunEffectSelectorIds.clear()}runSelectWork(e){this.activeSelectorShape(e);const{workId:t}=e,r=t==null?void 0:t.toString();r&&this.willRunEffectSelectorIds.add(r),this.runEffect()}removeWork(e){const{workId:t}=e,r=t==null?void 0:t.toString();if(r){if(this.imageRecovery.cancel(r),this.readyImages.delete(r),this.workShapes.get(r)){this.workShapes.delete(r),this.removeNode(r,e);return}this.removeNode(r,e)}}consumeFull(e){if(this.activeWorkShape(e),e.refreshTextRender){this.runAnimation(!0);return}this.runAnimation()}runReverseSelectWork(e){e.forEach(t=>{this.selectorWorkShapes.forEach((r,o)=>{var a;if((a=r.selectIds)!=null&&a.length){const i=r.selectIds.indexOf(t);i>-1&&(r.selectIds.splice(i,1),this.willRunEffectSelectorIds.add(o))}})}),this.willRunEffectSelectorIds.size&&this.runEffect()}consumeDraw(e){this.activeWorkShape(e),this.runAnimation()}computNextAnimationIndex(e,t){const r=Math.floor((e.animationWorkData||[]).slice(e.animationIndex).length*32/t/this.syncUnitTime)*t;return Math.min((e.animationIndex||0)+(r||t),(e.animationWorkData||[]).length)}async animationDraw(){var o,a,i,n,c,l,d,h,p,y,f,T,k,I,w,m,S,g,M,W,P,C;let e=!1;const t=new Map,r=[];for(const[E,v]of this.workShapes.entries())switch(v.toolsType){case s.EToolsKey.BackgroundSVG:{(o=v.node)==null||o.consumeService({isFullWork:!0,replaceId:E}),this.selectorWorkShapes.forEach((R,L)=>{var N;(N=R.selectIds)!=null&&N.includes(E)&&(this.willRunEffectSelectorIds.add(L),this.runEffect())}),this.workShapes.delete(E);break}case s.EToolsKey.Image:{const R=(a=v.node)==null?void 0:a.getWorkOptions(),N=(R==null?void 0:R.src)&&this.thread.getImageSourceKey(R),D=this.readyImages.get(E);this.readyImages.delete(E);const B=D&&D.src===N&&D.image||N&&this.thread.getCachedImages(N)||null;await((i=v.node)==null?void 0:i.consumeServiceAsync({isFullWork:!0,worker:this,imageSourceOverride:B})),N&&!B?this.imageRecovery.request(E,N,()=>this.thread.loadImageBitMap({toolsType:s.EToolsKey.Image,opt:R,workId:E,timeoutMs:15e3}),()=>{const A=this.vNodes.get(E),x=this.workShapes.get(E);return(A==null?void 0:A.toolsType)===s.EToolsKey.Image&&this.thread.getImageSourceKey(A.opt)===N&&(!x||!!x.node&&this.thread.getImageSourceKey(x.node.getWorkOptions())===N)},A=>{const x=this.vNodes.get(E);x&&(this.readyImages.set(E,{src:N,image:A}),this.consumeFull({msgType:s.EPostMessageType.FullWork,dataType:s.EDataType.Service,viewId:this.thread.viewId,workId:E,toolsType:s.EToolsKey.Image,opt:x.opt}))}):this.imageRecovery.cancel(E),this.selectorWorkShapes.forEach((A,x)=>{var U;(U=A.selectIds)!=null&&U.includes(E)&&(this.willRunEffectSelectorIds.add(x),this.runEffect())}),this.workShapes.delete(E);break}case s.EToolsKey.Text:{v.node&&(await((n=v.node)==null?void 0:n.consumeServiceAsync({isFullWork:!0,replaceId:E,boxRect:this.thread.getSceneRect()})),this.selectorWorkShapes.forEach((R,L)=>{var N;(N=R.selectIds)!=null&&N.includes(E)&&(this.willRunEffectSelectorIds.add(L),this.runEffect())}),v.refreshTextRender&&v.requestId&&r.push({type:s.EPostMessageType.RefreshTextRender,requestId:v.requestId,workId:E,viewId:this.thread.viewId}),(c=v.node)==null||c.clearTmpPoints(),this.workShapes.delete(E));break}case s.EToolsKey.Arrow:case s.EToolsKey.Straight:case s.EToolsKey.Rectangle:case s.EToolsKey.Ellipse:case s.EToolsKey.Star:case s.EToolsKey.Polygon:case s.EToolsKey.SpeechBalloon:{const R=!!v.ops;if((l=v.animationWorkData)!=null&&l.length){const L=v.oldRect;(d=v.node)==null||d.consumeService({op:v.animationWorkData,isFullWork:R}),R&&(this.selectorWorkShapes.forEach((N,D)=>{var B;(B=N.selectIds)!=null&&B.includes(E)&&(this.willRunEffectSelectorIds.add(D),this.runEffect())}),(h=v.node)==null||h.clearTmpPoints(),this.workShapes.delete(E)),v.isEnableCursor?t.set(E,{cursorTool:s.resolveCursorToolName(v.toolsType),workState:L?v.ops?s.EventWorkState.Done:s.EventWorkState.Doing:s.EventWorkState.Start,op:v.animationWorkData.slice(-3,-1)}):R&&!v.useAnimation&&((p=v.updateNodeOpt)!=null&&p.useAnimation)&&t.set(E,{cursorTool:s.resolveCursorToolName(v.toolsType),workState:s.EventWorkState.Done,op:v.animationWorkData.slice(-3,-1),uid:(y=v.updateNodeOpt)==null?void 0:y.uid}),v.animationWorkData.length=0}break}case s.EToolsKey.Pencil:{if(v.useAnimation){if(v.useAnimation){if(v.isDel){(S=v.node)==null||S.clearTmpPoints(),this.workShapes.delete(E);break}const R=3,L=this.computNextAnimationIndex(v,R),N=v.isDiff?0:Math.max(0,(v.animationIndex||0)-R),D=(v.animationWorkData||[]).slice(N,L),B=(M=(g=v.node)==null?void 0:g.getWorkId())==null?void 0:M.toString();if((v.animationIndex||0)<L||v.isDiff){if((W=v.node)==null||W.consumeService({op:D,isFullWork:!1}),v.animationIndex=L,v.isDiff&&(v.isDiff=!1),D.length&&v.isEnableCursor){const A=D.slice(-3,-1);t.set(E,{cursorTool:s.resolveCursorToolName(v.toolsType),workState:N===0?s.EventWorkState.Start:L===((P=v.animationWorkData)==null?void 0:P.length)?s.EventWorkState.Done:s.EventWorkState.Doing,op:A})}}else v.ops&&((C=v.node)==null||C.consumeService({op:v.animationWorkData||[],isFullWork:!0,replaceId:B}),v.isDel=!0,v.isEnableCursor&&t.set(E,{cursorTool:s.resolveCursorToolName(v.toolsType),workState:s.EventWorkState.Done,op:D.slice(-3,-1)}));e=!0;break}}else{const R=!!v.ops;if((f=v.node)==null||f.consumeService({op:v.animationWorkData||[],isFullWork:R,replaceId:E}),(T=v.node)==null||T.updataOptService(v.updateNodeOpt),R){if(!v.isEnableCursor&&((k=v.updateNodeOpt)!=null&&k.useAnimation)&&((I=v.animationWorkData)!=null&&I.length)){const L=v.animationWorkData.slice(-3,-1);t.set(E,{cursorTool:s.resolveCursorToolName(v.toolsType),workState:s.EventWorkState.Done,op:L,uid:(w=v.updateNodeOpt)==null?void 0:w.uid})}this.selectorWorkShapes.forEach((L,N)=>{var D;(D=L.selectIds)!=null&&D.includes(E)&&(this.willRunEffectSelectorIds.add(N),this.runEffect())}),(m=v.node)==null||m.clearTmpPoints(),this.workShapes.delete(E)}}break}}e&&this.runAnimation(),t.size&&t.forEach((E,v)=>{r.push({type:s.EPostMessageType.Cursor,uid:E.uid||v.split(s.Storage_Splitter)[0],op:E.op,workState:E.workState,cursorTool:E.cursorTool,viewId:this.thread.viewId})}),r.length&&this.thread.post({sp:r})}runAnimation(e=!1){this.animationScheduler.request(e)}async flush(){await this.animationScheduler.flush(),await this.effectScheduler.flush()}hasDiffData(e,t,r){const o=e.length;if(t.length<o)return!0;switch(r){case s.EToolsKey.Pencil:{for(let a=0;a<o;a+=3)if(t[a]!==e[a]||t[a+1]!==e[a+1])return!0;break}case s.EToolsKey.LaserPen:{for(let a=0;a<o;a+=2)if(t[a]!==e[a]||t[a+1]!==e[a+1])return!0;break}}return!1}activeWorkShape(e){var I,w,m,S;const{workId:t,opt:r,toolsType:o,type:a,updateNodeOpt:i,ops:n,op:c,useAnimation:l,imageBitmap:d,isEnableCursor:h,requestId:p,refreshTextRender:y}=e;if(!t)return;const f=t.toString(),T=(I=this.vNodes.get(f))==null?void 0:I.rect;if(!((w=this.workShapes)!=null&&w.has(f))){let g={toolsType:o,animationWorkData:c||[],animationIndex:0,type:a,updateNodeOpt:i,ops:n,useAnimation:typeof l<"u"?l:typeof(i==null?void 0:i.useAnimation)<"u"?i==null?void 0:i.useAnimation:!0,oldRect:T,isDiff:!1,imageBitmap:d,isEnableCursor:h};o&&r&&(g=this.setNodeKey(f,g,o,r)),(m=this.workShapes)==null||m.set(f,g)}const k=(S=this.workShapes)==null?void 0:S.get(f);k.isEnableCursor=h,k.requestId=p,k.refreshTextRender=!!y,a&&(k.type=a),n&&(k.animationWorkData=s.transformToNormalData(n),k.ops=n),i&&(k.updateNodeOpt=i),c&&(k.isDiff=this.hasDiffData(k.animationWorkData||[],c,k.toolsType),k.toolsType,s.EToolsKey.Pencil,k.animationWorkData=c),k.node&&k.node.getWorkId()!==f&&k.node.setWorkId(f),T&&(k.oldRect=T),o&&r&&(r.syncUnitTime&&(this.syncUnitTime=r.syncUnitTime),k.toolsType!==o&&o&&r&&this.setNodeKey(f,k,o,r),k.node&&k.node.setWorkOptions(r)),d&&(k.imageBitmap=d)}removeNode(e,t){e.indexOf(s.Storage_Selector_key)>-1&&this.removeSelectWork(t),this.thread.fullLayer.getElementsByName(e).forEach(o=>{o.remove(),s.removeTexture(o,this.thread.fullLayer.parent)}),this.thread.serviceLayer.getElementsByName(e).forEach(o=>{o.remove(),s.removeTexture(o,this.thread.serviceLayer.parent)});const r=this.vNodes.get(e);r&&r.toolsType===s.EToolsKey.BackgroundSVG&&this.thread.post({sp:[{type:s.EPostMessageType.BackgroundSVGDelete,toolsType:s.EToolsKey.BackgroundSVG,workId:e,dataType:s.EDataType.Service,viewId:this.thread.viewId}]}),this.vNodes.delete(e)}removeSelectWork(e){const{workId:t}=e,r=t==null?void 0:t.toString();r&&(this.activeSelectorShape(e),this.willRunEffectSelectorIds.add(r)),this.runEffect()}activeSelectorShape(e){var l,d,h;const{workId:t,opt:r,toolsType:o,type:a,selectIds:i}=e;if(!t)return;const n=t.toString();if(!((l=this.selectorWorkShapes)!=null&&l.has(n))){let p={toolsType:o,selectIds:i,type:a,opt:r};o&&r&&(p=this.setNodeKey(n,p,o,r)),(d=this.selectorWorkShapes)==null||d.set(n,p)}const c=(h=this.selectorWorkShapes)==null?void 0:h.get(n);a&&(c.type=a),c.node&&c.node.getWorkId()!==n&&c.node.setWorkId(n),c.selectIds=i||[]}setNodeKey(e,t,r,o){return t.toolsType=r,t.node=s.getShapeInstance({toolsType:r,toolsOpt:o,vNodes:this.vNodes,fullLayer:this.thread.fullLayer,drawLayer:this.thread.serviceLayer,workId:e},this),t}}class F{constructor(){u(this,"localWork");u(this,"serviceWork");u(this,"threadEngine")}registerMainThread(e){return this.threadEngine=e,this.localWork=e.localWork,this.serviceWork=e.serviceWork,this}}class $ extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.CopyNode)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.FullWork&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var o;const{workId:r}=t;r&&await((o=this.localWork)==null?void 0:o.consumeFull(t))}}class H extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.SetColorNode)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var h;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,textUpdateForWoker:c,needUndoTicker:l,requestId:d}=t;r===s.Storage_Selector_key&&o&&await((h=this.localWork)==null?void 0:h.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:this.emitEventType,requestId:d,textUpdateForWoker:c,callback:this.updateSelectorCallback,needUndoTicker:l}))}updateSelectorCallback(t){const{param:r,postData:o,newServiceStore:a}=t,{willSyncService:i,isSync:n,textUpdateForWoker:c,needUndoTicker:l,requestId:d,emitEventType:h}=r,p=o.sp||[];if(i)for(const[y,f]of a.entries())c&&f.toolsType===s.EToolsKey.Text?p.push({...f,workId:y,type:s.EPostMessageType.TextUpdate,dataType:s.EDataType.Local,willSyncService:!0,emitEventType:h,requestId:d,needUndoTicker:l}):p.push({...f,workId:y,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:n,emitEventType:h,requestId:d,needUndoTicker:l});return l&&p.push({type:s.EPostMessageType.None,needUndoTicker:l}),{sp:p}}}class Q extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.ZIndexNode)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var d;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,needUndoTicker:c,requestId:l}=t;r===s.Storage_Selector_key&&o&&await((d=this.localWork)==null?void 0:d.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:this.emitEventType,requestId:l,callback:this.updateSelectorCallback,needUndoTicker:c}))}updateSelectorCallback(t){const{param:r,postData:o,newServiceStore:a}=t,{willSyncService:i,isSync:n,needUndoTicker:c,requestId:l,emitEventType:d}=r,h=o.sp||[];if(i&&h)for(const[p,y]of a.entries())y.toolsType===s.EToolsKey.BackgroundSVG&&h.push({...y,workId:p,type:s.EPostMessageType.BackgroundSVGUpdate,dataType:s.EDataType.Local,updateNodeOpt:{useAnimation:!1},needUndoTicker:c,emitEventType:d,requestId:l}),h.push({...y,workId:p,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:n,emitEventType:d,requestId:l,needUndoTicker:c});return c&&h.push({type:s.EPostMessageType.None,needUndoTicker:c}),{sp:h}}}class j extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.TranslateNode);u(this,"updateSelectorCallback",t=>{var I;const{param:r,postData:o,newServiceStore:a,workShapeNode:i,res:n,smoothSync:c}=t,{willSyncService:l,isSync:d,updateSelectorOpt:h,textUpdateForWoker:p,needUndoTicker:y}=r,f=h.workState,T=o.sp||[];if(f===s.EventWorkState.Start)return{sp:[{type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:f}],render:[]};const k=n==null?void 0:n.selectRect;if(l){const w=f===s.EventWorkState.Done?y:void 0;T.push({type:s.EPostMessageType.Select,selectIds:i.selectIds,selectRect:k,willSyncService:f===s.EventWorkState.Done?!0:c,isSync:!0,points:f===s.EventWorkState.Done&&i.getChildrenPoints()||void 0,textOpt:i.textOpt,needUndoTicker:w,emitEventType:this.emitEventType});const m={workState:f,useAnimation:h.useAnimation||!1};h.uid&&(m.uid=h.uid);for(const[S,g]of a.entries())g.toolsType===s.EToolsKey.BackgroundSVG&&T.push({...g,workId:S,type:s.EPostMessageType.BackgroundSVGUpdate,dataType:s.EDataType.Local,willSyncService:f===s.EventWorkState.Done?!0:c,updateNodeOpt:m,needUndoTicker:w,emitEventType:this.emitEventType}),p&&g.toolsType===s.EToolsKey.Text?T.push({...g,workId:S,type:s.EPostMessageType.TextUpdate,dataType:s.EDataType.Local,willSyncService:f===s.EventWorkState.Done?!0:c,updateNodeOpt:m,needUndoTicker:w,emitEventType:this.emitEventType}):(c||f===s.EventWorkState.Done)&&T.push({...g,workId:S,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{...m,eraserGeometryDelta:s.getOutgoingEraserGeometryDelta((I=this.localWork)==null?void 0:I.vNodes,S)},isSync:d,needUndoTicker:w,emitEventType:this.emitEventType})}return y&&T.push({type:s.EPostMessageType.None,needUndoTicker:y}),T.push({type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:f}),{sp:T}})}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var p,y;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,textUpdateForWoker:c,emitEventType:l,smoothSync:d,needUndoTicker:h}=t;r===s.Storage_Selector_key&&o&&(o.workState===s.EventWorkState.Done&&(o!=null&&o.translate)&&(o.translate[0]||o.translate[1])||o.workState!==s.EventWorkState.Done?await((p=this.localWork)==null?void 0:p.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,isSync:!0,textUpdateForWoker:c,emitEventType:l,callback:this.updateSelectorCallback,smoothSync:d,needUndoTicker:h})):o.workState===s.EventWorkState.Done&&((y=this.localWork)==null||y.vNodes.deleteLastTarget()))}}class X extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.ScaleNode);u(this,"updateSelectorCallback",t=>{var k;const{param:r,postData:o,workShapeNode:a,res:i,newServiceStore:n,smoothSync:c}=t,{updateSelectorOpt:l,willSyncService:d,needUndoTicker:h}=r,p=l.workState,y=o.sp||[],f=i==null?void 0:i.selectRect,T=p===s.EventWorkState.Done?h:void 0;if(p===s.EventWorkState.Start)return{sp:[{type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:p}],render:[]};if(d){y.push({type:s.EPostMessageType.Select,selectIds:a.selectIds,selectRect:f,willSyncService:p===s.EventWorkState.Done?!0:c,isSync:!0,points:p===s.EventWorkState.Done&&a.getChildrenPoints()||void 0,textOpt:a.textOpt});const I={useAnimation:l.useAnimation||!1};l.uid&&(I.uid=l.uid);for(const[w,m]of n.entries())m.toolsType===s.EToolsKey.BackgroundSVG&&y.push({...m,workId:w,type:s.EPostMessageType.BackgroundSVGUpdate,dataType:s.EDataType.Local,willSyncService:p===s.EventWorkState.Done?!0:c,updateNodeOpt:I,needUndoTicker:T,emitEventType:this.emitEventType}),m.toolsType===s.EToolsKey.Text?y.push({...m,workId:w,type:s.EPostMessageType.TextUpdate,dataType:s.EDataType.Local,willSyncService:p===s.EventWorkState.Done?!0:c,updateNodeOpt:I,needUndoTicker:T,emitEventType:this.emitEventType}):(c||p===s.EventWorkState.Done)&&y.push({...m,workId:w,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{...I,eraserGeometryDelta:s.getOutgoingEraserGeometryDelta((k=this.localWork)==null?void 0:k.vNodes,w)},isSync:!0,needUndoTicker:T,emitEventType:this.emitEventType})}return h&&y.push({type:s.EPostMessageType.None,needUndoTicker:h}),y.push({type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:p}),{sp:y}})}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var l;const{workId:r,updateNodeOpt:o,willSyncService:a,willSerializeData:i,smoothSync:n,needUndoTicker:c}=t;r===s.Storage_Selector_key&&o&&await((l=this.localWork)==null?void 0:l.updateSelector({updateSelectorOpt:o,willSyncService:a,willSerializeData:i,isSync:!0,callback:this.updateSelectorCallback.bind(this),smoothSync:n,needUndoTicker:c}))}}class Y extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.RotateNode);u(this,"updateSelectorCallback",t=>{var w;const{param:r,postData:o,workShapeNode:a,res:i,newServiceStore:n,smoothSync:c}=t,{updateSelectorOpt:l,willSyncService:d,willSerializeData:h,isSync:p,needUndoTicker:y}=r,f=l.workState,T=o.sp||[],k=i==null?void 0:i.selectRect,I=f===s.EventWorkState.Done?y:void 0;if(d){h&&f===s.EventWorkState.Done&&T.push({type:s.EPostMessageType.Select,selectIds:a.selectIds,selectRect:k,willSyncService:f===s.EventWorkState.Done?!0:c,isSync:p,points:a.getChildrenPoints()});const m={useAnimation:l.useAnimation||!1};if(l.uid&&(m.uid=l.uid),c||f===s.EventWorkState.Done)for(const[S,g]of n.entries())T.push({...g,workId:S,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{...m,eraserGeometryDelta:s.getOutgoingEraserGeometryDelta((w=this.localWork)==null?void 0:w.vNodes,S)},isSync:p,needUndoTicker:I,emitEventType:this.emitEventType})}return y&&T.push({type:s.EPostMessageType.None,needUndoTicker:y}),T.push({type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:f}),{sp:T}})}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var h;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:c,smoothSync:l,needUndoTicker:d}=t;r===s.Storage_Selector_key&&o&&await((h=this.localWork)==null?void 0:h.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:c,isSync:!0,callback:this.updateSelectorCallback,smoothSync:l,needUndoTicker:d}))}}class Z extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.SetFontStyle)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var d;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,textUpdateForWoker:c,requestId:l}=t;r===s.Storage_Selector_key&&o&&await((d=this.localWork)==null?void 0:d.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:this.emitEventType,requestId:l,textUpdateForWoker:c,callback:this.updateSelectorCallback}))}updateSelectorCallback(t){const{param:r,postData:o,newServiceStore:a,workShapeNode:i,res:n}=t,{willSyncService:c,isSync:l,updateSelectorOpt:d,textUpdateForWoker:h,requestId:p,emitEventType:y}=r,f=o.sp||[],T=n==null?void 0:n.selectRect;if(c&&f){d.fontSize&&f.push({type:s.EPostMessageType.Select,selectIds:i.selectIds,selectRect:T,willSyncService:c,isSync:l,points:i.getChildrenPoints()});for(const[k,I]of a.entries())h&&I.toolsType===s.EToolsKey.Text?f.push({...I,workId:k,type:s.EPostMessageType.TextUpdate,dataType:s.EDataType.Local,willSyncService:!0,emitEventType:y,requestId:p}):f.push({...I,workId:k,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:l,emitEventType:y,requestId:p})}return{sp:f}}}class J extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.SetPoint);u(this,"updateSelectorCallback",t=>{const{param:r,postData:o,newServiceStore:a,workShapeNode:i,res:n}=t,{willSyncService:c,isSync:l,needUndoTicker:d}=r,h=o.sp||[],p=n==null?void 0:n.selectRect;if(c&&h){for(const[y,f]of a.entries())h.push({...f,workId:y,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:l,needUndoTicker:d,emitEventType:this.emitEventType});h.push({type:s.EPostMessageType.Select,selectIds:i.selectIds,selectRect:p,willSyncService:c,isSync:l,points:i.getChildrenPoints()})}return d&&h.push({type:s.EPostMessageType.None,needUndoTicker:d}),h.push({type:s.EPostMessageType.SelectorTransform,emitEventType:this.emitEventType,workState:r.updateSelectorOpt.workState}),{sp:h}})}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var d;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,textUpdateForWoker:c,needUndoTicker:l}=t;r===s.Storage_Selector_key&&o&&await((d=this.localWork)==null?void 0:d.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,emitEventType:this.emitEventType,willSerializeData:n,isSync:!0,textUpdateForWoker:c,callback:this.updateSelectorCallback,needUndoTicker:l}))}}class ee extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.SetLock)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var d;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,needUndoTicker:c,requestId:l}=t;r===s.Storage_Selector_key&&o&&await((d=this.localWork)==null?void 0:d.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:this.emitEventType,requestId:l,callback:this.updateSelectorCallback,needUndoTicker:c}))}updateSelectorCallback(t){const{param:r,postData:o,newServiceStore:a,workShapeNode:i,res:n}=t,{willSyncService:c,isSync:l,updateSelectorOpt:d,needUndoTicker:h,requestId:p,emitEventType:y}=r,f=o.sp||[],T=n==null?void 0:n.selectRect;if(c&&f){for(const[k,I]of a.entries())f.push({...I,workId:k,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:l,emitEventType:y,requestId:p});f.push({isLocked:d.isLocked,selectorColor:i.selectorColor,scaleType:i.scaleType,canRotate:i.canRotate,type:s.EPostMessageType.Select,selectIds:i.selectIds,selectRect:T,willSyncService:c,isSync:l})}return h&&f.push({type:s.EPostMessageType.None,needUndoTicker:h}),{sp:f}}}class te extends F{constructor(){super(...arguments);u(this,"emitEventType",s.EmitEventType.SetShapeOpt)}async consume(t){const{msgType:r,dataType:o,emitEventType:a}=t;if(r===s.EPostMessageType.UpdateNode&&o===s.EDataType.Local&&a===this.emitEventType)return await this.consumeForLocalWorker(t),!0}async consumeForLocalWorker(t){var d;const{workId:r,updateNodeOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,needUndoTicker:c,requestId:l}=t;r===s.Storage_Selector_key&&o&&await((d=this.localWork)==null?void 0:d.updateSelector({updateSelectorOpt:o,willRefreshSelector:a,willSyncService:i,willSerializeData:n,emitEventType:this.emitEventType,requestId:l,callback:this.updateSelectorCallback,needUndoTicker:c}))}updateSelectorCallback(t){const{param:r,postData:o,newServiceStore:a}=t,{willSyncService:i,isSync:n,needUndoTicker:c,requestId:l,emitEventType:d}=r,h=o.sp||[];if(i&&h)for(const[p,y]of a.entries())h.push({...y,workId:p,type:s.EPostMessageType.UpdateNode,updateNodeOpt:{useAnimation:!1},isSync:n,emitEventType:d,requestId:l});return c&&h.push({type:s.EPostMessageType.None,needUndoTicker:c}),{sp:h}}}class se{constructor(e){u(this,"builders",new Map);this.builders=new Map(e.map(t=>[t,this.build(t)]))}build(e){switch(e){case s.EmitEventType.TranslateNode:return new j;case s.EmitEventType.ZIndexNode:return new Q;case s.EmitEventType.CopyNode:return new $;case s.EmitEventType.SetColorNode:return new H;case s.EmitEventType.ScaleNode:return new X;case s.EmitEventType.RotateNode:return new Y;case s.EmitEventType.SetFontStyle:return new Z;case s.EmitEventType.SetPoint:return new J;case s.EmitEventType.SetLock:return new ee;case s.EmitEventType.SetShapeOpt:return new te}}registerForMainThread(e){return this.builders.forEach(t=>{t&&t.registerMainThread(e)}),this}async consumeForMainThread(e){for(const t of this.builders.values())if(await(t==null?void 0:t.consume(e)))return!0;return!1}}function re({subThreads:b,layers:e,scene:t,removeLayerTexture:r}){let o;for(const a of b)try{a.destroy()}catch(i){o||(o=i)}for(const a of e){const i=a.parent;if(i)try{r(a,i)}catch(n){o||(o=n)}try{a.remove()}catch(n){o||(o=n)}}try{t.remove()}catch(a){o||(o=a)}if(o)throw o}const oe=4;class ae{constructor(e={}){u(this,"pendingFrames",new Map);u(this,"failedCanvases",new Set);u(this,"tailFrameCount");u(this,"requestFrame");u(this,"cancelFrame");u(this,"onReadbackError");u(this,"frameHandle");u(this,"destroyed",!1);this.tailFrameCount=Math.max(1,Math.floor(e.tailFrameCount??oe)),this.requestFrame=e.requestFrame??(t=>requestAnimationFrame(t)),this.cancelFrame=e.cancelFrame??(t=>cancelAnimationFrame(t)),this.onReadbackError=e.onReadbackError}markRendered(e){this.destroyed||(this.pendingFrames.set(e,this.tailFrameCount),this.schedule())}destroy(){this.destroyed||(this.destroyed=!0,this.frameHandle!==void 0&&(this.cancelFrame(this.frameHandle),this.frameHandle=void 0),this.pendingFrames.clear(),this.failedCanvases.clear())}schedule(){this.destroyed||this.frameHandle!==void 0||this.pendingFrames.size===0||(this.frameHandle=this.requestFrame(()=>this.flushFrame()))}flushFrame(){var e,t;if(this.frameHandle=void 0,!this.destroyed){for(const[r,o]of this.pendingFrames){if(!r.isConnected||r.width<=0||r.height<=0){this.pendingFrames.delete(r);continue}try{(e=r.getContext("2d"))==null||e.getImageData(0,0,1,1)}catch(a){this.failedCanvases.has(r)||(this.failedCanvases.add(r),(t=this.onReadbackError)==null||t.call(this,a))}o<=1?this.pendingFrames.delete(r):this.pendingFrames.set(r,o-1)}this.schedule()}}}class ie{constructor(e,t){u(this,"viewId");u(this,"fullLayer");u(this,"topLayer");u(this,"localLayer");u(this,"serviceLayer");u(this,"snapshotFullLayer");u(this,"vNodes");u(this,"master");u(this,"opt");u(this,"cameraOpt");u(this,"scene");u(this,"localWork");u(this,"serviceWork");u(this,"topWork");u(this,"taskUpdateCameraId");u(this,"taskUpdateCameraResolve");u(this,"debounceUpdateCameraId");u(this,"activeCameraSettledRender");u(this,"activeCameraTaskContext");u(this,"debounceUpdateCache",new Set);u(this,"mainThreadPostId");u(this,"destroyed",!1);u(this,"readbackScheduler");u(this,"restoreLayerRenderCallbacks",[]);u(this,"viewOwner");u(this,"viewGeneration");u(this,"combinePostMsg",new Set);u(this,"methodBuilder");u(this,"cacheImages",new Map);u(this,"imageResolveMap",new Map);this.viewId=e,this.opt=t,this.viewOwner=t.viewOwner,this.viewGeneration=t.viewGeneration,this.scene=this.createScene({...t.canvasOpt,container:t.container}),this.master=t.master;const r=s.DefaultAppliancePluginExtrasOptions.bufferSize.full,o=s.DefaultAppliancePluginExtrasOptions.bufferSize.sub;this.fullLayer=this.createLayer("fullLayer",this.scene,{...t.layerOpt,bufferSize:this.viewId===s.Main_View_Id?r:o*2}),this.topLayer=this.createLayer("topLayer",this.scene,{...t.layerOpt,bufferSize:(this.viewId===s.Main_View_Id,o),contextType:"2d"}),this.localLayer=this.createLayer("localLayer",this.scene,{...t.layerOpt,bufferSize:(this.viewId===s.Main_View_Id,o),contextType:"2d"}),this.serviceLayer=this.createLayer("serviceLayer",this.scene,{...t.layerOpt,bufferSize:(this.viewId===s.Main_View_Id,o),contextType:"2d"}),t.mainThreadRenderMode==="readback"&&this.enableCanvas2DReadback([this.fullLayer.parent,this.topLayer.parent,this.localLayer.parent,this.serviceLayer.parent]),this.vNodes=new s.VNodeManager(e,this.scene);const a={thread:this,vNodes:this.vNodes};this.localWork=new z(a),this.serviceWork=new V(a),this.topWork=new _(a),this.vNodes.init(this.fullLayer),this.methodBuilder=new se([s.EmitEventType.CopyNode,s.EmitEventType.SetColorNode,s.EmitEventType.DeleteNode,s.EmitEventType.RotateNode,s.EmitEventType.ScaleNode,s.EmitEventType.TranslateNode,s.EmitEventType.ZIndexNode,s.EmitEventType.SetFontStyle,s.EmitEventType.SetPoint,s.EmitEventType.SetLock,s.EmitEventType.SetShapeOpt]).registerForMainThread(this)}getCachedImages(e){var t;return(t=this.cacheImages.get(e))==null?void 0:t.imageSource}getImageSourceKey(e){if(!e.src)return;if(e.type!==s.EImageType.Iconify)return e.src;const[t,r]=this.getIconSize(e.width,e.height,this.opt.displayer.dpr);return s.getIconImageSrc(e.src,t,r,e.strokeColor)}getCachedImagesByWorkId(e){for(const[t,r]of this.cacheImages.entries())if(t===e&&r.imageSource)return r.imageSource}deleteCachedImagesByWorkId(e){for(const[t,r]of this.cacheImages.entries())r.workId===e&&(this.closeImageSource(r.imageSource),this.cacheImages.delete(t))}clearCacheImages(){this.cacheImages.forEach(e=>this.closeImageSource(e.imageSource)),this.cacheImages.clear()}closeImageSource(e){if(!(!("close"in e)||typeof e.close!="function"))try{e.close()}catch{}}clearImageResolveMap(e){this.imageResolveMap.forEach(({timer:t,resolve:r,reject:o},a)=>{t&&clearTimeout(t),e!==void 0?o==null||o(e):r==null||r(a)}),this.imageResolveMap.clear()}post(e){this.destroyed||(this.combinePostMsg.add(e),this.runBatchPostData())}reportRendererBusinessError(e,t){const r=s.toRendererBusinessError(e,t);r.reported||(r.reported=!0,this.post({sp:[{type:s.EPostMessageType.ReportError,viewId:this.viewId,viewGeneration:this.viewGeneration,reportErrorCode:"RENDERER_RUNTIME_ERROR",reportStage:r.stage,reportError:r.message,reportString:s.formatRendererBusinessError(r,t,{viewId:this.viewId,renderer:"mainThread"})}]}))}updateDpr(e){this.scene.displayRatio=e}async on(e){var t,r,o,a,i;if(this.destroyed){try{(t=e.imageBitmap)==null||t.close()}catch{}return}if(!await this.methodBuilder.consumeForMainThread(e)){const{msgType:n,toolsType:c,opt:l,dataType:d,workId:h,workState:p,imageSrc:y,imageBitmap:f,imageElement:T,workIds:k,isLockSentEventCursor:I,requestId:w}=e,m=h==null?void 0:h.toString();switch(n){case s.EPostMessageType.UpdateDpr:O.isNumber(e.dpr)&&this.updateDpr(e.dpr);break;case s.EPostMessageType.AuthClear:{const{clearUids:S,localUid:g}=e;this.vNodes.setCanClearUids(S),this.vNodes.setLocalUid(g);break}case s.EPostMessageType.Destroy:this.destroy();break;case s.EPostMessageType.CancelBitmapEraser:{const S=m;S&&this.localWork.abortBitmapEraser(S);break}case s.EPostMessageType.Clear:this.clearAll();break;case s.EPostMessageType.ServiceSyncCommit:{if(this.destroyed)break;const S=[(r=this.fullLayer)==null?void 0:r.parent,(o=this.topLayer)==null?void 0:o.parent,(a=this.localLayer)==null?void 0:a.parent,(i=this.serviceLayer)==null?void 0:i.parent].filter(Boolean);try{await s.waitForRendererBusiness((async()=>{await s.flushServiceRenderBarrier(this.serviceWork,S)})(),{business:"service-sync-commit",stage:"flush-and-prepare-render",timeoutMs:5e3})}catch(g){throw s.toRendererBusinessError(g,{business:"service-sync-commit",stage:"flush-and-prepare-render"})}if(this.destroyed)break;this.post({sp:[{type:s.EPostMessageType.ServiceSyncCommit,viewId:this.viewId,viewGeneration:this.viewGeneration,scenePath:e.scenePath,serviceSyncId:e.serviceSyncId,serviceRevision:e.serviceRevision}]});break}case s.EPostMessageType.UpdateCamera:try{await s.runCameraUpdateWithTimeout(e.cameraTaskId,async S=>{this.activeCameraTaskContext=S;try{await this.updateCamera(e,S)}finally{this.activeCameraTaskContext===S&&(this.activeCameraTaskContext=void 0)}})}catch(S){throw this.cameraOpt=void 0,this.cancelCameraSettledRender(),S}break;case s.EPostMessageType.UpdateTools:if(c&&l){const S={toolsType:c,toolsOpt:l};this.topWork.canUseTopLayer(c)?this.topWork.setToolsOpt(S):this.localWork.setToolsOpt(S)}break;case s.EPostMessageType.CreateWork:if(m&&l&&c){if(this.topWork.canUseTopLayer(c)){this.topWork.getToolsOpt()||this.topWork.setToolsOpt({toolsType:c,toolsOpt:l}),this.topWork.setWorkOptions(m,l);break}this.localWork.getToolsOpt()||this.localWork.setToolsOpt({toolsType:c,toolsOpt:l}),this.localWork.setWorkOptions(m,l)}break;case s.EPostMessageType.DrawWork:p===s.EventWorkState.Done&&d===s.EDataType.Local?(await this.consumeDrawAll(d,e),c===s.EToolsKey.LaserPen&&I&&this.post({sp:[{type:s.EPostMessageType.None,isLockSentEventCursor:I}]})):await this.consumeDraw(d,e);break;case s.EPostMessageType.UpdateNode:case s.EPostMessageType.FullWork:if(c&&this.topWork.canUseTopLayer(c)){await this.consumeDrawAll(d,e);break}await this.consumeFull(d,e);break;case s.EPostMessageType.RemoveNode:await this.removeNode(e);return;case s.EPostMessageType.Select:d===s.EDataType.Local||h===s.Storage_Selector_key?await this.localWork.updateFullSelectWork(e):d===s.EDataType.Service&&this.serviceWork.runSelectWork(e);break;case s.EPostMessageType.CursorBlur:this.localWork.cursorBlur();return;case s.EPostMessageType.CursorHover:this.localWork.cursorHover(e);break;case s.EPostMessageType.GetTextActive:d===s.EDataType.Local&&this.localWork.checkTextActive(e);break;case s.EPostMessageType.GetImageBitMap:if(y&&h){const S=this.imageResolveMap.get(y);if(!S||S.requestId!==w){const W=f||T;if(W&&!S&&this.serviceWork){const P=[...this.vNodes.getNodesByType(s.EToolsKey.Image)].filter(([,C])=>C.opt&&this.getImageSourceKey(C.opt)===y);if(P.length&&!this.cacheImages.has(y)){this.cacheImages.set(y,{imageSource:W,workId:P[0][0]}),P.forEach(([C,E])=>{this.serviceWork.consumeFull({msgType:s.EPostMessageType.FullWork,dataType:s.EDataType.Service,viewId:this.viewId,workId:C,toolsType:s.EToolsKey.Image,opt:E.opt})});break}}this.closeImageSource(W);break}if(f||T){const W=h.toString();this.deleteCachedImagesByWorkId(W),this.cacheImages.set(y,{imageSource:f||T,workId:W})}const{resolve:g,timer:M}=S;M&&clearTimeout(M),g&&g(y)}break;case s.EPostMessageType.GetVNodeInfo:if(h&&k){const S=k.map(g=>this.vNodes.get(g));this.post({sp:[{type:s.EPostMessageType.GetVNodeInfo,dataType:s.EDataType.Local,workId:h,vInfo:S}]})}break}}}getIconSize(e,t,r){const o=e*r,a=t*r;return o<=50||a<=50?[50,50]:o<=100||a<=100?[100,100]:o<=200||a<=200?[200,200]:o<=400||a<=400?[400,400]:o<=800||a<=800?[800,800]:[1600,1600]}async loadImageBitMap(e){const{toolsType:t,opt:r,workId:o,requestId:a,timeoutMs:i}=e;if(t===s.EToolsKey.Image&&r&&o){const n=o.toString(),{src:c,type:l,width:d,height:h}=r;if(!c||!l||!d||!h)return;const p=this.getImageSourceKey(r);if(this.cacheImages.has(p)){const m=this.getCachedImages(p);if(m)return m}const f=this.imageResolveMap.get(p);if(f)return await f.promise,this.getCachedImages(p);let T,k;const I=new Promise((m,S)=>{T=m,k=S}),w={resolve:T,reject:k,timer:void 0,requestId:a,promise:I};return w.timer=setTimeout(()=>{this.imageResolveMap.get(p)===w&&T(p)},i??5e3),this.imageResolveMap.set(p,w),this.opt.post({sp:[{imageSrc:p,workId:n,viewId:this.viewId,isgl:!!this.fullLayer.parent.gl,isSubWorker:!1,requestId:a,type:s.EPostMessageType.GetImageBitMap}]}),await I,this.imageResolveMap.get(p)===w&&this.imageResolveMap.delete(p),this.getCachedImages(p)}}async removeNode(e){const{dataType:t,workId:r,removeIds:o}=e,a=o||[];if(r&&a.push(r.toString()),a.length)for(const i of a){if(i===s.Storage_Selector_key){await this.localWork.removeSelector(e);continue}t===s.EDataType.Local?this.localWork.removeWork(e):t===s.EDataType.Service&&this.serviceWork.removeWork(e),await this.localWork.colloctEffectSelectWork(e)}}async consumeFull(e,t){const r=await this.localWork.colloctEffectSelectWork(t);r&&e===s.EDataType.Local&&await this.localWork.consumeFull(r),r&&e===s.EDataType.Service&&this.serviceWork.consumeFull(r)}setCameraOpt(e){this.cameraOpt=e;const{scale:t,centerX:r,centerY:o,width:a,height:i}=e;(a!==this.scene.width||i!==this.scene.height)&&this.updateScene({width:a,height:i}),this.fullLayer.setAttribute("scale",[t,t]),this.fullLayer.setAttribute("translate",[-r,-o]),this.topLayer.setAttribute("scale",[t,t]),this.topLayer.setAttribute("translate",[-r,-o]),this.localLayer.setAttribute("scale",[t,t]),this.localLayer.setAttribute("translate",[-r,-o]),this.serviceLayer.setAttribute("scale",[t,t]),this.serviceLayer.setAttribute("translate",[-r,-o])}runBatchPostData(){this.destroyed||this.mainThreadPostId||(this.mainThreadPostId=requestAnimationFrame(this.combinePost.bind(this)))}combinePostData(){var a;this.mainThreadPostId=void 0;const e=[];let t,r,o;for(const i of this.combinePostMsg.values()){if((a=i.sp)!=null&&a.length)for(const n of i.sp){const c={...n,viewId:n.viewId||this.viewId,viewGeneration:n.viewGeneration??this.viewGeneration};let l=!1;for(const d of e)if(O.isEqual(c,d)){l=!0;break}l||e.push(c)}O.isNumber(i.fullWorkerDrawCount)&&(t=i.fullWorkerDrawCount),O.isNumber(i.consumeCount)&&(r=i.consumeCount,o=i.consumeWorkId)}return this.combinePostMsg.clear(),{sp:e,fullWorkerDrawCount:t,consumeCount:r,consumeWorkId:o,viewId:this.viewId,viewGeneration:this.viewGeneration,viewOwner:this.viewOwner}}combinePost(){var r,o;if(this.destroyed){this.mainThreadPostId=void 0,this.combinePostMsg.clear();return}const e=this.combinePostData(),t=(r=e.sp)==null?void 0:r.filter(a=>a.type!==s.EPostMessageType.None||a.isLockSentEventCursor||a.needUndoTicker||a.collectUndoTicker||a.eraseTxnPhase);t!=null&&t.length?e.sp=t.map(a=>({...a,viewId:a.viewId||this.viewId,viewGeneration:a.viewGeneration??this.viewGeneration})):delete e.sp,e.consumeCount===void 0&&(delete e.consumeCount,delete e.consumeWorkId),e.fullWorkerDrawCount===void 0&&delete e.fullWorkerDrawCount,!this.destroyed&&(e!=null&&e.consumeCount||e!=null&&e.fullWorkerDrawCount||(o=e.sp)!=null&&o.length)&&this.opt.post(e)}clearAll(){this.cancelCameraSettledRender(),this.debounceUpdateCache.clear(),this.fullLayer.children.length&&(this.fullLayer.parent.children.forEach(e=>{e.name!=="viewport"&&e.remove()}),s.removeAllChildren(this.fullLayer,this.fullLayer.parent)),this.clearCacheImages(),this.clearImageResolveMap(),this.localWork.clearAll(),this.topWork.clearAll(),this.serviceWork.clearAll(),this.vNodes.clear(),this.post({sp:[{type:s.EPostMessageType.Clear}]})}async consumeDrawAll(e,t){const{toolsType:r,workId:o}=t;if(o){const a=o.toString();if(r&&this.topWork.canUseTopLayer(r)){e===s.EDataType.Local&&(this.topWork.getLocalWorkShape(o.toString())||this.topWork.createLocalWork(t)),await this.topWork.consumeDrawAll(t);return}e===s.EDataType.Local&&(this.localWork.getWorkShape(a)||this.localWork.createLocalWork(t),await this.localWork.consumeDrawAll(t,this.serviceWork))}}async consumeDraw(e,t){const{opt:r,workId:o,toolsType:a}=t;if(o&&a&&r){const i=o.toString();if(this.topWork.canUseTopLayer(a)){e===s.EDataType.Local&&(this.topWork.getLocalWorkShape(i)||this.topWork.createLocalWork(t)),this.topWork.consumeDraw(t);return}e===s.EDataType.Local?(this.localWork.getWorkShape(i)||this.localWork.createLocalWork(t),await this.localWork.consumeDraw(t,this.serviceWork)):e===s.EDataType.Service&&this.serviceWork.consumeDraw(t);return}}async updateCamera(e,t){var d,h;const{cameraOpt:r,scenePath:o,cameraTaskId:a}=e;let i=!1;const n=this.cameraOpt,c=!!(r&&O.isEqual(n,r));let l=!1;if(r&&c){const p=!!this.activeCameraSettledRender;if(this.retargetCameraSettledRender(a))return;if(!p){O.isNumber(a)&&this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,cameraSettledTaskId:a});return}l=!0}if(r&&(!c||l)){this.cancelCameraSettledRender();const p=!n||n.scale!==r.scale||n.centerX!==r.centerX||n.centerY!==r.centerY||n.width!==r.width||n.height!==r.height;if(this.taskUpdateCameraId&&(clearTimeout(this.taskUpdateCameraId),this.taskUpdateCameraId=void 0,(d=this.taskUpdateCameraResolve)==null||d.call(this,!1),this.taskUpdateCameraResolve=void 0),o){let m;do{m=[];for(const[g,M]of this.localWork.getWorkShapes().entries())switch(M.toolsType){case s.EToolsKey.Text:case s.EToolsKey.BitMapEraser:case s.EToolsKey.PencilEraser:case s.EToolsKey.Eraser:case s.EToolsKey.Selector:case s.EToolsKey.LaserPen:break;default:g!==s.Cursor_Hover_Id&&g!==s.Storage_Selector_key&&m.push(`${g}:${M.toolsType}`);break}if(t&&(t.stage="blocking-works",t.blockingWorks=m),!m.length)break;if(!await new Promise(g=>{this.taskUpdateCameraResolve=g,this.taskUpdateCameraId=setTimeout(()=>{this.taskUpdateCameraId=void 0,this.taskUpdateCameraResolve=void 0,g(!0)},s.Task_Time_Interval)})||t!=null&&t.aborted)return}while(m.length);t&&(t.stage="update-camera",t.blockingWorks=void 0)}if(t!=null&&t.aborted)return;const y=new Map;for(const[m,S]of this.vNodes.getNodesByType(s.EToolsKey.Text).entries()){const g=S.rect;y.set(m,O.cloneDeep(g))}for(const[m,S]of this.vNodes.gethasEraserNodes().entries())y.set(m,O.cloneDeep(S.rect));const f=new Set(y.keys());let T=!1;if(this.localWork.hasSelector()){const m=(h=this.localWork.getSelector())==null?void 0:h.selectIds;if(m){T=!0;for(const S of m)f.add(S)}}let k=!1;if(this.serviceWork.selectorWorkShapes.size)for(const m of this.serviceWork.selectorWorkShapes.values()){const S=m.selectIds;if(S){k=!0;for(const g of S)f.add(g)}}if(this.setCameraOpt(r),this.vNodes.curNodeMap.size){this.vNodes.clearTarget(),this.vNodes.updateHighLevelNodesRect(f);for(const[g,M]of y.entries()){const W=this.vNodes.get(g);if(W){const P=M,C=W.rect,E=this.getSceneRect(),v=s.getRectMatrixrRelation(P,E),R=s.getRectMatrixrRelation(C,E);let L=l;(v!==R||P.w!==C.w||P.h!==C.h||R===s.EMatrixrRelationType.intersect)&&(L=!0);const{toolsType:N,opt:D}=W,B=D.eraserlines&&D.eraserlines.length>0||!!D.eraserFaces;(L||p&&B)&&(N===s.EToolsKey.Text||B)&&this.debounceUpdateCache.add(g)}}if(T&&this.localWork.reRenderSelector(),k)for(const[g,M]of this.serviceWork.selectorWorkShapes.entries())this.serviceWork.runSelectWork({workId:g,selectIds:M.selectIds,msgType:s.EPostMessageType.Select,dataType:s.EDataType.Service,viewId:this.viewId});i=!0;const m={cancelled:!1,cameraTaskId:a,context:t};this.activeCameraSettledRender=m;const S=()=>!this.destroyed&&!m.cancelled&&this.activeCameraSettledRender===m&&!(t!=null&&t.aborted);this.debounceUpdateCameraId=setTimeout(async()=>{var g;this.debounceUpdateCameraId=void 0;try{if(!S())return;const M=[];for(const C of this.debounceUpdateCache.values()){const E=(g=this.fullLayer)==null?void 0:g.getElementsByName(C)[0],v=this.vNodes.get(C);if(v){const{toolsType:R,opt:L}=v;if(E||R!==s.EToolsKey.Text){const N=this.localWork.setFullWork({toolsType:R,opt:L,workId:C});if(N){if(R===s.EToolsKey.Text)M.push(N.consumeServiceAsync({isFullWork:!0,replaceId:C,boxRect:this.getSceneRect(),isActive:S}));else if(L.eraserlines&&L.eraserlines.length>0||L.eraserFaces){const D=N.consumeService({op:v.op,isFullWork:!0,replaceId:C,workState:s.EventWorkState.Done});this.localWork.clearWorkShapeNodeCache(C),M.push(Promise.resolve(D))}}}}this.debounceUpdateCache.delete(C)}if(await Promise.all(M),!S())return;this.vNodes.updateLowLevelNodesRect(),this.vNodes.clearHighLevelIds();const W=[this.fullLayer.parent.prepareRender,this.topLayer.parent.prepareRender,this.localLayer.parent.prepareRender,this.serviceLayer.parent.prepareRender];if(m.renderLayers=[this.fullLayer.parent,this.topLayer.parent,this.localLayer.parent,this.serviceLayer.parent],await Promise.all(W),m.renderLayers=void 0,!S())return;const P=m.cameraTaskId;O.isNumber(P)&&this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,cameraSettledTaskId:P})}catch(M){if(!S())return;const W={code:"RENDERER_BUSINESS_ERROR",business:"updateCamera",message:M instanceof Error?M.message:String(M),stage:"camera-settled-render",workerType:"mainThread"},P=m.cameraTaskId;if(O.isNumber(P))try{this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,cameraTaskId:P,cameraTaskStatus:"failed",cameraTaskError:W})}catch(C){console.error(`[cameraSettledRender] failed ACK post failed viewId=${this.viewId} taskId=${P}`,C)}}finally{m.renderLayers=void 0,this.activeCameraSettledRender===m&&(this.activeCameraSettledRender=void 0)}},s.Task_Time_Interval)}const I=[this.fullLayer.parent,this.topLayer.parent,this.localLayer.parent,this.serviceLayer.parent],w=Promise.all(I.map(m=>m.prepareRender));if(t&&!await s.waitForCameraUpdateTask(t,w,"prepare-render")){I.filter(S=>S.cancelPendingRender()).forEach(S=>S.render()),w.catch(()=>{});return}if(t||await w,t!=null&&t.aborted)return;!i&&O.isNumber(a)&&this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,cameraSettledTaskId:a})}}getSceneRect(){const{width:e,height:t}=this.scene;return{x:0,y:0,w:Math.floor(e),h:Math.floor(t)}}createScene(e){return new s.Scene({displayRatio:this.opt.displayer.dpr,depth:!1,desynchronized:!0,...e,autoRender:!0,id:this.viewId,contextType:"2d"})}createLayer(e,t,r){const{width:o,height:a}=r,i=`canvas-${e}`,n=t.layer(i,{...r,offscreen:!1}),c=new s.Group({anchor:[.5,.5],pos:[o*.5,a*.5],size:[o,a],name:"viewport",id:e});return n.append(c),c}enableCanvas2DReadback(e){this.readbackScheduler=new ae({onReadbackError:t=>this.opt.master.Logger.warn(`[Appliance]: [main-thread-readback] stage=failed viewId=${this.viewId} error=${t instanceof Error?t.message:String(t)}`)});for(const t of e){const r=t.render,o=(...a)=>{var c;const i=r.apply(t,a),n=t.canvas;return n instanceof HTMLCanvasElement&&((c=this.readbackScheduler)==null||c.markRendered(n)),i};t.render=o,this.restoreLayerRenderCallbacks.push(()=>{t.render===o&&(t.render=r)})}}disableCanvas2DReadback(){var e;(e=this.readbackScheduler)==null||e.destroy(),this.readbackScheduler=void 0;for(const t of this.restoreLayerRenderCallbacks.splice(0))t()}updateScene(e){this.scene.attr({...e});const{width:t,height:r}=e;this.scene.width=t,this.scene.height=r,this.updateLayer({width:t,height:r})}updateLayer(e){const{width:t,height:r}=e;this.fullLayer.parent.setAttribute("width",t),this.fullLayer.parent.setAttribute("height",r),this.fullLayer.setAttribute("size",[t,r]),this.fullLayer.setAttribute("pos",[t*.5,r*.5]),this.topLayer.parent.setAttribute("width",t),this.topLayer.parent.setAttribute("height",r),this.topLayer.setAttribute("size",[t,r]),this.topLayer.setAttribute("pos",[t*.5,r*.5]),this.localLayer.parent.setAttribute("width",t),this.localLayer.parent.setAttribute("height",r),this.localLayer.setAttribute("size",[t,r]),this.localLayer.setAttribute("pos",[t*.5,r*.5]),this.serviceLayer.parent.setAttribute("width",t),this.serviceLayer.parent.setAttribute("height",r),this.serviceLayer.setAttribute("size",[t,r]),this.serviceLayer.setAttribute("pos",[t*.5,r*.5])}cancelCameraSettledRender(){var t;this.debounceUpdateCameraId!==void 0&&(clearTimeout(this.debounceUpdateCameraId),this.debounceUpdateCameraId=void 0);const e=this.activeCameraSettledRender;e&&(e.cancelled=!0,(t=e.renderLayers)==null||t.forEach(r=>r.cancelPendingRender()),this.activeCameraSettledRender=void 0)}retargetCameraSettledRender(e){var r;if(!O.isNumber(e))return!1;const t=this.activeCameraSettledRender;return!t||t.cancelled||(r=t.context)!=null&&r.aborted?!1:(t.cameraTaskId=e,!0)}cancelCameraBlockingWait(){this.taskUpdateCameraId!==void 0&&(clearTimeout(this.taskUpdateCameraId),this.taskUpdateCameraId=void 0);const e=this.taskUpdateCameraResolve;this.taskUpdateCameraResolve=void 0,e==null||e(!1)}destroy(){var e,t;this.destroyed||(this.destroyed=!0,this.disableCanvas2DReadback(),(t=(e=this.activeCameraTaskContext)==null?void 0:e.abort)==null||t.call(e),this.activeCameraTaskContext=void 0,this.mainThreadPostId!==void 0&&(cancelAnimationFrame(this.mainThreadPostId),this.mainThreadPostId=void 0),this.combinePostMsg.clear(),this.cancelCameraBlockingWait(),this.cancelCameraSettledRender(),this.debounceUpdateCache.clear(),this.clearCacheImages(),this.clearImageResolveMap(new Error(`main-thread view destroyed: ${this.viewId}`)),this.vNodes.clear(),re({subThreads:[this.localWork,this.serviceWork,this.topWork],layers:[this.fullLayer,this.topLayer,this.localLayer,this.serviceLayer],scene:this.scene,removeLayerTexture:(r,o)=>s.removeTexture(r,o)}))}}class ne{constructor(e,t){u(this,"viewId");u(this,"fullLayer");u(this,"master");u(this,"opt");u(this,"viewOwner");u(this,"viewGeneration");u(this,"scene");u(this,"mainThreadPostId");u(this,"combinePostMsg",new Set);u(this,"destroyed",!1);u(this,"workShapes",new Map);u(this,"cacheImages",new Map);u(this,"imageResolveMap",new Map);u(this,"activeRequest");this.viewId=e,this.opt=t,this.viewOwner=t.viewOwner,this.viewGeneration=t.viewGeneration,this.scene=this.createScene({...t.canvasOpt,container:t.container}),this.master=t.master,this.fullLayer=this.createLayer("fullLayer",this.scene,{...t.layerOpt,bufferSize:this.viewId===s.Main_View_Id?6e3:3e3,contextType:"2d"})}getCachedImages(e){var t;return(t=this.cacheImages.get(e))==null?void 0:t.imageSource}getCachedImagesByWorkId(e){for(const[t,r]of this.cacheImages.entries())if(t===e&&r.imageSource)return r.imageSource}deleteCachedImagesByWorkId(e){for(const[t,r]of this.cacheImages.entries())r.workId===e&&(this.closeImageSource(r.imageSource),this.cacheImages.delete(t))}clearCacheImages(){this.cacheImages.forEach(e=>this.closeImageSource(e.imageSource)),this.cacheImages.clear()}closeImageSource(e){if(e&&!(!("close"in e)||typeof e.close!="function"))try{e.close()}catch{}}releaseMessageImageBitmap(e){this.closeImageSource(e==null?void 0:e.imageBitmap)}releaseBatchImageBitmaps(e){var t,r;(t=e==null?void 0:e.render)==null||t.forEach(o=>this.closeImageSource(o.imageBitmap)),(r=e==null?void 0:e.sp)==null||r.forEach(o=>this.releaseMessageImageBitmap(o))}clearImageResolveMap(){this.imageResolveMap.forEach(({timer:e,resolve:t},r)=>{e&&clearTimeout(e),t==null||t(r)}),this.imageResolveMap.clear()}post(e){if(this.destroyed){this.releaseBatchImageBitmaps(e);return}this.combinePostMsg.add(e),this.runBatchPostData()}reportRequestFailure(e,t,r,o,a){const i=o instanceof Error?o.message:String(o);try{this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,viewOwner:this.viewOwner,sp:[{type:s.EPostMessageType.ReportError,viewId:this.viewId,scenePath:r,requestId:t,reportBusiness:e,reportStage:a,reportError:i,reportString:`[SnapshotThreadImpl] ${e} failed; stage=${a}; requestId=${t||"unknown"}; error=${i}`}]})}catch(n){console.error(`[SnapshotThreadImpl] ${e} failure report failed`,n)}}async on(e){if(this.destroyed){this.closeImageSource(e.imageBitmap);return}const{msgType:t,imageSrc:r,imageBitmap:o,imageElement:a,workId:i,requestId:n}=e;switch(t){case s.EPostMessageType.Snapshot:{this.activeRequest={business:"snapshot",scenePath:e.scenePath,requestId:e.requestId};try{await this.getSnapshot(e),this.flushPendingPost()}catch(c){this.destroyed||this.reportRequestFailure("snapshot",e.requestId,e.scenePath,c,"render")}finally{this.activeRequest=void 0,this.destroy()}return}case s.EPostMessageType.BoundingBox:{this.activeRequest={business:"bounding-box",scenePath:e.scenePath,requestId:e.requestId};try{await this.getBoundingRect(e),this.flushPendingPost()}catch(c){this.destroyed||this.reportRequestFailure("bounding-box",e.requestId,e.scenePath,c,"compute")}finally{this.activeRequest=void 0,this.destroy()}return}case s.EPostMessageType.GetImageBitMap:{if(r&&i){const c=this.imageResolveMap.get(r);if(!c||c.requestId!==n){this.closeImageSource(o||a);break}if(o||a){const l=i.toString();this.deleteCachedImagesByWorkId(l),this.cacheImages.set(r,{imageSource:o||a,workId:l})}if(c){const{resolve:l,timer:d}=c;d&&clearTimeout(d),l&&l(r)}}break}}}getIconSize(e,t,r){const o=e*r,a=t*r;return o<=50||a<=50?[50,50]:o<=100||a<=100?[100,100]:o<=200||a<=200?[200,200]:o<=400||a<=400?[400,400]:o<=800||a<=800?[800,800]:[1600,1600]}async loadImageBitMap(e){const{toolsType:t,opt:r,workId:o,requestId:a}=e;if(t===s.EToolsKey.Image&&r&&o){const i=o.toString(),{src:n,type:c,width:l,height:d,strokeColor:h}=r;if(!n||!c||!l||!d)return;let p=n;if(c===s.EImageType.Iconify){const[w,m]=this.getIconSize(l,d,this.opt.displayer.dpr);p=s.getIconImageSrc(n,w,m,h)}if(this.cacheImages.has(p)){const w=this.getCachedImages(p);if(w)return w}const f=this.imageResolveMap.get(p);if(f)return await f.promise,this.getCachedImages(p);let T;const k=new Promise(w=>{T=w}),I={resolve:T,timer:void 0,requestId:a,promise:k};return I.timer=setTimeout(()=>{this.imageResolveMap.get(p)===I&&T(p)},5e3),this.imageResolveMap.set(p,I),this.opt.post({viewId:this.viewId,viewGeneration:this.viewGeneration,viewOwner:this.viewOwner,sp:[{imageSrc:p,workId:i,viewId:this.viewId,isgl:!!this.fullLayer.parent.gl,isSubWorker:!0,type:s.EPostMessageType.GetImageBitMap,requestId:a}]}),await k,this.imageResolveMap.get(p)===I&&this.imageResolveMap.delete(p),this.getCachedImages(p)}}createWorkShapeNode(e){return s.getShapeInstance({...e,fullLayer:this.fullLayer,drawLayer:void 0})}setFullWork(e){const{workId:t,opt:r,toolsType:o}=e;if(t&&r&&o){const a=t.toString();let i;return t&&this.workShapes.has(a)?(i=this.workShapes.get(a),i==null||i.setWorkOptions(r)):i=this.createWorkShapeNode({toolsOpt:r,toolsType:o,workId:a}),i?(this.workShapes.set(a,i),i):void 0}}async runFullWork(e){var o;const t=this.setFullWork(e),r=e.ops&&s.transformToNormalData(e.ops);if(t){let a,i;const n=(o=t.getWorkId())==null?void 0:o.toString();return t.toolsType===s.EToolsKey.BackgroundSVG?a=t.consumeService({isFullWork:!0,replaceId:n}):t.toolsType===s.EToolsKey.Image?a=await t.consumeServiceAsync({isFullWork:!0,worker:this,requestId:e.requestId}):t.toolsType===s.EToolsKey.Text?a=await t.consumeServiceAsync({isFullWork:!0,replaceId:n,isDrawLabel:!0}):(a=t.consumeService({op:r,isFullWork:!0,replaceId:n}),i=(e==null?void 0:e.updateNodeOpt)&&t.updataOptService(e.updateNodeOpt)),s.computRect(a,i)}}async getSnapshot(e){const{scenePath:t,scenes:r,cameraOpt:o,w:a,h:i,requestId:n}=e;if(!(t&&r&&o))throw new Error("snapshot input is incomplete");this.setCameraOpt(o);for(const[l,d]of Object.entries(r))if(d!=null&&d.type)switch(d==null?void 0:d.type){case s.EPostMessageType.UpdateNode:case s.EPostMessageType.FullWork:{const{opt:h}=d,p={...d,opt:h,workId:l,msgType:s.EPostMessageType.FullWork,dataType:s.EDataType.Service,viewId:this.viewId,requestId:n};await this.runFullWork(p);break}}let c;a&&i&&(c={resizeWidth:a,resizeHeight:i}),await this.getSnapshotRender({scenePath:t,options:c,requestId:n})}getSceneRect(){const{width:e,height:t}=this.scene;return{x:0,y:0,w:Math.floor(e),h:Math.floor(t)}}getRectImageBitmap(e,t){const r=Math.floor(e.x*this.opt.displayer.dpr),o=Math.floor(e.y*this.opt.displayer.dpr),a=e.w>0&&Math.floor(e.w*this.opt.displayer.dpr||1)||1,i=e.h>0&&Math.floor(e.h*this.opt.displayer.dpr||1)||1;return createImageBitmap(this.fullLayer.parent.canvas,r,o,a,i,t)}async getSnapshotRender(e){var i;const{scenePath:t,options:r,requestId:o}=e;((i=this.fullLayer)==null?void 0:i.parent).render();const a=await this.getRectImageBitmap(this.getSceneRect(),r);if(a){if(this.destroyed){this.closeImageSource(a);return}this.post({sp:[{type:s.EPostMessageType.Snapshot,scenePath:t,imageBitmap:a,viewId:this.viewId,index:0,requestId:o}]}),this.fullLayer&&!this.destroyed&&s.removeAllChildren(this.fullLayer,this.fullLayer.parent)}}async getBoundingRect(e){const{scenePath:t,scenes:r,cameraOpt:o,requestId:a}=e;if(!(t&&r&&o))throw new Error("bounding-box input is incomplete");this.setCameraOpt(o);let i;for(const[n,c]of Object.entries(r))if(c!=null&&c.type)switch(c==null?void 0:c.type){case s.EPostMessageType.UpdateNode:case s.EPostMessageType.FullWork:{const l=await this.runFullWork({...c,workId:n,msgType:s.EPostMessageType.FullWork,dataType:s.EDataType.Service,viewId:this.viewId,requestId:a});i=s.computRect(i,l);break}}this.post({sp:[{type:s.EPostMessageType.BoundingBox,scenePath:t,rect:i||{x:0,y:0,w:0,h:0},viewId:this.viewId,requestId:a}]})}setCameraOpt(e){const{scale:t,centerX:r,centerY:o,width:a,height:i}=e;this.updateScene({width:a,height:i}),this.fullLayer.setAttribute("scale",[t,t]),this.fullLayer.setAttribute("translate",[-r,-o])}runBatchPostData(){this.destroyed||this.mainThreadPostId||(this.mainThreadPostId=requestAnimationFrame(this.combinePost.bind(this)))}flushPendingPost(){!this.combinePostMsg.size||this.destroyed||(this.mainThreadPostId!==void 0&&(cancelAnimationFrame(this.mainThreadPostId),this.mainThreadPostId=void 0),this.combinePost())}combinePostData(){var t;this.mainThreadPostId=void 0;const e=[];for(const r of this.combinePostMsg.values())if((t=r.sp)!=null&&t.length)for(const o of r.sp){let a=!1;for(const i of e)if(s.isEqual(o,i)){a=!0;break}a?this.releaseMessageImageBitmap(o):e.push(o)}return this.combinePostMsg.clear(),{sp:e}}combinePost(){var r,o;if(this.destroyed){this.mainThreadPostId=void 0,this.releaseBatchImageBitmaps({sp:[...this.combinePostMsg].flatMap(a=>a.sp||[])}),this.combinePostMsg.clear();return}const e=this.combinePostData(),t=(r=e.sp)==null?void 0:r.filter(a=>a.type!==s.EPostMessageType.None||a.isLockSentEventCursor||a.needUndoTicker);if(e.sp&&t){const a=new Set(t);e.sp.filter(i=>!a.has(i)).forEach(i=>this.releaseMessageImageBitmap(i))}if(t!=null&&t.length?e.sp=t.map(a=>a.viewId?a:{...a,viewId:this.viewId}):delete e.sp,!this.destroyed&&((o=e.sp)!=null&&o.length))try{this.opt.post({...e,viewId:this.viewId,viewGeneration:this.viewGeneration,viewOwner:this.viewOwner})}catch(a){throw this.releaseBatchImageBitmaps(e),a}else this.releaseBatchImageBitmaps(e)}createScene(e){return new s.Scene({displayRatio:this.opt.displayer.dpr,depth:!1,desynchronized:!0,...e,autoRender:!1,contextType:"2d"})}createLayer(e,t,r){const{width:o,height:a}=r,i=`canvas-${e}`,n=t.layer(i,r),c=new s.Group({anchor:[.5,.5],pos:[o*.5,a*.5],size:[o,a],name:"viewport",id:e});return n.append(c),c}updateScene(e){this.scene.attr({...e});const{width:t,height:r}=e;this.scene.width=t,this.scene.height=r,this.updateLayer({width:t,height:r})}updateLayer(e){const{width:t,height:r}=e;this.fullLayer.parent.setAttribute("width",t),this.fullLayer.parent.setAttribute("height",r),this.fullLayer.setAttribute("size",[t,r]),this.fullLayer.setAttribute("pos",[t*.5,r*.5])}destroy(e){if(this.destroyed)return;e&&this.activeRequest&&this.reportRequestFailure(this.activeRequest.business,this.activeRequest.requestId,this.activeRequest.scenePath,new Error(`snapshot request ${e}`),e),this.activeRequest=void 0,this.destroyed=!0,this.mainThreadPostId!==void 0&&(cancelAnimationFrame(this.mainThreadPostId),this.mainThreadPostId=void 0),this.releaseBatchImageBitmaps({sp:[...this.combinePostMsg].flatMap(o=>o.sp||[])}),this.combinePostMsg.clear();const t=[];this.workShapes.forEach(o=>{try{o.clearTmpPoints()}catch(a){t.push(a)}}),this.workShapes.clear();try{this.clearCacheImages()}catch(o){t.push(o)}try{this.clearImageResolveMap()}catch(o){t.push(o)}const r=this.fullLayer.parent;try{this.fullLayer.remove()}catch(o){t.push(o)}try{r&&s.removeTexture(this.fullLayer,r)}catch(o){t.push(o)}try{this.scene.remove()}catch(o){t.push(o)}if(t.length)throw t[0]}}class ce{constructor(e){u(this,"mainThreadMap",new Map);u(this,"cameraRenderQueueByView",new Map);u(this,"viewGenerationById",new Map);u(this,"viewOwnerById",new Map);u(this,"ownerSequence",0);u(this,"snapshotThreadsByRequest",new Map);u(this,"destroyed",!1);u(this,"master");u(this,"post",e=>{if(this.destroyed){this.releaseBatchResources(e);return}if(e.viewId){const y=this.viewOwnerById.get(e.viewId),f=this.viewGenerationById.get(e.viewId);if(e.viewOwner!==void 0&&(!y||y!==e.viewOwner)||e.viewGeneration!==void 0&&f!==void 0&&f!==e.viewGeneration){this.releaseBatchResources(e);return}}const{fullWorkerDrawCount:t,sp:r,workerTasksqueueCount:o,cameraTaskId:a,cameraTaskStatus:i,cameraTaskError:n,cameraSettledTaskId:c,viewId:l,viewGeneration:d,consumeCount:h,consumeWorkId:p}=e;if(l&&s.isNumber(a)){const y=s.normalizeCameraTaskError(i,n,"mainThread");y?this.master.failCameraTask(l,a,y,d):this.master.ackCameraTask(l,a,d)}l&&s.isNumber(c)&&this.master.ackCameraSettledTask(l,c,d),this.master.isBusy&&s.isNumber(o)&&this.master.setWorkerTasksqueueCount(o),s.isNumber(t)&&this.master.setMaxDrawCount(t),s.isNumber(h)&&this.master.setConsumeCount(h,p),r&&this.master.collectorSyncData(e.viewOwner===void 0?r:r.map(y=>y.type===s.EPostMessageType.GetImageBitMap&&y.viewOwner===void 0?{...y,viewOwner:e.viewOwner}:y))});this.master=e}enqueueViewTask(e,t){const o=(this.cameraRenderQueueByView.get(e)||Promise.resolve()).catch(()=>{}).then(()=>this.destroyed?void 0:t());return this.cameraRenderQueueByView.set(e,o),o}isStaleViewMessage(e){if(!e.viewId||e.viewId===s.Storage_ViewId_ALL||e.viewGeneration===void 0)return!1;const t=this.viewGenerationById.get(e.viewId);return t!==void 0&&e.viewGeneration<t}discardView(e){for(const[r,o]of[...this.snapshotThreadsByRequest.entries()])o.thread.viewId===e&&this.disposeSnapshotThread(r,o.thread,"view-destroyed");const t=this.mainThreadMap.get(e);try{t==null||t.destroy()}catch(r){this.master.Logger.error(`[Appliance]: MainThread View discard failed; viewId=${e}; error=${r instanceof Error?r.message:String(r)}`)}this.mainThreadMap.delete(e),this.cameraRenderQueueByView.delete(e),this.viewOwnerById.delete(e),this.viewGenerationById.set(e,(this.viewGenerationById.get(e)||0)+1)}destroy(){if(this.destroyed)return;this.destroyed=!0;const e=[];for(const[t,r]of[...this.snapshotThreadsByRequest.entries()])try{this.disposeSnapshotThread(t,r.thread)}catch(o){e.push(`snapshot-thread: ${o instanceof Error?o.message:String(o)}`)}this.snapshotThreadsByRequest.clear();for(const t of this.mainThreadMap.values())try{t.destroy()}catch(r){e.push(`view=${t.viewId}: ${r instanceof Error?r.message:String(r)}`)}this.mainThreadMap.clear(),this.cameraRenderQueueByView.clear(),this.viewOwnerById.clear(),e.length&&this.master.Logger.error(`[Appliance]: MainThread destroy completed with cleanup errors: ${e.join("; ")}`)}createMainThread(e,t){return new ie(e,t)}createSnapshotThread(e,t){return new ne(e,t)}getSnapshotRequestKey(e){return e.requestId||`${e.viewId}\0${e.scenePath||""}\0${e.msgType}`}disposeSnapshotThread(e,t,r){const o=this.snapshotThreadsByRequest.get(e);if(!(!o||o.thread!==t)){this.snapshotThreadsByRequest.delete(e);try{t.destroy(r)}finally{o.surface.remove()}}}releaseMessageBitmap(e){var t;try{(t=e.imageBitmap)==null||t.close()}catch{}}releaseBatchResources(e){var t,r;(t=e.render)==null||t.forEach(o=>this.releaseImageBitmap(o.imageBitmap)),(r=e.sp)==null||r.forEach(o=>this.releaseImageBitmap(o.imageBitmap))}releaseImageBitmap(e){var t;try{(t=e==null?void 0:e.close)==null||t.call(e)}catch{}}async consume(e){var t,r,o;if(this.destroyed){e.forEach(a=>this.releaseMessageBitmap(a));return}for(const a of e.values()){if(this.destroyed){this.releaseMessageBitmap(a);return}const{msgType:i,viewId:n,tasksqueue:c,mainTasksqueueCount:l,cameraTaskId:d,layerOpt:h,offscreenCanvasOpt:p,cameraOpt:y,isSubWorker:f}=a;if(this.isStaleViewMessage(a)){this.releaseMessageBitmap(a);continue}if(i===s.EPostMessageType.Console){console.log(this);continue}if(i===s.EPostMessageType.Init){const w=a.viewGeneration??(this.viewGenerationById.get(n)||0)+1;await this.enqueueViewTask(n,async()=>{var C,E,v;const m=this.viewGenerationById.get(n);if(m!==void 0&&w<m)return;this.viewGenerationById.set(n,w);const S=a.viewOwner||`${n}:${w}:${++this.ownerSequence}`,g=(C=this.master.control.viewContainerManager.getView(n))==null?void 0:C.displayer,M=g==null?void 0:g.canvasContainerRef.current;if(!g||!M||!h||!p){this.viewOwnerById.delete(n);return}this.viewOwnerById.set(n,S);const W=this.mainThreadMap.get(n);W==null||W.destroy();const P=this.createMainThread(n,{displayer:g,container:M,layerOpt:h,master:this.master,canvasOpt:p,viewOwner:S,viewGeneration:w,mainThreadRenderMode:((v=(E=this.master.control)==null?void 0:E.renderingCompatibilityDecision)==null?void 0:v.mainThreadRenderMode)??"normal",post:R=>this.post({...R,viewId:R.viewId||n,viewGeneration:R.viewGeneration??w,viewOwner:S})});this.mainThreadMap.set(n,P),P&&y&&P.setCameraOpt(y),this.post({sp:[{type:s.EPostMessageType.Init,viewId:n,viewGeneration:w}]})});continue}if(i===s.EPostMessageType.Snapshot||i===s.EPostMessageType.BoundingBox){const w=(t=this.master.control.viewContainerManager.getView(n))==null?void 0:t.displayer,m=(r=this.master.control.viewContainerManager.mainView)==null?void 0:r.displayer,S=(o=m==null?void 0:m.snapshotContainerRef)==null?void 0:o.current;if(w&&S&&y){const g=this.getSnapshotRequestKey(a),M=this.snapshotThreadsByRequest.get(g);M&&this.disposeSnapshotThread(g,M.thread,"replaced");const W=document.createElement("div");W.style.width=`${y.width}px`,W.style.height=`${y.height}px`,S.append(W);const P={...s.ViewContainerManager.defaultLayerOpt,offscreen:!1,width:y.width,height:y.height},C={...s.ViewContainerManager.defaultScreenCanvasOpt,width:y.width,height:y.height},E=this.createSnapshotThread(n,{displayer:w,container:W,layerOpt:P,master:this.master,canvasOpt:C,post:this.post,viewOwner:this.viewOwnerById.get(n),viewGeneration:this.viewGenerationById.get(n)});this.snapshotThreadsByRequest.set(g,{thread:E,surface:W}),E.on(a).then(()=>{this.disposeSnapshotThread(g,E)}).catch(v=>{this.master.Logger.error(`[Appliance]: snapshot render failed; viewId=${n}; error=${v instanceof Error?v.message:String(v)}`),this.disposeSnapshotThread(g,E)});continue}this.post({viewId:n,viewGeneration:this.viewGenerationById.get(n),viewOwner:this.viewOwnerById.get(n),sp:[{type:s.EPostMessageType.ReportError,viewId:n,scenePath:a.scenePath,requestId:a.requestId,reportBusiness:i===s.EPostMessageType.Snapshot?"snapshot":"bounding-box",reportStage:"surface-unavailable",reportError:"snapshot surface is unavailable",reportString:`[MainThreadManager] ${i===s.EPostMessageType.Snapshot?"snapshot":"bounding-box"} surface is unavailable; viewId=${n}; requestId=${a.requestId||"unknown"}`}]});continue}if(i===s.EPostMessageType.GetImageBitMap&&f){const w=a.requestId?this.snapshotThreadsByRequest.get(a.requestId):[...this.snapshotThreadsByRequest.values()].find(({thread:m})=>m.viewId===n);w?w.thread.on(a):this.releaseMessageBitmap(a);continue}if(i===s.EPostMessageType.GetImageBitMap){const w=this.mainThreadMap.get(n),m=this.viewGenerationById.get(n),S=this.viewOwnerById.get(n);if(!w||a.viewGeneration!==void 0&&a.viewGeneration!==m||a.viewOwner!==void 0&&a.viewOwner!==S||this.mainThreadMap.get(n)!==w){this.releaseMessageBitmap(a);continue}await w.on(a);continue}if(i===s.EPostMessageType.TasksQueue&&(c!=null&&c.size)){const w=c.get(n),m=this.mainThreadMap.get(n),S=this.viewGenerationById.get(n),g=this.viewOwnerById.get(n);let M;if(w&&m)try{await this.enqueueViewTask(n,async()=>{this.viewGenerationById.get(n)!==S||this.viewOwnerById.get(n)!==g||this.mainThreadMap.get(n)!==m||await m.on(w)})}catch(W){if(w.msgType!==s.EPostMessageType.UpdateCamera)throw W;const P=s.isCameraUpdateTimeoutError(W);M={code:P?"RENDERER_BUSINESS_TIMEOUT":"RENDERER_BUSINESS_ERROR",business:"updateCamera",message:W instanceof Error?W.message:String(W),elapsedMs:P?W.elapsedMs:void 0,stage:P?W.stage:"update-camera",blockingWorks:P?W.blockingWorks:void 0,workerType:"mainThread"}}if(M&&s.isNumber(d)){this.post({viewId:n,viewGeneration:S,viewOwner:g,cameraTaskId:d,cameraTaskStatus:M.code==="RENDERER_BUSINESS_TIMEOUT"?"timeout":"failed",cameraTaskError:M});continue}l&&s.isNumber(d)&&this.post({workerTasksqueueCount:l,cameraTaskId:d,viewId:n,viewGeneration:S,viewOwner:g});continue}if(n===s.Storage_ViewId_ALL){const w=[...this.mainThreadMap.entries()];for(const[m,S]of w){const g=this.enqueueViewTask(m,async()=>{this.mainThreadMap.get(m)===S&&(i===s.EPostMessageType.Destroy?(S.destroy(),this.mainThreadMap.delete(m),this.viewOwnerById.delete(m),this.viewGenerationById.set(m,(this.viewGenerationById.get(m)||0)+1)):await S.on(a))});await g,this.cameraRenderQueueByView.get(m)===g&&this.cameraRenderQueueByView.delete(m)}continue}const T=this.mainThreadMap.get(n);if(i===s.EPostMessageType.Destroy&&!T){await this.enqueueViewTask(n,async()=>{this.viewGenerationById.set(n,a.viewGeneration??(this.viewGenerationById.get(n)||0)+1),this.viewOwnerById.delete(n)});continue}if(!T)continue;const k=this.viewGenerationById.get(n),I=this.enqueueViewTask(n,async()=>{this.viewGenerationById.get(n)!==k||this.mainThreadMap.get(n)!==T||await T.on(a)});i===s.EPostMessageType.Destroy&&(await I,this.mainThreadMap.get(n)===T&&this.mainThreadMap.delete(n),this.viewOwnerById.delete(n),this.cameraRenderQueueByView.get(n)===I&&this.cameraRenderQueueByView.delete(n),this.viewGenerationById.set(n,a.viewGeneration??(k||0)+1))}}}exports.MainThreadManagerImpl=ce;
|