@netless/appliance-plugin 1.1.42-beta.3 → 1.1.43-beta.0

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 +24 -1
  3. package/dist/appliance-plugin.js +1 -1
  4. package/dist/appliance-plugin.mjs +33 -30
  5. package/dist/{bridge-8P473Gy8.js → bridge-D68E09T9.js} +1 -1
  6. package/dist/{bridge-DKyR7grt.mjs → bridge-DcVN05tP.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 +5 -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 +230 -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 +12 -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 +62 -14
  53. package/dist/core/tools/text.d.ts +2 -1
  54. package/dist/core/types.d.ts +64 -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 +8 -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-BNHPCii1.mjs +4089 -0
  67. package/dist/index-B_vZ9d3x.mjs +55912 -0
  68. package/dist/index-C2AHqjj8.js +570 -0
  69. package/dist/index-CV8YaU3F.mjs +931 -0
  70. package/dist/index-CWDWQZBs.mjs +4088 -0
  71. package/dist/index-DChI1--R.js +1 -0
  72. package/dist/index-DFo0Gmfx.js +570 -0
  73. package/dist/index-DiLPVPwQ.js +1 -0
  74. package/dist/index-GBYM7kT5.js +1 -0
  75. package/dist/index-GZUDLXJC.js +1 -0
  76. package/dist/{index-C9wx0zmg.mjs → index-K_0NX6pD.mjs} +401 -263
  77. package/dist/index-NG5kKK1W.mjs +55920 -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 +9 -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 +11 -14
  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-BCvU2uMB.js +0 -570
  103. package/dist/index-BXnpbc6O.mjs +0 -48995
  104. package/dist/index-BrWufZZe.js +0 -1
  105. package/dist/index-BubEu09-.js +0 -1
  106. package/dist/index-C1ph7d6H.mjs +0 -789
  107. package/dist/index-CAXJpQEp.js +0 -570
  108. package/dist/index-D0bfakdd.js +0 -1
  109. package/dist/index-DcS9JJvi.mjs +0 -3266
  110. package/dist/index-Zu5juuhI.js +0 -1
  111. package/dist/index-k0AjJn1s.mjs +0 -48987
  112. package/dist/index-vWLQ-o4q.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,45 @@ 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
+ /** Internal renderer request business used to settle Snapshot waiters. */
256
+ reportBusiness?: "snapshot" | "bounding-box";
257
+ /** Structured renderer failure stage for request-scoped diagnostics. */
258
+ reportStage?: string;
259
+ reportError?: string;
260
+ /** Structured runtime failure code consumed by MainEngine recovery. */
261
+ 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";
262
+ reportContextType?: ECanvasContextType;
263
+ reportContextLost?: boolean;
264
+ reportGlError?: number;
265
+ reportCurrentProgram?: boolean;
266
+ reportProgramLinked?: boolean;
267
+ reportProgramHasUniforms?: boolean;
240
268
  clearPreviewLocalWork?: boolean;
241
269
  autoShapeResult?: AutoShapeResult;
242
270
  [key: string]: any;
243
271
  }
