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,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry for managing RPC definitions with binary encoding/decoding
|
|
3
|
-
*
|
|
4
|
-
* Maps RPC method names to numeric IDs for efficient binary protocol:
|
|
5
|
-
* - Method names are assigned sequential IDs (0, 1, 2, ...)
|
|
6
|
-
* - Binary format: [methodId: u16][data: variable]
|
|
7
|
-
* - Supports bidirectional RPCs (client ↔ server)
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```ts
|
|
11
|
-
* const registry = new RpcRegistry();
|
|
12
|
-
*
|
|
13
|
-
* // Register RPCs
|
|
14
|
-
* registry.register(MatchCountdown);
|
|
15
|
-
* registry.register(BuyItem);
|
|
16
|
-
*
|
|
17
|
-
* // Encode RPC to binary
|
|
18
|
-
* const binary = registry.encode(MatchCountdown, { secondsRemaining: 10 });
|
|
19
|
-
*
|
|
20
|
-
* // Decode RPC from binary
|
|
21
|
-
* const { method, data } = registry.decode(binary);
|
|
22
|
-
* console.log(method); // 'matchCountdown'
|
|
23
|
-
* console.log(data.secondsRemaining); // 10
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export class RpcRegistry {
|
|
27
|
-
constructor() {
|
|
28
|
-
this.codecs = new Map();
|
|
29
|
-
this.methodToId = new Map();
|
|
30
|
-
this.idToMethod = new Map();
|
|
31
|
-
this.nextId = 0;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Register an RPC definition
|
|
35
|
-
*
|
|
36
|
-
* @param rpc The RPC definition created by defineRPC()
|
|
37
|
-
* @throws Error if method is already registered
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* const MatchCountdown = defineRPC({
|
|
42
|
-
* method: 'matchCountdown',
|
|
43
|
-
* schema: { secondsRemaining: BinaryCodec.u8 }
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* registry.register(MatchCountdown);
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
register(rpc) {
|
|
50
|
-
if (this.codecs.has(rpc.method)) {
|
|
51
|
-
throw new Error(`RPC "${rpc.method}" is already registered`);
|
|
52
|
-
}
|
|
53
|
-
const id = this.nextId++;
|
|
54
|
-
this.codecs.set(rpc.method, rpc.codec);
|
|
55
|
-
this.methodToId.set(rpc.method, id);
|
|
56
|
-
this.idToMethod.set(id, rpc.method);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Encode an RPC to binary format
|
|
60
|
-
*
|
|
61
|
-
* Binary format: [methodId: u16][data: variable]
|
|
62
|
-
*
|
|
63
|
-
* @param rpc The RPC definition
|
|
64
|
-
* @param data The RPC data to encode
|
|
65
|
-
* @returns Encoded binary data
|
|
66
|
-
* @throws Error if RPC is not registered
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```ts
|
|
70
|
-
* const binary = registry.encode(MatchCountdown, {
|
|
71
|
-
* secondsRemaining: 10
|
|
72
|
-
* });
|
|
73
|
-
* ```
|
|
74
|
-
*/
|
|
75
|
-
encode(rpc, data) {
|
|
76
|
-
const codec = this.codecs.get(rpc.method);
|
|
77
|
-
if (!codec) {
|
|
78
|
-
throw new Error(`RPC "${rpc.method}" is not registered`);
|
|
79
|
-
}
|
|
80
|
-
const methodId = this.methodToId.get(rpc.method);
|
|
81
|
-
const encodedData = codec.encode(data);
|
|
82
|
-
// Message format: [methodId: u16][data]
|
|
83
|
-
const buffer = new Uint8Array(2 + encodedData.byteLength);
|
|
84
|
-
new DataView(buffer.buffer).setUint16(0, methodId, true);
|
|
85
|
-
buffer.set(new Uint8Array(encodedData), 2);
|
|
86
|
-
return buffer;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Decode an RPC from binary format
|
|
90
|
-
*
|
|
91
|
-
* @param buffer Binary data to decode
|
|
92
|
-
* @returns Object with method name and decoded data
|
|
93
|
-
* @throws Error if method ID is unknown
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* ```ts
|
|
97
|
-
* const { method, data } = registry.decode(binary);
|
|
98
|
-
* console.log(method); // 'matchCountdown'
|
|
99
|
-
* console.log(data.secondsRemaining); // 10
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
|
-
decode(buffer) {
|
|
103
|
-
if (buffer.byteLength < 2) {
|
|
104
|
-
throw new Error('Buffer too small for RPC message');
|
|
105
|
-
}
|
|
106
|
-
const view = new DataView(buffer.buffer, buffer.byteOffset);
|
|
107
|
-
const methodId = view.getUint16(0, true);
|
|
108
|
-
const method = this.idToMethod.get(methodId);
|
|
109
|
-
if (!method) {
|
|
110
|
-
throw new Error(`Unknown RPC method ID: ${methodId}`);
|
|
111
|
-
}
|
|
112
|
-
const codec = this.codecs.get(method);
|
|
113
|
-
const data = codec.decode(buffer.slice(2));
|
|
114
|
-
return { method, data };
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Check if an RPC method is registered
|
|
118
|
-
*
|
|
119
|
-
* @param method Method name to check
|
|
120
|
-
* @returns True if registered, false otherwise
|
|
121
|
-
*/
|
|
122
|
-
has(method) {
|
|
123
|
-
return this.codecs.has(method);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Get all registered RPC method names
|
|
127
|
-
*
|
|
128
|
-
* @returns Array of method names
|
|
129
|
-
*/
|
|
130
|
-
getMethods() {
|
|
131
|
-
return Array.from(this.codecs.keys());
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Get the numeric ID for a method
|
|
135
|
-
*
|
|
136
|
-
* @param method Method name
|
|
137
|
-
* @returns Method ID or undefined if not registered
|
|
138
|
-
*/
|
|
139
|
-
getMethodId(method) {
|
|
140
|
-
return this.methodToId.get(method);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Release a decoded RPC data object back to the pool.
|
|
144
|
-
* Call this after you're done processing the RPC to enable object pooling.
|
|
145
|
-
*
|
|
146
|
-
* @param method The RPC method name (same as used in decode)
|
|
147
|
-
* @param data The RPC data object to release
|
|
148
|
-
*/
|
|
149
|
-
release(method, data) {
|
|
150
|
-
const codec = this.codecs.get(method);
|
|
151
|
-
if (!codec) {
|
|
152
|
-
throw new Error(`RPC "${method}" is not registered`);
|
|
153
|
-
}
|
|
154
|
-
// Only release if the codec supports pooling
|
|
155
|
-
if ('release' in codec && typeof codec.release === 'function') {
|
|
156
|
-
codec.release(data);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
package/dist/protocol/rpc/rpc.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RPC (Remote Procedure Call) type definitions
|
|
3
|
-
*
|
|
4
|
-
* RPCs are bidirectional one-off events/commands for:
|
|
5
|
-
* - Meta-game events (achievements, notifications)
|
|
6
|
-
* - Match lifecycle (countdown, results)
|
|
7
|
-
* - Request/response patterns
|
|
8
|
-
* - System announcements
|
|
9
|
-
*
|
|
10
|
-
* NOT for game state synchronization (use Snapshots) or player inputs (use Intents)
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Snapshot system for server-to-client state updates.
|
|
3
|
-
*
|
|
4
|
-
* Snapshots are delta updates that contain:
|
|
5
|
-
* 1. Server tick number
|
|
6
|
-
* 2. Partial state updates (only what changed)
|
|
7
|
-
*
|
|
8
|
-
* They need to be:
|
|
9
|
-
* 1. Encoded efficiently (binary)
|
|
10
|
-
* 2. Sent over network
|
|
11
|
-
* 3. Decoded on the client
|
|
12
|
-
* 4. Merged into client state
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* import { Snapshot, SnapshotCodec, applySnapshot } from './protocol/snapshot';
|
|
17
|
-
* import { PooledCodec } from '../core/pooled-codec';
|
|
18
|
-
* import { BinaryCodec } from '../core/binary-codec';
|
|
19
|
-
*
|
|
20
|
-
* interface GameState {
|
|
21
|
-
* players: Record<number, { x: number; y: number }>;
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* // 1. Create codec once (reuse this instance)
|
|
25
|
-
* const snapshotCodec = new SnapshotCodec<GameState>(
|
|
26
|
-
* new PooledCodec({ players: // ... your schema })
|
|
27
|
-
* );
|
|
28
|
-
*
|
|
29
|
-
* // 2. Server: Encode snapshot
|
|
30
|
-
* const snapshot: Snapshot<GameState> = {
|
|
31
|
-
* tick: 100,
|
|
32
|
-
* updates: { players: { 1: { x: 5, y: 10 } } }
|
|
33
|
-
* };
|
|
34
|
-
* const buf = snapshotCodec.encode(snapshot);
|
|
35
|
-
*
|
|
36
|
-
* // 3. Client: Decode and apply
|
|
37
|
-
* const snapshot = snapshotCodec.decode(buf);
|
|
38
|
-
* applySnapshot(clientState, snapshot);
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export { applySnapshot } from "./snapshot";
|
|
42
|
-
export { SnapshotCodec } from "./snapshot-codec";
|
|
43
|
-
export { SnapshotRegistry } from "./snapshot-registry";
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codec for encoding/decoding snapshots with binary serialization.
|
|
3
|
-
*
|
|
4
|
-
* Users instantiate this once with a PooledCodec for their state schema.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```ts
|
|
8
|
-
* import { SnapshotCodec } from './protocol/snapshot';
|
|
9
|
-
* import { PooledCodec } from './core/pooled-codec';
|
|
10
|
-
* import { BinaryCodec } from './core/binary-codec';
|
|
11
|
-
*
|
|
12
|
-
* interface GameState {
|
|
13
|
-
* players: Record<number, { x: number; y: number }>;
|
|
14
|
-
* }
|
|
15
|
-
*
|
|
16
|
-
* const snapshotCodec = new SnapshotCodec<GameState>(
|
|
17
|
-
* new PooledCodec({ players: // schema })
|
|
18
|
-
* );
|
|
19
|
-
*
|
|
20
|
-
* // Encode/decode
|
|
21
|
-
* const buf = snapshotCodec.encode(snapshot);
|
|
22
|
-
* const decoded = snapshotCodec.decode(buf);
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export class SnapshotCodec {
|
|
26
|
-
/**
|
|
27
|
-
* @param updatesCodec Codec for encoding/decoding the state updates
|
|
28
|
-
*/
|
|
29
|
-
constructor(updatesCodec) {
|
|
30
|
-
this.updatesCodec = updatesCodec;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Encode a snapshot into binary format.
|
|
34
|
-
* Format: [tick: u32][updates: encoded by updatesCodec]
|
|
35
|
-
*
|
|
36
|
-
* Uses zero-copy path if codec supports calculateSize and encodeInto.
|
|
37
|
-
*/
|
|
38
|
-
encode(snapshot) {
|
|
39
|
-
// Use zero-copy path if available
|
|
40
|
-
if (this.updatesCodec.calculateSize && this.updatesCodec.encodeInto) {
|
|
41
|
-
const updatesSize = this.updatesCodec.calculateSize(snapshot.updates);
|
|
42
|
-
const buf = new Uint8Array(4 + updatesSize);
|
|
43
|
-
// Encode tick (4 bytes, little-endian)
|
|
44
|
-
new DataView(buf.buffer).setUint32(0, snapshot.tick, true);
|
|
45
|
-
// Write updates directly into buffer (ZERO COPY!)
|
|
46
|
-
this.updatesCodec.encodeInto(snapshot.updates, buf, 4);
|
|
47
|
-
return buf;
|
|
48
|
-
}
|
|
49
|
-
// Fallback to legacy path
|
|
50
|
-
const updatesBytes = this.updatesCodec.encode(snapshot.updates);
|
|
51
|
-
const buf = new Uint8Array(4 + updatesBytes.length);
|
|
52
|
-
new DataView(buf.buffer).setUint32(0, snapshot.tick, true);
|
|
53
|
-
buf.set(updatesBytes, 4);
|
|
54
|
-
return buf;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Decode binary data into a snapshot.
|
|
58
|
-
*/
|
|
59
|
-
decode(buf) {
|
|
60
|
-
// Decode tick (first 4 bytes)
|
|
61
|
-
const tick = new DataView(buf.buffer, buf.byteOffset).getUint32(0, true);
|
|
62
|
-
// Decode updates (remaining bytes)
|
|
63
|
-
const updatesBytes = buf.subarray(4);
|
|
64
|
-
const updates = this.updatesCodec.decode(updatesBytes);
|
|
65
|
-
return { tick, updates };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry for multiple snapshot types with different update schemas.
|
|
3
|
-
*
|
|
4
|
-
* This allows efficient delta encoding by only sending specific update types
|
|
5
|
-
* instead of encoding all fields (including empty/nil ones).
|
|
6
|
-
*
|
|
7
|
-
* ## Memory Efficiency
|
|
8
|
-
*
|
|
9
|
-
* The encoding path minimizes allocations:
|
|
10
|
-
* 1. PooledCodec acquires a buffer from its pool (reused across calls)
|
|
11
|
-
* 2. PooledCodec writes data directly to the buffer at sequential offsets
|
|
12
|
-
* 3. SnapshotRegistry creates ONE final buffer: [typeId(1) + tick(4) + updatesBytes]
|
|
13
|
-
* 4. Total allocations per encode: 1 pooled buffer + 1 final buffer
|
|
14
|
-
*
|
|
15
|
-
* Buffer Layout:
|
|
16
|
-
* ```
|
|
17
|
-
* ┌─────────┬────────────┬──────────────────┐
|
|
18
|
-
* │ Type ID │ Tick │ Updates (codec) │
|
|
19
|
-
* │ (u8) │ (u32) │ (variable) │
|
|
20
|
-
* │ 1 byte │ 4 bytes │ N bytes │
|
|
21
|
-
* └─────────┴────────────┴──────────────────┘
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```ts
|
|
26
|
-
* import { SnapshotRegistry } from './protocol/snapshot';
|
|
27
|
-
* import { PooledCodec } from './core/pooled-codec';
|
|
28
|
-
* import { BinaryPrimitives } from './core/binary-codec';
|
|
29
|
-
*
|
|
30
|
-
* // Define different update types
|
|
31
|
-
* interface PlayerUpdate {
|
|
32
|
-
* players: Array<{ entityId: number; x: number; y: number }>;
|
|
33
|
-
* }
|
|
34
|
-
*
|
|
35
|
-
* interface ScoreUpdate {
|
|
36
|
-
* score: number;
|
|
37
|
-
* }
|
|
38
|
-
*
|
|
39
|
-
* // Create registry
|
|
40
|
-
* const registry = new SnapshotRegistry<PlayerUpdate | ScoreUpdate>();
|
|
41
|
-
*
|
|
42
|
-
* // Register codecs for each update type
|
|
43
|
-
* registry.register('players', new PooledCodec({
|
|
44
|
-
* players: PooledCodec.array({
|
|
45
|
-
* entityId: BinaryPrimitives.u32,
|
|
46
|
-
* x: BinaryPrimitives.f32,
|
|
47
|
-
* y: BinaryPrimitives.f32,
|
|
48
|
-
* })
|
|
49
|
-
* }));
|
|
50
|
-
*
|
|
51
|
-
* registry.register('score', new PooledCodec({
|
|
52
|
-
* score: BinaryPrimitives.u32
|
|
53
|
-
* }));
|
|
54
|
-
*
|
|
55
|
-
* // Server: Encode specific update type
|
|
56
|
-
* const buf = registry.encode('players', {
|
|
57
|
-
* tick: 100,
|
|
58
|
-
* updates: { players: [{ entityId: 1, x: 5, y: 10 }] }
|
|
59
|
-
* });
|
|
60
|
-
*
|
|
61
|
-
* // Client: Decode (type is embedded in message)
|
|
62
|
-
* const { type, snapshot } = registry.decode(buf);
|
|
63
|
-
* applySnapshot(state, snapshot);
|
|
64
|
-
* ```
|
|
65
|
-
*/
|
|
66
|
-
export class SnapshotRegistry {
|
|
67
|
-
constructor() {
|
|
68
|
-
this.codecs = new Map();
|
|
69
|
-
this.typeIds = new Map();
|
|
70
|
-
this.idToType = new Map();
|
|
71
|
-
this.nextId = 0;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Register a codec for a specific update type.
|
|
75
|
-
* Call this once per update type at startup.
|
|
76
|
-
*/
|
|
77
|
-
register(type, codec) {
|
|
78
|
-
if (this.codecs.has(type)) {
|
|
79
|
-
throw new Error(`Snapshot type "${type}" is already registered`);
|
|
80
|
-
}
|
|
81
|
-
const typeId = this.nextId++;
|
|
82
|
-
this.codecs.set(type, codec);
|
|
83
|
-
this.typeIds.set(type, typeId);
|
|
84
|
-
this.idToType.set(typeId, type);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Encode a snapshot with a specific update type.
|
|
88
|
-
* Format: [typeId: u8][tick: u32][updates: encoded by codec]
|
|
89
|
-
*
|
|
90
|
-
* Zero-copy encoding path:
|
|
91
|
-
* - Calculate total size needed
|
|
92
|
-
* - Allocate ONE final buffer for [typeId + tick + updates]
|
|
93
|
-
* - Write directly into buffer using encodeInto (no intermediate allocations)
|
|
94
|
-
*
|
|
95
|
-
* Falls back to legacy encode() method if codec doesn't support encodeInto.
|
|
96
|
-
*/
|
|
97
|
-
encode(type, snapshot) {
|
|
98
|
-
const codec = this.codecs.get(type);
|
|
99
|
-
const typeId = this.typeIds.get(type);
|
|
100
|
-
if (!codec || typeId === undefined) {
|
|
101
|
-
throw new Error(`No codec registered for snapshot type "${type}"`);
|
|
102
|
-
}
|
|
103
|
-
// Use zero-copy path if available
|
|
104
|
-
if (codec.calculateSize && codec.encodeInto) {
|
|
105
|
-
// Calculate total size
|
|
106
|
-
const updatesSize = codec.calculateSize(snapshot.updates);
|
|
107
|
-
const buf = new Uint8Array(5 + updatesSize);
|
|
108
|
-
// Write type ID (1 byte)
|
|
109
|
-
buf[0] = typeId;
|
|
110
|
-
// Write tick (4 bytes, little-endian)
|
|
111
|
-
new DataView(buf.buffer).setUint32(1, snapshot.tick, true);
|
|
112
|
-
// Write updates directly into buffer (ZERO COPY!)
|
|
113
|
-
codec.encodeInto(snapshot.updates, buf, 5);
|
|
114
|
-
return buf;
|
|
115
|
-
}
|
|
116
|
-
// Fallback to legacy path for backward compatibility
|
|
117
|
-
const updatesBytes = codec.encode(snapshot.updates);
|
|
118
|
-
const buf = new Uint8Array(1 + 4 + updatesBytes.length);
|
|
119
|
-
buf[0] = typeId;
|
|
120
|
-
new DataView(buf.buffer).setUint32(1, snapshot.tick, true);
|
|
121
|
-
buf.set(updatesBytes, 5);
|
|
122
|
-
return buf;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Decode a snapshot and return both the type and the snapshot.
|
|
126
|
-
*/
|
|
127
|
-
decode(buf) {
|
|
128
|
-
// Decode type ID (first byte)
|
|
129
|
-
const typeId = buf[0];
|
|
130
|
-
const type = this.idToType.get(typeId);
|
|
131
|
-
if (!type) {
|
|
132
|
-
throw new Error(`Unknown snapshot type ID: ${typeId}`);
|
|
133
|
-
}
|
|
134
|
-
const codec = this.codecs.get(type);
|
|
135
|
-
if (!codec) {
|
|
136
|
-
throw new Error(`No codec registered for snapshot type "${type}"`);
|
|
137
|
-
}
|
|
138
|
-
// Decode tick (bytes 1-4)
|
|
139
|
-
const tick = new DataView(buf.buffer, buf.byteOffset + 1).getUint32(0, true);
|
|
140
|
-
// Decode updates (remaining bytes)
|
|
141
|
-
const updatesBytes = buf.subarray(5);
|
|
142
|
-
const updates = codec.decode(updatesBytes);
|
|
143
|
-
return { type, snapshot: { tick, updates } };
|
|
144
|
-
}
|
|
145
|
-
has(type) {
|
|
146
|
-
return this.codecs.has(type);
|
|
147
|
-
}
|
|
148
|
-
getTypes() {
|
|
149
|
-
return Array.from(this.codecs.keys());
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Release a decoded snapshot's updates object back to the pool.
|
|
153
|
-
* Call this after you're done processing the snapshot to enable object pooling.
|
|
154
|
-
*
|
|
155
|
-
* @param type The snapshot type (same as used in decode)
|
|
156
|
-
* @param updates The updates object to release
|
|
157
|
-
*/
|
|
158
|
-
release(type, updates) {
|
|
159
|
-
const codec = this.codecs.get(type);
|
|
160
|
-
if (!codec) {
|
|
161
|
-
throw new Error(`No codec registered for snapshot type "${type}"`);
|
|
162
|
-
}
|
|
163
|
-
// Only release if the codec supports pooling
|
|
164
|
-
if ('release' in codec && typeof codec.release === 'function') {
|
|
165
|
-
codec.release(updates);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Apply snapshot updates to state (mutating).
|
|
3
|
-
* Deep merges objects, replaces arrays.
|
|
4
|
-
*
|
|
5
|
-
* @param state State to update
|
|
6
|
-
* @param snapshot Snapshot to apply
|
|
7
|
-
*/
|
|
8
|
-
export function applySnapshot(state, snapshot) {
|
|
9
|
-
deepMerge(state, snapshot.updates);
|
|
10
|
-
}
|
|
11
|
-
function deepMerge(target, update) {
|
|
12
|
-
for (const key in update) {
|
|
13
|
-
if (!Object.prototype.hasOwnProperty.call(update, key))
|
|
14
|
-
continue;
|
|
15
|
-
const updateValue = update[key];
|
|
16
|
-
const targetValue = target[key];
|
|
17
|
-
if (updateValue === null || updateValue === undefined) {
|
|
18
|
-
target[key] = updateValue;
|
|
19
|
-
}
|
|
20
|
-
else if (Array.isArray(updateValue)) {
|
|
21
|
-
target[key] = updateValue;
|
|
22
|
-
}
|
|
23
|
-
else if (typeof updateValue === "object" && typeof targetValue === "object") {
|
|
24
|
-
deepMerge(targetValue, updateValue);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
target[key] = updateValue;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# BinaryCodec
|
|
2
|
-
|
|
3
|
-
A minimal TypeScript library for **schema-driven binary encoding and decoding**.
|
|
4
|
-
Supports fixed-size numeric fields with automatic buffer sizing.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Usage
|
|
9
|
-
|
|
10
|
-
### Define a schema
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
import { BinaryCodec } from ".";
|
|
14
|
-
|
|
15
|
-
type Player = {
|
|
16
|
-
id: number;
|
|
17
|
-
score: number;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const playerSchema = {
|
|
21
|
-
id: BinaryCodec.u8,
|
|
22
|
-
score: BinaryCodec.u16,
|
|
23
|
-
};
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Encode an object
|
|
27
|
-
|
|
28
|
-
```ts
|
|
29
|
-
const data: Player = { id: 1, score: 420 };
|
|
30
|
-
const buffer = BinaryCodec.encode(playerSchema, data);
|
|
31
|
-
|
|
32
|
-
console.log(buffer); // Uint8Array [1, 1, 164] (example)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Decode into an object
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
const target: Player = { id: 0, score: 0 };
|
|
39
|
-
BinaryCodec.decode(playerSchema, buffer, target);
|
|
40
|
-
|
|
41
|
-
console.log(target); // { id: 1, score: 420 }
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Features
|
|
47
|
-
|
|
48
|
-
* Fixed-size fields (`u8`, `u16`, `f32`)
|
|
49
|
-
* Automatic buffer sizing
|
|
50
|
-
* Explicit big-endian encoding
|
|
51
|
-
* Safe, re-entrant, and concurrent-friendly
|
|
52
|
-
* Schema-driven and type-safe
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## Notes
|
|
57
|
-
|
|
58
|
-
* Object keys define **field order** in the binary layout.
|
|
59
|
-
* Buffer sizes are validated on decode to avoid overflow.
|
|
60
|
-
* Works in browsers and Node.js.
|