@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,14 @@
|
|
|
1
|
+
import { HostMessage, WorkerReply, WorkerStart } from './protocol.cjs';
|
|
2
|
+
/** What a runtime adapter drives. `onMessage` takes one host message, and
|
|
3
|
+
* `start` is called once the worker is ready to receive them. */
|
|
4
|
+
export interface WorkerRuntime {
|
|
5
|
+
onMessage(message: HostMessage): void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build the worker body. `post` sends one reply to the host, and the adapter
|
|
9
|
+
* owns how that happens.
|
|
10
|
+
*
|
|
11
|
+
* Hot path once the barrier loop starts. Everything before it is setup.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createWorkerRuntime(start: WorkerStart, post: (reply: WorkerReply) => void): WorkerRuntime;
|
|
14
|
+
//# sourceMappingURL=worker_loop.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { HostMessage, WorkerReply, WorkerStart } from './protocol.js';
|
|
2
|
+
/** What a runtime adapter drives. `onMessage` takes one host message, and
|
|
3
|
+
* `start` is called once the worker is ready to receive them. */
|
|
4
|
+
export interface WorkerRuntime {
|
|
5
|
+
onMessage(message: HostMessage): void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build the worker body. `post` sends one reply to the host, and the adapter
|
|
9
|
+
* owns how that happens.
|
|
10
|
+
*
|
|
11
|
+
* Hot path once the barrier loop starts. Everything before it is setup.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createWorkerRuntime(start: WorkerStart, post: (reply: WorkerReply) => void): WorkerRuntime;
|
|
14
|
+
//# sourceMappingURL=worker_loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker_loop.d.ts","sourceRoot":"","sources":["../../../src/plugins/workers/worker_loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BK;AAEL,OAAO,EAaN,KAAK,WAAW,EAEhB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,MAAM,eAAe,CAAC;AA+HvB;iEACiE;AACjE,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAChC,aAAa,CAkMf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("./abi-D3V-QUSf.cjs"),a=require("../index.cjs");var p=typeof document<"u"?document.currentScript:null;async function b(){const o=globalThis.process,e=o?.getBuiltinModule;return typeof e=="function"?e.call(o,"node:worker_threads"):await import(["node","worker_threads"].join(":"))}const w=0,E=1,R=2,g=3,C=4,A=C+f.COMPONENT_MASK_WORDS,O=A+f.COMPONENT_MASK_WORDS,v=O+1,L=v+1>>1,D=(L+1)*8,P=-1,W=-2,y=16,S=65536,N=3e4;function $(o){if(o===void 0)return 0;if(!Number.isInteger(o)||o<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be an integer >= 1, got ${String(o)}`);if(o%y!==0)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be a multiple of ${y}, the frame alignment of a wasm shadow stack, got ${o}`);if(o<S)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be at least ${S}, one WASM page, got ${o}`);return o}function K(){try{const o=new Int32Array(new SharedArrayBuffer(4));return Atomics.wait(o,0,1,0),!0}catch{return!1}}function U(){const o=globalThis.process;return typeof o=="object"&&o!==null&&typeof o.versions?.node=="string"}function B(){const o=globalThis.navigator?.hardwareConcurrency;return typeof o!="number"||!Number.isFinite(o)?1:Math.max(1,Math.floor(o)-1)}function j(){const o=new URL(typeof document>"u"?require("url").pathToFileURL(__filename).href:p&&p.tagName.toUpperCase()==="SCRIPT"&&p.src||new URL("plugins/workers.cjs",document.baseURI).href),e=o.pathname,t=e.lastIndexOf("/"),n=e.slice(t+1),s=n.indexOf("."),r=e.slice(0,t),i=r.slice(0,r.lastIndexOf("/")+1);return o.pathname=`${i}worker${s<0?"":n.slice(s)}`,o}class T{_waiting=new Map;_arrived=new Map;_failure=null;deliver(e){const t=e.slot===void 0?e.type:`${e.type}:${e.slot}`,n=this._waiting.get(t);if(n!==void 0&&n.length>0){n.shift()(e);return}const s=this._arrived.get(t);s===void 0?this._arrived.set(t,[e]):s.push(e)}fail(e){this._failure=e;for(const t of this._waiting.values())for(;t.length>0;)t.shift()({type:"kernel",error:e});this._waiting.clear()}expect(e,t){if(this._failure!==null)return Promise.resolve({type:e,slot:t,error:this._failure});const n=t===void 0?e:`${e}:${t}`,s=this._arrived.get(n);return s!==void 0&&s.length>0?Promise.resolve(s.shift()):new Promise(r=>{const i=this._waiting.get(n);i===void 0?this._waiting.set(n,[r]):i.push(r)})}}async function q(o,e){const t=await b();return e.map(n=>{const s=new t.Worker(o,{workerData:n}),r=new T;return s.on("message",i=>r.deliver(i)),s.on("error",i=>r.fail(i.message)),{post:i=>s.postMessage(i),expect:(i,l)=>r.expect(i,l),terminate:()=>s.terminate()}})}function F(o,e){return e.map(t=>{const n=new Worker(o,{type:"module"}),s=new T;return n.addEventListener("message",r=>s.deliver(r.data)),n.addEventListener("error",r=>{const i=r.message;s.fail(typeof i=="string"&&i!==""?i:`the script at '${String(o)}' did not load`)}),n.postMessage(t),{post:r=>n.postMessage(r),expect:(r,i)=>s.expect(r,i),terminate:()=>(n.terminate(),Promise.resolve())}})}class m{_world;_workers;_ctl;_ctlF64;_joinTimeoutMs;_state="idle";_epoch=0;_nextSlot=0;_pending=[];_syncing=Promise.resolve();constructor(e,t,n,s){this._world=e,this._workers=t,this._ctl=new Int32Array(n),this._ctlF64=new Float64Array(n),this._joinTimeoutMs=s}get count(){return this._workers.length}static async attach(e,t){if(!K())throw new a.ECSError(a.ECS_ERROR.WORKERS_HOST_CANNOT_PARK,"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.");const n=t?.count??B();if(!Number.isInteger(n)||n<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: count must be an integer >= 1, got ${String(n)}`);const s=t?.joinTimeoutMs??N;if(!Number.isInteger(s)||s<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: joinTimeoutMs must be an integer >= 1, got ${String(s)}`);const r=$(t?.stackBytes),i=new SharedArrayBuffer(D),l=[];for(let c=0;c<n;c++)l.push({store:e.store,storeBase:e.storeBase,control:i,index:c,count:n,stackBytes:r});const _=t?.workerUrl??j(),u=U()?await q(_,l):F(_,l),h=await Promise.all(u.map(c=>c.expect("ready")));for(let c=0;c<h.length;c++){const k=h[c].error;if(k!==void 0)throw await Promise.all(u.map(M=>M.terminate())),new a.ECSError(a.ECS_ERROR.WORKERS_ENTRY_UNREACHABLE,`workers.attach: worker ${c} did not start from '${String(_)}': ${k}. Pass workerUrl with the URL your bundler emits for the '@oasys/oecs/worker' entry.`)}const d=new m(e,u,i,s);for(const c of e.plans())d._pending.push(c);d._kick();try{await d.settled()}catch(c){throw await d.detach(),c}return d}register(e){this._state==="detached"||this._state==="failed"||(this._pending.push(e),this._kick())}_kick(){this._syncing=this._syncing.then(()=>this._sync())}settled(){return this._syncing}async _sync(){if(this._state==="detached"||this._state==="failed")return;const e=this._pending;this._pending=[],e.length>0&&this._state==="running"&&await this._park();for(const t of e){t.slot=this._nextSlot++;const n={type:"kernel",slot:t.slot,wasm:t.kernel.wasm,js:t.kernel.js,exportName:t.exportName,specs:t.specs},s=await Promise.all(this._workers.map(r=>(r.post(n),r.expect("kernel",t.slot))));for(let r=0;r<s.length;r++){const i=s[r].error;if(i!==void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`worker ${r} could not load the kernel export '${t.exportName}': ${String(i).replace(/\.$/,"")}. Check the module and the export name.`)}t.ready=!0}this._resume()}async _park(){this._state="idle";const e=this._ctl;Atomics.store(e,R,P),Atomics.store(e,w,++this._epoch),Atomics.notify(e,w),await Promise.all(this._workers.map(t=>t.expect("yielded")))}_resume(){if(this._state==="idle"){for(const e of this._workers)e.post({type:"run"});this._state="running"}}run(e,t,n,s){if(!e.ready||this._state!=="running"||(t.publishRowCounts(),e.query.entityCount<e.minRows))return!1;const r=this._ctl,i=e.exclude;Atomics.store(r,E,0),Atomics.store(r,g,0);for(let h=0;h<f.COMPONENT_MASK_WORDS;h++)r[C+h]=e.include[h]|0,r[A+h]=i===null?0:i[h]|0;r[O]=i===null?0:1,this._ctlF64[L]=n,Atomics.store(r,R,e.slot),Atomics.store(r,w,++this._epoch),Atomics.notify(r,w);const l=this._workers.length,_=performance.now()+this._joinTimeoutMs;for(;;){const h=Atomics.load(r,E);if(h===l)break;const d=_-performance.now();if(d<=0)throw this._stamp(e,s),this._state="failed",new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`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.`);Atomics.wait(r,E,h,d)}this._stamp(e,s);const u=Atomics.load(r,g);if(u!==0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`worker ${u-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.`);return!0}_stamp(e,t){const n=e.query.archetypes,s=e.writes;for(let r=0;r<n.length;r++){const i=n[r];if(i.hasColumns)for(let l=0;l<s.length;l++){const _=s[l];i.columnGroupMut(_,t);const u=i.rowTicks[_.id];u!==void 0&&u.fill(t,0,i.enabledCount)}}for(let r=0;r<s.length;r++)this._world.noteScan(s[r].id)}async detach(){if(this._state==="detached")return;try{await this._syncing}catch{}const e=this._state==="running";if(this._state="detached",this._pending.length=0,e){const t=this._ctl;Atomics.store(t,R,W),Atomics.store(t,w,++this._epoch),Atomics.notify(t,w)}await Promise.all(this._workers.map(t=>t.terminate()));for(const t of this._world.plans())t.ready=!1,t.slot=-1;this._world.released()}}const H=2e5;function I(o){const e=new Uint32Array(f.COMPONENT_MASK_WORDS);for(let t=0;t<f.COMPONENT_MASK_WORDS&&t<o.length;t++)e[t]=o[t]>>>0;return e}function V(o){const e=o.excludeWords;return e===null?null:I(e)}function J(o,e,t,n){const s=new Int32Array(o.columns.length*2);for(let r=0;r<o.columns.length;r++){const[i,l]=o.columns[r];s[r*2]=i.id,s[r*2+1]=n(i,l)}return{slot:-1,ready:!1,exportName:o.kernel.export,query:e,include:I(e.include.words),exclude:V(e),specs:s,minRows:o.minRows??H,writes:t,kernel:o.kernel}}class x{_memory;_changes;_control;_resolveQuery;_fieldId;_plans=[];_pool=null;constructor(e){const t=e.store,n=e.world;this._resolveQuery=s=>n.query(...s),this._fieldId=(s,r)=>t.fieldIdOf(s,r),this._memory=e.memory,this._changes=e.changes,e.onDispose(()=>this.dispose()),this._control=e.installRoute(this)}get pool(){return this._pool}async attach(e){if(this._pool!==null)throw new a.ECSError(a.ECS_ERROR.WORKERS_ATTACHED,"workers.attach: this world already holds a pool. One pool per world, detach it before you attach another.");const t=this._memory.backing;if(t===null)throw new a.ECSError(a.ECS_ERROR.WORKERS_NEED_SHARED_BACKING,`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 }.`);const n=await m.attach({store:t,storeBase:this._memory.storeBase,noteScan:s=>this._changes.noteScan(s),plans:()=>this._plans,released:()=>{this._pool=null,this._control.route(null)}},e);return this._pool=n,this._control.route(n),n}async detach(){const e=this._pool;e!==null&&await e.detach()}plan(e){const t=e.parallel;if(t===void 0)return;let n=t.query;if(n===void 0){const r=e.queries?.[0];if(r===void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`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.`);n=this._resolveQuery(r)}const s=J(t,n,e.writes,this._fieldId);return this._plans.push(s),this._pool?.register(s),s}dispose(){this._pool?.detach(),this._plans.length=0}}function Y(){return{name:"workers",install(o){return{workers:new x(o)}}}}exports.DEFAULT_JOIN_TIMEOUT_MS=N;exports.ECSWorkers=x;exports.WorkerPool=m;exports.workers=Y;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./workers/index.cjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./workers/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./abi-D3V-QUSf.cjs"),a=require("../index.development.cjs");var f=typeof document<"u"?document.currentScript:null;async function x(){const o=globalThis.process,e=o?.getBuiltinModule;return typeof e=="function"?e.call(o,"node:worker_threads"):await import(["node","worker_threads"].join(":"))}const w=0,p=1,R=2,C=3,A=4,L=A+_.COMPONENT_MASK_WORDS,g=L+_.COMPONENT_MASK_WORDS,P=g+1,O=P+1>>1,M=(O+1)*8,I=-1,D=-2,k=16,y=65536,$=3e4;function W(o){if(o===void 0)return 0;if(!Number.isInteger(o)||o<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be an integer >= 1, got ${String(o)}`);if(o%k!==0)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be a multiple of ${k}, the frame alignment of a wasm shadow stack, got ${o}`);if(o<y)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: stackBytes must be at least ${y}, one WASM page, got ${o}`);return o}function K(){try{const o=new Int32Array(new SharedArrayBuffer(4));return Atomics.wait(o,0,1,0),!0}catch{return!1}}function U(){const o=globalThis.process;return typeof o=="object"&&o!==null&&typeof o.versions?.node=="string"}function q(){const o=globalThis.navigator?.hardwareConcurrency;return typeof o!="number"||!Number.isFinite(o)?1:Math.max(1,Math.floor(o)-1)}function j(){const o=new URL(typeof document>"u"?require("url").pathToFileURL(__filename).href:f&&f.tagName.toUpperCase()==="SCRIPT"&&f.src||new URL("plugins/workers.development.cjs",document.baseURI).href),e=o.pathname,t=e.lastIndexOf("/"),s=e.slice(t+1),n=s.indexOf("."),r=e.slice(0,t),i=r.slice(0,r.lastIndexOf("/")+1);return o.pathname=`${i}worker${n<0?"":s.slice(n)}`,o}class b{_waiting=new Map;_arrived=new Map;_failure=null;deliver(e){const t=e.slot===void 0?e.type:`${e.type}:${e.slot}`,s=this._waiting.get(t);if(s!==void 0&&s.length>0){s.shift()(e);return}const n=this._arrived.get(t);n===void 0?this._arrived.set(t,[e]):n.push(e)}fail(e){this._failure=e;for(const t of this._waiting.values())for(;t.length>0;)t.shift()({type:"kernel",error:e});this._waiting.clear()}expect(e,t){if(this._failure!==null)return Promise.resolve({type:e,slot:t,error:this._failure});const s=t===void 0?e:`${e}:${t}`,n=this._arrived.get(s);return n!==void 0&&n.length>0?Promise.resolve(n.shift()):new Promise(r=>{const i=this._waiting.get(s);i===void 0?this._waiting.set(s,[r]):i.push(r)})}}async function B(o,e){const t=await x();return e.map(s=>{const n=new t.Worker(o,{workerData:s}),r=new b;return n.on("message",i=>r.deliver(i)),n.on("error",i=>r.fail(i.message)),{post:i=>n.postMessage(i),expect:(i,h)=>r.expect(i,h),terminate:()=>n.terminate()}})}function F(o,e){return e.map(t=>{const s=new Worker(o,{type:"module"}),n=new b;return s.addEventListener("message",r=>n.deliver(r.data)),s.addEventListener("error",r=>{const i=r.message;n.fail(typeof i=="string"&&i!==""?i:`the script at '${String(o)}' did not load`)}),s.postMessage(t),{post:r=>s.postMessage(r),expect:(r,i)=>n.expect(r,i),terminate:()=>(s.terminate(),Promise.resolve())}})}class E{_world;_workers;_ctl;_ctlF64;_joinTimeoutMs;_state="idle";_epoch=0;_nextSlot=0;_pending=[];_syncing=Promise.resolve();constructor(e,t,s,n){this._world=e,this._workers=t,this._ctl=new Int32Array(s),this._ctlF64=new Float64Array(s),this._joinTimeoutMs=n}get count(){return this._workers.length}static async attach(e,t){if(!K())throw new a.ECSError(a.ECS_ERROR.WORKERS_HOST_CANNOT_PARK,"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.");const s=t?.count??q();if(!Number.isInteger(s)||s<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: count must be an integer >= 1, got ${String(s)}`);const n=t?.joinTimeoutMs??$;if(!Number.isInteger(n)||n<1)throw new a.ECSError(a.ECS_ERROR.WORKERS_COUNT_INVALID,`workers.attach: joinTimeoutMs must be an integer >= 1, got ${String(n)}`);const r=W(t?.stackBytes),i=new SharedArrayBuffer(M),h=[];for(let d=0;d<s;d++)h.push({store:e.store,storeBase:e.storeBase,control:i,index:d,count:s,stackBytes:r});const u=t?.workerUrl??j(),c=U()?await B(u,h):F(u,h),l=await Promise.all(c.map(d=>d.expect("ready")));for(let d=0;d<l.length;d++){const S=l[d].error;if(S!==void 0)throw await Promise.all(c.map(T=>T.terminate())),new a.ECSError(a.ECS_ERROR.WORKERS_ENTRY_UNREACHABLE,`workers.attach: worker ${d} did not start from '${String(u)}': ${S}. Pass workerUrl with the URL your bundler emits for the '@oasys/oecs/worker' entry.`)}const m=new E(e,c,i,n);for(const d of e.plans())m._pending.push(d);m._kick();try{await m.settled()}catch(d){throw await m.detach(),d}return m}register(e){this._state==="detached"||this._state==="failed"||(this._pending.push(e),this._kick())}_kick(){this._syncing=this._syncing.then(()=>this._sync())}settled(){return this._syncing}async _sync(){if(this._state==="detached"||this._state==="failed")return;const e=this._pending;this._pending=[],e.length>0&&this._state==="running"&&await this._park();for(const t of e){t.slot=this._nextSlot++;const s={type:"kernel",slot:t.slot,wasm:t.kernel.wasm,js:t.kernel.js,exportName:t.exportName,specs:t.specs},n=await Promise.all(this._workers.map(r=>(r.post(s),r.expect("kernel",t.slot))));for(let r=0;r<n.length;r++){const i=n[r].error;if(i!==void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`worker ${r} could not load the kernel export '${t.exportName}': ${String(i).replace(/\.$/,"")}. Check the module and the export name.`)}t.ready=!0}this._resume()}async _park(){this._state="idle";const e=this._ctl;Atomics.store(e,R,I),Atomics.store(e,w,++this._epoch),Atomics.notify(e,w),await Promise.all(this._workers.map(t=>t.expect("yielded")))}_resume(){if(this._state==="idle"){for(const e of this._workers)e.post({type:"run"});this._state="running"}}run(e,t,s,n){if(!e.ready||this._state!=="running"||(t.publishRowCounts(),e.query.entityCount<e.minRows))return!1;const r=this._ctl,i=e.exclude;Atomics.store(r,p,0),Atomics.store(r,C,0);for(let l=0;l<_.COMPONENT_MASK_WORDS;l++)r[A+l]=e.include[l]|0,r[L+l]=i===null?0:i[l]|0;r[g]=i===null?0:1,this._ctlF64[O]=s,Atomics.store(r,R,e.slot),Atomics.store(r,w,++this._epoch),Atomics.notify(r,w);const h=this._workers.length,u=performance.now()+this._joinTimeoutMs;for(;;){const l=Atomics.load(r,p);if(l===h)break;const m=u-performance.now();if(m<=0)throw this._stamp(e,n),this._state="failed",new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`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.`);Atomics.wait(r,p,l,m)}this._stamp(e,n);const c=Atomics.load(r,C);if(c!==0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_FAILED,`worker ${c-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.`);return!0}_stamp(e,t){const s=e.query.archetypes,n=e.writes;for(let r=0;r<s.length;r++){const i=s[r];if(i.hasColumns)for(let h=0;h<n.length;h++){const u=n[h];i.columnGroupMut(u,t);const c=i.rowTicks[u.id];c!==void 0&&c.fill(t,0,i.enabledCount)}}for(let r=0;r<n.length;r++)this._world.noteScan(n[r].id)}async detach(){if(this._state==="detached")return;try{await this._syncing}catch{}const e=this._state==="running";if(this._state="detached",this._pending.length=0,e){const t=this._ctl;Atomics.store(t,R,D),Atomics.store(t,w,++this._epoch),Atomics.notify(t,w)}await Promise.all(this._workers.map(t=>t.terminate()));for(const t of this._world.plans())t.ready=!1,t.slot=-1;this._world.released()}}const H=2e5;function G(o,e,t){const s=WebAssembly.Module.imports(e);let n=!1;for(const i of s){if(i.module==="env"&&i.name==="memory"&&i.kind==="memory"){n=!0;continue}throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_MODULE,`${o} names a wasm kernel that imports '${i.module}.${i.name}' as a ${i.kind}, and a worker supplies only 'env.memory'. Drop the import, or move what it does into the kernel.`)}if(!n)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_MODULE,`${o} 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.`);const r=WebAssembly.Module.exports(e).find(i=>i.name===t);if(r===void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_MODULE,`${o} names the wasm kernel export '${t}' and the module exports no such name. Name an export the module carries.`);if(r.kind!=="function")throw new a.ECSError(a.ECS_ERROR.PARALLEL_KERNEL_MODULE,`${o} names the wasm kernel export '${t}', and the module exports it as a ${r.kind}. A kernel must be a function.`)}function v(o){const e=new Uint32Array(_.COMPONENT_MASK_WORDS);for(let t=0;t<_.COMPONENT_MASK_WORDS&&t<o.length;t++)e[t]=o[t]>>>0;return e}function V(o){const e=o.excludeWords;return e===null?null:v(e)}const J=[["spawns","a worker makes no structural change"],["despawns","a worker makes no structural change"],["transitions","a worker makes no structural change"],["resourceReads","a resource is a main-thread value"],["resourceWrites","a resource is a main-thread value"],["sparseReads","a sparse store is a main-thread object"],["sparseWrites","a sparse store is a main-thread object"],["relationReads","a relation store is a main-thread object"],["relationWrites","a relation store is a main-thread object"]];function Y(o,e){const t=o.parallel,s=o.name!==void 0?`system '${o.name}'`:"a parallel system";for(const[l,m]of J){const d=o[l];if(d!==void 0&&d.length>0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares '${l}' beside 'parallel', and ${m}. Drop the declaration, or run the system sequentially.`)}if(o.exclusive===!0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares 'exclusive' beside 'parallel', and an exclusive system reaches state no worker can see. Drop 'exclusive', or run the system sequentially.`);if(o.backendHandle!==void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares 'backendHandle' beside 'parallel', and one system body cannot run in two places. Keep one of them.`);if(o.fn===void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares 'parallel' with no 'fn'. The sequential body runs below the row threshold, and on a world with no pool, so it is required.`);const n=e.terms;if(n.sparseIncludes.length>0||n.sparseExcludes.length>0||n.relationIncludes.length>0||n.relationExcludes.length>0||n.hierarchyTerm!==null||n.includesDisabled)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} 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.`);const r=new Set;for(const l of o.reads)r.add(l.id);for(const l of o.writes)r.add(l.id);const i=new Set;for(const l of e.defs)i.add(l.id);const h=new Set;for(const[l]of t.columns){if(h.add(l.id),!r.has(l.id))throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} names component id ${l.id} in 'parallel.columns' but not in 'reads' or 'writes'. Add it to the access declaration.`);if(!i.has(l.id))throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} names component id ${l.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.`)}for(const l of o.writes)if(!h.has(l.id))throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares a write of component id ${l.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.`);for(const l of e.defs)if(!r.has(l.id))throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} queries component id ${l.id} that is not in 'reads' or 'writes'. Add it to the access declaration.`);const u=t.minRows;if(u!==void 0&&(!Number.isInteger(u)||u<0))throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares parallel.minRows must be an integer >= 0, got ${String(u)}`);const c=t.kernel;if(typeof c.export!="string"||c.export.length===0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares parallel.kernel.export must be a non-empty export name, got ${String(c.export)}`);if(c.wasm===void 0&&c.js===void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`${s} declares a parallel.kernel with neither 'wasm' nor 'js'. Give a compiled WebAssembly.Module, or an absolute module URL a worker can import.`);c.wasm!==void 0&&G(s,c.wasm,c.export)}function Q(o,e,t,s){const n=new Int32Array(o.columns.length*2);for(let r=0;r<o.columns.length;r++){const[i,h]=o.columns[r];n[r*2]=i.id,n[r*2+1]=s(i,h)}return{slot:-1,ready:!1,exportName:o.kernel.export,query:e,include:v(e.include.words),exclude:V(e),specs:n,minRows:o.minRows??H,writes:t,kernel:o.kernel}}class N{_memory;_changes;_control;_resolveQuery;_fieldId;_plans=[];_pool=null;constructor(e){const t=e.store,s=e.world;this._resolveQuery=n=>s.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)}get pool(){return this._pool}async attach(e){if(this._pool!==null)throw new a.ECSError(a.ECS_ERROR.WORKERS_ATTACHED,"workers.attach: this world already holds a pool. One pool per world, detach it before you attach another.");const t=this._memory.backing;if(t===null)throw new a.ECSError(a.ECS_ERROR.WORKERS_NEED_SHARED_BACKING,`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 }.`);const s=await E.attach({store:t,storeBase:this._memory.storeBase,noteScan:n=>this._changes.noteScan(n),plans:()=>this._plans,released:()=>{this._pool=null,this._control.route(null)}},e);return this._pool=s,this._control.route(s),s}async detach(){const e=this._pool;e!==null&&await e.detach()}plan(e){const t=e.parallel;if(t===void 0)return;let s=t.query;if(s===void 0){const r=e.queries?.[0];if(r===void 0)throw new a.ECSError(a.ECS_ERROR.PARALLEL_ACCESS,`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.`);s=this._resolveQuery(r)}Y(e,s);const n=Q(t,s,e.writes,this._fieldId);return this._plans.push(n),this._pool?.register(n),n}dispose(){this._pool?.detach(),this._plans.length=0}}function X(){return{name:"workers",install(o){return{workers:new N(o)}}}}exports.DEFAULT_JOIN_TIMEOUT_MS=$;exports.ECSWorkers=N;exports.WorkerPool=E;exports.workers=X;
|