244
272
  export interface IMainMessageRenderData {
245
273
  viewId: string;
274
+ /** Opaque View generation that produced this render. */
275
+ viewGeneration?: number;
276
+ /** BitMapEraser transaction owner, used to discard stale view renders. */
277
+ eraseTxnId?: string;
246
278
  rect?: IRectType;
247
279
  imageBitmap?: ImageBitmap;
280
+ /** Worker transferToImageBitmap output owns the complete Layer frame. */
281
+ isFullFrameImageBitmap?: boolean;
282
+ /** Monotonic sequence for FullLayer frames within one View generation. */
283
+ frameSequence?: number;
284
+ /** Worker combine-post task that produced this FullLayer frame. */
285
+ taskId?: number;
286
+ /** All local work owners represented by a coalesced Layer capture. */
287
+ renderWorkIds?: string[];
288
+ /** All erase transactions represented by a coalesced Layer capture. */
289
+ renderEraseTxnIds?: string[];
248
290
  isDrawAll?: boolean;
249
291
  drawCanvas?: ECanvasShowType;
250
292
  isClear?: boolean;
@@ -260,6 +302,16 @@ export interface IMainMessageRenderData {
260
302
  translate?: [number, number];
261
303
  workId?: string;
262
304
  }
305
+ export type CameraTaskStatus = "timeout" | "failed";
306
+ export interface ICameraTaskError {
307
+ code: "RENDERER_BUSINESS_TIMEOUT" | "RENDERER_BUSINESS_ERROR" | "CAMERA_TRANSPORT_TIMEOUT";
308
+ business: "updateCamera";
309
+ message: string;
310
+ elapsedMs?: number;
311
+ stage?: string;
312
+ blockingWorks?: string[];
313
+ workerType?: string;
314
+ }
263
315
  export interface IBatchMainMessage {
264
316
  /** 绘制数据 */
265
317
  render?: Array<IMainMessageRenderData>;
@@ -267,15 +319,26 @@ export interface IBatchMainMessage {
267
319
  sp?: Array<IMainMessage>;
268
320
  workerTasksqueueCount?: number;
269
321
  cameraTaskId?: number;
322
+ /** 缺省表示成功 ACK;timeout/failed 表示 Camera 业务失败终态。 */
323
+ cameraTaskStatus?: CameraTaskStatus;
324
+ cameraTaskError?: ICameraTaskError;
270
325
  /** Camera 防抖重渲染及最终 Layer render 已完成。 */
271
326
  cameraSettledTaskId?: number;
272
327
  workIds?: Set<string>;
273
328
  viewId?: string;
329
+ /** View lifecycle generation that produced this batch. */
330
+ viewGeneration?: number;
331
+ /** Opaque runtime owner for MainThread-originated asynchronous output. */
332
+ viewOwner?: string;
274
333
  consumeCount?: number;
275
334
  /** 标识限频 ACK 所属的本地 work,防止旧笔迹 ACK 污染新笔迹。 */
276
335
  consumeWorkId?: string;
277
336
  subWorkerDrawCount?: number;
278
337
  fullWorkerDrawCount?: number;
338
+ /** Worker-owned rendering capability probe response. */
339
+ type?: EPostMessageType;
340
+ requestId?: string;
341
+ workerCapabilities?: WorkerRenderCapabilities;
279
342
  }
280
343
  export interface ICameraOpt {
281
344
  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,14 @@ 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;
15
18
  protected drawWorkActiveId?: string;
16
19
  protected effectSelectNodeData: Set<IWorkerMessage>;
17
20
  constructor(opt: ISubWorkerInitOption);
18
- loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker">): Promise<ImageBitmap | undefined>;
21
+ private scheduleActiveBitmapEraserRevalidation;
22
+ loadImageBitMap(msg: Pick<IWorkerMessage, "toolsType" | "opt" | "workId" | "isSubWorker" | "requestId">): Promise<ImageBitmap | undefined>;
19
23
  consumeDraw(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
20
24
  consumeDrawAll(data: IWorkerMessage, serviceWork: ServiceWorkForFullWorker): Promise<void>;
21
25
  workShapesDone(scenePath: string, serviceWork: ServiceWorkForFullWorker): Promise<void>;
@@ -50,7 +54,9 @@ export declare class LocalWorkForFullWorker extends LocalWork {
50
54
  reRenderSelector(willSyncService?: boolean): Promise<void>;
51
55
  updateFullSelectWork(data: IWorkerMessage): Promise<void>;
52
56
  destroy(): void;
53
- protected drawEraserCombine(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number): Promise<void>;
57
+ protected enqueueBitmapEraserRender(workId: string, drawCount?: number, needUndoTicker?: number, collectUndoTicker?: number, ack?: Pick<IBatchMainMessage, "consumeCount" | "consumeWorkId">): Promise<void>;
58
+ protected drawPencilEraserCombine(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number): Promise<void>;
59
+ protected postEraserBatch(workId: string, drawCount: number, needUndoTicker?: number, collectUndoTicker?: number, ack?: Pick<IBatchMainMessage, "consumeCount" | "consumeWorkId">): Promise<void>;
54
60
  protected drawPencilCombine(workId: string, drawCount: number): Promise<void>;
55
61
  protected drawSelector(res: IMainMessage, workState: EventWorkState, isLockSentEventCursor?: boolean): Promise<void>;
56
62
  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;