@oasys/oecs 0.5.3 → 0.6.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 (510) hide show
  1. package/CHANGELOG.md +1399 -276
  2. package/README.md +327 -169
  3. package/dist/core/ecs/access_check.d.cts +31 -31
  4. package/dist/core/ecs/access_check.d.ts +31 -31
  5. package/dist/core/ecs/access_check.d.ts.map +1 -1
  6. package/dist/core/ecs/archetype.d.cts +273 -205
  7. package/dist/core/ecs/archetype.d.ts +273 -205
  8. package/dist/core/ecs/archetype.d.ts.map +1 -1
  9. package/dist/core/ecs/archetype_closure.d.cts +23 -0
  10. package/dist/core/ecs/archetype_closure.d.ts +23 -0
  11. package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
  12. package/dist/core/ecs/archetype_graph.d.cts +34 -34
  13. package/dist/core/ecs/archetype_graph.d.ts +34 -34
  14. package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
  15. package/dist/core/ecs/archetype_types.d.cts +55 -0
  16. package/dist/core/ecs/archetype_types.d.ts +55 -0
  17. package/dist/core/ecs/archetype_types.d.ts.map +1 -0
  18. package/dist/core/ecs/change_feed.d.cts +53 -0
  19. package/dist/core/ecs/change_feed.d.ts +53 -0
  20. package/dist/core/ecs/change_feed.d.ts.map +1 -0
  21. package/dist/core/ecs/changed_query.d.cts +36 -0
  22. package/dist/core/ecs/changed_query.d.ts +36 -0
  23. package/dist/core/ecs/changed_query.d.ts.map +1 -0
  24. package/dist/core/ecs/chunk_columns.d.cts +49 -0
  25. package/dist/core/ecs/chunk_columns.d.ts +49 -0
  26. package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
  27. package/dist/core/ecs/command_log.d.cts +30 -30
  28. package/dist/core/ecs/command_log.d.ts +30 -30
  29. package/dist/core/ecs/command_log.d.ts.map +1 -1
  30. package/dist/core/ecs/component.d.cts +45 -44
  31. package/dist/core/ecs/component.d.ts +45 -44
  32. package/dist/core/ecs/component.d.ts.map +1 -1
  33. package/dist/core/ecs/component_registry.d.cts +53 -0
  34. package/dist/core/ecs/component_registry.d.ts +53 -0
  35. package/dist/core/ecs/component_registry.d.ts.map +1 -0
  36. package/dist/core/ecs/compute_backend.d.cts +18 -7
  37. package/dist/core/ecs/compute_backend.d.ts +18 -7
  38. package/dist/core/ecs/compute_backend.d.ts.map +1 -1
  39. package/dist/core/ecs/deferred_commands.d.cts +15 -14
  40. package/dist/core/ecs/deferred_commands.d.ts +15 -14
  41. package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
  42. package/dist/core/ecs/dispatch_trace.d.cts +32 -31
  43. package/dist/core/ecs/dispatch_trace.d.ts +32 -31
  44. package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
  45. package/dist/core/ecs/ecs.d.cts +337 -276
  46. package/dist/core/ecs/ecs.d.ts +337 -276
  47. package/dist/core/ecs/ecs.d.ts.map +1 -1
  48. package/dist/core/ecs/ecs_memory.d.cts +134 -136
  49. package/dist/core/ecs/ecs_memory.d.ts +134 -136
  50. package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
  51. package/dist/core/ecs/ecs_options.d.cts +89 -0
  52. package/dist/core/ecs/ecs_options.d.ts +89 -0
  53. package/dist/core/ecs/ecs_options.d.ts.map +1 -0
  54. package/dist/core/ecs/entity.d.cts +4 -4
  55. package/dist/core/ecs/entity.d.ts +4 -4
  56. package/dist/core/ecs/entity_allocator.d.cts +24 -22
  57. package/dist/core/ecs/entity_allocator.d.ts +24 -22
  58. package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
  59. package/dist/core/ecs/event.d.cts +37 -23
  60. package/dist/core/ecs/event.d.ts +37 -23
  61. package/dist/core/ecs/event.d.ts.map +1 -1
  62. package/dist/core/ecs/facades.d.cts +12 -126
  63. package/dist/core/ecs/facades.d.ts +12 -126
  64. package/dist/core/ecs/facades.d.ts.map +1 -1
  65. package/dist/core/ecs/frame_stepper.d.cts +12 -12
  66. package/dist/core/ecs/frame_stepper.d.ts +12 -12
  67. package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
  68. package/dist/core/ecs/frame_trace.d.cts +34 -34
  69. package/dist/core/ecs/frame_trace.d.ts +34 -34
  70. package/dist/core/ecs/frame_trace.d.ts.map +1 -1
  71. package/dist/core/ecs/host_commands.d.cts +107 -89
  72. package/dist/core/ecs/host_commands.d.ts +107 -89
  73. package/dist/core/ecs/host_commands.d.ts.map +1 -1
  74. package/dist/core/ecs/index.d.cts +22 -12
  75. package/dist/core/ecs/index.d.ts +22 -12
  76. package/dist/core/ecs/index.d.ts.map +1 -1
  77. package/dist/core/ecs/observer.d.cts +41 -122
  78. package/dist/core/ecs/observer.d.ts +41 -122
  79. package/dist/core/ecs/observer.d.ts.map +1 -1
  80. package/dist/core/ecs/phase.d.cts +79 -0
  81. package/dist/core/ecs/phase.d.ts +79 -0
  82. package/dist/core/ecs/phase.d.ts.map +1 -0
  83. package/dist/core/ecs/plugin.d.cts +125 -0
  84. package/dist/core/ecs/plugin.d.ts +125 -0
  85. package/dist/core/ecs/plugin.d.ts.map +1 -0
  86. package/dist/core/ecs/plugin_slots.d.cts +26 -0
  87. package/dist/core/ecs/plugin_slots.d.ts +26 -0
  88. package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
  89. package/dist/core/ecs/query.d.cts +219 -568
  90. package/dist/core/ecs/query.d.ts +219 -568
  91. package/dist/core/ecs/query.d.ts.map +1 -1
  92. package/dist/core/ecs/query_cache.d.cts +130 -0
  93. package/dist/core/ecs/query_cache.d.ts +130 -0
  94. package/dist/core/ecs/query_cache.d.ts.map +1 -0
  95. package/dist/core/ecs/query_registry.d.cts +47 -0
  96. package/dist/core/ecs/query_registry.d.ts +47 -0
  97. package/dist/core/ecs/query_registry.d.ts.map +1 -0
  98. package/dist/core/ecs/query_terms.d.cts +126 -0
  99. package/dist/core/ecs/query_terms.d.ts +126 -0
  100. package/dist/core/ecs/query_terms.d.ts.map +1 -0
  101. package/dist/core/ecs/ref.d.cts +129 -16
  102. package/dist/core/ecs/ref.d.ts +129 -16
  103. package/dist/core/ecs/ref.d.ts.map +1 -1
  104. package/dist/core/ecs/relation.d.cts +105 -186
  105. package/dist/core/ecs/relation.d.ts +105 -186
  106. package/dist/core/ecs/relation.d.ts.map +1 -1
  107. package/dist/core/ecs/resource.d.cts +14 -14
  108. package/dist/core/ecs/resource.d.ts +14 -14
  109. package/dist/core/ecs/resource_registry.d.cts +6 -6
  110. package/dist/core/ecs/resource_registry.d.ts +6 -6
  111. package/dist/core/ecs/resource_registry.d.ts.map +1 -1
  112. package/dist/core/ecs/row_kinds.d.cts +24 -0
  113. package/dist/core/ecs/row_kinds.d.ts +24 -0
  114. package/dist/core/ecs/row_kinds.d.ts.map +1 -0
  115. package/dist/core/ecs/run_condition.d.cts +23 -23
  116. package/dist/core/ecs/run_condition.d.ts +23 -23
  117. package/dist/core/ecs/run_condition.d.ts.map +1 -1
  118. package/dist/core/ecs/schedule.d.cts +98 -114
  119. package/dist/core/ecs/schedule.d.ts +98 -114
  120. package/dist/core/ecs/schedule.d.ts.map +1 -1
  121. package/dist/core/ecs/schedule_plan.d.cts +33 -0
  122. package/dist/core/ecs/schedule_plan.d.ts +33 -0
  123. package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
  124. package/dist/core/ecs/snapshot.d.cts +77 -0
  125. package/dist/core/ecs/snapshot.d.ts +77 -0
  126. package/dist/core/ecs/snapshot.d.ts.map +1 -0
  127. package/dist/core/ecs/snapshot_mount.d.cts +42 -0
  128. package/dist/core/ecs/snapshot_mount.d.ts +42 -0
  129. package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
  130. package/dist/core/ecs/sparse_store.d.cts +110 -53
  131. package/dist/core/ecs/sparse_store.d.ts +110 -53
  132. package/dist/core/ecs/sparse_store.d.ts.map +1 -1
  133. package/dist/core/ecs/store.d.cts +644 -511
  134. package/dist/core/ecs/store.d.ts +644 -511
  135. package/dist/core/ecs/store.d.ts.map +1 -1
  136. package/dist/core/ecs/store_layout_listener.d.cts +8 -8
  137. package/dist/core/ecs/store_layout_listener.d.ts +8 -8
  138. package/dist/core/ecs/store_types.d.cts +122 -0
  139. package/dist/core/ecs/store_types.d.ts +122 -0
  140. package/dist/core/ecs/store_types.d.ts.map +1 -0
  141. package/dist/core/ecs/system.d.cts +151 -66
  142. package/dist/core/ecs/system.d.ts +151 -66
  143. package/dist/core/ecs/system.d.ts.map +1 -1
  144. package/dist/core/ecs/system_context.d.cts +296 -0
  145. package/dist/core/ecs/system_context.d.ts +296 -0
  146. package/dist/core/ecs/system_context.d.ts.map +1 -0
  147. package/dist/core/ecs/system_set.d.cts +48 -0
  148. package/dist/core/ecs/system_set.d.ts +48 -0
  149. package/dist/core/ecs/system_set.d.ts.map +1 -0
  150. package/dist/core/ecs/utils/arrays.d.cts +15 -1
  151. package/dist/core/ecs/utils/arrays.d.ts +15 -1
  152. package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
  153. package/dist/core/ecs/utils/error.d.cts +87 -4
  154. package/dist/core/ecs/utils/error.d.ts +87 -4
  155. package/dist/core/ecs/utils/error.d.ts.map +1 -1
  156. package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
  157. package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
  158. package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
  159. package/dist/core/restore_errors.d.cts +30 -0
  160. package/dist/core/restore_errors.d.ts +30 -0
  161. package/dist/core/restore_errors.d.ts.map +1 -0
  162. package/dist/core/store/action_ring.d.cts +48 -49
  163. package/dist/core/store/action_ring.d.ts +48 -49
  164. package/dist/core/store/action_ring.d.ts.map +1 -1
  165. package/dist/core/store/allocator.d.cts +166 -114
  166. package/dist/core/store/allocator.d.ts +166 -114
  167. package/dist/core/store/allocator.d.ts.map +1 -1
  168. package/dist/core/store/buffer_backed_column.d.cts +21 -22
  169. package/dist/core/store/buffer_backed_column.d.ts +21 -22
  170. package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
  171. package/dist/core/store/column_store.d.cts +138 -100
  172. package/dist/core/store/column_store.d.ts +138 -100
  173. package/dist/core/store/column_store.d.ts.map +1 -1
  174. package/dist/core/store/command_dispatch.d.cts +14 -15
  175. package/dist/core/store/command_dispatch.d.ts +14 -15
  176. package/dist/core/store/command_dispatch.d.ts.map +1 -1
  177. package/dist/core/store/command_ring.d.cts +41 -45
  178. package/dist/core/store/command_ring.d.ts +41 -45
  179. package/dist/core/store/command_ring.d.ts.map +1 -1
  180. package/dist/core/store/descriptor.d.cts +35 -18
  181. package/dist/core/store/descriptor.d.ts +35 -18
  182. package/dist/core/store/descriptor.d.ts.map +1 -1
  183. package/dist/core/store/entity_index.d.cts +34 -35
  184. package/dist/core/store/entity_index.d.ts +34 -35
  185. package/dist/core/store/entity_index.d.ts.map +1 -1
  186. package/dist/core/store/event_ring.d.cts +40 -42
  187. package/dist/core/store/event_ring.d.ts +40 -42
  188. package/dist/core/store/event_ring.d.ts.map +1 -1
  189. package/dist/core/store/extend.d.cts +15 -9
  190. package/dist/core/store/extend.d.ts +15 -9
  191. package/dist/core/store/extend.d.ts.map +1 -1
  192. package/dist/core/store/grow.d.cts +3 -3
  193. package/dist/core/store/grow.d.ts +3 -3
  194. package/dist/core/store/grow.d.ts.map +1 -1
  195. package/dist/core/store/header.d.cts +37 -33
  196. package/dist/core/store/header.d.ts +37 -33
  197. package/dist/core/store/header.d.ts.map +1 -1
  198. package/dist/core/store/index.d.cts +10 -10
  199. package/dist/core/store/index.d.ts +10 -10
  200. package/dist/core/store/index.d.ts.map +1 -1
  201. package/dist/core/store/layout_ops.d.cts +72 -63
  202. package/dist/core/store/layout_ops.d.ts +72 -63
  203. package/dist/core/store/layout_ops.d.ts.map +1 -1
  204. package/dist/core/store/region_table.d.cts +28 -21
  205. package/dist/core/store/region_table.d.ts +28 -21
  206. package/dist/core/store/region_table.d.ts.map +1 -1
  207. package/dist/core/store/snapshot.d.cts +31 -16
  208. package/dist/core/store/snapshot.d.ts +31 -16
  209. package/dist/core/store/snapshot.d.ts.map +1 -1
  210. package/dist/core/store/state_hash.d.cts +14 -14
  211. package/dist/core/store/state_hash.d.ts +14 -14
  212. package/dist/core/store/state_hash.d.ts.map +1 -1
  213. package/dist/core/store/store_regions.d.cts +10 -10
  214. package/dist/core/store/store_regions.d.ts +10 -10
  215. package/dist/core/store/store_regions.d.ts.map +1 -1
  216. package/dist/core/store/vendored_abi/abi.d.cts +27 -2
  217. package/dist/core/store/vendored_abi/abi.d.ts +27 -2
  218. package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
  219. package/dist/host_commands-B2KMx8O2.cjs +1 -0
  220. package/dist/host_commands-ClVPvhSa.cjs +2 -0
  221. package/dist/host_commands-CwxVQS1z.js +1524 -0
  222. package/dist/host_commands-nJvTy88E.js +1667 -0
  223. package/dist/index.cjs +1 -1
  224. package/dist/index.d.cts +16 -11
  225. package/dist/index.d.ts +16 -11
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.development.cjs +1 -1
  228. package/dist/index.development.js +6709 -5729
  229. package/dist/index.js +5664 -4743
  230. package/dist/internal.cjs +2 -2
  231. package/dist/internal.d.cts +5 -2
  232. package/dist/internal.d.ts +5 -2
  233. package/dist/internal.d.ts.map +1 -1
  234. package/dist/internal.development.cjs +1 -1
  235. package/dist/internal.development.js +70 -20
  236. package/dist/internal.js +138 -83
  237. package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
  238. package/dist/plugins/abi-NP8pNxpd.js +42 -0
  239. package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
  240. package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
  241. package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
  242. package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
  243. package/dist/{extensions → plugins}/editor/editor.d.cts +56 -56
  244. package/dist/{extensions → plugins}/editor/editor.d.ts +56 -56
  245. package/dist/plugins/editor/editor.d.ts.map +1 -0
  246. package/dist/{extensions → plugins}/editor/field_handle.d.cts +13 -13
  247. package/dist/{extensions → plugins}/editor/field_handle.d.ts +13 -13
  248. package/dist/plugins/editor/field_handle.d.ts.map +1 -0
  249. package/dist/plugins/editor/index.d.cts +22 -0
  250. package/dist/plugins/editor/index.d.ts +22 -0
  251. package/dist/plugins/editor/index.d.ts.map +1 -0
  252. package/dist/plugins/editor.cjs +1 -0
  253. package/dist/plugins/editor.d.cts +1 -0
  254. package/dist/plugins/editor.d.ts +1 -0
  255. package/dist/plugins/editor.development.cjs +1 -0
  256. package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +83 -66
  257. package/dist/{extensions/editor/index.js → plugins/editor.js} +83 -66
  258. package/dist/plugins/events/event_channel.d.cts +13 -0
  259. package/dist/plugins/events/event_channel.d.ts +13 -0
  260. package/dist/plugins/events/event_channel.d.ts.map +1 -0
  261. package/dist/plugins/events/event_registry.d.cts +22 -0
  262. package/dist/plugins/events/event_registry.d.ts +22 -0
  263. package/dist/plugins/events/event_registry.d.ts.map +1 -0
  264. package/dist/plugins/events/facade.d.cts +26 -0
  265. package/dist/plugins/events/facade.d.ts +26 -0
  266. package/dist/plugins/events/facade.d.ts.map +1 -0
  267. package/dist/plugins/events/index.d.cts +10 -0
  268. package/dist/plugins/events/index.d.ts +10 -0
  269. package/dist/plugins/events/index.d.ts.map +1 -0
  270. package/dist/plugins/events.cjs +1 -0
  271. package/dist/plugins/events.d.cts +1 -0
  272. package/dist/plugins/events.d.ts +1 -0
  273. package/dist/plugins/events.development.cjs +1 -0
  274. package/dist/plugins/events.development.js +174 -0
  275. package/dist/plugins/events.js +159 -0
  276. package/dist/plugins/observers/index.d.cts +23 -0
  277. package/dist/plugins/observers/index.d.ts +23 -0
  278. package/dist/plugins/observers/index.d.ts.map +1 -0
  279. package/dist/plugins/observers/observer_registry.d.cts +101 -0
  280. package/dist/plugins/observers/observer_registry.d.ts +101 -0
  281. package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
  282. package/dist/plugins/observers.cjs +1 -0
  283. package/dist/plugins/observers.d.cts +1 -0
  284. package/dist/plugins/observers.d.ts +1 -0
  285. package/dist/plugins/observers.development.cjs +1 -0
  286. package/dist/plugins/observers.development.js +431 -0
  287. package/dist/plugins/observers.js +403 -0
  288. package/dist/plugins/relation_store-BsoegrZh.js +313 -0
  289. package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
  290. package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
  291. package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
  292. package/dist/plugins/relations/builtin_relations.d.cts +48 -0
  293. package/dist/plugins/relations/builtin_relations.d.ts +48 -0
  294. package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
  295. package/dist/plugins/relations/facade.d.cts +73 -0
  296. package/dist/plugins/relations/facade.d.ts +73 -0
  297. package/dist/plugins/relations/facade.d.ts.map +1 -0
  298. package/dist/plugins/relations/index.d.cts +11 -0
  299. package/dist/plugins/relations/index.d.ts +11 -0
  300. package/dist/plugins/relations/index.d.ts.map +1 -0
  301. package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +93 -105
  302. package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +93 -105
  303. package/dist/plugins/relations/relation_service.d.ts.map +1 -0
  304. package/dist/plugins/relations/relation_store.d.cts +177 -0
  305. package/dist/plugins/relations/relation_store.d.ts +177 -0
  306. package/dist/plugins/relations/relation_store.d.ts.map +1 -0
  307. package/dist/plugins/relations.cjs +1 -0
  308. package/dist/plugins/relations.d.cts +1 -0
  309. package/dist/plugins/relations.d.ts +1 -0
  310. package/dist/plugins/relations.development.cjs +1 -0
  311. package/dist/plugins/relations.development.js +603 -0
  312. package/dist/plugins/relations.js +553 -0
  313. package/dist/plugins/snapshots/index.d.cts +33 -0
  314. package/dist/plugins/snapshots/index.d.ts +33 -0
  315. package/dist/plugins/snapshots/index.d.ts.map +1 -0
  316. package/dist/plugins/snapshots/resume.d.cts +57 -0
  317. package/dist/plugins/snapshots/resume.d.ts +57 -0
  318. package/dist/plugins/snapshots/resume.d.ts.map +1 -0
  319. package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
  320. package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
  321. package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
  322. package/dist/plugins/snapshots.cjs +1 -0
  323. package/dist/plugins/snapshots.d.cts +1 -0
  324. package/dist/plugins/snapshots.d.ts +1 -0
  325. package/dist/plugins/snapshots.development.cjs +1 -0
  326. package/dist/plugins/snapshots.development.js +737 -0
  327. package/dist/plugins/snapshots.js +737 -0
  328. package/dist/plugins/solid/index.d.cts +8 -0
  329. package/dist/plugins/solid/index.d.ts +8 -0
  330. package/dist/plugins/solid/index.d.ts.map +1 -0
  331. package/dist/plugins/solid/solid.d.cts +97 -0
  332. package/dist/plugins/solid/solid.d.ts +97 -0
  333. package/dist/plugins/solid/solid.d.ts.map +1 -0
  334. package/dist/plugins/solid.cjs +1 -0
  335. package/dist/plugins/solid.d.cts +1 -0
  336. package/dist/plugins/solid.d.ts +1 -0
  337. package/dist/plugins/solid.development.cjs +1 -0
  338. package/dist/plugins/solid.development.js +319 -0
  339. package/dist/plugins/solid.js +319 -0
  340. package/dist/plugins/workers/index.d.cts +75 -0
  341. package/dist/plugins/workers/index.d.ts +75 -0
  342. package/dist/plugins/workers/index.d.ts.map +1 -0
  343. package/dist/plugins/workers/node_threads.d.cts +25 -0
  344. package/dist/plugins/workers/node_threads.d.ts +25 -0
  345. package/dist/plugins/workers/node_threads.d.ts.map +1 -0
  346. package/dist/plugins/workers/plan.d.cts +61 -0
  347. package/dist/plugins/workers/plan.d.ts +61 -0
  348. package/dist/plugins/workers/plan.d.ts.map +1 -0
  349. package/dist/plugins/workers/pool.d.cts +144 -0
  350. package/dist/plugins/workers/pool.d.ts +144 -0
  351. package/dist/plugins/workers/pool.d.ts.map +1 -0
  352. package/dist/plugins/workers/protocol.d.cts +112 -0
  353. package/dist/plugins/workers/protocol.d.ts +112 -0
  354. package/dist/plugins/workers/protocol.d.ts.map +1 -0
  355. package/dist/plugins/workers/worker_bind.d.cts +64 -0
  356. package/dist/plugins/workers/worker_bind.d.ts +64 -0
  357. package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
  358. package/dist/plugins/workers/worker_loop.d.cts +14 -0
  359. package/dist/plugins/workers/worker_loop.d.ts +14 -0
  360. package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
  361. package/dist/plugins/workers.cjs +1 -0
  362. package/dist/plugins/workers.d.cts +1 -0
  363. package/dist/plugins/workers.d.ts +1 -0
  364. package/dist/plugins/workers.development.cjs +1 -0
  365. package/dist/plugins/workers.development.js +596 -0
  366. package/dist/plugins/workers.js +474 -0
  367. package/dist/primitives.cjs +1 -1
  368. package/dist/primitives.d.cts +4 -4
  369. package/dist/primitives.d.ts +4 -4
  370. package/dist/primitives.development.cjs +1 -1
  371. package/dist/primitives.development.js +66 -22
  372. package/dist/primitives.js +66 -22
  373. package/dist/shared-BKl12xF1.js +132 -0
  374. package/dist/shared-Dk-pACZT.cjs +1 -0
  375. package/dist/shared.cjs +1 -1
  376. package/dist/shared.d.cts +7 -7
  377. package/dist/shared.d.ts +7 -7
  378. package/dist/shared.d.ts.map +1 -1
  379. package/dist/shared.development.cjs +1 -1
  380. package/dist/shared.development.js +4 -3
  381. package/dist/shared.js +4 -3
  382. package/dist/topological_sort-Cc_yXqPT.js +346 -0
  383. package/dist/topological_sort-vp1imU6D.cjs +1 -0
  384. package/dist/type_primitives/assertions.d.cts +12 -16
  385. package/dist/type_primitives/assertions.d.ts +12 -16
  386. package/dist/type_primitives/assertions.d.ts.map +1 -1
  387. package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
  388. package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
  389. package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
  390. package/dist/type_primitives/bitset/bitset.d.cts +7 -11
  391. package/dist/type_primitives/bitset/bitset.d.ts +7 -11
  392. package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
  393. package/dist/type_primitives/brand.d.cts +2 -7
  394. package/dist/type_primitives/brand.d.ts +2 -7
  395. package/dist/type_primitives/brand.d.ts.map +1 -1
  396. package/dist/type_primitives/error.d.cts +1 -2
  397. package/dist/type_primitives/error.d.ts +1 -2
  398. package/dist/type_primitives/error.d.ts.map +1 -1
  399. package/dist/type_primitives/index.d.cts +1 -1
  400. package/dist/type_primitives/index.d.ts +1 -1
  401. package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
  402. package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
  403. package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
  404. package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
  405. package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
  406. package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
  407. package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
  408. package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
  409. package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
  410. package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +18 -17
  411. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +18 -17
  412. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
  413. package/dist/utils/error.d.ts.map +1 -1
  414. package/dist/version.d.cts +4 -4
  415. package/dist/version.d.ts +4 -4
  416. package/dist/worker.cjs +1 -0
  417. package/dist/worker.d.cts +17 -0
  418. package/dist/worker.d.ts +17 -0
  419. package/dist/worker.d.ts.map +1 -0
  420. package/dist/worker.development.cjs +1 -0
  421. package/dist/worker.development.js +253 -0
  422. package/dist/worker.js +253 -0
  423. package/package.json +363 -191
  424. package/dist/core/ecs/builtin_relations.d.cts +0 -43
  425. package/dist/core/ecs/builtin_relations.d.ts +0 -43
  426. package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
  427. package/dist/core/ecs/event_registry.d.cts +0 -22
  428. package/dist/core/ecs/event_registry.d.ts +0 -22
  429. package/dist/core/ecs/event_registry.d.ts.map +0 -1
  430. package/dist/core/ecs/relation_service.d.ts.map +0 -1
  431. package/dist/core/ecs/resume.d.cts +0 -85
  432. package/dist/core/ecs/resume.d.ts +0 -85
  433. package/dist/core/ecs/resume.d.ts.map +0 -1
  434. package/dist/core/ecs/snapshot_service.d.cts +0 -94
  435. package/dist/core/ecs/snapshot_service.d.ts +0 -94
  436. package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
  437. package/dist/extensions/editor/editor.d.ts.map +0 -1
  438. package/dist/extensions/editor/field_handle.d.ts.map +0 -1
  439. package/dist/extensions/editor/index.cjs +0 -1
  440. package/dist/extensions/editor/index.d.cts +0 -21
  441. package/dist/extensions/editor/index.d.ts +0 -21
  442. package/dist/extensions/editor/index.d.ts.map +0 -1
  443. package/dist/extensions/editor/index.development.cjs +0 -1
  444. package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
  445. package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
  446. package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
  447. package/dist/extensions/reactive/index.cjs +0 -1
  448. package/dist/extensions/reactive/index.d.cts +0 -23
  449. package/dist/extensions/reactive/index.d.ts +0 -23
  450. package/dist/extensions/reactive/index.d.ts.map +0 -1
  451. package/dist/extensions/reactive/index.development.cjs +0 -1
  452. package/dist/extensions/reactive/index.development.js +0 -215
  453. package/dist/extensions/reactive/index.js +0 -215
  454. package/dist/extensions/solid/index.cjs +0 -1
  455. package/dist/extensions/solid/index.d.cts +0 -6
  456. package/dist/extensions/solid/index.d.ts +0 -6
  457. package/dist/extensions/solid/index.d.ts.map +0 -1
  458. package/dist/extensions/solid/index.development.cjs +0 -1
  459. package/dist/extensions/solid/index.development.js +0 -40
  460. package/dist/extensions/solid/index.js +0 -36
  461. package/dist/extensions/solid/kernel_solid.d.cts +0 -45
  462. package/dist/extensions/solid/kernel_solid.d.ts +0 -45
  463. package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
  464. package/dist/host_commands-3jyFfWNg.js +0 -2326
  465. package/dist/host_commands-DNf0f6ko.cjs +0 -1
  466. package/dist/internal-C9jjL90H.js +0 -2485
  467. package/dist/internal-RZN14uMw.cjs +0 -2
  468. package/dist/interop-CT-REx0W.cjs +0 -1
  469. package/dist/interop-CcY6ASQc.js +0 -18
  470. package/dist/interop-DqxleBo7.js +0 -18
  471. package/dist/interop-T1HZ-Dpa.cjs +0 -1
  472. package/dist/kernel-Cz2Kxlwl.js +0 -240
  473. package/dist/kernel-DgyrLFjW.js +0 -227
  474. package/dist/kernel-sw7ScKWu.cjs +0 -1
  475. package/dist/kernel-yWV3XnAb.cjs +0 -1
  476. package/dist/reactive/array.d.cts +0 -24
  477. package/dist/reactive/array.d.ts +0 -24
  478. package/dist/reactive/array.d.ts.map +0 -1
  479. package/dist/reactive/index.cjs +0 -1
  480. package/dist/reactive/index.d.cts +0 -11
  481. package/dist/reactive/index.d.ts +0 -11
  482. package/dist/reactive/index.d.ts.map +0 -1
  483. package/dist/reactive/index.development.cjs +0 -1
  484. package/dist/reactive/index.development.js +0 -18
  485. package/dist/reactive/index.js +0 -18
  486. package/dist/reactive/interop.d.cts +0 -19
  487. package/dist/reactive/interop.d.ts +0 -19
  488. package/dist/reactive/interop.d.ts.map +0 -1
  489. package/dist/reactive/kernel.d.cts +0 -73
  490. package/dist/reactive/kernel.d.ts +0 -73
  491. package/dist/reactive/kernel.d.ts.map +0 -1
  492. package/dist/reactive/map.d.cts +0 -16
  493. package/dist/reactive/map.d.ts +0 -16
  494. package/dist/reactive/map.d.ts.map +0 -1
  495. package/dist/reactive/shallow.d.cts +0 -11
  496. package/dist/reactive/shallow.d.ts +0 -11
  497. package/dist/reactive/shallow.d.ts.map +0 -1
  498. package/dist/reactive/struct.d.cts +0 -10
  499. package/dist/reactive/struct.d.ts +0 -10
  500. package/dist/reactive/struct.d.ts.map +0 -1
  501. package/dist/shallow-9S1pY_Iw.js +0 -159
  502. package/dist/shallow-C5YmTbtb.cjs +0 -1
  503. package/dist/shallow-DQ8aG51_.cjs +0 -1
  504. package/dist/shallow-DfnAm9vG.js +0 -150
  505. package/dist/shared-BMXh9hxm.cjs +0 -1
  506. package/dist/shared-DQKK0i-E.js +0 -109
  507. package/dist/topological_sort-BDvEyb9W.cjs +0 -1
  508. package/dist/topological_sort-DK6EjpWa.js +0 -135
  509. package/dist/typed_arrays-BcXcnzB4.js +0 -258
  510. package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
