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/dist/net/types.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core networking types for transport-agnostic multiplayer game networking
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Message type identifiers for protocol discrimination
|
|
6
|
-
*/
|
|
7
|
-
export var MessageType;
|
|
8
|
-
(function (MessageType) {
|
|
9
|
-
/** Client -> Server: Intent/command */
|
|
10
|
-
MessageType[MessageType["INTENT"] = 1] = "INTENT";
|
|
11
|
-
/** Server -> Client: State snapshot */
|
|
12
|
-
MessageType[MessageType["SNAPSHOT"] = 2] = "SNAPSHOT";
|
|
13
|
-
/** Bidirectional: Heartbeat/ping */
|
|
14
|
-
MessageType[MessageType["HEARTBEAT"] = 3] = "HEARTBEAT";
|
|
15
|
-
/** Bidirectional: Custom application message */
|
|
16
|
-
MessageType[MessageType["CUSTOM"] = 255] = "CUSTOM";
|
|
17
|
-
})(MessageType || (MessageType = {}));
|
|
18
|
-
/**
|
|
19
|
-
* Message priority levels for send queue
|
|
20
|
-
*/
|
|
21
|
-
export var MessagePriority;
|
|
22
|
-
(function (MessagePriority) {
|
|
23
|
-
/** Lowest priority - can be dropped if queue is full (e.g., chat) */
|
|
24
|
-
MessagePriority[MessagePriority["LOW"] = 0] = "LOW";
|
|
25
|
-
/** Normal priority - most game messages (e.g., movement) */
|
|
26
|
-
MessagePriority[MessagePriority["NORMAL"] = 1] = "NORMAL";
|
|
27
|
-
/** High priority - important events (e.g., damage, scoring) */
|
|
28
|
-
MessagePriority[MessagePriority["HIGH"] = 2] = "HIGH";
|
|
29
|
-
/** Critical priority - never drop (e.g., connection control) */
|
|
30
|
-
MessagePriority[MessagePriority["CRITICAL"] = 3] = "CRITICAL";
|
|
31
|
-
})(MessagePriority || (MessagePriority = {}));
|
package/dist/net/validators.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Common intent validation helpers
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Validate that intent tick is not in the past (with tolerance for network lag)
|
|
6
|
-
*
|
|
7
|
-
* NOTE: Pass the current tick value at the time you create the validator.
|
|
8
|
-
* If your tick advances, you'll need to recreate the validator or use a function
|
|
9
|
-
* that captures the current tick dynamically.
|
|
10
|
-
*
|
|
11
|
-
* @param currentTick Current server tick
|
|
12
|
-
* @param tolerance Number of ticks to allow in the past (default: 10)
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* // Option 1: Recreate validator each tick (simple but allocates)
|
|
17
|
-
* function onTick(currentTick: number) {
|
|
18
|
-
* const validator = validateTickNotTooOld(currentTick);
|
|
19
|
-
* // use validator...
|
|
20
|
-
* }
|
|
21
|
-
*
|
|
22
|
-
* // Option 2: Manual validation (zero allocation)
|
|
23
|
-
* if (intent.tick >= currentTick - 10) {
|
|
24
|
-
* // intent is valid
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
export function validateTickNotTooOld(currentTick, tolerance = 10) {
|
|
29
|
-
return (_peerId, intent) => {
|
|
30
|
-
return intent.tick >= currentTick - tolerance;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Validate that intent tick is not too far in the future
|
|
35
|
-
* @param currentTick Current server tick
|
|
36
|
-
* @param tolerance Number of ticks to allow in the future (default: 5)
|
|
37
|
-
*/
|
|
38
|
-
export function validateTickNotTooFuture(currentTick, tolerance = 5) {
|
|
39
|
-
return (_peerId, intent) => {
|
|
40
|
-
return intent.tick <= currentTick + tolerance;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Validate intent tick is within acceptable range
|
|
45
|
-
* @param currentTick Current server tick
|
|
46
|
-
* @param pastTolerance Ticks allowed in past (default: 10)
|
|
47
|
-
* @param futureTolerance Ticks allowed in future (default: 5)
|
|
48
|
-
*/
|
|
49
|
-
export function validateTickRange(currentTick, pastTolerance = 10, futureTolerance = 5) {
|
|
50
|
-
return (_peerId, intent) => {
|
|
51
|
-
return (intent.tick >= currentTick - pastTolerance &&
|
|
52
|
-
intent.tick <= currentTick + futureTolerance);
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Combine multiple validators with AND logic
|
|
57
|
-
*/
|
|
58
|
-
export function combineValidators(...validators) {
|
|
59
|
-
return (peerId, intent) => {
|
|
60
|
-
for (const validator of validators) {
|
|
61
|
-
if (!validator(peerId, intent)) {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return true;
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Validate that a numeric field is within a range
|
|
70
|
-
*/
|
|
71
|
-
export function validateRange(field, min, max) {
|
|
72
|
-
return (_peerId, intent) => {
|
|
73
|
-
const value = intent[field];
|
|
74
|
-
if (typeof value !== "number") {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
return value >= min && value <= max;
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Validate that a field exists and is of expected type
|
|
82
|
-
*/
|
|
83
|
-
export function validateFieldType(field, expectedType) {
|
|
84
|
-
return (_peerId, intent) => {
|
|
85
|
-
const value = intent[field];
|
|
86
|
-
return typeof value === expectedType;
|
|
87
|
-
};
|
|
88
|
-
}
|
package/dist/protocol/index.js
DELETED
|
@@ -1,92 +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
|
-
export * from "./intent";
|
|
91
|
-
export * from "./snapshot";
|
|
92
|
-
export * from "./rpc";
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
2
|
-
/**
|
|
3
|
-
* Simple codec implementation that uses BinaryCodec for encoding/decoding.
|
|
4
|
-
* @template T The intent type
|
|
5
|
-
*/
|
|
6
|
-
class IntentCodec {
|
|
7
|
-
constructor(schema) {
|
|
8
|
-
this.schema = schema;
|
|
9
|
-
}
|
|
10
|
-
encode(value) {
|
|
11
|
-
return BinaryCodec.encode(this.schema, value);
|
|
12
|
-
}
|
|
13
|
-
decode(buf) {
|
|
14
|
-
// Create a target object with nil values
|
|
15
|
-
const target = {};
|
|
16
|
-
for (const key of Object.keys(this.schema)) {
|
|
17
|
-
const field = this.schema[key];
|
|
18
|
-
target[key] = field.toNil();
|
|
19
|
-
}
|
|
20
|
-
return BinaryCodec.decode(this.schema, buf, target);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Define a type-safe intent with automatic schema generation.
|
|
25
|
-
*
|
|
26
|
-
* This helper ensures that your intent's TypeScript interface and binary schema
|
|
27
|
-
* stay in sync by deriving the type from the schema definition.
|
|
28
|
-
*
|
|
29
|
-
* The `kind` and `tick` fields are automatically added to the schema:
|
|
30
|
-
* - `kind`: u8 codec (always FIRST byte - required for IntentRegistry.decode)
|
|
31
|
-
* - `tick`: u32 codec (default, can be overridden by including it in your schema)
|
|
32
|
-
*
|
|
33
|
-
* IMPORTANT: If you use PooledCodec directly instead of defineIntent(), you MUST
|
|
34
|
-
* ensure `kind: BinaryPrimitives.u8` is the FIRST field in your schema, or
|
|
35
|
-
* IntentRegistry.decode() will fail.
|
|
36
|
-
*
|
|
37
|
-
* @template K The intent kind (numeric literal)
|
|
38
|
-
* @template S The schema type
|
|
39
|
-
* @param definition Intent configuration with kind and schema
|
|
40
|
-
* @returns A DefinedIntent object with type, codec, and kind
|
|
41
|
-
*
|
|
42
|
-
* @example Using enums (recommended for managing multiple intents)
|
|
43
|
-
* ```ts
|
|
44
|
-
* // Define all your intent kinds in one place
|
|
45
|
-
* enum IntentKind {
|
|
46
|
-
* Move = 1,
|
|
47
|
-
* Attack = 2,
|
|
48
|
-
* Jump = 3,
|
|
49
|
-
* Chat = 4,
|
|
50
|
-
* }
|
|
51
|
-
*
|
|
52
|
-
* const MoveIntent = defineIntent({
|
|
53
|
-
* kind: IntentKind.Move,
|
|
54
|
-
* schema: {
|
|
55
|
-
* dx: BinaryCodec.f32,
|
|
56
|
-
* dy: BinaryCodec.f32,
|
|
57
|
-
* }
|
|
58
|
-
* });
|
|
59
|
-
*
|
|
60
|
-
* const AttackIntent = defineIntent({
|
|
61
|
-
* kind: IntentKind.Attack,
|
|
62
|
-
* schema: {
|
|
63
|
-
* targetId: BinaryCodec.u32,
|
|
64
|
-
* damage: BinaryCodec.f32,
|
|
65
|
-
* }
|
|
66
|
-
* });
|
|
67
|
-
*
|
|
68
|
-
* // Use the inferred types
|
|
69
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
70
|
-
* type AttackIntent = typeof AttackIntent.type;
|
|
71
|
-
*
|
|
72
|
-
* // Register with IntentRegistry
|
|
73
|
-
* const registry = new IntentRegistry();
|
|
74
|
-
* registry.register(MoveIntent.kind, MoveIntent.codec);
|
|
75
|
-
* registry.register(AttackIntent.kind, AttackIntent.codec);
|
|
76
|
-
*
|
|
77
|
-
* // Create instances - tick is automatically available
|
|
78
|
-
* const move: MoveIntent = {
|
|
79
|
-
* kind: IntentKind.Move,
|
|
80
|
-
* tick: 100,
|
|
81
|
-
* dx: 1.5,
|
|
82
|
-
* dy: -2.0,
|
|
83
|
-
* };
|
|
84
|
-
* ```
|
|
85
|
-
*
|
|
86
|
-
* @example Using literal types (simple cases)
|
|
87
|
-
* ```ts
|
|
88
|
-
* const MoveIntent = defineIntent({
|
|
89
|
-
* kind: 1 as const,
|
|
90
|
-
* schema: {
|
|
91
|
-
* dx: BinaryCodec.f32,
|
|
92
|
-
* dy: BinaryCodec.f32,
|
|
93
|
-
* }
|
|
94
|
-
* });
|
|
95
|
-
*
|
|
96
|
-
* type MoveIntent = typeof MoveIntent.type;
|
|
97
|
-
* ```
|
|
98
|
-
*
|
|
99
|
-
* @example Custom tick encoding
|
|
100
|
-
* ```ts
|
|
101
|
-
* const SmallIntent = defineIntent({
|
|
102
|
-
* kind: IntentKind.Small,
|
|
103
|
-
* schema: {
|
|
104
|
-
* tick: BinaryCodec.u16, // Override default u32 with u16
|
|
105
|
-
* action: BinaryCodec.u8,
|
|
106
|
-
* }
|
|
107
|
-
* });
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
export function defineIntent(definition) {
|
|
111
|
-
// Create the full schema with kind and tick fields
|
|
112
|
-
// Add tick with default u32 if not provided by user
|
|
113
|
-
const fullSchema = {
|
|
114
|
-
kind: BinaryCodec.u8,
|
|
115
|
-
tick: BinaryCodec.u32, // Default tick encoding
|
|
116
|
-
...definition.schema, // User can override tick if needed
|
|
117
|
-
};
|
|
118
|
-
// Create the codec using BinaryCodec directly
|
|
119
|
-
const codec = new IntentCodec(fullSchema);
|
|
120
|
-
return {
|
|
121
|
-
type: undefined, // Phantom type for inference
|
|
122
|
-
codec,
|
|
123
|
-
kind: definition.kind,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
@@ -1,91 +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
|
-
export { IntentRegistry } from "./intent-registry";
|
|
91
|
-
export { defineIntent } from "./define-intent";
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry for mapping intent kinds to their codecs.
|
|
3
|
-
*
|
|
4
|
-
* Users instantiate this once and register their intent types with
|
|
5
|
-
* PooledCodec instances (from core/pooled-codec).
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```ts
|
|
9
|
-
* import { IntentRegistry } from './protocol/intent';
|
|
10
|
-
* import { PooledCodec } from './core/pooled-codec';
|
|
11
|
-
* import { BinaryCodec } from './core/binary-codec';
|
|
12
|
-
*
|
|
13
|
-
* const registry = new IntentRegistry();
|
|
14
|
-
*
|
|
15
|
-
* registry.register(1, new PooledCodec({
|
|
16
|
-
* kind: BinaryCodec.u8,
|
|
17
|
-
* tick: BinaryCodec.u32,
|
|
18
|
-
* dx: BinaryCodec.f32,
|
|
19
|
-
* dy: BinaryCodec.f32,
|
|
20
|
-
* }));
|
|
21
|
-
*
|
|
22
|
-
* // Encode/decode
|
|
23
|
-
* const buf = registry.encode(intent);
|
|
24
|
-
* const decoded = registry.decode(buf);
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export class IntentRegistry {
|
|
28
|
-
constructor() {
|
|
29
|
-
this.codecs = new Map();
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Register a codec for a specific intent kind.
|
|
33
|
-
* Call this once per intent type at startup.
|
|
34
|
-
*/
|
|
35
|
-
register(intent) {
|
|
36
|
-
if (this.codecs.has(intent.kind)) {
|
|
37
|
-
throw new Error(`Intent kind ${intent.kind} is already registered`);
|
|
38
|
-
}
|
|
39
|
-
this.codecs.set(intent.kind, intent.codec);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Encode an intent into binary format.
|
|
43
|
-
*/
|
|
44
|
-
encode(intent) {
|
|
45
|
-
const codec = this.codecs.get(intent.kind);
|
|
46
|
-
if (!codec) {
|
|
47
|
-
throw new Error(`No codec registered for intent kind ${intent.kind}`);
|
|
48
|
-
}
|
|
49
|
-
return codec.encode(intent);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Decode binary data into an intent.
|
|
53
|
-
* Extracts the kind from the first byte of the buffer.
|
|
54
|
-
*/
|
|
55
|
-
decode(buf) {
|
|
56
|
-
if (buf.byteLength === 0) {
|
|
57
|
-
throw new Error('Cannot decode empty buffer');
|
|
58
|
-
}
|
|
59
|
-
// Extract kind from first byte (all intent codecs must encode kind as u8 in first byte)
|
|
60
|
-
const kind = buf[0];
|
|
61
|
-
const codec = this.codecs.get(kind);
|
|
62
|
-
if (!codec) {
|
|
63
|
-
throw new Error(`No codec registered for intent kind ${kind}`);
|
|
64
|
-
}
|
|
65
|
-
return codec.decode(buf);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Decode binary data into an intent when kind is already known.
|
|
69
|
-
* Useful for testing or when kind is transmitted separately.
|
|
70
|
-
* @deprecated Use decode(buf) instead for standard intent decoding
|
|
71
|
-
*/
|
|
72
|
-
decodeWithKnownKind(kind, buf) {
|
|
73
|
-
const codec = this.codecs.get(kind);
|
|
74
|
-
if (!codec) {
|
|
75
|
-
throw new Error(`No codec registered for intent kind ${kind}`);
|
|
76
|
-
}
|
|
77
|
-
return codec.decode(buf);
|
|
78
|
-
}
|
|
79
|
-
has(kind) {
|
|
80
|
-
return this.codecs.has(kind);
|
|
81
|
-
}
|
|
82
|
-
unregister(kind) {
|
|
83
|
-
return this.codecs.delete(kind);
|
|
84
|
-
}
|
|
85
|
-
clear() {
|
|
86
|
-
this.codecs.clear();
|
|
87
|
-
}
|
|
88
|
-
getKinds() {
|
|
89
|
-
return Array.from(this.codecs.keys());
|
|
90
|
-
}
|
|
91
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { BinaryCodec } from "../../core/binary-codec";
|
|
2
|
-
/**
|
|
3
|
-
* Simple codec implementation that uses BinaryCodec for encoding/decoding.
|
|
4
|
-
* @template T The RPC data type
|
|
5
|
-
*/
|
|
6
|
-
class RpcCodecImpl {
|
|
7
|
-
constructor(schema) {
|
|
8
|
-
this.schema = schema;
|
|
9
|
-
}
|
|
10
|
-
encode(value) {
|
|
11
|
-
return BinaryCodec.encode(this.schema, value);
|
|
12
|
-
}
|
|
13
|
-
decode(buf) {
|
|
14
|
-
// Create a target object with nil values
|
|
15
|
-
const target = {};
|
|
16
|
-
for (const key of Object.keys(this.schema)) {
|
|
17
|
-
const field = this.schema[key];
|
|
18
|
-
target[key] = field.toNil();
|
|
19
|
-
}
|
|
20
|
-
return BinaryCodec.decode(this.schema, buf, target);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Define a type-safe RPC with automatic schema generation.
|
|
25
|
-
*
|
|
26
|
-
* RPCs are bidirectional one-off events/commands for:
|
|
27
|
-
* - Meta-game events (achievements, notifications)
|
|
28
|
-
* - Match lifecycle (countdown, results)
|
|
29
|
-
* - Request/response patterns
|
|
30
|
-
* - System announcements
|
|
31
|
-
*
|
|
32
|
-
* NOT for game state synchronization (use Snapshots) or player inputs (use Intents)
|
|
33
|
-
*
|
|
34
|
-
* @template S The schema type
|
|
35
|
-
* @param definition RPC configuration with method and schema
|
|
36
|
-
* @returns A DefinedRpc object with method and codec
|
|
37
|
-
*
|
|
38
|
-
* @example Server → Client RPC
|
|
39
|
-
* ```ts
|
|
40
|
-
* const MatchCountdown = defineRPC({
|
|
41
|
-
* method: 'matchCountdown',
|
|
42
|
-
* schema: {
|
|
43
|
-
* secondsRemaining: BinaryCodec.u8,
|
|
44
|
-
* }
|
|
45
|
-
* });
|
|
46
|
-
*
|
|
47
|
-
* // Server sends
|
|
48
|
-
* server.sendRpcBroadcast(MatchCountdown, { secondsRemaining: 10 });
|
|
49
|
-
*
|
|
50
|
-
* // Client receives
|
|
51
|
-
* client.onRpc(MatchCountdown, (rpc) => {
|
|
52
|
-
* console.log(`Match starting in ${rpc.secondsRemaining}s`);
|
|
53
|
-
* });
|
|
54
|
-
* ```
|
|
55
|
-
*
|
|
56
|
-
* @example Client → Server RPC
|
|
57
|
-
* ```ts
|
|
58
|
-
* const BuyItem = defineRPC({
|
|
59
|
-
* method: 'buyItem',
|
|
60
|
-
* schema: {
|
|
61
|
-
* itemId: BinaryCodec.string(32),
|
|
62
|
-
* }
|
|
63
|
-
* });
|
|
64
|
-
*
|
|
65
|
-
* // Client sends
|
|
66
|
-
* client.sendRpc(BuyItem, { itemId: 'long_sword' });
|
|
67
|
-
*
|
|
68
|
-
* // Server receives
|
|
69
|
-
* server.onRpc(BuyItem, (peerId, rpc) => {
|
|
70
|
-
* console.log(`${peerId} wants to buy ${rpc.itemId}`);
|
|
71
|
-
* });
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
export function defineRPC(definition) {
|
|
75
|
-
// Create the schema from definition
|
|
76
|
-
const schema = definition.schema;
|
|
77
|
-
// Create the codec using BinaryCodec
|
|
78
|
-
const codec = new RpcCodecImpl(schema);
|
|
79
|
-
return {
|
|
80
|
-
method: definition.method,
|
|
81
|
-
codec,
|
|
82
|
-
type: undefined, // Phantom type for inference
|
|
83
|
-
};
|
|
84
|
-
}
|