@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,319 @@
1
+ import { batch as u, createSignal as f } from "solid-js";
2
+ import { createStore as b } from "solid-js/store";
3
+ const w = "solid";
4
+ class y {
5
+ eid = 0;
6
+ _cols;
7
+ constructor(e) {
8
+ this._cols = e;
9
+ }
10
+ field(e) {
11
+ return this._cols[e];
12
+ }
13
+ }
14
+ class m {
15
+ eid = 0;
16
+ row = 0;
17
+ _cols = /* @__PURE__ */ new Map();
18
+ _arch;
19
+ _def;
20
+ constructor(e) {
21
+ this._def = e;
22
+ }
23
+ bind(e) {
24
+ this._arch = e, this._cols.clear();
25
+ }
26
+ field(e) {
27
+ let s = this._cols.get(e);
28
+ return s === void 0 && (s = this._arch.getColumnRead(this._def, e), this._cols.set(e, s)), s[this.row];
29
+ }
30
+ }
31
+ function g(_, e) {
32
+ const s = _?.id;
33
+ if (typeof s != "number")
34
+ throw new TypeError(
35
+ `${e}: the definition is not a dense component, got ${String(_)}. Pass a dense component definition`
36
+ );
37
+ return s;
38
+ }
39
+ class p {
40
+ keys;
41
+ pending = /* @__PURE__ */ new Set();
42
+ cid;
43
+ wantsSet;
44
+ _owner;
45
+ _changes;
46
+ _def;
47
+ _project;
48
+ _cursor;
49
+ _entityReader;
50
+ _columnReader;
51
+ _setKeys;
52
+ /** What the view holds now, and the seed of a cell made later. The key set
53
+ * is derived from it, so a publish or a delete that changes its size marks
54
+ * the key signal dirty. */
55
+ _values = /* @__PURE__ */ new Map();
56
+ /** The cells a caller asked for. Two maps rather than one of pairs, so the
57
+ * publish takes one lookup and the accessor lookup stays off that path. */
58
+ _cellGet = /* @__PURE__ */ new Map();
59
+ _cellSet = /* @__PURE__ */ new Map();
60
+ _equals;
61
+ _keysDirty = !1;
62
+ _baseline;
63
+ _disposed = !1;
64
+ constructor(e, s, t, i, n, h, o) {
65
+ this._owner = e, this._changes = s.changes, this.cid = t, this._def = i, this._project = n, this.wantsSet = h === "entity", this._cursor = s.world.cursorRead(i), this._entityReader = new y(this._cursor), this._columnReader = h === "column" ? new m(i) : null, this._equals = o === void 0 ? void 0 : (r, l) => r === l || r !== void 0 && l !== void 0 && o(r, l), this._baseline = s.store.changeTick;
66
+ const [d, c] = f([]);
67
+ this.keys = d, this._setKeys = c;
68
+ }
69
+ cell(e) {
70
+ let s = this._cellGet.get(e);
71
+ if (s === void 0) {
72
+ const t = this._values.get(e), [i, n] = this._equals === void 0 ? f(t) : f(t, { equals: this._equals });
73
+ s = i, this._cellGet.set(e, i), this._cellSet.set(e, n);
74
+ }
75
+ return s;
76
+ }
77
+ /** Publish every current enabled member. Cold path, and the caller wraps it
78
+ * in a `batch`. */
79
+ seed() {
80
+ const e = this._changes.collectEnabledWith(this.cid);
81
+ for (let s = 0; s < e.length; s++) this._publishOne(e[s]);
82
+ this._flushKeys();
83
+ }
84
+ publish(e) {
85
+ if (this._columnReader !== null)
86
+ this._changes.forEachChangedArchetype(this.cid, this._baseline, this._onArchetype), this._baseline = e;
87
+ else {
88
+ const s = this._changes.drainSet(this.cid, e), t = s.scanned;
89
+ for (let n = 0; n < t.length; n++) this._publishOne(t[n]);
90
+ const i = s.listed;
91
+ for (let n = 0; n < i.length; n++) {
92
+ const h = i[n];
93
+ this._isPublishable(h) && this._publishOne(h);
94
+ }
95
+ }
96
+ this.pending.size !== 0 && (this.pending.forEach(this._resolvePending), this.pending.clear()), this._flushKeys();
97
+ }
98
+ dispose() {
99
+ this._disposed || (this._disposed = !0, this._owner._remove(this));
100
+ }
101
+ /** One archetype of the column grain. Bound once, so the sweep allocates no
102
+ * closure per tick. */
103
+ _onArchetype = (e) => {
104
+ const s = this._columnReader;
105
+ s.bind(e);
106
+ const t = e.entityIds, i = e.entityCount;
107
+ for (let n = 0; n < i; n++) {
108
+ s.row = n;
109
+ const h = t[n];
110
+ s.eid = h, this._writeRow(h, this._project(s));
111
+ }
112
+ };
113
+ /** One entity the structural hook recorded. Bound once, for the same
114
+ * reason as `_onArchetype`. */
115
+ _resolvePending = (e) => {
116
+ this._isPublishable(e) ? this._publishOne(e) : this._deleteOne(e);
117
+ };
118
+ _isPublishable(e) {
119
+ const s = this._changes;
120
+ return s.isAlive(e) && s.hasComponent(e, this._def) && !s.isDisabled(e);
121
+ }
122
+ _publishOne(e) {
123
+ this._cursor.at(e), this._entityReader.eid = e, this._writeRow(e, this._project(this._entityReader));
124
+ }
125
+ _writeRow(e, s) {
126
+ const t = this._values.size;
127
+ this._values.set(e, s), this._values.size !== t && (this._keysDirty = !0);
128
+ const i = this._cellSet.get(e);
129
+ i !== void 0 && i(s);
130
+ }
131
+ /** Drop the row. A row the view never held writes nothing, so a spawn and a
132
+ * despawn inside one tick leave Solid untouched. */
133
+ _deleteOne(e) {
134
+ if (!this._values.delete(e)) return;
135
+ this._keysDirty = !0;
136
+ const s = this._cellSet.get(e);
137
+ s !== void 0 && s(void 0);
138
+ }
139
+ _flushKeys() {
140
+ this._keysDirty && (this._keysDirty = !1, this._setKeys(Array.from(this._values.keys())));
141
+ }
142
+ }
143
+ class v {
144
+ value;
145
+ pending = /* @__PURE__ */ new Set();
146
+ cid;
147
+ wantsSet = !0;
148
+ _owner;
149
+ _changes;
150
+ _def;
151
+ _eid;
152
+ _fields;
153
+ /** The values the store held at creation, the reset target of a remove and
154
+ * of a disable. A Solid store has no row to delete here, so the channel
155
+ * states its empty value instead of a blind zero. */
156
+ _defaults;
157
+ _cursor;
158
+ _cols;
159
+ _write;
160
+ _disposed = !1;
161
+ constructor(e, s, t, i, n, h) {
162
+ this._owner = e, this._changes = s.changes, this.cid = t, this._def = i, this._eid = n, this._fields = h, this._cursor = s.world.cursorRead(i), this._cols = this._cursor;
163
+ const o = {};
164
+ for (let l = 0; l < h.length; l++) o[h[l]] = 0;
165
+ const [d, c] = b(o);
166
+ this.value = d, this._write = c;
167
+ const r = [];
168
+ for (let l = 0; l < h.length; l++) r.push(o[h[l]]);
169
+ this._defaults = r;
170
+ }
171
+ /** Publish the target's current fields, when it is there to read. Cold
172
+ * path, and the caller wraps it in a `batch`. */
173
+ seed() {
174
+ this._isPublishable() && this._publish();
175
+ }
176
+ publish(e) {
177
+ const s = this._changes.drainSet(this.cid, e), t = s.scanned;
178
+ let i = !1;
179
+ for (let n = 0; n < t.length; n++) t[n] === this._eid && (i = !0);
180
+ if (!i) {
181
+ const n = s.listed;
182
+ for (let h = 0; h < n.length; h++)
183
+ n[h] === this._eid && this._isPublishable() && (i = !0);
184
+ }
185
+ i && this._publish(), this.pending.size !== 0 && (this.pending.has(this._eid) && (this._isPublishable() ? this._publish() : this._reset()), this.pending.clear());
186
+ }
187
+ dispose() {
188
+ this._disposed || (this._disposed = !0, this._owner._remove(this));
189
+ }
190
+ _isPublishable() {
191
+ const e = this._changes, s = this._eid;
192
+ return e.isAlive(s) && e.hasComponent(s, this._def) && !e.isDisabled(s);
193
+ }
194
+ _publish() {
195
+ this._cursor.at(this._eid);
196
+ const e = this._fields;
197
+ for (let s = 0; s < e.length; s++) this._write(e[s], this._cols[e[s]]);
198
+ }
199
+ _reset() {
200
+ const e = this._fields;
201
+ for (let s = 0; s < e.length; s++) this._write(e[s], this._defaults[s]);
202
+ }
203
+ }
204
+ class S {
205
+ _host;
206
+ _views = [];
207
+ _byCid = /* @__PURE__ */ new Map();
208
+ constructor(e) {
209
+ this._host = e, e.changes.addStructuralHook(this._onStructural), e.onSettle(this._onSettle);
210
+ }
211
+ component(e, s, t = {}) {
212
+ const i = g(e, "solid.component"), n = new p(
213
+ this,
214
+ this._host,
215
+ i,
216
+ e,
217
+ s,
218
+ t.grain ?? "entity",
219
+ t.eq
220
+ );
221
+ return this._add(n), (t.seedExisting ?? !0) && u(() => n.seed()), n;
222
+ }
223
+ fields(e, s, t = {}) {
224
+ const i = (d) => {
225
+ const c = {};
226
+ for (let r = 0; r < s.length; r++) c[s[r]] = d.field(s[r]);
227
+ return c;
228
+ }, n = t.eq ?? ((d, c) => {
229
+ const r = d, l = c;
230
+ for (let a = 0; a < s.length; a++) if (r[s[a]] !== l[s[a]]) return !1;
231
+ return !0;
232
+ }), h = g(e, "solid.fields"), o = new p(
233
+ this,
234
+ this._host,
235
+ h,
236
+ e,
237
+ i,
238
+ t.grain ?? "entity",
239
+ n
240
+ );
241
+ return this._add(o), (t.seedExisting ?? !0) && u(() => o.seed()), o;
242
+ }
243
+ singleton(e, s, t, i = {}) {
244
+ const n = g(e, "solid.singleton"), h = new v(this, this._host, n, e, s, t);
245
+ return this._add(h), (i.seedExisting ?? !0) && u(() => h.seed()), h;
246
+ }
247
+ /** Drop a view and recompute its component's ask. Idempotent through the
248
+ * view's own disposed flag. */
249
+ _remove(e) {
250
+ const s = this._views.indexOf(e);
251
+ s >= 0 && this._views.splice(s, 1);
252
+ const t = this._byCid.get(e.cid);
253
+ if (t !== void 0) {
254
+ const i = t.indexOf(e);
255
+ i >= 0 && t.splice(i, 1), t.length === 0 && this._byCid.delete(e.cid);
256
+ }
257
+ this._reconfigure(e.cid);
258
+ }
259
+ _add(e) {
260
+ this._views.push(e);
261
+ let s = this._byCid.get(e.cid);
262
+ s === void 0 && (s = [], this._byCid.set(e.cid, s)), s.push(e), this._reconfigure(e.cid);
263
+ }
264
+ /** The OR of every live view's ask for `cid`. All-false on the last
265
+ * dispose, which is the same as never asking. Cold path. */
266
+ _reconfigure(e) {
267
+ const s = this._byCid.get(e);
268
+ let t = !1, i = !1;
269
+ if (s !== void 0)
270
+ for (let h = 0; h < s.length; h++)
271
+ t = !0, s[h].wantsSet && (i = !0);
272
+ const n = {
273
+ add: t,
274
+ remove: t,
275
+ disable: t,
276
+ enable: t,
277
+ set: i
278
+ };
279
+ this._host.changes.configureObservation(w, e, n);
280
+ }
281
+ /** Record the round's structural events, and write nothing. A view resolves
282
+ * them at settle, so an entity that arrives and leaves inside one tick
283
+ * never reaches Solid. */
284
+ _onStructural = (e) => {
285
+ this._views.length !== 0 && (this._record(e.addComp, e.addEid, e.addLen), this._record(e.remComp, e.remEid, e.remLen), this._record(e.disComp, e.disEid, e.disLen), this._record(e.enaComp, e.enaEid, e.enaLen));
286
+ };
287
+ _record(e, s, t) {
288
+ for (let i = 0; i < t; i++) {
289
+ const n = this._byCid.get(e[i]);
290
+ if (n === void 0) continue;
291
+ const h = s[i];
292
+ for (let o = 0; o < n.length; o++) n[o].pending.add(h);
293
+ }
294
+ }
295
+ /** The run tick of the settle in progress. It reaches `_publishAll` through
296
+ * a field so the batched body can be bound once. */
297
+ _run = 0;
298
+ _publishAll = () => {
299
+ const e = this._views, s = this._run;
300
+ for (let t = 0; t < e.length; t++) e[t].publish(s);
301
+ };
302
+ /** One Solid flush for the whole plugin, whatever the number of views.
303
+ * A world with no view calls `batch` never. */
304
+ _onSettle = (e) => {
305
+ this._views.length !== 0 && (this._run = e, u(this._publishAll));
306
+ };
307
+ }
308
+ function k() {
309
+ return {
310
+ name: "solid",
311
+ requires: [],
312
+ install(_) {
313
+ return { solid: new S(_) };
314
+ }
315
+ };
316
+ }
317
+ export {
318
+ k as solid
319
+ };
@@ -0,0 +1,75 @@
1
+ import { WorkerPool, AttachWorkersOptions } from './pool.cjs';
2
+ import { ParallelPlan } from './plan.cjs';
3
+ import { Plugin, PluginHost, SystemRoutePlanner } from '../../core/ecs/plugin.cjs';
4
+ import { SystemConfig } from '../../core/ecs/system.cjs';
5
+ export { WorkerPool, DEFAULT_JOIN_TIMEOUT_MS } from './pool.cjs';
6
+ export type { AttachWorkersOptions } from './pool.cjs';
7
+ /**
8
+ * Start, report and stop the one pool a world runs its parallel systems on.
9
+ *
10
+ * It is also what the world calls back into. `plan` runs at registration, for
11
+ * every system, and claims the ones that declare `parallel`. The dispose hook
12
+ * runs with the world. Both are the plugin's half of the seam, not surface a
13
+ * caller uses.
14
+ */
15
+ export declare class ECSWorkers implements SystemRoutePlanner {
16
+ private readonly _memory;
17
+ private readonly _changes;
18
+ private readonly _control;
19
+ /** Resolve the default query of a `parallel` config, which is the first
20
+ * entry of `queries` read as a with-only query. */
21
+ private readonly _resolveQuery;
22
+ private readonly _fieldId;
23
+ /** Every parallel plan, in registration order. The pool loads a kernel for
24
+ * each and clears them all on detach. */
25
+ private readonly _plans;
26
+ private _pool;
27
+ /** @internal Built by `workers()`, never by a caller. */
28
+ constructor(host: PluginHost);
29
+ /** The attached pool, or `null`. */
30
+ get pool(): WorkerPool | null;
31
+ /**
32
+ * Start a pool of workers and run this world's parallel systems on it.
33
+ *
34
+ * Each worker gets the store bytes, the store base and a control buffer, and
35
+ * loads the kernel of every parallel system already registered. The promise
36
+ * resolves when every worker is parked on the barrier with its kernels in
37
+ * hand. A system registered later runs `fn` until `pool.settled()` resolves.
38
+ *
39
+ * The world's backing must be `shared` or `wasm`, because a worker reads the
40
+ * bytes directly. The host must be able to block on `Atomics.wait`, which a
41
+ * browser main thread refuses. One pool per world.
42
+ *
43
+ * The host parks on every pass, so a worker that dies would park it for the
44
+ * life of the process. `joinTimeoutMs` bounds that wait, fails the frame
45
+ * with `PARALLEL_KERNEL_FAILED`, and leaves every later frame on the
46
+ * sequential body until the caller detaches.
47
+ *
48
+ * Cold path. Call it once, outside any frame.
49
+ *
50
+ * @example
51
+ * const pool = await world.workers.attach({ count: 4 });
52
+ * // later
53
+ * await world.workers.detach();
54
+ */
55
+ attach(options?: AttachWorkersOptions): Promise<WorkerPool>;
56
+ /** Stop the workers and put every parallel system back on its `fn`.
57
+ * Resolves at once on a world that holds no pool. */
58
+ detach(): Promise<void>;
59
+ /** @internal The registration seam. Resolves one `parallel` config into the
60
+ * plan the dispatch reads, and refuses what a worker cannot serve. The
61
+ * world asks about every system, so a system that declares no `parallel`
62
+ * answers `undefined` and keeps its own `fn`. */
63
+ plan(config: SystemConfig): ParallelPlan | undefined;
64
+ /** @internal The world is going away. The workers hold the store bytes and
65
+ * keep the process alive, so they stop with it. `ECS.dispose` is
66
+ * synchronous and the stop is not, so this starts it and awaits nothing. */
67
+ dispose(): void;
68
+ }
69
+ /** The world surface this plugin adds. */
70
+ export interface WorkersPlugin {
71
+ readonly workers: ECSWorkers;
72
+ }
73
+ /** The workers plugin, for `ECS.create({ plugins: [workers()] })`. */
74
+ export declare function workers(): Plugin<WorkersPlugin>;
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,75 @@
1
+ import { WorkerPool, AttachWorkersOptions } from './pool.js';
2
+ import { ParallelPlan } from './plan.js';
3
+ import { Plugin, PluginHost, SystemRoutePlanner } from '../../core/ecs/plugin.js';
4
+ import { SystemConfig } from '../../core/ecs/system.js';
5
+ export { WorkerPool, DEFAULT_JOIN_TIMEOUT_MS } from './pool.js';
6
+ export type { AttachWorkersOptions } from './pool.js';
7
+ /**
8
+ * Start, report and stop the one pool a world runs its parallel systems on.
9
+ *
10
+ * It is also what the world calls back into. `plan` runs at registration, for
11
+ * every system, and claims the ones that declare `parallel`. The dispose hook
12
+ * runs with the world. Both are the plugin's half of the seam, not surface a
13
+ * caller uses.
14
+ */
15
+ export declare class ECSWorkers implements SystemRoutePlanner {
16
+ private readonly _memory;
17
+ private readonly _changes;
18
+ private readonly _control;
19
+ /** Resolve the default query of a `parallel` config, which is the first
20
+ * entry of `queries` read as a with-only query. */
21
+ private readonly _resolveQuery;
22
+ private readonly _fieldId;
23
+ /** Every parallel plan, in registration order. The pool loads a kernel for
24
+ * each and clears them all on detach. */
25
+ private readonly _plans;
26
+ private _pool;
27
+ /** @internal Built by `workers()`, never by a caller. */
28
+ constructor(host: PluginHost);
29
+ /** The attached pool, or `null`. */
30
+ get pool(): WorkerPool | null;
31
+ /**
32
+ * Start a pool of workers and run this world's parallel systems on it.
33
+ *
34
+ * Each worker gets the store bytes, the store base and a control buffer, and
35
+ * loads the kernel of every parallel system already registered. The promise
36
+ * resolves when every worker is parked on the barrier with its kernels in
37
+ * hand. A system registered later runs `fn` until `pool.settled()` resolves.
38
+ *
39
+ * The world's backing must be `shared` or `wasm`, because a worker reads the
40
+ * bytes directly. The host must be able to block on `Atomics.wait`, which a
41
+ * browser main thread refuses. One pool per world.
42
+ *
43
+ * The host parks on every pass, so a worker that dies would park it for the
44
+ * life of the process. `joinTimeoutMs` bounds that wait, fails the frame
45
+ * with `PARALLEL_KERNEL_FAILED`, and leaves every later frame on the
46
+ * sequential body until the caller detaches.
47
+ *
48
+ * Cold path. Call it once, outside any frame.
49
+ *
50
+ * @example
51
+ * const pool = await world.workers.attach({ count: 4 });
52
+ * // later
53
+ * await world.workers.detach();
54
+ */
55
+ attach(options?: AttachWorkersOptions): Promise<WorkerPool>;
56
+ /** Stop the workers and put every parallel system back on its `fn`.
57
+ * Resolves at once on a world that holds no pool. */
58
+ detach(): Promise<void>;
59
+ /** @internal The registration seam. Resolves one `parallel` config into the
60
+ * plan the dispatch reads, and refuses what a worker cannot serve. The
61
+ * world asks about every system, so a system that declares no `parallel`
62
+ * answers `undefined` and keeps its own `fn`. */
63
+ plan(config: SystemConfig): ParallelPlan | undefined;
64
+ /** @internal The world is going away. The workers hold the store bytes and
65
+ * keep the process alive, so they stop with it. `ECS.dispose` is
66
+ * synchronous and the stop is not, so this starts it and awaits nothing. */
67
+ dispose(): void;
68
+ }
69
+ /** The world surface this plugin adds. */
70
+ export interface WorkersPlugin {
71
+ readonly workers: ECSWorkers;
72
+ }
73
+ /** The workers plugin, for `ECS.create({ plugins: [workers()] })`. */
74
+ export declare function workers(): Plugin<WorkersPlugin>;
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;KAoBK;AAEL,OAAO,EAAE,UAAU,EAAE,KAAK,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AACrF,OAAO,KAAK,EAEX,MAAM,EACN,UAAU,EAGV,kBAAkB,EAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAEnD;;;;;;;GAOG;AACH,qBAAa,UAAW,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC;uDACmD;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E;6CACyC;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,KAAK,CAA2B;IAExC,yDAAyD;gBAC7C,IAAI,EAAE,UAAU;IAe5B,oCAAoC;IACpC,IAAW,IAAI,IAAI,UAAU,GAAG,IAAI,CAEnC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCxE;yDACqD;IACxC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;;qDAGiD;IAC1C,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS;IAuB3D;;gFAE4E;IACrE,OAAO,IAAI,IAAI;CAItB;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC7B;AAED,sEAAsE;AACtE,wBAAgB,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,CAO/C"}
@@ -0,0 +1,25 @@
1
+ /***
2
+ * `node:worker_threads`, reached without a specifier a bundler can see.
3
+ *
4
+ * The pool and the worker entry both need the node threads module, and both
5
+ * ship in a bundle an app may compile for the browser. A literal
6
+ * `import("node:worker_threads")` is visible to the bundler, so the bundler
7
+ * reports an externalized node builtin and ships a stub module in its place.
8
+ * The report is noise, because the browser branch never evaluates the call, and
9
+ * an app author cannot act on it.
10
+ *
11
+ * `process.getBuiltinModule` reads the builtin with no specifier for a bundler
12
+ * to resolve. Node gained it after the version this package supports, so the
13
+ * fallback builds the specifier at run time, which no bundler resolves either.
14
+ ***/
15
+ type NodeThreads = typeof import("node:worker_threads");
16
+ /**
17
+ * The node threads module, on a node-compatible runtime.
18
+ *
19
+ * The caller decides that the runtime is node-compatible. On a browser this
20
+ * rejects, because there is no builtin to read. Cold path, and a caller runs it
21
+ * once for each pool and once for each worker.
22
+ */
23
+ export declare function loadNodeThreads(): Promise<NodeThreads>;
24
+ export {};
25
+ //# sourceMappingURL=node_threads.d.ts.map
@@ -0,0 +1,25 @@
1
+ /***
2
+ * `node:worker_threads`, reached without a specifier a bundler can see.
3
+ *
4
+ * The pool and the worker entry both need the node threads module, and both
5
+ * ship in a bundle an app may compile for the browser. A literal
6
+ * `import("node:worker_threads")` is visible to the bundler, so the bundler
7
+ * reports an externalized node builtin and ships a stub module in its place.
8
+ * The report is noise, because the browser branch never evaluates the call, and
9
+ * an app author cannot act on it.
10
+ *
11
+ * `process.getBuiltinModule` reads the builtin with no specifier for a bundler
12
+ * to resolve. Node gained it after the version this package supports, so the
13
+ * fallback builds the specifier at run time, which no bundler resolves either.
14
+ ***/
15
+ type NodeThreads = typeof import("node:worker_threads");
16
+ /**
17
+ * The node threads module, on a node-compatible runtime.
18
+ *
19
+ * The caller decides that the runtime is node-compatible. On a browser this
20
+ * rejects, because there is no builtin to read. Cold path, and a caller runs it
21
+ * once for each pool and once for each worker.
22
+ */
23
+ export declare function loadNodeThreads(): Promise<NodeThreads>;
24
+ export {};
25
+ //# sourceMappingURL=node_threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_threads.d.ts","sourceRoot":"","sources":["../../../src/plugins/workers/node_threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;KAaK;AAEL,KAAK,WAAW,GAAG,cAAc,qBAAqB,CAAC,CAAC;AAMxD;;;;;;GAMG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAS5D"}
@@ -0,0 +1,61 @@
1
+ import { ComponentDef } from '../../core/ecs/component.cjs';
2
+ import { Query } from '../../core/ecs/query.cjs';
3
+ import { ParallelConfig, SystemConfig } from '../../core/ecs/system.cjs';
4
+ /**
5
+ * The total matched row count below which a parallel system runs `fn` on the
6
+ * main thread.
7
+ *
8
+ * Measured, and deliberately conservative. A probe sweeps a memory-bound body
9
+ * and a compute-bound one, each as a `js` kernel and as a `wasm` kernel, over
10
+ * the shared backing and the wasm backing, on more than one engine family. This
11
+ * value sits above every crossover it found. So a world that never tunes it
12
+ * never pays a pooled frame that the sequential frame would have won.
13
+ *
14
+ * One number cannot serve two costs, and this one serves the memory-bound case.
15
+ * A compute-bound body crosses far earlier, and this value costs it most of its
16
+ * gain. Give such a system its own `minRows`.
17
+ *
18
+ * The crossover also rises with the worker count, because the barrier grows
19
+ * while the work for each worker shrinks. The plan cannot scale by that count,
20
+ * because the pool attaches after the plan is built.
21
+ *
22
+ * `parallel.minRows` from the caller always wins, and zero is a value.
23
+ */
24
+ export declare const DEFAULT_PARALLEL_MIN_ROWS = 200000;
25
+ /** What one dispatch reads. Mutable, because the pool fills `slot` and `ready`
26
+ * when the workers report the kernel loaded. */
27
+ export interface ParallelPlan {
28
+ /** The kernel's slot in the pool, or -1 before the pool takes it. */
29
+ slot: number;
30
+ /** Whether every worker holds the kernel. False until then, and the system
31
+ * runs `fn` in the meantime. */
32
+ ready: boolean;
33
+ readonly exportName: string;
34
+ /** The query whose archetypes the kernel runs over. */
35
+ readonly query: Query<any>;
36
+ readonly include: Uint32Array;
37
+ readonly exclude: Uint32Array | null;
38
+ /** `(component_id, field_id)` pairs, flat, in the kernel's argument order. */
39
+ readonly specs: Int32Array;
40
+ readonly minRows: number;
41
+ /** The components whose changed tick the join stamps. */
42
+ readonly writes: readonly ComponentDef<any>[];
43
+ readonly kernel: ParallelConfig["kernel"];
44
+ }
45
+ /**
46
+ * Refuse a parallel config a worker cannot serve. Dev guard, and it runs at
47
+ * registration so the fault names the config instead of a frame.
48
+ *
49
+ * `query` is the resolved first query, because the dense-only rule is a
50
+ * property of the query and not of the declaration list.
51
+ */
52
+ export declare function assertParallelConfig(config: SystemConfig, query: Query<any>): void;
53
+ /**
54
+ * Resolve one parallel config into the plan the dispatch reads. Runs in every
55
+ * build, because the masks and the column specs are not diagnostics.
56
+ *
57
+ * `fieldId` maps a field name to the id the descriptor carries, which is the
58
+ * world's own mapping.
59
+ */
60
+ export declare function createParallelPlan(parallel: ParallelConfig, query: Query<any>, writes: readonly ComponentDef<any>[], fieldId: (def: ComponentDef<any>, field: string) => number): ParallelPlan;
61
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1,61 @@
1
+ import { ComponentDef } from '../../core/ecs/component.js';
2
+ import { Query } from '../../core/ecs/query.js';
3
+ import { ParallelConfig, SystemConfig } from '../../core/ecs/system.js';
4
+ /**
5
+ * The total matched row count below which a parallel system runs `fn` on the
6
+ * main thread.
7
+ *
8
+ * Measured, and deliberately conservative. A probe sweeps a memory-bound body
9
+ * and a compute-bound one, each as a `js` kernel and as a `wasm` kernel, over
10
+ * the shared backing and the wasm backing, on more than one engine family. This
11
+ * value sits above every crossover it found. So a world that never tunes it
12
+ * never pays a pooled frame that the sequential frame would have won.
13
+ *
14
+ * One number cannot serve two costs, and this one serves the memory-bound case.
15
+ * A compute-bound body crosses far earlier, and this value costs it most of its
16
+ * gain. Give such a system its own `minRows`.
17
+ *
18
+ * The crossover also rises with the worker count, because the barrier grows
19
+ * while the work for each worker shrinks. The plan cannot scale by that count,
20
+ * because the pool attaches after the plan is built.
21
+ *
22
+ * `parallel.minRows` from the caller always wins, and zero is a value.
23
+ */
24
+ export declare const DEFAULT_PARALLEL_MIN_ROWS = 200000;
25
+ /** What one dispatch reads. Mutable, because the pool fills `slot` and `ready`
26
+ * when the workers report the kernel loaded. */
27
+ export interface ParallelPlan {
28
+ /** The kernel's slot in the pool, or -1 before the pool takes it. */
29
+ slot: number;
30
+ /** Whether every worker holds the kernel. False until then, and the system
31
+ * runs `fn` in the meantime. */
32
+ ready: boolean;
33
+ readonly exportName: string;
34
+ /** The query whose archetypes the kernel runs over. */
35
+ readonly query: Query<any>;
36
+ readonly include: Uint32Array;
37
+ readonly exclude: Uint32Array | null;
38
+ /** `(component_id, field_id)` pairs, flat, in the kernel's argument order. */
39
+ readonly specs: Int32Array;
40
+ readonly minRows: number;
41
+ /** The components whose changed tick the join stamps. */
42
+ readonly writes: readonly ComponentDef<any>[];
43
+ readonly kernel: ParallelConfig["kernel"];
44
+ }
45
+ /**
46
+ * Refuse a parallel config a worker cannot serve. Dev guard, and it runs at
47
+ * registration so the fault names the config instead of a frame.
48
+ *
49
+ * `query` is the resolved first query, because the dense-only rule is a
50
+ * property of the query and not of the declaration list.
51
+ */
52
+ export declare function assertParallelConfig(config: SystemConfig, query: Query<any>): void;
53
+ /**
54
+ * Resolve one parallel config into the plan the dispatch reads. Runs in every
55
+ * build, because the masks and the column specs are not diagnostics.
56
+ *
57
+ * `fieldId` maps a field name to the id the descriptor carries, which is the
58
+ * world's own mapping.
59
+ */
60
+ export declare function createParallelPlan(parallel: ParallelConfig, query: Query<any>, writes: readonly ComponentDef<any>[], fieldId: (def: ComponentDef<any>, field: string) => number): ParallelPlan;
61
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/plugins/workers/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;KAYK;AAGL,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAEjD;gDACgD;AAChD,MAAM,WAAW,YAAY;IAC5B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb;oCACgC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CAC1C;AA8ED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CA0GlF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,SAAS,YAAY,CAAC,GAAG,CAAC,EAAE,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GACxD,YAAY,CAmBd"}