@forgeax/engine-ecs 0.0.0-dev.8d955ade1c79
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/LICENSE +202 -0
- package/README.md +278 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__fixtures__/field-shape-fixture.d.ts +16 -0
- package/dist/__fixtures__/field-shape-fixture.d.ts.map +1 -0
- package/dist/__tests__/__fixtures__/inspect-scripts.snapshot.d.ts +3 -0
- package/dist/__tests__/__fixtures__/inspect-scripts.snapshot.d.ts.map +1 -0
- package/dist/__tests__/archetype.unit.test.d.ts +2 -0
- package/dist/__tests__/archetype.unit.test.d.ts.map +1 -0
- package/dist/__tests__/array-handle-element.test-d.d.ts +2 -0
- package/dist/__tests__/array-handle-element.test-d.d.ts.map +1 -0
- package/dist/__tests__/buffer-array-vocab.test-d.d.ts +2 -0
- package/dist/__tests__/buffer-array-vocab.test-d.d.ts.map +1 -0
- package/dist/__tests__/buffer-field-input-widen.unit.test.d.ts +2 -0
- package/dist/__tests__/buffer-field-input-widen.unit.test.d.ts.map +1 -0
- package/dist/__tests__/buffer-pool.test-d.d.ts +2 -0
- package/dist/__tests__/buffer-pool.test-d.d.ts.map +1 -0
- package/dist/__tests__/change-detection.unit.test.d.ts +2 -0
- package/dist/__tests__/change-detection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/command-buffer.test.d.ts +2 -0
- package/dist/__tests__/command-buffer.test.d.ts.map +1 -0
- package/dist/__tests__/commands-deferred.unit.test.d.ts +2 -0
- package/dist/__tests__/commands-deferred.unit.test.d.ts.map +1 -0
- package/dist/__tests__/component-catalog.test.d.ts +2 -0
- package/dist/__tests__/component-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/component-definition-identity.unit.test.d.ts +2 -0
- package/dist/__tests__/component-definition-identity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/component-nan-preflight.unit.test.d.ts +2 -0
- package/dist/__tests__/component-nan-preflight.unit.test.d.ts.map +1 -0
- package/dist/__tests__/component-schema.test-d.d.ts +2 -0
- package/dist/__tests__/component-schema.test-d.d.ts.map +1 -0
- package/dist/__tests__/component-schema.test.d.ts +2 -0
- package/dist/__tests__/component-schema.test.d.ts.map +1 -0
- package/dist/__tests__/define-component-options.test-d.d.ts +2 -0
- package/dist/__tests__/define-component-options.test-d.d.ts.map +1 -0
- package/dist/__tests__/deprecated-vocab-rejection.unit.test.d.ts +2 -0
- package/dist/__tests__/deprecated-vocab-rejection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/despawn-all.unit.test.d.ts +2 -0
- package/dist/__tests__/despawn-all.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ecs-core-reduction.characterization.test.d.ts +2 -0
- package/dist/__tests__/ecs-core-reduction.characterization.test.d.ts.map +1 -0
- package/dist/__tests__/ecs-core-reduction.perf.test.d.ts +2 -0
- package/dist/__tests__/ecs-core-reduction.perf.test.d.ts.map +1 -0
- package/dist/__tests__/ecs-error-code-31.test-d.d.ts +2 -0
- package/dist/__tests__/ecs-error-code-31.test-d.d.ts.map +1 -0
- package/dist/__tests__/entity-disabling.unit.test.d.ts +2 -0
- package/dist/__tests__/entity-disabling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/entity-handle-codec-parity.unit.test.d.ts +2 -0
- package/dist/__tests__/entity-handle-codec-parity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/errors.unit.test.d.ts +2 -0
- package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/execution-conflict-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/execution-conflict-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/execution-shared-storage.unit.test.d.ts +2 -0
- package/dist/__tests__/execution-shared-storage.unit.test.d.ts.map +1 -0
- package/dist/__tests__/externalization-portable-value.unit.test.d.ts +2 -0
- package/dist/__tests__/externalization-portable-value.unit.test.d.ts.map +1 -0
- package/dist/__tests__/externalization-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/externalization-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/externalization-render-read-lease.test-d.d.ts +2 -0
- package/dist/__tests__/externalization-render-read-lease.test-d.d.ts.map +1 -0
- package/dist/__tests__/externalization-render-read-lease.unit.test.d.ts +2 -0
- package/dist/__tests__/externalization-render-read-lease.unit.test.d.ts.map +1 -0
- package/dist/__tests__/externalization-root-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/externalization-root-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/field-enum-labels-reflection.test.d.ts +2 -0
- package/dist/__tests__/field-enum-labels-reflection.test.d.ts.map +1 -0
- package/dist/__tests__/field-shape-fixture.test.d.ts +2 -0
- package/dist/__tests__/field-shape-fixture.test.d.ts.map +1 -0
- package/dist/__tests__/field-transient-reflection.test.d.ts +2 -0
- package/dist/__tests__/field-transient-reflection.test.d.ts.map +1 -0
- package/dist/__tests__/field-value-type.test-d.d.ts +2 -0
- package/dist/__tests__/field-value-type.test-d.d.ts.map +1 -0
- package/dist/__tests__/fixed-update.unit.test.d.ts +2 -0
- package/dist/__tests__/fixed-update.unit.test.d.ts.map +1 -0
- package/dist/__tests__/handle.test-d.d.ts +2 -0
- package/dist/__tests__/handle.test-d.d.ts.map +1 -0
- package/dist/__tests__/hierarchy.unit.test.d.ts +2 -0
- package/dist/__tests__/hierarchy.unit.test.d.ts.map +1 -0
- package/dist/__tests__/managed-array-vocab.test-d.d.ts +2 -0
- package/dist/__tests__/managed-array-vocab.test-d.d.ts.map +1 -0
- package/dist/__tests__/minimal-example.test-d.d.ts +2 -0
- package/dist/__tests__/minimal-example.test-d.d.ts.map +1 -0
- package/dist/__tests__/name-read-types.test-d.d.ts +2 -0
- package/dist/__tests__/name-read-types.test-d.d.ts.map +1 -0
- package/dist/__tests__/plugin-service.test.d.ts +2 -0
- package/dist/__tests__/plugin-service.test.d.ts.map +1 -0
- package/dist/__tests__/query-combinations.unit.test.d.ts +2 -0
- package/dist/__tests__/query-combinations.unit.test.d.ts.map +1 -0
- package/dist/__tests__/query-light-extract-flat-column-ratio.perf.test.d.ts +2 -0
- package/dist/__tests__/query-light-extract-flat-column-ratio.perf.test.d.ts.map +1 -0
- package/dist/__tests__/query-storage-trends.perf.test.d.ts +2 -0
- package/dist/__tests__/query-storage-trends.perf.test.d.ts.map +1 -0
- package/dist/__tests__/query-trs-flat-column-ratio.perf.test.d.ts +2 -0
- package/dist/__tests__/query-trs-flat-column-ratio.perf.test.d.ts.map +1 -0
- package/dist/__tests__/query.unit.test.d.ts +2 -0
- package/dist/__tests__/query.unit.test.d.ts.map +1 -0
- package/dist/__tests__/relationship-index.perf.test.d.ts +2 -0
- package/dist/__tests__/relationship-index.perf.test.d.ts.map +1 -0
- package/dist/__tests__/relationship-index.test.d.ts +2 -0
- package/dist/__tests__/relationship-index.test.d.ts.map +1 -0
- package/dist/__tests__/scalar-field-type-owner.test-d.d.ts +2 -0
- package/dist/__tests__/scalar-field-type-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/schedule-determinism.unit.test.d.ts +2 -0
- package/dist/__tests__/schedule-determinism.unit.test.d.ts.map +1 -0
- package/dist/__tests__/schedule-inspection.unit.test.d.ts +2 -0
- package/dist/__tests__/schedule-inspection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/schedule-scope-error.unit.test.d.ts +2 -0
- package/dist/__tests__/schedule-scope-error.unit.test.d.ts.map +1 -0
- package/dist/__tests__/schedule-token.unit.test.d.ts +2 -0
- package/dist/__tests__/schedule-token.unit.test.d.ts.map +1 -0
- package/dist/__tests__/schema-vocab.test-d.d.ts +2 -0
- package/dist/__tests__/schema-vocab.test-d.d.ts.map +1 -0
- package/dist/__tests__/serialization.unit.test.d.ts +2 -0
- package/dist/__tests__/serialization.unit.test.d.ts.map +1 -0
- package/dist/__tests__/shared-kernel-eligibility.test-d.d.ts +2 -0
- package/dist/__tests__/shared-kernel-eligibility.test-d.d.ts.map +1 -0
- package/dist/__tests__/shared-kernel-eligibility.unit.test.d.ts +2 -0
- package/dist/__tests__/shared-kernel-eligibility.unit.test.d.ts.map +1 -0
- package/dist/__tests__/shared-ref-store.unit.test.d.ts +2 -0
- package/dist/__tests__/shared-ref-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sparse-tag.unit.test.d.ts +2 -0
- package/dist/__tests__/sparse-tag.unit.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-field-error.test-d.d.ts +2 -0
- package/dist/__tests__/spawn-field-error.test-d.d.ts.map +1 -0
- package/dist/__tests__/stale-error.test-d.d.ts +2 -0
- package/dist/__tests__/stale-error.test-d.d.ts.map +1 -0
- package/dist/__tests__/string-view-symmetry.test-d.d.ts +2 -0
- package/dist/__tests__/string-view-symmetry.test-d.d.ts.map +1 -0
- package/dist/__tests__/string-vocab.test-d.d.ts +2 -0
- package/dist/__tests__/string-vocab.test-d.d.ts.map +1 -0
- package/dist/__tests__/structure-epoch-boundaries.unit.test.d.ts +2 -0
- package/dist/__tests__/structure-epoch-boundaries.unit.test.d.ts.map +1 -0
- package/dist/__tests__/structure-epoch.unit.test.d.ts +2 -0
- package/dist/__tests__/structure-epoch.unit.test.d.ts.map +1 -0
- package/dist/__tests__/table-archetype-mapping.unit.test.d.ts +2 -0
- package/dist/__tests__/table-archetype-mapping.unit.test.d.ts.map +1 -0
- package/dist/__tests__/time.unit.test.d.ts +2 -0
- package/dist/__tests__/time.unit.test.d.ts.map +1 -0
- package/dist/__tests__/types.test-d.d.ts +2 -0
- package/dist/__tests__/types.test-d.d.ts.map +1 -0
- package/dist/__tests__/unique-ref-store.unit.test.d.ts +2 -0
- package/dist/__tests__/unique-ref-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/utils/handle-numeric.d.ts +14 -0
- package/dist/__tests__/utils/handle-numeric.d.ts.map +1 -0
- package/dist/__tests__/validation-root-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/validation-root-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-atomic-write.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-atomic-write.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world-change-journal.unit.test.d.ts +2 -0
- package/dist/__tests__/world-change-journal.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world-characterization.unit.test.d.ts +2 -0
- package/dist/__tests__/world-characterization.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world-consumer-inference.test-d.d.ts +2 -0
- package/dist/__tests__/world-consumer-inference.test-d.d.ts.map +1 -0
- package/dist/__tests__/world-health.contract.test.d.ts +2 -0
- package/dist/__tests__/world-health.contract.test.d.ts.map +1 -0
- package/dist/__tests__/world-inspection.test.d.ts +2 -0
- package/dist/__tests__/world-inspection.test.d.ts.map +1 -0
- package/dist/__tests__/world-internal-identity.unit.test.d.ts +2 -0
- package/dist/__tests__/world-internal-identity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world-managed-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/world-managed-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world-scheduling.m4.test.d.ts +2 -0
- package/dist/__tests__/world-scheduling.m4.test.d.ts.map +1 -0
- package/dist/__tests__/world-unique-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/world-unique-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/world.test-d.d.ts +2 -0
- package/dist/__tests__/world.test-d.d.ts.map +1 -0
- package/dist/buffer-pool.d.ts +109 -0
- package/dist/buffer-pool.d.ts.map +1 -0
- package/dist/commands.d.ts +93 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/component-default-fallback.d.ts +88 -0
- package/dist/component-default-fallback.d.ts.map +1 -0
- package/dist/component-schema.d.ts +34 -0
- package/dist/component-schema.d.ts.map +1 -0
- package/dist/component-value-validate.d.ts +29 -0
- package/dist/component-value-validate.d.ts.map +1 -0
- package/dist/component.d.ts +581 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/entity-handle.d.ts +68 -0
- package/dist/entity-handle.d.ts.map +1 -0
- package/dist/entity.d.ts +86 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/errors/query-and-component-errors.d.ts +132 -0
- package/dist/errors/query-and-component-errors.d.ts.map +1 -0
- package/dist/errors/relationship-errors.d.ts +112 -0
- package/dist/errors/relationship-errors.d.ts.map +1 -0
- package/dist/errors/sprite-and-shared-errors.d.ts +107 -0
- package/dist/errors/sprite-and-shared-errors.d.ts.map +1 -0
- package/dist/errors/validation-errors.d.ts +229 -0
- package/dist/errors/validation-errors.d.ts.map +1 -0
- package/dist/errors.d.ts +763 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/execution/shared-kernel.d.ts +106 -0
- package/dist/execution/shared-kernel.d.ts.map +1 -0
- package/dist/externalization/index.d.ts +31 -0
- package/dist/externalization/index.d.ts.map +1 -0
- package/dist/externalization/index.mjs +298 -0
- package/dist/externalization/index.mjs.map +1 -0
- package/dist/index.d.ts +261 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +7422 -0
- package/dist/index.mjs.map +1 -0
- package/dist/internal.mjs +479 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/plugin-service.d.ts +11 -0
- package/dist/plugin-service.d.ts.map +1 -0
- package/dist/projection/index.d.ts +103 -0
- package/dist/projection/index.d.ts.map +1 -0
- package/dist/projection/index.mjs +615 -0
- package/dist/projection/index.mjs.map +1 -0
- package/dist/query/query.d.ts +58 -0
- package/dist/query/query.d.ts.map +1 -0
- package/dist/relationship-index.d.ts +81 -0
- package/dist/relationship-index.d.ts.map +1 -0
- package/dist/resource.d.ts +70 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/schedule-token.d.ts +16 -0
- package/dist/schedule-token.d.ts.map +1 -0
- package/dist/schedule.d.ts +271 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/shared-ref-store.d.ts +144 -0
- package/dist/shared-ref-store.d.ts.map +1 -0
- package/dist/shared.d.ts +3 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.mjs +364 -0
- package/dist/shared.mjs.map +1 -0
- package/dist/storage/archetype-graph.d.ts +54 -0
- package/dist/storage/archetype-graph.d.ts.map +1 -0
- package/dist/storage/archetype.d.ts +23 -0
- package/dist/storage/archetype.d.ts.map +1 -0
- package/dist/storage/change-detection.d.ts +40 -0
- package/dist/storage/change-detection.d.ts.map +1 -0
- package/dist/storage/column.d.ts +111 -0
- package/dist/storage/column.d.ts.map +1 -0
- package/dist/storage/table.d.ts +29 -0
- package/dist/storage/table.d.ts.map +1 -0
- package/dist/time.d.ts +57 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/unique-ref-store.d.ts +105 -0
- package/dist/unique-ref-store.d.ts.map +1 -0
- package/dist/world-change-journal.d.ts +34 -0
- package/dist/world-change-journal.d.ts.map +1 -0
- package/dist/world-component-access.d.ts +265 -0
- package/dist/world-component-access.d.ts.map +1 -0
- package/dist/world-component-storage.d.ts +282 -0
- package/dist/world-component-storage.d.ts.map +1 -0
- package/dist/world-core.d.ts +39 -0
- package/dist/world-core.d.ts.map +1 -0
- package/dist/world-entity-lifecycle.d.ts +30 -0
- package/dist/world-entity-lifecycle.d.ts.map +1 -0
- package/dist/world-internal.d.ts +14 -0
- package/dist/world-internal.d.ts.map +1 -0
- package/dist/world-scheduling.d.ts +30 -0
- package/dist/world-scheduling.d.ts.map +1 -0
- package/dist/world.d.ts +620 -0
- package/dist/world.d.ts.map +1 -0
- package/package.json +77 -0
- package/src/__fixtures__/field-shape-fixture.ts +30 -0
- package/src/__tests__/__fixtures__/inspect-scripts.snapshot.ts +2 -0
- package/src/__tests__/archetype.unit.test.ts +1837 -0
- package/src/__tests__/array-handle-element.test-d.ts +34 -0
- package/src/__tests__/buffer-array-vocab.test-d.ts +53 -0
- package/src/__tests__/buffer-field-input-widen.unit.test.ts +99 -0
- package/src/__tests__/buffer-pool.test-d.ts +32 -0
- package/src/__tests__/change-detection.unit.test.ts +86 -0
- package/src/__tests__/command-buffer.test.ts +179 -0
- package/src/__tests__/commands-deferred.unit.test.ts +68 -0
- package/src/__tests__/component-catalog.test.ts +59 -0
- package/src/__tests__/component-definition-identity.unit.test.ts +24 -0
- package/src/__tests__/component-nan-preflight.unit.test.ts +186 -0
- package/src/__tests__/component-schema.test-d.ts +119 -0
- package/src/__tests__/component-schema.test.ts +55 -0
- package/src/__tests__/define-component-options.test-d.ts +35 -0
- package/src/__tests__/deprecated-vocab-rejection.unit.test.ts +59 -0
- package/src/__tests__/despawn-all.unit.test.ts +17 -0
- package/src/__tests__/ecs-core-reduction.characterization.test.ts +130 -0
- package/src/__tests__/ecs-core-reduction.perf.test.ts +260 -0
- package/src/__tests__/ecs-error-code-31.test-d.ts +42 -0
- package/src/__tests__/entity-disabling.unit.test.ts +37 -0
- package/src/__tests__/entity-handle-codec-parity.unit.test.ts +126 -0
- package/src/__tests__/errors.unit.test.ts +1456 -0
- package/src/__tests__/execution-conflict-boundary.unit.test.ts +123 -0
- package/src/__tests__/execution-shared-storage.unit.test.ts +40 -0
- package/src/__tests__/externalization-portable-value.unit.test.ts +275 -0
- package/src/__tests__/externalization-projection.unit.test.ts +325 -0
- package/src/__tests__/externalization-render-read-lease.test-d.ts +30 -0
- package/src/__tests__/externalization-render-read-lease.unit.test.ts +79 -0
- package/src/__tests__/externalization-root-surface.unit.test.ts +33 -0
- package/src/__tests__/field-enum-labels-reflection.test.ts +66 -0
- package/src/__tests__/field-shape-fixture.test.ts +61 -0
- package/src/__tests__/field-transient-reflection.test.ts +59 -0
- package/src/__tests__/field-value-type.test-d.ts +57 -0
- package/src/__tests__/fixed-update.unit.test.ts +78 -0
- package/src/__tests__/handle.test-d.ts +86 -0
- package/src/__tests__/hierarchy.unit.test.ts +2534 -0
- package/src/__tests__/managed-array-vocab.test-d.ts +137 -0
- package/src/__tests__/minimal-example.test-d.ts +42 -0
- package/src/__tests__/name-read-types.test-d.ts +72 -0
- package/src/__tests__/plugin-service.test.ts +13 -0
- package/src/__tests__/query-combinations.unit.test.ts +42 -0
- package/src/__tests__/query-light-extract-flat-column-ratio.perf.test.ts +252 -0
- package/src/__tests__/query-storage-trends.perf.test.ts +104 -0
- package/src/__tests__/query-trs-flat-column-ratio.perf.test.ts +194 -0
- package/src/__tests__/query.unit.test.ts +196 -0
- package/src/__tests__/relationship-index.perf.test.ts +126 -0
- package/src/__tests__/relationship-index.test.ts +70 -0
- package/src/__tests__/scalar-field-type-owner.test-d.ts +71 -0
- package/src/__tests__/schedule-determinism.unit.test.ts +36 -0
- package/src/__tests__/schedule-inspection.unit.test.ts +81 -0
- package/src/__tests__/schedule-scope-error.unit.test.ts +63 -0
- package/src/__tests__/schedule-token.unit.test.ts +54 -0
- package/src/__tests__/schema-vocab.test-d.ts +103 -0
- package/src/__tests__/serialization.unit.test.ts +2740 -0
- package/src/__tests__/shared-kernel-eligibility.test-d.ts +18 -0
- package/src/__tests__/shared-kernel-eligibility.unit.test.ts +78 -0
- package/src/__tests__/shared-ref-store.unit.test.ts +646 -0
- package/src/__tests__/sparse-tag.unit.test.ts +201 -0
- package/src/__tests__/spawn-field-error.test-d.ts +41 -0
- package/src/__tests__/stale-error.test-d.ts +208 -0
- package/src/__tests__/string-view-symmetry.test-d.ts +26 -0
- package/src/__tests__/string-vocab.test-d.ts +49 -0
- package/src/__tests__/structure-epoch-boundaries.unit.test.ts +39 -0
- package/src/__tests__/structure-epoch.unit.test.ts +48 -0
- package/src/__tests__/table-archetype-mapping.unit.test.ts +78 -0
- package/src/__tests__/time.unit.test.ts +79 -0
- package/src/__tests__/types.test-d.ts +38 -0
- package/src/__tests__/unique-ref-store.unit.test.ts +348 -0
- package/src/__tests__/utils/handle-numeric.ts +30 -0
- package/src/__tests__/validation-root-surface.unit.test.ts +15 -0
- package/src/__tests__/visibility-atomic-write.unit.test.ts +82 -0
- package/src/__tests__/world-change-journal.unit.test.ts +97 -0
- package/src/__tests__/world-characterization.unit.test.ts +408 -0
- package/src/__tests__/world-consumer-inference.test-d.ts +16 -0
- package/src/__tests__/world-health.contract.test.ts +87 -0
- package/src/__tests__/world-inspection.test.ts +37 -0
- package/src/__tests__/world-internal-identity.unit.test.ts +17 -0
- package/src/__tests__/world-managed-roundtrip.unit.test.ts +98 -0
- package/src/__tests__/world-scheduling.m4.test.ts +52 -0
- package/src/__tests__/world-unique-roundtrip.unit.test.ts +357 -0
- package/src/__tests__/world.test-d.ts +156 -0
- package/src/buffer-pool.ts +357 -0
- package/src/commands.ts +644 -0
- package/src/component-default-fallback.ts +236 -0
- package/src/component-schema.ts +92 -0
- package/src/component-value-validate.ts +135 -0
- package/src/component.ts +1268 -0
- package/src/entity-handle.ts +104 -0
- package/src/entity.ts +140 -0
- package/src/errors/query-and-component-errors.ts +200 -0
- package/src/errors/relationship-errors.ts +198 -0
- package/src/errors/sprite-and-shared-errors.ts +231 -0
- package/src/errors/validation-errors.ts +506 -0
- package/src/errors.ts +1464 -0
- package/src/execution/shared-kernel.ts +392 -0
- package/src/externalization/index.ts +170 -0
- package/src/index.ts +414 -0
- package/src/plugin-service.ts +35 -0
- package/src/projection/index.ts +318 -0
- package/src/query/query.ts +606 -0
- package/src/relationship-index.ts +175 -0
- package/src/resource.ts +106 -0
- package/src/schedule-token.ts +40 -0
- package/src/schedule.ts +846 -0
- package/src/shared-ref-store.ts +418 -0
- package/src/shared.ts +23 -0
- package/src/storage/archetype-graph.ts +166 -0
- package/src/storage/archetype.ts +78 -0
- package/src/storage/change-detection.ts +231 -0
- package/src/storage/column.ts +247 -0
- package/src/storage/table.ts +153 -0
- package/src/time.ts +122 -0
- package/src/unique-ref-store.ts +278 -0
- package/src/world-change-journal.ts +84 -0
- package/src/world-component-access.ts +1421 -0
- package/src/world-component-storage.ts +1178 -0
- package/src/world-core.ts +74 -0
- package/src/world-entity-lifecycle.ts +539 -0
- package/src/world-internal.ts +75 -0
- package/src/world-scheduling.ts +499 -0
- package/src/world.ts +1399 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Handle } from '@forgeax/engine-types';
|
|
2
|
+
import { type Result } from '@forgeax/engine-types';
|
|
3
|
+
import { BuiltinSlotNotOwnedError, SharedRefDoubleReleaseError, SharedRefReleasedError, SharedRefStaleError } from './errors';
|
|
4
|
+
export interface SharedRefMutation {
|
|
5
|
+
readonly epoch: number;
|
|
6
|
+
readonly handle: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SharedRefReleaseEvidence {
|
|
9
|
+
readonly payload: unknown;
|
|
10
|
+
readonly refcount: 0;
|
|
11
|
+
readonly generation: number;
|
|
12
|
+
readonly evidence: 'released';
|
|
13
|
+
}
|
|
14
|
+
export type SharedRefMutationRead = {
|
|
15
|
+
readonly status: 'ok';
|
|
16
|
+
readonly cursor: number;
|
|
17
|
+
readonly records: readonly SharedRefMutation[];
|
|
18
|
+
} | {
|
|
19
|
+
readonly status: 'overflow';
|
|
20
|
+
readonly cursor: number;
|
|
21
|
+
readonly oldestAvailable: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Reference-counted store for ECS-aware `Handle<T, 'shared'>` lifecycles.
|
|
25
|
+
*
|
|
26
|
+
* The producer (typically AssetRegistry) calls `alloc` once and owns the
|
|
27
|
+
* "alloc-grant" rc=1; consumers (ECS schema fields, external systems) call
|
|
28
|
+
* `retain` on each new holder and `release` when the holder drops. When rc
|
|
29
|
+
* transitions 1 -> 0 the store publishes one structured release-evidence
|
|
30
|
+
* record; it does not invoke a user callback or own payload disposal.
|
|
31
|
+
*
|
|
32
|
+
* D-15: manages ONLY user-tier slots (`slot >= BUILTIN_BASE`). Builtin slots
|
|
33
|
+
* (`< BUILTIN_BASE`) fail-fast with `BuiltinSlotNotOwnedError`.
|
|
34
|
+
*
|
|
35
|
+
* Public API:
|
|
36
|
+
* - alloc(target, payload) -> Handle<T, 'shared'> (rc=1)
|
|
37
|
+
* - intern(target, payload) -> stable producer handle per target + object identity
|
|
38
|
+
* - resolve(handle) -> Result<T, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
|
|
39
|
+
* - markChanged(handle) -> Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
|
|
40
|
+
* - getMutationEpoch() -> monotonic payload-mutation cursor
|
|
41
|
+
* - retain(handle) -> Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
|
|
42
|
+
* - release(handle) -> Result<release evidence | undefined, ...>
|
|
43
|
+
* - refcount(handle) -> number (0 == released; debug + tests)
|
|
44
|
+
* - _liveCount() -> live slot count (debug + inspector)
|
|
45
|
+
*/
|
|
46
|
+
export declare class SharedRefStore {
|
|
47
|
+
private readonly payloads;
|
|
48
|
+
private readonly refcounts;
|
|
49
|
+
private readonly freeSlots;
|
|
50
|
+
private readonly internedByTarget;
|
|
51
|
+
private readonly internedKeys;
|
|
52
|
+
private nextSlot;
|
|
53
|
+
private mutationEpoch;
|
|
54
|
+
private readonly mutationJournal;
|
|
55
|
+
private readonly releaseJournal;
|
|
56
|
+
/**
|
|
57
|
+
* Generation table indexed by slot (D-6). Each entry tracks the current
|
|
58
|
+
* generation for the slot — written to during alloc (welded into the
|
|
59
|
+
* returned handle via pack) and incremented on release (M4).
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
private readonly _generations;
|
|
64
|
+
/**
|
|
65
|
+
* Allocate a fresh shared handle for `payload`, branded against `target`.
|
|
66
|
+
* Refcount starts at 1 (the alloc-grant). Nullish payloads are rejected
|
|
67
|
+
* before a slot or free-list is touched.
|
|
68
|
+
*
|
|
69
|
+
* The returned handle carries a generation tag welded via codec.pack
|
|
70
|
+
* (D-8, OOS-2): first allocation gen=0 (AC-06), reused slot gen = the
|
|
71
|
+
* current generation from _generations[slot]. The toShared brand cast
|
|
72
|
+
* happens internally — external callers no longer construct Handle<...>
|
|
73
|
+
* directly.
|
|
74
|
+
*
|
|
75
|
+
* Minted slots are user-tier (`>= BUILTIN_BASE`); builtin slots are never
|
|
76
|
+
* produced here (D-15).
|
|
77
|
+
*/
|
|
78
|
+
alloc<Target extends string, T = unknown>(target: Target, payload: T): Handle<Target, 'shared'>;
|
|
79
|
+
/**
|
|
80
|
+
* Return the idempotent producer handle for one object payload in this
|
|
81
|
+
* store. Identity includes `target`, so the same object branded for two
|
|
82
|
+
* asset kinds does not alias.
|
|
83
|
+
*
|
|
84
|
+
* A cache hit deliberately does not retain: this is one producer grant,
|
|
85
|
+
* discovered repeatedly by an asset catalogue. Actual holders retain and
|
|
86
|
+
* release through the ECS write barrier. Callers needing independent
|
|
87
|
+
* grants or a per-handle deleter must use {@link alloc}.
|
|
88
|
+
*/
|
|
89
|
+
intern<Target extends string, T extends object>(target: Target, payload: T): Handle<Target, 'shared'>;
|
|
90
|
+
/**
|
|
91
|
+
* Look up `payload` by handle. Returns `err(shared-ref-released)` when
|
|
92
|
+
* the handle's slot has no live payload (rc reached 0, no re-alloc has
|
|
93
|
+
* filled the slot); `err(builtin-slot-not-owned)` for a builtin slot.
|
|
94
|
+
*
|
|
95
|
+
* §contract - mirrors UniqueRefStore: a stale handle whose slot has been
|
|
96
|
+
* released and re-allocated returns `err(shared-ref-stale)` - the handle's
|
|
97
|
+
* welded generation no longer matches `_generations[slot]`. The gen check
|
|
98
|
+
* runs before payload lookup, so stale-by-reuse is caught deterministically.
|
|
99
|
+
*/
|
|
100
|
+
resolve<Target extends string, T = unknown>(handle: Handle<Target, 'shared'>): Result<T, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
|
|
101
|
+
/**
|
|
102
|
+
* Publish that a live payload was mutated in place. Consumers that retain
|
|
103
|
+
* projections of shared payload data compare the monotonic epoch and
|
|
104
|
+
* explicitly refresh instead of rescanning every payload each frame.
|
|
105
|
+
*/
|
|
106
|
+
markChanged<Target extends string>(handle: Handle<Target, 'shared'>): Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
|
|
107
|
+
/** Current upper bound for explicitly published payload mutations. */
|
|
108
|
+
getMutationEpoch(): number;
|
|
109
|
+
/** Read exact changed handles after `cursor`; overflow requires consumer resync. */
|
|
110
|
+
readChangesSince(cursor: number): SharedRefMutationRead;
|
|
111
|
+
/**
|
|
112
|
+
* Increment the refcount of a live shared handle. Returns
|
|
113
|
+
* `err(shared-ref-released)` when the handle is not live - retain MUST
|
|
114
|
+
* NOT resurrect a released slot (charter P3 explicit failure; would
|
|
115
|
+
* defeat the rc=0 -> drop invariant); `err(builtin-slot-not-owned)` for a
|
|
116
|
+
* builtin slot.
|
|
117
|
+
*/
|
|
118
|
+
retain<Target extends string>(handle: Handle<Target, 'shared'>): Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
|
|
119
|
+
/**
|
|
120
|
+
* Decrement the refcount. When rc transitions 1 -> 0, the slot is dropped
|
|
121
|
+
* and one structured release-evidence record is published. The evidence
|
|
122
|
+
* captures the payload, zero refcount, next generation and `released` marker
|
|
123
|
+
* after the store has removed the live slot.
|
|
124
|
+
*
|
|
125
|
+
* Returns `err(shared-ref-double-release, rc=0)` when the handle has
|
|
126
|
+
* already reached rc=0 (or was never live); `err(builtin-slot-not-owned)`
|
|
127
|
+
* for a builtin slot. AI users branch on `.code` and route the
|
|
128
|
+
* second-release log to Layer 3 ErrorHandler without aborting the despawn
|
|
129
|
+
* chain.
|
|
130
|
+
*/
|
|
131
|
+
release<Target extends string>(handle: Handle<Target, 'shared'>): Result<SharedRefReleaseEvidence | undefined, SharedRefDoubleReleaseError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
|
|
132
|
+
/** Read the bounded release evidence owned by this store. */
|
|
133
|
+
readReleaseEvidence(): readonly SharedRefReleaseEvidence[];
|
|
134
|
+
/**
|
|
135
|
+
* Return the current refcount for `handle`. Returns 0 for a released
|
|
136
|
+
* (or never-allocated) slot. Primarily a debug + tests entry point;
|
|
137
|
+
* production code rarely reads rc directly (the rc=0 -> drop invariant
|
|
138
|
+
* is the surface AI users consume via release / the per-handle deleter).
|
|
139
|
+
*/
|
|
140
|
+
refcount<Target extends string>(handle: Handle<Target, 'shared'>): number;
|
|
141
|
+
/** @internal Diagnostic count of live slots. Exposed for tests + inspector. */
|
|
142
|
+
_liveCount(): number;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=shared-ref-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-ref-store.d.ts","sourceRoot":"","sources":["../src/shared-ref-store.ts"],"names":[],"mappings":"AAgEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EASL,KAAK,MAAM,EAGZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAE3B,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAAC;AAKN;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA8C;IAC/E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGzB;IACJ,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IAEjE;;;;;;OAMG;IAEH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAE7C;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAmB/F;;;;;;;;;OASG;IACH,MAAM,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,GACT,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAmB3B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC/B,MAAM,CAAC,CAAC,EAAE,sBAAsB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAoBrF;;;;OAIG;IACH,WAAW,CAAC,MAAM,SAAS,MAAM,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC/B,MAAM,CAAC,IAAI,EAAE,sBAAsB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAcxF,sEAAsE;IACtE,gBAAgB,IAAI,MAAM;IAI1B,oFAAoF;IACpF,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAYvD;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,SAAS,MAAM,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC/B,MAAM,CAAC,IAAI,EAAE,sBAAsB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAkBxF;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,SAAS,MAAM,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC/B,MAAM,CACP,wBAAwB,GAAG,SAAS,EACpC,2BAA2B,GAAG,mBAAmB,GAAG,wBAAwB,CAC7E;IAuDD,6DAA6D;IAC7D,mBAAmB,IAAI,SAAS,wBAAwB,EAAE;IAI1D;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM;IAKzE,+EAA+E;IAC/E,UAAU,IAAI,MAAM;CAGrB"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { KernelDispatchFailure, KernelDispatchResult, KernelDispatchSpan, SharedFieldView, SharedKernelDefinition, SharedKernelDispatch, SharedKernelEligibilityReason, SharedKernelExecutor, SharedKernelHandle, SharedSpanBinding, WorldExecutionHealth, } from './execution/shared-kernel';
|
|
2
|
+
export { bindSharedSpan, defineSharedKernel, isKernelDispatchFailure, isSharedSpan, SHARED_KERNEL_ELIGIBILITY_REASONS, SHARED_KERNEL_EXECUTOR_RESOURCE_KEY, sharedKernelEligibility, splitSharedSpan, } from './execution/shared-kernel';
|
|
3
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,6BAA6B,EAC7B,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,iCAAiC,EACjC,mCAAmC,EACnC,uBAAuB,EACvB,eAAe,GAChB,MAAM,2BAA2B,CAAC"}
|
package/dist/shared.mjs
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import '@forgeax/engine-types';
|
|
2
|
+
|
|
3
|
+
// src/component.ts
|
|
4
|
+
var FIELD_SIZE_BYTES = {
|
|
5
|
+
f32: 4,
|
|
6
|
+
f64: 8,
|
|
7
|
+
i32: 4,
|
|
8
|
+
u32: 4,
|
|
9
|
+
i16: 2,
|
|
10
|
+
u16: 2,
|
|
11
|
+
i8: 1,
|
|
12
|
+
u8: 1,
|
|
13
|
+
bool: 1,
|
|
14
|
+
enum: 4,
|
|
15
|
+
ref: 4
|
|
16
|
+
};
|
|
17
|
+
var COMPONENT_OWNER_REGISTRY = /* @__PURE__ */ Symbol.for("forgeax.ecs.componentOwnerRegistry");
|
|
18
|
+
var ownerSymbols = globalThis;
|
|
19
|
+
var ownerRegistry = ownerSymbols[COMPONENT_OWNER_REGISTRY] ?? (() => {
|
|
20
|
+
const registry = {
|
|
21
|
+
nextId: 1,
|
|
22
|
+
ids: /* @__PURE__ */ new WeakMap(),
|
|
23
|
+
schemas: /* @__PURE__ */ new WeakMap()
|
|
24
|
+
};
|
|
25
|
+
ownerSymbols[COMPONENT_OWNER_REGISTRY] = registry;
|
|
26
|
+
return registry;
|
|
27
|
+
})();
|
|
28
|
+
function componentId(component) {
|
|
29
|
+
const id = ownerRegistry.ids.get(component);
|
|
30
|
+
if (id === void 0) throw new Error(`Component identity missing for '${component.name}'.`);
|
|
31
|
+
return id;
|
|
32
|
+
}
|
|
33
|
+
function componentSchema(component) {
|
|
34
|
+
const schema = ownerRegistry.schemas.get(component);
|
|
35
|
+
if (schema === void 0) throw new Error(`Component schema missing for '${component.name}'.`);
|
|
36
|
+
return schema;
|
|
37
|
+
}
|
|
38
|
+
var VIEW_CTORS = {
|
|
39
|
+
f32: Float32Array,
|
|
40
|
+
f64: Float64Array,
|
|
41
|
+
i32: Int32Array,
|
|
42
|
+
u32: Uint32Array,
|
|
43
|
+
i16: Int16Array,
|
|
44
|
+
u16: Uint16Array,
|
|
45
|
+
i8: Int8Array,
|
|
46
|
+
u8: Uint8Array,
|
|
47
|
+
bool: Uint8Array,
|
|
48
|
+
enum: Uint32Array,
|
|
49
|
+
ref: Uint32Array
|
|
50
|
+
};
|
|
51
|
+
function scalarRow(t) {
|
|
52
|
+
return {
|
|
53
|
+
byteSize: FIELD_SIZE_BYTES[t],
|
|
54
|
+
viewCtor: VIEW_CTORS[t],
|
|
55
|
+
storage: t,
|
|
56
|
+
isScalar: true,
|
|
57
|
+
// The scalar `ref` shares its key with the vocab `ref<T>` family; mark
|
|
58
|
+
// it as managed so the single row covers both.
|
|
59
|
+
isManaged: t === "ref",
|
|
60
|
+
isBuffer: false,
|
|
61
|
+
isEntityRef: false,
|
|
62
|
+
isArray: false
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
Object.freeze({
|
|
66
|
+
f32: scalarRow("f32"),
|
|
67
|
+
f64: scalarRow("f64"),
|
|
68
|
+
i32: scalarRow("i32"),
|
|
69
|
+
u32: scalarRow("u32"),
|
|
70
|
+
i16: scalarRow("i16"),
|
|
71
|
+
u16: scalarRow("u16"),
|
|
72
|
+
i8: scalarRow("i8"),
|
|
73
|
+
u8: scalarRow("u8"),
|
|
74
|
+
bool: scalarRow("bool"),
|
|
75
|
+
enum: scalarRow("enum"),
|
|
76
|
+
ref: scalarRow("ref"),
|
|
77
|
+
entity: {
|
|
78
|
+
byteSize: 4,
|
|
79
|
+
viewCtor: Uint32Array,
|
|
80
|
+
storage: "u32",
|
|
81
|
+
isScalar: false,
|
|
82
|
+
isManaged: false,
|
|
83
|
+
isBuffer: false,
|
|
84
|
+
isEntityRef: true,
|
|
85
|
+
isArray: false
|
|
86
|
+
},
|
|
87
|
+
string: {
|
|
88
|
+
byteSize: 4,
|
|
89
|
+
viewCtor: Uint32Array,
|
|
90
|
+
storage: "u32",
|
|
91
|
+
isScalar: false,
|
|
92
|
+
isManaged: true,
|
|
93
|
+
isBuffer: false,
|
|
94
|
+
isEntityRef: false,
|
|
95
|
+
isArray: false
|
|
96
|
+
},
|
|
97
|
+
buffer: {
|
|
98
|
+
byteSize: 4,
|
|
99
|
+
viewCtor: Uint32Array,
|
|
100
|
+
storage: "u32",
|
|
101
|
+
isScalar: false,
|
|
102
|
+
isManaged: false,
|
|
103
|
+
isBuffer: true,
|
|
104
|
+
isEntityRef: false,
|
|
105
|
+
isArray: false
|
|
106
|
+
},
|
|
107
|
+
// feat-20260614-ecs-shared-component-and-unique-rename M3 (plan-strategy
|
|
108
|
+
// D-3): independent `'shared'` row, NOT a reuse of the `'ref'` (post-M2:
|
|
109
|
+
// `'unique<T>'` family) row. `isManaged: true` so write-barrier dispatch
|
|
110
|
+
// routes shared<T> fields through release on despawn / removeComponent /
|
|
111
|
+
// set-overwrite, but the M4 sub-dispatch in releaseManagedFieldOnRow will
|
|
112
|
+
// separate shared (rc--) from unique (direct slot drop) using the
|
|
113
|
+
// fieldType.startsWith('shared<') predicate. Keeping the meta key
|
|
114
|
+
// independent preserves the "meta key = release semantics" invariant
|
|
115
|
+
// (architecture-principles.md #1 SSOT).
|
|
116
|
+
shared: {
|
|
117
|
+
byteSize: 4,
|
|
118
|
+
viewCtor: Uint32Array,
|
|
119
|
+
storage: "u32",
|
|
120
|
+
isScalar: false,
|
|
121
|
+
isManaged: true,
|
|
122
|
+
isBuffer: false,
|
|
123
|
+
isEntityRef: false,
|
|
124
|
+
isArray: false
|
|
125
|
+
},
|
|
126
|
+
array: {
|
|
127
|
+
byteSize: 4,
|
|
128
|
+
viewCtor: Uint32Array,
|
|
129
|
+
storage: "u32",
|
|
130
|
+
isScalar: false,
|
|
131
|
+
isManaged: false,
|
|
132
|
+
isBuffer: false,
|
|
133
|
+
isEntityRef: false,
|
|
134
|
+
isArray: true
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// src/world-internal.ts
|
|
139
|
+
var worldInternal = /* @__PURE__ */ Symbol.for(
|
|
140
|
+
"forgeax.ecs.worldInternal"
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// src/execution/shared-kernel.ts
|
|
144
|
+
var SHARED_KERNEL_EXECUTOR_RESOURCE_KEY = "SharedKernelExecutor";
|
|
145
|
+
function isKernelDispatchFailure(value) {
|
|
146
|
+
return "cause" in value;
|
|
147
|
+
}
|
|
148
|
+
var SHARED_KERNEL_ELIGIBILITY_REASONS = [
|
|
149
|
+
"callback-not-module-function",
|
|
150
|
+
"dom-access",
|
|
151
|
+
"missing-access-declaration",
|
|
152
|
+
"descriptor-conflict",
|
|
153
|
+
"object-field",
|
|
154
|
+
"span-unavailable"
|
|
155
|
+
];
|
|
156
|
+
var SharedKernelEligibilityError = class extends Error {
|
|
157
|
+
code = "shared-kernel-ineligible";
|
|
158
|
+
expected = "a module-loadable named kernel with one or more numeric QuerySpan read/write declarations";
|
|
159
|
+
hint = "export a named function from the kernel module and use only dense numeric QuerySpan columns";
|
|
160
|
+
detail;
|
|
161
|
+
constructor(kernelName, reason) {
|
|
162
|
+
super(`Shared kernel "${kernelName}" is ineligible: ${reason}.`);
|
|
163
|
+
this.name = "SharedKernelEligibilityError";
|
|
164
|
+
this.detail = { kernelName, reason };
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
var SharedKernelFailureError = class extends Error {
|
|
168
|
+
code = "shared-kernel-failed";
|
|
169
|
+
expected = "every dispatched shard completes without a possible partial write";
|
|
170
|
+
hint = "do not retry this World; inspect detail.cause and rebuild with a new World identity";
|
|
171
|
+
detail;
|
|
172
|
+
constructor(kernelName, worldIdentity, cause, partialWrite) {
|
|
173
|
+
super(`Shared kernel "${kernelName}" failed; World ${worldIdentity} is poisoned.`);
|
|
174
|
+
this.name = "SharedKernelFailureError";
|
|
175
|
+
this.detail = { kernelName, worldIdentity, cause, partialWrite, retryable: false };
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var NUMERIC_FIELDS = /* @__PURE__ */ new Set([
|
|
179
|
+
"f32",
|
|
180
|
+
"f64",
|
|
181
|
+
"i32",
|
|
182
|
+
"u32",
|
|
183
|
+
"i16",
|
|
184
|
+
"u16",
|
|
185
|
+
"i8",
|
|
186
|
+
"u8",
|
|
187
|
+
"bool",
|
|
188
|
+
"enum",
|
|
189
|
+
"ref",
|
|
190
|
+
"entity"
|
|
191
|
+
]);
|
|
192
|
+
function components(descriptor) {
|
|
193
|
+
return [
|
|
194
|
+
...descriptor.read ?? [],
|
|
195
|
+
...descriptor.write ?? [],
|
|
196
|
+
...descriptor.optional ?? [],
|
|
197
|
+
...descriptor.with ?? [],
|
|
198
|
+
...descriptor.without ?? [],
|
|
199
|
+
...descriptor.changed ?? [],
|
|
200
|
+
...descriptor.added ?? []
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
function descriptorReason(descriptor) {
|
|
204
|
+
if ((descriptor.read?.length ?? 0) + (descriptor.write?.length ?? 0) === 0) {
|
|
205
|
+
return "missing-access-declaration";
|
|
206
|
+
}
|
|
207
|
+
if ((descriptor.optional?.length ?? 0) > 0 || (descriptor.changed?.length ?? 0) > 0 || (descriptor.added?.length ?? 0) > 0) {
|
|
208
|
+
return "span-unavailable";
|
|
209
|
+
}
|
|
210
|
+
const seen = /* @__PURE__ */ new Set();
|
|
211
|
+
for (const component of components(descriptor)) {
|
|
212
|
+
if (seen.has(componentId(component))) return "descriptor-conflict";
|
|
213
|
+
seen.add(componentId(component));
|
|
214
|
+
if (component.storage === "sparse") return "span-unavailable";
|
|
215
|
+
if (Object.values(componentSchema(component)).some((field) => !NUMERIC_FIELDS.has(field))) {
|
|
216
|
+
return "object-field";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return void 0;
|
|
220
|
+
}
|
|
221
|
+
function sharedKernelEligibility(moduleUrl, definition) {
|
|
222
|
+
try {
|
|
223
|
+
new URL(moduleUrl);
|
|
224
|
+
} catch {
|
|
225
|
+
return "callback-not-module-function";
|
|
226
|
+
}
|
|
227
|
+
const source = Function.prototype.toString.call(definition.run);
|
|
228
|
+
if (definition.run.name.length === 0 || source.includes("=>")) {
|
|
229
|
+
return "callback-not-module-function";
|
|
230
|
+
}
|
|
231
|
+
if (/\b(?:document|window|globalThis|HTMLElement|GPUDevice|AudioContext)\b/u.test(source)) {
|
|
232
|
+
return "dom-access";
|
|
233
|
+
}
|
|
234
|
+
for (const query of definition.queries) {
|
|
235
|
+
const reason = descriptorReason(query);
|
|
236
|
+
if (reason !== void 0) return reason;
|
|
237
|
+
}
|
|
238
|
+
return void 0;
|
|
239
|
+
}
|
|
240
|
+
function defineSharedKernel(moduleUrl, definition) {
|
|
241
|
+
const reason = sharedKernelEligibility(moduleUrl, definition);
|
|
242
|
+
if (reason !== void 0) throw new SharedKernelEligibilityError(definition.name, reason);
|
|
243
|
+
const handle = Object.freeze({
|
|
244
|
+
kind: "shared-kernel",
|
|
245
|
+
moduleUrl,
|
|
246
|
+
name: definition.name,
|
|
247
|
+
queries: definition.queries,
|
|
248
|
+
minimumRows: definition.minimumRows ?? 16384,
|
|
249
|
+
run: definition.run,
|
|
250
|
+
...definition.before !== void 0 ? { before: definition.before } : {},
|
|
251
|
+
...definition.after !== void 0 ? { after: definition.after } : {},
|
|
252
|
+
fn: (world, queries) => {
|
|
253
|
+
const dispatchSpans = [];
|
|
254
|
+
for (const [queryIndex, query] of queries.entries()) {
|
|
255
|
+
const result = query.spans();
|
|
256
|
+
if (!result.ok) throw new SharedKernelEligibilityError(definition.name, "span-unavailable");
|
|
257
|
+
for (const span of result.value) dispatchSpans.push({ queryIndex, span });
|
|
258
|
+
}
|
|
259
|
+
const spans = dispatchSpans.map((entry) => entry.span);
|
|
260
|
+
const totalRows = spans.reduce((sum, span) => sum + span.length, 0);
|
|
261
|
+
try {
|
|
262
|
+
if (totalRows < (definition.minimumRows ?? 16384) || !world.hasResource(SHARED_KERNEL_EXECUTOR_RESOURCE_KEY)) {
|
|
263
|
+
definition.run(spans);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const executor = world.getResource(
|
|
267
|
+
SHARED_KERNEL_EXECUTOR_RESOURCE_KEY
|
|
268
|
+
);
|
|
269
|
+
const result = executor.execute(handle, dispatchSpans);
|
|
270
|
+
if (isKernelDispatchFailure(result)) {
|
|
271
|
+
if (!result.partialWrite) {
|
|
272
|
+
definition.run(spans);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
world[worldInternal].poisonExecution({
|
|
276
|
+
code: "shared-kernel-failed",
|
|
277
|
+
kernelName: definition.name,
|
|
278
|
+
cause: result.cause,
|
|
279
|
+
partialWrite: result.partialWrite,
|
|
280
|
+
retryable: false
|
|
281
|
+
});
|
|
282
|
+
throw new SharedKernelFailureError(
|
|
283
|
+
definition.name,
|
|
284
|
+
world.execution.identity,
|
|
285
|
+
result.cause,
|
|
286
|
+
result.partialWrite
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
} catch (cause) {
|
|
290
|
+
if (world.execution.health !== "poisoned") {
|
|
291
|
+
world[worldInternal].poisonExecution({
|
|
292
|
+
code: "shared-kernel-failed",
|
|
293
|
+
kernelName: definition.name,
|
|
294
|
+
cause,
|
|
295
|
+
partialWrite: true,
|
|
296
|
+
retryable: false
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (cause instanceof SharedKernelFailureError) throw cause;
|
|
300
|
+
throw new SharedKernelFailureError(definition.name, world.execution.identity, cause, true);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
return handle;
|
|
305
|
+
}
|
|
306
|
+
function sliceFields(fields, start, end) {
|
|
307
|
+
return Object.fromEntries(
|
|
308
|
+
Object.entries(fields).map(([name, view]) => [name, view.subarray(start, end)])
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
function bindSharedSpan(kernel, span, queryIndex) {
|
|
312
|
+
const descriptor = kernel.queries[queryIndex];
|
|
313
|
+
if (descriptor === void 0) throw new Error(`Missing query descriptor ${queryIndex}.`);
|
|
314
|
+
const read = Object.fromEntries(
|
|
315
|
+
(descriptor.read ?? []).map((component) => [
|
|
316
|
+
component.name,
|
|
317
|
+
span.get(component)
|
|
318
|
+
])
|
|
319
|
+
);
|
|
320
|
+
const write = Object.fromEntries(
|
|
321
|
+
(descriptor.write ?? []).map((component) => [
|
|
322
|
+
component.name,
|
|
323
|
+
span.mut(component)
|
|
324
|
+
])
|
|
325
|
+
);
|
|
326
|
+
return { entities: span.entities, length: span.length, read, write };
|
|
327
|
+
}
|
|
328
|
+
function splitSharedSpan(binding, shardCount) {
|
|
329
|
+
if (binding.length === 0 || shardCount <= 0) return [];
|
|
330
|
+
const count = Math.min(binding.length, shardCount);
|
|
331
|
+
const shards = [];
|
|
332
|
+
for (let index = 0; index < count; index += 1) {
|
|
333
|
+
const start = Math.floor(binding.length * index / count);
|
|
334
|
+
const end = Math.floor(binding.length * (index + 1) / count);
|
|
335
|
+
shards.push({
|
|
336
|
+
entities: binding.entities.subarray(start, end),
|
|
337
|
+
length: end - start,
|
|
338
|
+
read: Object.fromEntries(
|
|
339
|
+
Object.entries(binding.read).map(([component, fields]) => [
|
|
340
|
+
component,
|
|
341
|
+
sliceFields(fields, start, end)
|
|
342
|
+
])
|
|
343
|
+
),
|
|
344
|
+
write: Object.fromEntries(
|
|
345
|
+
Object.entries(binding.write).map(([component, fields]) => [
|
|
346
|
+
component,
|
|
347
|
+
sliceFields(fields, start, end)
|
|
348
|
+
])
|
|
349
|
+
)
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return shards;
|
|
353
|
+
}
|
|
354
|
+
function isSharedSpan(binding) {
|
|
355
|
+
if (typeof SharedArrayBuffer === "undefined") return false;
|
|
356
|
+
if (!(binding.entities.buffer instanceof SharedArrayBuffer)) return false;
|
|
357
|
+
return [...Object.values(binding.read), ...Object.values(binding.write)].every(
|
|
358
|
+
(fields) => Object.values(fields).every((view) => view.buffer instanceof SharedArrayBuffer)
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export { SHARED_KERNEL_ELIGIBILITY_REASONS, SHARED_KERNEL_EXECUTOR_RESOURCE_KEY, bindSharedSpan, defineSharedKernel, isKernelDispatchFailure, isSharedSpan, sharedKernelEligibility, splitSharedSpan };
|
|
363
|
+
//# sourceMappingURL=shared.mjs.map
|
|
364
|
+
//# sourceMappingURL=shared.mjs.map
|