@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
@@ -7,6 +7,7 @@ import type { SelectorShape } from "./tools";
7
7
  import type { Direction } from "re-resizable/lib/resizer";
8
8
  import type { ShapeOptType } from "../displayer/types";
9
9
  import type { AutoShapeResult } from "./autoShape/types";
10
+ import type { RenderProbeProfile, WorkerRenderCapabilities } from "./worker/renderCapabilityProbe";
10
11
  export type PickOne<T> = {
11
12
  [P in keyof T]: Record<P, T[P]> & Partial<Record<Exclude<keyof T, P>, undefined>>;
12
13
  }[keyof T];
@@ -27,7 +28,6 @@ export type ViewWorkerOptions = {
27
28
  export interface IBitmapEraserMaskOptions {
28
29
  singleChannelTexture: boolean;
29
30
  textureSubImage2D: boolean;
30
- imageBitmapDirtyRect: boolean;
31
31
  }
32
32
  export interface ICanvasSceneType {
33
33
  /** canvas 上下文 */
@@ -166,6 +166,13 @@ export type IWorkerMessage = Omit<Partial<BaseCollectorReducerAction>, "op"> & {
166
166
  bgCanvas: OffscreenCanvas;
167
167
  serviceCanvas: OffscreenCanvas;
168
168
  };
169
+ /** Temporary canvas used only by the SpriteJS initialization probe. */
170
+ probeCanvas?: OffscreenCanvas;
171
+ /** Frozen mainView render profile used by every TestScene candidate. */
172
+ probeProfile?: RenderProbeProfile;
173
+ /** Init reconcile service commit identity. */
174
+ serviceSyncId?: string;
175
+ serviceRevision?: number;
169
176
  /** 字体库 */
170
177
  fontBuffers?: {
171
178
  fontFamily: string;
@@ -188,6 +195,8 @@ export interface IRectType {
188
195
  }
189
196
  export interface IMainMessage extends INormalPushMsg {
190
197
  type: EPostMessageType;
198
+ serviceSyncId?: string;
199
+ serviceRevision?: number;
191
200
  /** Cursor point 生成时对应的稳定视觉工具名。 */
192
201
  cursorTool?: CursorToolName;
193
202
  dataType?: EDataType;
@@ -224,6 +233,8 @@ export interface IMainMessage extends INormalPushMsg {
224
233
  scaleType?: EScaleType;
225
234
  textOpt?: TextOptions;
226
235
  viewId?: string;
236
+ /** View lifecycle generation that produced this internal message. */
237
+ viewGeneration?: number;
227
238
  points?: [number, number][];
228
239
  isRefresh?: boolean;
229
240
  renderRect?: IRectType;
@@ -237,14 +248,47 @@ export interface IMainMessage extends INormalPushMsg {
237
248
  collectUndoTicker?: number;
238
249
  undoScopeIds?: string[];
239
250
  undoScopePhase?: "collect" | "finalize";
251
+ /** Bitmap Eraser target-application marker emitted after all target ops. */
252
+ eraseTxnPhase?: "applied" | "failed";
253
+ /** Internal Done result used to choose the terminal transaction marker. */
254
+ eraseTxnCommitStatus?: "applied" | "failed";
255
+ /** Bitmap Eraser transaction before-images used for timeout compensation. */
256
+ eraseTxnBeforeImages?: Map<string, BaseNodeMapItem>;
257
+ /** Internal renderer request business used to settle Snapshot waiters. */
258
+ reportBusiness?: "snapshot" | "bounding-box";
259
+ /** Structured renderer failure stage for request-scoped diagnostics. */
260
+ reportStage?: string;
261
+ reportError?: string;
262
+ /** Structured runtime failure code consumed by MainEngine recovery. */
263
+ reportErrorCode?: "WEBGL_PROGRAM_UNAVAILABLE" | "SERVICE_SYNC_COMMIT_TIMEOUT" | "IMAGE_BITMAP_RENDER_FAILED" | "INIT_CAMERA_CATCH_UP_FAILED" | "RENDER_INIT_TIMEOUT" | "CAMERA_TRANSPORT_TIMEOUT" | "RENDERER_RUNTIME_ERROR";
264
+ reportContextType?: ECanvasContextType;
265
+ reportContextLost?: boolean;
266
+ reportGlError?: number;
267
+ reportCurrentProgram?: boolean;
268
+ reportProgramLinked?: boolean;
269
+ reportProgramHasUniforms?: boolean;
240
270
  clearPreviewLocalWork?: boolean;
241
271
  autoShapeResult?: AutoShapeResult;
242
272
  [key: string]: any;
243
273
  }
244
274
  export interface IMainMessageRenderData {
245
275
  viewId: string;
276
+ /** Opaque View generation that produced this render. */
277
+ viewGeneration?: number;
278
+ /** BitMapEraser transaction owner, used to discard stale view renders. */
279
+ eraseTxnId?: string;
246
280
  rect?: IRectType;
247
281
  imageBitmap?: ImageBitmap;
282
+ /** Worker transferToImageBitmap output owns the complete Layer frame. */
283
+ isFullFrameImageBitmap?: boolean;
284
+ /** Monotonic sequence for FullLayer frames within one View generation. */
285
+ frameSequence?: number;
286
+ /** Worker combine-post task that produced this FullLayer frame. */
287
+ taskId?: number;
288
+ /** All local work owners represented by a coalesced Layer capture. */
289
+ renderWorkIds?: string[];
290
+ /** All erase transactions represented by a coalesced Layer capture. */
291
+ renderEraseTxnIds?: string[];
248
292
  isDrawAll?: boolean;
249
293
  drawCanvas?: ECanvasShowType;
250
294
  isClear?: boolean;
@@ -260,6 +304,16 @@ export interface IMainMessageRenderData {
260
304
  translate?: [number, number];
261
305
  workId?: string;
262
306
  }
307
+ export type CameraTaskStatus = "timeout" | "failed";
308
+ export interface ICameraTaskError {
309
+ code: "RENDERER_BUSINESS_TIMEOUT" | "RENDERER_BUSINESS_ERROR" | "CAMERA_TRANSPORT_TIMEOUT";
310
+ business: "updateCamera";
311
+ message: string;
312
+ elapsedMs?: number;
313
+ stage?: string;
314
+ blockingWorks?: string[];
315
+ workerType?: string;
316
+ }
263
317
  export interface IBatchMainMessage {
264
318
  /** 绘制数据 */
265
319
  render?: Array<IMainMessageRenderData>;
@@ -267,15 +321,26 @@ export interface IBatchMainMessage {
267
321
  sp?: Array<IMainMessage>;
268
322
  workerTasksqueueCount?: number;
269
323
  cameraTaskId?: number;
324
+ /** 缺省表示成功 ACK;timeout/failed 表示 Camera 业务失败终态。 */
325
+ cameraTaskStatus?: CameraTaskStatus;
326
+ cameraTaskError?: ICameraTaskError;
270
327
  /** Camera 防抖重渲染及最终 Layer render 已完成。 */
271
328
  cameraSettledTaskId?: number;
272
329
  workIds?: Set<string>;
273
330
  viewId?: string;
331
+ /** View lifecycle generation that produced this batch. */
332
+ viewGeneration?: number;
333
+ /** Opaque runtime owner for MainThread-originated asynchronous output. */
334
+ viewOwner?: string;
274
335
  consumeCount?: number;
275
336
  /** 标识限频 ACK 所属的本地 work,防止旧笔迹 ACK 污染新笔迹。 */
276
337
  consumeWorkId?: string;
277
338
  subWorkerDrawCount?: number;
278
339
  fullWorkerDrawCount?: number;
340
+ /** Worker-owned rendering capability probe response. */
341
+ type?: EPostMessageType;
342
+ requestId?: string;
343
+ workerCapabilities?: WorkerRenderCapabilities;
279
344
  }
280
345
  export interface ICameraOpt {
281
346
  centerX: number;
@@ -6,9 +6,9 @@ export declare class IndexDBUtils {
6
6
  private readonly FONT_DB_VERSION;
7
7
  private constructor();
8
8
  static getInstance(): IndexDBUtils;
9
- initFontDB(): Promise<IDBDatabase>;
10
- getFontFromDB(fontFamily: string, url?: string): Promise<ArrayBuffer | null>;
11
- saveFontToDB(fontFamily: string, url: string, buffer: ArrayBuffer): Promise<boolean>;
9
+ initFontDB(signal?: AbortSignal): Promise<IDBDatabase>;
10
+ getFontFromDB(fontFamily: string, url?: string, signal?: AbortSignal): Promise<ArrayBuffer | null>;
11
+ saveFontToDB(fontFamily: string, url: string, buffer: ArrayBuffer, signal?: AbortSignal): Promise<boolean>;
12
12
  clearFontCache(): Promise<boolean>;
13
13
  getFontCacheStatus(): Promise<{
14
14
  count: number;
@@ -3,6 +3,8 @@ import { BaseNodeMapItem, IRectType } from "./types";
3
3
  import { EToolsKey } from ".";
4
4
  import { _SetTrue } from "../plugin";
5
5
  import { ObserverMap } from "./utils/ObserverMap";
6
+ export type VNodeRevisionOperation = "add" | "delete" | "update" | "clear" | "permission";
7
+ export type VNodeRevisionObserver = (operation: VNodeRevisionOperation, revision: number, key?: string) => void;
6
8
  export declare class VNodeManager {
7
9
  viewId: string;
8
10
  scene: Scene;
@@ -15,9 +17,13 @@ export declare class VNodeManager {
15
17
  private readonly spatialIndex;
16
18
  private readonly spatialEntries;
17
19
  private verifySpatialIndex;
20
+ private revision;
21
+ private readonly revisionObservers;
18
22
  constructor(viewId: string, scene: Scene);
19
23
  init(fullLayer: Group): void;
20
24
  get(name: string): BaseNodeMapItem | undefined;
25
+ getRevision(): number;
26
+ observeRevision(observer: VNodeRevisionObserver): () => void;
21
27
  setLocalUid(uid: string): void;
22
28
  getLocalUid(): string | undefined;
23
29
  setSpatialIndexVerification(enabled: boolean): void;
@@ -36,6 +42,7 @@ export declare class VNodeManager {
36
42
  unSelected(name: string): void;
37
43
  delete(name: string): void;
38
44
  clear(): void;
45
+ private notifyRevisionObservers;
39
46
  getRectIntersectRange(rect: IRectType, filterLock?: boolean, filterEditor?: boolean): {
40
47
  rectRange: IRectType | undefined;
41
48
  nodeRange: Map<string, BaseNodeMapItem>;
@@ -1,4 +1,4 @@
1
- import { Group, Scene } from "spritejs";
1
+ import { Group, Layer, Scene } from "spritejs";
2
2
  import { IActiveToolsDataType, IActiveWorkDataType, IBatchMainMessage, ICameraOpt, ILayerOptionType, IOffscreenCanvasOptionType, IRectType, IWorkerMessage } from "../types";
3
3
  import { VNodeManager } from "../vNodeManager";
4
4
  import { type ECanvasContextType, ECanvasShowType, EDataType, EventWorkState } from "../enum";
@@ -8,10 +8,13 @@ import type { LocalWorkForFullWorker } from "./fullWorkerLocal";
8
8
  import type { LocalWorkForSubWorker } from "./subWorkerLocal";
9
9
  import { EWorkThreadType, type WorkThreadEngineForFullWorker, type WorkThreadEngineForSubWorker, type WorkThreadEngineForSimpleWorker } from "./workerManager";
10
10
  import { EmitEventType } from "../../plugin/types";
11
+ import { CameraUpdateTaskContext } from "../cameraTask";
12
+ import { type RendererBusinessTaskOptions } from "../rendererBusinessTask";
11
13
  import type { IBitmapEraserMaskOptions } from "../types";
12
14
  import { MaxDelayBatchScheduler, WorkerAckBackpressure } from "../batchScheduler";
13
15
  export interface IWorkerInitOption {
14
16
  dpr: number;
17
+ viewGeneration?: number;
15
18
  offscreenCanvasOpt: IOffscreenCanvasOptionType;
16
19
  layerOpt: ILayerOptionType;
17
20
  combineUnitTime?: number;
@@ -37,6 +40,7 @@ export interface ISubWorkerInitOption {
37
40
  }
38
41
  export declare abstract class WorkThreadEngineBase {
39
42
  readonly viewId: string;
43
+ readonly viewGeneration?: number;
40
44
  readonly type: EWorkThreadType;
41
45
  scene: Scene;
42
46
  fullLayer: Group;
@@ -48,7 +52,7 @@ export declare abstract class WorkThreadEngineBase {
48
52
  abstract localWork: LocalWorkForFullWorker | LocalWorkForSubWorker;
49
53
  abstract serviceWork?: ServiceWorkForFullWorker;
50
54
  protected isSafari: boolean;
51
- protected abstract _post: (msg: IBatchMainMessage) => void;
55
+ protected abstract _post: (msg: IBatchMainMessage, transfer?: Transferable[]) => void;
52
56
  combinePostMsg: Set<IBatchMainMessage>;
53
57
  protected workerTaskId?: number | undefined;
54
58
  protected protectedTask?: {
@@ -56,7 +60,17 @@ export declare abstract class WorkThreadEngineBase {
56
60
  workName: EmitEventType;
57
61
  workState: EventWorkState;
58
62
  };
59
- protected delayPostDoneResolve?: (bol: boolean) => void;
63
+ protected delayPostDoneWaiter?: {
64
+ promise: Promise<void>;
65
+ resolve: () => void;
66
+ reject: (error: unknown) => void;
67
+ reportFailureAtRendererBoundary: boolean;
68
+ };
69
+ private activePostDoneWaiter?;
70
+ private isCombiningPost;
71
+ private combinePostTaskSequence;
72
+ private activeCombinePostTaskId?;
73
+ private combinePostTransfersByTask;
60
74
  protected cacheImages: Map<string, {
61
75
  imageBitmap: ImageBitmap;
62
76
  workId: string;
@@ -64,22 +78,32 @@ export declare abstract class WorkThreadEngineBase {
64
78
  protected imageResolveMap: Map<string, {
65
79
  timer?: number;
66
80
  resolve?: (src: string) => void;
81
+ requestId?: string;
82
+ promise: Promise<string>;
67
83
  }>;
68
84
  protected taskUpdateCameraId?: number;
69
85
  protected taskUpdateCameraResolve?: (shouldRetry: boolean) => void;
70
86
  protected debounceUpdateCameraId?: number;
87
+ private activeCameraSettledRender?;
88
+ private activeCameraTaskContext?;
89
+ private destroyed;
90
+ private contextLossCleanup?;
71
91
  constructor(viewId: string, opt: IWorkerInitOption, workerType: EWorkThreadType);
92
+ getActualContextType(): ECanvasContextType | undefined;
93
+ private registerContextLossListener;
94
+ private removeContextLossListener;
72
95
  protected createRenderLayer(scene: Scene, opt: IWorkerInitOption): void;
73
96
  updateDpr(dpr: number): Promise<void>;
74
97
  getCachedImages(imageSrc: string): ImageBitmap | undefined;
75
98
  getCachedImagesByWorkId(workId: string): ImageBitmap | undefined;
76
99
  deleteCachedImagesByWorkId(workId: string, filter?: string): void;
77
100
  clearCacheImages(): void;
101
+ private closeImageBitmap;
78
102
  clearImageResolveMap(): void;
79
103
  setIsSafari(isSafari: boolean): void;
80
104
  on(msg: IWorkerMessage): Promise<void>;
81
105
  private getIconSize;
82
- loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker">): Promise<ImageBitmap | undefined>;
106
+ loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker" | "requestId">): Promise<ImageBitmap | undefined>;
83
107
  protected createLocalWork(data: IWorkerMessage): void;
84
108
  protected updateScene(scene: Scene, offscreenCanvasOpt: IOffscreenCanvasOptionType, targetLayer?: Group): void;
85
109
  protected updateLayer(layerOpt: ILayerOptionType, targetLayer?: Group): void;
@@ -90,16 +114,37 @@ export declare abstract class WorkThreadEngineBase {
90
114
  protected setToolsOpt(opt: IActiveToolsDataType): void;
91
115
  protected setWorkOpt(opt: Partial<IActiveWorkDataType>): void;
92
116
  protected destroy(): void;
93
- post(msg: IBatchMainMessage): Promise<void>;
117
+ protected cancelCameraSettledRender(): void;
118
+ protected retargetCameraSettledRender(cameraTaskId?: number): boolean;
119
+ protected hasCameraSettledRender(): boolean;
120
+ protected cancelCameraBlockingWait(): void;
121
+ protected startCameraSettledRender(cameraTaskId?: number, context?: CameraUpdateTaskContext): {
122
+ isActive: () => boolean;
123
+ getCameraTaskId: () => number | undefined;
124
+ setRenderLayers: (layers?: Layer[]) => void;
125
+ finish: () => void;
126
+ };
127
+ post(msg: IBatchMainMessage, options?: {
128
+ reportFailureAtRendererBoundary?: boolean;
129
+ }): Promise<void>;
130
+ private getOrCreatePostDoneWaiter;
94
131
  private runBatchPostData;
132
+ waitForRendererBusiness<T>(task: PromiseLike<T>, options: RendererBusinessTaskOptions): Promise<T>;
133
+ reportRendererBusinessError(error: unknown, fallback: Pick<RendererBusinessTaskOptions, "business" | "stage">, runtimeFatal?: boolean): void;
134
+ protected isCombinePostTaskActive(taskId: number): boolean;
135
+ protected trackCombinePostTransfer(taskId: number, transfer: Transferable): boolean;
136
+ protected commitCombinePostTransfers(taskId: number): void;
137
+ private releaseCombinePostTransfers;
138
+ protected closeCombinePostTransfers(transfers?: Transferable[]): void;
139
+ protected transferLayerToImageBitmap(drawCanvas: ECanvasShowType): ImageBitmap;
95
140
  protected combinePostData(): IBatchMainMessage;
96
141
  getSceneRect(): IRectType;
97
- abstract combinePost(): Promise<void>;
142
+ abstract combinePost(taskId: number): Promise<void>;
98
143
  protected abstract getLayer(workLayer: ECanvasShowType): Group | undefined;
99
144
  abstract setCameraOpt(cameraOpt: ICameraOpt): void;
100
145
  abstract consumeDraw(type: EDataType, data: IWorkerMessage): Promise<void>;
101
146
  abstract consumeDrawAll(type: EDataType, data: IWorkerMessage): Promise<void>;
102
- abstract updateCamera(msg: IWorkerMessage): Promise<void>;
147
+ abstract updateCamera(msg: IWorkerMessage, context?: CameraUpdateTaskContext): Promise<void>;
103
148
  }
104
149
  export declare abstract class LocalWork {
105
150
  readonly viewId: string;
@@ -12,10 +12,16 @@ export declare class LocalWorkForFullWorker extends LocalWork {
12
12
  protected combineTimerId?: number;
13
13
  protected combineDrawResolve?: (value: boolean) => void;
14
14
  protected combineDrawActiveId?: string;
15
+ private disposeVNodeRevisionObserver?;
16
+ private bitmapEraserRenderQueue;
17
+ private bitmapEraserRevalidationQueued;
18
+ /** Stop queued Bitmap Eraser work and restore Doing-time hidden nodes. */
19
+ abortBitmapEraser(workId: string): void;
15
20
  protected drawWorkActiveId?: string;
16
21
  protected effectSelectNodeData: Set<IWorkerMessage>;
17
22
  constructor(opt: ISubWorkerInitOption);
18
- loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker">): Promise<ImageBitmap | undefined>;
23
+ private scheduleActiveBitmapEraserRevalidation;
24
+ loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker" | "requestId">): Promise<ImageBitmap | undefined>;
19
25
  consumeDraw(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
20
26
  consumeDrawAll(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
21
27
  workShapesDone(scenePath: string, serviceWork: ServiceWorkForFullWorker): Promise<void>;
@@ -50,7 +56,9 @@ export declare class LocalWorkForFullWorker extends LocalWork {
50
56
  reRenderSelector(willSyncService?: boolean): Promise<void>;
51
57
  updateFullSelectWork(data: IWorkerMessage): Promise<void>;
52
58
  destroy(): void;
53
- protected drawEraserCombine(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number): Promise<void>;
59
+ protected enqueueBitmapEraserRender(workId: string, drawCount?: number, needUndoTicker?: number, collectUndoTicker?: number, ack?: Pick<IBatchMainMessage, "consumeCount" | "consumeWorkId">): Promise<void>;
60
+ protected drawPencilEraserCombine(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number): Promise<void>;
61
+ protected postEraserBatch(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number, ack?: Pick<IBatchMainMessage, "consumeCount" | "consumeWorkId">): Promise<void>;
54
62
  protected drawPencilCombine(workId: string, drawCount: number): Promise<void>;
55
63
  protected drawSelector(res: IMainMessage, workState: EventWorkState, isLockSentEventCursor?: boolean): Promise<void>;
56
64
  protected drawPencilFull(res: IMainMessage, isLockSentEventCursor?: boolean, needUndoTicker?: number, toolsType?: EToolsKey): Promise<void>;
@@ -21,6 +21,8 @@ export interface ServiceWork {
21
21
  runSelectWork(data: IWorkerMessage): void;
22
22
  consumeFull(data: IWorkerMessage): void;
23
23
  consumeDraw(data: IWorkerMessage): void;
24
+ flush(): Promise<void>;
25
+ clearAll(): void;
24
26
  destroy(): void;
25
27
  }
26
28
  export declare class ServiceWorkForFullWorker implements ServiceWork {
@@ -31,14 +33,15 @@ export declare class ServiceWorkForFullWorker implements ServiceWork {
31
33
  workShapes: Map<string, IServiceWorkItem>;
32
34
  selectorWorkShapes: Map<string, IServiceWorkItem>;
33
35
  thread: WorkThreadEngineForFullWorker;
34
- protected animationId?: number | undefined;
35
36
  protected willRunEffectSelectorIds: Set<string>;
36
- protected runEffectId?: number | undefined;
37
37
  protected noAnimationRect: IRectType | undefined;
38
38
  protected syncUnitTime: number;
39
39
  post: (msg: IBatchMainMessage) => Promise<void>;
40
+ private readonly animationScheduler;
41
+ private readonly effectScheduler;
40
42
  constructor(opt: ISubWorkerInitOption);
41
43
  destroy(): void;
44
+ clearAll(): void;
42
45
  consumeDraw(data: IWorkerMessage): Promise<void>;
43
46
  consumeFull(data: IWorkerMessage): void;
44
47
  runSelectWork(data: IWorkerMessage): void;
@@ -50,9 +53,10 @@ export declare class ServiceWorkForFullWorker implements ServiceWork {
50
53
  private activeWorkShape;
51
54
  private hasDiffData;
52
55
  protected animationDraw(): Promise<void>;
53
- protected runAnimation(): void;
56
+ protected runAnimation(immediate?: boolean): void;
54
57
  protected computNextAnimationIndex(workShape: IServiceWorkItem, pointUnit: number): number;
55
58
  protected runEffect(): void;
56
59
  private effectRunSelector;
60
+ flush(): Promise<void>;
57
61
  private activeSelectorShape;
58
62
  }
@@ -0,0 +1,54 @@
1
+ import { probeLayerRendering, probeLayerRenderingWithImageBitmap, type LayerRenderingProbePixelCheck, type LayerRenderingProbeResult } from "spritejs";
2
+ import type { ECanvasContextType } from "../enum";
3
+ export type WebGLProgramProbeResult = LayerRenderingProbeResult & {
4
+ /** Retained for compatibility with the former raw WebGL probe result. */
5
+ shaderInfoLog?: string;
6
+ /** Main-thread verification after the Worker ImageBitmap is drawn. */
7
+ destinationPixelChecks?: LayerRenderingProbePixelCheck[];
8
+ };
9
+ export type WebGLProgramProbeStage = LayerRenderingProbeResult["stage"];
10
+ export type WorkerRenderCapabilities = {
11
+ offscreenCanvas: boolean;
12
+ offscreen2d: boolean;
13
+ webgl2: boolean;
14
+ webgl: boolean;
15
+ contextSupported: boolean;
16
+ /** Kept for compatibility; now contains the real SpriteJS Layer probe result. */
17
+ programProbe?: WebGLProgramProbeResult;
18
+ };
19
+ export type RenderProbeProfile = {
20
+ width: number;
21
+ height: number;
22
+ dpr: number;
23
+ testRect: {
24
+ x: number;
25
+ y: number;
26
+ width: number;
27
+ height: number;
28
+ };
29
+ };
30
+ export type WebGLRuntimeDiagnostics = {
31
+ contextLost?: boolean;
32
+ glError?: number;
33
+ currentProgram?: boolean;
34
+ programLinked?: boolean;
35
+ programHasUniforms?: boolean;
36
+ };
37
+ type LayerProbe = typeof probeLayerRendering;
38
+ type ImageBitmapLayerProbe = typeof probeLayerRenderingWithImageBitmap;
39
+ export type RenderLayerRuntime = {
40
+ gl?: WebGLRenderingContext | WebGL2RenderingContext | null;
41
+ renderer?: {
42
+ glRenderer?: unknown;
43
+ isWebGL2?: boolean;
44
+ };
45
+ canvas?: EventTarget;
46
+ };
47
+ export declare function resolveWorkerRenderContextType(canUseWebGL: boolean, requestedContextType?: ECanvasContextType): ECanvasContextType;
48
+ export declare function inspectWebGLRuntime(gl: WebGLRenderingContext | WebGL2RenderingContext | null | undefined): WebGLRuntimeDiagnostics;
49
+ export declare function getActualLayerContextType(layer: RenderLayerRuntime | null | undefined): ECanvasContextType | undefined;
50
+ export declare function listenForRenderContextLoss(layer: RenderLayerRuntime | null | undefined, onContextLoss: (diagnostics: WebGLRuntimeDiagnostics, event: Event) => void): () => void;
51
+ export declare function probeWorkerRenderCapabilities(requestedContextType: ECanvasContextType | undefined, transferredCanvas?: OffscreenCanvas, profile?: RenderProbeProfile, runLayerProbe?: LayerProbe): WorkerRenderCapabilities;
52
+ export declare function probeWorkerImageBitmapRenderCapabilities(requestedContextType: ECanvasContextType | undefined, profile?: RenderProbeProfile, runLayerProbe?: ImageBitmapLayerProbe): Promise<WorkerRenderCapabilities>;
53
+ export declare function releaseWorkerRenderCapabilities(capabilities: WorkerRenderCapabilities | undefined): boolean;
54
+ export {};
@@ -1,4 +1,4 @@
1
- import { EventWorkState, IActiveToolsDataType, IMainMessage, IMainMessageRenderData, IWorkerMessage } from "../index";
1
+ import { EventWorkState, IActiveToolsDataType, IBatchMainMessage, IMainMessage, IMainMessageRenderData, IWorkerMessage } from "../index";
2
2
  import { ISubWorkerInitOption } from "./base";
3
3
  import { LocalWorkForFullWorker } from "./fullWorkerLocal";
4
4
  import { ServiceWorkForFullWorker } from "./fullWorkerService";
@@ -16,7 +16,7 @@ export declare class LocalWorkForSimpleWorker extends LocalWorkForFullWorker {
16
16
  protected drawPencil(res: IMainMessage, workId?: string): Promise<void>;
17
17
  protected drawShape(res: IMainMessage): Promise<void>;
18
18
  protected drawSelector(res: IMainMessage, workState: EventWorkState, isLockSentEventCursor?: boolean, render?: IMainMessageRenderData[]): Promise<void>;
19
- protected drawEraserCombine(workId: string): Promise<void>;
19
+ protected postEraserBatch(workId: string, _drawCount: number, _needUndoTicker?: number, _collectUndoTicker?: number, ack?: Pick<IBatchMainMessage, "consumeCount" | "consumeWorkId">): Promise<void>;
20
20
  consumeDraw(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
21
21
  consumeDrawAll(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
22
22
  }
@@ -12,6 +12,7 @@ export declare class SnapshotWork extends LocalWork {
12
12
  protected cameraOpt: ICameraOpt | undefined;
13
13
  vNodes?: VNodeManager;
14
14
  constructor(opt: ISnapshotWorkInitOption);
15
+ private reportRequestFailure;
15
16
  createSnapshotFullLayer(sceneOpt: IWorkerInitOption, opt: ILayerOptionType): void;
16
17
  destroySnapshotFullLayer(): void;
17
18
  private updateScene;
@@ -9,10 +9,12 @@ import { LocalWorkForSubWorker } from "./subWorkerLocal";
9
9
  import { TopLayerWorkForSubWorker } from "./subWorkerTopLayer";
10
10
  import { LocalWorkForSimpleWorker, ServiceWorkForSimpleWorker } from "./simpleWorker";
11
11
  import { SnapshotWork } from "./snapshotWork";
12
+ import type { CameraUpdateTaskContext } from "../cameraTask";
12
13
  export declare enum EWorkThreadType {
13
14
  Full = "full",
14
15
  Sub = "sub"
15
16
  }
17
+ export declare function prepareImageBitmapRenderData(render: IMainMessageRenderData[], scene: Scene, dpr: number): IMainMessageRenderData[];
16
18
  export type WorkerEngineFactory<T extends WorkThreadEngineBase> = (value: IWorkerMessage, post: (msg: IBatchMainMessage, transfer?: Transferable[]) => void) => T | undefined;
17
19
  export declare class WorkerManager<T extends WorkThreadEngineBase> {
18
20
  readonly _self: Worker;
@@ -22,10 +24,19 @@ export declare class WorkerManager<T extends WorkThreadEngineBase> {
22
24
  protected workThreadMap: Map<string, T>;
23
25
  private cameraRenderQueueByView;
24
26
  private viewGenerationById;
27
+ private retainedOffscreenProbeCapabilities?;
28
+ private readonly cancelledFontFaceRequests;
29
+ private readonly fontFaceRequestCancelers;
25
30
  constructor(worker: Worker, type: EWorkThreadType, createEngine: WorkerEngineFactory<T>);
31
+ private consumeRendererBusinessFailure;
26
32
  private enqueueViewTask;
33
+ private isStaleViewMessage;
27
34
  private init;
28
35
  private getFontFaceCssValue;
36
+ private isFontFaceRequestCancelled;
37
+ private cancelFontFaceRequest;
38
+ private clearFontFaceRequestCancellation;
39
+ private waitForFontFacePromise;
29
40
  private setFontFaces;
30
41
  private isFontAvailable;
31
42
  private areFontFacesAvailable;
@@ -41,8 +52,9 @@ export declare class WorkThreadEngineForSubWorker extends WorkThreadEngineBase {
41
52
  localWork: LocalWorkForSubWorker;
42
53
  topLayerWork?: TopLayerWorkForSubWorker;
43
54
  snapshotWork: SnapshotWork;
55
+ private fullLayerFrameSequence;
44
56
  constructor(viewId: string, opt: IWorkerInitOption, _post: (msg: IBatchMainMessage, transfer?: Transferable[]) => void);
45
- combinePost(): Promise<void>;
57
+ combinePost(taskId: number): Promise<void>;
46
58
  on(msg: IWorkerMessage): Promise<void>;
47
59
  protected createLocalWork(data: IWorkerMessage): void;
48
60
  removeNode(data: IWorkerMessage): Promise<void>;
@@ -54,7 +66,7 @@ export declare class WorkThreadEngineForSubWorker extends WorkThreadEngineBase {
54
66
  private getRectImageBitmap;
55
67
  protected updateLayer(layerOpt: ILayerOptionType): void;
56
68
  updateDpr(dpr: number): Promise<void>;
57
- updateCamera(msg: IWorkerMessage): Promise<void>;
69
+ updateCamera(msg: IWorkerMessage, context?: CameraUpdateTaskContext): Promise<void>;
58
70
  setCameraOpt(cameraOpt: ICameraOpt, layer?: Group): void;
59
71
  }
60
72
  /** full worker */
@@ -67,8 +79,9 @@ export declare class WorkThreadEngineForFullWorker extends WorkThreadEngineBase
67
79
  serviceWork: ServiceWorkForFullWorker;
68
80
  _post: (msg: IBatchMainMessage, transfer?: Transferable[] | undefined) => void;
69
81
  private debounceUpdateCache;
82
+ private fullLayerFrameSequence;
70
83
  constructor(viewId: string, opt: IWorkerInitOption, _post: (msg: IBatchMainMessage, transfer?: Transferable[]) => void);
71
- combinePost(): Promise<void>;
84
+ combinePost(taskId: number): Promise<void>;
72
85
  on(msg: IWorkerMessage): Promise<void>;
73
86
  removeNode(data: IWorkerMessage): Promise<void>;
74
87
  checkTextActive(data: IWorkerMessage): Promise<void>;
@@ -81,7 +94,7 @@ export declare class WorkThreadEngineForFullWorker extends WorkThreadEngineBase
81
94
  consumeDraw(type: EDataType, data: IWorkerMessage): Promise<void>;
82
95
  consumeDrawAll(type: EDataType, data: IWorkerMessage): Promise<void>;
83
96
  updateDpr(dpr: number): Promise<void>;
84
- updateCamera(msg: IWorkerMessage): Promise<void>;
97
+ updateCamera(msg: IWorkerMessage, context?: CameraUpdateTaskContext): Promise<void>;
85
98
  protected getRectImageBitmap(renderData: Required<Pick<IMainMessageRenderData, "rect" | "drawCanvas">>): Promise<ImageBitmap>;
86
99
  private cursorHover;
87
100
  private cursorBlur;
@@ -0,0 +1,2 @@
1
+ import type { ApplianceViewManagerLike } from "../../plugin/types";
2
+ export declare function canAcceptSelectorGesture(mananger?: ApplianceViewManagerLike): mananger is ApplianceViewManagerLike;