@oasys/oecs 0.5.4 → 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 +1223 -266
  2. package/README.md +217 -112
  3. package/dist/core/ecs/access_check.d.cts +29 -29
  4. package/dist/core/ecs/access_check.d.ts +29 -29
  5. package/dist/core/ecs/access_check.d.ts.map +1 -1
  6. package/dist/core/ecs/archetype.d.cts +217 -209
  7. package/dist/core/ecs/archetype.d.ts +217 -209
  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 +33 -33
  13. package/dist/core/ecs/archetype_graph.d.ts +33 -33
  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 +26 -26
  28. package/dist/core/ecs/command_log.d.ts +26 -26
  29. package/dist/core/ecs/command_log.d.ts.map +1 -1
  30. package/dist/core/ecs/component.d.cts +43 -42
  31. package/dist/core/ecs/component.d.ts +43 -42
  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 +289 -270
  46. package/dist/core/ecs/ecs.d.ts +289 -270
  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 +20 -18
  57. package/dist/core/ecs/entity_allocator.d.ts +20 -18
  58. package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
  59. package/dist/core/ecs/event.d.cts +36 -22
  60. package/dist/core/ecs/event.d.ts +36 -22
  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 +32 -32
  69. package/dist/core/ecs/frame_trace.d.ts +32 -32
  70. package/dist/core/ecs/frame_trace.d.ts.map +1 -1
  71. package/dist/core/ecs/host_commands.d.cts +103 -85
  72. package/dist/core/ecs/host_commands.d.ts +103 -85
  73. package/dist/core/ecs/host_commands.d.ts.map +1 -1
  74. package/dist/core/ecs/index.d.cts +21 -11
  75. package/dist/core/ecs/index.d.ts +21 -11
  76. package/dist/core/ecs/index.d.ts.map +1 -1
  77. package/dist/core/ecs/observer.d.cts +39 -120
  78. package/dist/core/ecs/observer.d.ts +39 -120
  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 +208 -578
  90. package/dist/core/ecs/query.d.ts +208 -578
  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 +100 -39
  102. package/dist/core/ecs/ref.d.ts +100 -39
  103. package/dist/core/ecs/ref.d.ts.map +1 -1
  104. package/dist/core/ecs/relation.d.cts +101 -182
  105. package/dist/core/ecs/relation.d.ts +101 -182
  106. package/dist/core/ecs/relation.d.ts.map +1 -1
  107. package/dist/core/ecs/resource.d.cts +13 -13
  108. package/dist/core/ecs/resource.d.ts +13 -13
  109. package/dist/core/ecs/resource_registry.d.cts +5 -5
  110. package/dist/core/ecs/resource_registry.d.ts +5 -5
  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 +91 -120
  119. package/dist/core/ecs/schedule.d.ts +91 -120
  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 +108 -51
  131. package/dist/core/ecs/sparse_store.d.ts +108 -51
  132. package/dist/core/ecs/sparse_store.d.ts.map +1 -1
  133. package/dist/core/ecs/store.d.cts +527 -473
  134. package/dist/core/ecs/store.d.ts +527 -473
  135. package/dist/core/ecs/store.d.ts.map +1 -1
  136. package/dist/core/ecs/store_layout_listener.d.cts +6 -6
  137. package/dist/core/ecs/store_layout_listener.d.ts +6 -6
  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 +146 -61
  142. package/dist/core/ecs/system.d.ts +146 -61
  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 +82 -6
  154. package/dist/core/ecs/utils/error.d.ts +82 -6
  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 +44 -44
  163. package/dist/core/store/action_ring.d.ts +44 -44
  164. package/dist/core/store/action_ring.d.ts.map +1 -1
  165. package/dist/core/store/allocator.d.cts +149 -95
  166. package/dist/core/store/allocator.d.ts +149 -95
  167. package/dist/core/store/allocator.d.ts.map +1 -1
  168. package/dist/core/store/buffer_backed_column.d.cts +17 -17
  169. package/dist/core/store/buffer_backed_column.d.ts +17 -17
  170. package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
  171. package/dist/core/store/column_store.d.cts +124 -86
  172. package/dist/core/store/column_store.d.ts +124 -86
  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 +36 -39
  178. package/dist/core/store/command_ring.d.ts +36 -39
  179. package/dist/core/store/command_ring.d.ts.map +1 -1
  180. package/dist/core/store/descriptor.d.cts +34 -17
  181. package/dist/core/store/descriptor.d.ts +34 -17
  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 +36 -38
  187. package/dist/core/store/event_ring.d.ts +36 -38
  188. package/dist/core/store/event_ring.d.ts.map +1 -1
  189. package/dist/core/store/extend.d.cts +13 -7
  190. package/dist/core/store/extend.d.ts +13 -7
  191. package/dist/core/store/extend.d.ts.map +1 -1
  192. package/dist/core/store/grow.d.cts +2 -2
  193. package/dist/core/store/grow.d.ts +2 -2
  194. package/dist/core/store/grow.d.ts.map +1 -1
  195. package/dist/core/store/header.d.cts +31 -27
  196. package/dist/core/store/header.d.ts +31 -27
  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 +71 -62
  202. package/dist/core/store/layout_ops.d.ts +71 -62
  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 +12 -12
  211. package/dist/core/store/state_hash.d.ts +12 -12
  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 +15 -10
  225. package/dist/index.d.ts +15 -10
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.development.cjs +1 -1
  228. package/dist/index.development.js +5804 -5203
  229. package/dist/index.js +5323 -4764
  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 +54 -54
  244. package/dist/{extensions → plugins}/editor/editor.d.ts +54 -54
  245. package/dist/plugins/editor/editor.d.ts.map +1 -0
  246. package/dist/{extensions → plugins}/editor/field_handle.d.cts +12 -12
  247. package/dist/{extensions → plugins}/editor/field_handle.d.ts +12 -12
  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} +81 -64
  257. package/dist/{extensions/editor/index.js → plugins/editor.js} +81 -64
  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 +85 -97
  302. package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +85 -97
  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 +16 -15
  411. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +16 -15
  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 +3 -3
  415. package/dist/version.d.ts +3 -3
  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-BlR3oZ3x.js +0 -2406
  465. package/dist/host_commands-C2cpU3yC.cjs +0 -1
  466. package/dist/internal-BoxWl4dG.js +0 -2565
  467. package/dist/internal-CGBEwfeB.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-Bs39EPh1.js +0 -150
  502. package/dist/shallow-C5YmTbtb.cjs +0 -1
  503. package/dist/shallow-CiFC70Dz.js +0 -159
  504. package/dist/shallow-DQ8aG51_.cjs +0 -1
  505. package/dist/shared-B4v0L1cw.js +0 -109
  506. package/dist/shared-DU78k0pU.cjs +0 -1
  507. package/dist/topological_sort-BDvEyb9W.cjs +0 -1
  508. package/dist/topological_sort-DK6EjpWa.js +0 -135
  509. package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
  510. package/dist/typed_arrays-DIVwVy5_.js +0 -258
