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