@visactor/vrender-core 1.1.0-alpha.24 → 1.1.0-alpha.25

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 (322) hide show
  1. package/cjs/allocator/bounds-allocate.js +1 -2
  2. package/cjs/canvas/constants.js +2 -1
  3. package/cjs/common/bezier-utils.js +1 -2
  4. package/cjs/common/event-transformer.js +2 -1
  5. package/cjs/common/performance-raf.js +1 -2
  6. package/cjs/common/polygon.js +2 -2
  7. package/cjs/common/rect-utils.js +1 -1
  8. package/cjs/common/render-area.js +1 -1
  9. package/cjs/common/render-command-list.js +1 -1
  10. package/cjs/common/render-curve.js +1 -1
  11. package/cjs/common/render-utils.js +1 -1
  12. package/cjs/common/seg-context.js +1 -1
  13. package/cjs/container.d.ts +2 -0
  14. package/cjs/container.js +50 -0
  15. package/cjs/container.js.map +1 -0
  16. package/cjs/core/application.js +1 -1
  17. package/cjs/core/camera.js +1 -1
  18. package/cjs/core/constants.js +1 -1
  19. package/cjs/core/core-modules.js +1 -1
  20. package/cjs/core/global-module.js +2 -0
  21. package/cjs/core/global.js +1 -1
  22. package/cjs/core/graphic-utils.js +1 -1
  23. package/cjs/core/index.js +1 -1
  24. package/cjs/core/layer-service.js +2 -1
  25. package/cjs/core/layer.js +1 -1
  26. package/cjs/core/light.js +1 -1
  27. package/cjs/core/stage.d.ts +0 -9
  28. package/cjs/core/stage.js +12 -30
  29. package/cjs/core/stage.js.map +1 -1
  30. package/cjs/core/window.js +1 -1
  31. package/cjs/entries/miniapp.d.ts +0 -1
  32. package/cjs/entries/miniapp.js +1 -5
  33. package/cjs/entries/miniapp.js.map +1 -1
  34. package/cjs/entries/node.d.ts +0 -1
  35. package/cjs/entries/node.js +1 -5
  36. package/cjs/entries/node.js.map +1 -1
  37. package/cjs/env.d.ts +1 -0
  38. package/cjs/env.js +25 -0
  39. package/cjs/env.js.map +1 -0
  40. package/cjs/event/public-constant.d.ts +7 -0
  41. package/cjs/event/public-constant.js +100 -0
  42. package/cjs/event/public-constant.js.map +1 -0
  43. package/cjs/event/util.d.ts +1 -1
  44. package/cjs/graphic/base.d.ts +2 -0
  45. package/cjs/graphic/base.js +15 -0
  46. package/cjs/graphic/base.js.map +1 -0
  47. package/cjs/graphic/creator.d.ts +16 -0
  48. package/cjs/graphic/creator.js +160 -0
  49. package/cjs/graphic/creator.js.map +1 -0
  50. package/cjs/graphic/glyph.js +4 -8
  51. package/cjs/graphic/glyph.js.map +1 -1
  52. package/cjs/graphic/graphic.d.ts +19 -29
  53. package/cjs/graphic/graphic.js +121 -199
  54. package/cjs/graphic/graphic.js.map +1 -1
  55. package/cjs/graphic/group.d.ts +1 -3
  56. package/cjs/graphic/group.js +22 -28
  57. package/cjs/graphic/group.js.map +1 -1
  58. package/cjs/graphic/modules.d.ts +16 -0
  59. package/cjs/graphic/modules.js +150 -0
  60. package/cjs/graphic/modules.js.map +1 -0
  61. package/cjs/graphic/node-tree.d.ts +3 -3
  62. package/cjs/graphic/node-tree.js +1 -0
  63. package/cjs/graphic/node-tree.js.map +1 -1
  64. package/cjs/graphic/state/shared-state-refresh.js +11 -32
  65. package/cjs/graphic/state/shared-state-refresh.js.map +1 -1
  66. package/cjs/graphic/state/shared-state-scope.d.ts +2 -5
  67. package/cjs/graphic/state/shared-state-scope.js +8 -27
  68. package/cjs/graphic/state/shared-state-scope.js.map +1 -1
  69. package/cjs/graphic/state/state-definition-compiler.js +4 -5
  70. package/cjs/graphic/state/state-definition-compiler.js.map +1 -1
  71. package/cjs/graphic/state/state-definition.d.ts +2 -5
  72. package/cjs/graphic/state/state-definition.js.map +1 -1
  73. package/cjs/graphic/state/state-engine.d.ts +0 -5
  74. package/cjs/graphic/state/state-engine.js +20 -70
  75. package/cjs/graphic/state/state-engine.js.map +1 -1
  76. package/cjs/graphic/state/state-transition-orchestrator.d.ts +7 -9
  77. package/cjs/graphic/state/state-transition-orchestrator.js +10 -13
  78. package/cjs/graphic/state/state-transition-orchestrator.js.map +1 -1
  79. package/cjs/interface/graphic/group.d.ts +0 -2
  80. package/cjs/interface/graphic/group.js.map +1 -1
  81. package/cjs/interface/graphic.d.ts +1 -5
  82. package/cjs/interface/graphic.js.map +1 -1
  83. package/cjs/interface/index.js.map +1 -1
  84. package/cjs/interface/node-tree.d.ts +3 -0
  85. package/cjs/interface/node-tree.js.map +1 -1
  86. package/cjs/interface/stage.d.ts +0 -7
  87. package/cjs/interface/stage.js.map +1 -1
  88. package/cjs/interpolate.d.ts +2 -0
  89. package/cjs/interpolate.js +34 -0
  90. package/cjs/interpolate.js.map +1 -0
  91. package/cjs/modules.js.map +1 -1
  92. package/cjs/path.d.ts +4 -0
  93. package/cjs/path.js +33 -0
  94. package/cjs/path.js.map +1 -0
  95. package/cjs/plugin/3d.d.ts +3 -0
  96. package/cjs/plugin/3d.js +33 -0
  97. package/cjs/plugin/3d.js.map +1 -0
  98. package/cjs/plugin/attribute.d.ts +2 -0
  99. package/cjs/plugin/attribute.js +24 -0
  100. package/cjs/plugin/attribute.js.map +1 -0
  101. package/cjs/plugin/flex-layout.d.ts +1 -0
  102. package/cjs/plugin/flex-layout.js +15 -0
  103. package/cjs/plugin/flex-layout.js.map +1 -0
  104. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js +8 -8
  105. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  106. package/cjs/plugins/index.d.ts +0 -4
  107. package/cjs/plugins/index.js +1 -3
  108. package/cjs/plugins/index.js.map +1 -1
  109. package/cjs/plugins/plugin-service.d.ts +0 -1
  110. package/cjs/plugins/plugin-service.js +2 -3
  111. package/cjs/plugins/plugin-service.js.map +1 -1
  112. package/cjs/plugins/types.d.ts +1 -8
  113. package/cjs/plugins/types.js.map +1 -1
  114. package/cjs/register/graphic.d.ts +19 -0
  115. package/cjs/register/graphic.js +177 -0
  116. package/cjs/register/graphic.js.map +1 -0
  117. package/cjs/registry/contribution-registry.d.ts +0 -1
  118. package/cjs/registry/contribution-registry.js +0 -3
  119. package/cjs/registry/contribution-registry.js.map +1 -1
  120. package/cjs/registry/picker-registry.d.ts +0 -1
  121. package/cjs/registry/picker-registry.js +0 -3
  122. package/cjs/registry/picker-registry.js.map +1 -1
  123. package/cjs/registry/renderer-registry.d.ts +0 -1
  124. package/cjs/registry/renderer-registry.js +0 -3
  125. package/cjs/registry/renderer-registry.js.map +1 -1
  126. package/cjs/registry/types.d.ts +0 -3
  127. package/cjs/registry/types.js.map +1 -1
  128. package/cjs/svg.d.ts +1 -0
  129. package/cjs/svg.js +15 -0
  130. package/cjs/svg.js.map +1 -0
  131. package/cjs/text.d.ts +2 -0
  132. package/cjs/text.js +29 -0
  133. package/cjs/text.js.map +1 -0
  134. package/dist/index.es.js +279 -1591
  135. package/es/allocator/bounds-allocate.js +1 -2
  136. package/es/canvas/constants.js +2 -1
  137. package/es/common/bezier-utils.js +1 -2
  138. package/es/common/event-transformer.js +2 -1
  139. package/es/common/performance-raf.js +1 -2
  140. package/es/common/polygon.js +1 -1
  141. package/es/common/rect-utils.js +1 -1
  142. package/es/common/render-area.js +1 -1
  143. package/es/common/render-command-list.js +1 -1
  144. package/es/common/render-curve.js +1 -1
  145. package/es/common/render-utils.js +1 -1
  146. package/es/common/seg-context.js +1 -1
  147. package/es/container.d.ts +2 -0
  148. package/es/container.js +2 -0
  149. package/es/container.js.map +1 -0
  150. package/es/core/application.js +1 -1
  151. package/es/core/camera.js +1 -1
  152. package/es/core/constants.js +1 -1
  153. package/es/core/core-modules.js +1 -1
  154. package/es/core/global-module.js +2 -0
  155. package/es/core/global.js +1 -1
  156. package/es/core/graphic-utils.js +1 -1
  157. package/es/core/index.js +1 -1
  158. package/es/core/layer-service.js +2 -1
  159. package/es/core/layer.js +1 -1
  160. package/es/core/light.js +1 -1
  161. package/es/core/stage.d.ts +0 -9
  162. package/es/core/stage.js +10 -31
  163. package/es/core/stage.js.map +1 -1
  164. package/es/core/window.js +1 -1
  165. package/es/entries/miniapp.d.ts +0 -1
  166. package/es/entries/miniapp.js +1 -5
  167. package/es/entries/miniapp.js.map +1 -1
  168. package/es/entries/node.d.ts +0 -1
  169. package/es/entries/node.js +1 -5
  170. package/es/entries/node.js.map +1 -1
  171. package/es/env.d.ts +1 -0
  172. package/es/env.js +2 -0
  173. package/es/env.js.map +1 -0
  174. package/es/event/public-constant.d.ts +7 -0
  175. package/es/event/public-constant.js +12 -0
  176. package/es/event/public-constant.js.map +1 -0
  177. package/es/event/util.d.ts +1 -1
  178. package/es/graphic/base.d.ts +2 -0
  179. package/es/graphic/base.js +2 -0
  180. package/es/graphic/base.js.map +1 -0
  181. package/es/graphic/creator.d.ts +16 -0
  182. package/es/graphic/creator.js +32 -0
  183. package/es/graphic/creator.js.map +1 -0
  184. package/es/graphic/glyph.js +4 -8
  185. package/es/graphic/glyph.js.map +1 -1
  186. package/es/graphic/graphic.d.ts +19 -29
  187. package/es/graphic/graphic.js +120 -204
  188. package/es/graphic/graphic.js.map +1 -1
  189. package/es/graphic/group.d.ts +1 -3
  190. package/es/graphic/group.js +22 -28
  191. package/es/graphic/group.js.map +1 -1
  192. package/es/graphic/modules.d.ts +16 -0
  193. package/es/graphic/modules.js +32 -0
  194. package/es/graphic/modules.js.map +1 -0
  195. package/es/graphic/node-tree.d.ts +3 -3
  196. package/es/graphic/node-tree.js +1 -0
  197. package/es/graphic/node-tree.js.map +1 -1
  198. package/es/graphic/state/shared-state-refresh.js +8 -28
  199. package/es/graphic/state/shared-state-refresh.js.map +1 -1
  200. package/es/graphic/state/shared-state-scope.d.ts +2 -5
  201. package/es/graphic/state/shared-state-scope.js +7 -28
  202. package/es/graphic/state/shared-state-scope.js.map +1 -1
  203. package/es/graphic/state/state-definition-compiler.js +4 -5
  204. package/es/graphic/state/state-definition-compiler.js.map +1 -1
  205. package/es/graphic/state/state-definition.d.ts +2 -5
  206. package/es/graphic/state/state-definition.js.map +1 -1
  207. package/es/graphic/state/state-engine.d.ts +0 -5
  208. package/es/graphic/state/state-engine.js +17 -67
  209. package/es/graphic/state/state-engine.js.map +1 -1
  210. package/es/graphic/state/state-transition-orchestrator.d.ts +7 -9
  211. package/es/graphic/state/state-transition-orchestrator.js +10 -13
  212. package/es/graphic/state/state-transition-orchestrator.js.map +1 -1
  213. package/es/interface/graphic/group.d.ts +0 -2
  214. package/es/interface/graphic/group.js.map +1 -1
  215. package/es/interface/graphic.d.ts +1 -5
  216. package/es/interface/graphic.js.map +1 -1
  217. package/es/interface/index.js.map +1 -1
  218. package/es/interface/node-tree.d.ts +3 -0
  219. package/es/interface/node-tree.js.map +1 -1
  220. package/es/interface/stage.d.ts +0 -7
  221. package/es/interface/stage.js.map +1 -1
  222. package/es/interpolate.d.ts +2 -0
  223. package/es/interpolate.js +4 -0
  224. package/es/interpolate.js.map +1 -0
  225. package/es/modules.js.map +1 -1
  226. package/es/path.d.ts +4 -0
  227. package/es/path.js +6 -0
  228. package/es/path.js.map +1 -0
  229. package/es/plugin/3d.d.ts +3 -0
  230. package/es/plugin/3d.js +6 -0
  231. package/es/plugin/3d.js.map +1 -0
  232. package/es/plugin/attribute.d.ts +2 -0
  233. package/es/plugin/attribute.js +4 -0
  234. package/es/plugin/attribute.js.map +1 -0
  235. package/es/plugin/flex-layout.d.ts +1 -0
  236. package/es/plugin/flex-layout.js +2 -0
  237. package/es/plugin/flex-layout.js.map +1 -0
  238. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js +8 -8
  239. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  240. package/es/plugins/index.d.ts +0 -4
  241. package/es/plugins/index.js +0 -8
  242. package/es/plugins/index.js.map +1 -1
  243. package/es/plugins/plugin-service.d.ts +0 -1
  244. package/es/plugins/plugin-service.js +2 -3
  245. package/es/plugins/plugin-service.js.map +1 -1
  246. package/es/plugins/types.d.ts +1 -8
  247. package/es/plugins/types.js.map +1 -1
  248. package/es/register/graphic.d.ts +19 -0
  249. package/es/register/graphic.js +38 -0
  250. package/es/register/graphic.js.map +1 -0
  251. package/es/registry/contribution-registry.d.ts +0 -1
  252. package/es/registry/contribution-registry.js +0 -3
  253. package/es/registry/contribution-registry.js.map +1 -1
  254. package/es/registry/picker-registry.d.ts +0 -1
  255. package/es/registry/picker-registry.js +0 -3
  256. package/es/registry/picker-registry.js.map +1 -1
  257. package/es/registry/renderer-registry.d.ts +0 -1
  258. package/es/registry/renderer-registry.js +0 -3
  259. package/es/registry/renderer-registry.js.map +1 -1
  260. package/es/registry/types.d.ts +0 -3
  261. package/es/registry/types.js.map +1 -1
  262. package/es/svg.d.ts +1 -0
  263. package/es/svg.js +2 -0
  264. package/es/svg.js.map +1 -0
  265. package/es/text.d.ts +2 -0
  266. package/es/text.js +4 -0
  267. package/es/text.js.map +1 -0
  268. package/package.json +247 -3
  269. package/cjs/graphic/state/state-batch-scheduler.d.ts +0 -42
  270. package/cjs/graphic/state/state-batch-scheduler.js +0 -285
  271. package/cjs/graphic/state/state-batch-scheduler.js.map +0 -1
  272. package/cjs/graphic/state/state-model.d.ts +0 -43
  273. package/cjs/graphic/state/state-model.js +0 -143
  274. package/cjs/graphic/state/state-model.js.map +0 -1
  275. package/cjs/graphic/state/state-perf-monitor.d.ts +0 -120
  276. package/cjs/graphic/state/state-perf-monitor.js +0 -224
  277. package/cjs/graphic/state/state-perf-monitor.js.map +0 -1
  278. package/cjs/graphic/state/state-style-resolver.d.ts +0 -13
  279. package/cjs/graphic/state/state-style-resolver.js +0 -50
  280. package/cjs/graphic/state/state-style-resolver.js.map +0 -1
  281. package/cjs/interface/animate.d.ts +0 -1
  282. package/cjs/interface/animate.js +0 -3
  283. package/cjs/interface/animate.js.map +0 -1
  284. package/cjs/plugins/base-plugin.d.ts +0 -8
  285. package/cjs/plugins/base-plugin.js +0 -15
  286. package/cjs/plugins/base-plugin.js.map +0 -1
  287. package/cjs/plugins/browser-env-plugin.d.ts +0 -8
  288. package/cjs/plugins/browser-env-plugin.js +0 -24
  289. package/cjs/plugins/browser-env-plugin.js.map +0 -1
  290. package/cjs/plugins/picker-plugin.d.ts +0 -7
  291. package/cjs/plugins/picker-plugin.js +0 -19
  292. package/cjs/plugins/picker-plugin.js.map +0 -1
  293. package/cjs/plugins/renderer-plugin.d.ts +0 -7
  294. package/cjs/plugins/renderer-plugin.js +0 -19
  295. package/cjs/plugins/renderer-plugin.js.map +0 -1
  296. package/es/graphic/state/state-batch-scheduler.d.ts +0 -42
  297. package/es/graphic/state/state-batch-scheduler.js +0 -278
  298. package/es/graphic/state/state-batch-scheduler.js.map +0 -1
  299. package/es/graphic/state/state-model.d.ts +0 -43
  300. package/es/graphic/state/state-model.js +0 -135
  301. package/es/graphic/state/state-model.js.map +0 -1
  302. package/es/graphic/state/state-perf-monitor.d.ts +0 -120
  303. package/es/graphic/state/state-perf-monitor.js +0 -214
  304. package/es/graphic/state/state-perf-monitor.js.map +0 -1
  305. package/es/graphic/state/state-style-resolver.d.ts +0 -13
  306. package/es/graphic/state/state-style-resolver.js +0 -42
  307. package/es/graphic/state/state-style-resolver.js.map +0 -1
  308. package/es/interface/animate.d.ts +0 -1
  309. package/es/interface/animate.js +0 -3
  310. package/es/interface/animate.js.map +0 -1
  311. package/es/plugins/base-plugin.d.ts +0 -8
  312. package/es/plugins/base-plugin.js +0 -7
  313. package/es/plugins/base-plugin.js.map +0 -1
  314. package/es/plugins/browser-env-plugin.d.ts +0 -8
  315. package/es/plugins/browser-env-plugin.js +0 -16
  316. package/es/plugins/browser-env-plugin.js.map +0 -1
  317. package/es/plugins/picker-plugin.d.ts +0 -7
  318. package/es/plugins/picker-plugin.js +0 -11
  319. package/es/plugins/picker-plugin.js.map +0 -1
  320. package/es/plugins/renderer-plugin.d.ts +0 -7
  321. package/es/plugins/renderer-plugin.js +0 -11
  322. package/es/plugins/renderer-plugin.js.map +0 -1