@@ -0,0 +1,474 @@
1
+ import { C as m } from "./abi-NP8pNxpd.js";
2
+ import { ECSError as l, ECS_ERROR as h } from "../index.js";
3
+ async function I() {
4
+ const o = globalThis.process, t = o?.getBuiltinModule;
5
+ return typeof t == "function" ? t.call(o, "node:worker_threads") : await import(["node", "worker_threads"].join(":"));
6
+ }
7
+ const f = 0, p = 1, k = 2, A = 3, R = 4, N = R + m, S = N + m, v = S + 1, T = v + 1 >> 1, $ = (T + 1) * 8, b = -1, D = -2, E = 16, L = 65536, M = 3e4;
8
+ function W(o) {
9
+ if (o === void 0) return 0;
10
+ if (!Number.isInteger(o) || o < 1)
11
+ throw new l(
12
+ h.WORKERS_COUNT_INVALID,
13
+ `workers.attach: stackBytes must be an integer >= 1, got ${String(o)}`
14
+ );
15
+ if (o % E !== 0)
16
+ throw new l(
17
+ h.WORKERS_COUNT_INVALID,
18
+ `workers.attach: stackBytes must be a multiple of ${E}, the frame alignment of a wasm shadow stack, got ${o}`
19
+ );
20
+ if (o < L)
21
+ throw new l(
22
+ h.WORKERS_COUNT_INVALID,
23
+ `workers.attach: stackBytes must be at least ${L}, one WASM page, got ${o}`
24
+ );
25
+ return o;
26
+ }
27
+ function P() {
28
+ try {
29
+ const o = new Int32Array(new SharedArrayBuffer(4));
30
+ return Atomics.wait(o, 0, 1, 0), !0;
31
+ } catch {
32
+ return !1;
33
+ }
34
+ }
35
+ function B() {
36
+ const o = globalThis.process;
37
+ return typeof o == "object" && o !== null && typeof o.versions?.node == "string";
38
+ }
39
+ function K() {
40
+ const o = globalThis.navigator?.hardwareConcurrency;
41
+ return typeof o != "number" || !Number.isFinite(o) ? 1 : Math.max(1, Math.floor(o) - 1);
42
+ }
43
+ function U() {
44
+ const o = new URL(import.meta.url), t = o.pathname, e = t.lastIndexOf("/"), n = t.slice(e + 1), s = n.indexOf("."), r = t.slice(0, e), i = r.slice(0, r.lastIndexOf("/") + 1);
45
+ return o.pathname = `${i}worker${s < 0 ? "" : n.slice(s)}`, o;
46
+ }
47
+ class C {
48
+ _waiting = /* @__PURE__ */ new Map();
49
+ _arrived = /* @__PURE__ */ new Map();
50
+ _failure = null;
51
+ deliver(t) {
52
+ const e = t.slot === void 0 ? t.type : `${t.type}:${t.slot}`, n = this._waiting.get(e);
53
+ if (n !== void 0 && n.length > 0) {
54
+ n.shift()(t);
55
+ return;
56
+ }
57
+ const s = this._arrived.get(e);
58
+ s === void 0 ? this._arrived.set(e, [t]) : s.push(t);
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(t) {
63
+ this._failure = t;
64
+ for (const e of this._waiting.values())
65
+ for (; e.length > 0; ) e.shift()({ type: "kernel", error: t });
66
+ this._waiting.clear();
67
+ }
68
+ expect(t, e) {
69
+ if (this._failure !== null) return Promise.resolve({ type: t, slot: e, error: this._failure });
70
+ const n = e === void 0 ? t : `${t}:${e}`, s = this._arrived.get(n);
71
+ return s !== void 0 && s.length > 0 ? Promise.resolve(s.shift()) : new Promise((r) => {
72
+ const i = this._waiting.get(n);
73
+ i === void 0 ? this._waiting.set(n, [r]) : i.push(r);
74
+ });
75
+ }
76
+ }
77
+ async function j(o, t) {
78
+ const e = await I();
79
+ return t.map((n) => {
80
+ const s = new e.Worker(o, { workerData: n }), r = new C();
81
+ return s.on("message", (i) => r.deliver(i)), s.on("error", (i) => r.fail(i.message)), {
82
+ post: (i) => s.postMessage(i),
83
+ expect: (i, c) => r.expect(i, c),
84
+ terminate: () => s.terminate()
85
+ };
86
+ });
87
+ }
88
+ function q(o, t) {
89
+ return t.map((e) => {
90
+ const n = new Worker(o, { type: "module" }), s = new C();
91
+ return n.addEventListener(
92
+ "message",
93
+ (r) => s.deliver(r.data)
94
+ ), n.addEventListener("error", (r) => {
95
+ const i = r.message;
96
+ s.fail(
97
+ typeof i == "string" && i !== "" ? i : `the script at '${String(o)}' did not load`
98
+ );
99
+ }), n.postMessage(e), {
100
+ post: (r) => n.postMessage(r),
101
+ expect: (r, i) => s.expect(r, i),
102
+ terminate: () => (n.terminate(), Promise.resolve())
103
+ };
104
+ });
105
+ }
106
+ class g {
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(t, e, n, s) {
118
+ this._world = t, this._workers = e, this._ctl = new Int32Array(n), this._ctlF64 = new Float64Array(n), this._joinTimeoutMs = s;
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(t, e) {
133
+ if (!P())
134
+ throw new l(
135
+ h.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 n = e?.count ?? K();
139
+ if (!Number.isInteger(n) || n < 1)
140
+ throw new l(
141
+ h.WORKERS_COUNT_INVALID,
142
+ `workers.attach: count must be an integer >= 1, got ${String(n)}`
143
+ );
144
+ const s = e?.joinTimeoutMs ?? M;
145
+ if (!Number.isInteger(s) || s < 1)
146
+ throw new l(
147
+ h.WORKERS_COUNT_INVALID,
148
+ `workers.attach: joinTimeoutMs must be an integer >= 1, got ${String(s)}`
149
+ );
150
+ const r = W(e?.stackBytes), i = new SharedArrayBuffer($), c = [];
151
+ for (let a = 0; a < n; a++)
152
+ c.push({
153
+ store: t.store,
154
+ storeBase: t.storeBase,
155
+ control: i,
156
+ index: a,
157
+ count: n,
158
+ stackBytes: r
159
+ });
160
+ const _ = e?.workerUrl ?? U(), d = B() ? await j(_, c) : q(_, c), u = await Promise.all(d.map((a) => a.expect("ready")));
161
+ for (let a = 0; a < u.length; a++) {
162
+ const y = u[a].error;
163
+ if (y !== void 0)
164
+ throw await Promise.all(d.map((x) => x.terminate())), new l(
165
+ h.WORKERS_ENTRY_UNREACHABLE,
166
+ `workers.attach: worker ${a} did not start from '${String(_)}': ${y}. Pass workerUrl with the URL your bundler emits for the '@oasys/oecs/worker' entry.`
167
+ );
168
+ }
169
+ const w = new g(t, d, i, s);
170
+ for (const a of t.plans()) w._pending.push(a);
171
+ w._kick();
172
+ try {
173
+ await w.settled();
174
+ } catch (a) {
175
+ throw await w.detach(), a;
176
+ }
177
+ return w;
178
+ }
179
+ /** Take one kernel. The system runs `fn` until every worker holds it. */
180
+ register(t) {
181
+ this._state === "detached" || this._state === "failed" || (this._pending.push(t), 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 t = this._pending;
194
+ this._pending = [], t.length > 0 && this._state === "running" && await this._park();
195
+ for (const e of t) {
196
+ e.slot = this._nextSlot++;
197
+ const n = {
198
+ type: "kernel",
199
+ slot: e.slot,
200
+ wasm: e.kernel.wasm,
201
+ js: e.kernel.js,
202
+ exportName: e.exportName,
203
+ specs: e.specs
204
+ }, s = await Promise.all(
205
+ this._workers.map((r) => (r.post(n), r.expect("kernel", e.slot)))
206
+ );
207
+ for (let r = 0; r < s.length; r++) {
208
+ const i = s[r].error;
209
+ if (i !== void 0)
210
+ throw new l(
211
+ h.PARALLEL_KERNEL_FAILED,
212
+ `worker ${r} could not load the kernel export '${e.exportName}': ${String(i).replace(/\.$/, "")}. Check the module and the export name.`
213
+ );
214
+ }
215
+ e.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 t = this._ctl;
224
+ Atomics.store(t, k, b), Atomics.store(t, f, ++this._epoch), Atomics.notify(t, f), await Promise.all(this._workers.map((e) => e.expect("yielded")));
225
+ }
226
+ _resume() {
227
+ if (this._state === "idle") {
228
+ for (const t of this._workers) t.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(t, e, n, s) {
248
+ if (!t.ready || this._state !== "running" || (e.publishRowCounts(), t.query.entityCount < t.minRows)) return !1;
249
+ const r = this._ctl, i = t.exclude;
250
+ Atomics.store(r, p, 0), Atomics.store(r, A, 0);
251
+ for (let u = 0; u < m; u++)
252
+ r[R + u] = t.include[u] | 0, r[N + u] = i === null ? 0 : i[u] | 0;
253
+ r[S] = i === null ? 0 : 1, this._ctlF64[T] = n, Atomics.store(r, k, t.slot), Atomics.store(r, f, ++this._epoch), Atomics.notify(r, f);
254
+ const c = this._workers.length, _ = performance.now() + this._joinTimeoutMs;
255
+ for (; ; ) {
256
+ const u = Atomics.load(r, p);
257
+ if (u === c) break;
258
+ const w = _ - performance.now();
259
+ if (w <= 0)
260
+ throw this._stamp(t, s), this._state = "failed", new l(
261
+ h.PARALLEL_KERNEL_FAILED,
262
+ `a worker did not reach the join of the kernel export '${t.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, u, w);
265
+ }
266
+ this._stamp(t, s);
267
+ const d = Atomics.load(r, A);
268
+ if (d !== 0)
269
+ throw new l(
270
+ h.PARALLEL_KERNEL_FAILED,
271
+ `worker ${d - 1} threw inside the kernel export '${t.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(t, e) {
291
+ const n = t.query.archetypes, s = t.writes;
292
+ for (let r = 0; r < n.length; r++) {
293
+ const i = n[r];
294
+ if (i.hasColumns)
295
+ for (let c = 0; c < s.length; c++) {
296
+ const _ = s[c];
297
+ i.columnGroupMut(_, e);
298
+ const d = i.rowTicks[_.id];
299
+ d !== void 0 && d.fill(e, 0, i.enabledCount);
300
+ }
301
+ }
302
+ for (let r = 0; r < s.length; r++) this._world.noteScan(s[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 t = this._state === "running";
318
+ if (this._state = "detached", this._pending.length = 0, t) {
319
+ const e = this._ctl;
320
+ Atomics.store(e, k, D), Atomics.store(e, f, ++this._epoch), Atomics.notify(e, f);
321
+ }
322
+ await Promise.all(this._workers.map((e) => e.terminate()));
323
+ for (const e of this._world.plans())
324
+ e.ready = !1, e.slot = -1;
325
+ this._world.released();
326
+ }
327
+ }
328
+ const F = 2e5;
329
+ function O(o) {
330
+ const t = new Uint32Array(m);
331
+ for (let e = 0; e < m && e < o.length; e++) t[e] = o[e] >>> 0;
332
+ return t;
333
+ }
334
+ function H(o) {
335
+ const t = o.excludeWords;
336
+ return t === null ? null : O(t);
337
+ }
338
+ function V(o, t, e, n) {
339
+ const s = new Int32Array(o.columns.length * 2);
340
+ for (let r = 0; r < o.columns.length; r++) {
341
+ const [i, c] = o.columns[r];
342
+ s[r * 2] = i.id, s[r * 2 + 1] = n(i, c);
343
+ }
344
+ return {
345
+ slot: -1,
346
+ ready: !1,
347
+ exportName: o.kernel.export,
348
+ query: t,
349
+ include: O(t.include.words),
350
+ exclude: H(t),
351
+ specs: s,
352
+ minRows: o.minRows ?? F,
353
+ writes: e,
354
+ kernel: o.kernel
355
+ };
356
+ }
357
+ class Y {
358
+ _memory;
359
+ _changes;
360
+ _control;
361
+ /** Resolve the default query of a `parallel` config, which is the first
362
+ * entry of `queries` read as a with-only query. */
363
+ _resolveQuery;
364
+ _fieldId;
365
+ /** Every parallel plan, in registration order. The pool loads a kernel for
366
+ * each and clears them all on detach. */
367
+ _plans = [];
368
+ _pool = null;
369
+ /** @internal Built by `workers()`, never by a caller. */
370
+ constructor(t) {
371
+ const e = t.store, n = t.world;
372
+ this._resolveQuery = (s) => n.query(...s), this._fieldId = (s, r) => e.fieldIdOf(s, r), this._memory = t.memory, this._changes = t.changes, t.onDispose(() => this.dispose()), this._control = t.installRoute(this);
373
+ }
374
+ /** The attached pool, or `null`. */
375
+ get pool() {
376
+ return this._pool;
377
+ }
378
+ /**
379
+ * Start a pool of workers and run this world's parallel systems on it.
380
+ *
381
+ * Each worker gets the store bytes, the store base and a control buffer, and
382
+ * loads the kernel of every parallel system already registered. The promise
383
+ * resolves when every worker is parked on the barrier with its kernels in
384
+ * hand. A system registered later runs `fn` until `pool.settled()` resolves.
385
+ *
386
+ * The world's backing must be `shared` or `wasm`, because a worker reads the
387
+ * bytes directly. The host must be able to block on `Atomics.wait`, which a
388
+ * browser main thread refuses. One pool per world.
389
+ *
390
+ * The host parks on every pass, so a worker that dies would park it for the
391
+ * life of the process. `joinTimeoutMs` bounds that wait, fails the frame
392
+ * with `PARALLEL_KERNEL_FAILED`, and leaves every later frame on the
393
+ * sequential body until the caller detaches.
394
+ *
395
+ * Cold path. Call it once, outside any frame.
396
+ *
397
+ * @example
398
+ * const pool = await world.workers.attach({ count: 4 });
399
+ * // later
400
+ * await world.workers.detach();
401
+ */
402
+ async attach(t) {
403
+ if (this._pool !== null)
404
+ throw new l(
405
+ h.WORKERS_ATTACHED,
406
+ "workers.attach: this world already holds a pool. One pool per world, detach it before you attach another."
407
+ );
408
+ const e = this._memory.backing;
409
+ if (e === null)
410
+ throw new l(
411
+ h.WORKERS_NEED_SHARED_BACKING,
412
+ `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 }.`
413
+ );
414
+ const n = await g.attach(
415
+ {
416
+ store: e,
417
+ storeBase: this._memory.storeBase,
418
+ noteScan: (s) => this._changes.noteScan(s),
419
+ plans: () => this._plans,
420
+ released: () => {
421
+ this._pool = null, this._control.route(null);
422
+ }
423
+ },
424
+ t
425
+ );
426
+ return this._pool = n, this._control.route(n), n;
427
+ }
428
+ /** Stop the workers and put every parallel system back on its `fn`.
429
+ * Resolves at once on a world that holds no pool. */
430
+ async detach() {
431
+ const t = this._pool;
432
+ t !== null && await t.detach();
433
+ }
434
+ /** @internal The registration seam. Resolves one `parallel` config into the
435
+ * plan the dispatch reads, and refuses what a worker cannot serve. The
436
+ * world asks about every system, so a system that declares no `parallel`
437
+ * answers `undefined` and keeps its own `fn`. */
438
+ plan(t) {
439
+ const e = t.parallel;
440
+ if (e === void 0) return;
441
+ let n = e.query;
442
+ if (n === void 0) {
443
+ const r = t.queries?.[0];
444
+ if (r === void 0)
445
+ throw new l(
446
+ h.PARALLEL_ACCESS,
447
+ `registerSystem: config${t.name ? ` '${t.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.`
448
+ );
449
+ n = this._resolveQuery(r);
450
+ }
451
+ const s = V(e, n, t.writes, this._fieldId);
452
+ return this._plans.push(s), this._pool?.register(s), s;
453
+ }
454
+ /** @internal The world is going away. The workers hold the store bytes and
455
+ * keep the process alive, so they stop with it. `ECS.dispose` is
456
+ * synchronous and the stop is not, so this starts it and awaits nothing. */
457
+ dispose() {
458
+ this._pool?.detach(), this._plans.length = 0;
459
+ }
460
+ }
461
+ function Q() {
462
+ return {
463
+ name: "workers",
464
+ install(o) {
465
+ return { workers: new Y(o) };
466
+ }
467
+ };
468
+ }
469
+ export {
470
+ M as DEFAULT_JOIN_TIMEOUT_MS,
471
+ Y as ECSWorkers,
472
+ g as WorkerPool,
473
+ Q as workers
474
+ };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./typed_arrays-D3NmwtCG.cjs"),t=require("./topological_sort-BDvEyb9W.cjs");class o{_dense=[];_sparse=[];get size(){return this._dense.length}get values(){return this._dense}has(e){return this._dense[this._sparse[e]]===e}add(e){this.has(e)||(this._sparse[e]=this._dense.length,this._dense.push(e))}delete(e){if(!this.has(e))return!1;const a=this._sparse[e],s=this._dense[this._dense.length-1];return this._dense[a]=s,this._sparse[s]=a,this._dense.pop(),!0}clear(){this._dense.length=0,this._sparse.length=0}[Symbol.iterator](){return this._dense[Symbol.iterator]()}}exports.BitSet=r.BitSet;exports.GrowableFloat32Array=r.GrowableFloat32Array;exports.GrowableFloat64Array=r.GrowableFloat64Array;exports.GrowableInt16Array=r.GrowableInt16Array;exports.GrowableInt32Array=r.GrowableInt32Array;exports.GrowableInt8Array=r.GrowableInt8Array;exports.GrowableTypedArray=r.GrowableTypedArray;exports.GrowableUint16Array=r.GrowableUint16Array;exports.GrowableUint32Array=r.GrowableUint32Array;exports.GrowableUint8Array=r.GrowableUint8Array;exports.BinaryHeap=t.BinaryHeap;exports.SparseMap=t.SparseMap;exports.topologicalSort=t.topologicalSort;exports.SparseSet=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./topological_sort-vp1imU6D.cjs");class n{_dense=[];_sparse=[];get size(){return this._dense.length}get values(){return this._dense}has(e){return this._dense[this._sparse[e]]===e}add(e){this.has(e)||(this._sparse[e]=this._dense.length,this._dense.push(e))}delete(e){if(!this.has(e))return!1;const s=this._sparse[e],r=this._dense[this._dense.length-1];return this._dense[s]=r,this._sparse[r]=s,this._dense.pop(),!0}clear(){this._dense.length=0,this._sparse.length=0}[Symbol.iterator](){return this._dense[Symbol.iterator]()}}class i{_denseKeys=[];_denseVals=[];_sparse=[];get size(){return this._denseKeys.length}get keys(){return this._denseKeys}has(e){return this._denseKeys[this._sparse[e]]===e}get(e){return this.has(e)?this._denseVals[this._sparse[e]]:void 0}set(e,s){if(this.has(e)){this._denseVals[this._sparse[e]]=s;return}this._sparse[e]=this._denseKeys.length,this._denseKeys.push(e),this._denseVals.push(s)}delete(e){if(!this.has(e))return!1;const s=this._sparse[e],r=this._denseKeys[this._denseKeys.length-1];return this._denseKeys[s]=r,this._denseVals[s]=this._denseVals[this._denseVals.length-1],this._sparse[r]=s,this._denseKeys.pop(),this._denseVals.pop(),!0}clear(){this._denseKeys.length=0,this._denseVals.length=0,this._sparse.length=0}forEach(e){for(let s=0;s<this._denseKeys.length;s++)e(this._denseKeys[s],this._denseVals[s])}[Symbol.iterator](){let e=0;const s=this._denseKeys,r=this._denseVals;return{next(){return e<s.length?{value:[s[e],r[e++]],done:!1}:{value:void 0,done:!0}}}}}exports.BinaryHeap=t.BinaryHeap;exports.BitSet=t.BitSet;exports.GrowableFloat32Array=t.GrowableFloat32Array;exports.GrowableFloat64Array=t.GrowableFloat64Array;exports.GrowableInt16Array=t.GrowableInt16Array;exports.GrowableInt32Array=t.GrowableInt32Array;exports.GrowableInt8Array=t.GrowableInt8Array;exports.GrowableTypedArray=t.GrowableTypedArray;exports.GrowableUint16Array=t.GrowableUint16Array;exports.GrowableUint32Array=t.GrowableUint32Array;exports.GrowableUint8Array=t.GrowableUint8Array;exports.topologicalSort=t.topologicalSort;exports.SparseMap=i;exports.SparseSet=n;
@@ -1,11 +1,11 @@
1
1
  /**
2
- * `@oasys/oecs/primitives` the general-purpose data-structure primitives the
3
- * ECS is built on, surfaced for direct consumer use: a bit set, sparse set/map,
2
+ * `@oasys/oecs/primitives`, the general-purpose data-structure primitives the
3
+ * ECS is built on, surfaced for direct consumer use: a bit set, sparse set and map,
4
4
  * growable typed arrays, a binary heap, and a topological sort.
5
5
  *
6
- * These are the low-level building blocks only; the ECS itself is the default
6
+ * These are the low-level building blocks only. The ECS itself is the default
7
7
  * `@oasys/oecs` entry. The internal assertion, brand, and error helpers under
8
- * `src/type_primitives/` are intentionally NOT re-exported here.
8
+ * `src/type_primitives/` are intentionally not re-exported here.
9
9
  *
10
10
  * @module
11
11
  */
@@ -1,11 +1,11 @@
1
1
  /**
2
- * `@oasys/oecs/primitives` the general-purpose data-structure primitives the
3
- * ECS is built on, surfaced for direct consumer use: a bit set, sparse set/map,
2
+ * `@oasys/oecs/primitives`, the general-purpose data-structure primitives the
3
+ * ECS is built on, surfaced for direct consumer use: a bit set, sparse set and map,
4
4
  * growable typed arrays, a binary heap, and a topological sort.
5
5
  *
6
- * These are the low-level building blocks only; the ECS itself is the default
6
+ * These are the low-level building blocks only. The ECS itself is the default
7
7
  * `@oasys/oecs` entry. The internal assertion, brand, and error helpers under
8
- * `src/type_primitives/` are intentionally NOT re-exported here.
8
+ * `src/type_primitives/` are intentionally not re-exported here.
9
9
  *
10
10
  * @module
11
11
  */
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./typed_arrays-D3NmwtCG.cjs"),t=require("./topological_sort-BDvEyb9W.cjs");class o{_dense=[];_sparse=[];get size(){return this._dense.length}get values(){return this._dense}has(e){return this._dense[this._sparse[e]]===e}add(e){this.has(e)||(this._sparse[e]=this._dense.length,this._dense.push(e))}delete(e){if(!this.has(e))return!1;const a=this._sparse[e],s=this._dense[this._dense.length-1];return this._dense[a]=s,this._sparse[s]=a,this._dense.pop(),!0}clear(){this._dense.length=0,this._sparse.length=0}[Symbol.iterator](){return this._dense[Symbol.iterator]()}}exports.BitSet=r.BitSet;exports.GrowableFloat32Array=r.GrowableFloat32Array;exports.GrowableFloat64Array=r.GrowableFloat64Array;exports.GrowableInt16Array=r.GrowableInt16Array;exports.GrowableInt32Array=r.GrowableInt32Array;exports.GrowableInt8Array=r.GrowableInt8Array;exports.GrowableTypedArray=r.GrowableTypedArray;exports.GrowableUint16Array=r.GrowableUint16Array;exports.GrowableUint32Array=r.GrowableUint32Array;exports.GrowableUint8Array=r.GrowableUint8Array;exports.BinaryHeap=t.BinaryHeap;exports.SparseMap=t.SparseMap;exports.topologicalSort=t.topologicalSort;exports.SparseSet=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./topological_sort-vp1imU6D.cjs");class n{_dense=[];_sparse=[];get size(){return this._dense.length}get values(){return this._dense}has(e){return this._dense[this._sparse[e]]===e}add(e){this.has(e)||(this._sparse[e]=this._dense.length,this._dense.push(e))}delete(e){if(!this.has(e))return!1;const s=this._sparse[e],r=this._dense[this._dense.length-1];return this._dense[s]=r,this._sparse[r]=s,this._dense.pop(),!0}clear(){this._dense.length=0,this._sparse.length=0}[Symbol.iterator](){return this._dense[Symbol.iterator]()}}class i{_denseKeys=[];_denseVals=[];_sparse=[];get size(){return this._denseKeys.length}get keys(){return this._denseKeys}has(e){return this._denseKeys[this._sparse[e]]===e}get(e){return this.has(e)?this._denseVals[this._sparse[e]]:void 0}set(e,s){if(this.has(e)){this._denseVals[this._sparse[e]]=s;return}this._sparse[e]=this._denseKeys.length,this._denseKeys.push(e),this._denseVals.push(s)}delete(e){if(!this.has(e))return!1;const s=this._sparse[e],r=this._denseKeys[this._denseKeys.length-1];return this._denseKeys[s]=r,this._denseVals[s]=this._denseVals[this._denseVals.length-1],this._sparse[r]=s,this._denseKeys.pop(),this._denseVals.pop(),!0}clear(){this._denseKeys.length=0,this._denseVals.length=0,this._sparse.length=0}forEach(e){for(let s=0;s<this._denseKeys.length;s++)e(this._denseKeys[s],this._denseVals[s])}[Symbol.iterator](){let e=0;const s=this._denseKeys,r=this._denseVals;return{next(){return e<s.length?{value:[s[e],r[e++]],done:!1}:{value:void 0,done:!0}}}}}exports.BinaryHeap=t.BinaryHeap;exports.BitSet=t.BitSet;exports.GrowableFloat32Array=t.GrowableFloat32Array;exports.GrowableFloat64Array=t.GrowableFloat64Array;exports.GrowableInt16Array=t.GrowableInt16Array;exports.GrowableInt32Array=t.GrowableInt32Array;exports.GrowableInt8Array=t.GrowableInt8Array;exports.GrowableTypedArray=t.GrowableTypedArray;exports.GrowableUint16Array=t.GrowableUint16Array;exports.GrowableUint32Array=t.GrowableUint32Array;exports.GrowableUint8Array=t.GrowableUint8Array;exports.topologicalSort=t.topologicalSort;exports.SparseMap=i;exports.SparseSet=n;
@@ -1,5 +1,4 @@
1
- import { B as h, a as o, b as l, d as p, e as _, c as d, G as b, g as u, h as w, f as G } from "./typed_arrays-DIVwVy5_.js";
2
- import { B as y, S as A, t as S } from "./topological_sort-DK6EjpWa.js";
1
+ import { i as l, B as _, a as d, b as o, d as p, e as u, c as g, G as y, g as K, h as b, f as c, t as f } from "./topological_sort-Cc_yXqPT.js";
3
2
  class a {
4
3
  _dense = [];
5
4
  _sparse = [];
@@ -9,16 +8,16 @@ class a {
9
8
  get values() {
10
9
  return this._dense;
11
10
  }
12
- has(e) {
13
- return this._dense[this._sparse[e]] === e;
11
+ has(s) {
12
+ return this._dense[this._sparse[s]] === s;
14
13
  }
15
- add(e) {
16
- this.has(e) || (this._sparse[e] = this._dense.length, this._dense.push(e));
14
+ add(s) {
15
+ this.has(s) || (this._sparse[s] = this._dense.length, this._dense.push(s));
17
16
  }
18
- delete(e) {
19
- if (!this.has(e)) return !1;
20
- const s = this._sparse[e], r = this._dense[this._dense.length - 1];
21
- return this._dense[s] = r, this._sparse[r] = s, this._dense.pop(), !0;
17
+ delete(s) {
18
+ if (!this.has(s)) return !1;
19
+ const e = this._sparse[s], t = this._dense[this._dense.length - 1];
20
+ return this._dense[e] = t, this._sparse[t] = e, this._dense.pop(), !0;
22
21
  }
23
22
  clear() {
24
23
  this._dense.length = 0, this._sparse.length = 0;
@@ -27,19 +26,64 @@ class a {
27
26
  return this._dense[Symbol.iterator]();
28
27
  }
29
28
  }
29
+ class n {
30
+ _denseKeys = [];
31
+ _denseVals = [];
32
+ _sparse = [];
33
+ get size() {
34
+ return this._denseKeys.length;
35
+ }
36
+ get keys() {
37
+ return this._denseKeys;
38
+ }
39
+ has(s) {
40
+ return this._denseKeys[this._sparse[s]] === s;
41
+ }
42
+ get(s) {
43
+ return this.has(s) ? this._denseVals[this._sparse[s]] : void 0;
44
+ }
45
+ set(s, e) {
46
+ if (this.has(s)) {
47
+ this._denseVals[this._sparse[s]] = e;
48
+ return;
49
+ }
50
+ this._sparse[s] = this._denseKeys.length, this._denseKeys.push(s), this._denseVals.push(e);
51
+ }
52
+ delete(s) {
53
+ if (!this.has(s)) return !1;
54
+ const e = this._sparse[s], t = this._denseKeys[this._denseKeys.length - 1];
55
+ return this._denseKeys[e] = t, this._denseVals[e] = this._denseVals[this._denseVals.length - 1], this._sparse[t] = e, this._denseKeys.pop(), this._denseVals.pop(), !0;
56
+ }
57
+ clear() {
58
+ this._denseKeys.length = 0, this._denseVals.length = 0, this._sparse.length = 0;
59
+ }
60
+ forEach(s) {
61
+ for (let e = 0; e < this._denseKeys.length; e++)
62
+ s(this._denseKeys[e], this._denseVals[e]);
63
+ }
64
+ [Symbol.iterator]() {
65
+ let s = 0;
66
+ const e = this._denseKeys, t = this._denseVals;
67
+ return {
68
+ next() {
69
+ return s < e.length ? { value: [e[s], t[s++]], done: !1 } : { value: void 0, done: !0 };
70
+ }
71
+ };
72
+ }
73
+ }
30
74
  export {
31
- y as BinaryHeap,
32
- h as BitSet,
33
- o as GrowableFloat32Array,
34
- l as GrowableFloat64Array,
75
+ l as BinaryHeap,
76
+ _ as BitSet,
77
+ d as GrowableFloat32Array,
78
+ o as GrowableFloat64Array,
35
79
  p as GrowableInt16Array,
36
- _ as GrowableInt32Array,
37
- d as GrowableInt8Array,
38
- b as GrowableTypedArray,
39
- u as GrowableUint16Array,
40
- w as GrowableUint32Array,
41
- G as GrowableUint8Array,
42
- A as SparseMap,
80
+ u as GrowableInt32Array,
81
+ g as GrowableInt8Array,
82
+ y as GrowableTypedArray,
83
+ K as GrowableUint16Array,
84
+ b as GrowableUint32Array,
85
+ c as GrowableUint8Array,
86
+ n as SparseMap,
43
87
  a as SparseSet,
44
- S as topologicalSort
88
+ f as topologicalSort
45
89
  };