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,198 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from "bun:test";
|
|
2
|
-
import { IntentRegistry } from "./intent-registry";
|
|
3
|
-
import { Intent } from "./intent";
|
|
4
|
-
import { defineIntent } from "./define-intent";
|
|
5
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
6
|
-
|
|
7
|
-
// Define intents using defineIntent for testing
|
|
8
|
-
const MockIntent = defineIntent({
|
|
9
|
-
kind: 1 as const,
|
|
10
|
-
schema: {
|
|
11
|
-
value: BinaryCodec.u32,
|
|
12
|
-
},
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
const AnotherIntent = defineIntent({
|
|
16
|
-
kind: 2 as const,
|
|
17
|
-
schema: {
|
|
18
|
-
data: BinaryCodec.string(64),
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
type MockIntentType = typeof MockIntent.type;
|
|
23
|
-
type AnotherIntentType = typeof AnotherIntent.type;
|
|
24
|
-
|
|
25
|
-
describe("IntentRegistry", () => {
|
|
26
|
-
let registry: IntentRegistry;
|
|
27
|
-
|
|
28
|
-
beforeEach(() => {
|
|
29
|
-
registry = new IntentRegistry();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe("register", () => {
|
|
33
|
-
it("should register a codec for an intent kind", () => {
|
|
34
|
-
registry.register(MockIntent);
|
|
35
|
-
expect(registry.has(1)).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("should throw error when registering duplicate kind", () => {
|
|
39
|
-
registry.register(MockIntent);
|
|
40
|
-
expect(() => registry.register(MockIntent)).toThrow(
|
|
41
|
-
"Intent kind 1 is already registered"
|
|
42
|
-
);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("should allow registering multiple different kinds", () => {
|
|
46
|
-
registry.register(MockIntent);
|
|
47
|
-
registry.register(AnotherIntent);
|
|
48
|
-
expect(registry.has(1)).toBe(true);
|
|
49
|
-
expect(registry.has(2)).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe("encode", () => {
|
|
54
|
-
it("should encode an intent using registered codec", () => {
|
|
55
|
-
registry.register(MockIntent);
|
|
56
|
-
const intent: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
57
|
-
const buf = registry.encode(intent);
|
|
58
|
-
|
|
59
|
-
expect(buf).toBeInstanceOf(Uint8Array);
|
|
60
|
-
expect(buf[0]).toBe(1); // kind
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("should throw error when encoding unregistered intent kind", () => {
|
|
64
|
-
const intent: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
65
|
-
expect(() => registry.encode(intent)).toThrow(
|
|
66
|
-
"No codec registered for intent kind 1"
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("should encode different intent types correctly", () => {
|
|
71
|
-
registry.register(MockIntent);
|
|
72
|
-
registry.register(AnotherIntent);
|
|
73
|
-
|
|
74
|
-
const intent1: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
75
|
-
const intent2: AnotherIntentType = { kind: 2, tick: 200, data: "test" };
|
|
76
|
-
|
|
77
|
-
const buf1 = registry.encode(intent1);
|
|
78
|
-
const buf2 = registry.encode(intent2);
|
|
79
|
-
|
|
80
|
-
expect(buf1[0]).toBe(1);
|
|
81
|
-
expect(buf2[0]).toBe(2);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe("decode", () => {
|
|
86
|
-
it("should decode a buffer using registered codec", () => {
|
|
87
|
-
registry.register(MockIntent);
|
|
88
|
-
const original: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
89
|
-
const buf = registry.encode(original);
|
|
90
|
-
const decoded = registry.decode(buf);
|
|
91
|
-
|
|
92
|
-
expect(decoded).toEqual(original);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should throw error when decoding with unregistered kind", () => {
|
|
96
|
-
const buf = new Uint8Array([99, 0, 0, 0, 100, 0, 0, 0, 42]); // kind=99 not registered
|
|
97
|
-
expect(() => registry.decode(buf)).toThrow(
|
|
98
|
-
"No codec registered for intent kind 99"
|
|
99
|
-
);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it("should decode different intent types correctly", () => {
|
|
103
|
-
registry.register(MockIntent);
|
|
104
|
-
registry.register(AnotherIntent);
|
|
105
|
-
|
|
106
|
-
const intent1: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
107
|
-
const intent2: AnotherIntentType = { kind: 2, tick: 200, data: "hello" };
|
|
108
|
-
|
|
109
|
-
const buf1 = registry.encode(intent1);
|
|
110
|
-
const buf2 = registry.encode(intent2);
|
|
111
|
-
|
|
112
|
-
const decoded1 = registry.decode(buf1);
|
|
113
|
-
const decoded2 = registry.decode(buf2);
|
|
114
|
-
|
|
115
|
-
expect(decoded1).toEqual(intent1);
|
|
116
|
-
expect(decoded2).toEqual(intent2);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe("has", () => {
|
|
121
|
-
it("should return true for registered kinds", () => {
|
|
122
|
-
registry.register(MockIntent);
|
|
123
|
-
expect(registry.has(1)).toBe(true);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it("should return false for unregistered kinds", () => {
|
|
127
|
-
expect(registry.has(1)).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe("unregister", () => {
|
|
132
|
-
it("should remove a registered codec", () => {
|
|
133
|
-
registry.register(MockIntent);
|
|
134
|
-
expect(registry.has(1)).toBe(true);
|
|
135
|
-
|
|
136
|
-
const removed = registry.unregister(1);
|
|
137
|
-
expect(removed).toBe(true);
|
|
138
|
-
expect(registry.has(1)).toBe(false);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it("should return false when unregistering non-existent kind", () => {
|
|
142
|
-
const removed = registry.unregister(1);
|
|
143
|
-
expect(removed).toBe(false);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe("clear", () => {
|
|
148
|
-
it("should remove all registered codecs", () => {
|
|
149
|
-
registry.register(MockIntent);
|
|
150
|
-
registry.register(AnotherIntent);
|
|
151
|
-
|
|
152
|
-
registry.clear();
|
|
153
|
-
|
|
154
|
-
expect(registry.has(1)).toBe(false);
|
|
155
|
-
expect(registry.has(2)).toBe(false);
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
describe("getKinds", () => {
|
|
160
|
-
it("should return empty array when no codecs registered", () => {
|
|
161
|
-
expect(registry.getKinds()).toEqual([]);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it("should return all registered kinds", () => {
|
|
165
|
-
registry.register(MockIntent);
|
|
166
|
-
registry.register(AnotherIntent);
|
|
167
|
-
|
|
168
|
-
const kinds = registry.getKinds();
|
|
169
|
-
expect(kinds).toContain(1);
|
|
170
|
-
expect(kinds).toContain(2);
|
|
171
|
-
expect(kinds.length).toBe(2);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe("round-trip encoding/decoding", () => {
|
|
176
|
-
it("should preserve intent data through encode/decode cycle", () => {
|
|
177
|
-
registry.register(MockIntent);
|
|
178
|
-
|
|
179
|
-
const original: MockIntentType = { kind: 1, tick: 12345, value: 98765 };
|
|
180
|
-
const buf = registry.encode(original);
|
|
181
|
-
const decoded = registry.decode(buf);
|
|
182
|
-
|
|
183
|
-
expect(decoded).toEqual(original);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it("should handle multiple round-trips", () => {
|
|
187
|
-
registry.register(MockIntent);
|
|
188
|
-
|
|
189
|
-
const original: MockIntentType = { kind: 1, tick: 100, value: 42 };
|
|
190
|
-
|
|
191
|
-
for (let i = 0; i < 10; i++) {
|
|
192
|
-
const buf = registry.encode(original);
|
|
193
|
-
const decoded = registry.decode(buf);
|
|
194
|
-
expect(decoded).toEqual(original);
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
});
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { DefinedIntent } from "./define-intent";
|
|
2
|
-
import type { Intent } from "./intent";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generic codec interface (users import from core/pooled-codec)
|
|
6
|
-
*/
|
|
7
|
-
export interface Codec<T> {
|
|
8
|
-
encode(value: T): Uint8Array;
|
|
9
|
-
decode(buf: Uint8Array): T;
|
|
10
|
-
calculateSize?(value: T): number;
|
|
11
|
-
encodeInto?(value: T, buffer: Uint8Array, offset: number): number;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Registry for mapping intent kinds to their codecs.
|
|
16
|
-
*
|
|
17
|
-
* Users instantiate this once and register their intent types with
|
|
18
|
-
* PooledCodec instances (from core/pooled-codec).
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```ts
|
|
22
|
-
* import { IntentRegistry } from './protocol/intent';
|
|
23
|
-
* import { PooledCodec } from './core/pooled-codec';
|
|
24
|
-
* import { BinaryCodec } from './core/binary-codec';
|
|
25
|
-
*
|
|
26
|
-
* const registry = new IntentRegistry();
|
|
27
|
-
*
|
|
28
|
-
* registry.register(1, new PooledCodec({
|
|
29
|
-
* kind: BinaryCodec.u8,
|
|
30
|
-
* tick: BinaryCodec.u32,
|
|
31
|
-
* dx: BinaryCodec.f32,
|
|
32
|
-
* dy: BinaryCodec.f32,
|
|
33
|
-
* }));
|
|
34
|
-
*
|
|
35
|
-
* // Encode/decode
|
|
36
|
-
* const buf = registry.encode(intent);
|
|
37
|
-
* const decoded = registry.decode(buf);
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export class IntentRegistry {
|
|
41
|
-
private codecs = new Map<number, Codec<any>>();
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Register a codec for a specific intent kind.
|
|
45
|
-
* Call this once per intent type at startup.
|
|
46
|
-
*/
|
|
47
|
-
register<T extends Intent>(intent: DefinedIntent<T['kind'], T>): void {
|
|
48
|
-
if (this.codecs.has(intent.kind)) {
|
|
49
|
-
throw new Error(`Intent kind ${intent.kind} is already registered`);
|
|
50
|
-
}
|
|
51
|
-
this.codecs.set(intent.kind, intent.codec);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Encode an intent into binary format.
|
|
56
|
-
*/
|
|
57
|
-
encode<T extends Intent>(intent: T): Uint8Array {
|
|
58
|
-
const codec = this.codecs.get(intent.kind);
|
|
59
|
-
if (!codec) {
|
|
60
|
-
throw new Error(`No codec registered for intent kind ${intent.kind}`);
|
|
61
|
-
}
|
|
62
|
-
return codec.encode(intent);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Decode binary data into an intent.
|
|
67
|
-
* Extracts the kind from the first byte of the buffer.
|
|
68
|
-
*/
|
|
69
|
-
decode(buf: Uint8Array): Intent {
|
|
70
|
-
if (buf.byteLength === 0) {
|
|
71
|
-
throw new Error('Cannot decode empty buffer');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Extract kind from first byte (all intent codecs must encode kind as u8 in first byte)
|
|
75
|
-
const kind = buf[0];
|
|
76
|
-
|
|
77
|
-
const codec = this.codecs.get(kind);
|
|
78
|
-
if (!codec) {
|
|
79
|
-
throw new Error(`No codec registered for intent kind ${kind}`);
|
|
80
|
-
}
|
|
81
|
-
return codec.decode(buf);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Decode binary data into an intent when kind is already known.
|
|
86
|
-
* Useful for testing or when kind is transmitted separately.
|
|
87
|
-
* @deprecated Use decode(buf) instead for standard intent decoding
|
|
88
|
-
*/
|
|
89
|
-
decodeWithKnownKind(kind: number, buf: Uint8Array): Intent {
|
|
90
|
-
const codec = this.codecs.get(kind);
|
|
91
|
-
if (!codec) {
|
|
92
|
-
throw new Error(`No codec registered for intent kind ${kind}`);
|
|
93
|
-
}
|
|
94
|
-
return codec.decode(buf);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
has(kind: number): boolean {
|
|
98
|
-
return this.codecs.has(kind);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
unregister(kind: number): boolean {
|
|
102
|
-
return this.codecs.delete(kind);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
clear(): void {
|
|
106
|
-
this.codecs.clear();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
getKinds(): number[] {
|
|
110
|
-
return Array.from(this.codecs.keys());
|
|
111
|
-
}
|
|
112
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base interface for all game intents.
|
|
3
|
-
*
|
|
4
|
-
* Intents represent player or AI actions that need to be processed by the game simulation.
|
|
5
|
-
* They are timestamped with a tick number for deterministic replay and synchronization.
|
|
6
|
-
*/
|
|
7
|
-
export interface Intent {
|
|
8
|
-
/** The game tick at which this intent should be processed */
|
|
9
|
-
tick: number;
|
|
10
|
-
/** Numeric identifier for the intent type (used for codec lookup) */
|
|
11
|
-
kind: number;
|
|
12
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "bun:test";
|
|
2
|
-
import { defineRPC } from "./define-rpc";
|
|
3
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
4
|
-
import { RpcRegistry } from "./rpc-registry";
|
|
5
|
-
|
|
6
|
-
describe("defineRPC", () => {
|
|
7
|
-
describe("type inference", () => {
|
|
8
|
-
it("should infer correct type from schema", () => {
|
|
9
|
-
const MatchCountdown = defineRPC({
|
|
10
|
-
method: 'matchCountdown',
|
|
11
|
-
schema: {
|
|
12
|
-
secondsRemaining: BinaryCodec.u8,
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
type MatchCountdown = typeof MatchCountdown.type;
|
|
17
|
-
|
|
18
|
-
// Create an instance to verify type inference
|
|
19
|
-
const countdown: MatchCountdown = {
|
|
20
|
-
secondsRemaining: 10,
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
expect(countdown.secondsRemaining).toBe(10);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("should support RPCs with different field types", () => {
|
|
27
|
-
const BuyItem = defineRPC({
|
|
28
|
-
method: 'buyItem',
|
|
29
|
-
schema: {
|
|
30
|
-
itemId: BinaryCodec.string(32),
|
|
31
|
-
quantity: BinaryCodec.u16,
|
|
32
|
-
price: BinaryCodec.f32,
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
type BuyItem = typeof BuyItem.type;
|
|
37
|
-
|
|
38
|
-
const purchase: BuyItem = {
|
|
39
|
-
itemId: 'long_sword',
|
|
40
|
-
quantity: 5,
|
|
41
|
-
price: 100.5,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
expect(purchase.itemId).toBe('long_sword');
|
|
45
|
-
expect(purchase.quantity).toBe(5);
|
|
46
|
-
expect(purchase.price).toBe(100.5);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("should support empty RPCs (no parameters)", () => {
|
|
50
|
-
const Ping = defineRPC({
|
|
51
|
-
method: 'ping',
|
|
52
|
-
schema: {},
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
type Ping = typeof Ping.type;
|
|
56
|
-
|
|
57
|
-
const ping: Ping = {};
|
|
58
|
-
|
|
59
|
-
expect(ping).toEqual({});
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
describe("codec generation", () => {
|
|
64
|
-
it("should generate a codec that can encode/decode", () => {
|
|
65
|
-
const TestRpc = defineRPC({
|
|
66
|
-
method: 'test',
|
|
67
|
-
schema: {
|
|
68
|
-
value: BinaryCodec.u32,
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
type TestRpc = typeof TestRpc.type;
|
|
73
|
-
|
|
74
|
-
const data: TestRpc = { value: 42 };
|
|
75
|
-
const encoded = TestRpc.codec.encode(data);
|
|
76
|
-
|
|
77
|
-
expect(encoded).toBeInstanceOf(Uint8Array);
|
|
78
|
-
|
|
79
|
-
const decoded = TestRpc.codec.decode(encoded);
|
|
80
|
-
expect(decoded.value).toBe(42);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("should encode/decode complex types", () => {
|
|
84
|
-
const PlayerInfo = defineRPC({
|
|
85
|
-
method: 'playerInfo',
|
|
86
|
-
schema: {
|
|
87
|
-
playerId: BinaryCodec.u32,
|
|
88
|
-
name: BinaryCodec.string(64),
|
|
89
|
-
level: BinaryCodec.u8,
|
|
90
|
-
health: BinaryCodec.f32,
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
type PlayerInfo = typeof PlayerInfo.type;
|
|
95
|
-
|
|
96
|
-
const data: PlayerInfo = {
|
|
97
|
-
playerId: 12345,
|
|
98
|
-
name: 'TestPlayer',
|
|
99
|
-
level: 50,
|
|
100
|
-
health: 85.5,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
const encoded = PlayerInfo.codec.encode(data);
|
|
104
|
-
const decoded = PlayerInfo.codec.decode(encoded);
|
|
105
|
-
|
|
106
|
-
expect(decoded.playerId).toBe(12345);
|
|
107
|
-
expect(decoded.name).toBe('TestPlayer');
|
|
108
|
-
expect(decoded.level).toBe(50);
|
|
109
|
-
expect(decoded.health).toBeCloseTo(85.5, 1);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe("integration with RpcRegistry", () => {
|
|
114
|
-
it("should work with RpcRegistry", () => {
|
|
115
|
-
const Notification = defineRPC({
|
|
116
|
-
method: 'notification',
|
|
117
|
-
schema: {
|
|
118
|
-
message: BinaryCodec.string(128),
|
|
119
|
-
priority: BinaryCodec.u8,
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
type Notification = typeof Notification.type;
|
|
124
|
-
|
|
125
|
-
const registry = new RpcRegistry();
|
|
126
|
-
registry.register(Notification);
|
|
127
|
-
|
|
128
|
-
const data: Notification = {
|
|
129
|
-
message: 'Test notification',
|
|
130
|
-
priority: 1,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const encoded = registry.encode(Notification, data);
|
|
134
|
-
const decoded = registry.decode(encoded);
|
|
135
|
-
|
|
136
|
-
expect(decoded.method).toBe('notification');
|
|
137
|
-
expect(decoded.data.message).toBe('Test notification');
|
|
138
|
-
expect(decoded.data.priority).toBe(1);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import type { DefinedRPC, RpcCodec } from "./rpc";
|
|
2
|
-
import type { Schema } from "../../core/binary-codec";
|
|
3
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Configuration for defining an RPC type.
|
|
7
|
-
* @template S The schema type describing the RPC's data fields
|
|
8
|
-
*/
|
|
9
|
-
export interface RpcDefinition<S extends Record<string, any>> {
|
|
10
|
-
/** Method name for this RPC (must be unique) */
|
|
11
|
-
method: string;
|
|
12
|
-
/** Schema describing the RPC's data fields */
|
|
13
|
-
schema: S;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Infers the TypeScript type from an RPC schema.
|
|
18
|
-
* @template S The schema type
|
|
19
|
-
*/
|
|
20
|
-
export type InferRpcType<S extends Record<string, any>> = {
|
|
21
|
-
[P in keyof S]: S[P] extends { read(dv: DataView, o: number): infer R } ? R : never;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Simple codec implementation that uses BinaryCodec for encoding/decoding.
|
|
26
|
-
* @template T The RPC data type
|
|
27
|
-
*/
|
|
28
|
-
class RpcCodecImpl<T extends object> implements RpcCodec<T> {
|
|
29
|
-
constructor(private schema: Schema<T>) {}
|
|
30
|
-
|
|
31
|
-
encode(value: T): Uint8Array {
|
|
32
|
-
return BinaryCodec.encode(this.schema, value);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
decode(buf: Uint8Array): T {
|
|
36
|
-
// Create a target object with nil values
|
|
37
|
-
const target = {} as T;
|
|
38
|
-
for (const key of Object.keys(this.schema) as (keyof T)[]) {
|
|
39
|
-
const field = this.schema[key];
|
|
40
|
-
target[key] = field.toNil() as T[keyof T];
|
|
41
|
-
}
|
|
42
|
-
return BinaryCodec.decode(this.schema, buf, target);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Define a type-safe RPC with automatic schema generation.
|
|
48
|
-
*
|
|
49
|
-
* RPCs are bidirectional one-off events/commands for:
|
|
50
|
-
* - Meta-game events (achievements, notifications)
|
|
51
|
-
* - Match lifecycle (countdown, results)
|
|
52
|
-
* - Request/response patterns
|
|
53
|
-
* - System announcements
|
|
54
|
-
*
|
|
55
|
-
* NOT for game state synchronization (use Snapshots) or player inputs (use Intents)
|
|
56
|
-
*
|
|
57
|
-
* @template S The schema type
|
|
58
|
-
* @param definition RPC configuration with method and schema
|
|
59
|
-
* @returns A DefinedRpc object with method and codec
|
|
60
|
-
*
|
|
61
|
-
* @example Server → Client RPC
|
|
62
|
-
* ```ts
|
|
63
|
-
* const MatchCountdown = defineRPC({
|
|
64
|
-
* method: 'matchCountdown',
|
|
65
|
-
* schema: {
|
|
66
|
-
* secondsRemaining: BinaryCodec.u8,
|
|
67
|
-
* }
|
|
68
|
-
* });
|
|
69
|
-
*
|
|
70
|
-
* // Server sends
|
|
71
|
-
* server.sendRpcBroadcast(MatchCountdown, { secondsRemaining: 10 });
|
|
72
|
-
*
|
|
73
|
-
* // Client receives
|
|
74
|
-
* client.onRpc(MatchCountdown, (rpc) => {
|
|
75
|
-
* console.log(`Match starting in ${rpc.secondsRemaining}s`);
|
|
76
|
-
* });
|
|
77
|
-
* ```
|
|
78
|
-
*
|
|
79
|
-
* @example Client → Server RPC
|
|
80
|
-
* ```ts
|
|
81
|
-
* const BuyItem = defineRPC({
|
|
82
|
-
* method: 'buyItem',
|
|
83
|
-
* schema: {
|
|
84
|
-
* itemId: BinaryCodec.string(32),
|
|
85
|
-
* }
|
|
86
|
-
* });
|
|
87
|
-
*
|
|
88
|
-
* // Client sends
|
|
89
|
-
* client.sendRpc(BuyItem, { itemId: 'long_sword' });
|
|
90
|
-
*
|
|
91
|
-
* // Server receives
|
|
92
|
-
* server.onRpc(BuyItem, (peerId, rpc) => {
|
|
93
|
-
* console.log(`${peerId} wants to buy ${rpc.itemId}`);
|
|
94
|
-
* });
|
|
95
|
-
* ```
|
|
96
|
-
*/
|
|
97
|
-
export function defineRPC<S extends Record<string, any>>(
|
|
98
|
-
definition: RpcDefinition<S>
|
|
99
|
-
): DefinedRPC<InferRpcType<S>> {
|
|
100
|
-
type RpcType = InferRpcType<S>;
|
|
101
|
-
|
|
102
|
-
// Create the schema from definition
|
|
103
|
-
const schema = definition.schema as Schema<RpcType>;
|
|
104
|
-
|
|
105
|
-
// Create the codec using BinaryCodec
|
|
106
|
-
const codec = new RpcCodecImpl<RpcType>(schema);
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
method: definition.method,
|
|
110
|
-
codec,
|
|
111
|
-
type: undefined as any as RpcType, // Phantom type for inference
|
|
112
|
-
};
|
|
113
|
-
}
|