@@ -1,278 +0,0 @@
1
- var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
2
- return new (P || (P = Promise))((function(resolve, reject) {
3
- function fulfilled(value) {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- }
10
- function rejected(value) {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- }
17
- function step(result) {
18
- var value;
19
- result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P((function(resolve) {
20
- resolve(value);
21
- }))).then(fulfilled, rejected);
22
- }
23
- step((generator = generator.apply(thisArg, _arguments || [])).next());
24
- }));
25
- };
26
-
27
- import { UpdateCategory, classifyAffectedKeys } from "./attribute-update-classifier";
28
-
29
- import { fingerprintDeferredStateConfig, normalizeDeferredStateConfig, normalizeDeferredStateOwnerConfig } from "./state-perf-monitor";
30
-
31
- function isRenderableGraphic(graphic) {
32
- return !!graphic.stage && "released" !== graphic.releaseStatus;
33
- }
34
-
35
- function createTargetStatesKey(targetStates) {
36
- return targetStates.length ? targetStates.join("|") : "__clear__";
37
- }
38
-
39
- function createIntentKey(contextOwnerId, configFingerprint, targetStatesKey) {
40
- return `${contextOwnerId}:${configFingerprint}:${targetStatesKey}`;
41
- }
42
-
43
- function hasMeaningfulDeferredConfig(config) {
44
- const normalized = normalizeDeferredStateOwnerConfig(config);
45
- return !!normalized && (null != normalized.localEnabled || null != normalized.deferred);
46
- }
47
-
48
- function getGraphicCompiledDefinitions(graphic) {
49
- const graphicAny = graphic;
50
- if ("function" == typeof graphicAny.resolveEffectiveCompiledDefinitions) {
51
- const result = graphicAny.resolveEffectiveCompiledDefinitions();
52
- return {
53
- compiledDefinitions: result.compiledDefinitions,
54
- stateProxyEligibility: result.stateProxyEligibility
55
- };
56
- }
57
- return {};
58
- }
59
-
60
- function getCurrentStateNames(graphic) {
61
- var _a, _b;
62
- return null !== (_b = null === (_a = graphic.currentStates) || void 0 === _a ? void 0 : _a.slice()) && void 0 !== _b ? _b : [];
63
- }
64
-
65
- export class StateBatchScheduler {
66
- constructor(stage, perfMonitor) {
67
- this.stage = stage, this.perfMonitor = perfMonitor, this.jobsByIntentKey = new Map,
68
- this.pendingIntentByGraphic = new Map, this.nextJobId = 1, this.runningJobs = new Map;
69
- }
70
- schedule(graphics, targetStates) {
71
- const batchOperation = graphics.length > 1;
72
- graphics.forEach((graphic => {
73
- const eligibility = this.resolveEligibility(graphic, targetStates, batchOperation, !0);
74
- if ("reason" in eligibility) return this.removeGraphicFromPending(graphic), void ("graphic_unavailable" !== eligibility.reason && this.commitSynchronously(graphic, targetStates));
75
- this.enqueueDeferredIntent(graphic, targetStates, eligibility.context, eligibility.targetStatesKey);
76
- }));
77
- }
78
- release() {
79
- var _a;
80
- this.jobsByIntentKey.forEach((job => {
81
- job.status = "cancelled";
82
- })), this.jobsByIntentKey.clear(), this.pendingIntentByGraphic.clear(), this.runningJobs.clear(),
83
- null === (_a = this.perfMonitor) || void 0 === _a || _a.updateBatchPending(0);
84
- }
85
- resolveEligibility(graphic, targetStates, batchOperation, recordObservability) {
86
- var _a, _b, _c, _d, _e, _f;
87
- if (!isRenderableGraphic(graphic)) return recordObservability && (null === (_a = this.perfMonitor) || void 0 === _a || _a.recordDeferredIneligible("graphic_unavailable")),
88
- {
89
- eligible: !1,
90
- reason: "graphic_unavailable"
91
- };
92
- if (!batchOperation) return recordObservability && (null === (_b = this.perfMonitor) || void 0 === _b || _b.recordDeferredIneligible("non_batch_operation")),
93
- {
94
- eligible: !1,
95
- reason: "non_batch_operation"
96
- };
97
- const context = this.resolveDeferredContext(graphic);
98
- if (!context) return recordObservability && (null === (_c = this.perfMonitor) || void 0 === _c || _c.recordDeferredIneligible("graphic_unavailable")),
99
- {
100
- eligible: !1,
101
- reason: "graphic_unavailable"
102
- };
103
- if (!context.config.enabled) {
104
- const normalizedOwnerConfig = normalizeDeferredStateOwnerConfig(context.contextOwner.deferredStateConfig), reason = !1 === (null == normalizedOwnerConfig ? void 0 : normalizedOwnerConfig.localEnabled) ? "context_disabled" : "config_disabled";
105
- return recordObservability && (null === (_d = this.perfMonitor) || void 0 === _d || _d.recordDeferredIneligible(reason)),
106
- {
107
- eligible: !1,
108
- reason: reason
109
- };
110
- }
111
- const classification = this.classifyGraphicTargetStates(graphic, targetStates);
112
- return classification.reason ? (recordObservability && (null === (_e = this.perfMonitor) || void 0 === _e || _e.recordDeferredIneligible(classification.reason)),
113
- {
114
- eligible: !1,
115
- reason: classification.reason
116
- }) : classification.category !== UpdateCategory.PAINT ? (recordObservability && (null === (_f = this.perfMonitor) || void 0 === _f || _f.recordDeferredIneligible("mixed_update_category")),
117
- {
118
- eligible: !1,
119
- reason: "mixed_update_category"
120
- }) : {
121
- eligible: !0,
122
- context: context,
123
- targetStatesKey: createTargetStatesKey(targetStates)
124
- };
125
- }
126
- resolveDeferredContext(graphic) {
127
- var _a;
128
- const stage = graphic.stage;
129
- if (!stage) return;
130
- let owner = stage, config = normalizeDeferredStateConfig(void 0);
131
- const ownerConfigs = [ stage ], parents = [];
132
- let parent = graphic.parent;
133
- for (;parent && parent !== stage; ) parents.push(parent), parent = parent.parent;
134
- parents.reverse().forEach((current => ownerConfigs.push(current))), ownerConfigs.forEach((current => {
135
- const deferredStateConfig = normalizeDeferredStateOwnerConfig(current.deferredStateConfig);
136
- deferredStateConfig && (deferredStateConfig.deferred && (config = Object.assign(Object.assign({}, config), deferredStateConfig.deferred)),
137
- null != deferredStateConfig.localEnabled && (config.enabled = deferredStateConfig.localEnabled),
138
- hasMeaningfulDeferredConfig(current.deferredStateConfig) && (owner = current));
139
- }));
140
- const normalized = normalizeDeferredStateConfig(config);
141
- return {
142
- contextOwner: owner,
143
- contextOwnerId: null !== (_a = owner._uid) && void 0 !== _a ? _a : 0,
144
- config: normalized,
145
- configFingerprint: fingerprintDeferredStateConfig(normalized)
146
- };
147
- }
148
- classifyGraphicTargetStates(graphic, targetStates) {
149
- const {compiledDefinitions: compiledDefinitions, stateProxyEligibility: stateProxyEligibility} = getGraphicCompiledDefinitions(graphic), candidateStates = Array.from(new Set([ ...getCurrentStateNames(graphic), ...targetStates ]));
150
- let category = UpdateCategory.NONE;
151
- return candidateStates.forEach((stateName => {
152
- if (null == stateProxyEligibility ? void 0 : stateProxyEligibility(stateName)) return void (category = UpdateCategory.NONE);
153
- const definition = null == compiledDefinitions ? void 0 : compiledDefinitions.get(stateName);
154
- definition && (definition.hasResolver && 0 === definition.affectedKeys.size ? category = UpdateCategory.NONE : category |= classifyAffectedKeys(definition.affectedKeys));
155
- })), candidateStates.some((stateName => null == stateProxyEligibility ? void 0 : stateProxyEligibility(stateName))) || candidateStates.some((stateName => {
156
- const definition = null == compiledDefinitions ? void 0 : compiledDefinitions.get(stateName);
157
- return !!(null == definition ? void 0 : definition.hasResolver) && 0 === definition.affectedKeys.size;
158
- })) ? {
159
- category: UpdateCategory.NONE,
160
- reason: "resolver_unstable_keys"
161
- } : {
162
- category: category === UpdateCategory.NONE ? UpdateCategory.PAINT : category
163
- };
164
- }
165
- enqueueDeferredIntent(graphic, targetStates, context, targetStatesKey) {
166
- var _a, _b, _c, _d, _e, _f;
167
- const nextIntentKey = createIntentKey(context.contextOwnerId, context.configFingerprint, targetStatesKey), prevIntentKey = this.pendingIntentByGraphic.get(graphic);
168
- if (prevIntentKey === nextIntentKey) return void (null === (_a = this.perfMonitor) || void 0 === _a || _a.incrementCounter("deferredJobsCoalesced"));
169
- prevIntentKey && this.removeGraphicFromIntentJob(graphic, prevIntentKey);
170
- let job = this.jobsByIntentKey.get(nextIntentKey);
171
- job ? null === (_d = this.perfMonitor) || void 0 === _d || _d.incrementCounter("deferredJobsCoalesced") : (job = {
172
- id: this.nextJobId++,
173
- kind: "apply_states",
174
- intentKey: nextIntentKey,
175
- status: "pending",
176
- targetStates: [ ...targetStates ],
177
- targetStatesKey: targetStatesKey,
178
- pendingGraphics: new Set,
179
- orderedGraphics: [],
180
- config: context.config,
181
- contextOwner: context.contextOwner,
182
- contextOwnerId: context.contextOwnerId,
183
- configFingerprint: context.configFingerprint,
184
- createdAt: Date.now(),
185
- processedCount: 0
186
- }, this.jobsByIntentKey.set(nextIntentKey, job), null === (_b = this.perfMonitor) || void 0 === _b || _b.incrementCounter("deferredJobsCreated"),
187
- null === (_c = this.perfMonitor) || void 0 === _c || _c.updateBatchPending(this.jobsByIntentKey.size)),
188
- job.pendingGraphics.has(graphic) || (job.pendingGraphics.add(graphic), job.orderedGraphics.push(graphic),
189
- this.pendingIntentByGraphic.set(graphic, nextIntentKey), null === (_e = this.perfMonitor) || void 0 === _e || _e.recordAllocation("batchEntriesCreated"),
190
- null === (_f = this.perfMonitor) || void 0 === _f || _f.updateMaxGraphicsInJob(job.pendingGraphics.size)),
191
- this.ensureJobRunning(job);
192
- }
193
- removeGraphicFromPending(graphic) {
194
- const prevIntentKey = this.pendingIntentByGraphic.get(graphic);
195
- prevIntentKey && this.removeGraphicFromIntentJob(graphic, prevIntentKey);
196
- }
197
- removeGraphicFromIntentJob(graphic, intentKey) {
198
- var _a, _b, _c;
199
- const job = this.jobsByIntentKey.get(intentKey);
200
- job ? (job.pendingGraphics.delete(graphic), this.pendingIntentByGraphic.get(graphic) === intentKey && this.pendingIntentByGraphic.delete(graphic),
201
- 0 === job.pendingGraphics.size && "completed" !== job.status && (job.status = "cancelled",
202
- this.jobsByIntentKey.delete(intentKey), null === (_a = this.perfMonitor) || void 0 === _a || _a.incrementCounter("deferredJobsCancelled"),
203
- null === (_b = this.perfMonitor) || void 0 === _b || _b.recordEvent("deferred-job-cancel", {
204
- intentKey: intentKey,
205
- jobId: job.id
206
- }), null === (_c = this.perfMonitor) || void 0 === _c || _c.updateBatchPending(this.jobsByIntentKey.size))) : this.pendingIntentByGraphic.delete(graphic);
207
- }
208
- ensureJobRunning(job) {
209
- if (this.runningJobs.has(job.intentKey)) return;
210
- const runner = this.runJob(job).then((() => {
211
- this.runningJobs.delete(job.intentKey);
212
- }), (() => {
213
- this.runningJobs.delete(job.intentKey);
214
- }));
215
- this.runningJobs.set(job.intentKey, runner);
216
- }
217
- runJob(job) {
218
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
219
- return __awaiter(this, void 0, void 0, (function*() {
220
- if ("cancelled" === job.status) return;
221
- if (yield this.waitForNextFrame(), "cancelled" === job.status) return;
222
- job.status = "running", null === (_a = this.perfMonitor) || void 0 === _a || _a.recordEvent("deferred-job-start", {
223
- intentKey: job.intentKey,
224
- jobId: job.id
225
- });
226
- let index = 0, frameStart = performance.now(), processedInFrame = 0, committedInSlice = 0;
227
- for (;index < job.orderedGraphics.length; ) {
228
- if ("cancelled" === job.status) return;
229
- processedInFrame > 0 && (processedInFrame >= job.config.maxGraphicsPerFrame || performance.now() - frameStart >= job.config.frameBudget) && (null === (_b = this.perfMonitor) || void 0 === _b || _b.incrementCounter("deferredBudgetYields"),
230
- null === (_c = this.perfMonitor) || void 0 === _c || _c.recordCost("batchSlice", performance.now() - frameStart),
231
- null === (_d = this.perfMonitor) || void 0 === _d || _d.recordEvent("deferred-job-yield", {
232
- intentKey: job.intentKey,
233
- jobId: job.id,
234
- processedInFrame: processedInFrame
235
- }), committedInSlice > 0 && this.stage.renderNextFrame(), yield this.waitForNextFrame(),
236
- frameStart = performance.now(), processedInFrame = 0, committedInSlice = 0);
237
- const graphic = job.orderedGraphics[index++];
238
- if (!job.pendingGraphics.has(graphic)) continue;
239
- if (!isRenderableGraphic(graphic)) {
240
- job.pendingGraphics.delete(graphic), this.pendingIntentByGraphic.get(graphic) === job.intentKey && this.pendingIntentByGraphic.delete(graphic);
241
- continue;
242
- }
243
- if (this.pendingIntentByGraphic.get(graphic) !== job.intentKey) {
244
- job.pendingGraphics.delete(graphic);
245
- continue;
246
- }
247
- const nextEligibility = this.resolveEligibility(graphic, job.targetStates, !0, !1);
248
- if (!nextEligibility.eligible) {
249
- job.pendingGraphics.delete(graphic), this.pendingIntentByGraphic.delete(graphic),
250
- this.commitSynchronously(graphic, job.targetStates);
251
- continue;
252
- }
253
- createIntentKey(nextEligibility.context.contextOwnerId, nextEligibility.context.configFingerprint, nextEligibility.targetStatesKey) === job.intentKey ? (this.commitSynchronously(graphic, job.targetStates),
254
- job.pendingGraphics.delete(graphic), this.pendingIntentByGraphic.delete(graphic),
255
- job.processedCount += 1, processedInFrame += 1, committedInSlice += 1, null === (_e = this.perfMonitor) || void 0 === _e || _e.incrementCounter("deferredGraphicsCommitted")) : (job.pendingGraphics.delete(graphic),
256
- this.pendingIntentByGraphic.delete(graphic), this.enqueueDeferredIntent(graphic, job.targetStates, nextEligibility.context, nextEligibility.targetStatesKey));
257
- }
258
- processedInFrame > 0 && (null === (_f = this.perfMonitor) || void 0 === _f || _f.recordCost("batchSlice", performance.now() - frameStart),
259
- this.stage.renderNextFrame()), 0 === job.pendingGraphics.size && this.jobsByIntentKey.get(job.intentKey) === job && (job.status = "completed",
260
- this.jobsByIntentKey.delete(job.intentKey), null === (_g = this.perfMonitor) || void 0 === _g || _g.incrementCounter("deferredJobsCompleted"),
261
- null === (_h = this.perfMonitor) || void 0 === _h || _h.recordEvent("deferred-job-complete", {
262
- intentKey: job.intentKey,
263
- jobId: job.id,
264
- processedCount: job.processedCount
265
- }), null === (_j = this.perfMonitor) || void 0 === _j || _j.updateBatchPending(this.jobsByIntentKey.size));
266
- }));
267
- }
268
- waitForNextFrame() {
269
- const stageGlobal = this.stage.global;
270
- return (null == stageGlobal ? void 0 : stageGlobal.getSpecifiedPerformanceRAF) ? stageGlobal.getSpecifiedPerformanceRAF(this.stage.rafId).wait() : new Promise((resolve => {
271
- null == stageGlobal || stageGlobal.getSpecifiedRequestAnimationFrame(this.stage.rafId)((() => resolve()));
272
- }));
273
- }
274
- commitSynchronously(graphic, targetStates) {
275
- isRenderableGraphic(graphic) && (targetStates.length ? graphic.useStates(targetStates, !1) : graphic.clearStates(!1));
276
- }
277
- }
278
- //# sourceMappingURL=state-batch-scheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graphic/state/state-batch-scheduler.ts"],"names":[],"mappings":";;;;;;;;;AAEA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAML,8BAA8B,EAC9B,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,sBAAsB,CAAC;AAiC9B,SAAS,mBAAmB,CAAC,OAAiB;IAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,IAAK,OAAe,CAAC,aAAa,KAAK,UAAU,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAsB;IACnD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CACtB,cAAsB,EACtB,iBAAyB,EACzB,eAAuB;IAEvB,OAAO,GAAG,cAAc,IAAI,iBAAiB,IAAI,eAAe,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAkC;IACrE,MAAM,UAAU,GAAG,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,IAAI,IAAI,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAiB;IAItD,MAAM,UAAU,GAAG,OAAc,CAAC;IAClC,IAAI,OAAO,UAAU,CAAC,mCAAmC,KAAK,UAAU,EAAE;QACxE,MAAM,MAAM,GAAG,UAAU,CAAC,mCAAmC,EAAE,CAAC;QAChE,OAAO;YACL,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC;KACH;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAiB;;IAC7C,OAAO,MAAA,MAAE,OAAe,CAAC,aAAsC,0CAAE,KAAK,EAAE,mCAAI,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,OAAO,mBAAmB;IAO9B,YAA6B,KAAa,EAAmB,WAA8B;QAA9D,UAAK,GAAL,KAAK,CAAQ;QAAmB,gBAAW,GAAX,WAAW,CAAmB;QANlF,oBAAe,GAAG,IAAI,GAAG,EAAuC,CAAC;QACjE,2BAAsB,GAAG,IAAI,GAAG,EAAiC,CAAC;QAEnE,cAAS,GAAG,CAAC,CAAC;QACL,gBAAW,GAAG,IAAI,GAAG,EAAsC,CAAC;IAEiB,CAAC;IAE/F,QAAQ,CAAC,QAAoB,EAAE,YAAsB;QACnD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACzF,IAAI,QAAQ,IAAI,WAAW,EAAE;gBAC3B,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,WAAW,CAAC,MAAM,KAAK,qBAAqB,EAAE;oBAChD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;iBACjD;gBACD,OAAO;aACR;YAED,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;;QACL,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,kBAAkB,CACxB,OAAiB,EACjB,YAAsB,EACtB,cAAuB,EACvB,mBAA4B;;QAE5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;YACjC,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;aACnE;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;SAC3D;QAED,IAAI,CAAC,cAAc,EAAE;YACnB,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;aACnE;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;SAC3D;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;aACnE;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;SAC3D;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YAC3B,MAAM,qBAAqB,GAAG,iCAAiC,CAC5D,OAAO,CAAC,YAAoB,CAAC,mBAA4D,CAC3F,CAAC;YACF,MAAM,MAAM,GAAG,CAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,YAAY,MAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACtG,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;aACpD;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACpC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/E,IAAI,cAAc,CAAC,MAAM,EAAE;YACzB,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;aACnE;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC;SAC3D;QAED,IAAI,cAAc,CAAC,QAAQ,KAAK,cAAc,CAAC,KAAK,EAAE;YACpD,IAAI,mBAAmB,EAAE;gBACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;aACrE;YACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;SAC7D;QAED,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,OAAO;YACP,eAAe,EAAE,qBAAqB,CAAC,YAAY,CAAC;SACrD,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,OAAiB;;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,KAAK,GAA6B,KAAK,CAAC;QAC5C,IAAI,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAC;QAErD,MAAM,YAAY,GAAoC,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,MAAM,GAAG,OAAO,CAAC,MAAa,CAAC;QAEnC,OAAO,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;YACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,GAAG,MAAM,CAAC,MAAa,CAAC;SAC/B;QAED,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEjE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC7B,MAAM,mBAAmB,GAAG,iCAAiC,CAC1D,OAAe,CAAC,mBAA4D,CAC9E,CAAC;YACF,IAAI,CAAC,mBAAmB,EAAE;gBACxB,OAAO;aACR;YAED,IAAI,mBAAmB,CAAC,QAAQ,EAAE;gBAChC,MAAM,mCACD,MAAM,GACN,mBAAmB,CAAC,QAAQ,CAChC,CAAC;aACH;YAED,IAAI,mBAAmB,CAAC,YAAY,IAAI,IAAI,EAAE;gBAC5C,MAAM,CAAC,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC;aACnD;YAED,IAAI,2BAA2B,CAAE,OAAe,CAAC,mBAAmB,CAAC,EAAE;gBACrE,KAAK,GAAG,OAAO,CAAC;aACjB;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,MAAC,KAAa,CAAC,IAAI,mCAAI,CAAC;YACxC,MAAM,EAAE,UAAU;YAClB,iBAAiB,EAAE,8BAA8B,CAAC,UAAU,CAAC;SAC9D,CAAC;IACJ,CAAC;IAEO,2BAA2B,CACjC,OAAiB,EACjB,YAAsB;QAEtB,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QAC9F,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjG,IAAI,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;QAEnC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAClC,IAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,SAAS,CAAC,EAAE;gBACtC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;gBAC/B,OAAO;aACR;YAED,MAAM,UAAU,GAAG,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO;aACR;YAED,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE;gBAChE,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;gBAC/B,OAAO;aACR;YAED,QAAQ,IAAI,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IACE,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,SAAS,CAAC,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBAC/B,MAAM,UAAU,GAAG,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBACvD,OAAO,CAAC,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,CAAA,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,CAAC;YACzE,CAAC,CAAC,EACF;YACA,OAAO;gBACL,QAAQ,EAAE,cAAc,CAAC,IAAI;gBAC7B,MAAM,EAAE,wBAAwB;aACjC,CAAC;SACH;QAED,OAAO;YACL,QAAQ,EAAE,QAAQ,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;SAC7E,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAC3B,OAAiB,EACjB,YAAsB,EACtB,OAAiC,EACjC,eAAuB;;QAEvB,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAC1G,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,aAAa,KAAK,aAAa,EAAE;YACnC,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;YAC5D,OAAO;SACR;QAED,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;SACzD;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,EAAE;YACR,GAAG,GAAG;gBACJ,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;gBACpB,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,aAAa;gBACxB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;gBAC/B,eAAe;gBACf,eAAe,EAAE,IAAI,GAAG,EAAE;gBAC1B,eAAe,EAAE,EAAE;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,cAAc,EAAE,CAAC;aAClB,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;YAC1D,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACjE;aAAM;YACL,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;SAC7D;QAED,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACrC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACxD,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;YAC1D,MAAA,IAAI,CAAC,WAAW,0CAAE,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACpE;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAEO,wBAAwB,CAAC,OAAiB;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO;SACR;QACD,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IAEO,0BAA0B,CAAC,OAAiB,EAAE,SAA8B;;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO;SACR;QAED,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE;YAC1D,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAC7C;QAED,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE;YAChE,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;YAC5D,MAAA,IAAI,CAAC,WAAW,0CAAE,WAAW,CAAC,qBAAqB,EAAE;gBACnD,SAAS;gBACT,KAAK,EAAE,GAAG,CAAC,EAAE;aACd,CAAC,CAAC;YACH,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACjE;IACH,CAAC;IAEO,gBAAgB,CAAC,GAAmB;QAC1C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACvC,OAAO;SACR;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAClC,GAAG,EAAE;YACH,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,EACD,GAAG,EAAE;YACH,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEa,MAAM,CAAC,GAAmB;;;YACtC,IAAK,GAAG,CAAC,MAAiB,KAAK,WAAW,EAAE;gBAC1C,OAAO;aACR;YAED,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,IAAK,GAAG,CAAC,MAAiB,KAAK,WAAW,EAAE;gBAC1C,OAAO;aACR;YAED,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YACvB,MAAA,IAAI,CAAC,WAAW,0CAAE,WAAW,CAAC,oBAAoB,EAAE;gBAClD,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;aACd,CAAC,CAAC;YAEH,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;YAEzB,OAAO,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE;gBACzC,IAAK,GAAG,CAAC,MAAiB,KAAK,WAAW,EAAE;oBAC1C,OAAO;iBACR;gBAED,IACE,gBAAgB,GAAG,CAAC;oBACpB,CAAC,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAChH;oBACA,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;oBAC3D,MAAA,IAAI,CAAC,WAAW,0CAAE,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC;oBAC3E,MAAA,IAAI,CAAC,WAAW,0CAAE,WAAW,CAAC,oBAAoB,EAAE;wBAClD,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;wBACb,gBAAgB;qBACjB,CAAC,CAAC;oBACH,IAAI,gBAAgB,GAAG,CAAC,EAAE;wBACxB,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;qBAC9B;oBACD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC9B,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;oBAC/B,gBAAgB,GAAG,CAAC,CAAC;oBACrB,gBAAgB,GAAG,CAAC,CAAC;iBACtB;gBAED,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;gBAE7C,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACrC,SAAS;iBACV;gBAED,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;oBACjC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpC,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,SAAS,EAAE;wBAC9D,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;qBAC7C;oBACD,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,SAAS,EAAE;oBAC9D,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpC,SAAS;iBACV;gBAED,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACxF,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;oBAC7B,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5C,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;oBACpD,SAAS;iBACV;gBAED,MAAM,aAAa,GAAG,eAAe,CACnC,eAAe,CAAC,OAAO,CAAC,cAAc,EACtC,eAAe,CAAC,OAAO,CAAC,iBAAiB,EACzC,eAAe,CAAC,eAAe,CAChC,CAAC;gBAEF,IAAI,aAAa,KAAK,GAAG,CAAC,SAAS,EAAE;oBACnC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5C,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;oBAChH,SAAS;iBACV;gBAED,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;gBACpD,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC5C,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC;gBACxB,gBAAgB,IAAI,CAAC,CAAC;gBACtB,gBAAgB,IAAI,CAAC,CAAC;gBACtB,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;aACjE;YAED,IAAI,gBAAgB,GAAG,CAAC,EAAE;gBACxB,MAAA,IAAI,CAAC,WAAW,0CAAE,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC;gBAC3E,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;aAC9B;YAED,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE;gBACrF,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC3C,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;gBAC5D,MAAA,IAAI,CAAC,WAAW,0CAAE,WAAW,CAAC,uBAAuB,EAAE;oBACrD,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,cAAc,EAAE,GAAG,CAAC,cAAc;iBACnC,CAAC,CAAC;gBACH,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACjE;;KACF;IAEO,gBAAgB;QACtB,MAAM,WAAW,GAAI,IAAI,CAAC,KAAa,CAAC,MAAM,CAAC;QAC/C,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,0BAA0B,EAAE;YAC3C,OAAO,WAAW,CAAC,0BAA0B,CAAE,IAAI,CAAC,KAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SACjF;QAED,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,iCAAiC,CAAE,IAAI,CAAC,KAAa,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB,CAAC,OAAiB,EAAE,YAAsB;QACnE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;YACjC,OAAO;SACR;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACxB,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;SACR;QAED,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;CACF","file":"state-batch-scheduler.js","sourcesContent":["import type { IGraphic, IGroup, ILayer, IStage } from '../../interface';\nimport type { CompiledStateDefinition } from './state-definition';\nimport { UpdateCategory, classifyAffectedKeys } from './attribute-update-classifier';\nimport {\n type DeferredIneligibleReason,\n type IDeferredStateConfig,\n type IDeferredStateOwnerConfig,\n type IResolvedDeferredContext,\n type StatePerfMonitor,\n fingerprintDeferredStateConfig,\n normalizeDeferredStateConfig,\n normalizeDeferredStateOwnerConfig\n} from './state-perf-monitor';\n\ntype StateBatchJobKind = 'apply_states';\ntype StateBatchIntentKey = string;\n\nexport interface IStateBatchJob {\n id: number;\n kind: StateBatchJobKind;\n intentKey: StateBatchIntentKey;\n status: 'pending' | 'running' | 'completed' | 'cancelled';\n targetStates: string[];\n targetStatesKey: string;\n pendingGraphics: Set<IGraphic>;\n orderedGraphics: IGraphic[];\n config: Required<IDeferredStateConfig>;\n contextOwner: IStage | ILayer | IGroup;\n contextOwnerId: number;\n configFingerprint: string;\n createdAt: number;\n processedCount: number;\n}\n\ntype DeferredEligibilityResult =\n | {\n eligible: true;\n context: IResolvedDeferredContext;\n targetStatesKey: string;\n }\n | {\n eligible: false;\n reason: DeferredIneligibleReason;\n };\n\nfunction isRenderableGraphic(graphic: IGraphic): boolean {\n return !!graphic.stage && (graphic as any).releaseStatus !== 'released';\n}\n\nfunction createTargetStatesKey(targetStates: string[]): string {\n return targetStates.length ? targetStates.join('|') : '__clear__';\n}\n\nfunction createIntentKey(\n contextOwnerId: number,\n configFingerprint: string,\n targetStatesKey: string\n): StateBatchIntentKey {\n return `${contextOwnerId}:${configFingerprint}:${targetStatesKey}`;\n}\n\nfunction hasMeaningfulDeferredConfig(config?: IDeferredStateOwnerConfig): boolean {\n const normalized = normalizeDeferredStateOwnerConfig(config);\n return !!normalized && (normalized.localEnabled != null || normalized.deferred != null);\n}\n\nfunction getGraphicCompiledDefinitions(graphic: IGraphic): {\n compiledDefinitions?: Map<string, CompiledStateDefinition<any>>;\n stateProxyEligibility?: (stateName: string) => boolean;\n} {\n const graphicAny = graphic as any;\n if (typeof graphicAny.resolveEffectiveCompiledDefinitions === 'function') {\n const result = graphicAny.resolveEffectiveCompiledDefinitions();\n return {\n compiledDefinitions: result.compiledDefinitions,\n stateProxyEligibility: result.stateProxyEligibility\n };\n }\n\n return {};\n}\n\nfunction getCurrentStateNames(graphic: IGraphic): string[] {\n return ((graphic as any).currentStates as string[] | undefined)?.slice() ?? [];\n}\n\nexport class StateBatchScheduler {\n readonly jobsByIntentKey = new Map<StateBatchIntentKey, IStateBatchJob>();\n readonly pendingIntentByGraphic = new Map<IGraphic, StateBatchIntentKey>();\n\n private nextJobId = 1;\n private readonly runningJobs = new Map<StateBatchIntentKey, Promise<void>>();\n\n constructor(private readonly stage: IStage, private readonly perfMonitor?: StatePerfMonitor) {}\n\n schedule(graphics: IGraphic[], targetStates: string[]): void {\n const batchOperation = graphics.length > 1;\n\n graphics.forEach(graphic => {\n const eligibility = this.resolveEligibility(graphic, targetStates, batchOperation, true);\n if ('reason' in eligibility) {\n this.removeGraphicFromPending(graphic);\n if (eligibility.reason !== 'graphic_unavailable') {\n this.commitSynchronously(graphic, targetStates);\n }\n return;\n }\n\n this.enqueueDeferredIntent(graphic, targetStates, eligibility.context, eligibility.targetStatesKey);\n });\n }\n\n release(): void {\n this.jobsByIntentKey.forEach(job => {\n job.status = 'cancelled';\n });\n this.jobsByIntentKey.clear();\n this.pendingIntentByGraphic.clear();\n this.runningJobs.clear();\n this.perfMonitor?.updateBatchPending(0);\n }\n\n private resolveEligibility(\n graphic: IGraphic,\n targetStates: string[],\n batchOperation: boolean,\n recordObservability: boolean\n ): DeferredEligibilityResult {\n if (!isRenderableGraphic(graphic)) {\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible('graphic_unavailable');\n }\n return { eligible: false, reason: 'graphic_unavailable' };\n }\n\n if (!batchOperation) {\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible('non_batch_operation');\n }\n return { eligible: false, reason: 'non_batch_operation' };\n }\n\n const context = this.resolveDeferredContext(graphic);\n if (!context) {\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible('graphic_unavailable');\n }\n return { eligible: false, reason: 'graphic_unavailable' };\n }\n\n if (!context.config.enabled) {\n const normalizedOwnerConfig = normalizeDeferredStateOwnerConfig(\n (context.contextOwner as any).deferredStateConfig as IDeferredStateOwnerConfig | undefined\n );\n const reason = normalizedOwnerConfig?.localEnabled === false ? 'context_disabled' : 'config_disabled';\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible(reason);\n }\n return { eligible: false, reason };\n }\n\n const classification = this.classifyGraphicTargetStates(graphic, targetStates);\n if (classification.reason) {\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible(classification.reason);\n }\n return { eligible: false, reason: classification.reason };\n }\n\n if (classification.category !== UpdateCategory.PAINT) {\n if (recordObservability) {\n this.perfMonitor?.recordDeferredIneligible('mixed_update_category');\n }\n return { eligible: false, reason: 'mixed_update_category' };\n }\n\n return {\n eligible: true,\n context,\n targetStatesKey: createTargetStatesKey(targetStates)\n };\n }\n\n private resolveDeferredContext(graphic: IGraphic): IResolvedDeferredContext | undefined {\n const stage = graphic.stage;\n if (!stage) {\n return undefined;\n }\n\n let owner: IStage | ILayer | IGroup = stage;\n let config = normalizeDeferredStateConfig(undefined);\n\n const ownerConfigs: Array<IStage | ILayer | IGroup> = [stage];\n const parents: Array<IGroup | ILayer> = [];\n let parent = graphic.parent as any;\n\n while (parent && parent !== stage) {\n parents.push(parent);\n parent = parent.parent as any;\n }\n\n parents.reverse().forEach(current => ownerConfigs.push(current));\n\n ownerConfigs.forEach(current => {\n const deferredStateConfig = normalizeDeferredStateOwnerConfig(\n (current as any).deferredStateConfig as IDeferredStateOwnerConfig | undefined\n );\n if (!deferredStateConfig) {\n return;\n }\n\n if (deferredStateConfig.deferred) {\n config = {\n ...config,\n ...deferredStateConfig.deferred\n };\n }\n\n if (deferredStateConfig.localEnabled != null) {\n config.enabled = deferredStateConfig.localEnabled;\n }\n\n if (hasMeaningfulDeferredConfig((current as any).deferredStateConfig)) {\n owner = current;\n }\n });\n\n const normalized = normalizeDeferredStateConfig(config);\n return {\n contextOwner: owner,\n contextOwnerId: (owner as any)._uid ?? 0,\n config: normalized,\n configFingerprint: fingerprintDeferredStateConfig(normalized)\n };\n }\n\n private classifyGraphicTargetStates(\n graphic: IGraphic,\n targetStates: string[]\n ): { category: UpdateCategory; reason?: DeferredIneligibleReason } {\n const { compiledDefinitions, stateProxyEligibility } = getGraphicCompiledDefinitions(graphic);\n const candidateStates = Array.from(new Set([...getCurrentStateNames(graphic), ...targetStates]));\n let category = UpdateCategory.NONE;\n\n candidateStates.forEach(stateName => {\n if (stateProxyEligibility?.(stateName)) {\n category = UpdateCategory.NONE;\n return;\n }\n\n const definition = compiledDefinitions?.get(stateName);\n if (!definition) {\n return;\n }\n\n if (definition.hasResolver && definition.affectedKeys.size === 0) {\n category = UpdateCategory.NONE;\n return;\n }\n\n category |= classifyAffectedKeys(definition.affectedKeys);\n });\n\n if (\n candidateStates.some(stateName => stateProxyEligibility?.(stateName)) ||\n candidateStates.some(stateName => {\n const definition = compiledDefinitions?.get(stateName);\n return !!definition?.hasResolver && definition.affectedKeys.size === 0;\n })\n ) {\n return {\n category: UpdateCategory.NONE,\n reason: 'resolver_unstable_keys'\n };\n }\n\n return {\n category: category === UpdateCategory.NONE ? UpdateCategory.PAINT : category\n };\n }\n\n private enqueueDeferredIntent(\n graphic: IGraphic,\n targetStates: string[],\n context: IResolvedDeferredContext,\n targetStatesKey: string\n ): void {\n const nextIntentKey = createIntentKey(context.contextOwnerId, context.configFingerprint, targetStatesKey);\n const prevIntentKey = this.pendingIntentByGraphic.get(graphic);\n\n if (prevIntentKey === nextIntentKey) {\n this.perfMonitor?.incrementCounter('deferredJobsCoalesced');\n return;\n }\n\n if (prevIntentKey) {\n this.removeGraphicFromIntentJob(graphic, prevIntentKey);\n }\n\n let job = this.jobsByIntentKey.get(nextIntentKey);\n if (!job) {\n job = {\n id: this.nextJobId++,\n kind: 'apply_states',\n intentKey: nextIntentKey,\n status: 'pending',\n targetStates: [...targetStates],\n targetStatesKey,\n pendingGraphics: new Set(),\n orderedGraphics: [],\n config: context.config,\n contextOwner: context.contextOwner,\n contextOwnerId: context.contextOwnerId,\n configFingerprint: context.configFingerprint,\n createdAt: Date.now(),\n processedCount: 0\n };\n this.jobsByIntentKey.set(nextIntentKey, job);\n this.perfMonitor?.incrementCounter('deferredJobsCreated');\n this.perfMonitor?.updateBatchPending(this.jobsByIntentKey.size);\n } else {\n this.perfMonitor?.incrementCounter('deferredJobsCoalesced');\n }\n\n if (!job.pendingGraphics.has(graphic)) {\n job.pendingGraphics.add(graphic);\n job.orderedGraphics.push(graphic);\n this.pendingIntentByGraphic.set(graphic, nextIntentKey);\n this.perfMonitor?.recordAllocation('batchEntriesCreated');\n this.perfMonitor?.updateMaxGraphicsInJob(job.pendingGraphics.size);\n }\n\n this.ensureJobRunning(job);\n }\n\n private removeGraphicFromPending(graphic: IGraphic): void {\n const prevIntentKey = this.pendingIntentByGraphic.get(graphic);\n if (!prevIntentKey) {\n return;\n }\n this.removeGraphicFromIntentJob(graphic, prevIntentKey);\n }\n\n private removeGraphicFromIntentJob(graphic: IGraphic, intentKey: StateBatchIntentKey): void {\n const job = this.jobsByIntentKey.get(intentKey);\n if (!job) {\n this.pendingIntentByGraphic.delete(graphic);\n return;\n }\n\n job.pendingGraphics.delete(graphic);\n if (this.pendingIntentByGraphic.get(graphic) === intentKey) {\n this.pendingIntentByGraphic.delete(graphic);\n }\n\n if (job.pendingGraphics.size === 0 && job.status !== 'completed') {\n job.status = 'cancelled';\n this.jobsByIntentKey.delete(intentKey);\n this.perfMonitor?.incrementCounter('deferredJobsCancelled');\n this.perfMonitor?.recordEvent('deferred-job-cancel', {\n intentKey,\n jobId: job.id\n });\n this.perfMonitor?.updateBatchPending(this.jobsByIntentKey.size);\n }\n }\n\n private ensureJobRunning(job: IStateBatchJob): void {\n if (this.runningJobs.has(job.intentKey)) {\n return;\n }\n\n const runner = this.runJob(job).then(\n () => {\n this.runningJobs.delete(job.intentKey);\n },\n () => {\n this.runningJobs.delete(job.intentKey);\n }\n );\n\n this.runningJobs.set(job.intentKey, runner);\n }\n\n private async runJob(job: IStateBatchJob): Promise<void> {\n if ((job.status as string) === 'cancelled') {\n return;\n }\n\n await this.waitForNextFrame();\n if ((job.status as string) === 'cancelled') {\n return;\n }\n\n job.status = 'running';\n this.perfMonitor?.recordEvent('deferred-job-start', {\n intentKey: job.intentKey,\n jobId: job.id\n });\n\n let index = 0;\n let frameStart = performance.now();\n let processedInFrame = 0;\n let committedInSlice = 0;\n\n while (index < job.orderedGraphics.length) {\n if ((job.status as string) === 'cancelled') {\n return;\n }\n\n if (\n processedInFrame > 0 &&\n (processedInFrame >= job.config.maxGraphicsPerFrame || performance.now() - frameStart >= job.config.frameBudget)\n ) {\n this.perfMonitor?.incrementCounter('deferredBudgetYields');\n this.perfMonitor?.recordCost('batchSlice', performance.now() - frameStart);\n this.perfMonitor?.recordEvent('deferred-job-yield', {\n intentKey: job.intentKey,\n jobId: job.id,\n processedInFrame\n });\n if (committedInSlice > 0) {\n this.stage.renderNextFrame();\n }\n await this.waitForNextFrame();\n frameStart = performance.now();\n processedInFrame = 0;\n committedInSlice = 0;\n }\n\n const graphic = job.orderedGraphics[index++];\n\n if (!job.pendingGraphics.has(graphic)) {\n continue;\n }\n\n if (!isRenderableGraphic(graphic)) {\n job.pendingGraphics.delete(graphic);\n if (this.pendingIntentByGraphic.get(graphic) === job.intentKey) {\n this.pendingIntentByGraphic.delete(graphic);\n }\n continue;\n }\n\n if (this.pendingIntentByGraphic.get(graphic) !== job.intentKey) {\n job.pendingGraphics.delete(graphic);\n continue;\n }\n\n const nextEligibility = this.resolveEligibility(graphic, job.targetStates, true, false);\n if (!nextEligibility.eligible) {\n job.pendingGraphics.delete(graphic);\n this.pendingIntentByGraphic.delete(graphic);\n this.commitSynchronously(graphic, job.targetStates);\n continue;\n }\n\n const nextIntentKey = createIntentKey(\n nextEligibility.context.contextOwnerId,\n nextEligibility.context.configFingerprint,\n nextEligibility.targetStatesKey\n );\n\n if (nextIntentKey !== job.intentKey) {\n job.pendingGraphics.delete(graphic);\n this.pendingIntentByGraphic.delete(graphic);\n this.enqueueDeferredIntent(graphic, job.targetStates, nextEligibility.context, nextEligibility.targetStatesKey);\n continue;\n }\n\n this.commitSynchronously(graphic, job.targetStates);\n job.pendingGraphics.delete(graphic);\n this.pendingIntentByGraphic.delete(graphic);\n job.processedCount += 1;\n processedInFrame += 1;\n committedInSlice += 1;\n this.perfMonitor?.incrementCounter('deferredGraphicsCommitted');\n }\n\n if (processedInFrame > 0) {\n this.perfMonitor?.recordCost('batchSlice', performance.now() - frameStart);\n this.stage.renderNextFrame();\n }\n\n if (job.pendingGraphics.size === 0 && this.jobsByIntentKey.get(job.intentKey) === job) {\n job.status = 'completed';\n this.jobsByIntentKey.delete(job.intentKey);\n this.perfMonitor?.incrementCounter('deferredJobsCompleted');\n this.perfMonitor?.recordEvent('deferred-job-complete', {\n intentKey: job.intentKey,\n jobId: job.id,\n processedCount: job.processedCount\n });\n this.perfMonitor?.updateBatchPending(this.jobsByIntentKey.size);\n }\n }\n\n private waitForNextFrame(): Promise<void> {\n const stageGlobal = (this.stage as any).global;\n if (stageGlobal?.getSpecifiedPerformanceRAF) {\n return stageGlobal.getSpecifiedPerformanceRAF((this.stage as any).rafId).wait();\n }\n\n return new Promise(resolve => {\n stageGlobal?.getSpecifiedRequestAnimationFrame((this.stage as any).rafId)(() => resolve());\n });\n }\n\n private commitSynchronously(graphic: IGraphic, targetStates: string[]): void {\n if (!isRenderableGraphic(graphic)) {\n return;\n }\n\n if (!targetStates.length) {\n graphic.clearStates(false);\n return;\n }\n\n graphic.useStates(targetStates, false);\n }\n}\n"]}
@@ -1,43 +0,0 @@
1
- import type { StateDefinition, StateDefinitionsInput } from './state-definition';
2
- import type { StateEngine } from './state-engine';
3
- export type StateSort = (stateA: string, stateB: string) => number;
4
- export type StateProxy<T> = (stateName: string, targetStates?: string[]) => Partial<T> | undefined;
5
- export interface IStateModelOptions<T> {
6
- states?: StateDefinitionsInput<T>;
7
- currentStates?: string[];
8
- stateSort?: StateSort;
9
- stateProxy?: StateProxy<T>;
10
- exclusiveGroups?: Record<string, string[]>;
11
- stateEngine?: StateEngine<T>;
12
- }
13
- export interface IStateModelTransition {
14
- changed: boolean;
15
- states: string[];
16
- effectiveStates?: string[];
17
- }
18
- export declare class StateModel<T extends Record<string, any> = Record<string, any>> {
19
- states?: StateDefinitionsInput<T>;
20
- currentStates?: string[];
21
- stateSort?: StateSort;
22
- stateProxy?: StateProxy<T>;
23
- readonly stateEngine?: StateEngine<T>;
24
- private readonly exclusiveGroupMap;
25
- private readonly exclusiveGroups;
26
- constructor(options?: IStateModelOptions<T>);
27
- getCurrentStates(): string[];
28
- hasState(stateName?: string): boolean;
29
- getState(stateName: string): Partial<T> | StateDefinition<T> | undefined;
30
- useStates(states: string[]): IStateModelTransition;
31
- clearStates(): IStateModelTransition;
32
- addState(stateName: string, keepCurrentStates?: boolean): IStateModelTransition;
33
- removeState(stateName: string | string[]): IStateModelTransition;
34
- toggleState(stateName: string): IStateModelTransition;
35
- sortStates(states: string[]): string[];
36
- registerExclusiveGroup(groupName: string, states: string[]): void;
37
- getExclusiveGroup(stateName: string): string | undefined;
38
- getMutuallyExclusiveStates(stateName: string): string[];
39
- isMutuallyExclusive(stateA: string, stateB: string): boolean;
40
- get effectiveStates(): ReadonlyArray<string>;
41
- get resolvedPatch(): Partial<T> | undefined;
42
- private sameStates;
43
- }
@@ -1,135 +0,0 @@
1
- export class StateModel {
2
- constructor(options = {}) {
3
- var _a;
4
- this.exclusiveGroupMap = new Map, this.exclusiveGroups = new Map, this.states = options.states,
5
- this.currentStates = options.currentStates ? [ ...options.currentStates ] : void 0,
6
- this.stateSort = options.stateSort, this.stateProxy = options.stateProxy, this.stateEngine = options.stateEngine,
7
- this.stateEngine && options.currentStates && !this.sameStates(this.stateEngine.activeStates, options.currentStates) && this.stateEngine.applyStates(options.currentStates);
8
- const exclusiveGroups = null !== (_a = options.exclusiveGroups) && void 0 !== _a ? _a : {};
9
- for (const groupName in exclusiveGroups) Object.prototype.hasOwnProperty.call(exclusiveGroups, groupName) && this.registerExclusiveGroup(groupName, exclusiveGroups[groupName]);
10
- }
11
- getCurrentStates() {
12
- return this.currentStates ? [ ...this.currentStates ] : [];
13
- }
14
- hasState(stateName) {
15
- return this.stateEngine ? this.stateEngine.hasState(stateName) : !(!this.currentStates || !this.currentStates.length) && (null == stateName || this.currentStates.includes(stateName));
16
- }
17
- getState(stateName) {
18
- var _a;
19
- return null === (_a = this.states) || void 0 === _a ? void 0 : _a[stateName];
20
- }
21
- useStates(states) {
22
- var _a;
23
- if (this.stateEngine) {
24
- const result = this.stateEngine.applyStates(states);
25
- return this.currentStates = [ ...result.activeStates ], {
26
- changed: result.changed,
27
- states: [ ...result.activeStates ],
28
- effectiveStates: [ ...result.effectiveStates ]
29
- };
30
- }
31
- if (!states.length) return this.clearStates();
32
- const previousStates = null !== (_a = this.currentStates) && void 0 !== _a ? _a : [], changed = previousStates.length !== states.length || states.some(((stateName, index) => previousStates[index] !== stateName)), nextStates = this.sortStates(states);
33
- return changed && (this.currentStates = nextStates), {
34
- changed: changed,
35
- states: changed ? [ ...nextStates ] : [ ...previousStates ]
36
- };
37
- }
38
- clearStates() {
39
- if (this.stateEngine) {
40
- const result = this.stateEngine.clearStates();
41
- return this.currentStates = [], {
42
- changed: result.changed,
43
- states: [],
44
- effectiveStates: []
45
- };
46
- }
47
- const changed = this.hasState();
48
- return this.currentStates = [], {
49
- changed: changed,
50
- states: []
51
- };
52
- }
53
- addState(stateName, keepCurrentStates) {
54
- var _a;
55
- if (this.stateEngine) {
56
- const result = this.stateEngine.addState(stateName, keepCurrentStates);
57
- return this.currentStates = [ ...result.activeStates ], {
58
- changed: result.changed,
59
- states: [ ...result.activeStates ],
60
- effectiveStates: [ ...result.effectiveStates ]
61
- };
62
- }
63
- if (this.currentStates && this.currentStates.includes(stateName) && (keepCurrentStates || 1 === this.currentStates.length)) return {
64
- changed: !1,
65
- states: this.getCurrentStates()
66
- };
67
- const nextStates = keepCurrentStates && (null === (_a = this.currentStates) || void 0 === _a ? void 0 : _a.length) ? this.currentStates.concat([ stateName ]) : [ stateName ];
68
- return this.useStates(nextStates);
69
- }
70
- removeState(stateName) {
71
- if (this.stateEngine) {
72
- const result = this.stateEngine.removeState(stateName);
73
- return this.currentStates = [ ...result.activeStates ], {
74
- changed: result.changed,
75
- states: [ ...result.activeStates ],
76
- effectiveStates: [ ...result.effectiveStates ]
77
- };
78
- }
79
- if (!this.currentStates) return {
80
- changed: !1,
81
- states: []
82
- };
83
- const filter = Array.isArray(stateName) ? s => !stateName.includes(s) : s => s !== stateName, nextStates = this.currentStates.filter(filter);
84
- return nextStates.length === this.currentStates.length ? {
85
- changed: !1,
86
- states: this.getCurrentStates()
87
- } : this.useStates(nextStates);
88
- }
89
- toggleState(stateName) {
90
- if (this.stateEngine) {
91
- const result = this.stateEngine.toggleState(stateName);
92
- return this.currentStates = [ ...result.activeStates ], {
93
- changed: result.changed,
94
- states: [ ...result.activeStates ],
95
- effectiveStates: [ ...result.effectiveStates ]
96
- };
97
- }
98
- if (this.hasState(stateName)) return this.removeState(stateName);
99
- const nextStates = this.currentStates ? this.currentStates.slice() : [];
100
- return nextStates.includes(stateName) || nextStates.push(stateName), this.useStates(nextStates);
101
- }
102
- sortStates(states) {
103
- return this.stateEngine ? [ ...this.stateEngine.activeStates ] : this.stateSort ? [ ...states ].sort(this.stateSort) : [ ...states ];
104
- }
105
- registerExclusiveGroup(groupName, states) {
106
- const uniqueStates = Array.from(new Set(states));
107
- this.exclusiveGroups.set(groupName, uniqueStates), uniqueStates.forEach((stateName => this.exclusiveGroupMap.set(stateName, groupName)));
108
- }
109
- getExclusiveGroup(stateName) {
110
- return this.exclusiveGroupMap.get(stateName);
111
- }
112
- getMutuallyExclusiveStates(stateName) {
113
- var _a;
114
- const groupName = this.getExclusiveGroup(stateName);
115
- return groupName ? (null !== (_a = this.exclusiveGroups.get(groupName)) && void 0 !== _a ? _a : []).filter((name => name !== stateName)) : [];
116
- }
117
- isMutuallyExclusive(stateA, stateB) {
118
- const groupName = this.getExclusiveGroup(stateA);
119
- return !!groupName && groupName === this.getExclusiveGroup(stateB) && stateA !== stateB;
120
- }
121
- get effectiveStates() {
122
- var _a, _b, _c;
123
- return null !== (_c = null !== (_b = null === (_a = this.stateEngine) || void 0 === _a ? void 0 : _a.effectiveStates) && void 0 !== _b ? _b : this.currentStates) && void 0 !== _c ? _c : [];
124
- }
125
- get resolvedPatch() {
126
- var _a;
127
- return null === (_a = this.stateEngine) || void 0 === _a ? void 0 : _a.resolvedPatch;
128
- }
129
- sameStates(left, right) {
130
- if (left.length !== right.length) return !1;
131
- for (let index = 0; index < left.length; index++) if (left[index] !== right[index]) return !1;
132
- return !0;
133
- }
134
- }
135
- //# sourceMappingURL=state-model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graphic/state/state-model.ts"],"names":[],"mappings":"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","file":"state-model.js","sourcesContent":["import type { StateDefinition, StateDefinitionsInput } from './state-definition';\nimport type { StateEngine } from './state-engine';\n\nexport type StateSort = (stateA: string, stateB: string) => number;\n\nexport type StateProxy<T> = (stateName: string, targetStates?: string[]) => Partial<T> | undefined;\n\nexport interface IStateModelOptions<T> {\n states?: StateDefinitionsInput<T>;\n currentStates?: string[];\n stateSort?: StateSort;\n stateProxy?: StateProxy<T>;\n exclusiveGroups?: Record<string, string[]>;\n stateEngine?: StateEngine<T>;\n}\n\nexport interface IStateModelTransition {\n changed: boolean;\n states: string[];\n effectiveStates?: string[];\n}\n\nexport class StateModel<T extends Record<string, any> = Record<string, any>> {\n states?: StateDefinitionsInput<T>;\n currentStates?: string[];\n stateSort?: StateSort;\n stateProxy?: StateProxy<T>;\n readonly stateEngine?: StateEngine<T>;\n\n private readonly exclusiveGroupMap = new Map<string, string>();\n private readonly exclusiveGroups = new Map<string, string[]>();\n\n constructor(options: IStateModelOptions<T> = {}) {\n this.states = options.states;\n this.currentStates = options.currentStates ? [...options.currentStates] : undefined;\n this.stateSort = options.stateSort;\n this.stateProxy = options.stateProxy;\n this.stateEngine = options.stateEngine;\n\n if (\n this.stateEngine &&\n options.currentStates &&\n !this.sameStates(this.stateEngine.activeStates, options.currentStates)\n ) {\n this.stateEngine.applyStates(options.currentStates);\n }\n\n const exclusiveGroups = options.exclusiveGroups ?? {};\n for (const groupName in exclusiveGroups) {\n if (!Object.prototype.hasOwnProperty.call(exclusiveGroups, groupName)) {\n continue;\n }\n this.registerExclusiveGroup(groupName, exclusiveGroups[groupName]);\n }\n }\n\n getCurrentStates(): string[] {\n return this.currentStates ? [...this.currentStates] : [];\n }\n\n hasState(stateName?: string): boolean {\n if (this.stateEngine) {\n return this.stateEngine.hasState(stateName);\n }\n\n if (!this.currentStates || !this.currentStates.length) {\n return false;\n }\n\n if (stateName == null) {\n return true;\n }\n\n return this.currentStates.includes(stateName);\n }\n\n getState(stateName: string): Partial<T> | StateDefinition<T> | undefined {\n return this.states?.[stateName];\n }\n\n useStates(states: string[]): IStateModelTransition {\n if (this.stateEngine) {\n const result = this.stateEngine.applyStates(states);\n this.currentStates = [...result.activeStates];\n return {\n changed: result.changed,\n states: [...result.activeStates],\n effectiveStates: [...result.effectiveStates]\n };\n }\n\n if (!states.length) {\n return this.clearStates();\n }\n\n const previousStates = this.currentStates ?? [];\n const changed =\n previousStates.length !== states.length || states.some((stateName, index) => previousStates[index] !== stateName);\n\n const nextStates = this.sortStates(states);\n\n if (changed) {\n this.currentStates = nextStates;\n }\n\n return {\n changed,\n states: changed ? [...nextStates] : [...previousStates]\n };\n }\n\n clearStates(): IStateModelTransition {\n if (this.stateEngine) {\n const result = this.stateEngine.clearStates();\n this.currentStates = [];\n return {\n changed: result.changed,\n states: [],\n effectiveStates: []\n };\n }\n\n const changed = this.hasState();\n this.currentStates = [];\n\n return {\n changed,\n states: []\n };\n }\n\n addState(stateName: string, keepCurrentStates?: boolean): IStateModelTransition {\n if (this.stateEngine) {\n const result = this.stateEngine.addState(stateName, keepCurrentStates);\n this.currentStates = [...result.activeStates];\n return {\n changed: result.changed,\n states: [...result.activeStates],\n effectiveStates: [...result.effectiveStates]\n };\n }\n\n if (\n this.currentStates &&\n this.currentStates.includes(stateName) &&\n (keepCurrentStates || this.currentStates.length === 1)\n ) {\n return {\n changed: false,\n states: this.getCurrentStates()\n };\n }\n\n const nextStates =\n keepCurrentStates && this.currentStates?.length ? this.currentStates.concat([stateName]) : [stateName];\n\n return this.useStates(nextStates);\n }\n\n removeState(stateName: string | string[]): IStateModelTransition {\n if (this.stateEngine) {\n const result = this.stateEngine.removeState(stateName);\n this.currentStates = [...result.activeStates];\n return {\n changed: result.changed,\n states: [...result.activeStates],\n effectiveStates: [...result.effectiveStates]\n };\n }\n\n if (!this.currentStates) {\n return {\n changed: false,\n states: []\n };\n }\n\n const filter = Array.isArray(stateName) ? (s: string) => !stateName.includes(s) : (s: string) => s !== stateName;\n const nextStates = this.currentStates.filter(filter);\n\n if (nextStates.length === this.currentStates.length) {\n return {\n changed: false,\n states: this.getCurrentStates()\n };\n }\n\n return this.useStates(nextStates);\n }\n\n toggleState(stateName: string): IStateModelTransition {\n if (this.stateEngine) {\n const result = this.stateEngine.toggleState(stateName);\n this.currentStates = [...result.activeStates];\n return {\n changed: result.changed,\n states: [...result.activeStates],\n effectiveStates: [...result.effectiveStates]\n };\n }\n\n if (this.hasState(stateName)) {\n return this.removeState(stateName);\n }\n\n const nextStates = this.currentStates ? this.currentStates.slice() : [];\n if (!nextStates.includes(stateName)) {\n nextStates.push(stateName);\n }\n\n return this.useStates(nextStates);\n }\n\n sortStates(states: string[]): string[] {\n if (this.stateEngine) {\n return [...this.stateEngine.activeStates];\n }\n\n if (!this.stateSort) {\n return [...states];\n }\n\n return [...states].sort(this.stateSort);\n }\n\n registerExclusiveGroup(groupName: string, states: string[]): void {\n const uniqueStates = Array.from(new Set(states));\n this.exclusiveGroups.set(groupName, uniqueStates);\n uniqueStates.forEach(stateName => this.exclusiveGroupMap.set(stateName, groupName));\n }\n\n getExclusiveGroup(stateName: string): string | undefined {\n return this.exclusiveGroupMap.get(stateName);\n }\n\n getMutuallyExclusiveStates(stateName: string): string[] {\n const groupName = this.getExclusiveGroup(stateName);\n if (!groupName) {\n return [];\n }\n\n return (this.exclusiveGroups.get(groupName) ?? []).filter(name => name !== stateName);\n }\n\n isMutuallyExclusive(stateA: string, stateB: string): boolean {\n const groupName = this.getExclusiveGroup(stateA);\n return !!groupName && groupName === this.getExclusiveGroup(stateB) && stateA !== stateB;\n }\n\n get effectiveStates(): ReadonlyArray<string> {\n return this.stateEngine?.effectiveStates ?? this.currentStates ?? [];\n }\n\n get resolvedPatch(): Partial<T> | undefined {\n return this.stateEngine?.resolvedPatch;\n }\n\n private sameStates(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index++) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n }\n}\n"]}