@@ -0,0 +1,596 @@
1
+ import { C as f } from "./abi-NP8pNxpd.js";
2
+ import { ECSError as l, ECS_ERROR as c } from "../index.development.js";
3
+ async function N() {
4
+ const s = globalThis.process, e = s?.getBuiltinModule;
5
+ return typeof e == "function" ? e.call(s, "node:worker_threads") : await import(["node", "worker_threads"].join(":"));
6
+ }
7
+ const _ = 0, p = 1, k = 2, L = 3, R = 4, S = R + f, C = S + f, T = C + 1, $ = T + 1 >> 1, O = ($ + 1) * 8, P = -1, I = -2, E = 16, g = 65536, D = 3e4;
8
+ function M(s) {
9
+ if (s === void 0) return 0;
10
+ if (!Number.isInteger(s) || s < 1)
11
+ throw new l(
12
+ c.WORKERS_COUNT_INVALID,
13
+ `workers.attach: stackBytes must be an integer >= 1, got ${String(s)}`
14
+ );
15
+ if (s % E !== 0)
16
+ throw new l(
17
+ c.WORKERS_COUNT_INVALID,
18
+ `workers.attach: stackBytes must be a multiple of ${E}, the frame alignment of a wasm shadow stack, got ${s}`
19
+ );
20
+ if (s < g)
21
+ throw new l(
22
+ c.WORKERS_COUNT_INVALID,
23
+ `workers.attach: stackBytes must be at least ${g}, one WASM page, got ${s}`
24
+ );
25
+ return s;
26
+ }
27
+ function W() {
28
+ try {
29
+ const s = new Int32Array(new SharedArrayBuffer(4));
30
+ return Atomics.wait(s, 0, 1, 0), !0;
31
+ } catch {
32
+ return !1;
33
+ }
34
+ }
35
+ function K() {
36
+ const s = globalThis.process;
37
+ return typeof s == "object" && s !== null && typeof s.versions?.node == "string";
38
+ }
39
+ function U() {
40
+ const s = globalThis.navigator?.hardwareConcurrency;
41
+ return typeof s != "number" || !Number.isFinite(s) ? 1 : Math.max(1, Math.floor(s) - 1);
42
+ }
43
+ function q() {
44
+ const s = new URL(import.meta.url), e = s.pathname, t = e.lastIndexOf("/"), o = e.slice(t + 1), n = o.indexOf("."), r = e.slice(0, t), a = r.slice(0, r.lastIndexOf("/") + 1);
45
+ return s.pathname = `${a}worker${n < 0 ? "" : o.slice(n)}`, s;
46
+ }
47
+ class v {
48
+ _waiting = /* @__PURE__ */ new Map();
49
+ _arrived = /* @__PURE__ */ new Map();
50
+ _failure = null;
51
+ deliver(e) {
52
+ const t = e.slot === void 0 ? e.type : `${e.type}:${e.slot}`, o = this._waiting.get(t);
53
+ if (o !== void 0 && o.length > 0) {
54
+ o.shift()(e);
55
+ return;
56
+ }
57
+ const n = this._arrived.get(t);
58
+ n === void 0 ? this._arrived.set(t, [e]) : n.push(e);
59
+ }
60
+ /** A worker that died answers nothing. Without this every wait outstanding
61
+ * on it would sit there for the life of the process. */
62
+ fail(e) {
63
+ this._failure = e;
64
+ for (const t of this._waiting.values())
65
+ for (; t.length > 0; ) t.shift()({ type: "kernel", error: e });
66
+ this._waiting.clear();
67
+ }
68
+ expect(e, t) {
69
+ if (this._failure !== null) return Promise.resolve({ type: e, slot: t, error: this._failure });
70
+ const o = t === void 0 ? e : `${e}:${t}`, n = this._arrived.get(o);
71
+ return n !== void 0 && n.length > 0 ? Promise.resolve(n.shift()) : new Promise((r) => {
72
+ const a = this._waiting.get(o);
73
+ a === void 0 ? this._waiting.set(o, [r]) : a.push(r);
74
+ });
75
+ }
76
+ }
77
+ async function B(s, e) {
78
+ const t = await N();
79
+ return e.map((o) => {
80
+ const n = new t.Worker(s, { workerData: o }), r = new v();
81
+ return n.on("message", (a) => r.deliver(a)), n.on("error", (a) => r.fail(a.message)), {
82
+ post: (a) => n.postMessage(a),
83
+ expect: (a, u) => r.expect(a, u),
84
+ terminate: () => n.terminate()
85
+ };
86
+ });
87
+ }
88
+ function j(s, e) {
89
+ return e.map((t) => {
90
+ const o = new Worker(s, { type: "module" }), n = new v();
91
+ return o.addEventListener(
92
+ "message",
93
+ (r) => n.deliver(r.data)
94
+ ), o.addEventListener("error", (r) => {
95
+ const a = r.message;
96
+ n.fail(
97
+ typeof a == "string" && a !== "" ? a : `the script at '${String(s)}' did not load`
98
+ );
99
+ }), o.postMessage(t), {
100
+ post: (r) => o.postMessage(r),
101
+ expect: (r, a) => n.expect(r, a),
102
+ terminate: () => (o.terminate(), Promise.resolve())
103
+ };
104
+ });
105
+ }
106
+ class y {
107
+ _world;
108
+ _workers;
109
+ _ctl;
110
+ _ctlF64;
111
+ _joinTimeoutMs;
112
+ _state = "idle";
113
+ _epoch = 0;
114
+ _nextSlot = 0;
115
+ _pending = [];
116
+ _syncing = Promise.resolve();
117
+ constructor(e, t, o, n) {
118
+ this._world = e, this._workers = t, this._ctl = new Int32Array(o), this._ctlF64 = new Float64Array(o), this._joinTimeoutMs = n;
119
+ }
120
+ /** How many workers the pool runs. */
121
+ get count() {
122
+ return this._workers.length;
123
+ }
124
+ /**
125
+ * Start the workers, hand each the store and the control buffer, and load
126
+ * every kernel the world has declared. Resolves when each worker is parked on
127
+ * the barrier with its kernels in hand. Cold path, and a caller runs it once.
128
+ *
129
+ * Throws `WORKERS_ENTRY_UNREACHABLE` when a worker's script does not load,
130
+ * which is what a wrong `workerUrl` looks like from here.
131
+ */
132
+ static async attach(e, t) {
133
+ if (!W())
134
+ throw new l(
135
+ c.WORKERS_HOST_CANNOT_PARK,
136
+ "workers.attach: this host refuses Atomics.wait, so it cannot park while the workers run. Host the world inside a worker and attach the pool from there."
137
+ );
138
+ const o = t?.count ?? U();
139
+ if (!Number.isInteger(o) || o < 1)
140
+ throw new l(
141
+ c.WORKERS_COUNT_INVALID,
142
+ `workers.attach: count must be an integer >= 1, got ${String(o)}`
143
+ );
144
+ const n = t?.joinTimeoutMs ?? D;
145
+ if (!Number.isInteger(n) || n < 1)
146
+ throw new l(
147
+ c.WORKERS_COUNT_INVALID,
148
+ `workers.attach: joinTimeoutMs must be an integer >= 1, got ${String(n)}`
149
+ );
150
+ const r = M(t?.stackBytes), a = new SharedArrayBuffer(O), u = [];
151
+ for (let d = 0; d < o; d++)
152
+ u.push({
153
+ store: e.store,
154
+ storeBase: e.storeBase,
155
+ control: a,
156
+ index: d,
157
+ count: o,
158
+ stackBytes: r
159
+ });
160
+ const m = t?.workerUrl ?? q(), h = K() ? await B(m, u) : j(m, u), i = await Promise.all(h.map((d) => d.expect("ready")));
161
+ for (let d = 0; d < i.length; d++) {
162
+ const A = i[d].error;
163
+ if (A !== void 0)
164
+ throw await Promise.all(h.map((x) => x.terminate())), new l(
165
+ c.WORKERS_ENTRY_UNREACHABLE,
166
+ `workers.attach: worker ${d} did not start from '${String(m)}': ${A}. Pass workerUrl with the URL your bundler emits for the '@oasys/oecs/worker' entry.`
167
+ );
168
+ }
169
+ const w = new y(e, h, a, n);
170
+ for (const d of e.plans()) w._pending.push(d);
171
+ w._kick();
172
+ try {
173
+ await w.settled();
174
+ } catch (d) {
175
+ throw await w.detach(), d;
176
+ }
177
+ return w;
178
+ }
179
+ /** Take one kernel. The system runs `fn` until every worker holds it. */
180
+ register(e) {
181
+ this._state === "detached" || this._state === "failed" || (this._pending.push(e), this._kick());
182
+ }
183
+ _kick() {
184
+ this._syncing = this._syncing.then(() => this._sync());
185
+ }
186
+ /** Resolves when every kernel registered so far is loaded on every worker.
187
+ * Rejects with `PARALLEL_KERNEL_FAILED` when one would not load. */
188
+ settled() {
189
+ return this._syncing;
190
+ }
191
+ async _sync() {
192
+ if (this._state === "detached" || this._state === "failed") return;
193
+ const e = this._pending;
194
+ this._pending = [], e.length > 0 && this._state === "running" && await this._park();
195
+ for (const t of e) {
196
+ t.slot = this._nextSlot++;
197
+ const o = {
198
+ type: "kernel",
199
+ slot: t.slot,
200
+ wasm: t.kernel.wasm,
201
+ js: t.kernel.js,
202
+ exportName: t.exportName,
203
+ specs: t.specs
204
+ }, n = await Promise.all(
205
+ this._workers.map((r) => (r.post(o), r.expect("kernel", t.slot)))
206
+ );
207
+ for (let r = 0; r < n.length; r++) {
208
+ const a = n[r].error;
209
+ if (a !== void 0)
210
+ throw new l(
211
+ c.PARALLEL_KERNEL_FAILED,
212
+ `worker ${r} could not load the kernel export '${t.exportName}': ${String(a).replace(/\.$/, "")}. Check the module and the export name.`
213
+ );
214
+ }
215
+ t.ready = !0;
216
+ }
217
+ this._resume();
218
+ }
219
+ /** Release every worker out of the barrier loop, so each can take a message
220
+ * again. A parked worker runs no message callback. */
221
+ async _park() {
222
+ this._state = "idle";
223
+ const e = this._ctl;
224
+ Atomics.store(e, k, P), Atomics.store(e, _, ++this._epoch), Atomics.notify(e, _), await Promise.all(this._workers.map((t) => t.expect("yielded")));
225
+ }
226
+ _resume() {
227
+ if (this._state === "idle") {
228
+ for (const e of this._workers) e.post({ type: "run" });
229
+ this._state = "running";
230
+ }
231
+ }
232
+ /**
233
+ * Run one parallel system across the pool, or say no.
234
+ *
235
+ * Returns `false` when the kernel is not loaded yet, when the pool is not on
236
+ * the barrier, when an earlier pass timed out, or when the matched row count
237
+ * is below the system's threshold. The caller then runs the sequential body,
238
+ * which is the same answer.
239
+ *
240
+ * Throws `PARALLEL_KERNEL_FAILED` when a kernel throws, and when a worker
241
+ * misses the join inside `joinTimeoutMs`. The second case is a dead or hung
242
+ * worker, which reports nothing, so the pool fails the pass itself.
243
+ *
244
+ * Hot path. The host parks for the length of the pass, so no structural
245
+ * change can overlap it.
246
+ */
247
+ run(e, t, o, n) {
248
+ if (!e.ready || this._state !== "running" || (t.publishRowCounts(), e.query.entityCount < e.minRows)) return !1;
249
+ const r = this._ctl, a = e.exclude;
250
+ Atomics.store(r, p, 0), Atomics.store(r, L, 0);
251
+ for (let i = 0; i < f; i++)
252
+ r[R + i] = e.include[i] | 0, r[S + i] = a === null ? 0 : a[i] | 0;
253
+ r[C] = a === null ? 0 : 1, this._ctlF64[$] = o, Atomics.store(r, k, e.slot), Atomics.store(r, _, ++this._epoch), Atomics.notify(r, _);
254
+ const u = this._workers.length, m = performance.now() + this._joinTimeoutMs;
255
+ for (; ; ) {
256
+ const i = Atomics.load(r, p);
257
+ if (i === u) break;
258
+ const w = m - performance.now();
259
+ if (w <= 0)
260
+ throw this._stamp(e, n), this._state = "failed", new l(
261
+ c.PARALLEL_KERNEL_FAILED,
262
+ `a worker did not reach the join of the kernel export '${e.exportName}' within joinTimeoutMs of ${this._joinTimeoutMs}. The world holds whatever the pass wrote, and every later frame runs the sequential body. Detach the pool and fix the kernel.`
263
+ );
264
+ Atomics.wait(r, p, i, w);
265
+ }
266
+ this._stamp(e, n);
267
+ const h = Atomics.load(r, L);
268
+ if (h !== 0)
269
+ throw new l(
270
+ c.PARALLEL_KERNEL_FAILED,
271
+ `worker ${h - 1} threw inside the kernel export '${e.exportName}'. The world is unchanged for the rows that worker owned. Fix the kernel, or lower parallel.minRows to keep the system sequential.`
272
+ );
273
+ return !0;
274
+ }
275
+ /**
276
+ * Stamp what the pass changed.
277
+ *
278
+ * The row tick plane and the dirty lists are main-thread JS, so the join does
279
+ * this and not the workers. `columnGroupMut` makes the same archetype stamp a
280
+ * system body makes, which is why that logic is not written twice here.
281
+ *
282
+ * The row ticks follow the same shape a chunk loop takes when it reads
283
+ * `cols.ticks`: fill the plane, then tell the store to scan it. Without the
284
+ * fill an entity-level `onSet` observer would see nothing, because the
285
+ * archetype stamp alone carries no row.
286
+ *
287
+ * Coarse on purpose: a parallel system reports every row of every matched
288
+ * archetype as changed. A finer stamp is open.
289
+ */
290
+ _stamp(e, t) {
291
+ const o = e.query.archetypes, n = e.writes;
292
+ for (let r = 0; r < o.length; r++) {
293
+ const a = o[r];
294
+ if (a.hasColumns)
295
+ for (let u = 0; u < n.length; u++) {
296
+ const m = n[u];
297
+ a.columnGroupMut(m, t);
298
+ const h = a.rowTicks[m.id];
299
+ h !== void 0 && h.fill(t, 0, a.enabledCount);
300
+ }
301
+ }
302
+ for (let r = 0; r < n.length; r++) this._world.noteScan(n[r].id);
303
+ }
304
+ /**
305
+ * Stop every worker and release the pool. Idempotent.
306
+ *
307
+ * `terminate` ends a worker that is spinning inside a kernel, so this is the
308
+ * way out of a pool a join timeout failed. A failed pool is never released
309
+ * back into the barrier, so no stop job is written for it.
310
+ */
311
+ async detach() {
312
+ if (this._state === "detached") return;
313
+ try {
314
+ await this._syncing;
315
+ } catch {
316
+ }
317
+ const e = this._state === "running";
318
+ if (this._state = "detached", this._pending.length = 0, e) {
319
+ const t = this._ctl;
320
+ Atomics.store(t, k, I), Atomics.store(t, _, ++this._epoch), Atomics.notify(t, _);
321
+ }
322
+ await Promise.all(this._workers.map((t) => t.terminate()));
323
+ for (const t of this._world.plans())
324
+ t.ready = !1, t.slot = -1;
325
+ this._world.released();
326
+ }
327
+ }
328
+ const F = 2e5;
329
+ function H(s, e, t) {
330
+ const o = WebAssembly.Module.imports(e);
331
+ let n = !1;
332
+ for (const a of o) {
333
+ if (a.module === "env" && a.name === "memory" && a.kind === "memory") {
334
+ n = !0;
335
+ continue;
336
+ }
337
+ throw new l(
338
+ c.PARALLEL_KERNEL_MODULE,
339
+ `${s} names a wasm kernel that imports '${a.module}.${a.name}' as a ${a.kind}, and a worker supplies only 'env.memory'. Drop the import, or move what it does into the kernel.`
340
+ );
341
+ }
342
+ if (!n)
343
+ throw new l(
344
+ c.PARALLEL_KERNEL_MODULE,
345
+ `${s} names a wasm kernel that imports no 'env.memory', so it addresses a linear memory of its own and never the store. Link the module with --import-memory.`
346
+ );
347
+ const r = WebAssembly.Module.exports(e).find((a) => a.name === t);
348
+ if (r === void 0)
349
+ throw new l(
350
+ c.PARALLEL_KERNEL_MODULE,
351
+ `${s} names the wasm kernel export '${t}' and the module exports no such name. Name an export the module carries.`
352
+ );
353
+ if (r.kind !== "function")
354
+ throw new l(
355
+ c.PARALLEL_KERNEL_MODULE,
356
+ `${s} names the wasm kernel export '${t}', and the module exports it as a ${r.kind}. A kernel must be a function.`
357
+ );
358
+ }
359
+ function b(s) {
360
+ const e = new Uint32Array(f);
361
+ for (let t = 0; t < f && t < s.length; t++) e[t] = s[t] >>> 0;
362
+ return e;
363
+ }
364
+ function G(s) {
365
+ const e = s.excludeWords;
366
+ return e === null ? null : b(e);
367
+ }
368
+ const V = [
369
+ ["spawns", "a worker makes no structural change"],
370
+ ["despawns", "a worker makes no structural change"],
371
+ ["transitions", "a worker makes no structural change"],
372
+ ["resourceReads", "a resource is a main-thread value"],
373
+ ["resourceWrites", "a resource is a main-thread value"],
374
+ ["sparseReads", "a sparse store is a main-thread object"],
375
+ ["sparseWrites", "a sparse store is a main-thread object"],
376
+ ["relationReads", "a relation store is a main-thread object"],
377
+ ["relationWrites", "a relation store is a main-thread object"]
378
+ ];
379
+ function Y(s, e) {
380
+ const t = s.parallel, o = s.name !== void 0 ? `system '${s.name}'` : "a parallel system";
381
+ for (const [i, w] of V) {
382
+ const d = s[i];
383
+ if (d !== void 0 && d.length > 0)
384
+ throw new l(
385
+ c.PARALLEL_ACCESS,
386
+ `${o} declares '${i}' beside 'parallel', and ${w}. Drop the declaration, or run the system sequentially.`
387
+ );
388
+ }
389
+ if (s.exclusive === !0)
390
+ throw new l(
391
+ c.PARALLEL_ACCESS,
392
+ `${o} declares 'exclusive' beside 'parallel', and an exclusive system reaches state no worker can see. Drop 'exclusive', or run the system sequentially.`
393
+ );
394
+ if (s.backendHandle !== void 0)
395
+ throw new l(
396
+ c.PARALLEL_ACCESS,
397
+ `${o} declares 'backendHandle' beside 'parallel', and one system body cannot run in two places. Keep one of them.`
398
+ );
399
+ if (s.fn === void 0)
400
+ throw new l(
401
+ c.PARALLEL_ACCESS,
402
+ `${o} declares 'parallel' with no 'fn'. The sequential body runs below the row threshold, and on a world with no pool, so it is required.`
403
+ );
404
+ const n = e.terms;
405
+ if (n.sparseIncludes.length > 0 || n.sparseExcludes.length > 0 || n.relationIncludes.length > 0 || n.relationExcludes.length > 0 || n.hierarchyTerm !== null || n.includesDisabled)
406
+ throw new l(
407
+ c.PARALLEL_ACCESS,
408
+ `${o} runs over a query that carries a sparse, relation, hierarchy or disabled term, and a worker resolves a query from the archetype masks alone. Give it a query whose only terms are .and and .not.`
409
+ );
410
+ const r = /* @__PURE__ */ new Set();
411
+ for (const i of s.reads) r.add(i.id);
412
+ for (const i of s.writes) r.add(i.id);
413
+ const a = /* @__PURE__ */ new Set();
414
+ for (const i of e.defs) a.add(i.id);
415
+ const u = /* @__PURE__ */ new Set();
416
+ for (const [i] of t.columns) {
417
+ if (u.add(i.id), !r.has(i.id))
418
+ throw new l(
419
+ c.PARALLEL_ACCESS,
420
+ `${o} names component id ${i.id} in 'parallel.columns' but not in 'reads' or 'writes'. Add it to the access declaration.`
421
+ );
422
+ if (!a.has(i.id))
423
+ throw new l(
424
+ c.PARALLEL_ACCESS,
425
+ `${o} names component id ${i.id} in 'parallel.columns' but the query does not require it, so a matched archetype may hold no column for it. Add it to the query.`
426
+ );
427
+ }
428
+ for (const i of s.writes)
429
+ if (!u.has(i.id))
430
+ throw new l(
431
+ c.PARALLEL_ACCESS,
432
+ `${o} declares a write of component id ${i.id} that 'parallel.columns' does not name. The join stamps every declared write, and it needs the component's columns. Add a field of it to 'parallel.columns', or drop the write.`
433
+ );
434
+ for (const i of e.defs)
435
+ if (!r.has(i.id))
436
+ throw new l(
437
+ c.PARALLEL_ACCESS,
438
+ `${o} queries component id ${i.id} that is not in 'reads' or 'writes'. Add it to the access declaration.`
439
+ );
440
+ const m = t.minRows;
441
+ if (m !== void 0 && (!Number.isInteger(m) || m < 0))
442
+ throw new l(
443
+ c.PARALLEL_ACCESS,
444
+ `${o} declares parallel.minRows must be an integer >= 0, got ${String(m)}`
445
+ );
446
+ const h = t.kernel;
447
+ if (typeof h.export != "string" || h.export.length === 0)
448
+ throw new l(
449
+ c.PARALLEL_ACCESS,
450
+ `${o} declares parallel.kernel.export must be a non-empty export name, got ${String(h.export)}`
451
+ );
452
+ if (h.wasm === void 0 && h.js === void 0)
453
+ throw new l(
454
+ c.PARALLEL_ACCESS,
455
+ `${o} declares a parallel.kernel with neither 'wasm' nor 'js'. Give a compiled WebAssembly.Module, or an absolute module URL a worker can import.`
456
+ );
457
+ h.wasm !== void 0 && H(o, h.wasm, h.export);
458
+ }
459
+ function J(s, e, t, o) {
460
+ const n = new Int32Array(s.columns.length * 2);
461
+ for (let r = 0; r < s.columns.length; r++) {
462
+ const [a, u] = s.columns[r];
463
+ n[r * 2] = a.id, n[r * 2 + 1] = o(a, u);
464
+ }
465
+ return {
466
+ slot: -1,
467
+ ready: !1,
468
+ exportName: s.kernel.export,
469
+ query: e,
470
+ include: b(e.include.words),
471
+ exclude: G(e),
472
+ specs: n,
473
+ minRows: s.minRows ?? F,
474
+ writes: t,
475
+ kernel: s.kernel
476
+ };
477
+ }
478
+ class Q {
479
+ _memory;
480
+ _changes;
481
+ _control;
482
+ /** Resolve the default query of a `parallel` config, which is the first
483
+ * entry of `queries` read as a with-only query. */
484
+ _resolveQuery;
485
+ _fieldId;
486
+ /** Every parallel plan, in registration order. The pool loads a kernel for
487
+ * each and clears them all on detach. */
488
+ _plans = [];
489
+ _pool = null;
490
+ /** @internal Built by `workers()`, never by a caller. */
491
+ constructor(e) {
492
+ const t = e.store, o = e.world;
493
+ this._resolveQuery = (n) => o.query(...n), this._fieldId = (n, r) => t.fieldIdOf(n, r), this._memory = e.memory, this._changes = e.changes, e.onDispose(() => this.dispose()), this._control = e.installRoute(this);
494
+ }
495
+ /** The attached pool, or `null`. */
496
+ get pool() {
497
+ return this._pool;
498
+ }
499
+ /**
500
+ * Start a pool of workers and run this world's parallel systems on it.
501
+ *
502
+ * Each worker gets the store bytes, the store base and a control buffer, and
503
+ * loads the kernel of every parallel system already registered. The promise
504
+ * resolves when every worker is parked on the barrier with its kernels in
505
+ * hand. A system registered later runs `fn` until `pool.settled()` resolves.
506
+ *
507
+ * The world's backing must be `shared` or `wasm`, because a worker reads the
508
+ * bytes directly. The host must be able to block on `Atomics.wait`, which a
509
+ * browser main thread refuses. One pool per world.
510
+ *
511
+ * The host parks on every pass, so a worker that dies would park it for the
512
+ * life of the process. `joinTimeoutMs` bounds that wait, fails the frame
513
+ * with `PARALLEL_KERNEL_FAILED`, and leaves every later frame on the
514
+ * sequential body until the caller detaches.
515
+ *
516
+ * Cold path. Call it once, outside any frame.
517
+ *
518
+ * @example
519
+ * const pool = await world.workers.attach({ count: 4 });
520
+ * // later
521
+ * await world.workers.detach();
522
+ */
523
+ async attach(e) {
524
+ if (this._pool !== null)
525
+ throw new l(
526
+ c.WORKERS_ATTACHED,
527
+ "workers.attach: this world already holds a pool. One pool per world, detach it before you attach another."
528
+ );
529
+ const t = this._memory.backing;
530
+ if (t === null)
531
+ throw new l(
532
+ c.WORKERS_NEED_SHARED_BACKING,
533
+ `workers.attach: this world's backing is '${this._memory.backingSource}', and a worker cannot reach its bytes. Build the world with memory.backing "shared" or { wasm }.`
534
+ );
535
+ const o = await y.attach(
536
+ {
537
+ store: t,
538
+ storeBase: this._memory.storeBase,
539
+ noteScan: (n) => this._changes.noteScan(n),
540
+ plans: () => this._plans,
541
+ released: () => {
542
+ this._pool = null, this._control.route(null);
543
+ }
544
+ },
545
+ e
546
+ );
547
+ return this._pool = o, this._control.route(o), o;
548
+ }
549
+ /** Stop the workers and put every parallel system back on its `fn`.
550
+ * Resolves at once on a world that holds no pool. */
551
+ async detach() {
552
+ const e = this._pool;
553
+ e !== null && await e.detach();
554
+ }
555
+ /** @internal The registration seam. Resolves one `parallel` config into the
556
+ * plan the dispatch reads, and refuses what a worker cannot serve. The
557
+ * world asks about every system, so a system that declares no `parallel`
558
+ * answers `undefined` and keeps its own `fn`. */
559
+ plan(e) {
560
+ const t = e.parallel;
561
+ if (t === void 0) return;
562
+ let o = t.query;
563
+ if (o === void 0) {
564
+ const r = e.queries?.[0];
565
+ if (r === void 0)
566
+ throw new l(
567
+ c.PARALLEL_ACCESS,
568
+ `registerSystem: config${e.name ? ` '${e.name}'` : ""} declares 'parallel' with neither 'parallel.query' nor a first entry in 'queries'. A worker resolves the matched archetypes from a query, so one is required.`
569
+ );
570
+ o = this._resolveQuery(r);
571
+ }
572
+ Y(e, o);
573
+ const n = J(t, o, e.writes, this._fieldId);
574
+ return this._plans.push(n), this._pool?.register(n), n;
575
+ }
576
+ /** @internal The world is going away. The workers hold the store bytes and
577
+ * keep the process alive, so they stop with it. `ECS.dispose` is
578
+ * synchronous and the stop is not, so this starts it and awaits nothing. */
579
+ dispose() {
580
+ this._pool?.detach(), this._plans.length = 0;
581
+ }
582
+ }
583
+ function Z() {
584
+ return {
585
+ name: "workers",
586
+ install(s) {
587
+ return { workers: new Q(s) };
588
+ }
589
+ };
590
+ }
591
+ export {
592
+ D as DEFAULT_JOIN_TIMEOUT_MS,
593
+ Q as ECSWorkers,
594
+ y as WorkerPool,
595
+ Z as workers
596
+ };