@woosh/meep-engine 3.45.0 → 3.47.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/build/bundle-worker-terrain.js +1 -1
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
- package/editor/actions/concrete/TransformModifyAction.js +10 -2
- package/editor/ecs/component/FieldDescriptor.js +15 -0
- package/editor/ecs/component/createObjectEditor.js +41 -12
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
- package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +4 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +7 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
- package/editor/view/ecs/EntityEditor.js +4 -2
- package/package.json +1 -1
- package/src/core/assert.d.ts.map +1 -1
- package/src/core/assert.js +5 -1
- package/src/core/binary/hash/XXH128Hash.d.ts +1 -37
- package/src/core/binary/hash/XXH128Hash.d.ts.map +1 -1
- package/src/core/binary/hash/XXH128Hash.js +4 -55
- package/src/core/binary/hash/XXH3_SECRET.d.ts +1 -12
- package/src/core/binary/hash/XXH3_SECRET.d.ts.map +1 -1
- package/src/core/binary/hash/XXH3_SECRET.js +4 -25
- package/src/core/binary/hash/crc32.d.ts +1 -15
- package/src/core/binary/hash/crc32.d.ts.map +1 -1
- package/src/core/binary/hash/crc32.js +4 -96
- package/src/core/binary/hash/xxh3_128.d.ts +1 -9
- package/src/core/binary/hash/xxh3_128.d.ts.map +1 -1
- package/src/core/binary/hash/xxh3_128.js +4 -341
- package/src/core/binary/hash/xxh3_64.d.ts +1 -8
- package/src/core/binary/hash/xxh3_64.d.ts.map +1 -1
- package/src/core/binary/hash/xxh3_64.js +4 -241
- package/src/core/binary/hash/xxh3_common.d.ts +1 -223
- package/src/core/binary/hash/xxh3_common.d.ts.map +1 -1
- package/src/core/binary/hash/xxh3_common.js +90 -476
- package/src/core/collection/array/array_insert_at.d.ts +16 -0
- package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
- package/src/core/collection/array/array_insert_at.js +32 -0
- package/src/core/collection/array/array_remove_at.d.ts +15 -0
- package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
- package/src/core/collection/array/array_remove_at.js +30 -0
- package/src/core/collection/array/combine_hash.d.ts +6 -0
- package/src/core/collection/array/combine_hash.d.ts.map +1 -1
- package/src/core/collection/array/combine_hash.js +6 -0
- package/src/core/function/FunctionCompiler.js +2 -2
- package/src/core/geom/3d/mat4/m4_multiply.d.ts +3 -0
- package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_multiply.js +3 -0
- package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts +30 -0
- package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_multiply_f64.js +106 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
- package/src/core/geom/ConicRay.js +2 -2
- package/src/core/geom/Quaternion.d.ts +1 -0
- package/src/core/geom/Quaternion.d.ts.map +1 -1
- package/src/core/geom/Quaternion.js +12 -48
- package/src/core/geom/Vector4.d.ts.map +1 -1
- package/src/core/geom/Vector4.js +8 -5
- package/src/core/math/hash/XXH128Hash.d.ts +38 -0
- package/src/core/math/hash/XXH128Hash.d.ts.map +1 -0
- package/src/core/math/hash/XXH128Hash.js +55 -0
- package/src/core/math/hash/XXH3_SECRET.d.ts +13 -0
- package/src/core/math/hash/XXH3_SECRET.d.ts.map +1 -0
- package/src/core/math/hash/XXH3_SECRET.js +25 -0
- package/src/core/math/hash/crc32.d.ts +16 -0
- package/src/core/math/hash/crc32.d.ts.map +1 -0
- package/src/core/math/hash/crc32.js +96 -0
- package/src/core/math/hash/xxh3_128.d.ts +10 -0
- package/src/core/math/hash/xxh3_128.d.ts.map +1 -0
- package/src/core/math/hash/xxh3_128.js +341 -0
- package/src/core/math/hash/xxh3_64.d.ts +9 -0
- package/src/core/math/hash/xxh3_64.d.ts.map +1 -0
- package/src/core/math/hash/xxh3_64.js +241 -0
- package/src/core/math/hash/xxh3_common.d.ts +224 -0
- package/src/core/math/hash/xxh3_common.d.ts.map +1 -0
- package/src/core/math/hash/xxh3_common.js +476 -0
- package/src/core/math/lookup/ParameterLookupTable.js +2 -2
- package/src/core/model/node-graph/node/NodeInstancePortReference.js +2 -2
- package/src/core/model/reactive/model/ReactiveBinaryExpression.js +2 -2
- package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -2
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +9 -4
- package/src/engine/asset/AssetDescription.js +2 -2
- package/src/engine/ecs/animation/Animation.js +2 -2
- package/src/engine/ecs/animation/AnimationClip.d.ts.map +1 -1
- package/src/engine/ecs/animation/AnimationClip.js +7 -5
- package/src/engine/ecs/gui/GUIElement.d.ts.map +1 -1
- package/src/engine/ecs/gui/GUIElement.js +7 -5
- package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +2 -2
- package/src/engine/ecs/gui/position/ViewportPosition.d.ts.map +1 -1
- package/src/engine/ecs/gui/position/ViewportPosition.js +11 -7
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
- package/src/engine/ecs/transform/Transform64.d.ts +1 -1
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +5 -4
- package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
- package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
- package/src/engine/graphics/ecs/animation/animator/AnimationClip.d.ts.map +1 -1
- package/src/engine/graphics/ecs/animation/animator/AnimationClip.js +8 -5
- package/src/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.d.ts.map +1 -1
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +8 -5
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
- package/src/engine/graphics/ecs/decal/v2/Decal.js +9 -8
- package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.js +9 -6
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
- package/src/engine/graphics3/ParticipatingMedia.js +204 -204
- package/src/engine/graphics3/animation/AnimationClips.d.ts +5 -0
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
- package/src/engine/graphics3/animation/AnimationClips.js +5 -0
- package/src/engine/grid/obstacle/GridObstacle.js +2 -2
- package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
- package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
- package/src/engine/input/devices/KeyboardDevice.js +7 -6
- package/src/engine/intelligence/behavior/selector/WeightedElement.js +2 -2
- package/src/engine/interpolation/Interpolated.js +2 -2
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
- package/src/engine/network/CONGESTION_CONTROL.md +9 -9
- package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
- package/src/engine/network/NetworkSession.d.ts +31 -11
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +453 -286
- package/src/engine/network/README.md +77 -27
- package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
- package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
- package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
- package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
- package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
- package/src/engine/network/orchestrator/HostJoin.js +271 -0
- package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
- package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
- package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
- package/src/engine/network/orchestrator/PendingSlices.js +83 -0
- package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
- package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
- package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +7 -1
- package/src/engine/network/sim/ActionLog.d.ts +32 -5
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
- package/src/engine/network/sim/ActionLog.js +47 -5
- package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +100 -4
- package/src/engine/network/sim/Snapshotter.d.ts +12 -0
- package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
- package/src/engine/network/sim/Snapshotter.js +43 -0
- package/src/engine/network/state/Baseline.d.ts +1 -1
- package/src/engine/network/state/Baseline.js +1 -1
- package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
- package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
- package/src/engine/network/state/FrameBufferRing.js +51 -6
- package/src/engine/network/state/InputRing.d.ts +4 -0
- package/src/engine/network/state/InputRing.d.ts.map +1 -1
- package/src/engine/network/state/InputRing.js +7 -0
- package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
- package/src/engine/network/transport/DeferredTransport.js +1 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
- package/src/engine/network/transport/LoopbackTransport.js +4 -2
- package/src/engine/network/transport/Transport.d.ts +7 -0
- package/src/engine/network/transport/Transport.d.ts.map +1 -1
- package/src/engine/network/transport/Transport.js +8 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
- package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
- package/src/engine/network/transport/connection/Connection.d.ts +191 -0
- package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
- package/src/engine/network/transport/connection/Connection.js +1262 -0
- package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
- package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
- package/src/engine/network/transport/connection/RangeSet.js +260 -0
- package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
- package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
- package/src/engine/network/transport/connection/RxStream.js +211 -0
- package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
- package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
- package/src/engine/network/transport/connection/TxStream.js +243 -0
- package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
- package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
- package/src/engine/network/transport/connection/bytes_copy.js +34 -0
- package/src/engine/network/transport/connection/varint.d.ts +46 -0
- package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
- package/src/engine/network/transport/connection/varint.js +107 -0
- package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/Cloth.js +7 -5
- package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothCollider.js +7 -5
- package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothDynamics.js +20 -11
- package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidField.js +7 -5
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidComponent.js +19 -11
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +2 -2
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +2 -2
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +11 -7
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +11 -7
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +16 -9
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitter.js +47 -14
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
- package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
- package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTrigger.js +192 -191
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
- package/src/engine/sound/simulation/core/AcousticMedium.js +2 -2
- package/src/engine/sound/simulation/definition/AcousticDirectivity.js +2 -2
- package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
- package/src/engine/sound/simulation/definition/AcousticMaterial.js +11 -7
- package/src/engine/sound/sopra/README.md +768 -644
- package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
- package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
- package/src/engine/sound/sopra/SopraEngine.js +327 -12
- package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/BusDefinition.js +5 -4
- package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/DuckingRule.js +7 -5
- package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
- package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/EventDescription.js +77 -17
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
- package/src/engine/sound/sopra/definition/MixerSnapshot.js +2 -2
- package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/ParameterDefinition.js +7 -5
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +2 -2
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +4 -3
- package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +2 -2
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +3 -3
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +16 -9
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +2 -2
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -1
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -2
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -120
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -128
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +8 -3
- package/src/engine/sound/sopra/legacy/SoundEmitter.d.ts.map +1 -1
- package/src/engine/sound/sopra/legacy/SoundEmitter.js +357 -352
- package/src/engine/sound/sopra/legacy/SoundTrack.d.ts.map +1 -1
- package/src/engine/sound/sopra/legacy/SoundTrack.js +281 -278
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
- package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
- package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
- package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
- package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
- package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
- package/src/format/image/png/PNGReader.js +644 -644
- package/src/format/image/png/crc32.d.ts +1 -1
- package/src/format/image/png/crc32.js +7 -8
- package/src/shade/RENDERER_CONTRACT.md +6 -3
- package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +2 -2
- package/src/shade/descriptor/binding/BindGroupLayoutEntry.d.ts.map +1 -1
- package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +12 -8
- package/src/shade/descriptor/binding/StorageTextureBindingLayout.js +2 -2
- package/src/shade/descriptor/binding/TextureBindingLayout.js +2 -2
- package/src/shade/descriptor/blend/BlendComponent.js +2 -2
- package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +2 -2
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +2 -2
- package/src/shade/descriptor/pipeline/ProgrammableStage.js +2 -2
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +2 -2
- package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
- package/src/shade/descriptor/pipeline/render/FragmentState.js +2 -2
- package/src/shade/descriptor/pipeline/render/PrimitiveState.js +2 -2
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +8 -5
- package/src/shade/descriptor/pipeline/render/VertexAttribute.js +2 -2
- package/src/shade/descriptor/texture/SamplerDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/texture/SamplerDescriptor.js +20 -12
- package/src/shade/descriptor/texture/TextureDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/texture/TextureDescriptor.js +11 -7
- package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
- package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
- package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
- package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
- package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
- package/src/shade/device/ShadeDeviceFailure.js +17 -8
- package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
- package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
- package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/BufferResourceDescriptor.js +196 -193
- package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/TextureResourceDescriptor.js +178 -173
- package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
- package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
- package/src/shade/device/shade_device_floor_unmet.js +32 -0
- package/src/shade/device/timing/profile/sgpt_read_header.js +1 -1
- package/src/shade/device/timing/profile/sgpt_read_records.js +1 -1
- package/src/shade/device/timing/profile/sgpt_write_header.js +1 -1
- package/src/shade/device/timing/profile/sgpt_write_record.js +1 -1
- package/src/shade/renderer/Renderer.d.ts +2 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +29 -55
- package/src/shade/renderer/binding/BufferBinding.js +2 -2
- package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
- package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
- package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
- package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
- package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
- package/src/shade/renderer/camera/Camera.js +2 -2
- package/src/shade/renderer/geometry/Attribute.js +2 -2
- package/src/shade/renderer/geometry/Geometry.js +2 -2
- package/src/shade/renderer/geometry/geometry_deduplicate_vertices.js +2 -2
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
- package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
- package/src/shade/renderer/material/StandardShadeMaterial.js +13 -8
- package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
- package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
- package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
- package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.js +14 -5
- package/src/shade/renderer/scene/optimization/sampler2d_from_image_bitmap.js +1 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +18 -2
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +230 -218
- package/src/shade/renderer/shader/type/WGSLStructField.js +2 -2
- package/src/shade/renderer/shader/type/WebGPUArray.js +2 -2
- package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUStruct.js +9 -6
- package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
- package/src/shade/renderer/texture/ShadeTexture.js +17 -10
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +2 -2
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -4
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +6 -6
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +46 -55
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +3 -3
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +14 -4
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +10 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +82 -40
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +4 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +8 -4
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +98 -86
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +440 -298
- package/src/view/common/HTMLElementCacheKey.d.ts.map +1 -1
- package/src/view/common/HTMLElementCacheKey.js +4 -3
- package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
- package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
- package/src/view/graphics/GraphicsContextFailureView.js +1 -2
- package/src/view/minimap/MinimapMarker.js +2 -2
- package/src/engine/network/transport/Channel.js +0 -336
- package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
- package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
- package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
- package/src/engine/network/transport/fragments/fragment_send.js +0 -157
- package/src/engine/network/transport/fragments/packet_size.js +0 -107
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import {
|
|
3
|
-
FRAGMENT_RETENTION_MAX_AGE_MS,
|
|
4
|
-
FRAGMENT_RETENTION_MAX_MESSAGES,
|
|
5
|
-
FRAGMENT_RETENTION_MAX_RETRIES,
|
|
6
|
-
} from "./packet_size.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Per-peer sender-side retention buffer for fragmented message bytes,
|
|
10
|
-
* used to satisfy NACK retransmits from the peer's {@link FragmentAssembler}.
|
|
11
|
-
*
|
|
12
|
-
* Lifecycle:
|
|
13
|
-
* 1. {@link retain} — called on each fragmented send; copies the source
|
|
14
|
-
* bytes into the retention so they're available to retransmit. If
|
|
15
|
-
* the per-peer slot cap is hit, the oldest retained entry is FIFO-
|
|
16
|
-
* evicted.
|
|
17
|
-
* 2. {@link consume_nack} — looks up retained bytes for a NACK target
|
|
18
|
-
* and bumps the retry counter. Returns `null` if the entry is gone
|
|
19
|
-
* (aged out, evicted, or out of retry budget — in which case the
|
|
20
|
-
* entry is dropped here too).
|
|
21
|
-
* 3. {@link service} — call once per tick to age out entries older
|
|
22
|
-
* than `max_age_ms`.
|
|
23
|
-
* 4. {@link clear} — drop everything; call on peer disconnect.
|
|
24
|
-
*
|
|
25
|
-
* Memory cost: each retained entry holds a fresh copy of its source
|
|
26
|
-
* payload (the upstream send buffer is a reused scratch). With the
|
|
27
|
-
* default 16 slots × up-to-64 KiB cap on the receiver, worst case is
|
|
28
|
-
* 1 MiB per peer; steady-state is empty because steady traffic fits in
|
|
29
|
-
* one packet and bypasses fragmentation.
|
|
30
|
-
*
|
|
31
|
-
* @author Alex Goldring
|
|
32
|
-
* @copyright Company Named Limited (c) 2026
|
|
33
|
-
*/
|
|
34
|
-
export class FragmentRetention {
|
|
35
|
-
#entries;
|
|
36
|
-
/**
|
|
37
|
-
* FIFO of message_ids in insertion order, for eviction on
|
|
38
|
-
* overflow and for monotonic age-out.
|
|
39
|
-
* @type {number[]}
|
|
40
|
-
* @private
|
|
41
|
-
*/
|
|
42
|
-
#order = [];
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @param {{
|
|
46
|
-
* max_messages?: number,
|
|
47
|
-
* max_age_ms?: number,
|
|
48
|
-
* max_retries?: number,
|
|
49
|
-
* }} [options]
|
|
50
|
-
* `max_messages` caps simultaneously-retained messages; oldest is
|
|
51
|
-
* FIFO-evicted on overflow. `max_age_ms` is the per-entry TTL.
|
|
52
|
-
* `max_retries` caps how many NACK retransmit rounds a single
|
|
53
|
-
* retained message can satisfy before being dropped.
|
|
54
|
-
*/
|
|
55
|
-
constructor({
|
|
56
|
-
max_messages = FRAGMENT_RETENTION_MAX_MESSAGES,
|
|
57
|
-
max_age_ms = FRAGMENT_RETENTION_MAX_AGE_MS,
|
|
58
|
-
max_retries = FRAGMENT_RETENTION_MAX_RETRIES,
|
|
59
|
-
} = {}) {
|
|
60
|
-
assert.isPositiveInteger(max_messages, 'max_messages');
|
|
61
|
-
assert.isPositiveInteger(max_age_ms, 'max_age_ms');
|
|
62
|
-
assert.isNonNegativeInteger(max_retries, 'max_retries');
|
|
63
|
-
|
|
64
|
-
/** @type {number} @readonly */
|
|
65
|
-
this.max_messages = max_messages;
|
|
66
|
-
/** @type {number} @readonly */
|
|
67
|
-
this.max_age_ms = max_age_ms;
|
|
68
|
-
/** @type {number} @readonly */
|
|
69
|
-
this.max_retries = max_retries;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* message_id → retained entry. `payload` is a fresh copy
|
|
73
|
-
* (independent of the caller's send buffer).
|
|
74
|
-
* @type {Map<number, {payload: Uint8Array, length: number, sent_at: number, retries: number}>}
|
|
75
|
-
* @private
|
|
76
|
-
*/
|
|
77
|
-
this.#entries = new Map();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Copy `payload[0..length)` into retention under `message_id`.
|
|
82
|
-
* Evicts the oldest retained entry if `max_messages` is exceeded.
|
|
83
|
-
*
|
|
84
|
-
* If a retained entry already exists for `message_id` (only legitimate
|
|
85
|
-
* cause: uint16 wrap), the old entry is dropped first so the FIFO
|
|
86
|
-
* position and retry budget restart from the new send.
|
|
87
|
-
*
|
|
88
|
-
* @param {number} message_id
|
|
89
|
-
* @param {Uint8Array} payload source bytes (caller may overwrite after return)
|
|
90
|
-
* @param {number} length number of bytes from `payload[0]` to copy
|
|
91
|
-
* @param {number} now_ms monotonic timestamp for age-out
|
|
92
|
-
*/
|
|
93
|
-
retain(message_id, payload, length, now_ms) {
|
|
94
|
-
assert.isNonNegativeInteger(message_id, 'message_id');
|
|
95
|
-
assert.isNonNegativeInteger(length, 'length');
|
|
96
|
-
assert.isNumber(now_ms, 'now_ms');
|
|
97
|
-
|
|
98
|
-
if (this.#entries.has(message_id)) {
|
|
99
|
-
this.#delete(message_id);
|
|
100
|
-
}
|
|
101
|
-
if (this.#entries.size >= this.max_messages) {
|
|
102
|
-
const oldest = this.#order.shift();
|
|
103
|
-
if (oldest !== undefined) this.#entries.delete(oldest);
|
|
104
|
-
}
|
|
105
|
-
const copy = new Uint8Array(length);
|
|
106
|
-
copy.set(payload.subarray(0, length));
|
|
107
|
-
this.#entries.set(message_id, {
|
|
108
|
-
payload: copy,
|
|
109
|
-
length,
|
|
110
|
-
sent_at: now_ms,
|
|
111
|
-
retries: 0,
|
|
112
|
-
});
|
|
113
|
-
this.#order.push(message_id);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Mark a NACK round for `message_id` and return the retained entry
|
|
118
|
-
* so the caller can re-emit the missing chunks. Returns `null` if
|
|
119
|
-
* no entry exists, or if the per-message retry budget is now
|
|
120
|
-
* exhausted (in which case the entry is dropped).
|
|
121
|
-
*
|
|
122
|
-
* @param {number} message_id
|
|
123
|
-
* @returns {{payload: Uint8Array, length: number}|null}
|
|
124
|
-
*/
|
|
125
|
-
consume_nack(message_id) {
|
|
126
|
-
assert.isNonNegativeInteger(message_id, 'message_id');
|
|
127
|
-
const entry = this.#entries.get(message_id);
|
|
128
|
-
if (entry === undefined) return null;
|
|
129
|
-
entry.retries++;
|
|
130
|
-
if (entry.retries > this.max_retries) {
|
|
131
|
-
this.#delete(message_id);
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
return entry;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Per-tick maintenance: evict any entry older than `max_age_ms`.
|
|
139
|
-
*
|
|
140
|
-
* The FIFO is in strict insertion order, so we can stop at the first
|
|
141
|
-
* still-fresh entry rather than scanning the whole map.
|
|
142
|
-
*
|
|
143
|
-
* @param {number} now_ms
|
|
144
|
-
*/
|
|
145
|
-
service(now_ms) {
|
|
146
|
-
assert.isNumber(now_ms, 'now_ms');
|
|
147
|
-
while (this.#order.length > 0) {
|
|
148
|
-
const id = this.#order[0];
|
|
149
|
-
const entry = this.#entries.get(id);
|
|
150
|
-
if (entry === undefined) {
|
|
151
|
-
this.#order.shift();
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
if (now_ms - entry.sent_at < this.max_age_ms) break;
|
|
155
|
-
this.#order.shift();
|
|
156
|
-
this.#entries.delete(id);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Number of currently-retained messages.
|
|
162
|
-
* @returns {number}
|
|
163
|
-
*/
|
|
164
|
-
size() {
|
|
165
|
-
return this.#entries.size;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Whether `message_id` is currently retained.
|
|
170
|
-
* @param {number} message_id
|
|
171
|
-
* @returns {boolean}
|
|
172
|
-
*/
|
|
173
|
-
has(message_id) {
|
|
174
|
-
return this.#entries.has(message_id);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Drop every retained entry. Use on peer disconnect.
|
|
179
|
-
*/
|
|
180
|
-
clear() {
|
|
181
|
-
this.#entries.clear();
|
|
182
|
-
this.#order.length = 0;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** @private */
|
|
186
|
-
#delete(message_id) {
|
|
187
|
-
this.#entries.delete(message_id);
|
|
188
|
-
const idx = this.#order.indexOf(message_id);
|
|
189
|
-
if (idx >= 0) this.#order.splice(idx, 1);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import {
|
|
3
|
-
FRAGMENT_HEADER_BYTES,
|
|
4
|
-
MAX_CHANNEL_PAYLOAD_BYTES,
|
|
5
|
-
MAX_CHUNKS_PER_MESSAGE,
|
|
6
|
-
MAX_FRAGMENT_CHUNK_BYTES,
|
|
7
|
-
} from "./packet_size.js";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Send a logical payload through a callback, splitting into fragment
|
|
11
|
-
* packets if it exceeds the channel's single-packet capacity.
|
|
12
|
-
*
|
|
13
|
-
* Layout of each emitted fragment packet (before the Channel adds its
|
|
14
|
-
* 8-byte header):
|
|
15
|
-
*
|
|
16
|
-
* uint8 FRAGMENT_PACKET_TYPE
|
|
17
|
-
* uint16 message_id (little-endian)
|
|
18
|
-
* uint8 chunk_index
|
|
19
|
-
* uint8 total_chunks
|
|
20
|
-
* bytes chunk_payload
|
|
21
|
-
*
|
|
22
|
-
* The chunk_payload bytes are slices of the original logical payload,
|
|
23
|
-
* concatenated in chunk_index order they reconstruct the original
|
|
24
|
-
* payload byte-for-byte. The logical payload's own packet-type byte is
|
|
25
|
-
* the first byte of chunk 0 and is preserved by the reassembly.
|
|
26
|
-
*
|
|
27
|
-
* Single-packet messages (payload <= MAX_CHANNEL_PAYLOAD_BYTES) are sent
|
|
28
|
-
* as-is with NO fragmentation header — the receiver dispatches them
|
|
29
|
-
* normally via the FIRST byte. Fragmentation overhead only applies when
|
|
30
|
-
* the payload genuinely doesn't fit.
|
|
31
|
-
*
|
|
32
|
-
* @param {Uint8Array} payload
|
|
33
|
-
* @param {number} payload_length
|
|
34
|
-
* @param {number} message_id sender-assigned, unique per logical message
|
|
35
|
-
* @param {number} fragment_packet_type packet-type byte for fragment packets
|
|
36
|
-
* @param {Uint8Array} scratch reusable scratch buffer; must be >= MAX_CHANNEL_PAYLOAD_BYTES
|
|
37
|
-
* @param {function(Uint8Array, number): void} send_fn
|
|
38
|
-
* invoked once per emitted packet — single send for non-fragmented case,
|
|
39
|
-
* N sends for fragmented case
|
|
40
|
-
*/
|
|
41
|
-
export function send_fragmented(
|
|
42
|
-
payload,
|
|
43
|
-
payload_length,
|
|
44
|
-
message_id,
|
|
45
|
-
fragment_packet_type,
|
|
46
|
-
scratch,
|
|
47
|
-
send_fn,
|
|
48
|
-
) {
|
|
49
|
-
assert.isNonNegativeInteger(payload_length, 'payload_length');
|
|
50
|
-
assert.isNonNegativeInteger(message_id, 'message_id');
|
|
51
|
-
assert.ok(message_id <= 0xFFFF, 'message_id must fit in uint16');
|
|
52
|
-
assert.ok(scratch.length >= MAX_CHANNEL_PAYLOAD_BYTES,
|
|
53
|
-
'scratch buffer must be at least MAX_CHANNEL_PAYLOAD_BYTES');
|
|
54
|
-
|
|
55
|
-
if (payload_length <= MAX_CHANNEL_PAYLOAD_BYTES) {
|
|
56
|
-
// Fits in one packet; send as-is.
|
|
57
|
-
send_fn(payload, payload_length);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const total_chunks = Math.ceil(payload_length / MAX_FRAGMENT_CHUNK_BYTES);
|
|
62
|
-
if (total_chunks > MAX_CHUNKS_PER_MESSAGE) {
|
|
63
|
-
throw new Error(
|
|
64
|
-
`send_fragmented: payload of ${payload_length} bytes would require ` +
|
|
65
|
-
`${total_chunks} chunks, exceeding the ${MAX_CHUNKS_PER_MESSAGE}-chunk wire limit`
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
for (let i = 0; i < total_chunks; i++) {
|
|
70
|
-
const chunk_offset = i * MAX_FRAGMENT_CHUNK_BYTES;
|
|
71
|
-
const remaining = payload_length - chunk_offset;
|
|
72
|
-
const chunk_size = remaining < MAX_FRAGMENT_CHUNK_BYTES ? remaining : MAX_FRAGMENT_CHUNK_BYTES;
|
|
73
|
-
|
|
74
|
-
// Build the fragment packet inside scratch.
|
|
75
|
-
scratch[0] = fragment_packet_type;
|
|
76
|
-
scratch[1] = message_id & 0xFF;
|
|
77
|
-
scratch[2] = (message_id >> 8) & 0xFF;
|
|
78
|
-
scratch[3] = i;
|
|
79
|
-
scratch[4] = total_chunks;
|
|
80
|
-
scratch.set(
|
|
81
|
-
payload.subarray(chunk_offset, chunk_offset + chunk_size),
|
|
82
|
-
FRAGMENT_HEADER_BYTES,
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
send_fn(scratch, FRAGMENT_HEADER_BYTES + chunk_size);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Number of chunks {@link send_fragmented} splits a payload of `payload_length` bytes into — the
|
|
91
|
-
* chunk indices a receiver may ask to have re-sent are `[0, count)`.
|
|
92
|
-
*
|
|
93
|
-
* @param {number} payload_length
|
|
94
|
-
* @returns {number}
|
|
95
|
-
*/
|
|
96
|
-
export function fragment_chunk_count(payload_length) {
|
|
97
|
-
// Payloads short enough to not fragment in the first place are never
|
|
98
|
-
// retained, so the 1 is defensive consistency rather than a real case.
|
|
99
|
-
return payload_length <= MAX_FRAGMENT_CHUNK_BYTES
|
|
100
|
-
? 1
|
|
101
|
-
: Math.ceil(payload_length / MAX_FRAGMENT_CHUNK_BYTES);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Re-emit a single fragment chunk for a previously-sent fragmented
|
|
106
|
-
* message. Used by the NACK retransmit path: the sender's
|
|
107
|
-
* {@link FragmentRetention} keeps the source bytes so any chunk can be
|
|
108
|
-
* deterministically rebuilt.
|
|
109
|
-
*
|
|
110
|
-
* The wire layout matches what {@link send_fragmented} would have
|
|
111
|
-
* produced for the same `(message_id, chunk_index, total_chunks)` —
|
|
112
|
-
* receivers can't tell a retransmit from an original.
|
|
113
|
-
*
|
|
114
|
-
* @param {Uint8Array} payload retained source bytes
|
|
115
|
-
* @param {number} payload_length
|
|
116
|
-
* @param {number} message_id
|
|
117
|
-
* @param {number} chunk_index must be < derived total_chunks; silently ignored otherwise
|
|
118
|
-
* @param {number} fragment_packet_type
|
|
119
|
-
* @param {Uint8Array} scratch reusable scratch; must be >= MAX_CHANNEL_PAYLOAD_BYTES
|
|
120
|
-
* @param {function(Uint8Array, number): void} send_fn
|
|
121
|
-
*/
|
|
122
|
-
export function resend_fragment_chunk(
|
|
123
|
-
payload,
|
|
124
|
-
payload_length,
|
|
125
|
-
message_id,
|
|
126
|
-
chunk_index,
|
|
127
|
-
fragment_packet_type,
|
|
128
|
-
scratch,
|
|
129
|
-
send_fn,
|
|
130
|
-
) {
|
|
131
|
-
assert.isNonNegativeInteger(payload_length, 'payload_length');
|
|
132
|
-
assert.isNonNegativeInteger(message_id, 'message_id');
|
|
133
|
-
assert.ok(message_id <= 0xFFFF, 'message_id must fit in uint16');
|
|
134
|
-
assert.isNonNegativeInteger(chunk_index, 'chunk_index');
|
|
135
|
-
assert.ok(scratch.length >= MAX_CHANNEL_PAYLOAD_BYTES,
|
|
136
|
-
'scratch buffer must be at least MAX_CHANNEL_PAYLOAD_BYTES');
|
|
137
|
-
|
|
138
|
-
// Recover total_chunks from the retained payload length.
|
|
139
|
-
const total_chunks = fragment_chunk_count(payload_length);
|
|
140
|
-
if (chunk_index >= total_chunks) return;
|
|
141
|
-
|
|
142
|
-
const chunk_offset = chunk_index * MAX_FRAGMENT_CHUNK_BYTES;
|
|
143
|
-
const remaining = payload_length - chunk_offset;
|
|
144
|
-
const chunk_size = remaining < MAX_FRAGMENT_CHUNK_BYTES ? remaining : MAX_FRAGMENT_CHUNK_BYTES;
|
|
145
|
-
|
|
146
|
-
scratch[0] = fragment_packet_type;
|
|
147
|
-
scratch[1] = message_id & 0xFF;
|
|
148
|
-
scratch[2] = (message_id >> 8) & 0xFF;
|
|
149
|
-
scratch[3] = chunk_index;
|
|
150
|
-
scratch[4] = total_chunks;
|
|
151
|
-
scratch.set(
|
|
152
|
-
payload.subarray(chunk_offset, chunk_offset + chunk_size),
|
|
153
|
-
FRAGMENT_HEADER_BYTES,
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
send_fn(scratch, FRAGMENT_HEADER_BYTES + chunk_size);
|
|
157
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Packet-size constants for the fragmentation layer.
|
|
3
|
-
*
|
|
4
|
-
* The target transport MTU is 1200 bytes (Quake / Source / Glenn Fiedler's
|
|
5
|
-
* Networked Physics recommend ~1200 to stay under typical PMTU after IP/UDP
|
|
6
|
-
* headers; ethernet 1500 - 40 IPv6 - 8 UDP = 1452 in the best case, but
|
|
7
|
-
* intermediate hops with tunnelling, IPv6 extension headers, or DSLite
|
|
8
|
-
* routinely shave this down — 1200 is the safe number).
|
|
9
|
-
*
|
|
10
|
-
* Above this, the application's logical payload must be split into chunks
|
|
11
|
-
* via {@link send_fragmented} and reassembled on the receiver via
|
|
12
|
-
* {@link FragmentAssembler}.
|
|
13
|
-
*
|
|
14
|
-
* Header overhead breakdown for a fragment packet, from the transport's
|
|
15
|
-
* point of view:
|
|
16
|
-
* - {@link Channel} adds 9 bytes (seq + ack_latest + ack_bitfield + ack_present).
|
|
17
|
-
* - The FRAGMENT packet type byte = 1 byte.
|
|
18
|
-
* - Fragment header (message_id uint16 + chunk_index uint8 + total_chunks
|
|
19
|
-
* uint8) = 4 bytes.
|
|
20
|
-
* Total overhead per fragment = 14 bytes; payload capacity per fragment =
|
|
21
|
-
* 1200 - 14 = 1186 bytes.
|
|
22
|
-
*
|
|
23
|
-
* For a logical message that fits in a single packet (no fragmentation
|
|
24
|
-
* needed), only the Channel header overhead applies — the payload starts
|
|
25
|
-
* with its own packet-type byte (e.g. ACTION_STREAM) and is sent directly.
|
|
26
|
-
*
|
|
27
|
-
* @author Alex Goldring
|
|
28
|
-
* @copyright Company Named Limited (c) 2026
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
/** Target transport MTU. */
|
|
32
|
-
export const MTU_BYTES = 1200;
|
|
33
|
-
|
|
34
|
-
/** Channel layer's per-packet header size. Must match {@link Channel}'s HEADER_SIZE. */
|
|
35
|
-
export const CHANNEL_HEADER_BYTES = 9;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Bytes the Channel reserves for the actual payload (no fragmentation):
|
|
39
|
-
* MTU minus the channel header.
|
|
40
|
-
*/
|
|
41
|
-
export const MAX_CHANNEL_PAYLOAD_BYTES = MTU_BYTES - CHANNEL_HEADER_BYTES;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Fragment header bytes within the channel payload:
|
|
45
|
-
* - 1 byte for the FRAGMENT packet-type marker
|
|
46
|
-
* - 2 bytes for message_id (uint16)
|
|
47
|
-
* - 1 byte for chunk_index (uint8)
|
|
48
|
-
* - 1 byte for total_chunks (uint8)
|
|
49
|
-
*/
|
|
50
|
-
export const FRAGMENT_HEADER_BYTES = 5;
|
|
51
|
-
|
|
52
|
-
/** Maximum number of payload bytes per fragment packet. */
|
|
53
|
-
export const MAX_FRAGMENT_CHUNK_BYTES = MAX_CHANNEL_PAYLOAD_BYTES - FRAGMENT_HEADER_BYTES;
|
|
54
|
-
|
|
55
|
-
/** Maximum number of chunks in a single logical message (limited by uint8 total_chunks). */
|
|
56
|
-
export const MAX_CHUNKS_PER_MESSAGE = 255;
|
|
57
|
-
|
|
58
|
-
/** Largest single logical payload supportable by this fragmentation scheme. */
|
|
59
|
-
export const MAX_LOGICAL_MESSAGE_BYTES = MAX_FRAGMENT_CHUNK_BYTES * MAX_CHUNKS_PER_MESSAGE;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* NACK retransmit timing.
|
|
63
|
-
*
|
|
64
|
-
* FRAGMENT_NACK_INITIAL_DELAY_MS — how long the receiver waits after the
|
|
65
|
-
* first chunk of a message arrives before NACKing the missing chunks.
|
|
66
|
-
* Trades off latency-of-recovery against premature NACKs for chunks
|
|
67
|
-
* that were just slightly late.
|
|
68
|
-
* FRAGMENT_NACK_RESEND_INTERVAL_MS — period between NACK retries when a
|
|
69
|
-
* message remains incomplete.
|
|
70
|
-
* FRAGMENT_NACK_MAX_ROUNDS — after this many NACK rounds without
|
|
71
|
-
* completion, the receiver drops the message; the sender's retention
|
|
72
|
-
* ages out independently.
|
|
73
|
-
*
|
|
74
|
-
* 75 ms initial delay is sized for the consumer mobile RTT bands measured
|
|
75
|
-
* across US / EU / China in 2024–2025: 5G median 15–45 ms, 4G median
|
|
76
|
-
* 30–55 ms, per-path jitter <10 ms for the majority of long-lived
|
|
77
|
-
* connections. 75 ms sits comfortably above worst-case (4G median + jitter
|
|
78
|
-
* + wire time for a small burst) so legitimate stragglers land before the
|
|
79
|
-
* NACK fires, while keeping recovery latency on real loss to ~75 ms + 1
|
|
80
|
-
* RTT. On worst-case paths the receiver may occasionally NACK chunks
|
|
81
|
-
* still in transit; the receiver-side dedup absorbs the duplicate
|
|
82
|
-
* retransmits.
|
|
83
|
-
*/
|
|
84
|
-
export const FRAGMENT_NACK_INITIAL_DELAY_MS = 75;
|
|
85
|
-
export const FRAGMENT_NACK_RESEND_INTERVAL_MS = 75;
|
|
86
|
-
export const FRAGMENT_NACK_MAX_ROUNDS = 3;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Sender-side retention bounds. The sender keeps a copy of each fragmented
|
|
90
|
-
* message's bytes so it can satisfy NACK retransmits. Retention is
|
|
91
|
-
* FIFO-evicted at `FRAGMENT_RETENTION_MAX_MESSAGES` and age-evicted at
|
|
92
|
-
* `FRAGMENT_RETENTION_MAX_AGE_MS`.
|
|
93
|
-
*
|
|
94
|
-
* Worst-case memory per peer: `FRAGMENT_RETENTION_MAX_MESSAGES *
|
|
95
|
-
* max_message_size` bytes. With the FragmentAssembler default of 64 KiB,
|
|
96
|
-
* that's 1 MiB per peer at saturation; steady-state retention is empty
|
|
97
|
-
* because steady traffic fits in one packet and bypasses fragmentation.
|
|
98
|
-
*
|
|
99
|
-
* `FRAGMENT_RETENTION_MAX_RETRIES` is how many NACKs a retained message is
|
|
100
|
-
* repaired for. A NACK re-sends each chunk of the message at most once, so
|
|
101
|
-
* whatever a peer asks, repair costs at most this many copies of a message
|
|
102
|
-
* the sender chose to send. It matches the receiver's
|
|
103
|
-
* `FRAGMENT_NACK_MAX_ROUNDS`: an honest receiver never asks more often.
|
|
104
|
-
*/
|
|
105
|
-
export const FRAGMENT_RETENTION_MAX_AGE_MS = 1500;
|
|
106
|
-
export const FRAGMENT_RETENTION_MAX_MESSAGES = 16;
|
|
107
|
-
export const FRAGMENT_RETENTION_MAX_RETRIES = 3;
|