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,397 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "bun:test";
|
|
2
|
-
import { defineIntent } from "./define-intent";
|
|
3
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
4
|
-
import { IntentRegistry } from "./intent-registry";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
describe("defineIntent", () => {
|
|
8
|
-
enum Intents {
|
|
9
|
-
Move = 1,
|
|
10
|
-
Attack,
|
|
11
|
-
Chat,
|
|
12
|
-
Jump,
|
|
13
|
-
Rotate,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
describe("type inference", () => {
|
|
17
|
-
it("should infer correct type from schema with automatic tick", () => {
|
|
18
|
-
|
|
19
|
-
const MoveIntent = defineIntent({
|
|
20
|
-
kind: Intents.Move,
|
|
21
|
-
schema: {
|
|
22
|
-
dx: BinaryCodec.f32,
|
|
23
|
-
dy: BinaryCodec.f32,
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
type MoveIntent = typeof MoveIntent.type;
|
|
28
|
-
|
|
29
|
-
// Create an instance to verify type inference
|
|
30
|
-
const move: MoveIntent = {
|
|
31
|
-
kind: Intents.Move,
|
|
32
|
-
tick: 100,
|
|
33
|
-
dx: 1.5,
|
|
34
|
-
dy: -2.0,
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
expect(move.kind).toBe(Intents.Move);
|
|
38
|
-
expect(move.tick).toBe(100);
|
|
39
|
-
expect(move.dx).toBe(1.5);
|
|
40
|
-
expect(move.dy).toBe(-2.0);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("should enforce kind literal type", () => {
|
|
44
|
-
const AttackIntent = defineIntent({
|
|
45
|
-
kind: Intents.Attack,
|
|
46
|
-
schema: {
|
|
47
|
-
targetId: BinaryCodec.u32,
|
|
48
|
-
damage: BinaryCodec.f32,
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
expect(AttackIntent.kind).toBe(Intents.Attack);
|
|
53
|
-
|
|
54
|
-
type AttackIntent = typeof AttackIntent.type;
|
|
55
|
-
const attack: AttackIntent = {
|
|
56
|
-
kind: Intents.Attack, // Must be exactly what Intents.Attack is
|
|
57
|
-
tick: 200,
|
|
58
|
-
targetId: 999,
|
|
59
|
-
damage: 50.5,
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
expect(attack.kind).toBe(Intents.Attack);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("should support intents with different field types", () => {
|
|
66
|
-
const ChatIntent = defineIntent({
|
|
67
|
-
kind: Intents.Chat,
|
|
68
|
-
schema: {
|
|
69
|
-
playerId: BinaryCodec.u8,
|
|
70
|
-
messageLength: BinaryCodec.u16,
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
type ChatIntent = typeof ChatIntent.type;
|
|
75
|
-
|
|
76
|
-
const chat: ChatIntent = {
|
|
77
|
-
kind: Intents.Chat,
|
|
78
|
-
tick: 500,
|
|
79
|
-
playerId: 5,
|
|
80
|
-
messageLength: 128,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
expect(chat.playerId).toBe(5);
|
|
84
|
-
expect(chat.messageLength).toBe(128);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe("codec generation", () => {
|
|
89
|
-
it("should create a working codec", () => {
|
|
90
|
-
const MoveIntent = defineIntent({
|
|
91
|
-
kind: Intents.Move,
|
|
92
|
-
schema: {
|
|
93
|
-
dx: BinaryCodec.f32,
|
|
94
|
-
dy: BinaryCodec.f32,
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
type MoveIntent = typeof MoveIntent.type;
|
|
99
|
-
|
|
100
|
-
const move: MoveIntent = {
|
|
101
|
-
kind: Intents.Move,
|
|
102
|
-
tick: 100,
|
|
103
|
-
dx: 1.5,
|
|
104
|
-
dy: -2.0,
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const encoded = MoveIntent.codec.encode(move);
|
|
108
|
-
const decoded = MoveIntent.codec.decode(encoded);
|
|
109
|
-
|
|
110
|
-
expect(decoded.kind).toBe(move.kind);
|
|
111
|
-
expect(decoded.tick).toBe(move.tick);
|
|
112
|
-
expect(decoded.dx).toBeCloseTo(move.dx, 5);
|
|
113
|
-
expect(decoded.dy).toBeCloseTo(move.dy, 5);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it("should include kind field in encoded data", () => {
|
|
117
|
-
const JumpIntent = defineIntent({
|
|
118
|
-
kind: Intents.Jump,
|
|
119
|
-
schema: {
|
|
120
|
-
height: BinaryCodec.f32,
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
type JumpIntent = typeof JumpIntent.type;
|
|
125
|
-
|
|
126
|
-
const jump: JumpIntent = {
|
|
127
|
-
kind: Intents.Jump,
|
|
128
|
-
tick: 50,
|
|
129
|
-
height: 10.5,
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
const encoded = JumpIntent.codec.encode(jump);
|
|
133
|
-
|
|
134
|
-
// First byte should be the kind (7)
|
|
135
|
-
expect(encoded[0]).toBe(Intents.Jump);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("should handle multiple round trips", () => {
|
|
139
|
-
const RotateIntent = defineIntent({
|
|
140
|
-
kind: Intents.Rotate,
|
|
141
|
-
schema: {
|
|
142
|
-
angle: BinaryCodec.f32,
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
type RotateIntent = typeof RotateIntent.type;
|
|
147
|
-
|
|
148
|
-
const original: RotateIntent = {
|
|
149
|
-
kind: Intents.Rotate,
|
|
150
|
-
tick: 999,
|
|
151
|
-
angle: 3.14159,
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
for (let i = 0; i < 10; i++) {
|
|
155
|
-
const encoded = RotateIntent.codec.encode(original);
|
|
156
|
-
const decoded = RotateIntent.codec.decode(encoded);
|
|
157
|
-
|
|
158
|
-
expect(decoded.kind).toBe(original.kind);
|
|
159
|
-
expect(decoded.tick).toBe(original.tick);
|
|
160
|
-
expect(decoded.angle).toBeCloseTo(original.angle, 5);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe("integration with IntentRegistry", () => {
|
|
166
|
-
it("should register and work with IntentRegistry", () => {
|
|
167
|
-
const registry = new IntentRegistry();
|
|
168
|
-
|
|
169
|
-
const MoveIntent = defineIntent({
|
|
170
|
-
kind: 1 as const,
|
|
171
|
-
schema: {
|
|
172
|
-
dx: BinaryCodec.f32,
|
|
173
|
-
dy: BinaryCodec.f32,
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const AttackIntent = defineIntent({
|
|
178
|
-
kind: 2 as const,
|
|
179
|
-
schema: {
|
|
180
|
-
targetId: BinaryCodec.u32,
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
type MoveIntent = typeof MoveIntent.type;
|
|
185
|
-
type AttackIntent = typeof AttackIntent.type;
|
|
186
|
-
|
|
187
|
-
// Register using defineIntent objects
|
|
188
|
-
registry.register(MoveIntent);
|
|
189
|
-
registry.register(AttackIntent);
|
|
190
|
-
|
|
191
|
-
const move: MoveIntent = {
|
|
192
|
-
kind: MoveIntent.kind,
|
|
193
|
-
tick: 100,
|
|
194
|
-
dx: 5.0,
|
|
195
|
-
dy: -3.0,
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const attack: AttackIntent = {
|
|
199
|
-
kind: AttackIntent.kind,
|
|
200
|
-
tick: 101,
|
|
201
|
-
targetId: 42,
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
// Encode using registry
|
|
205
|
-
const moveEncoded = registry.encode(move);
|
|
206
|
-
const attackEncoded = registry.encode(attack);
|
|
207
|
-
|
|
208
|
-
// Decode using registry
|
|
209
|
-
const moveDecoded = registry.decode(moveEncoded);
|
|
210
|
-
const attackDecoded = registry.decode(attackEncoded);
|
|
211
|
-
|
|
212
|
-
expect(moveDecoded.kind).toBe(1);
|
|
213
|
-
expect(moveDecoded.tick).toBe(100);
|
|
214
|
-
expect((moveDecoded as any).dx).toBeCloseTo(5.0, 5);
|
|
215
|
-
expect((moveDecoded as any).dy).toBeCloseTo(-3.0, 5);
|
|
216
|
-
|
|
217
|
-
expect(attackDecoded.kind).toBe(2);
|
|
218
|
-
expect(attackDecoded.tick).toBe(101);
|
|
219
|
-
expect((attackDecoded as any).targetId).toBe(42);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it("should prevent duplicate registrations", () => {
|
|
223
|
-
const registry = new IntentRegistry();
|
|
224
|
-
|
|
225
|
-
const Intent1 = defineIntent({
|
|
226
|
-
kind: 5 as const,
|
|
227
|
-
schema: {},
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
const Intent2 = defineIntent({
|
|
231
|
-
kind: 5 as const, // Same kind
|
|
232
|
-
schema: {},
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
registry.register(Intent1);
|
|
236
|
-
|
|
237
|
-
expect(() => {
|
|
238
|
-
registry.register(Intent2);
|
|
239
|
-
}).toThrow("Intent kind 5 is already registered");
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
describe("complex intents", () => {
|
|
244
|
-
it("should handle intents with many fields", () => {
|
|
245
|
-
const PlayerStateIntent = defineIntent({
|
|
246
|
-
kind: 99 as const,
|
|
247
|
-
schema: {
|
|
248
|
-
playerId: BinaryCodec.u32,
|
|
249
|
-
x: BinaryCodec.f32,
|
|
250
|
-
y: BinaryCodec.f32,
|
|
251
|
-
z: BinaryCodec.f32,
|
|
252
|
-
velocityX: BinaryCodec.f32,
|
|
253
|
-
velocityY: BinaryCodec.f32,
|
|
254
|
-
velocityZ: BinaryCodec.f32,
|
|
255
|
-
health: BinaryCodec.u8,
|
|
256
|
-
mana: BinaryCodec.u8,
|
|
257
|
-
},
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
type PlayerStateIntent = typeof PlayerStateIntent.type;
|
|
261
|
-
|
|
262
|
-
const state: PlayerStateIntent = {
|
|
263
|
-
kind: 99,
|
|
264
|
-
tick: 1000,
|
|
265
|
-
playerId: 123,
|
|
266
|
-
x: 10.5,
|
|
267
|
-
y: 20.3,
|
|
268
|
-
z: 30.1,
|
|
269
|
-
velocityX: 1.0,
|
|
270
|
-
velocityY: 0.5,
|
|
271
|
-
velocityZ: -0.2,
|
|
272
|
-
health: 100,
|
|
273
|
-
mana: 50,
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const encoded = PlayerStateIntent.codec.encode(state);
|
|
277
|
-
const decoded = PlayerStateIntent.codec.decode(encoded);
|
|
278
|
-
|
|
279
|
-
expect(decoded.kind).toBe(state.kind);
|
|
280
|
-
expect(decoded.tick).toBe(state.tick);
|
|
281
|
-
expect(decoded.playerId).toBe(state.playerId);
|
|
282
|
-
expect(decoded.x).toBeCloseTo(state.x, 5);
|
|
283
|
-
expect(decoded.y).toBeCloseTo(state.y, 5);
|
|
284
|
-
expect(decoded.z).toBeCloseTo(state.z, 5);
|
|
285
|
-
expect(decoded.velocityX).toBeCloseTo(state.velocityX, 5);
|
|
286
|
-
expect(decoded.velocityY).toBeCloseTo(state.velocityY, 5);
|
|
287
|
-
expect(decoded.velocityZ).toBeCloseTo(state.velocityZ, 5);
|
|
288
|
-
expect(decoded.health).toBe(state.health);
|
|
289
|
-
expect(decoded.mana).toBe(state.mana);
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
it("should handle minimal intents with only tick", () => {
|
|
293
|
-
const PingIntent = defineIntent({
|
|
294
|
-
kind: 255 as const,
|
|
295
|
-
schema: {}, // No additional fields, only kind and tick
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
type PingIntent = typeof PingIntent.type;
|
|
299
|
-
|
|
300
|
-
const ping: PingIntent = {
|
|
301
|
-
kind: 255,
|
|
302
|
-
tick: 12345,
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
const encoded = PingIntent.codec.encode(ping);
|
|
306
|
-
const decoded = PingIntent.codec.decode(encoded);
|
|
307
|
-
|
|
308
|
-
expect(decoded.kind).toBe(255);
|
|
309
|
-
expect(decoded.tick).toBe(12345);
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
describe("edge cases", () => {
|
|
314
|
-
it("should handle zero values", () => {
|
|
315
|
-
const ZeroIntent = defineIntent({
|
|
316
|
-
kind: 0 as const,
|
|
317
|
-
schema: {
|
|
318
|
-
value: BinaryCodec.f32,
|
|
319
|
-
},
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
type ZeroIntent = typeof ZeroIntent.type;
|
|
323
|
-
|
|
324
|
-
const zero: ZeroIntent = {
|
|
325
|
-
kind: 0,
|
|
326
|
-
tick: 0,
|
|
327
|
-
value: 0,
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
const encoded = ZeroIntent.codec.encode(zero);
|
|
331
|
-
const decoded = ZeroIntent.codec.decode(encoded);
|
|
332
|
-
|
|
333
|
-
expect(decoded.kind).toBe(0);
|
|
334
|
-
expect(decoded.tick).toBe(0);
|
|
335
|
-
expect(decoded.value).toBe(0);
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
it("should handle maximum values for numeric types", () => {
|
|
339
|
-
const MaxIntent = defineIntent({
|
|
340
|
-
kind: 255 as const,
|
|
341
|
-
schema: {
|
|
342
|
-
maxU8: BinaryCodec.u8,
|
|
343
|
-
maxU16: BinaryCodec.u16,
|
|
344
|
-
maxU32: BinaryCodec.u32,
|
|
345
|
-
},
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
type MaxIntent = typeof MaxIntent.type;
|
|
349
|
-
|
|
350
|
-
const max: MaxIntent = {
|
|
351
|
-
kind: 255,
|
|
352
|
-
tick: 0xFFFFFFFF,
|
|
353
|
-
maxU8: 255,
|
|
354
|
-
maxU16: 65535,
|
|
355
|
-
maxU32: 0xFFFFFFFF,
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
const encoded = MaxIntent.codec.encode(max);
|
|
359
|
-
const decoded = MaxIntent.codec.decode(encoded);
|
|
360
|
-
|
|
361
|
-
expect(decoded.kind).toBe(255);
|
|
362
|
-
expect(decoded.tick).toBe(0xFFFFFFFF);
|
|
363
|
-
expect(decoded.maxU8).toBe(255);
|
|
364
|
-
expect(decoded.maxU16).toBe(65535);
|
|
365
|
-
expect(decoded.maxU32).toBe(0xFFFFFFFF);
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
it("should allow custom tick encoding", () => {
|
|
369
|
-
const CustomTickIntent = defineIntent({
|
|
370
|
-
kind: 100 as const,
|
|
371
|
-
schema: {
|
|
372
|
-
tick: BinaryCodec.u16, // Override default u32 with u16
|
|
373
|
-
action: BinaryCodec.u8,
|
|
374
|
-
},
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
type CustomTickIntent = typeof CustomTickIntent.type;
|
|
378
|
-
|
|
379
|
-
const intent: CustomTickIntent = {
|
|
380
|
-
kind: 100,
|
|
381
|
-
tick: 5000, // Max u16 is 65535
|
|
382
|
-
action: 42,
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
const encoded = CustomTickIntent.codec.encode(intent);
|
|
386
|
-
const decoded = CustomTickIntent.codec.decode(encoded);
|
|
387
|
-
|
|
388
|
-
expect(decoded.kind).toBe(100);
|
|
389
|
-
expect(decoded.tick).toBe(5000);
|
|
390
|
-
expect(decoded.action).toBe(42);
|
|
391
|
-
|
|
392
|
-
// Verify the encoded size is smaller (u16 instead of u32 for tick)
|
|
393
|
-
// kind (1) + tick (2) + action (1) = 4 bytes
|
|
394
|
-
expect(encoded.length).toBe(4);
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
});
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import type { Intent } from "./intent";
|
|
2
|
-
import type { Schema } from "../../core/binary-codec";
|
|
3
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
4
|
-
import type { Codec } from "./intent-registry";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Configuration for defining an intent type.
|
|
8
|
-
* @template K The intent kind (numeric literal type)
|
|
9
|
-
* @template S The schema type describing the intent's data fields
|
|
10
|
-
*/
|
|
11
|
-
export interface IntentDefinition<K extends number, S extends Record<string, any>> {
|
|
12
|
-
/** Numeric identifier for this intent type */
|
|
13
|
-
kind: K;
|
|
14
|
-
/**
|
|
15
|
-
* Schema describing the intent's data fields (excluding kind which is added automatically).
|
|
16
|
-
* If 'tick' is not provided, it will default to BinaryCodec.u32.
|
|
17
|
-
* You can override the tick encoding by including it in the schema.
|
|
18
|
-
*/
|
|
19
|
-
schema: S;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Infers the TypeScript type from an intent schema.
|
|
24
|
-
* The schema already includes 'kind' (added automatically) and should include 'tick'.
|
|
25
|
-
* @template K The intent kind (numeric literal type)
|
|
26
|
-
* @template S The schema type (includes tick, but kind is added automatically)
|
|
27
|
-
*/
|
|
28
|
-
export type InferIntentType<K extends number, S extends Record<string, any>> = {
|
|
29
|
-
kind: K;
|
|
30
|
-
tick: number;
|
|
31
|
-
} & {
|
|
32
|
-
[P in keyof S]: S[P] extends { read(dv: DataView, o: number): infer R } ? R : never;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Helper type to extract just the data fields from a DefinedIntent (excluding kind and tick).
|
|
37
|
-
* This is useful for APIs that work with intent data without the metadata fields.
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* const MoveIntent = defineIntent({
|
|
42
|
-
* kind: 1,
|
|
43
|
-
* schema: { vx: BinaryCodec.f32, vy: BinaryCodec.f32 }
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* type MoveData = IntentDataOnly<typeof MoveIntent>; // { vx: number, vy: number }
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
export type IntentDataOnly<T> =
|
|
50
|
-
T extends DefinedIntent<infer _K, infer U extends Intent>
|
|
51
|
-
? Omit<U, 'kind' | 'tick'>
|
|
52
|
-
: never;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Result of defineIntent - provides both the type and codec.
|
|
56
|
-
* @template K The intent kind literal
|
|
57
|
-
* @template T The inferred intent type
|
|
58
|
-
*/
|
|
59
|
-
export interface DefinedIntent<K extends number, T extends Intent> {
|
|
60
|
-
/** The TypeScript type for this intent (use with `typeof IntentName.type`) */
|
|
61
|
-
type: T;
|
|
62
|
-
/** The codec instance for encoding/decoding this intent */
|
|
63
|
-
codec: Codec<T>;
|
|
64
|
-
/** The kind identifier for this intent */
|
|
65
|
-
kind: K;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Simple codec implementation that uses BinaryCodec for encoding/decoding.
|
|
70
|
-
* @template T The intent type
|
|
71
|
-
*/
|
|
72
|
-
class IntentCodec<T extends Intent> implements Codec<T> {
|
|
73
|
-
constructor(private schema: Schema<T>) {}
|
|
74
|
-
|
|
75
|
-
encode(value: T): Uint8Array {
|
|
76
|
-
return BinaryCodec.encode(this.schema, value);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
decode(buf: Uint8Array): T {
|
|
80
|
-
// Create a target object with nil values
|
|
81
|
-
const target = {} as T;
|
|
82
|
-
for (const key of Object.keys(this.schema) as (keyof T)[]) {
|
|
83
|
-
const field = this.schema[key];
|
|
84
|
-
target[key] = field.toNil() as T[keyof T];
|
|
85
|
-
}
|
|
86
|
-
return BinaryCodec.decode(this.schema, buf, target);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Define a type-safe intent with automatic schema generation.
|
|
92
|
-
*
|
|
93
|
-
* This helper ensures that your intent's TypeScript interface and binary schema
|
|
94
|
-
* stay in sync by deriving the type from the schema definition.
|
|
95
|
-
*
|
|
96
|
-
* The `kind` and `tick` fields are automatically added to the schema:
|
|
97
|
-
* - `kind`: u8 codec (always FIRST byte - required for IntentRegistry.decode)
|
|
98
|
-
* - `tick`: u32 codec (default, can be overridden by including it in your schema)
|
|
99
|
-
*
|
|
100
|
-
* IMPORTANT: If you use PooledCodec directly instead of defineIntent(), you MUST
|
|
101
|
-
* ensure `kind: BinaryPrimitives.u8` is the FIRST field in your schema, or
|
|
102
|
-
* IntentRegistry.decode() will fail.
|
|
103
|
-
*
|
|
104
|
-
* @template K The intent kind (numeric literal)
|
|
105
|
-
* @template S The schema type
|
|
106
|
-
* @param definition Intent configuration with kind and schema
|
|
107
|
-
* @returns A DefinedIntent object with type, codec, and kind
|
|
108
|
-
*
|
|
109
|
-
* @example Using enums (recommended for managing multiple intents)
|
|
110
|
-
* ```ts
|
|
111
|
-
* // Define all your intent kinds in one place
|
|
112
|
-
* enum IntentKind {
|
|
113
|
-
* Move = 1,
|
|
114
|
-
* Attack = 2,
|
|
115
|
-
* Jump = 3,
|
|
116
|
-
* Chat = 4,
|
|
117
|
-
* }
|
|
118
|
-
*
|
|
119
|
-
* const MoveIntent = defineIntent({
|
|
120
|
-
* kind: IntentKind.Move,
|
|
121
|
-
* schema: {
|
|
122
|
-
* dx: BinaryCodec.f32,
|
|
123
|
-
* dy: BinaryCodec.f32,
|
|
124
|
-
* }
|
|
125
|
-
* });
|
|
126
|
-
*
|
|
127
|
-
* const AttackIntent = defineIntent({
|
|
128
|
-
* kind: IntentKind.Attack,
|
|
129
|
-
* schema: {
|
|
130
|
-
* targetId: BinaryCodec.u32,
|
|
131
|
-
* damage: BinaryCodec.f32,
|
|
132
|
-
* }
|
|
133
|
-
* });
|
|
134
|
-
*
|
|
135
|
-
* // Use the inferred types
|
|
136
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
137
|
-
* type AttackIntent = typeof AttackIntent.type;
|
|
138
|
-
*
|
|
139
|
-
* // Register with IntentRegistry
|
|
140
|
-
* const registry = new IntentRegistry();
|
|
141
|
-
* registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
142
|
-
* registry.register(AttackIntent.kind, AttackIntent.codec);
|
|
143
|
-
*
|
|
144
|
-
* // Create instances - tick is automatically available
|
|
145
|
-
* const move: MoveIntent = {
|
|
146
|
-
* kind: IntentKind.Move,
|
|
147
|
-
* tick: 100,
|
|
148
|
-
* dx: 1.5,
|
|
149
|
-
* dy: -2.0,
|
|
150
|
-
* };
|
|
151
|
-
* ```
|
|
152
|
-
*
|
|
153
|
-
* @example Using literal types (simple cases)
|
|
154
|
-
* ```ts
|
|
155
|
-
* const MoveIntent = defineIntent({
|
|
156
|
-
* kind: 1 as const,
|
|
157
|
-
* schema: {
|
|
158
|
-
* dx: BinaryCodec.f32,
|
|
159
|
-
* dy: BinaryCodec.f32,
|
|
160
|
-
* }
|
|
161
|
-
* });
|
|
162
|
-
*
|
|
163
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
164
|
-
* ```
|
|
165
|
-
*
|
|
166
|
-
* @example Custom tick encoding
|
|
167
|
-
* ```ts
|
|
168
|
-
* const SmallIntent = defineIntent({
|
|
169
|
-
* kind: IntentKind.Small,
|
|
170
|
-
* schema: {
|
|
171
|
-
* tick: BinaryCodec.u16, // Override default u32 with u16
|
|
172
|
-
* action: BinaryCodec.u8,
|
|
173
|
-
* }
|
|
174
|
-
* });
|
|
175
|
-
* ```
|
|
176
|
-
*/
|
|
177
|
-
export function defineIntent<
|
|
178
|
-
K extends number,
|
|
179
|
-
S extends Record<string, any>
|
|
180
|
-
>(
|
|
181
|
-
definition: IntentDefinition<K, S>
|
|
182
|
-
): DefinedIntent<K, InferIntentType<K, S>> {
|
|
183
|
-
type IntentType = InferIntentType<K, S>;
|
|
184
|
-
|
|
185
|
-
// Create the full schema with kind and tick fields
|
|
186
|
-
// Add tick with default u32 if not provided by user
|
|
187
|
-
const fullSchema = {
|
|
188
|
-
kind: BinaryCodec.u8,
|
|
189
|
-
tick: BinaryCodec.u32, // Default tick encoding
|
|
190
|
-
...definition.schema, // User can override tick if needed
|
|
191
|
-
} as Schema<IntentType>;
|
|
192
|
-
|
|
193
|
-
// Create the codec using BinaryCodec directly
|
|
194
|
-
const codec = new IntentCodec<IntentType>(fullSchema);
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
type: undefined as any as IntentType, // Phantom type for inference
|
|
198
|
-
codec,
|
|
199
|
-
kind: definition.kind,
|
|
200
|
-
};
|
|
201
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intent system for client-to-server actions.
|
|
3
|
-
*
|
|
4
|
-
* Intents are player/AI actions that need to be:
|
|
5
|
-
* 1. Encoded efficiently (binary)
|
|
6
|
-
* 2. Sent over network
|
|
7
|
-
* 3. Decoded on the other end
|
|
8
|
-
* 4. Processed deterministically
|
|
9
|
-
*
|
|
10
|
-
* @example Using defineIntent with enums (recommended)
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { defineIntent, IntentRegistry } from './protocol/intent';
|
|
13
|
-
* import { BinaryCodec } from '../core/binary-codec';
|
|
14
|
-
*
|
|
15
|
-
* // 1. Define all your intent kinds in one place
|
|
16
|
-
* enum IntentKind {
|
|
17
|
-
* Move = 1,
|
|
18
|
-
* Attack = 2,
|
|
19
|
-
* Jump = 3,
|
|
20
|
-
* }
|
|
21
|
-
*
|
|
22
|
-
* // 2. Define your intents with automatic type inference
|
|
23
|
-
* // kind and tick are added automatically!
|
|
24
|
-
* const MoveIntent = defineIntent({
|
|
25
|
-
* kind: IntentKind.Move,
|
|
26
|
-
* schema: {
|
|
27
|
-
* dx: BinaryCodec.f32,
|
|
28
|
-
* dy: BinaryCodec.f32,
|
|
29
|
-
* }
|
|
30
|
-
* });
|
|
31
|
-
*
|
|
32
|
-
* const AttackIntent = defineIntent({
|
|
33
|
-
* kind: IntentKind.Attack,
|
|
34
|
-
* schema: {
|
|
35
|
-
* targetId: BinaryCodec.u32,
|
|
36
|
-
* damage: BinaryCodec.f32,
|
|
37
|
-
* }
|
|
38
|
-
* });
|
|
39
|
-
*
|
|
40
|
-
* // 3. Extract the types
|
|
41
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
42
|
-
* type AttackIntent = typeof AttackIntent.type;
|
|
43
|
-
*
|
|
44
|
-
* // 4. Create registry and register
|
|
45
|
-
* const registry = new IntentRegistry();
|
|
46
|
-
* registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
47
|
-
* registry.register(AttackIntent.kind, AttackIntent.codec);
|
|
48
|
-
*
|
|
49
|
-
* // 5. Create instances with full type safety
|
|
50
|
-
* const move: MoveIntent = {
|
|
51
|
-
* kind: IntentKind.Move,
|
|
52
|
-
* tick: 100, // tick is automatically available
|
|
53
|
-
* dx: 1.5,
|
|
54
|
-
* dy: -2.0,
|
|
55
|
-
* };
|
|
56
|
-
*
|
|
57
|
-
* // 6. Encode/decode
|
|
58
|
-
* const buf = registry.encode(move);
|
|
59
|
-
* const decoded = registry.decode(buf);
|
|
60
|
-
* ```
|
|
61
|
-
*
|
|
62
|
-
* @example Manual definition (legacy)
|
|
63
|
-
* ```ts
|
|
64
|
-
* import { Intent, IntentRegistry } from './protocol/intent';
|
|
65
|
-
* import { PooledCodec } from '../core/pooled-codec';
|
|
66
|
-
* import { BinaryCodec } from '../core/binary-codec';
|
|
67
|
-
*
|
|
68
|
-
* // 1. Define your intent type
|
|
69
|
-
* interface MoveIntent extends Intent {
|
|
70
|
-
* kind: 1;
|
|
71
|
-
* tick: number;
|
|
72
|
-
* dx: number;
|
|
73
|
-
* dy: number;
|
|
74
|
-
* }
|
|
75
|
-
*
|
|
76
|
-
* // 2. Create registry and register once (reuse this instance)
|
|
77
|
-
* const registry = new IntentRegistry();
|
|
78
|
-
* registry.register(1, new PooledCodec({
|
|
79
|
-
* kind: BinaryCodec.u8,
|
|
80
|
-
* tick: BinaryCodec.u32,
|
|
81
|
-
* dx: BinaryCodec.f32,
|
|
82
|
-
* dy: BinaryCodec.f32,
|
|
83
|
-
* }));
|
|
84
|
-
*
|
|
85
|
-
* // 3. Encode/decode
|
|
86
|
-
* const buf = registry.encode(intent);
|
|
87
|
-
* const decoded = registry.decode(buf);
|
|
88
|
-
* ```
|
|
89
|
-
*/
|
|
90
|
-
|
|
91
|
-
export type { Intent } from "./intent";
|
|
92
|
-
export { IntentRegistry } from "./intent-registry";
|
|
93
|
-
export { defineIntent } from "./define-intent";
|
|
94
|
-
export type { DefinedIntent, InferIntentType, IntentDataOnly } from "./define-intent";
|