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
package/src/protocol/README.md
DELETED
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
# Protocol Layer
|
|
2
|
-
|
|
3
|
-
Minimalist primitives for networked multiplayer games. Intents, snapshots, and RPCs - you handle the rest.
|
|
4
|
-
|
|
5
|
-
## What You Get
|
|
6
|
-
|
|
7
|
-
1. **IntentRegistry** - Register, encode, decode intents with zero allocations (Client → Server inputs)
|
|
8
|
-
2. **Snapshot<T>** - Type-safe delta updates (Server → Client state sync)
|
|
9
|
-
3. **RpcRegistry** - Remote procedure calls for one-off events (Bidirectional)
|
|
10
|
-
4. **applySnapshot()** - Deep merge snapshot updates into state
|
|
11
|
-
|
|
12
|
-
That's it. No loops, no queues, no storage - just the codec layer.
|
|
13
|
-
|
|
14
|
-
## Quick Start
|
|
15
|
-
|
|
16
|
-
### 1. Define Your Intent Kinds
|
|
17
|
-
|
|
18
|
-
```ts
|
|
19
|
-
// Define all your intent kinds in one place
|
|
20
|
-
enum IntentKind {
|
|
21
|
-
Move = 1,
|
|
22
|
-
Shoot = 2,
|
|
23
|
-
Jump = 3,
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### 2. Define Intents with Type-Safe Schemas
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
import { defineIntent } from "./protocol/intent";
|
|
31
|
-
import { BinaryCodec } from "./core/binary-codec";
|
|
32
|
-
|
|
33
|
-
// kind and tick are added automatically!
|
|
34
|
-
const MoveIntent = defineIntent({
|
|
35
|
-
kind: IntentKind.Move,
|
|
36
|
-
schema: {
|
|
37
|
-
dx: BinaryCodec.f32,
|
|
38
|
-
dy: BinaryCodec.f32,
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const ShootIntent = defineIntent({
|
|
43
|
-
kind: IntentKind.Shoot,
|
|
44
|
-
schema: {
|
|
45
|
-
targetId: BinaryCodec.u32,
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// Extract the types
|
|
50
|
-
type MoveIntent = typeof MoveIntent.type;
|
|
51
|
-
type ShootIntent = typeof ShootIntent.type;
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 3. Register Intent Codecs
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
import { IntentRegistry } from "./protocol/intent";
|
|
58
|
-
|
|
59
|
-
const registry = new IntentRegistry();
|
|
60
|
-
|
|
61
|
-
// Register using auto-generated codecs
|
|
62
|
-
registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
63
|
-
registry.register(ShootIntent.kind, ShootIntent.codec);
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 4. Define Your Game State
|
|
67
|
-
|
|
68
|
-
```ts
|
|
69
|
-
interface GameState {
|
|
70
|
-
players: Record<number, { x: number; y: number; health: number }>;
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### 5. Client: Encode & Send Intents
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
// Generate intent from input
|
|
78
|
-
const intent: MoveIntent = {
|
|
79
|
-
kind: IntentKind.Move,
|
|
80
|
-
tick: currentTick,
|
|
81
|
-
dx: input.x,
|
|
82
|
-
dy: input.y,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
// Encode using auto-generated codec
|
|
86
|
-
const buf = registry.encode(intent);
|
|
87
|
-
|
|
88
|
-
// Send to server
|
|
89
|
-
socket.send(buf);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 6. Server: Receive & Decode Intents
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
socket.on("data", (buf: Uint8Array) => {
|
|
96
|
-
// First byte is always the intent kind
|
|
97
|
-
const kind = buf[0];
|
|
98
|
-
|
|
99
|
-
// Decode using registered codec
|
|
100
|
-
const intent = registry.decode(kind, buf);
|
|
101
|
-
|
|
102
|
-
// Process intent in your game logic
|
|
103
|
-
processIntent(intent);
|
|
104
|
-
});
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 7. Server: Create & Send Snapshots
|
|
108
|
-
|
|
109
|
-
```ts
|
|
110
|
-
import { SnapshotCodec } from "./protocol/snapshot";
|
|
111
|
-
import { PooledCodec } from "./core/pooled-codec";
|
|
112
|
-
|
|
113
|
-
// Create codec for state updates (same schema as your state)
|
|
114
|
-
const stateCodec = new PooledCodec({
|
|
115
|
-
players: // your state schema here
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const snapshotCodec = new SnapshotCodec(stateCodec);
|
|
119
|
-
|
|
120
|
-
// After processing intents, create a snapshot
|
|
121
|
-
const snapshot: Snapshot<GameState> = {
|
|
122
|
-
tick: serverTick,
|
|
123
|
-
updates: {
|
|
124
|
-
// Only include what changed
|
|
125
|
-
players: {
|
|
126
|
-
1: { x: 10, y: 20, health: 90 },
|
|
127
|
-
2: { x: 15, y: 25 }, // health unchanged
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
// Encode and send (zero allocation)
|
|
133
|
-
const buf = snapshotCodec.encode(snapshot);
|
|
134
|
-
socket.send(buf);
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### 8. Client: Decode & Apply Snapshots
|
|
138
|
-
|
|
139
|
-
```ts
|
|
140
|
-
import { applySnapshot } from "./protocol/snapshot";
|
|
141
|
-
|
|
142
|
-
socket.on("snapshot", (buf: Uint8Array) => {
|
|
143
|
-
// Decode snapshot
|
|
144
|
-
const snapshot = snapshotCodec.decode(buf);
|
|
145
|
-
|
|
146
|
-
// Deep merge updates into client state
|
|
147
|
-
applySnapshot(clientState, snapshot);
|
|
148
|
-
|
|
149
|
-
// Render updated state
|
|
150
|
-
render(clientState);
|
|
151
|
-
});
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Type Safety Benefits
|
|
155
|
-
|
|
156
|
-
Using `defineIntent` with enums gives you:
|
|
157
|
-
|
|
158
|
-
✅ **Single Source of Truth** - Type and schema defined together
|
|
159
|
-
✅ **Zero Drift** - TypeScript type automatically matches binary schema
|
|
160
|
-
✅ **Automatic Fields** - `kind` and `tick` added automatically
|
|
161
|
-
✅ **Named Constants** - `IntentKind.Move` instead of magic numbers
|
|
162
|
-
✅ **IDE Support** - Full autocomplete and refactoring
|
|
163
|
-
✅ **Compile-time Safety** - Catch errors before runtime
|
|
164
|
-
|
|
165
|
-
### Before (Manual)
|
|
166
|
-
```ts
|
|
167
|
-
// Define interface
|
|
168
|
-
interface MoveIntent extends Intent {
|
|
169
|
-
kind: 1; // Can drift from registration
|
|
170
|
-
tick: number;
|
|
171
|
-
dx: number;
|
|
172
|
-
dy: number;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Define schema separately (can drift from interface!)
|
|
176
|
-
registry.register(1, new PooledCodec({
|
|
177
|
-
kind: BinaryCodec.u8,
|
|
178
|
-
tick: BinaryCodec.u32,
|
|
179
|
-
dx: BinaryCodec.f32,
|
|
180
|
-
dy: BinaryCodec.f32, // Wait, should this be f64?
|
|
181
|
-
}));
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### After (defineIntent)
|
|
185
|
-
```ts
|
|
186
|
-
// Everything in one place - impossible to drift!
|
|
187
|
-
const MoveIntent = defineIntent({
|
|
188
|
-
kind: IntentKind.Move,
|
|
189
|
-
schema: {
|
|
190
|
-
dx: BinaryCodec.f32,
|
|
191
|
-
dy: BinaryCodec.f32,
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
type MoveIntent = typeof MoveIntent.type;
|
|
196
|
-
registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
## Memory Efficiency
|
|
200
|
-
|
|
201
|
-
The codecs are optimized for zero allocations:
|
|
202
|
-
|
|
203
|
-
```ts
|
|
204
|
-
// Encoding
|
|
205
|
-
const buf = registry.encode(intent);
|
|
206
|
-
socket.send(buf);
|
|
207
|
-
|
|
208
|
-
// Decoding
|
|
209
|
-
const decoded = registry.decode(kind, buf);
|
|
210
|
-
processIntent(decoded);
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**Efficient binary encoding** with minimal allocations.
|
|
214
|
-
|
|
215
|
-
## Snapshot Deep Merging
|
|
216
|
-
|
|
217
|
-
`applySnapshot` intelligently merges nested updates:
|
|
218
|
-
|
|
219
|
-
```ts
|
|
220
|
-
const state: GameState = {
|
|
221
|
-
players: {
|
|
222
|
-
1: { x: 0, y: 0, health: 100 },
|
|
223
|
-
2: { x: 10, y: 10, health: 100 },
|
|
224
|
-
},
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
const snapshot: Snapshot<GameState> = {
|
|
228
|
-
tick: 100,
|
|
229
|
-
updates: {
|
|
230
|
-
players: {
|
|
231
|
-
1: { x: 5 }, // Only update x, keep y and health
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
applySnapshot(state, snapshot);
|
|
237
|
-
|
|
238
|
-
// Result:
|
|
239
|
-
// state.players[1] = { x: 5, y: 0, health: 100 }
|
|
240
|
-
// state.players[2] unchanged
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
- **Objects**: Deep merged
|
|
244
|
-
- **Arrays**: Replaced entirely
|
|
245
|
-
- **Primitives**: Overwritten
|
|
246
|
-
|
|
247
|
-
## Efficient Partial Updates with SnapshotRegistry
|
|
248
|
-
|
|
249
|
-
For games with many state fields, use `SnapshotRegistry` to send only specific update types.
|
|
250
|
-
|
|
251
|
-
**Note:** Unlike intents (which use `defineIntent`), snapshots currently use manual codec definition with `PooledCodec`. A `defineSnapshot` helper may be added in the future for consistency.
|
|
252
|
-
|
|
253
|
-
```ts
|
|
254
|
-
import { SnapshotRegistry } from "./protocol/snapshot";
|
|
255
|
-
import { PooledCodec } from "./core/pooled-codec";
|
|
256
|
-
import { BinaryCodec } from "./core/binary-codec";
|
|
257
|
-
|
|
258
|
-
// Define separate snapshot update types
|
|
259
|
-
interface PlayerUpdate {
|
|
260
|
-
players: Array<{ entityId: number; x: number; y: number }>;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
interface ScoreUpdate {
|
|
264
|
-
score: number;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
interface ProjectileUpdate {
|
|
268
|
-
projectiles: Array<{ id: number; x: number; y: number }>;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
type GameUpdate = PlayerUpdate | ScoreUpdate | ProjectileUpdate;
|
|
272
|
-
|
|
273
|
-
// Create registry for different snapshot types
|
|
274
|
-
const snapshotRegistry = new SnapshotRegistry<GameUpdate>();
|
|
275
|
-
|
|
276
|
-
// Register codecs for each snapshot type
|
|
277
|
-
// (Manual definition - no defineSnapshot helper yet)
|
|
278
|
-
snapshotRegistry.register("players", new PooledCodec({
|
|
279
|
-
players: {
|
|
280
|
-
// Define your array schema here
|
|
281
|
-
// See PooledCodec documentation for array schemas
|
|
282
|
-
}
|
|
283
|
-
}));
|
|
284
|
-
|
|
285
|
-
snapshotRegistry.register("score", new PooledCodec({
|
|
286
|
-
score: BinaryCodec.u32
|
|
287
|
-
}));
|
|
288
|
-
|
|
289
|
-
snapshotRegistry.register("projectiles", new PooledCodec({
|
|
290
|
-
projectiles: {
|
|
291
|
-
// Define your array schema here
|
|
292
|
-
}
|
|
293
|
-
}));
|
|
294
|
-
|
|
295
|
-
// Server: Send only what changed (efficient!)
|
|
296
|
-
if (playersChanged) {
|
|
297
|
-
const buf = snapshotRegistry.encode("players", {
|
|
298
|
-
tick: 100,
|
|
299
|
-
updates: { players: [{ entityId: 1, x: 5, y: 10 }] }
|
|
300
|
-
});
|
|
301
|
-
socket.send(buf);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (scoreChanged) {
|
|
305
|
-
const buf = snapshotRegistry.encode("score", {
|
|
306
|
-
tick: 100,
|
|
307
|
-
updates: { score: 50 }
|
|
308
|
-
});
|
|
309
|
-
socket.send(buf);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Client: Decode and apply
|
|
313
|
-
socket.on("snapshot", (buf: Uint8Array) => {
|
|
314
|
-
const { type, snapshot } = snapshotRegistry.decode(buf);
|
|
315
|
-
applySnapshot(clientState, snapshot);
|
|
316
|
-
});
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
**Benefits:**
|
|
320
|
-
- ✅ Only encode fields that changed (true partial updates)
|
|
321
|
-
- ✅ No bandwidth wasted on nil/empty values
|
|
322
|
-
- ✅ Type ID embedded in message (1 byte overhead)
|
|
323
|
-
- ✅ Works with arrays, Records, primitives
|
|
324
|
-
|
|
325
|
-
## Multiple Intents
|
|
326
|
-
|
|
327
|
-
You can have as many intent types as needed:
|
|
328
|
-
|
|
329
|
-
```ts
|
|
330
|
-
// Define all your intent kinds in one enum
|
|
331
|
-
enum IntentKind {
|
|
332
|
-
Move = 1,
|
|
333
|
-
Shoot = 2,
|
|
334
|
-
Jump = 3,
|
|
335
|
-
UseItem = 4,
|
|
336
|
-
Chat = 5,
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Define each intent with its schema
|
|
340
|
-
const MoveIntent = defineIntent({
|
|
341
|
-
kind: IntentKind.Move,
|
|
342
|
-
schema: { dx: BinaryCodec.f32, dy: BinaryCodec.f32 }
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
const ShootIntent = defineIntent({
|
|
346
|
-
kind: IntentKind.Shoot,
|
|
347
|
-
schema: { targetId: BinaryCodec.u32 }
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
const JumpIntent = defineIntent({
|
|
351
|
-
kind: IntentKind.Jump,
|
|
352
|
-
schema: { height: BinaryCodec.f32 }
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
// Register all at once
|
|
356
|
-
registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
357
|
-
registry.register(ShootIntent.kind, ShootIntent.codec);
|
|
358
|
-
registry.register(JumpIntent.kind, JumpIntent.codec);
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
## RPCs (Remote Procedure Calls)
|
|
362
|
-
|
|
363
|
-
For one-off events that don't fit intents (inputs) or snapshots (state sync), use RPCs.
|
|
364
|
-
|
|
365
|
-
### When to Use RPCs
|
|
366
|
-
|
|
367
|
-
**✅ Use RPCs for:**
|
|
368
|
-
- Meta-game events (achievements, notifications)
|
|
369
|
-
- Match lifecycle (countdown, match end, pause)
|
|
370
|
-
- Chat messages (transient communication)
|
|
371
|
-
- UI feedback (purchase confirmations, errors)
|
|
372
|
-
- System announcements
|
|
373
|
-
|
|
374
|
-
**❌ Don't use RPCs for:**
|
|
375
|
-
- Game state (use **Snapshots** instead)
|
|
376
|
-
- Player inputs (use **Intents** instead)
|
|
377
|
-
- Anything that needs persistence or late joiners need to know
|
|
378
|
-
|
|
379
|
-
### Define RPCs
|
|
380
|
-
|
|
381
|
-
```ts
|
|
382
|
-
import { defineRPC, RpcRegistry } from "./protocol/rpc";
|
|
383
|
-
import { BinaryCodec } from "./core/binary-codec";
|
|
384
|
-
|
|
385
|
-
// Server → Client RPC
|
|
386
|
-
const MatchCountdown = defineRPC({
|
|
387
|
-
method: 'matchCountdown',
|
|
388
|
-
schema: {
|
|
389
|
-
secondsRemaining: BinaryCodec.u8,
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
// Client → Server RPC
|
|
394
|
-
const BuyItem = defineRPC({
|
|
395
|
-
method: 'buyItem',
|
|
396
|
-
schema: {
|
|
397
|
-
itemId: BinaryCodec.string(32),
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
type MatchCountdown = typeof MatchCountdown.type;
|
|
402
|
-
type BuyItem = typeof BuyItem.type;
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
### Register RPCs
|
|
406
|
-
|
|
407
|
-
```ts
|
|
408
|
-
const rpcRegistry = new RpcRegistry();
|
|
409
|
-
rpcRegistry.register(MatchCountdown);
|
|
410
|
-
rpcRegistry.register(BuyItem);
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### Client: Send & Receive RPCs
|
|
414
|
-
|
|
415
|
-
```ts
|
|
416
|
-
// Send RPC to server
|
|
417
|
-
client.sendRpc(BuyItem, { itemId: 'long_sword' });
|
|
418
|
-
|
|
419
|
-
// Receive RPC from server
|
|
420
|
-
client.onRpc(MatchCountdown, (rpc) => {
|
|
421
|
-
console.log(`Match starting in ${rpc.secondsRemaining}s`);
|
|
422
|
-
showCountdownUI(rpc.secondsRemaining);
|
|
423
|
-
});
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### Server: Send & Receive RPCs
|
|
427
|
-
|
|
428
|
-
```ts
|
|
429
|
-
// Receive RPC from client
|
|
430
|
-
server.onRpc(BuyItem, (peerId, rpc) => {
|
|
431
|
-
const player = getPlayer(peerId);
|
|
432
|
-
if (player.gold >= getItemCost(rpc.itemId)) {
|
|
433
|
-
player.items.push(rpc.itemId);
|
|
434
|
-
player.gold -= getItemCost(rpc.itemId);
|
|
435
|
-
}
|
|
436
|
-
});
|
|
437
|
-
|
|
438
|
-
// Send RPC to specific client
|
|
439
|
-
server.sendRpc(peerId, MatchCountdown, { secondsRemaining: 10 });
|
|
440
|
-
|
|
441
|
-
// Broadcast RPC to all clients
|
|
442
|
-
server.sendRpcBroadcast(MatchCountdown, { secondsRemaining: 3 });
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
**Note:** RPCs use `MessageType.CUSTOM (0xff)` and are fully integrated with rate limiting, backpressure handling, and buffer pooling.
|
|
446
|
-
|
|
447
|
-
## What You Build Yourself
|
|
448
|
-
|
|
449
|
-
This layer intentionally **does not** provide:
|
|
450
|
-
|
|
451
|
-
- ❌ Game loops (use `FixedTicker` from core)
|
|
452
|
-
- ❌ Intent queuing/buffering (application-specific)
|
|
453
|
-
- ❌ Snapshot storage/history (application-specific)
|
|
454
|
-
- ❌ Network transport (WebSocket, WebRTC, etc.)
|
|
455
|
-
- ❌ Prediction/rollback (use `IntentTracker` and `Reconciliator` from core)
|
|
456
|
-
- ❌ Interpolation (application-specific)
|
|
457
|
-
- ❌ Lag compensation (application-specific)
|
|
458
|
-
|
|
459
|
-
The protocol layer gives you type-safe codecs. Core utilities like `FixedTicker`, `IntentTracker`, and `Reconciliator` are available separately.
|
|
460
|
-
|
|
461
|
-
## Testing
|
|
462
|
-
|
|
463
|
-
```bash
|
|
464
|
-
npm test -- intent-registry
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
## License
|
|
468
|
-
|
|
469
|
-
MIT
|
package/src/protocol/index.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Protocol Layer - Type-safe networking primitives
|
|
3
|
-
*
|
|
4
|
-
* This layer enforces:
|
|
5
|
-
* - Type-safe intent definitions (use defineIntent helper)
|
|
6
|
-
* - Type-safe snapshot definitions (Snapshot<YourState>)
|
|
7
|
-
* - Memory-efficient encoding (use BinaryCodec from core)
|
|
8
|
-
*
|
|
9
|
-
* You provide:
|
|
10
|
-
* - Your intent types (via defineIntent)
|
|
11
|
-
* - Your state types
|
|
12
|
-
* - Your schemas (for binary encoding)
|
|
13
|
-
*
|
|
14
|
-
* @example Using defineIntent with enums (recommended)
|
|
15
|
-
* ```ts
|
|
16
|
-
* import { defineIntent, IntentRegistry } from './protocol';
|
|
17
|
-
* import { BinaryCodec } from './core/binary-codec';
|
|
18
|
-
*
|
|
19
|
-
* // Define all your intent kinds in one place
|
|
20
|
-
* enum IntentKind {
|
|
21
|
-
* Move = 1,
|
|
22
|
-
* Attack = 2,
|
|
23
|
-
* Jump = 3,
|
|
24
|
-
* }
|
|
25
|
-
*
|
|
26
|
-
* // Define intents with automatic type inference
|
|
27
|
-
* // kind and tick are added automatically!
|
|
28
|
-
* const MoveIntent = defineIntent({
|
|
29
|
-
* kind: IntentKind.Move,
|
|
30
|
-
* schema: {
|
|
31
|
-
* dx: BinaryCodec.f32,
|
|
32
|
-
* dy: BinaryCodec.f32,
|
|
33
|
-
* }
|
|
34
|
-
* });
|
|
35
|
-
*
|
|
36
|
-
* const AttackIntent = defineIntent({
|
|
37
|
-
* kind: IntentKind.Attack,
|
|
38
|
-
* schema: {
|
|
39
|
-
* targetId: BinaryCodec.u32,
|
|
40
|
-
* damage: BinaryCodec.f32,
|
|
41
|
-
* }
|
|
42
|
-
* });
|
|
43
|
-
*
|
|
44
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
45
|
-
* type AttackIntent = typeof AttackIntent.type;
|
|
46
|
-
*
|
|
47
|
-
* // Register and use
|
|
48
|
-
* const intentRegistry = new IntentRegistry();
|
|
49
|
-
* intentRegistry.register(MoveIntent.kind, MoveIntent.codec);
|
|
50
|
-
* intentRegistry.register(AttackIntent.kind, AttackIntent.codec);
|
|
51
|
-
*
|
|
52
|
-
* const move: MoveIntent = {
|
|
53
|
-
* kind: IntentKind.Move,
|
|
54
|
-
* tick: 100, // tick is automatically available
|
|
55
|
-
* dx: 1.5,
|
|
56
|
-
* dy: -2.0,
|
|
57
|
-
* };
|
|
58
|
-
*
|
|
59
|
-
* const buf = intentRegistry.encode(move);
|
|
60
|
-
* const decoded = intentRegistry.decode(IntentKind.Move, buf);
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
* @example Manual definition (legacy)
|
|
64
|
-
* ```ts
|
|
65
|
-
* // Define your types
|
|
66
|
-
* interface MoveIntent extends Intent {
|
|
67
|
-
* kind: 1;
|
|
68
|
-
* tick: number;
|
|
69
|
-
* dx: number;
|
|
70
|
-
* dy: number;
|
|
71
|
-
* }
|
|
72
|
-
*
|
|
73
|
-
* interface GameState {
|
|
74
|
-
* players: Record<number, { x: number; y: number }>;
|
|
75
|
-
* }
|
|
76
|
-
*
|
|
77
|
-
* // Create codecs once (reuse these!)
|
|
78
|
-
* const intentRegistry = new IntentRegistry();
|
|
79
|
-
* intentRegistry.register(1, new PooledCodec(moveSchema));
|
|
80
|
-
*
|
|
81
|
-
* const snapshotCodec = new SnapshotCodec<GameState>(
|
|
82
|
-
* new PooledCodec(stateSchema)
|
|
83
|
-
* );
|
|
84
|
-
*
|
|
85
|
-
* // Use them
|
|
86
|
-
* const buf = intentRegistry.encode(intent);
|
|
87
|
-
* const snapshot = snapshotCodec.decode(buf);
|
|
88
|
-
* ```
|
|
89
|
-
*/
|
|
90
|
-
|
|
91
|
-
export * from "./intent";
|
|
92
|
-
export * from "./snapshot";
|
|
93
|
-
export * from "./rpc";
|