@netless/appliance-plugin 1.1.42 → 1.1.43-beta.1

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.
Files changed (112) hide show
  1. package/READMA.zh-CN.md +23 -1
  2. package/README.md +28 -1
  3. package/dist/appliance-plugin.js +1 -1
  4. package/dist/appliance-plugin.mjs +33 -30
  5. package/dist/{bridge-C8yT2GqS.js → bridge-CDqtVTPN.js} +1 -1
  6. package/dist/{bridge-DLGOhX8U.mjs → bridge-nmqVpnZ5.mjs} +1 -1
  7. package/dist/bridge.js +1 -1
  8. package/dist/bridge.mjs +1 -1
  9. package/dist/collector/collector.d.ts +50 -2
  10. package/dist/collector/types.d.ts +6 -0
  11. package/dist/component/svg/manager.d.ts +1 -0
  12. package/dist/component/svg/snapshot.d.ts +4 -1
  13. package/dist/component/textEditor/manager.d.ts +3 -0
  14. package/dist/core/backGroundThread/index.d.ts +6 -1
  15. package/dist/core/cameraTask.d.ts +45 -0
  16. package/dist/core/const.d.ts +4 -0
  17. package/dist/core/enum.d.ts +7 -1
  18. package/dist/core/error.d.ts +1 -0
  19. package/dist/core/fontFace.d.ts +5 -3
  20. package/dist/core/mainEngine.d.ts +236 -31
  21. package/dist/core/mainThread/base.d.ts +23 -2
  22. package/dist/core/mainThread/canvas2DReadback.d.ts +27 -0
  23. package/dist/core/mainThread/index.d.ts +12 -1
  24. package/dist/core/mainThread/snapshotThread.d.ts +11 -2
  25. package/dist/core/mainThread/subLocalThread.d.ts +15 -6
  26. package/dist/core/mainThread/subServiceThread.d.ts +5 -3
  27. package/dist/core/msgEvent/base.d.ts +4 -1
  28. package/dist/core/msgEvent/baseForWorker.d.ts +1 -1
  29. package/dist/core/msgEvent/copyNode/forWorker.d.ts +1 -1
  30. package/dist/core/msgEvent/forWorker.d.ts +1 -1
  31. package/dist/core/msgEvent/index.d.ts +5 -3
  32. package/dist/core/msgEvent/rotateNode/forMain.d.ts +1 -0
  33. package/dist/core/msgEvent/rotateNode/forWorker.d.ts +1 -1
  34. package/dist/core/msgEvent/scaleNode/forMain.d.ts +1 -0
  35. package/dist/core/msgEvent/scaleNode/forWorker.d.ts +1 -1
  36. package/dist/core/msgEvent/setColor/forMain.d.ts +1 -0
  37. package/dist/core/msgEvent/setColor/forWorker.d.ts +1 -1
  38. package/dist/core/msgEvent/setFont/forWorker.d.ts +1 -1
  39. package/dist/core/msgEvent/setLock/forWorker.d.ts +1 -1
  40. package/dist/core/msgEvent/setPoint/forWorker.d.ts +1 -1
  41. package/dist/core/msgEvent/setShape/forWorker.d.ts +1 -1
  42. package/dist/core/msgEvent/setZIndex/forWorker.d.ts +1 -1
  43. package/dist/core/msgEvent/translateNode/forMain.d.ts +1 -0
  44. package/dist/core/msgEvent/translateNode/forWorker.d.ts +1 -1
  45. package/dist/core/renderRuntimeFallback.d.ts +2 -0
  46. package/dist/core/rendererBusinessTask.d.ts +30 -0
  47. package/dist/core/serviceRenderScheduler.d.ts +33 -0
  48. package/dist/core/tools/base.d.ts +1 -1
  49. package/dist/core/tools/bitmapEraserFastPath.d.ts +8 -0
  50. package/dist/core/tools/eraserFaces.d.ts +24 -9
  51. package/dist/core/tools/image.d.ts +1 -0
  52. package/dist/core/tools/pencilEraserBitMap.d.ts +66 -14
  53. package/dist/core/tools/text.d.ts +2 -1
  54. package/dist/core/types.d.ts +66 -1
  55. package/dist/core/utils/indexDB.d.ts +3 -3
  56. package/dist/core/vNodeManager.d.ts +7 -0
  57. package/dist/core/worker/base.d.ts +52 -7
  58. package/dist/core/worker/fullWorkerLocal.d.ts +10 -2
  59. package/dist/core/worker/fullWorkerService.d.ts +7 -3
  60. package/dist/core/worker/renderCapabilityProbe.d.ts +54 -0
  61. package/dist/core/worker/simpleWorker.d.ts +2 -2
  62. package/dist/core/worker/snapshotWork.d.ts +1 -0
  63. package/dist/core/worker/workerManager.d.ts +17 -4
  64. package/dist/displayer/floatBar/selectorGesture.d.ts +2 -0
  65. package/dist/fullWorker.js +138 -139
  66. package/dist/index-B44o9ggV.mjs +56070 -0
  67. package/dist/{index-D8p2ph99.mjs → index-BF310Wzc.mjs} +401 -263
  68. package/dist/index-BJOPyRJn.js +1 -0
  69. package/dist/index-BiqhUSZ0.js +570 -0
  70. package/dist/index-Cjaia8CY.mjs +4107 -0
  71. package/dist/index-Cu0f4kha.js +570 -0
  72. package/dist/index-DDd-30M7.js +1 -0
  73. package/dist/index-DdbAM7Xi.mjs +4106 -0
  74. package/dist/index-DhCFlEfW.mjs +56062 -0
  75. package/dist/index-mcBiJOLo.mjs +931 -0
  76. package/dist/index-o1TaWHww.js +1 -0
  77. package/dist/index-puxStU6w.js +1 -0
  78. package/dist/plugin/applianceMultiPlugin.d.ts +18 -3
  79. package/dist/plugin/applianceSinglePlugin.d.ts +18 -4
  80. package/dist/plugin/baseApplianceManager.d.ts +138 -12
  81. package/dist/plugin/baseViewContainerManager.d.ts +40 -3
  82. package/dist/plugin/bitmapEraserOptions.d.ts +7 -0
  83. package/dist/plugin/const.d.ts +4 -0
  84. package/dist/plugin/displayerView.d.ts +7 -7
  85. package/dist/plugin/initLogAggregator.d.ts +45 -0
  86. package/dist/plugin/multi/applianceMultiManager.d.ts +1 -0
  87. package/dist/plugin/multi/containerManager.d.ts +19 -1
  88. package/dist/plugin/pluginInstanceOwner.d.ts +1 -0
  89. package/dist/plugin/renderImageBitmapRetirement.d.ts +100 -0
  90. package/dist/plugin/renderRuntimeCache.d.ts +18 -0
  91. package/dist/plugin/renderSurface.d.ts +15 -0
  92. package/dist/plugin/renderingCompatibility.d.ts +21 -5
  93. package/dist/plugin/roomLifecycle.d.ts +12 -0
  94. package/dist/plugin/selectorApi.d.ts +8 -0
  95. package/dist/plugin/single/applianceSingleManager.d.ts +4 -0
  96. package/dist/plugin/types.d.ts +9 -16
  97. package/dist/plugin/utils.d.ts +8 -0
  98. package/dist/subWorker.js +136 -137
  99. package/dist/undo/index.d.ts +12 -3
  100. package/dist/undo/timing.d.ts +9 -4
  101. package/package.json +23 -8
  102. package/dist/index--wqREfHK.js +0 -570
  103. package/dist/index-B-tFucpi.mjs +0 -48995
  104. package/dist/index-BOx854fU.mjs +0 -3266
  105. package/dist/index-BpiBM5wZ.js +0 -1
  106. package/dist/index-ByjVgxJm.js +0 -1
  107. package/dist/index-CSVCH-SQ.mjs +0 -789
  108. package/dist/index-CfIWmlMn.js +0 -570
  109. package/dist/index-D6gXcNbF.js +0 -1
  110. package/dist/index-HAZlgByL.mjs +0 -48987
  111. package/dist/index-OZXjSPr1.js +0 -1
  112. package/dist/index-z7deO9Md.mjs +0 -3267
