@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.
Files changed (435) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  3. package/editor/actions/concrete/TransformModifyAction.js +10 -2
  4. package/editor/ecs/component/FieldDescriptor.js +15 -0
  5. package/editor/ecs/component/createObjectEditor.js +41 -12
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
  7. package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
  8. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  9. package/editor/tools/TransformToolV2.js +4 -0
  10. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  11. package/editor/tools/v2/TransformControls.js +7 -0
  12. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  13. package/editor/view/ecs/EntityEditor.js +4 -2
  14. package/package.json +1 -1
  15. package/src/core/assert.d.ts.map +1 -1
  16. package/src/core/assert.js +5 -1
  17. package/src/core/binary/hash/XXH128Hash.d.ts +1 -37
  18. package/src/core/binary/hash/XXH128Hash.d.ts.map +1 -1
  19. package/src/core/binary/hash/XXH128Hash.js +4 -55
  20. package/src/core/binary/hash/XXH3_SECRET.d.ts +1 -12
  21. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +1 -1
  22. package/src/core/binary/hash/XXH3_SECRET.js +4 -25
  23. package/src/core/binary/hash/crc32.d.ts +1 -15
  24. package/src/core/binary/hash/crc32.d.ts.map +1 -1
  25. package/src/core/binary/hash/crc32.js +4 -96
  26. package/src/core/binary/hash/xxh3_128.d.ts +1 -9
  27. package/src/core/binary/hash/xxh3_128.d.ts.map +1 -1
  28. package/src/core/binary/hash/xxh3_128.js +4 -341
  29. package/src/core/binary/hash/xxh3_64.d.ts +1 -8
  30. package/src/core/binary/hash/xxh3_64.d.ts.map +1 -1
  31. package/src/core/binary/hash/xxh3_64.js +4 -241
  32. package/src/core/binary/hash/xxh3_common.d.ts +1 -223
  33. package/src/core/binary/hash/xxh3_common.d.ts.map +1 -1
  34. package/src/core/binary/hash/xxh3_common.js +90 -476
  35. package/src/core/collection/array/array_insert_at.d.ts +16 -0
  36. package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
  37. package/src/core/collection/array/array_insert_at.js +32 -0
  38. package/src/core/collection/array/array_remove_at.d.ts +15 -0
  39. package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
  40. package/src/core/collection/array/array_remove_at.js +30 -0
  41. package/src/core/collection/array/combine_hash.d.ts +6 -0
  42. package/src/core/collection/array/combine_hash.d.ts.map +1 -1
  43. package/src/core/collection/array/combine_hash.js +6 -0
  44. package/src/core/function/FunctionCompiler.js +2 -2
  45. package/src/core/geom/3d/mat4/m4_multiply.d.ts +3 -0
  46. package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
  47. package/src/core/geom/3d/mat4/m4_multiply.js +3 -0
  48. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts +30 -0
  49. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts.map +1 -0
  50. package/src/core/geom/3d/mat4/m4_multiply_f64.js +106 -0
  51. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
  52. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
  53. package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
  54. package/src/core/geom/ConicRay.js +2 -2
  55. package/src/core/geom/Quaternion.d.ts +1 -0
  56. package/src/core/geom/Quaternion.d.ts.map +1 -1
  57. package/src/core/geom/Quaternion.js +12 -48
  58. package/src/core/geom/Vector4.d.ts.map +1 -1
  59. package/src/core/geom/Vector4.js +8 -5
  60. package/src/core/math/hash/XXH128Hash.d.ts +38 -0
  61. package/src/core/math/hash/XXH128Hash.d.ts.map +1 -0
  62. package/src/core/math/hash/XXH128Hash.js +55 -0
  63. package/src/core/math/hash/XXH3_SECRET.d.ts +13 -0
  64. package/src/core/math/hash/XXH3_SECRET.d.ts.map +1 -0
  65. package/src/core/math/hash/XXH3_SECRET.js +25 -0
  66. package/src/core/math/hash/crc32.d.ts +16 -0
  67. package/src/core/math/hash/crc32.d.ts.map +1 -0
  68. package/src/core/math/hash/crc32.js +96 -0
  69. package/src/core/math/hash/xxh3_128.d.ts +10 -0
  70. package/src/core/math/hash/xxh3_128.d.ts.map +1 -0
  71. package/src/core/math/hash/xxh3_128.js +341 -0
  72. package/src/core/math/hash/xxh3_64.d.ts +9 -0
  73. package/src/core/math/hash/xxh3_64.d.ts.map +1 -0
  74. package/src/core/math/hash/xxh3_64.js +241 -0
  75. package/src/core/math/hash/xxh3_common.d.ts +224 -0
  76. package/src/core/math/hash/xxh3_common.d.ts.map +1 -0
  77. package/src/core/math/hash/xxh3_common.js +476 -0
  78. package/src/core/math/lookup/ParameterLookupTable.js +2 -2
  79. package/src/core/model/node-graph/node/NodeInstancePortReference.js +2 -2
  80. package/src/core/model/reactive/model/ReactiveBinaryExpression.js +2 -2
  81. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -2
  82. package/src/engine/Engine.d.ts.map +1 -1
  83. package/src/engine/Engine.js +9 -4
  84. package/src/engine/asset/AssetDescription.js +2 -2
  85. package/src/engine/ecs/animation/Animation.js +2 -2
  86. package/src/engine/ecs/animation/AnimationClip.d.ts.map +1 -1
  87. package/src/engine/ecs/animation/AnimationClip.js +7 -5
  88. package/src/engine/ecs/gui/GUIElement.d.ts.map +1 -1
  89. package/src/engine/ecs/gui/GUIElement.js +7 -5
  90. package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +2 -2
  91. package/src/engine/ecs/gui/position/ViewportPosition.d.ts.map +1 -1
  92. package/src/engine/ecs/gui/position/ViewportPosition.js +11 -7
  93. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  94. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
  95. package/src/engine/ecs/transform/Transform64.d.ts +1 -1
  96. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  97. package/src/engine/ecs/transform/Transform64.js +5 -4
  98. package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
  99. package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
  100. package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
  101. package/src/engine/graphics/ecs/animation/animator/AnimationClip.d.ts.map +1 -1
  102. package/src/engine/graphics/ecs/animation/animator/AnimationClip.js +8 -5
  103. package/src/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -2
  104. package/src/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -2
  105. package/src/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -2
  106. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -2
  107. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +2 -2
  108. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.d.ts.map +1 -1
  109. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +8 -5
  110. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  111. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
  112. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  113. package/src/engine/graphics/ecs/decal/v2/Decal.js +9 -8
  114. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.d.ts.map +1 -1
  115. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.js +9 -6
  116. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
  117. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  118. package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
  119. package/src/engine/graphics3/ParticipatingMedia.js +204 -204
  120. package/src/engine/graphics3/animation/AnimationClips.d.ts +5 -0
  121. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  122. package/src/engine/graphics3/animation/AnimationClips.js +5 -0
  123. package/src/engine/grid/obstacle/GridObstacle.js +2 -2
  124. package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
  125. package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
  126. package/src/engine/input/devices/KeyboardDevice.js +7 -6
  127. package/src/engine/intelligence/behavior/selector/WeightedElement.js +2 -2
  128. package/src/engine/interpolation/Interpolated.js +2 -2
  129. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  130. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
  131. package/src/engine/network/CONGESTION_CONTROL.md +9 -9
  132. package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
  133. package/src/engine/network/NetworkSession.d.ts +31 -11
  134. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  135. package/src/engine/network/NetworkSession.js +453 -286
  136. package/src/engine/network/README.md +77 -27
  137. package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
  138. package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
  139. package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
  140. package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
  141. package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
  142. package/src/engine/network/orchestrator/HostJoin.js +271 -0
  143. package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
  144. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  145. package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
  146. package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
  147. package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
  148. package/src/engine/network/orchestrator/PendingSlices.js +83 -0
  149. package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
  150. package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
  151. package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
  152. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
  153. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  154. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
  155. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
  156. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  157. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
  158. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  159. package/src/engine/network/replication/Replicator.js +7 -1
  160. package/src/engine/network/sim/ActionLog.d.ts +32 -5
  161. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  162. package/src/engine/network/sim/ActionLog.js +47 -5
  163. package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
  164. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  165. package/src/engine/network/sim/SimActionExecutor.js +100 -4
  166. package/src/engine/network/sim/Snapshotter.d.ts +12 -0
  167. package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
  168. package/src/engine/network/sim/Snapshotter.js +43 -0
  169. package/src/engine/network/state/Baseline.d.ts +1 -1
  170. package/src/engine/network/state/Baseline.js +1 -1
  171. package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
  172. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
  173. package/src/engine/network/state/FrameBufferRing.js +51 -6
  174. package/src/engine/network/state/InputRing.d.ts +4 -0
  175. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  176. package/src/engine/network/state/InputRing.js +7 -0
  177. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
  178. package/src/engine/network/transport/DeferredTransport.js +1 -0
  179. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  180. package/src/engine/network/transport/LoopbackTransport.js +4 -2
  181. package/src/engine/network/transport/Transport.d.ts +7 -0
  182. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  183. package/src/engine/network/transport/Transport.js +8 -0
  184. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  185. package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
  186. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  187. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
  188. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  189. package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
  190. package/src/engine/network/transport/connection/Connection.d.ts +191 -0
  191. package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
  192. package/src/engine/network/transport/connection/Connection.js +1262 -0
  193. package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
  194. package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
  195. package/src/engine/network/transport/connection/RangeSet.js +260 -0
  196. package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
  197. package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
  198. package/src/engine/network/transport/connection/RxStream.js +211 -0
  199. package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
  200. package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
  201. package/src/engine/network/transport/connection/TxStream.js +243 -0
  202. package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
  203. package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
  204. package/src/engine/network/transport/connection/bytes_copy.js +34 -0
  205. package/src/engine/network/transport/connection/varint.d.ts +46 -0
  206. package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
  207. package/src/engine/network/transport/connection/varint.js +107 -0
  208. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  209. package/src/engine/physics/cloth/ecs/Cloth.js +7 -5
  210. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/ClothCollider.js +7 -5
  212. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
  213. package/src/engine/physics/cloth/ecs/ClothDynamics.js +20 -11
  214. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  215. package/src/engine/physics/fluid/FluidField.js +7 -5
  216. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  217. package/src/engine/physics/fluid/ecs/FluidComponent.js +19 -11
  218. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  219. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +2 -2
  220. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +2 -2
  221. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  222. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +11 -7
  223. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  224. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +11 -7
  225. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  226. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +16 -9
  227. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
  228. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  229. package/src/engine/sound/ecs/audio/AudioEmitter.js +47 -14
  230. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
  231. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
  232. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
  233. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
  234. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
  235. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
  236. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  237. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
  238. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
  239. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  240. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
  241. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
  242. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  243. package/src/engine/sound/ecs/trigger/AudioEventTrigger.js +192 -191
  244. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
  245. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
  246. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
  247. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
  248. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
  249. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  250. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
  251. package/src/engine/sound/simulation/core/AcousticMedium.js +2 -2
  252. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +2 -2
  253. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
  254. package/src/engine/sound/simulation/definition/AcousticMaterial.js +11 -7
  255. package/src/engine/sound/sopra/README.md +768 -644
  256. package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
  257. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  258. package/src/engine/sound/sopra/SopraEngine.js +327 -12
  259. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -1
  260. package/src/engine/sound/sopra/definition/BusDefinition.js +5 -4
  261. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -1
  262. package/src/engine/sound/sopra/definition/DuckingRule.js +7 -5
  263. package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
  264. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  265. package/src/engine/sound/sopra/definition/EventDescription.js +77 -17
  266. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
  267. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  268. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
  269. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
  270. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
  271. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
  272. package/src/engine/sound/sopra/definition/MixerSnapshot.js +2 -2
  273. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -1
  274. package/src/engine/sound/sopra/definition/ParameterDefinition.js +7 -5
  275. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +2 -2
  276. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  277. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +4 -3
  278. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +2 -2
  279. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +3 -3
  280. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  281. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +16 -9
  282. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +2 -2
  283. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -1
  284. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  285. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -2
  286. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
  287. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
  288. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
  289. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
  290. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  291. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -120
  292. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
  293. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  294. package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -128
  295. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
  296. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  297. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +8 -3
  298. package/src/engine/sound/sopra/legacy/SoundEmitter.d.ts.map +1 -1
  299. package/src/engine/sound/sopra/legacy/SoundEmitter.js +357 -352
  300. package/src/engine/sound/sopra/legacy/SoundTrack.d.ts.map +1 -1
  301. package/src/engine/sound/sopra/legacy/SoundTrack.js +281 -278
  302. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
  303. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  304. package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
  305. package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
  306. package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
  307. package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
  308. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
  309. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
  310. package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
  311. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
  312. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  313. package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
  314. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
  315. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
  316. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
  317. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
  318. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
  319. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
  320. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
  321. package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
  322. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
  323. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
  324. package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
  325. package/src/format/image/png/PNGReader.js +644 -644
  326. package/src/format/image/png/crc32.d.ts +1 -1
  327. package/src/format/image/png/crc32.js +7 -8
  328. package/src/shade/RENDERER_CONTRACT.md +6 -3
  329. package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +2 -2
  330. package/src/shade/descriptor/binding/BindGroupLayoutEntry.d.ts.map +1 -1
  331. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +12 -8
  332. package/src/shade/descriptor/binding/StorageTextureBindingLayout.js +2 -2
  333. package/src/shade/descriptor/binding/TextureBindingLayout.js +2 -2
  334. package/src/shade/descriptor/blend/BlendComponent.js +2 -2
  335. package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +2 -2
  336. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +2 -2
  337. package/src/shade/descriptor/pipeline/ProgrammableStage.js +2 -2
  338. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +2 -2
  339. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  340. package/src/shade/descriptor/pipeline/render/FragmentState.js +2 -2
  341. package/src/shade/descriptor/pipeline/render/PrimitiveState.js +2 -2
  342. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  343. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +8 -5
  344. package/src/shade/descriptor/pipeline/render/VertexAttribute.js +2 -2
  345. package/src/shade/descriptor/texture/SamplerDescriptor.d.ts.map +1 -1
  346. package/src/shade/descriptor/texture/SamplerDescriptor.js +20 -12
  347. package/src/shade/descriptor/texture/TextureDescriptor.d.ts.map +1 -1
  348. package/src/shade/descriptor/texture/TextureDescriptor.js +11 -7
  349. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
  350. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
  351. package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
  352. package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
  353. package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
  354. package/src/shade/device/ShadeDeviceFailure.js +17 -8
  355. package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
  356. package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
  357. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  358. package/src/shade/device/graph/BufferResourceDescriptor.js +196 -193
  359. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  360. package/src/shade/device/graph/TextureResourceDescriptor.js +178 -173
  361. package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
  362. package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
  363. package/src/shade/device/shade_device_floor_unmet.js +32 -0
  364. package/src/shade/device/timing/profile/sgpt_read_header.js +1 -1
  365. package/src/shade/device/timing/profile/sgpt_read_records.js +1 -1
  366. package/src/shade/device/timing/profile/sgpt_write_header.js +1 -1
  367. package/src/shade/device/timing/profile/sgpt_write_record.js +1 -1
  368. package/src/shade/renderer/Renderer.d.ts +2 -0
  369. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  370. package/src/shade/renderer/Renderer.js +29 -55
  371. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  372. package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
  373. package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
  374. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
  375. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
  376. package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
  377. package/src/shade/renderer/camera/Camera.js +2 -2
  378. package/src/shade/renderer/geometry/Attribute.js +2 -2
  379. package/src/shade/renderer/geometry/Geometry.js +2 -2
  380. package/src/shade/renderer/geometry/geometry_deduplicate_vertices.js +2 -2
  381. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +2 -2
  382. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  383. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  384. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  385. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  386. package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
  387. package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
  388. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  389. package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
  390. package/src/shade/renderer/material/StandardShadeMaterial.js +13 -8
  391. package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
  392. package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
  393. package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
  394. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.d.ts.map +1 -1
  395. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.js +14 -5
  396. package/src/shade/renderer/scene/optimization/sampler2d_from_image_bitmap.js +1 -1
  397. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  398. package/src/shade/renderer/shader/ComputeShader.js +18 -2
  399. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  400. package/src/shade/renderer/shader/ImageShader.js +230 -218
  401. package/src/shade/renderer/shader/type/WGSLStructField.js +2 -2
  402. package/src/shade/renderer/shader/type/WebGPUArray.js +2 -2
  403. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  404. package/src/shade/renderer/shader/type/WebGPUStruct.js +9 -6
  405. package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
  406. package/src/shade/renderer/texture/ShadeTexture.js +17 -10
  407. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +2 -2
  408. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -4
  409. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +6 -6
  410. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  411. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +46 -55
  412. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +3 -3
  413. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  414. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +14 -4
  415. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +10 -1
  416. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  417. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +82 -40
  418. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +4 -1
  419. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  420. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +8 -4
  421. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +98 -86
  422. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  423. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +440 -298
  424. package/src/view/common/HTMLElementCacheKey.d.ts.map +1 -1
  425. package/src/view/common/HTMLElementCacheKey.js +4 -3
  426. package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
  427. package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
  428. package/src/view/graphics/GraphicsContextFailureView.js +1 -2
  429. package/src/view/minimap/MinimapMarker.js +2 -2
  430. package/src/engine/network/transport/Channel.js +0 -336
  431. package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
  432. package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
  433. package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
  434. package/src/engine/network/transport/fragments/fragment_send.js +0 -157
  435. 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;