murow 0.0.70 → 0.0.71
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/README.md +52 -37
- package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
- package/dist/cjs/core/binary-codec/index.js +1 -0
- package/dist/cjs/core/driver/driver.js +1 -0
- package/dist/cjs/core/driver/drivers/immediate.js +1 -0
- package/dist/cjs/core/driver/drivers/index.js +1 -0
- package/dist/cjs/core/driver/drivers/raf.js +1 -0
- package/dist/cjs/core/driver/drivers/timeout.js +1 -0
- package/dist/cjs/core/driver/index.js +1 -0
- package/dist/cjs/core/events/event-system.js +1 -0
- package/dist/cjs/core/events/index.js +1 -0
- package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/cjs/core/fixed-ticker/index.js +1 -0
- package/dist/cjs/core/free-list/free-list.js +1 -0
- package/dist/cjs/core/free-list/index.js +1 -0
- package/dist/cjs/core/generate-id/generate-id.js +1 -0
- package/dist/cjs/core/generate-id/index.js +1 -0
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/input/index.js +1 -0
- package/dist/cjs/core/input/manager.js +1 -0
- package/dist/cjs/core/input/sources/browser.js +1 -0
- package/dist/cjs/core/input/sources/index.js +1 -0
- package/dist/cjs/core/input/types.js +1 -0
- package/dist/cjs/core/lerp/index.js +1 -0
- package/dist/cjs/core/lerp/lerp.js +1 -0
- package/dist/cjs/core/navmesh/index.js +1 -0
- package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
- package/dist/cjs/core/pooled-codec/index.js +1 -0
- package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/cjs/core/prediction/index.js +1 -0
- package/dist/cjs/core/prediction/prediction.js +1 -0
- package/dist/cjs/core/ray/index.js +1 -0
- package/dist/cjs/core/ray/ray-2d.js +1 -0
- package/dist/cjs/core/ray/ray-3d.js +1 -0
- package/dist/cjs/core/simple-rng/index.js +1 -0
- package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
- package/dist/cjs/core/sparse-batcher/index.js +1 -0
- package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/cjs/ecs/component-store.js +1 -0
- package/dist/cjs/ecs/component.js +1 -0
- package/dist/cjs/ecs/entity-handle.js +1 -0
- package/dist/cjs/ecs/index.js +1 -0
- package/dist/cjs/ecs/system-builder.js +1 -0
- package/dist/cjs/ecs/world-systems.js +1 -0
- package/dist/cjs/ecs/world.js +1 -0
- package/dist/cjs/game/index.js +1 -0
- package/dist/cjs/game/loop/index.js +1 -0
- package/dist/cjs/game/loop/loop.js +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/net/adapters/browser-websocket.js +1 -0
- package/dist/cjs/net/adapters/bun-websocket.js +1 -0
- package/dist/cjs/net/buffer-pool.js +1 -0
- package/dist/cjs/net/client.js +1 -0
- package/dist/cjs/net/index.js +1 -0
- package/dist/cjs/net/server.js +1 -0
- package/dist/cjs/net/types.js +1 -0
- package/dist/cjs/net/validators.js +1 -0
- package/dist/cjs/protocol/index.js +1 -0
- package/dist/cjs/protocol/intent/define-intent.js +1 -0
- package/dist/cjs/protocol/intent/index.js +1 -0
- package/dist/cjs/protocol/intent/intent-registry.js +1 -0
- package/dist/cjs/protocol/intent/intent.js +1 -0
- package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
- package/dist/cjs/protocol/rpc/index.js +1 -0
- package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
- package/dist/cjs/protocol/rpc/rpc.js +1 -0
- package/dist/cjs/protocol/snapshot/index.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
- package/dist/cjs/renderer/base-2d-renderer.js +1 -0
- package/dist/cjs/renderer/base-3d-renderer.js +1 -0
- package/dist/cjs/renderer/base-renderer.js +1 -0
- package/dist/cjs/renderer/index.js +1 -0
- package/dist/cjs/renderer/types.js +1 -0
- package/dist/esm/core/binary-codec/binary-codec.js +1 -0
- package/dist/esm/core/binary-codec/index.js +1 -0
- package/dist/esm/core/driver/driver.js +1 -0
- package/dist/esm/core/driver/drivers/immediate.js +1 -0
- package/dist/esm/core/driver/drivers/index.js +1 -0
- package/dist/esm/core/driver/drivers/raf.js +1 -0
- package/dist/esm/core/driver/drivers/timeout.js +1 -0
- package/dist/esm/core/driver/index.js +1 -0
- package/dist/esm/core/events/event-system.js +1 -0
- package/dist/esm/core/events/index.js +1 -0
- package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/esm/core/fixed-ticker/index.js +1 -0
- package/dist/esm/core/free-list/free-list.js +1 -0
- package/dist/esm/core/free-list/index.js +1 -0
- package/dist/esm/core/generate-id/generate-id.js +1 -0
- package/dist/esm/core/generate-id/index.js +1 -0
- package/dist/esm/core/index.js +1 -0
- package/dist/esm/core/input/index.js +1 -0
- package/dist/esm/core/input/manager.js +1 -0
- package/dist/esm/core/input/sources/browser.js +1 -0
- package/dist/esm/core/input/sources/index.js +1 -0
- package/dist/esm/core/input/types.js +0 -0
- package/dist/esm/core/lerp/index.js +1 -0
- package/dist/esm/core/lerp/lerp.js +1 -0
- package/dist/esm/core/navmesh/index.js +1 -0
- package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/esm/core/navmesh/navmesh.js +1 -0
- package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
- package/dist/esm/core/pooled-codec/index.js +1 -0
- package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/esm/core/prediction/index.js +1 -0
- package/dist/esm/core/prediction/prediction.js +1 -0
- package/dist/esm/core/ray/index.js +1 -0
- package/dist/esm/core/ray/ray-2d.js +1 -0
- package/dist/esm/core/ray/ray-3d.js +1 -0
- package/dist/esm/core/simple-rng/index.js +1 -0
- package/dist/esm/core/simple-rng/simple-rng.js +1 -0
- package/dist/esm/core/sparse-batcher/index.js +1 -0
- package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/esm/ecs/component-store.js +1 -0
- package/dist/esm/ecs/component.js +1 -0
- package/dist/esm/ecs/entity-handle.js +1 -0
- package/dist/esm/ecs/index.js +1 -0
- package/dist/esm/ecs/system-builder.js +1 -0
- package/dist/esm/ecs/world-systems.js +1 -0
- package/dist/esm/ecs/world.js +1 -0
- package/dist/esm/game/index.js +1 -0
- package/dist/esm/game/loop/index.js +1 -0
- package/dist/esm/game/loop/loop.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/net/adapters/browser-websocket.js +1 -0
- package/dist/esm/net/adapters/bun-websocket.js +1 -0
- package/dist/esm/net/buffer-pool.js +1 -0
- package/dist/esm/net/client.js +1 -0
- package/dist/esm/net/index.js +1 -0
- package/dist/esm/net/server.js +1 -0
- package/dist/esm/net/types.js +1 -0
- package/dist/esm/net/validators.js +1 -0
- package/dist/esm/protocol/index.js +1 -0
- package/dist/esm/protocol/intent/define-intent.js +1 -0
- package/dist/esm/protocol/intent/index.js +1 -0
- package/dist/esm/protocol/intent/intent-registry.js +1 -0
- package/dist/esm/protocol/intent/intent.js +0 -0
- package/dist/esm/protocol/rpc/define-rpc.js +1 -0
- package/dist/esm/protocol/rpc/index.js +1 -0
- package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
- package/dist/esm/protocol/rpc/rpc.js +0 -0
- package/dist/esm/protocol/snapshot/index.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot.js +1 -0
- package/dist/esm/renderer/base-2d-renderer.js +1 -0
- package/dist/esm/renderer/base-3d-renderer.js +1 -0
- package/dist/esm/renderer/base-renderer.js +1 -0
- package/dist/esm/renderer/index.js +1 -0
- package/dist/esm/renderer/types.js +0 -0
- package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
- package/dist/{core → types/core}/events/event-system.d.ts +14 -33
- package/dist/types/core/free-list/free-list.d.ts +31 -0
- package/dist/types/core/free-list/index.d.ts +1 -0
- package/dist/{core → types/core}/index.d.ts +5 -0
- package/dist/{core → types/core}/input/index.d.ts +1 -0
- package/dist/{core → types/core}/input/manager.d.ts +2 -0
- package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
- package/dist/types/core/ray/index.d.ts +2 -0
- package/dist/types/core/ray/ray-2d.d.ts +37 -0
- package/dist/types/core/ray/ray-3d.d.ts +42 -0
- package/dist/types/core/simple-rng/index.d.ts +1 -0
- package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
- package/dist/types/core/sparse-batcher/index.d.ts +1 -0
- package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
- package/dist/{ecs → types/ecs}/world.d.ts +11 -0
- package/dist/{game → types/game}/loop/loop.d.ts +33 -29
- package/dist/{index.d.ts → types/index.d.ts} +1 -0
- package/dist/{net → types/net}/index.d.ts +2 -2
- package/dist/types/renderer/base-2d-renderer.d.ts +13 -0
- package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
- package/dist/types/renderer/base-renderer.d.ts +21 -0
- package/dist/types/renderer/index.d.ts +4 -0
- package/dist/types/renderer/types.d.ts +79 -0
- package/dist/webgpu/cjs/index.js +6004 -0
- package/dist/webgpu/esm/index.js +5972 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +55 -0
- package/dist/webgpu/types/2d/shader.d.ts +61 -0
- package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
- package/dist/webgpu/types/3d/gltf-skin-parser.d.ts +101 -0
- package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
- package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
- package/dist/webgpu/types/3d/renderer.d.ts +216 -0
- package/dist/webgpu/types/3d/shader.d.ts +136 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +8 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -0
- package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
- package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
- package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/index.d.ts +2 -0
- package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
- package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
- package/dist/webgpu/types/core/constants.d.ts +59 -0
- package/dist/webgpu/types/core/constants.test.d.ts +1 -0
- package/dist/webgpu/types/core/index.d.ts +2 -0
- package/dist/webgpu/types/core/math.d.ts +37 -0
- package/dist/webgpu/types/core/types.d.ts +125 -0
- package/dist/webgpu/types/core/types.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
- package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
- package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/index.d.ts +2 -0
- package/dist/webgpu/types/index.d.ts +32 -0
- package/dist/webgpu/types/particle/emitter.d.ts +36 -0
- package/dist/webgpu/types/shaders/index.d.ts +2 -0
- package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
- package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
- package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
- package/dist/webgpu/types/shaders/utils.d.ts +28 -0
- package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/spritesheet.d.ts +57 -0
- package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
- package/package.json +96 -26
- package/dist/core/binary-codec/binary-codec.js +0 -354
- package/dist/core/binary-codec/index.js +0 -1
- package/dist/core/driver/driver.js +0 -47
- package/dist/core/driver/drivers/immediate.js +0 -61
- package/dist/core/driver/drivers/index.js +0 -3
- package/dist/core/driver/drivers/raf.js +0 -62
- package/dist/core/driver/drivers/timeout.js +0 -71
- package/dist/core/driver/index.js +0 -2
- package/dist/core/events/event-system.js +0 -88
- package/dist/core/events/index.js +0 -1
- package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
- package/dist/core/fixed-ticker/index.js +0 -1
- package/dist/core/generate-id/generate-id.js +0 -25
- package/dist/core/generate-id/index.js +0 -1
- package/dist/core/index.js +0 -10
- package/dist/core/input/index.js +0 -2
- package/dist/core/input/manager.js +0 -211
- package/dist/core/input/sources/browser.js +0 -29
- package/dist/core/input/sources/index.js +0 -1
- package/dist/core/lerp/index.js +0 -1
- package/dist/core/lerp/lerp.js +0 -42
- package/dist/core/navmesh/index.js +0 -1
- package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
- package/dist/core/navmesh/navmesh.js +0 -799
- package/dist/core/navmesh/navmesh.worker.js +0 -79
- package/dist/core/pooled-codec/index.js +0 -1
- package/dist/core/pooled-codec/pooled-codec.js +0 -410
- package/dist/core/prediction/index.js +0 -1
- package/dist/core/prediction/prediction.js +0 -99
- package/dist/core.esm.js +0 -1
- package/dist/core.js +0 -1
- package/dist/ecs/component-store.js +0 -175
- package/dist/ecs/component.js +0 -43
- package/dist/ecs/entity-handle.js +0 -515
- package/dist/ecs/example.js +0 -125
- package/dist/ecs/index.js +0 -4
- package/dist/ecs/system-builder.js +0 -249
- package/dist/ecs/world-systems.js +0 -79
- package/dist/ecs/world.js +0 -767
- package/dist/game/index.js +0 -1
- package/dist/game/loop/index.js +0 -1
- package/dist/game/loop/loop.js +0 -108
- package/dist/index.js +0 -26
- package/dist/net/adapters/browser-websocket.js +0 -74
- package/dist/net/adapters/bun-websocket.js +0 -245
- package/dist/net/buffer-pool.js +0 -89
- package/dist/net/client.js +0 -586
- package/dist/net/index.js +0 -58
- package/dist/net/server.js +0 -974
- package/dist/net/types.js +0 -31
- package/dist/net/validators.js +0 -88
- package/dist/protocol/index.js +0 -92
- package/dist/protocol/intent/define-intent.js +0 -125
- package/dist/protocol/intent/index.js +0 -91
- package/dist/protocol/intent/intent-registry.js +0 -91
- package/dist/protocol/rpc/define-rpc.js +0 -84
- package/dist/protocol/rpc/index.js +0 -3
- package/dist/protocol/rpc/rpc-registry.js +0 -159
- package/dist/protocol/rpc/rpc.js +0 -12
- package/dist/protocol/snapshot/index.js +0 -43
- package/dist/protocol/snapshot/snapshot-codec.js +0 -67
- package/dist/protocol/snapshot/snapshot-registry.js +0 -168
- package/dist/protocol/snapshot/snapshot.js +0 -30
- package/src/core/binary-codec/README.md +0 -60
- package/src/core/binary-codec/binary-codec.test.ts +0 -300
- package/src/core/binary-codec/binary-codec.ts +0 -448
- package/src/core/binary-codec/index.ts +0 -1
- package/src/core/driver/README.md +0 -97
- package/src/core/driver/driver.test.ts +0 -414
- package/src/core/driver/driver.ts +0 -71
- package/src/core/driver/drivers/immediate.ts +0 -66
- package/src/core/driver/drivers/index.ts +0 -3
- package/src/core/driver/drivers/raf.ts +0 -67
- package/src/core/driver/drivers/timeout.ts +0 -77
- package/src/core/driver/index.ts +0 -2
- package/src/core/events/README.md +0 -47
- package/src/core/events/event-system.test.ts +0 -243
- package/src/core/events/event-system.ts +0 -140
- package/src/core/events/index.ts +0 -1
- package/src/core/fixed-ticker/README.md +0 -77
- package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
- package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
- package/src/core/fixed-ticker/index.ts +0 -1
- package/src/core/generate-id/README.md +0 -18
- package/src/core/generate-id/generate-id.test.ts +0 -79
- package/src/core/generate-id/generate-id.ts +0 -37
- package/src/core/generate-id/index.ts +0 -1
- package/src/core/index.ts +0 -10
- package/src/core/input/README.md +0 -24
- package/src/core/input/index.ts +0 -2
- package/src/core/input/manager.ts +0 -259
- package/src/core/input/sources/browser.ts +0 -39
- package/src/core/input/sources/index.ts +0 -1
- package/src/core/input/types.ts +0 -40
- package/src/core/lerp/README.md +0 -79
- package/src/core/lerp/index.ts +0 -1
- package/src/core/lerp/lerp.test.ts +0 -90
- package/src/core/lerp/lerp.ts +0 -42
- package/src/core/navmesh/README.md +0 -164
- package/src/core/navmesh/index.ts +0 -1
- package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
- package/src/core/navmesh/navmesh-workers.test.ts +0 -356
- package/src/core/navmesh/navmesh.test.ts +0 -344
- package/src/core/navmesh/navmesh.ts +0 -1047
- package/src/core/navmesh/navmesh.worker.ts +0 -147
- package/src/core/pooled-codec/README.md +0 -70
- package/src/core/pooled-codec/index.ts +0 -1
- package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
- package/src/core/pooled-codec/pooled-codec.ts +0 -504
- package/src/core/prediction/README.md +0 -64
- package/src/core/prediction/index.ts +0 -1
- package/src/core/prediction/prediction.test.ts +0 -423
- package/src/core/prediction/prediction.ts +0 -112
- package/src/ecs/README.md +0 -427
- package/src/ecs/benchmark.test.ts +0 -1645
- package/src/ecs/component-store.ts +0 -198
- package/src/ecs/component.ts +0 -90
- package/src/ecs/entity-handle.test.ts +0 -393
- package/src/ecs/entity-handle.ts +0 -563
- package/src/ecs/example.ts +0 -152
- package/src/ecs/index.ts +0 -4
- package/src/ecs/system-builder.ts +0 -404
- package/src/ecs/world-systems.ts +0 -83
- package/src/ecs/world.test.ts +0 -310
- package/src/ecs/world.ts +0 -904
- package/src/game/index.ts +0 -1
- package/src/game/loop/README.md +0 -32
- package/src/game/loop/index.ts +0 -1
- package/src/game/loop/loop.ts +0 -236
- package/src/index.ts +0 -32
- package/src/net/README.md +0 -474
- package/src/net/adapters/browser-websocket.ts +0 -86
- package/src/net/adapters/bun-websocket.ts +0 -292
- package/src/net/buffer-pool.ts +0 -106
- package/src/net/client.test.ts +0 -807
- package/src/net/client.ts +0 -695
- package/src/net/index.ts +0 -60
- package/src/net/server.test.ts +0 -799
- package/src/net/server.ts +0 -1152
- package/src/net/types.ts +0 -228
- package/src/net/validators.ts +0 -104
- package/src/protocol/README.md +0 -469
- package/src/protocol/index.ts +0 -93
- package/src/protocol/intent/define-intent.test.ts +0 -397
- package/src/protocol/intent/define-intent.ts +0 -201
- package/src/protocol/intent/index.ts +0 -94
- package/src/protocol/intent/intent-registry.test.ts +0 -198
- package/src/protocol/intent/intent-registry.ts +0 -112
- package/src/protocol/intent/intent.ts +0 -12
- package/src/protocol/rpc/define-rpc.test.ts +0 -141
- package/src/protocol/rpc/define-rpc.ts +0 -113
- package/src/protocol/rpc/index.ts +0 -3
- package/src/protocol/rpc/rpc-registry.test.ts +0 -168
- package/src/protocol/rpc/rpc-registry.ts +0 -176
- package/src/protocol/rpc/rpc.ts +0 -37
- package/src/protocol/snapshot/index.ts +0 -45
- package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
- package/src/protocol/snapshot/snapshot-codec.ts +0 -87
- package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
- package/src/protocol/snapshot/snapshot-registry.ts +0 -201
- package/src/protocol/snapshot/snapshot.test.ts +0 -76
- package/src/protocol/snapshot/snapshot.ts +0 -41
- /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
- /package/dist/{core → types/core}/driver/index.d.ts +0 -0
- /package/dist/{core → types/core}/events/index.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/types.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
- /package/dist/{game → types/game}/index.d.ts +0 -0
- /package/dist/{game → types/game}/loop/index.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
- /package/dist/{net → types/net}/client.d.ts +0 -0
- /package/dist/{net → types/net}/server.d.ts +0 -0
- /package/dist/{net → types/net}/types.d.ts +0 -0
- /package/dist/{net → types/net}/validators.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
- /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
- /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test, beforeEach, afterEach } from "bun:test";
|
|
2
|
-
import { RafDriver, ImmediateDriver, TimeoutDriver } from "./drivers";
|
|
3
|
-
import { createDriver } from "./driver";
|
|
4
|
-
|
|
5
|
-
// Mock requestAnimationFrame for testing (Node.js doesn't have it)
|
|
6
|
-
(() => {
|
|
7
|
-
let rafId = 0;
|
|
8
|
-
const callbacks = new Map<number, FrameRequestCallback>();
|
|
9
|
-
let running = false;
|
|
10
|
-
let intervalId: Timer | null = null;
|
|
11
|
-
|
|
12
|
-
(globalThis as any).requestAnimationFrame = (callback: FrameRequestCallback): number => {
|
|
13
|
-
const id = ++rafId;
|
|
14
|
-
callbacks.set(id, callback);
|
|
15
|
-
|
|
16
|
-
if (!running) {
|
|
17
|
-
running = true;
|
|
18
|
-
intervalId = setInterval(() => {
|
|
19
|
-
const now = performance.now();
|
|
20
|
-
const cbs = Array.from(callbacks.entries());
|
|
21
|
-
callbacks.clear();
|
|
22
|
-
for (const [_, cb] of cbs) {
|
|
23
|
-
cb(now);
|
|
24
|
-
}
|
|
25
|
-
if (callbacks.size === 0) {
|
|
26
|
-
running = false;
|
|
27
|
-
if (intervalId) clearInterval(intervalId);
|
|
28
|
-
}
|
|
29
|
-
}, 16); // ~60fps
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return id;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
(globalThis as any).cancelAnimationFrame = (id: number): void => {
|
|
36
|
-
callbacks.delete(id);
|
|
37
|
-
if (callbacks.size === 0) {
|
|
38
|
-
running = false;
|
|
39
|
-
if (intervalId) clearInterval(intervalId);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
})();
|
|
43
|
-
|
|
44
|
-
describe("Driver", () => {
|
|
45
|
-
describe("createDriver", () => {
|
|
46
|
-
test("should create RafDriver for client type", () => {
|
|
47
|
-
const driver = createDriver('client', () => {});
|
|
48
|
-
expect(driver).toBeInstanceOf(RafDriver);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("should create ImmediateDriver for server-immediate type", () => {
|
|
52
|
-
const driver = createDriver('server-immediate', () => {});
|
|
53
|
-
expect(driver).toBeInstanceOf(ImmediateDriver);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test("should create TimeoutDriver for server-timeout type", () => {
|
|
57
|
-
const driver = createDriver('server-timeout', () => {});
|
|
58
|
-
expect(driver).toBeInstanceOf(TimeoutDriver);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test("should pass update callback to driver", () => {
|
|
62
|
-
let called = false;
|
|
63
|
-
const update = () => { called = true; };
|
|
64
|
-
const driver = createDriver('server-immediate', update);
|
|
65
|
-
|
|
66
|
-
// Access the update function directly
|
|
67
|
-
(driver as ImmediateDriver).update(0.016);
|
|
68
|
-
expect(called).toBe(true);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe("ImmediateDriver", () => {
|
|
73
|
-
let driver: ImmediateDriver;
|
|
74
|
-
let updateCalls: number[] = [];
|
|
75
|
-
|
|
76
|
-
beforeEach(() => {
|
|
77
|
-
updateCalls = [];
|
|
78
|
-
driver = new ImmediateDriver((dt) => {
|
|
79
|
-
updateCalls.push(dt);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
afterEach(() => {
|
|
84
|
-
driver.stop();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("should initialize without starting", () => {
|
|
88
|
-
expect(updateCalls.length).toBe(0);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("should call update with delta time", async () => {
|
|
92
|
-
driver.start();
|
|
93
|
-
|
|
94
|
-
// Wait for a few ticks
|
|
95
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
96
|
-
driver.stop();
|
|
97
|
-
|
|
98
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
99
|
-
|
|
100
|
-
// Delta times should be positive and in seconds
|
|
101
|
-
for (const dt of updateCalls) {
|
|
102
|
-
expect(dt).toBeGreaterThan(0);
|
|
103
|
-
expect(dt).toBeLessThan(1); // Should be less than 1 second
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test("should stop calling update after stop", async () => {
|
|
108
|
-
driver.start();
|
|
109
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
110
|
-
driver.stop();
|
|
111
|
-
|
|
112
|
-
const callsAfterStop = updateCalls.length;
|
|
113
|
-
|
|
114
|
-
// Wait a bit more
|
|
115
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
116
|
-
|
|
117
|
-
// Should not have significantly more calls (allow 1-2 in-flight)
|
|
118
|
-
expect(updateCalls.length - callsAfterStop).toBeLessThanOrEqual(2);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test("should calculate delta time correctly", async () => {
|
|
122
|
-
driver.start();
|
|
123
|
-
|
|
124
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
125
|
-
driver.stop();
|
|
126
|
-
|
|
127
|
-
// Sum of all deltas should approximately equal wall time
|
|
128
|
-
const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
|
|
129
|
-
expect(totalTime).toBeGreaterThan(0.04); // At least 40ms
|
|
130
|
-
expect(totalTime).toBeLessThan(0.1); // Less than 100ms
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test("should handle restart", async () => {
|
|
134
|
-
driver.start();
|
|
135
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
136
|
-
driver.stop();
|
|
137
|
-
|
|
138
|
-
const firstBatch = updateCalls.length;
|
|
139
|
-
updateCalls = [];
|
|
140
|
-
|
|
141
|
-
driver.start();
|
|
142
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
143
|
-
driver.stop();
|
|
144
|
-
|
|
145
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe("RafDriver", () => {
|
|
150
|
-
let driver: RafDriver;
|
|
151
|
-
let updateCalls: number[] = [];
|
|
152
|
-
|
|
153
|
-
beforeEach(() => {
|
|
154
|
-
updateCalls = [];
|
|
155
|
-
driver = new RafDriver((dt) => {
|
|
156
|
-
updateCalls.push(dt);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
afterEach(() => {
|
|
161
|
-
driver.stop();
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test("should initialize without starting", () => {
|
|
165
|
-
expect(updateCalls.length).toBe(0);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
test("should call update with delta time", async () => {
|
|
169
|
-
driver.start();
|
|
170
|
-
|
|
171
|
-
// Wait for a few frames (at 60fps, 100ms = ~6 frames)
|
|
172
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
173
|
-
driver.stop();
|
|
174
|
-
|
|
175
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
176
|
-
|
|
177
|
-
// Delta times should be positive and reasonable for 60fps
|
|
178
|
-
for (const dt of updateCalls) {
|
|
179
|
-
expect(dt).toBeGreaterThan(0);
|
|
180
|
-
expect(dt).toBeLessThan(0.1); // Less than 100ms per frame
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
test("should stop calling update after stop", async () => {
|
|
185
|
-
driver.start();
|
|
186
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
187
|
-
driver.stop();
|
|
188
|
-
|
|
189
|
-
const callsAfterStop = updateCalls.length;
|
|
190
|
-
|
|
191
|
-
// Wait for potential in-flight RAF
|
|
192
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
193
|
-
|
|
194
|
-
// Should not have any more calls (RAF properly cancelled)
|
|
195
|
-
expect(updateCalls.length).toBe(callsAfterStop);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
test("should calculate delta time correctly", async () => {
|
|
199
|
-
driver.start();
|
|
200
|
-
|
|
201
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
202
|
-
driver.stop();
|
|
203
|
-
|
|
204
|
-
// Sum of all deltas should approximately equal wall time
|
|
205
|
-
const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
|
|
206
|
-
expect(totalTime).toBeGreaterThan(0.08); // At least 80ms
|
|
207
|
-
expect(totalTime).toBeLessThan(0.15); // Less than 150ms
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
test("should handle restart", async () => {
|
|
211
|
-
driver.start();
|
|
212
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
213
|
-
driver.stop();
|
|
214
|
-
|
|
215
|
-
const firstBatch = updateCalls.length;
|
|
216
|
-
updateCalls = [];
|
|
217
|
-
|
|
218
|
-
driver.start();
|
|
219
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
220
|
-
driver.stop();
|
|
221
|
-
|
|
222
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test("should cancel RAF on stop", async () => {
|
|
226
|
-
driver.start();
|
|
227
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
228
|
-
|
|
229
|
-
// Stop should cancel the RAF
|
|
230
|
-
driver.stop();
|
|
231
|
-
|
|
232
|
-
// rafId should be cleared
|
|
233
|
-
expect((driver as any).rafId).toBe(null);
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
describe("TimeoutDriver", () => {
|
|
238
|
-
let driver: TimeoutDriver;
|
|
239
|
-
let updateCalls: number[] = [];
|
|
240
|
-
|
|
241
|
-
beforeEach(() => {
|
|
242
|
-
updateCalls = [];
|
|
243
|
-
driver = new TimeoutDriver((dt) => {
|
|
244
|
-
updateCalls.push(dt);
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
afterEach(() => {
|
|
249
|
-
driver.stop();
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
test("should initialize without starting", () => {
|
|
253
|
-
expect(updateCalls.length).toBe(0);
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
test("should call update with delta time", async () => {
|
|
257
|
-
driver.start();
|
|
258
|
-
|
|
259
|
-
// Wait for a few ticks
|
|
260
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
261
|
-
driver.stop();
|
|
262
|
-
|
|
263
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
264
|
-
|
|
265
|
-
// Delta times should be positive and in seconds
|
|
266
|
-
for (const dt of updateCalls) {
|
|
267
|
-
expect(dt).toBeGreaterThan(0);
|
|
268
|
-
expect(dt).toBeLessThan(1); // Should be less than 1 second
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
test("should stop calling update after stop", async () => {
|
|
273
|
-
driver.start();
|
|
274
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
275
|
-
driver.stop();
|
|
276
|
-
|
|
277
|
-
const callsAfterStop = updateCalls.length;
|
|
278
|
-
|
|
279
|
-
// Wait a bit more
|
|
280
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
281
|
-
|
|
282
|
-
// Should not have significantly more calls (allow 1-2 in-flight)
|
|
283
|
-
expect(updateCalls.length - callsAfterStop).toBeLessThanOrEqual(2);
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test("should calculate delta time correctly", async () => {
|
|
287
|
-
driver.start();
|
|
288
|
-
|
|
289
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
290
|
-
driver.stop();
|
|
291
|
-
|
|
292
|
-
// Sum of all deltas should approximately equal wall time
|
|
293
|
-
const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
|
|
294
|
-
expect(totalTime).toBeGreaterThan(0.04); // At least 40ms
|
|
295
|
-
expect(totalTime).toBeLessThan(0.1); // Less than 100ms
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
test("should handle restart", async () => {
|
|
299
|
-
driver.start();
|
|
300
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
301
|
-
driver.stop();
|
|
302
|
-
|
|
303
|
-
const firstBatch = updateCalls.length;
|
|
304
|
-
updateCalls = [];
|
|
305
|
-
|
|
306
|
-
driver.start();
|
|
307
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
308
|
-
driver.stop();
|
|
309
|
-
|
|
310
|
-
expect(updateCalls.length).toBeGreaterThan(0);
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
test("should run slower than ImmediateDriver due to 1ms delay", async () => {
|
|
314
|
-
let timeoutTicks = 0;
|
|
315
|
-
let immediateTicks = 0;
|
|
316
|
-
|
|
317
|
-
const timeoutDriver = new TimeoutDriver(() => { timeoutTicks++; });
|
|
318
|
-
const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
|
|
319
|
-
|
|
320
|
-
timeoutDriver.start();
|
|
321
|
-
immediateDriver.start();
|
|
322
|
-
|
|
323
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
324
|
-
|
|
325
|
-
timeoutDriver.stop();
|
|
326
|
-
immediateDriver.stop();
|
|
327
|
-
|
|
328
|
-
// ImmediateDriver should tick significantly more than TimeoutDriver
|
|
329
|
-
expect(immediateTicks).toBeGreaterThan(timeoutTicks);
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
describe("Driver comparison", () => {
|
|
334
|
-
test("ImmediateDriver should run faster than RAF", async () => {
|
|
335
|
-
let immediateTicks = 0;
|
|
336
|
-
let rafTicks = 0;
|
|
337
|
-
|
|
338
|
-
const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
|
|
339
|
-
const rafDriver = new RafDriver(() => { rafTicks++; });
|
|
340
|
-
|
|
341
|
-
immediateDriver.start();
|
|
342
|
-
rafDriver.start();
|
|
343
|
-
|
|
344
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
345
|
-
|
|
346
|
-
immediateDriver.stop();
|
|
347
|
-
rafDriver.stop();
|
|
348
|
-
|
|
349
|
-
// setImmediate should tick way more than RAF (~60fps)
|
|
350
|
-
expect(immediateTicks).toBeGreaterThan(rafTicks * 2);
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
test("TimeoutDriver should run faster than RAF but slower than Immediate", async () => {
|
|
354
|
-
let timeoutTicks = 0;
|
|
355
|
-
let rafTicks = 0;
|
|
356
|
-
let immediateTicks = 0;
|
|
357
|
-
|
|
358
|
-
const timeoutDriver = new TimeoutDriver(() => { timeoutTicks++; });
|
|
359
|
-
const rafDriver = new RafDriver(() => { rafTicks++; });
|
|
360
|
-
const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
|
|
361
|
-
|
|
362
|
-
timeoutDriver.start();
|
|
363
|
-
rafDriver.start();
|
|
364
|
-
immediateDriver.start();
|
|
365
|
-
|
|
366
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
367
|
-
|
|
368
|
-
timeoutDriver.stop();
|
|
369
|
-
rafDriver.stop();
|
|
370
|
-
immediateDriver.stop();
|
|
371
|
-
|
|
372
|
-
// TimeoutDriver should be between RAF and Immediate
|
|
373
|
-
expect(timeoutTicks).toBeGreaterThan(rafTicks);
|
|
374
|
-
expect(immediateTicks).toBeGreaterThan(timeoutTicks);
|
|
375
|
-
});
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
describe("Edge cases", () => {
|
|
379
|
-
test("should handle multiple stops gracefully", () => {
|
|
380
|
-
const driver = new ImmediateDriver(() => {});
|
|
381
|
-
driver.start();
|
|
382
|
-
driver.stop();
|
|
383
|
-
driver.stop(); // Should not throw
|
|
384
|
-
driver.stop(); // Should not throw
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
test("should handle stop before start", () => {
|
|
388
|
-
const driver = new RafDriver(() => {});
|
|
389
|
-
driver.stop(); // Should not throw
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
test("should reset timing on restart to prevent large delta", async () => {
|
|
393
|
-
let firstDelta = 0;
|
|
394
|
-
const driver = new ImmediateDriver((dt) => {
|
|
395
|
-
if (firstDelta === 0) firstDelta = dt;
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
driver.start();
|
|
399
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
400
|
-
driver.stop();
|
|
401
|
-
|
|
402
|
-
// Wait a bit
|
|
403
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
404
|
-
|
|
405
|
-
firstDelta = 0;
|
|
406
|
-
driver.start();
|
|
407
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
408
|
-
driver.stop();
|
|
409
|
-
|
|
410
|
-
// First delta after restart should be small, not 100ms+
|
|
411
|
-
expect(firstDelta).toBeLessThan(0.05);
|
|
412
|
-
});
|
|
413
|
-
});
|
|
414
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { ImmediateDriver, RafDriver, TimeoutDriver } from "./drivers";
|
|
2
|
-
|
|
3
|
-
// Re-export driver classes for testing and direct usage
|
|
4
|
-
export { ImmediateDriver, RafDriver, TimeoutDriver };
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Interface for game loop drivers that handle frame updates.
|
|
8
|
-
* Drivers are responsible for scheduling and executing the game loop
|
|
9
|
-
* at the appropriate rate for their environment (client or server).
|
|
10
|
-
*/
|
|
11
|
-
export interface LoopDriver {
|
|
12
|
-
/** Starts the game loop */
|
|
13
|
-
start(): void;
|
|
14
|
-
/** Stops the game loop */
|
|
15
|
-
stop(): void;
|
|
16
|
-
/** Internal loop iteration method */
|
|
17
|
-
loop(): void;
|
|
18
|
-
/** Update callback invoked each frame with delta time in seconds */
|
|
19
|
-
update(dt: number): void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Type of driver to use for the game loop.
|
|
24
|
-
* - `'client'`: Uses requestAnimationFrame for browser environments (syncs with display refresh rate)
|
|
25
|
-
* - `'server-immediate'`: Uses setImmediate for Node.js environments (runs as fast as possible, maximum performance)
|
|
26
|
-
* - `'server-timeout'`: Uses setTimeout with 1ms delay for Node.js environments (balanced performance with better I/O responsiveness)
|
|
27
|
-
*/
|
|
28
|
-
export type DriverType = 'server-immediate' | 'client' | 'server-timeout';
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Factory function to create a loop driver for the specified environment.
|
|
32
|
-
*
|
|
33
|
-
* @param type - The environment type
|
|
34
|
-
* - `'client'`: Browser RAF driver (60 FPS, syncs with display)
|
|
35
|
-
* - `'server'`: Node.js setImmediate driver (maximum performance)
|
|
36
|
-
* - `'server-timeout'`: Node.js setTimeout driver (balanced with I/O)
|
|
37
|
-
* @param update - Callback function invoked each frame with delta time in seconds
|
|
38
|
-
* @returns A configured LoopDriver instance ready to start
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```typescript
|
|
42
|
-
* // Client
|
|
43
|
-
* const clientDriver = createDriver('client', (dt) => {
|
|
44
|
-
* game.update(dt);
|
|
45
|
-
* renderer.render();
|
|
46
|
-
* });
|
|
47
|
-
* clientDriver.start();
|
|
48
|
-
*
|
|
49
|
-
* // Server (maximum performance)
|
|
50
|
-
* const serverDriver = createDriver('server', (dt) => {
|
|
51
|
-
* simulation.tick(dt);
|
|
52
|
-
* });
|
|
53
|
-
* serverDriver.start();
|
|
54
|
-
*
|
|
55
|
-
* // Server (balanced with I/O)
|
|
56
|
-
* const balancedDriver = createDriver('server-timeout', (dt) => {
|
|
57
|
-
* simulation.tick(dt);
|
|
58
|
-
* handleNetworkIO();
|
|
59
|
-
* });
|
|
60
|
-
* balancedDriver.start();
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
export function createDriver(type: DriverType, update: (dt: number) => void) {
|
|
64
|
-
if (type === 'server-immediate') {
|
|
65
|
-
return new ImmediateDriver(update);
|
|
66
|
-
} else if (type === 'server-timeout') {
|
|
67
|
-
return new TimeoutDriver(update);
|
|
68
|
-
} else {
|
|
69
|
-
return new RafDriver(update);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { LoopDriver } from "../driver";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Server-side game loop driver using setImmediate.
|
|
5
|
-
*
|
|
6
|
-
* This driver runs the game loop as fast as possible without blocking the event loop,
|
|
7
|
-
* making it suitable for Node.js server environments where high tick rates are desired.
|
|
8
|
-
*
|
|
9
|
-
* Delta time is automatically calculated between iterations and passed to the update callback in seconds.
|
|
10
|
-
*
|
|
11
|
-
* **Note:** This driver requires Node.js as it uses `setImmediate` which is not available in browsers.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const driver = new ImmediateDriver((dt) => {
|
|
16
|
-
* world.tick(dt);
|
|
17
|
-
* broadcastState();
|
|
18
|
-
* });
|
|
19
|
-
* driver.start();
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export class ImmediateDriver implements LoopDriver {
|
|
23
|
-
/**
|
|
24
|
-
* @param update - Callback invoked each tick with delta time in seconds
|
|
25
|
-
*/
|
|
26
|
-
constructor(public update: (dt: number) => void) { }
|
|
27
|
-
|
|
28
|
-
private last = performance.now();
|
|
29
|
-
private running = false;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Starts the game loop using setImmediate.
|
|
33
|
-
*
|
|
34
|
-
* Resets timing to prevent large initial delta.
|
|
35
|
-
*/
|
|
36
|
-
start() {
|
|
37
|
-
this.running = true;
|
|
38
|
-
this.last = performance.now();
|
|
39
|
-
this.loop();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Stops the game loop.
|
|
44
|
-
*
|
|
45
|
-
* Note: Does not cancel already queued setImmediate callbacks.
|
|
46
|
-
*/
|
|
47
|
-
stop() {
|
|
48
|
-
this.running = false;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Internal loop method that calculates delta time and schedules the next iteration.
|
|
53
|
-
*
|
|
54
|
-
* Delta time is provided in seconds.
|
|
55
|
-
*/
|
|
56
|
-
loop = () => {
|
|
57
|
-
if (!this.running) return;
|
|
58
|
-
|
|
59
|
-
const now = performance.now();
|
|
60
|
-
const dt = (now - this.last) / 1000;
|
|
61
|
-
this.last = now;
|
|
62
|
-
|
|
63
|
-
this.update(dt);
|
|
64
|
-
setImmediate(this.loop);
|
|
65
|
-
};
|
|
66
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { LoopDriver } from "../driver";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Client-side game loop driver using requestAnimationFrame.
|
|
5
|
-
*
|
|
6
|
-
* This driver synchronizes updates with the browser's display refresh rate (typically 60 FPS),
|
|
7
|
-
* providing smooth rendering and automatic throttling when the tab is not visible.
|
|
8
|
-
*
|
|
9
|
-
* Delta time is automatically calculated between frames and passed to the update callback in seconds.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const driver = new RafDriver((dt) => {
|
|
14
|
-
* player.update(dt);
|
|
15
|
-
* renderer.render();
|
|
16
|
-
* });
|
|
17
|
-
* driver.start();
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
export class RafDriver implements LoopDriver {
|
|
21
|
-
/**
|
|
22
|
-
* @param update - Callback invoked each frame with delta time in seconds
|
|
23
|
-
*/
|
|
24
|
-
constructor(public update: (dt: number) => void) { }
|
|
25
|
-
|
|
26
|
-
private last = performance.now();
|
|
27
|
-
private running = false;
|
|
28
|
-
private rafId: number | null = null;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Starts the game loop using requestAnimationFrame.
|
|
32
|
-
*
|
|
33
|
-
* Resets timing to prevent large initial delta.
|
|
34
|
-
*/
|
|
35
|
-
start() {
|
|
36
|
-
this.running = true;
|
|
37
|
-
this.last = performance.now();
|
|
38
|
-
this.rafId = requestAnimationFrame(this.loop);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Stops the game loop and cancels any pending animation frame.
|
|
43
|
-
*/
|
|
44
|
-
stop() {
|
|
45
|
-
this.running = false;
|
|
46
|
-
if (this.rafId !== null) {
|
|
47
|
-
cancelAnimationFrame(this.rafId);
|
|
48
|
-
this.rafId = null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Internal loop method that calculates delta time and schedules the next frame.
|
|
54
|
-
*
|
|
55
|
-
* Delta time is provided in seconds.
|
|
56
|
-
*/
|
|
57
|
-
loop = () => {
|
|
58
|
-
if (!this.running) return;
|
|
59
|
-
|
|
60
|
-
const now = performance.now();
|
|
61
|
-
const dt = (now - this.last) / 1000;
|
|
62
|
-
this.last = now;
|
|
63
|
-
|
|
64
|
-
this.update(dt);
|
|
65
|
-
requestAnimationFrame(this.loop);
|
|
66
|
-
};
|
|
67
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { LoopDriver } from "../driver";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Minimal delay for setTimeout-based loop scheduling.
|
|
5
|
-
* Using 1ms allows the event loop to process I/O while still maintaining high tick rates.
|
|
6
|
-
*/
|
|
7
|
-
const TIMEOUT_DELAY = 1;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Server-side game loop driver using setTimeout.
|
|
11
|
-
*
|
|
12
|
-
* This driver provides a more controlled alternative to setImmediate, running the game loop
|
|
13
|
-
* with a minimal delay (1ms) between iterations. This ensures the event loop can process
|
|
14
|
-
* I/O operations while maintaining high tick rates.
|
|
15
|
-
*
|
|
16
|
-
* Unlike setImmediate which runs as fast as possible, setTimeout provides better I/O responsiveness
|
|
17
|
-
* by yielding to the event loop between ticks with a minimal delay.
|
|
18
|
-
*
|
|
19
|
-
* Delta time is automatically calculated between iterations and passed to the update callback in seconds.
|
|
20
|
-
*
|
|
21
|
-
* **Note:** This driver is designed for Node.js/Bun server environments. For maximum performance
|
|
22
|
-
* without I/O concerns, use ImmediateDriver instead.
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const driver = new TimeoutDriver((dt) => {
|
|
27
|
-
* world.tick(dt);
|
|
28
|
-
* broadcastState();
|
|
29
|
-
* });
|
|
30
|
-
* driver.start();
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export class TimeoutDriver implements LoopDriver {
|
|
34
|
-
/**
|
|
35
|
-
* @param update - Callback invoked each tick with delta time in seconds
|
|
36
|
-
*/
|
|
37
|
-
constructor(public update: (dt: number) => void) { }
|
|
38
|
-
|
|
39
|
-
private last = performance.now();
|
|
40
|
-
private running = false;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Starts the game loop using setTimeout with minimal delay.
|
|
44
|
-
*
|
|
45
|
-
* Resets timing to prevent large initial delta.
|
|
46
|
-
*/
|
|
47
|
-
start() {
|
|
48
|
-
this.running = true;
|
|
49
|
-
this.last = performance.now();
|
|
50
|
-
this.loop();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Stops the game loop.
|
|
55
|
-
*
|
|
56
|
-
* Note: Does not cancel already queued setTimeout callbacks.
|
|
57
|
-
*/
|
|
58
|
-
stop() {
|
|
59
|
-
this.running = false;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Internal loop method that calculates delta time and schedules the next iteration.
|
|
64
|
-
*
|
|
65
|
-
* Delta time is provided in seconds. Uses 1ms delay to allow I/O processing.
|
|
66
|
-
*/
|
|
67
|
-
loop = () => {
|
|
68
|
-
if (!this.running) return;
|
|
69
|
-
|
|
70
|
-
const now = performance.now();
|
|
71
|
-
const dt = (now - this.last) / 1000;
|
|
72
|
-
this.last = now;
|
|
73
|
-
|
|
74
|
-
this.update(dt);
|
|
75
|
-
setTimeout(this.loop, TIMEOUT_DELAY);
|
|
76
|
-
};
|
|
77
|
-
}
|
package/src/core/driver/index.ts
DELETED