@@ -1,14 +1,14 @@
1
1
  import type EventEmitter2 from "eventemitter2";
2
2
  import { BaseCollectorReducerAction, DiffOneData } from "../collector";
3
3
  import { BaseApplianceManager } from "../plugin/baseApplianceManager";
4
- import { BaseNodeMapItem, IActiveToolsDataType, IActiveWorkDataType, ICameraOpt, IMainMessage, IRectType, IUpdateNodeOpt, IWorkerMessage, IqueryTask, IworkId, ViewWorkerOptions } from "./types";
4
+ import { BaseNodeMapItem, IActiveToolsDataType, IActiveWorkDataType, ICameraOpt, ICameraTaskError, IMainMessage, IRectType, IUpdateNodeOpt, IWorkerMessage, IqueryTask, IworkId, ViewWorkerOptions } from "./types";
5
5
  import { BaseSubWorkModuleProps, EmitEventType } from "../plugin/types";
6
6
  import type { ISVGMarkmapInformation, ISVGUrlInformation, IconifyInformation, ImageInformation, MarkmapId, _SetTrue } from "../plugin/types";
7
7
  import { MethodBuilderMain } from "./msgEvent";
8
8
  import { EToolsKey, EventWorkState } from "./enum";
9
9
  import { BaseShapeOptions } from "./tools";
10
10
  import { AppViewDisplayerManager, MainViewDisplayerManager } from "../plugin/baseViewContainerManager";
11
- import { UndoTickerSource } from "../undo/timing";
11
+ import { type PendingTickerSnapshot, UndoTickerSource } from "../undo/timing";
12
12
  export type UndoTickerForceEndRoute = {
13
13
  kind: "stop-event";
14
14
  } | {
@@ -18,6 +18,19 @@ export type UndoTickerForceEndRoute = {
18
18
  kind: "wait-owner";
19
19
  };
20
20
  export declare function getUndoTickerForceEndRoute(source: UndoTickerSource): UndoTickerForceEndRoute;
21
+ export type ForceDoneReason = "camera-update" | "dpr-update" | "scene-change" | "clean-scene" | "set-readonly" | "disconnect" | "destroy" | "view-destroy" | "render-runtime-fallback";
22
+ type ViewForceDoneAckBase = {
23
+ viewId: string;
24
+ scenePath: string;
25
+ reason: ForceDoneReason;
26
+ };
27
+ export type ViewForceDoneAck = ViewForceDoneAckBase & ({
28
+ status: "success";
29
+ } | {
30
+ status: "failed";
31
+ failureReason: string;
32
+ });
33
+ export type ViewStoragePolicy = "preserve-storage" | "delete-storage" | "storage-already-deleted";
21
34
  export declare abstract class MasterController {
22
35
  /** 异步同步时间间隔 */
23
36
  abstract readonly maxLastSyncTime: number;
@@ -92,13 +105,17 @@ export declare abstract class MasterController {
92
105
  /** 清空指定的view场景路径下的所有数据 */
93
106
  abstract clearViewScenePath(viewId: string, justLocal?: boolean, isFiter?: boolean): Promise<void>;
94
107
  abstract cancelLocalWorks(viewId: string, syncStorage?: boolean): void;
95
- abstract waitForLocalEventQueue(): Promise<void>;
108
+ abstract abortActiveLocalInput(viewId: string, workId?: string): boolean;
109
+ abstract waitForLocalEventQueue(viewId?: string): Promise<void>;
96
110
  abstract finishActiveContinuousMethods(viewId: string, scenePath: string): Promise<void>;
97
- abstract flushActiveTransactionBeforeOperation(viewId: string, scenePath: string, reason: "camera-update" | "scene-change" | "clean-scene"): Promise<void>;
111
+ abstract abortActiveContinuousMethods(viewId: string, workId?: string): boolean;
112
+ abstract forceDoneLocalWorks(viewId: string, scenePath: string, reason: ForceDoneReason): Promise<ViewForceDoneAck>;
113
+ abstract invalidateTransactionBarrier(viewId: string): void;
98
114
  /** 更新指定view场景路径下的相机参数 */
99
115
  abstract updateCamera(viewId: string, cameraOpt: ICameraOpt): void;
100
- abstract cameraUpdateDestroy(viewId: string): void;
116
+ abstract cameraUpdateDestroy(viewId: string, recoverMethod?: boolean): void;
101
117
  abstract waitForCameraUpdateEnd(viewId: string): Promise<void>;
118
+ abstract waitForViewLifecycleIdle(viewId: string): Promise<void>;
102
119
  abstract isViewBusy(viewId: string): boolean;
103
120
  abstract recoverAfterSceneChange(viewId: string): void;
104
121
  /** 创建一个新的viewWorker */
@@ -122,6 +139,7 @@ export declare abstract class MasterController {
122
139
  /** 修正绘制异常任务 */
123
140
  abstract checkDrawingWork(viewId: string): Promise<number[]>;
124
141
  }
142
+ export type ViewInitCompletionResult = "completed" | "timeout" | "stale";
125
143
  export declare class MasterControlForWorker extends MasterController {
126
144
  /** 异步同步时间间隔 */
127
145
  readonly maxLastSyncTime: number;
@@ -160,7 +178,9 @@ export declare class MasterControlForWorker extends MasterController {
160
178
  isFullWork: boolean;
161
179
  viewId: string;
162
180
  toolsType?: EToolsKey;
163
- opt?: BaseShapeOptions;
181
+ opt?: BaseShapeOptions & {
182
+ fullLayerDoingMaskMaxInputPoints?: number;
183
+ };
164
184
  undoTickerId?: number;
165
185
  scenePath?: string;
166
186
  }>;
@@ -168,26 +188,61 @@ export declare class MasterControlForWorker extends MasterController {
168
188
  /** 是否任务队列化参数 */
169
189
  private tasksqueue;
170
190
  private cameraUpdateStateByView;
191
+ private cameraClearReplayByView;
192
+ private cameraClearReplaySequence;
193
+ private cameraFailureSequenceByView;
171
194
  private cameraUpdateEndWaitersByView;
195
+ private viewLifecycleIdleWaitersByView;
172
196
  private cameraTaskSequenceByView;
197
+ private cameraRecoverySequence;
198
+ private pendingDprOwnerByView;
199
+ private dprUpdateSequence;
200
+ /** Camera/DPR preparation is serialized per View. */
201
+ private localWorkFinalizeQueueByView;
202
+ /** @deprecated Legacy test/host compatibility when the per-View map is absent. */
173
203
  private localWorkFinalizeQueue;
174
204
  private operationBarrierQueueByView;
205
+ private operationBarrierEpochByView;
206
+ private operationBarrierInvalidationWaitersByView;
175
207
  private readonly cancelledEraseTxnIds;
208
+ private cancelledEraseTxnOwners;
209
+ /** Tombstones for cancelled Pencil/Shape output that may return after Clear. */
210
+ private cancelledLocalWorkOwners?;
211
+ private fullLayerBitmapEraseTxns;
212
+ private fullLayerBitmapEraseTxnWaiters;
176
213
  /** end */
177
214
  private snapshotMap;
215
+ /** Request identities prevent a late Snapshot from resolving a new request for the same View/Scene. */
216
+ private snapshotRequestIdByViewScene;
178
217
  private boundingRectMap;
218
+ private boundingRectRequestIdByViewScene;
179
219
  private clearAllResolveMap;
180
220
  private localEventQueue;
221
+ /** Latest serialized local-event task for each View. */
222
+ private localEventQueueByView;
223
+ /** 0ms Done handoffs must be cancellable during destroy/re-init. */
224
+ private localDoneDispatchTimersByView;
181
225
  private localEventSequence;
226
+ /** Invalidates queued pointer events without changing the View runtime owner. */
227
+ private localInputEpochByView?;
228
+ /** Pins one epoch to every Start -> Doing -> Done pointer transaction. */
229
+ private localInputTransactionEpochByView?;
230
+ private localDoneWaitSequence;
182
231
  private queuedLocalEventCount;
183
232
  private activeLocalEvent?;
233
+ /** Done handoff waiters are View-scoped; one View must never settle another. */
234
+ private localDoneWaitByView;
235
+ private delayWorkStateToDoneResolveByView;
236
+ /** @deprecated Kept as a read/cleanup compatibility alias for older hosts. */
184
237
  private localDoneWait?;
238
+ /** @deprecated Kept as a read/cleanup compatibility alias for older hosts. */
185
239
  private delayWorkStateToDoneResolve?;
186
240
  private animationId;
187
241
  private tmpImageConfigMap;
188
242
  private mainThread?;
189
243
  private backgroundThreadManager?;
190
- private willSelectorWorkId?;
244
+ /** Pending auto-selection targets are isolated per View. */
245
+ private willSelectorWorkIdByView;
191
246
  private isLockSentEventCursor;
192
247
  private getVNodeInfoResolveMap;
193
248
  private refreshTextRenderResolveMap;
@@ -198,34 +253,87 @@ export declare class MasterControlForWorker extends MasterController {
198
253
  private serviceSyncReadyViews;
199
254
  private mainViewInitAckCallbacks;
200
255
  private readonly initAckedViewIds;
256
+ private viewInitAckTimeoutTimers;
257
+ private renderRuntimeCacheSavePromise?;
201
258
  private pendingTransportMessages;
202
259
  private isRenderTransportReady;
203
- private renderProbeResolve?;
204
- private renderProbeRequestId?;
205
- private renderProbeTimer?;
260
+ private renderRuntimeFallbackSequence;
261
+ private activeRenderRuntimeRecovery?;
262
+ private viewInitRecoveryAttempts;
263
+ private viewInitRecoveryDestroying;
264
+ private viewInitAckWaiters;
265
+ private serviceSyncCommitWaiters;
266
+ private viewServiceReadyWaiters;
267
+ private initReconcileTasks;
268
+ private serviceSyncSequence;
206
269
  private initGeneration;
207
270
  private viewGenerationById;
271
+ private fullLayerFrameStateByView;
272
+ private pendingDprByView;
273
+ private viewRecoveryQueueByView;
208
274
  /** Camera snapshot sent in the view Init message, used for the ACK-time check. */
209
275
  private initCameraOptByView;
210
276
  private markmapIdResolveMap;
277
+ private getDoneWaitForView;
278
+ private getDoneResolverForView;
279
+ private getLocalWorkFinalizeQueue;
280
+ private setLocalWorkFinalizeQueue;
281
+ private clearLocalWorkFinalizeQueue;
282
+ private clearDoneWaitForView;
211
283
  constructor(props: BaseSubWorkModuleProps);
212
284
  get isBezier(): boolean;
213
- get Logger(): import("..").Logger;
285
+ get Logger(): import("../plugin/utils").LoggerUtils;
286
+ private logRenderRuntimeFallback;
287
+ private logMainViewCameraTrace;
288
+ private closeImageBitmap;
289
+ private getViewSceneRequestKey;
290
+ private settleSnapshotFailure;
291
+ private settleBoundingRectFailure;
292
+ private settleViewRenderRequests;
214
293
  afterMainViewInitAck(callback: () => void): void;
215
294
  get isMainViewInitAck(): boolean;
216
295
  waitForMainViewInitAck(timeoutMs?: number): Promise<"ready" | "cancelled" | "timeout">;
217
296
  isViewInitAck(viewId: string): boolean;
218
297
  private ackMainViewInit;
298
+ private scheduleInitReconcile;
299
+ private isCurrentViewGeneration;
300
+ private reconcileViewInit;
301
+ private submitInitServiceSnapshot;
302
+ private waitForInitCameraCatchUp;
303
+ private waitForServiceSyncCommit;
304
+ private ackServiceSyncCommit;
305
+ private finalizeViewInitReady;
219
306
  private flushPendingTransportInitMessages;
220
307
  private getPendingInitMessageKey;
221
- private pullLatestServiceDataAfterInit;
308
+ private markServiceSyncReady;
309
+ private waitForViewInitAck;
310
+ private waitForViewServiceReady;
311
+ private armViewInitAckTimeout;
312
+ waitForViewInitCompletion(viewId: string): Promise<ViewInitCompletionResult>;
313
+ private failViewInitOnTerminalRuntime;
314
+ private settlePendingViewInitWaitersForRecovery;
315
+ private isViewScopedInitFailure;
316
+ private scheduleViewInitRecovery;
317
+ private scheduleRenderRuntimeFallback;
318
+ private isRenderRuntimeRecoveryCurrent;
319
+ private assertRenderRuntimeRecoveryCurrent;
320
+ private isRenderRuntimeRecoveryViewCurrent;
321
+ private finishRenderRuntimeRecovery;
322
+ private persistRecoveredRenderRuntime;
323
+ cancelRenderRuntimeRecovery(reason: string): void;
324
+ private runRenderRuntimeFallback;
325
+ private runActiveRenderRuntimeFallback;
326
+ private rebuildRenderRuntimeOnSerialQueue;
222
327
  private assertMarkmapRuntimeRegistered;
223
- destroy(preserveInitReady?: boolean): void;
328
+ destroy(preserveInitReady?: boolean, preserveCameraRecovery?: boolean): void;
329
+ private settlePendingMarkmapRequestsOnDestroy;
224
330
  private get consumeCount();
225
331
  private set consumeCount(value);
226
332
  private acceptConsumeAck;
227
333
  private get postCount();
228
334
  isServiceSyncReady(viewId: string): boolean;
335
+ isRenderRuntimeRecovering(): boolean;
336
+ private isViewInitReady;
229
337
  private set postCount(value);
230
338
  private get viewContainerManager();
231
339
  private get collector();
@@ -237,10 +345,21 @@ export declare class MasterControlForWorker extends MasterController {
237
345
  private get isPostCountType();
238
346
  private get isCanPostDraw();
239
347
  private get isCanStartEventConsum();
240
- init(): Promise<void>;
348
+ init(runtimeAlreadyDestroyed?: boolean): Promise<void>;
241
349
  private useBackgroundThread;
242
350
  private useMainThread;
243
- on(): Promise<boolean | void>;
351
+ private getRenderProbeCandidates;
352
+ private getRenderProbeProfile;
353
+ private createRenderProbeDOMCanvas;
354
+ private probeRenderRuntimeCandidate;
355
+ private createRenderProbeSession;
356
+ private closeRenderProbeSession;
357
+ private resolveRenderProbeEntry;
358
+ private requestRenderProbeCandidate;
359
+ private finalizeRenderProbeResponse;
360
+ private readTransferredCanvasDestinationPixels;
361
+ private probeAndLockRenderRuntime;
362
+ on(isProbeRetry?: boolean): Promise<boolean | void>;
244
363
  clearFontCache(): Promise<boolean>;
245
364
  getFontCacheStatus(): Promise<{
246
365
  count: number;
@@ -254,6 +373,22 @@ export declare class MasterControlForWorker extends MasterController {
254
373
  refreshTextRenderForWorker(tasks: Array<Pick<IWorkerMessage, "viewId" | "scenePath" | "workId" | "opt">>): Promise<boolean>;
255
374
  private buildPropertyAppliedData;
256
375
  clearReRenders(num?: number): void;
376
+ private retireRenderedImageBitmap;
377
+ private getFullLayerBitmapEraseTxns;
378
+ private getBitmapEraserRenderer;
379
+ private logBitmapEraserTrace;
380
+ private finishFullLayerBitmapEraseTxn;
381
+ private waitForFullLayerBitmapEraseTxns;
382
+ private rememberCancelledEraseTxn;
383
+ private isCancelledEraseResult;
384
+ private rememberCancelledLocalWork;
385
+ private isCancelledLocalWorkResult;
386
+ private isCancelledLocalWork;
387
+ private filterCancelledEraseRenders;
388
+ private reportRenderFrameError;
389
+ private acceptFullLayerFrame;
390
+ private acceptWorkerBatch;
391
+ private scheduleViewRecovery;
257
392
  get isBusy(): boolean;
258
393
  isViewBusy(viewId: string): boolean;
259
394
  getLockSentEventCursor(): boolean;
@@ -263,15 +398,25 @@ export declare class MasterControlForWorker extends MasterController {
263
398
  getFullWorkDrawCount(): number;
264
399
  getMaxDrawCount(): number;
265
400
  setSubWorkerDrawCount(num: number): void;
266
- setConsumeCount(num: number): void;
401
+ setConsumeCount(num: number, consumeWorkId?: string): void;
267
402
  getConsumeCount(): number;
403
+ /** 当前 View 本地事务已接收的原始输入点数。 */
404
+ getLocalInputPointCount(viewId: string, toolsType?: EToolsKey): number;
268
405
  setWorkerTasksqueueCount(num: number): void;
269
406
  collectorSyncData(sp: IMainMessage[]): void;
270
407
  private collectorAsyncData;
408
+ /**
409
+ * Storage mutations must carry the generation of the View runtime that
410
+ * produced them. UI-only reports remain compatible with older workers, but
411
+ * a missing generation on a mutation is rejected once the View is known.
412
+ */
413
+ private isStaleViewStorageMessage;
271
414
  private onLocalEventEnd;
272
415
  private onLocalEventDoing;
273
416
  private onLocalEventStart;
274
417
  private setLocalPointIsFullWork;
418
+ private getFullLayerBitmapEraserMaxInputPoints;
419
+ private forceDoneFullLayerBitmapEraseAtPointLimit;
275
420
  private pushLocalPoint;
276
421
  private deleteLocalPoint;
277
422
  private getLocalPointInfo;
@@ -283,7 +428,9 @@ export declare class MasterControlForWorker extends MasterController {
283
428
  isFullWork: boolean;
284
429
  viewId: string;
285
430
  toolsType?: EToolsKey;
286
- opt?: BaseShapeOptions;
431
+ opt?: BaseShapeOptions & {
432
+ fullLayerDoingMaskMaxInputPoints?: number;
433
+ };
287
434
  undoTickerId?: number;
288
435
  scenePath?: string;
289
436
  }>;
@@ -313,9 +460,18 @@ export declare class MasterControlForWorker extends MasterController {
313
460
  } | undefined;
314
461
  localDoneWait: {
315
462
  waitingMs: number;
463
+ token?: string;
316
464
  workIds: string[];
317
- startedAt: number;
465
+ viewId?: string;
466
+ startedAt?: number;
318
467
  } | undefined;
468
+ localDoneWaits: {
469
+ waitingMs: number;
470
+ token?: string;
471
+ workIds: string[];
472
+ viewId?: string;
473
+ startedAt?: number;
474
+ }[];
319
475
  hasDoneResolver: boolean;
320
476
  localPoints: {
321
477
  workId: IworkId;
@@ -335,24 +491,32 @@ export declare class MasterControlForWorker extends MasterController {
335
491
  isBusy: boolean;
336
492
  hasPending: boolean;
337
493
  hasPrepare: boolean;
494
+ isRecovering: boolean;
495
+ recoveryFromGeneration: number | undefined;
496
+ recoveryOwner: number | undefined;
497
+ hasReplayCamera: boolean;
338
498
  currentTaskId: number | undefined;
339
- lastAckTaskId: number | undefined;
499
+ transactionTaskId: number | undefined;
500
+ transactionGeneration: number | undefined;
501
+ coreAckReceived: boolean | undefined;
502
+ settledAckReceived: boolean | undefined;
340
503
  }[];
341
504
  operationBarrierViews: string[];
342
505
  clearBusyViews: string[];
343
- pendingTickers: import("../undo/timing").PendingTickerSnapshot[];
506
+ pendingTickers: PendingTickerSnapshot[];
344
507
  };
345
508
  private shouldUseAutoShape;
346
509
  private toAutoShapePoints;
347
- private logAutoShapeResult;
348
510
  private emitAutoShapeResult;
349
511
  private createAutoShapeTask;
350
512
  private mapAutoShapeFallback;
351
513
  private correctStorage;
352
514
  originalEventLintener(workState: EventWorkState, point: [number, number], viewId: string): Promise<void>;
353
- waitForLocalEventQueue(): Promise<void>;
515
+ waitForLocalEventQueue(viewId?: string): Promise<void>;
354
516
  finishActiveContinuousMethods(viewId: string, scenePath: string): Promise<void>;
355
- flushActiveTransactionBeforeOperation(viewId: string, scenePath: string, _reason: "camera-update" | "scene-change" | "clean-scene"): Promise<void>;
517
+ forceDoneLocalWorks(viewId: string, scenePath: string, reason: ForceDoneReason): Promise<ViewForceDoneAck>;
518
+ invalidateTransactionBarrier(viewId: string): void;
519
+ private waitForCurrentTransactionBarrier;
356
520
  private executeTransactionBarrier;
357
521
  private consumeOriginalEvent;
358
522
  getLocalWorkViewId(): string | undefined;
@@ -360,14 +524,18 @@ export declare class MasterControlForWorker extends MasterController {
360
524
  setCurrentToolsData(currentToolsData: IActiveToolsDataType): void;
361
525
  private prepareOnceWork;
362
526
  createViewWorker(viewId: string, options: ViewWorkerOptions, displayer: MainViewDisplayerManager | AppViewDisplayerManager): void;
363
- destroyViewWorker(viewId: string, isLocal?: boolean): void;
527
+ private discardViewTransactions;
528
+ destroyViewWorker(viewId: string, storagePolicy: ViewStoragePolicy, preserveCameraRecovery?: boolean): void;
364
529
  onServiceDerive(key: string, data: DiffOneData<BaseCollectorReducerAction | undefined>): void;
365
530
  pullServiceData(viewId: string, scenePath: string, options?: {
366
531
  isAsync?: boolean;
367
532
  useAnimation?: boolean;
368
533
  }): void;
534
+ private pullServiceDataForReadyRenderer;
369
535
  runAnimation(): void;
370
536
  consume(): void;
537
+ private armBitmapEraserCommitTimeout;
538
+ private markFullLayerBitmapEraseDoneStaging;
371
539
  unWritable(): void;
372
540
  abled(): void;
373
541
  isAbled(): boolean;
@@ -376,23 +544,59 @@ export declare class MasterControlForWorker extends MasterController {
376
544
  post(msg: Set<IWorkerMessage>): void;
377
545
  private dispatchMessages;
378
546
  updateNode(workId: IworkId, updateNodeOpt: IUpdateNodeOpt, viewId: string, scenePath: string): void;
379
- destroyTaskQueue(): void;
547
+ destroyTaskQueue(preserveCameraRecovery?: boolean): void;
380
548
  updateDpr(viewId: string, dpr: number): void;
549
+ private releasePendingDprUpdate;
550
+ private cancelPendingDprUpdate;
551
+ private applyDprUpdate;
552
+ private cloneCameraReplay;
553
+ private beginCameraClearReplay;
554
+ private finishCameraClearReplay;
555
+ private getCameraReplayCandidate;
556
+ private getActiveRenderRuntimeRecoveryView;
557
+ private nextCameraRecoveryOwner;
558
+ private updateCameraRecoveryReplay;
559
+ private beginCameraRecovery;
560
+ private releaseCameraRecovery;
561
+ private releaseRenderRuntimeRecoveryCameras;
562
+ private dispatchCameraRecoveryReplay;
381
563
  updateCamera(viewId: string, cameraOpt: ICameraOpt): void;
564
+ private updateCameraForReadyRenderer;
565
+ private schedulePendingCameraForView;
382
566
  private isSameCameraOpt;
383
567
  private enqueueCameraPreparation;
384
568
  private consumePendingCameraForView;
385
- private resetCameraTimeout;
386
- ackCameraTask(viewId: string, taskId: number): void;
387
- ackCameraSettledTask(viewId: string, taskId: number): void;
388
- cameraUpdateDestroy(viewId: string): void;
569
+ private clearCameraTaskTimeouts;
570
+ private startCameraTaskTimeouts;
571
+ private isCurrentCameraTransaction;
572
+ private completeCameraTransactionIfReady;
573
+ ackCameraTask(viewId: string, taskId: number, viewGeneration?: number): void;
574
+ failCameraTask(viewId: string, taskId: number, error: ICameraTaskError, viewGeneration?: number): void;
575
+ ackCameraSettledTask(viewId: string, taskId: number, viewGeneration?: number): void;
576
+ cameraUpdateDestroy(viewId: string, recoverMethod?: boolean): void;
577
+ private resolveCameraUpdateEndWaiters;
389
578
  waitForCameraUpdateEnd(viewId: string): Promise<void>;
390
- recoverAfterSceneChange(_viewId: string): void;
579
+ waitForViewLifecycleIdle(viewId: string): Promise<void>;
580
+ private hasPendingViewLifecycleWork;
581
+ private resolveViewLifecycleIdleWaiters;
582
+ recoverAfterSceneChange(viewId: string): void;
583
+ abortActiveContinuousMethods(viewId: string, workId?: string): boolean;
584
+ abortActiveLocalInput(viewId: string, workId?: string): boolean;
391
585
  clearViewScenePath(viewId: string, justLocal?: boolean | undefined, isFiter?: boolean): Promise<void>;
392
586
  private internalMsgEmitterListener;
393
587
  private setZIndex;
394
588
  checkDrawingWork(vId: string): Promise<number[]>;
395
- cancelLocalWorks(viewId: string, syncStorage?: boolean): void;
589
+ cancelLocalWorks(viewId: string, syncStorage?: boolean, onlyWorkIds?: ReadonlySet<string>): void;
590
+ timeoutLocalWorks(viewId: string, scenePath: string, reason: string, onlyWorkIds?: ReadonlySet<string>, error?: unknown): void;
591
+ /**
592
+ * Bitmap Done mutates the worker VNode/display tree before its Collector
593
+ * apply marker arrives. On a commit deadline, replay the captured
594
+ * before-images to both renderer and storage, then let the normal cancel
595
+ * path close the dynamic Undo scope. Compensation messages deliberately do
596
+ * not carry eraseTxnId, so the late Done tombstone cannot discard recovery.
597
+ */
598
+ private rollbackBitmapEraserTxn;
599
+ private logLocalWorkBarrierError;
396
600
  removeDrawingWork(vId: string): void;
397
601
  removeNodes(viewId: string, removeIds: string[]): void;
398
602
  hoverCursor(point: [number, number], viewId: string): void;
@@ -420,3 +624,4 @@ export declare class MasterControlForWorker extends MasterController {
420
624
  vInfo?: BaseNodeMapItem[];
421
625
  } | undefined>;
422
626
  }
627
+ export {};
@@ -7,6 +7,7 @@ import { EDataType } from "../enum";
7
7
  import { SubTopThread } from "./subTopThread";
8
8
  import { SubLocalThread } from "./subLocalThread";
9
9
  import { SubServiceThread } from "./subServiceThread";
10
+ import type { MainThreadRenderMode } from "../../plugin/renderingCompatibility";
10
11
  export type ICanvasOptionType = IOffscreenCanvasOptionType;
11
12
  export interface IMainThreadInitOption {
12
13
  container: HTMLDivElement;
@@ -14,6 +15,10 @@ export interface IMainThreadInitOption {
14
15
  layerOpt: ILayerOptionType;
15
16
  master: MasterControlForWorker;
16
17
  displayer: MainViewDisplayerManager | AppViewDisplayerManager;
18
+ /** Runtime identity used to reject continuations from a replaced View. */
19
+ viewOwner?: string;
20
+ viewGeneration?: number;
21
+ mainThreadRenderMode?: MainThreadRenderMode;
17
22
  post(sp: Omit<IBatchMainMessage, "render">): void;
18
23
  }
19
24
  export interface ISubThreadInitOption {
@@ -60,9 +65,15 @@ export declare class MainThreadEngineImpl implements MainThreadEngine {
60
65
  private taskUpdateCameraId?;
61
66
  private taskUpdateCameraResolve?;
62
67
  private debounceUpdateCameraId?;
68
+ private activeCameraSettledRender?;
69
+ private activeCameraTaskContext?;
63
70
  private debounceUpdateCache;
64
71
  private mainThreadPostId?;
65
72
  private destroyed;
73
+ private readbackScheduler?;
74
+ private readonly restoreLayerRenderCallbacks;
75
+ private readonly viewOwner?;
76
+ private readonly viewGeneration?;
66
77
  private combinePostMsg;
67
78
  private methodBuilder;
68
79
  private cacheImages;
@@ -72,12 +83,17 @@ export declare class MainThreadEngineImpl implements MainThreadEngine {
72
83
  getCachedImagesByWorkId(workId: string): HTMLImageElement | ImageBitmap | undefined;
73
84
  deleteCachedImagesByWorkId(workId: string): void;
74
85
  clearCacheImages(): void;
75
- clearImageResolveMap(): void;
86
+ private closeImageSource;
87
+ clearImageResolveMap(error?: unknown): void;
76
88
  post(msg: Omit<IBatchMainMessage, "render">): void;
89
+ reportRendererBusinessError(error: unknown, fallback: {
90
+ business: string;
91
+ stage: string;
92
+ }): void;
77
93
  updateDpr(dpr: number): void;
78
94
  on(msg: IWorkerMessage): Promise<void>;
79
95
  private getIconSize;
80
- loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId">): Promise<HTMLImageElement | ImageBitmap | undefined>;
96
+ loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "requestId">): Promise<HTMLImageElement | ImageBitmap | undefined>;
81
97
  private removeNode;
82
98
  consumeFull(type: EDataType, data: IWorkerMessage): Promise<void>;
83
99
  setCameraOpt(cameraOpt: ICameraOpt): void;
@@ -91,7 +107,12 @@ export declare class MainThreadEngineImpl implements MainThreadEngine {
91
107
  getSceneRect(): IRectType;
92
108
  private createScene;
93
109
  private createLayer;
110
+ private enableCanvas2DReadback;
111
+ private disableCanvas2DReadback;
94
112
  private updateScene;
95
113
  private updateLayer;
114
+ private cancelCameraSettledRender;
115
+ private retargetCameraSettledRender;
116
+ private cancelCameraBlockingWait;
96
117
  destroy(): void;
97
118
  }
@@ -0,0 +1,27 @@
1
+ type FrameHandle = number;
2
+ export type Canvas2DReadbackSchedulerOptions = {
3
+ tailFrameCount?: number;
4
+ requestFrame?: (callback: FrameRequestCallback) => FrameHandle;
5
+ cancelFrame?: (handle: FrameHandle) => void;
6
+ onReadbackError?: (error: unknown) => void;
7
+ };
8
+ /**
9
+ * Coalesces Canvas2D readbacks for one main-thread View. A render refreshes
10
+ * that Canvas' tail so continuous input performs at most one readback per RAF.
11
+ */
12
+ export declare class Canvas2DReadbackScheduler {
13
+ private readonly pendingFrames;
14
+ private readonly failedCanvases;
15
+ private readonly tailFrameCount;
16
+ private readonly requestFrame;
17
+ private readonly cancelFrame;
18
+ private readonly onReadbackError?;
19
+ private frameHandle?;
20
+ private destroyed;
21
+ constructor(options?: Canvas2DReadbackSchedulerOptions);
22
+ markRendered(canvas: HTMLCanvasElement): void;
23
+ destroy(): void;
24
+ private schedule;
25
+ private flushFrame;
26
+ }
27
+ export {};
@@ -8,19 +8,30 @@ export interface MainThreadManager {
8
8
  createMainThread(viewId: string, opt: IMainThreadInitOption): MainThreadEngineImpl;
9
9
  consume(msg: Set<IWorkerMessage>): Promise<void>;
10
10
  post(sp: Omit<IBatchMainMessage, "render">): void;
11
+ discardView(viewId: string): void;
11
12
  destroy(): void;
12
13
  }
13
14
  export declare class MainThreadManagerImpl implements MainThreadManager {
14
15
  mainThreadMap: Map<string, MainThreadEngineImpl>;
15
16
  private cameraRenderQueueByView;
16
17
  private viewGenerationById;
17
- private snapshotThread?;
18
+ private viewOwnerById;
19
+ private ownerSequence;
20
+ private snapshotThreadsByRequest;
21
+ private destroyed;
18
22
  master: MasterControlForWorker;
19
23
  constructor(master: MasterControlForWorker);
20
24
  private enqueueViewTask;
25
+ private isStaleViewMessage;
21
26
  post: (msg: Omit<IBatchMainMessage, "render">) => void;
27
+ discardView(viewId: string): void;
22
28
  destroy(): void;
23
29
  createMainThread(viewId: string, opt: IMainThreadInitOption): MainThreadEngineImpl;
24
30
  createSnapshotThread(viewId: string, opt: IMainThreadInitOption): SnapshotThreadImpl;
31
+ private getSnapshotRequestKey;
32
+ private disposeSnapshotThread;
33
+ private releaseMessageBitmap;
34
+ private releaseBatchResources;
35
+ private releaseImageBitmap;
25
36
  consume(msg: Set<IWorkerMessage>): Promise<void>;
26
37
  }
@@ -11,22 +11,30 @@ export declare class SnapshotThreadImpl {
11
11
  fullLayer: Group;
12
12
  master: MasterControlForWorker;
13
13
  private opt;
14
+ private readonly viewOwner?;
15
+ private readonly viewGeneration?;
14
16
  private scene;
15
17
  private mainThreadPostId?;
16
18
  private combinePostMsg;
19
+ private destroyed;
17
20
  workShapes: Map<string, BaseShapeTool>;
18
21
  private cacheImages;
19
22
  private imageResolveMap;
23
+ private activeRequest?;
20
24
  constructor(viewId: string, opt: IMainThreadInitOption);
21
25
  getCachedImages(imageSrc: string): HTMLImageElement | ImageBitmap | undefined;
22
26
  getCachedImagesByWorkId(workId: string): HTMLImageElement | ImageBitmap | undefined;
23
27
  deleteCachedImagesByWorkId(workId: string): void;
24
28
  clearCacheImages(): void;
29
+ private closeImageSource;
30
+ private releaseMessageImageBitmap;
31
+ private releaseBatchImageBitmaps;
25
32
  clearImageResolveMap(): void;
26
33
  post(msg: Omit<IBatchMainMessage, "render">): void;
34
+ private reportRequestFailure;
27
35
  on(msg: IWorkerMessage): Promise<void>;
28
36
  private getIconSize;
29
- loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId">): Promise<HTMLImageElement | ImageBitmap | undefined>;
37
+ loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "requestId">): Promise<HTMLImageElement | ImageBitmap | undefined>;
30
38
  createWorkShapeNode(opt: IActiveToolsDataType & {
31
39
  workId: string;
32
40
  }): TextShape | import("../tools").ArrowShape | import("../tools").PencilShape | import("../tools/straight").StraightShape | import("../tools").EllipseShape | import("../tools").PolygonShape | import("../tools").StarShape | import("../tools").RectangleShape | import("../tools").SpeechBalloonShape | import("../tools").LaserPenShape | import("../tools").EraserShape | import("../tools").BitMapEraserShape | import("../tools/pencilEraser").PencilEraserShape | import("../tools").SelectorShape | ImageShape | ISvgShadowShape | undefined;
@@ -39,11 +47,12 @@ export declare class SnapshotThreadImpl {
39
47
  private getBoundingRect;
40
48
  setCameraOpt(cameraOpt: ICameraOpt): void;
41
49
  private runBatchPostData;
50
+ private flushPendingPost;
42
51
  private combinePostData;
43
52
  combinePost(): void;
44
53
  private createScene;
45
54
  private createLayer;
46
55
  private updateScene;
47
56
  private updateLayer;
48
- destroy(): void;
57
+ destroy(reason?: string): void;
49
58
  }