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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var d=(c,e)=>{for(var t in e)r(c,t,{get:e[t],enumerable:!0})},y=(c,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!i.call(c,n)&&n!==t&&r(c,n,{get:()=>e[n],enumerable:!(o=p(e,n))||o.enumerable});return c};var m=c=>y(r({},"__esModule",{value:!0}),c);var h={};d(h,{defineRPC:()=>R});module.exports=m(h);var s=require("../../core/binary-codec");class f{constructor(e){this.schema=e}encode(e){return s.BinaryCodec.encode(this.schema,e)}decode(e){const t={};for(const o of Object.keys(this.schema)){const n=this.schema[o];t[o]=n.toNil()}return s.BinaryCodec.decode(this.schema,e,t)}}function R(c){const e=c.schema,t=new f(e);return{method:c.method,codec:t,type:void 0}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,r,p,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of c(r))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>r[m],enumerable:!(x=b(r,m))||x.enumerable});return f},e=(f,r,p)=>(t(f,r,"default"),p&&t(p,r,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);e(o,require("./rpc"),module.exports);e(o,require("./define-rpc"),module.exports);e(o,require("./rpc-registry"),module.exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var m=(r,e)=>{for(var o in e)i(r,o,{get:e[o],enumerable:!0})},g=(r,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of h(e))!a.call(r,n)&&n!==o&&i(r,n,{get:()=>e[n],enumerable:!(t=c(e,n))||t.enumerable});return r};var w=r=>g(i({},"__esModule",{value:!0}),r);var y={};m(y,{RpcRegistry:()=>f});module.exports=w(y);class f{constructor(){this.codecs=new Map;this.methodToId=new Map;this.idToMethod=new Map;this.nextId=0}register(e){if(this.codecs.has(e.method))throw new Error(`RPC "${e.method}" is already registered`);const o=this.nextId++;this.codecs.set(e.method,e.codec),this.methodToId.set(e.method,o),this.idToMethod.set(o,e.method)}encode(e,o){const t=this.codecs.get(e.method);if(!t)throw new Error(`RPC "${e.method}" is not registered`);const n=this.methodToId.get(e.method),s=t.encode(o),d=new Uint8Array(2+s.byteLength);return new DataView(d.buffer).setUint16(0,n,!0),d.set(new Uint8Array(s),2),d}decode(e){if(e.byteLength<2)throw new Error("Buffer too small for RPC message");const t=new DataView(e.buffer,e.byteOffset).getUint16(0,!0),n=this.idToMethod.get(t);if(!n)throw new Error(`Unknown RPC method ID: ${t}`);const d=this.codecs.get(n).decode(e.slice(2));return{method:n,data:d}}has(e){return this.codecs.has(e)}getMethods(){return Array.from(this.codecs.keys())}getMethodId(e){return this.methodToId.get(e)}release(e,o){const t=this.codecs.get(e);if(!t)throw new Error(`RPC "${e}" is not registered`);"release"in t&&typeof t.release=="function"&&t.release(o)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var T=(t,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of o(e))!i.call(t,c)&&c!==a&&r(t,c,{get:()=>e[c],enumerable:!(n=d(e,c))||n.enumerable});return t};var p=t=>T(r({},"__esModule",{value:!0}),t);var f={};module.exports=p(f);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var S=(p,o)=>{for(var r in o)e(p,r,{get:o[r],enumerable:!0})},y=(p,o,r,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of m(o))!x.call(p,t)&&t!==r&&e(p,t,{get:()=>o[t],enumerable:!(s=f(o,t))||s.enumerable});return p};var c=p=>y(e({},"__esModule",{value:!0}),p);var d={};S(d,{SnapshotCodec:()=>h.SnapshotCodec,SnapshotRegistry:()=>n.SnapshotRegistry,applySnapshot:()=>a.applySnapshot});module.exports=c(d);var a=require("./snapshot"),h=require("./snapshot-codec"),n=require("./snapshot-registry");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var i=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of s(e))!u.call(n,a)&&a!==t&&o(n,a,{get:()=>e[a],enumerable:!(r=d(e,a))||r.enumerable});return n};var f=n=>p(o({},"__esModule",{value:!0}),n);var y={};i(y,{SnapshotCodec:()=>l});module.exports=f(y);class l{constructor(e){this.updatesCodec=e}encode(e){if(this.updatesCodec.calculateSize&&this.updatesCodec.encodeInto){const a=this.updatesCodec.calculateSize(e.updates),c=new Uint8Array(4+a);return new DataView(c.buffer).setUint32(0,e.tick,!0),this.updatesCodec.encodeInto(e.updates,c,4),c}const t=this.updatesCodec.encode(e.updates),r=new Uint8Array(4+t.length);return new DataView(r.buffer).setUint32(0,e.tick,!0),r.set(t,4),r}decode(e){const t=new DataView(e.buffer,e.byteOffset).getUint32(0,!0),r=e.subarray(4),a=this.updatesCodec.decode(r);return{tick:t,updates:a}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var f=(n,e)=>{for(var r in e)d(n,r,{get:e[r],enumerable:!0})},y=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of u(e))!h.call(n,s)&&s!==r&&d(n,s,{get:()=>e[s],enumerable:!(t=p(e,s))||t.enumerable});return n};var g=n=>y(d({},"__esModule",{value:!0}),n);var w={};f(w,{SnapshotRegistry:()=>l});module.exports=g(w);class l{constructor(){this.codecs=new Map;this.typeIds=new Map;this.idToType=new Map;this.nextId=0}register(e,r){if(this.codecs.has(e))throw new Error(`Snapshot type "${e}" is already registered`);const t=this.nextId++;this.codecs.set(e,r),this.typeIds.set(e,t),this.idToType.set(t,e)}encode(e,r){const t=this.codecs.get(e),s=this.typeIds.get(e);if(!t||s===void 0)throw new Error(`No codec registered for snapshot type "${e}"`);if(t.calculateSize&&t.encodeInto){const c=t.calculateSize(r.updates),a=new Uint8Array(5+c);return a[0]=s,new DataView(a.buffer).setUint32(1,r.tick,!0),t.encodeInto(r.updates,a,5),a}const i=t.encode(r.updates),o=new Uint8Array(5+i.length);return o[0]=s,new DataView(o.buffer).setUint32(1,r.tick,!0),o.set(i,5),o}decode(e){const r=e[0],t=this.idToType.get(r);if(!t)throw new Error(`Unknown snapshot type ID: ${r}`);const s=this.codecs.get(t);if(!s)throw new Error(`No codec registered for snapshot type "${t}"`);const i=new DataView(e.buffer,e.byteOffset+1).getUint32(0,!0),o=e.subarray(5),c=s.decode(o);return{type:t,snapshot:{tick:i,updates:c}}}has(e){return this.codecs.has(e)}getTypes(){return Array.from(this.codecs.keys())}release(e,r){const t=this.codecs.get(e);if(!t)throw new Error(`No codec registered for snapshot type "${e}"`);"release"in t&&typeof t.release=="function"&&t.release(r)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},T=(t,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!f.call(t,o)&&o!==a&&s(t,o,{get:()=>e[o],enumerable:!(n=r(e,o))||n.enumerable});return t};var y=t=>T(s({},"__esModule",{value:!0}),t);var u={};p(u,{applySnapshot:()=>l});module.exports=y(u);function l(t,e){i(t,e.updates)}function i(t,e){for(const a in e){if(!Object.prototype.hasOwnProperty.call(e,a))continue;const n=e[a],o=t[a];n==null||Array.isArray(n)?t[a]=n:typeof n=="object"&&typeof o=="object"?i(o,n):t[a]=n}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var d=(r,e)=>{for(var t in e)s(r,t,{get:e[t],enumerable:!0})},m=(r,e,t,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of o(e))!S.call(r,a)&&a!==t&&s(r,a,{get:()=>e[a],enumerable:!(p=n(e,a))||p.enumerable});return r};var c=r=>m(s({},"__esModule",{value:!0}),r);var b={};d(b,{Base2DRenderer:()=>l});module.exports=c(b);var i=require("./base-renderer");class l extends i.BaseRenderer{constructor(e,t){super(e,t),this.maxSprites=t.maxSprites}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(r,e)=>{for(var a in e)s(r,a,{get:e[a],enumerable:!0})},c=(r,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!p.call(r,t)&&t!==a&&s(r,t,{get:()=>e[t],enumerable:!(n=m(e,t))||n.enumerable});return r};var D=r=>c(s({},"__esModule",{value:!0}),r);var x={};l(x,{Base3DRenderer:()=>i});module.exports=D(x);var o=require("./base-renderer");class i extends o.BaseRenderer{constructor(e,a){super(e,a),this.maxModels=a.maxModels}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var d=(r,e)=>{for(var t in e)i(r,t,{get:e[t],enumerable:!0})},c=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!s.call(r,o)&&o!==t&&i(r,o,{get:()=>e[o],enumerable:!(a=n(e,o))||a.enumerable});return r};var h=r=>c(i({},"__esModule",{value:!0}),r);var C={};d(C,{BaseRenderer:()=>p});module.exports=h(C);class p{constructor(e,t){this._width=0;this._height=0;this._initialized=!1;this.canvas=e,this.options=t,this._clearColor=t.clearColor??[0,0,0,1]}get clearColor(){return this._clearColor}set clearColor(e){this._clearColor=e}get width(){return this._width}get height(){return this._height}get initialized(){return this._initialized}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,e,p,x)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of c(e))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>e[m],enumerable:!(x=b(e,m))||x.enumerable});return f},r=(f,e,p)=>(t(f,e,"default"),p&&t(p,e,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);r(o,require("./types"),module.exports);r(o,require("./base-renderer"),module.exports);r(o,require("./base-2d-renderer"),module.exports);r(o,require("./base-3d-renderer"),module.exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var i=(r,e,o,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of u(e))!a.call(r,n)&&n!==o&&t(r,n,{get:()=>e[n],enumerable:!(m=b(e,n))||m.enumerable});return r};var p=r=>i(t({},"__esModule",{value:!0}),r);var l={};module.exports=p(l);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const f=Symbol("schemaSize");function y(u){const t=u[f];if(t!==void 0)return t;let e=0;for(const r of Object.keys(u))e+=u[r].size;return u[f]=e,e}class g{static encodeInto(t,e){const r=y(t),a=new ArrayBuffer(r),s=new DataView(a);let n=0;for(const i of Object.keys(t)){const o=t[i];o.write(s,n,e[i]),n+=o.size}return new Uint8Array(a)}static decodeInto(t,e,r){const a=y(t);if(e.byteLength<a)throw new RangeError(`Buffer too small: expected ${a} bytes, got ${e.byteLength}`);const s=new DataView(e.buffer,e.byteOffset,e.byteLength);let n=0;for(const i of Object.keys(t)){const o=t[i];r[i]=o.read(s,n),n+=o.size}return r}}class l{static{this.u8={size:1,write:(t,e,r)=>t.setUint8(e,r),read:(t,e)=>t.getUint8(e),toNil:()=>0}}static{this.u16={size:2,write:(t,e,r)=>t.setUint16(e,r,!1),read:(t,e)=>t.getUint16(e,!1),toNil:()=>0}}static{this.u32={size:4,write:(t,e,r)=>t.setUint32(e,r,!1),read:(t,e)=>t.getUint32(e,!1),toNil:()=>0}}static{this.i8={size:1,write:(t,e,r)=>t.setInt8(e,r),read:(t,e)=>t.getInt8(e),toNil:()=>0}}static{this.i16={size:2,write:(t,e,r)=>t.setInt16(e,r,!1),read:(t,e)=>t.getInt16(e,!1),toNil:()=>0}}static{this.i32={size:4,write:(t,e,r)=>t.setInt32(e,r,!1),read:(t,e)=>t.getInt32(e,!1),toNil:()=>0}}static{this.f16={size:2,write:(t,e,r)=>{const a=new Float32Array(1),s=new Uint32Array(a.buffer);a[0]=r;const n=s[0],i=n>>>31&1;let o=n>>>23&255,d=n&8388607,c;if(o===255)c=i<<15|31744|(d?512:0);else if(o===0)c=i<<15;else{const F=o-127+15;if(F>=31)c=i<<15|31744;else if(F<=0)c=i<<15;else{const b=d>>>13;c=i<<15|F<<10|b}}t.setUint16(e,c,!1)},read:(t,e)=>{const r=t.getUint16(e,!1),a=r>>>15&1,s=r>>>10&31,n=r&1023;let i;if(s===0)i=a<<31;else if(s===31)i=a<<31|255<<23|(n?n<<13:0);else{const c=s-15+127;i=a<<31|c<<23|n<<13}const o=new Uint32Array([i]);return new Float32Array(o.buffer)[0]},toNil:()=>0}}static{this.f32={size:4,write:(t,e,r)=>t.setFloat32(e,r,!1),read:(t,e)=>t.getFloat32(e,!1),toNil:()=>0}}static{this.f64={size:8,write:(t,e,r)=>t.setFloat64(e,r,!1),read:(t,e)=>t.getFloat64(e,!1),toNil:()=>0}}static{this.bool={size:1,write:(t,e,r)=>t.setUint8(e,r?1:0),read:(t,e)=>t.getUint8(e)!==0,toNil:()=>!1}}static string(t){return{size:t+2,write(e,r,a){const n=new TextEncoder().encode(a);if(n.length>t)throw new RangeError(`String too long, max ${t} bytes`);e.setUint16(r,n.length,!1);for(let i=0;i<n.length;i++)e.setUint8(r+2+i,n[i]);for(let i=n.length;i<t;i++)e.setUint8(r+2+i,0)},read(e,r){const a=e.getUint16(r,!1),s=new Uint8Array(a);for(let n=0;n<a;n++)s[n]=e.getUint8(r+2+n);return new TextDecoder().decode(s)},toNil:()=>""}}static{this.vec2={size:8,write(t,e,r){t.setFloat32(e,r.x,!1),t.setFloat32(e+4,r.y,!1)},read(t,e){return{x:t.getFloat32(e,!1),y:t.getFloat32(e+4,!1)}},toNil:()=>({x:0,y:0})}}static{this.vec3={size:12,write(t,e,r){t.setFloat32(e,r.x,!1),t.setFloat32(e+4,r.y,!1),t.setFloat32(e+8,r.z,!1)},read(t,e){return{x:t.getFloat32(e,!1),y:t.getFloat32(e+4,!1),z:t.getFloat32(e+8,!1)}},toNil:()=>({x:0,y:0,z:0})}}static{this.color={size:4,write(t,e,r){t.setUint8(e,r.r),t.setUint8(e+1,r.g),t.setUint8(e+2,r.b),t.setUint8(e+3,r.a)},read(t,e){return{r:t.getUint8(e),g:t.getUint8(e+1),b:t.getUint8(e+2),a:t.getUint8(e+3)}},toNil:()=>({r:0,g:0,b:0,a:0})}}static{this.f32_le={size:4,write:(t,e,r)=>t.setFloat32(e,r,!0),read:(t,e)=>t.getFloat32(e,!0),toNil:()=>0}}static{this.f64_le={size:8,write:(t,e,r)=>t.setFloat64(e,r,!0),read:(t,e)=>t.getFloat64(e,!0),toNil:()=>0}}static{this.u16_le={size:2,write:(t,e,r)=>t.setUint16(e,r,!0),read:(t,e)=>t.getUint16(e,!0),toNil:()=>0}}static{this.u32_le={size:4,write:(t,e,r)=>t.setUint32(e,r,!0),read:(t,e)=>t.getUint32(e,!0),toNil:()=>0}}static{this.i16_le={size:2,write:(t,e,r)=>t.setInt16(e,r,!0),read:(t,e)=>t.getInt16(e,!0),toNil:()=>0}}static{this.i32_le={size:4,write:(t,e,r)=>t.setInt32(e,r,!0),read:(t,e)=>t.getInt32(e,!0),toNil:()=>0}}static{this.vec2_le={size:8,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0)],toNil:()=>[0,0]}}static{this.vec3_le={size:12,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0),t.setFloat32(e+8,r[2],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0),t.getFloat32(e+8,!0)],toNil:()=>[0,0,0]}}static{this.vec4_le={size:16,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0),t.setFloat32(e+8,r[2],!0),t.setFloat32(e+12,r[3],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0),t.getFloat32(e+8,!0),t.getFloat32(e+12,!0)],toNil:()=>[0,0,0,0]}}}class w extends g{static{this.u8=l.u8}static{this.u16=l.u16}static{this.u32=l.u32}static{this.i8=l.i8}static{this.i16=l.i16}static{this.i32=l.i32}static{this.f16=l.f16}static{this.f32=l.f32}static{this.bool=l.bool}static{this.string=l.string}static{this.vec2=l.vec2}static{this.vec3=l.vec3}static{this.color=l.color}static encode(t,e){return this.encodeInto(t,e)}static decode(t,e,r){return this.decodeInto(t,e,r)}}export{g as BaseBinaryCodec,w as BinaryCodec,l as BinaryPrimitives};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./binary-codec";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ImmediateDriver as i,RafDriver as t,TimeoutDriver as o}from"./drivers";function m(r,e){return r==="server-immediate"?new i(e):r==="server-timeout"?new o(e):new t(e)}export{i as ImmediateDriver,t as RafDriver,o as TimeoutDriver,m as createDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class n{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),r=(t-this.last)/1e3;this.last=t,this.update(r),setImmediate(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}export{n as ImmediateDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./immediate";export*from"./raf";export*from"./timeout";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class a{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.rafId=null;this.loop=()=>{if(!this.running)return;const t=performance.now(),r=(t-this.last)/1e3;this.last=t,this.update(r),requestAnimationFrame(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.rafId=requestAnimationFrame(this.loop)}stop(){this.running=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}}export{a as RafDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const r=1;class e{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),o=(t-this.last)/1e3;this.last=t,this.update(o),setTimeout(this.loop,r)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}export{e as TimeoutDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./driver";export*from"./drivers";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class o{constructor({events:n}){this.emitting=-1;this.events=n,this.eventIndex={},this.callbackArrays=new Array(this.events.length),this.callbackCounts=new Array(this.events.length).fill(0);for(let t=0;t<this.events.length;t++)this.eventIndex[this.events[t]]=t,this.callbackArrays[t]=[]}on(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];for(let l=0;l<s;l++)if(a[l]===t)return;a[s]=t,this.callbackCounts[e]++}once(n,t){const e=a=>{t(a),this.off(n,e)};this.on(n,e)}emit(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];this.emitting=e;for(let l=0;l<s;l++){const r=a[l];r!==null&&r(t)}this.emitting=-1,this.compact(e)}off(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];for(let l=0;l<s;l++)if(a[l]===t){this.emitting===e?a[l]=null:(a[l]=a[s-1],a[s-1]=null,this.callbackCounts[e]--);return}}clear(n){if(!n){for(let e=0;e<this.callbackArrays.length;e++)this.callbackArrays[e].length=0,this.callbackCounts[e]=0;return}const t=this.eventIndex[n];if(t===void 0)return console.warn(`Event "${n}" does not exist.`);this.callbackArrays[t].length=0,this.callbackCounts[t]=0}compact(n){const t=this.callbackArrays[n];let e=0;const a=this.callbackCounts[n];for(let s=0;s<a;s++)t[s]!==null&&(t[e++]=t[s]);for(let s=e;s<a;s++)t[s]=null;this.callbackCounts[n]=e}}export{o as EventSystem};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./event-system";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor({rate:t,onTick:i}){this.accumulator=0;this._tickCount=0;this.rate=t,this.intervalMs=1e3/this.rate,this.onTick=i,this.maxTicksPerFrame=Math.max(1,Math.floor(t/2))}getTicks(t){this.accumulator+=t*1e3;let i=0;const e=this.intervalMs*.001;for(;this.accumulator>=this.intervalMs-e&&i<this.maxTicksPerFrame;)this.accumulator-=this.intervalMs,i++;const r=Math.floor(this.accumulator/this.intervalMs);return r>0&&this.onTickSkipped&&this.onTickSkipped(r),i}tick(t){const i=this.getTicks(t);for(let e=0;e<i;e++)this.onTick(1/this.rate,this._tickCount++)}get tickCount(){return this._tickCount}resetTickCount(){this._tickCount=0,this.accumulator=0}get accumulatedTime(){return this.accumulator/1e3}get alpha(){return Math.min(this.accumulatedTime/(1/this.rate),1)}}export{s as FixedTicker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./fixed-ticker";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e){this.capacity=e,this.freeList=new Uint32Array(e);for(let t=0;t<e;t++)this.freeList[t]=t;this.freeCount=e}allocate(){return this.freeCount===0?-1:this.freeList[--this.freeCount]}free(e){if(this.freeCount>=this.capacity)throw new Error("Double free detected!");this.freeList[this.freeCount++]=e}hasAvailable(){return this.freeCount>0}getAvailableCount(){return this.freeCount}getAllocatedCount(){return this.capacity-this.freeCount}}export{i as FreeList};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./free-list";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function d(r={}){const{prefix:n="",size:a=16}=r,t=Math.max(a-n.length,8),i=Math.ceil(t/8);let e=crypto.getRandomValues(new Uint32Array(i)).reduce((s,o)=>s+o.toString(16).padStart(8,"0"),"");return e=e.slice(0,t).padStart(t,"0"),`${n}${e}`}export{d as generateId};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./generate-id";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./binary-codec";export*from"./events";export*from"./fixed-ticker";export*from"./generate-id";export*from"./lerp";export*from"./driver";export*from"./navmesh";export*from"./pooled-codec";export*from"./prediction";export*from"./input";export*from"./free-list";export*from"./sparse-batcher";export*from"./simple-rng";export*from"./ray";export*from"../renderer";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./manager";export*from"./sources";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class c{constructor(){this.keys=Object.create(null);this.prevKeys=Object.create(null);this.mouse={x:0,y:0,dx:0,dy:0,left:!1,right:!1,middle:!1,scrollX:0,scrollY:0};this.lastClientX=null;this.lastClientY=null;this.prevMouse={left:!1,right:!1,middle:!1};this.snapshotFlip=!1;this.handlers={keydown:t=>this.onKeyDown(t),keyup:t=>this.onKeyUp(t),mousemove:t=>this.onMouseMove(t),mousedown:t=>this.onMouseDown(t),mouseup:t=>this.onMouseUp(t),wheel:t=>this.onMouseWheel(t),swipe:t=>this.onSwipe(t),pinch:t=>this.onPinch(t)};this.snapshotA=r(),this.snapshotB=r()}peek(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return d(t,this.keys,this.mouse),t}snapshot(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return this.snapshotFlip=!this.snapshotFlip,p(t,this.keys,this.prevKeys,this.mouse,this.prevMouse),this.mouse.dx=0,this.mouse.dy=0,this.mouse.scrollX=0,this.mouse.scrollY=0,this.prevMouse.left=this.mouse.left,this.prevMouse.right=this.mouse.right,this.prevMouse.middle=this.mouse.middle,t}listen(t){this.inputSource&&this.inputSource.detach(),this.inputSource=t,t.attach(this.handlers)}unlisten(){this.inputSource&&this.inputSource.detach()}onKeyDown(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!0}onKeyUp(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!1}onMouseMove(t){const s=t.target.getBoundingClientRect(),o=t.clientX-s.left,i=t.clientY-s.top;typeof document<"u"&&document.pointerLockElement===t.target?(this.mouse.dx+=t.movementX,this.mouse.dy+=t.movementY):this.lastClientX!==null&&this.lastClientY!==null&&(this.mouse.dx+=t.clientX-this.lastClientX,this.mouse.dy+=t.clientY-this.lastClientY),this.lastClientX=t.clientX,this.lastClientY=t.clientY,this.mouse.x=o,this.mouse.y=i}onMouseDown(t){t.button===0&&(this.mouse.left=!0),t.button===1&&(this.mouse.middle=!0),t.button===2&&(this.mouse.right=!0)}onMouseUp(t){t.button===0&&(this.mouse.left=!1),t.button===1&&(this.mouse.middle=!1),t.button===2&&(this.mouse.right=!1),this.lastClientX=null,this.lastClientY=null}onMouseWheel(t){this.mouse.scrollX+=t.deltaX,this.mouse.scrollY+=t.deltaY}onSwipe(t){}onPinch(t){}}function r(){return{mouse:{position:{x:0,y:0},delta:{position:{x:0,y:0},scroll:{x:0,y:0}},left:{down:!1,hit:!1,released:!1},right:{down:!1,hit:!1,released:!1},middle:{down:!1,hit:!1,released:!1}},keys:Object.create(null)}}function d(e,t,s){for(const o in t){const i=e.keys[o]??={down:!1,hit:!1,released:!1};i.down=t[o].down,i.hit=!1,i.released=!1}e.mouse.position.x=s.x,e.mouse.position.y=s.y,e.mouse.delta.position.x=s.dx,e.mouse.delta.position.y=s.dy,e.mouse.delta.scroll.x=s.scrollX,e.mouse.delta.scroll.y=s.scrollY,e.mouse.left.down=s.left,e.mouse.right.down=s.right,e.mouse.middle.down=s.middle,e.mouse.left.hit=e.mouse.left.released=!1,e.mouse.right.hit=e.mouse.right.released=!1,e.mouse.middle.hit=e.mouse.middle.released=!1}function p(e,t,s,o,i){for(const l in t){const n=t[l].down,h=s[l]??!1,a=e.keys[l]??={down:!1,hit:!1,released:!1};a.down=n,a.hit=n&&!h,a.released=!n&&h,s[l]=n}e.mouse.position.x=o.x,e.mouse.position.y=o.y,e.mouse.delta.position.x=o.dx,e.mouse.delta.position.y=o.dy,e.mouse.delta.scroll.x=o.scrollX,e.mouse.delta.scroll.y=o.scrollY,u(e.mouse.left,o.left,i.left),u(e.mouse.right,o.right,i.right),u(e.mouse.middle,o.middle,i.middle)}function u(e,t,s){e.down=t,e.hit=t&&!s,e.released=!t&&s}export{c as InputManager};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e,r){this.keyboardTarget=e;this.mouseTarget=r}attach(e){this.handlers&&this.detach(),this.handlers=e,this.keyboardTarget.addEventListener("keydown",e.keydown),this.keyboardTarget.addEventListener("keyup",e.keyup),this.mouseTarget.addEventListener("pointermove",e.mousemove),this.mouseTarget.addEventListener("pointerdown",e.mousedown),this.mouseTarget.addEventListener("pointerup",e.mouseup),this.mouseTarget.addEventListener("pointercancel",e.mouseup),this.mouseTarget.addEventListener("wheel",e.wheel)}detach(){const e=this.handlers;e&&(this.keyboardTarget.removeEventListener("keydown",e.keydown),this.keyboardTarget.removeEventListener("keyup",e.keyup),this.mouseTarget.removeEventListener("pointermove",e.mousemove),this.mouseTarget.removeEventListener("pointerdown",e.mousedown),this.mouseTarget.removeEventListener("pointerup",e.mouseup),this.mouseTarget.removeEventListener("pointercancel",e.mouseup),this.mouseTarget.removeEventListener("wheel",e.wheel))}}export{i as BrowserInputSource};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./browser";
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./lerp";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function u(e,n,r){return e+(n-e)*r}export{u as lerp};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./navmesh";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class m{constructor(s,o,t="grid",r=[]){this.poolSize=s;this.workerPath=o;this.navType=t;this.obstacles=r;this.workers=[];this.nextWorkerIndex=0;this.requestId=0;this.pendingRequests=new Map;this.initialized=!1}async init(){if(this.initialized)return;const s=[];for(let o=0;o<this.poolSize;o++){const t=new Worker(this.workerPath,{type:"module"});t.onmessage=i=>{const e=i.data;if(e.type==="PATH_RESULT"){const n=this.pendingRequests.get(e.id);n&&(n.resolve(e.path),this.pendingRequests.delete(e.id))}else if(e.type==="ERROR")for(const[n,a]of this.pendingRequests.entries())a.reject(new Error(e.error)),this.pendingRequests.delete(n)},t.onerror=i=>{console.error("Worker error:",i);for(const[e,n]of this.pendingRequests.entries())n.reject(new Error("Worker error")),this.pendingRequests.delete(e)},this.workers.push(t);const r=new Promise(i=>{const e=n=>{n.data.type==="READY"&&(t.removeEventListener("message",e),i())};t.addEventListener("message",e)});t.postMessage({type:"INIT",navType:this.navType,obstacles:this.obstacles}),s.push(r)}await Promise.all(s),this.initialized=!0}async findPath(s,o){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.requestId++,r=this.workers[this.nextWorkerIndex];return this.nextWorkerIndex=(this.nextWorkerIndex+1)%this.workers.length,new Promise((i,e)=>{this.pendingRequests.set(t,{id:t,from:s,to:o,resolve:i,reject:e}),r.postMessage({type:"FIND_PATH",id:t,from:s,to:o})})}async addObstacle(s){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const o=this.workers.map(r=>new Promise(i=>{const e=n=>{n.data.type==="OBSTACLE_ADDED"&&(r.removeEventListener("message",e),i(n.data.obstacleId))};r.addEventListener("message",e),r.postMessage({type:"ADD_OBSTACLE",obstacle:s})}));return(await Promise.all(o))[0]}async removeObstacle(s){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const o=this.workers.map(t=>new Promise(r=>{const i=e=>{e.data.type==="OBSTACLE_REMOVED"&&(t.removeEventListener("message",i),r())};t.addEventListener("message",i),t.postMessage({type:"REMOVE_OBSTACLE",obstacleId:s})}));await Promise.all(o)}async moveObstacle(s,o){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.workers.map(r=>new Promise(i=>{const e=n=>{n.data.type==="OBSTACLE_MOVED"&&(r.removeEventListener("message",e),i())};r.addEventListener("message",e),r.postMessage({type:"MOVE_OBSTACLE",obstacleId:s,pos:o})}));await Promise.all(t)}terminate(){for(const s of this.workers)s.terminate();this.workers=[],this.pendingRequests.clear(),this.initialized=!1}get pendingCount(){return this.pendingRequests.size}get size(){return this.workers.length}}export{m as NavMeshWorkerPool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ray2D as z}from"../ray/ray-2d";const V=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}],x=l=>({x:Math.floor(l.x),y:Math.floor(l.y)}),O=l=>({x:l.x+.5,y:l.y+.5}),d=(l,t)=>l&65535|(t&65535)<<16,g=l=>({x:l<<16>>16,y:l>>16});class I{constructor(t){this.scoreFn=t;this.heap=[]}push(t){this.heap.push(t),this.bubbleUp(this.heap.length-1)}pop(){const t=this.heap[0],e=this.heap.pop();return this.heap.length>0&&e!==void 0&&(this.heap[0]=e,this.sinkDown(0)),t}get size(){return this.heap.length}clear(){this.heap.length=0}bubbleUp(t){const e=this.heap[t],s=this.scoreFn(e);for(;t>0;){const i=(t+1>>1)-1,r=this.heap[i];if(s>=this.scoreFn(r))break;this.heap[i]=e,this.heap[t]=r,t=i}}sinkDown(t){const e=this.heap.length,s=this.heap[t],i=this.scoreFn(s);for(;;){const r=t+1<<1,a=r-1;let o=null,n;if(a<e){const c=this.heap[a];n=this.scoreFn(c),n<i&&(o=a)}if(r<e){const c=this.heap[r];this.scoreFn(c)<(o===null?i:n)&&(o=r)}if(o===null)break;this.heap[t]=this.heap[o],this.heap[o]=s,t=o}}}class X{constructor(t=1){this.grid=new Map;this.obstacleCells=new Map;this.cellSize=t}hash(t,e){const s=Math.floor(t/this.cellSize),i=Math.floor(e/this.cellSize);return d(s,i)}add(t,e){const s=this.getCellsForObstacle(e);for(const i of s)this.grid.has(i)||this.grid.set(i,new Set),this.grid.get(i).add(t);this.obstacleCells.set(t,s)}remove(t){const e=this.obstacleCells.get(t);if(e){for(const s of e){const i=this.grid.get(s);i&&(i.delete(t),i.size===0&&this.grid.delete(s))}this.obstacleCells.delete(t)}}query(t){const e=this.hash(t.x,t.y);return this.grid.get(e)||new Set}queryRay(t,e,s,i,r){const a=new Set,o=this.cellSize;let n=Math.floor(t/o),c=Math.floor(e/o);const h=s>=0?1:-1,p=i>=0?1:-1,u=Math.abs(s)<1e-10?1/0:o/Math.abs(s),f=Math.abs(i)<1e-10?1/0:o/Math.abs(i);let b=Math.abs(s)<1e-10?1/0:s>0?((n+1)*o-t)/s:(t-n*o)/-s,y=Math.abs(i)<1e-10?1/0:i>0?((c+1)*o-e)/i:(e-c*o)/-i;for(;;){const m=this.grid.get(d(n,c));if(m)for(const S of m)a.add(S);if((b<y?b:y)>r)break;b<=y?(b+=u,n+=h):(y+=f,c+=p)}return a}clear(){this.grid.clear(),this.obstacleCells.clear()}getCellsForObstacle(t){const e=[];if(t.type==="circle"){const s=t.radius,i=Math.floor((t.pos.x-s)/this.cellSize),r=Math.floor((t.pos.x+s)/this.cellSize),a=Math.floor((t.pos.y-s)/this.cellSize),o=Math.floor((t.pos.y+s)/this.cellSize);for(let n=i;n<=r;n++)for(let c=a;c<=o;c++)e.push(d(n,c))}else if(t.type==="rect"){const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,r=t.size.x/2,a=t.size.y/2,o=Math.sqrt(r*r+a*a),n=Math.floor((s-o)/this.cellSize),c=Math.floor((s+o)/this.cellSize),h=Math.floor((i-o)/this.cellSize),p=Math.floor((i+o)/this.cellSize);for(let u=n;u<=c;u++)for(let f=h;f<=p;f++)e.push(d(u,f))}else if(t.type==="polygon"){const s=M(t),i=Math.floor(s.minX/this.cellSize),r=Math.floor(s.maxX/this.cellSize),a=Math.floor(s.minY/this.cellSize),o=Math.floor(s.maxY/this.cellSize);for(let n=i;n<=r;n++)for(let c=a;c<=o;c++)e.push(d(n,c))}return e}}function v(l,t){const e=l.x-t.pos.x,s=l.y-t.pos.y;return e*e+s*s<=t.radius*t.radius}function w(l,t){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2;if(t.rotation){const i=Math.cos(-t.rotation),r=Math.sin(-t.rotation),a=l.x-e,o=l.y-s,n=a*i-o*r,c=a*r+o*i;return Math.abs(n)<=t.size.x/2&&Math.abs(c)<=t.size.y/2}return l.x>=t.pos.x&&l.y>=t.pos.y&&l.x<=t.pos.x+t.size.x&&l.y<=t.pos.y+t.size.y}function k(l,t){let e=!1;const s=t.points,i=t.rotation?Math.cos(t.rotation):1,r=t.rotation?Math.sin(t.rotation):0;for(let a=0,o=s.length-1;a<s.length;o=a++){let n=s[a].x,c=s[a].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-c*r,b=n*r+c*i,y=h*i-p*r,m=h*r+p*i;n=f,c=b,h=y,p=m}n+=t.pos.x,c+=t.pos.y,h+=t.pos.x,p+=t.pos.y,c>l.y!=p>l.y&&l.x<(h-n)*(l.y-c)/(p-c)+n&&(e=!e)}return e}function M(l){let t=1/0,e=1/0,s=-1/0,i=-1/0;const r=l.rotation?Math.cos(l.rotation):1,a=l.rotation?Math.sin(l.rotation):0;for(const o of l.points){let n=o.x,c=o.y;if(l.rotation){const h=n*r-c*a,p=n*a+c*r;n=h,c=p}n+=l.pos.x,c+=l.pos.y,t=Math.min(t,n),e=Math.min(e,c),s=Math.max(s,n),i=Math.max(i,c)}return{minX:t,minY:e,maxX:s,maxY:i}}class Y{constructor(){this.items=new Map;this.spatial=new X(1);this._cachedItems=[];this.nextId=1;this.dirty=!0;this.version=0}add(t){const e=this.nextId++,s={...t,id:e};return this.items.set(e,s),this.spatial.add(e,s),this.dirty=!0,this.version++,e}move(t,e){const s=this.items.get(t);if(!s)return;this.spatial.remove(t);const i={...s,pos:{...e}};this.items.set(t,i),this.spatial.add(t,i),this.dirty=!0,this.version++}remove(t){this.spatial.remove(t),this.items.delete(t),this.dirty=!0,this.version++}at(t){const e=this.spatial.query(t);for(const s of e){const i=this.items.get(s);if(!(!i||i.solid===!1)&&(i.type==="circle"&&v(t,i)||i.type==="rect"&&w(t,i)||i.type==="polygon"&&k(t,i)))return i}}get(t){return this.items.get(t)}queryRay(t,e){return this.spatial.queryRay(t.origin[0],t.origin[1],t.direction[0],t.direction[1],e)}get values(){return this.dirty?(this._cachedItems=[...this.items.values()],this.dirty=!1,this._cachedItems):this._cachedItems}}class P{constructor(){this.cameFrom=new Map;this.g=new Map;this.closed=new Set;this.openSet=new Set;this.goalX=0;this.goalY=0;this.open=new I(t=>{const e=g(t);return(this.g.get(t)??0)+Math.abs(e.x-this.goalX)+Math.abs(e.y-this.goalY)})}run(t,e,s){this.goalX=e.x,this.goalY=e.y,this.cameFrom.clear(),this.g.clear(),this.closed.clear(),this.openSet.clear(),this.open.clear();const i=d(t.x,t.y);for(this.g.set(i,0),this.open.push(i),this.openSet.add(i);this.open.size>0;){const r=this.open.pop();this.openSet.delete(r);const a=g(r);if(a.x===e.x&&a.y===e.y)return W(this.cameFrom,a);this.closed.add(r);for(const o of V){const n=a.x+o.x,c=a.y+o.y;if(!s(n,c))continue;const h=d(n,c);if(this.closed.has(h))continue;const p=this.g.get(r)+1;p<(this.g.get(h)??1/0)&&(this.g.set(h,p),this.cameFrom.set(h,r),this.openSet.has(h)||(this.open.push(h),this.openSet.add(h)))}}return[]}}class C{constructor(t){this.obstacles=t;this.blocked=new Set;this.astar=new P;this.pathCache=new Map;this.pathCacheVersion=-1}rebuild(){this.blocked.clear();for(const t of this.obstacles.values)if(t.solid!==!1){if(t.type==="circle"){const e=Math.ceil(t.radius),s=Math.floor(t.pos.x),i=Math.floor(t.pos.y);for(let r=-e;r<=e;r++)for(let a=-e;a<=e;a++){const o=s+r,n=i+a,c={x:o+.5,y:n+.5};v(c,t)&&this.blocked.add(d(o,n))}}else if(t.type==="rect"){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2,i=t.size.x/2,r=t.size.y/2,a=Math.sqrt(i*i+r*r),o=Math.floor(e-a),n=Math.ceil(e+a),c=Math.floor(s-a),h=Math.ceil(s+a);for(let p=o;p<=n;p++)for(let u=c;u<=h;u++){const f={x:p+.5,y:u+.5};w(f,t)&&this.blocked.add(d(p,u))}}else if(t.type==="polygon"){const e=M(t),s=Math.floor(e.minX),i=Math.ceil(e.maxX),r=Math.floor(e.minY),a=Math.ceil(e.maxY);for(let o=s;o<=i;o++)for(let n=r;n<=a;n++){const c={x:o+.5,y:n+.5};k(c,t)&&this.blocked.add(d(o,n))}}}}findPath(t,e){const s=x(t),i=x(e),r=`${d(s.x,s.y)}|${d(i.x,i.y)}`;this.obstacles.version!==this.pathCacheVersion&&(this.pathCache.clear(),this.pathCacheVersion=this.obstacles.version);const a=this.pathCache.get(r);if(a)return a;const o=this.astar.run(s,i,(n,c)=>!this.blocked.has(d(n,c))).map(O);return this.pathCache.set(r,o),o}}function T(l,t,e){if(t.solid===!1)return!1;if(t.type==="circle"){const s=l.intersectsCircle(t.pos.x,t.pos.y,t.radius);return s!==null&&s<=e}if(t.type==="rect"){if(!t.rotation){const h=l.intersectsAABB(t.pos.x,t.pos.y,t.pos.x+t.size.x,t.pos.y+t.size.y);return h!==null&&h<=e}const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,r=t.size.x/2,a=t.size.y/2,o=Math.cos(t.rotation),n=Math.sin(t.rotation),c=[[s+r*o-a*n,i+r*n+a*o],[s-r*o-a*n,i-r*n+a*o],[s-r*o+a*n,i-r*n-a*o],[s+r*o+a*n,i+r*n-a*o]];for(let h=0;h<4;h++){const[p,u]=c[h],[f,b]=c[(h+1)%4],y=l.intersectsSegment(p,u,f,b);if(y!==null&&y<=e)return!0}return!1}if(t.type==="polygon"){const s=t.points,i=t.rotation?Math.cos(t.rotation):1,r=t.rotation?Math.sin(t.rotation):0;for(let a=0;a<s.length;a++){const o=(a+1)%s.length;let n=s[a].x,c=s[a].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-c*r;c=n*r+c*i,n=f;const b=h*i-p*r;p=h*r+p*i,h=b}n+=t.pos.x,c+=t.pos.y,h+=t.pos.x,p+=t.pos.y;const u=l.intersectsSegment(n,c,h,p);if(u!==null&&u<=e)return!0}return!1}return!1}class R{constructor(t){this.obstacles=t;this.astar=new P}rebuild(){}findPath(t,e){const s=e.x-t.x,i=e.y-t.y,r=Math.hypot(s,i);if(r>0){const a=new z;a.set(t.x,t.y,s,i);const o=this.obstacles.queryRay(a,r);for(const n of o){const c=this.obstacles.get(n);if(c&&T(a,c,r))return this.astar.run(x(t),x(e),(h,p)=>!this.obstacles.at({x:h+.5,y:p+.5})).map(O)}}return[t,e]}}class j{constructor(t,e){this.type=t;this.lastVersion=-1;this.pendingPaths=0;this.AUTO_WORKER_THRESHOLD=20;this.obstacles=new Y,this.options={workers:e?.workers??!1,workerPoolSize:e?.workerPoolSize??4,workerPath:e?.workerPath??"./navmesh.worker.js"},t==="grid"&&(this.grid=new C(this.obstacles)),t==="graph"&&(this.graph=new R(this.obstacles)),this.options.workers===!0&&this.initWorkerPool()}async initWorkerPool(){if(!this.workerPool)try{const{NavMeshWorkerPool:t}=await import("./navmesh-worker-pool");this.workerPool=new t(this.options.workerPoolSize,this.options.workerPath,this.type,this.obstacles.values),await this.workerPool.init()}catch(t){console.warn("Failed to initialize worker pool, falling back to sync:",t),this.options.workers=!1}}shouldUseWorkers(){return this.options.workers===!1?!1:this.options.workers===!0?!0:this.pendingPaths>=this.AUTO_WORKER_THRESHOLD}addObstacle(t){return this.obstacles.add(t)}moveObstacle(t,e){this.obstacles.move(t,e)}removeObstacle(t){this.obstacles.remove(t)}getObstacles(){return this.obstacles.values}findPath({from:t,to:e}){return this.shouldUseWorkers()&&this.workerPool?(this.pendingPaths++,this.findPathAsync(t,e).finally(()=>{this.pendingPaths--})):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}async findPathAsync(t,e){return this.options.workers==="auto"&&!this.workerPool&&await this.initWorkerPool(),this.workerPool?this.workerPool.findPath(t,e):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}rebuild(){this.lastVersion!==this.obstacles.version&&(this.grid?.rebuild(),this.graph?.rebuild(),this.lastVersion=this.obstacles.version)}dispose(){this.workerPool&&(this.workerPool.terminate(),this.workerPool=void 0)}getWorkerStatus(){return{workersEnabled:this.options.workers,workerPoolActive:!!this.workerPool,pendingPaths:this.pendingPaths,usingWorkersNow:this.shouldUseWorkers()}}}function W(l,t){const e=[t];let s=d(t.x,t.y);for(;l.has(s);)s=l.get(s),e.push(g(s));return e.reverse()}export{j as NavMesh};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{NavMesh as c}from"./navmesh";let s=null;self.onmessage=o=>{const e=o.data;try{switch(e.type){case"INIT":{if(s=new c(e.navType),e.obstacles)for(const t of e.obstacles)s.addObstacle(t);self.postMessage({type:"READY"});break}case"FIND_PATH":{if(!s)throw new Error("NavMesh not initialized");const t=performance.now(),a=s.findPath({from:e.from,to:e.to}),r=performance.now()-t,n={type:"PATH_RESULT",id:e.id,path:a,duration:r};self.postMessage(n);break}case"ADD_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");const a={type:"OBSTACLE_ADDED",obstacleId:s.addObstacle(e.obstacle)};self.postMessage(a);break}case"REMOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.removeObstacle(e.obstacleId),self.postMessage({type:"OBSTACLE_REMOVED"});break}case"MOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.moveObstacle(e.obstacleId,e.pos),self.postMessage({type:"OBSTACLE_MOVED"});break}}}catch(t){self.postMessage({type:"ERROR",error:t instanceof Error?t.message:String(t)})}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./pooled-codec";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BinaryCodec as T}from"../binary-codec";class b{constructor(e){this.factory=e;this.pool=[]}acquire(){return this.pool.pop()??this.factory()}release(e){this.pool.push(e)}releaseAll(e){this.pool.push(...e)}}class U{constructor(e){this.schema=e;this.pool=new b(()=>this.createNil())}createNil(){const e={};for(const t of Object.keys(this.schema)){const o=this.schema[t];e[t]="toNil"in o?o.toNil():void 0}return e}decode(e){const t=this.pool.acquire();return this.decodeInto(e,t),t}decodeInto(e,t){let o=0;for(const a of Object.keys(this.schema)){const s=this.schema[a];if("decodeAll"in s){const n=s.decodeAll(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else if("decodeField"in s){const n=s.decodeField(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else if("decode"in s){const n=s.decode(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else{const n=s.size||0,i=e.subarray(o,o+n);T.decodeInto({[a]:s},i,t),o+=n}}}release(e){this.pool.release(e)}}class S{constructor(e){this.pooledDecoder=new U(e)}decodeAll(e){return e.map(t=>this.pooledDecoder.decode(t))}releaseAll(e){e.forEach(t=>this.pooledDecoder.release(t))}}class A{constructor(e,t=1024){this.schema=e;this.bufferSize=t;this.pool=new b(()=>new Uint8Array(t))}encode(e){const t=this.pool.acquire();let o=0;for(const a of Object.keys(this.schema)){const s=this.schema[a];if("encode"in s){const n=s.encode(e[a]);t.set(n,o),o+=n.length}else if("encodeAll"in s){const n=s.encodeAll(e[a]);let i=0;for(const r of n)t.set(r,o+i),i+=r.length;o+=i}else{const n=T.encode({[a]:s},{[a]:e[a]});t.set(n,o),o+=n.length}}return t.subarray(0,o)}release(e){this.pool.release(e)}}class O{constructor(e){this.schema=e;this.encoder=new A(e),this.decoder=new U(e)}calculateSize(e){let t=0;for(const o of Object.keys(this.schema)){const a=this.schema[o];"size"in a?t+=a.size:"calculateSize"in a&&(t+=a.calculateSize(e[o]))}return t}encodeInto(e,t,o){const a=new DataView(t.buffer,t.byteOffset);let s=o;for(const n of Object.keys(this.schema)){const i=this.schema[n];if("write"in i)i.write(a,s,e[n]),s+=i.size;else if("encodeInto"in i){const r=i.encodeInto(e[n],t,s);s+=r}else if("encode"in i){const r=i.encode(e[n]);t.set(r,s),s+=r.length}}return s-o}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}release(e){this.decoder.release(e)}static array(e){let t=0;for(const r of Object.keys(e)){const l=e[r];t+=l.size||0}const o=new b(()=>new Uint8Array(16384)),a=new b(()=>{const r={};for(const l of Object.keys(e)){const c=e[l];r[l]="toNil"in c?c.toNil():void 0}return r}),s=new b(()=>[]);let n=null,i=null;return{__arrayType:void 0,calculateSize(r){return 2+r.length*t},encodeInto(r,l,c){const d=new DataView(l.buffer,l.byteOffset);d.setUint16(c,r.length,!1);let y=c+2;for(const h of r)for(const f of Object.keys(e)){const u=e[f];u.write(d,y,h[f]),y+=u.size}return y-c},encode(r){const l=2+r.length*t;let c=o.acquire();c.length<l&&(o.release(c),c=new Uint8Array(Math.max(l,c.length*2))),(!n||n.buffer!==c.buffer)&&(n=new DataView(c.buffer,c.byteOffset)),n.setUint16(0,r.length,!1);let d=2;for(const h of r)for(const f of Object.keys(e)){const u=e[f];u.write(n,d,h[f]),d+=u.size}const y=new Uint8Array(d);return y.set(c.subarray(0,d)),o.release(c),y},decodeField(r){const l=r[0]<<8|r[1],c=s.acquire();c.length=l,(!i||i.buffer!==r.buffer||i.byteOffset!==r.byteOffset)&&(i=new DataView(r.buffer,r.byteOffset));let d=2;for(let y=0;y<l;y++){const h=a.acquire();for(const f of Object.keys(e)){const u=e[f];h[f]=u.read(i,d),d+=u.size}c[y]=h}return{value:c,bytesRead:d}},decode(r){return this.decodeField(r).value},toNil(){return[]}}}}export{b as ObjectPool,S as PooledArrayDecoder,O as PooledCodec,U as PooledDecoder,A as PooledEncoder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./prediction";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(){this.tracker=new Map}get size(){return this.tracker.size}track(t,r){return this.tracker.has(t)||this.tracker.set(t,[]),this.tracker.get(t).push(r),r}dropUpTo(t){const r=[];for(const[e,n]of this.tracker)e<=t?this.tracker.delete(e):r.push([e,n]);return r.sort(([e],[n])=>e-n),r.map(([e,n])=>n).flat()}values(){return Array.from(this.tracker.entries()).sort(([t],[r])=>t-r).map(([t,r])=>r).flat()}}class o{constructor(t){this.options=t;this.tracker=new s}trackIntent(t,r){this.tracker.track(t,r)}onSnapshot(t){this.options.onLoadState(t.state);const r=this.tracker.dropUpTo(t.tick);r.length>0&&this.options.onReplay(r)}replay(t){this.options.onReplay(t)}}export{s as IntentTracker,o as Reconciliator};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./ray-2d";export*from"./ray-3d";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class g{constructor(){this.origin=[0,0];this.direction=[1,0];this._point=[0,0]}set(e,c,o,s){this.origin[0]=e,this.origin[1]=c;const i=Math.sqrt(o*o+s*s);i>0&&(this.direction[0]=o/i,this.direction[1]=s/i)}at(e){return this._point[0]=this.origin[0]+this.direction[0]*e,this._point[1]=this.origin[1]+this.direction[1]*e,this._point}intersectsSegment(e,c,o,s){const i=this.direction[0],n=this.direction[1],u=o-e,r=s-c,t=i*r-n*u;if(Math.abs(t)<1e-10)return null;const h=e-this.origin[0],b=c-this.origin[1],l=(h*r-b*u)/t,m=(h*n-b*i)/t;return l<0||m<0||m>1?null:l}intersectsCircle(e,c,o){const s=this.origin[0]-e,i=this.origin[1]-c,n=2*(s*this.direction[0]+i*this.direction[1]),u=s*s+i*i-o*o,r=n*n-4*u;if(r<0)return null;const t=Math.sqrt(r),h=(-n-t)/2,b=(-n+t)/2;return h>=0?h:b>=0?b:null}intersectsAABB(e,c,o,s){let i=-1/0,n=1/0;if(Math.abs(this.direction[0])<1e-10){if(this.origin[0]<e||this.origin[0]>o)return null}else{const u=1/this.direction[0];let r=(e-this.origin[0])*u,t=(o-this.origin[0])*u;if(r>t){const h=r;r=t,t=h}i=Math.max(i,r),n=Math.min(n,t)}if(Math.abs(this.direction[1])<1e-10){if(this.origin[1]<c||this.origin[1]>s)return null}else{const u=1/this.direction[1];let r=(c-this.origin[1])*u,t=(s-this.origin[1])*u;if(r>t){const h=r;r=t,t=h}i=Math.max(i,r),n=Math.min(n,t)}return i>n||n<0?null:i>=0?i:n}}export{g as Ray2D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class j{constructor(){this.origin=[0,0,0];this.direction=[0,0,1];this._point=[0,0,0]}set(n,e,s,o,t,r){this.origin[0]=n,this.origin[1]=e,this.origin[2]=s;const i=Math.sqrt(o*o+t*t+r*r);i>0&&(this.direction[0]=o/i,this.direction[1]=t/i,this.direction[2]=r/i)}at(n){return this._point[0]=this.origin[0]+this.direction[0]*n,this._point[1]=this.origin[1]+this.direction[1]*n,this._point[2]=this.origin[2]+this.direction[2]*n,this._point}intersectsPlane(n,e,s,o){const t=n*this.direction[0]+e*this.direction[1]+s*this.direction[2];if(Math.abs(t)<1e-10)return null;const r=(o-(n*this.origin[0]+e*this.origin[1]+s*this.origin[2]))/t;return r>=0?r:null}intersectsSphere(n,e,s,o){const t=this.origin[0]-n,r=this.origin[1]-e,i=this.origin[2]-s,u=2*(t*this.direction[0]+r*this.direction[1]+i*this.direction[2]),g=t*t+r*r+i*i-o*o,m=u*u-4*g;if(m<0)return null;const c=Math.sqrt(m),b=(-u-c)/2,h=(-u+c)/2;return b>=0?b:h>=0?h:null}intersectsAABB(n,e,s,o,t,r){let i=-1/0,u=1/0;const g=[[this.direction[0],this.origin[0],n,o,0],[this.direction[1],this.origin[1],e,t,1],[this.direction[2],this.origin[2],s,r,2]];for(const[m,c,b,h]of g){if(Math.abs(m)<1e-10){if(c<b||c>h)return null}else{const d=1/m;let l=(b-c)*d,f=(h-c)*d;if(l>f){const a=l;l=f,f=a}i=Math.max(i,l),u=Math.min(u,f)}if(i>u)return null}return u<0?null:i>=0?i:u}intersectsTriangle(n,e,s,o,t,r,i,u,g){const m=o-n,c=t-e,b=r-s,h=i-n,d=u-e,l=g-s,f=this.direction[0],a=this.direction[1],p=this.direction[2],v=a*l-p*d,z=p*h-f*l,A=f*d-a*h,B=m*v+c*z+b*A;if(Math.abs(B)<1e-10)return null;const M=1/B,x=this.origin[0]-n,q=this.origin[1]-e,y=this.origin[2]-s,_=M*(x*v+q*z+y*A);if(_<0||_>1)return null;const D=q*b-y*c,I=y*m-x*b,P=x*c-q*m,R=M*(f*D+a*I+p*P);if(R<0||_+R>1)return null;const S=M*(h*D+d*I+l*P);return S>=0?S:null}}export{j as Ray3D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./simple-rng";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(t){this.state=(t??Math.random()*2147483647)|0,this.state===0&&(this.state=1)}rand(){return this.state=this.state*1664525+1013904223&2147483647,this.state/2147483647}range(t,e){return t+this.rand()*(e-t)}int(t,e){return t+(this.rand()*(e-t+1)|0)}chance(t){return this.rand()<t}pick(t){return t[this.rand()*t.length|0]}seed(t){this.state=t|0,this.state===0&&(this.state=1)}}export{s as SimpleRNG};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./sparse-batcher";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class n{constructor(i){this.BUCKET_INITIAL_SIZE=256;this.buckets=new Map;this.bucketSizes=new Uint32Array(n.MAX_BUCKETS);this.activeBuckets=new Uint16Array(n.MAX_BUCKETS);this.sortBuffer=new Uint16Array(n.MAX_BUCKETS);this.activeCount=0;this.capacity=i}static{this.MAX_LAYERS=256}static{this.MAX_SHEETS=64}static{this.MAX_BUCKETS=n.MAX_LAYERS*n.MAX_SHEETS}key(i,e){return i*n.MAX_SHEETS+e}add(i,e,r){const t=this.key(i,e);this.buckets.has(t)||(this.buckets.set(t,new Uint32Array(this.BUCKET_INITIAL_SIZE)),this.activeBuckets[this.activeCount++]=t);const u=this.buckets.get(t);if(this.bucketSizes[t]>=u.length){const s=new Uint32Array(u.length*2);s.set(u),this.buckets.set(t,s)}this.buckets.get(t)[this.bucketSizes[t]++]=r}remove(i,e,r){const t=this.key(i,e),u=this.bucketSizes[t];if(u===0)return;const c=this.buckets.get(t);for(let s=0;s<u;s++)if(c[s]===r){c[s]=c[u-1],this.bucketSizes[t]--;break}if(this.bucketSizes[t]===0){for(let s=0;s<this.activeCount;s++)if(this.activeBuckets[s]===t){this.activeBuckets[s]=this.activeBuckets[--this.activeCount];break}}}each(i){this.sortBuffer.set(this.activeBuckets.subarray(0,this.activeCount));for(let e=1;e<this.activeCount;e++){const r=this.sortBuffer[e];let t=e-1;for(;t>=0&&this.sortBuffer[t]>r;)this.sortBuffer[t+1]=this.sortBuffer[t--];this.sortBuffer[t+1]=r}for(let e=0;e<this.activeCount;e++){const r=this.sortBuffer[e],t=r%n.MAX_SHEETS,u=this.bucketSizes[r];i(t,this.buckets.get(r).subarray(0,u),u)}}getActiveCount(){return this.activeCount}getTotalCount(){let i=0;for(let e=0;e<this.activeCount;e++)i+=this.bucketSizes[this.activeBuckets[e]];return i}clear(){this.buckets.clear(),this.bucketSizes.fill(0),this.activeCount=0}}export{n as SparseBatcher};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class l{constructor(e,s){this.component=e,this.maxEntities=s,this.stride=e.size,this.fieldKeys=e.fieldNames,this.fields=[],this.fieldIndexMap={},this.arrays=[];for(let r=0;r<this.fieldKeys.length;r++){const a=this.fieldKeys[r],i=e.schema[a];switch(this.fields.push(i),this.fieldIndexMap[a]=r,i.size){case 4:i.read.toString().includes("getFloat32")?this.arrays.push(new Float32Array(s)):i.read.toString().includes("getInt32")?this.arrays.push(new Int32Array(s)):this.arrays.push(new Uint32Array(s));break;case 2:this.arrays.push(new Uint16Array(s));break;case 1:this.arrays.push(new Uint8Array(s));break;default:this.arrays.push(new Uint8Array(s*i.size))}}this.reusableObject={};for(let r=0;r<this.fieldKeys.length;r++)this.reusableObject[this.fieldKeys[r]]=this.fields[r].toNil()}get(e){const s=this.fields.length;if(s===2)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e];else if(s===3)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][e];else if(s===4)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][e],this.reusableObject[this.fieldKeys[3]]=this.arrays[3][e];else for(let r=0;r<s;r++)this.reusableObject[this.fieldKeys[r]]=this.arrays[r][e];return this.reusableObject}getMutable(e){const s={};return this.copyTo(e,s),s}copyTo(e,s){for(let r=0;r<this.fields.length;r++)s[this.fieldKeys[r]]=this.arrays[r][e]}set(e,s){const r=this.fields.length;if(r===2)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]];else if(r===3)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]],this.arrays[2][e]=s[this.fieldKeys[2]];else if(r===4)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]],this.arrays[2][e]=s[this.fieldKeys[2]],this.arrays[3][e]=s[this.fieldKeys[3]];else for(let a=0;a<r;a++)this.arrays[a][e]=s[this.fieldKeys[a]]}update(e,s){for(const r in s){const a=this.fieldIndexMap[r];this.arrays[a][e]=s[r]}}clear(e){for(let s=0;s<this.fields.length;s++)this.arrays[s][e]=this.fields[s].toNil()}getRawArrays(){return this.arrays}getFieldArray(e){const s=this.fieldIndexMap[e];return this.arrays[s]}getStride(){return this.stride}}export{l as ComponentStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{PooledCodec as c}from"../core/pooled-codec";function i(n){let e=0;for(const o of Object.keys(n))e+=n[o].size;return e}function p(n,e){const o=i(e),t=Object.keys(e),r=t.length,a=c.array(e);return{name:n,schema:e,size:o,fieldCount:r,fieldNames:t,arrayCodec:a}}export{p as defineComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(t,e){this.world=t;this._id=e;this.isBatching=!1}static{this.batchArrays=[]}static{this.batchIndices=[]}static{this.batchValues=[]}static{this.batchLength=0}static{this.preparedComponents=[]}static{this.preparedCount=0}_reset(t){this._id=t}getComponentIndex(t){let e=t.__cachedIndex;return e===void 0&&(e=t.__worldIndex,t.__cachedIndex=e),e}field(t,e){const n=`__fieldCache_${String(e)}`;let r=t[n];if(r===void 0){const i=this.getComponentIndex(t);r=this.world.componentStoresArray[i].getFieldArray(e),t[n]=r}return r}add(t,e){return this.world.add(this._id,t,e),this}get(t){if(this.isBatching){const n=t.__batchCache;if(n!==void 0)return n}const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].get(this._id)}prepare(...t){if(this.isBatching){const e=s.preparedComponents;let n=s.preparedCount;for(let r=0;r<t.length;r++){const i=t[r],a=this.getComponentIndex(i),o=this.world.componentStoresArray[a].get(this._id);i.__batchCache=o,n<e.length?e[n]=i:e.push(i),n++}s.preparedCount=n}return this}update(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].update(this._id,e),this}setFields(t,e){const n=this.getComponentIndex(t),r=this.world.componentStoresArray[n],i=r.getMutable(this._id);return e(i),r.set(this._id,i),this}setField(t,e,n){const r=this.getComponentIndex(t),a=this.world.componentStoresArray[r].getFieldArray(e);if(this.isBatching){const o=s.batchLength;s.batchArrays[o]=a,s.batchIndices[o]=this._id,s.batchValues[o]=n,s.batchLength++}else a[this._id]=n;return this}getField(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].getFieldArray(e)[this._id]}set(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].set(this._id,e),this}has(t){return this.world.has(this._id,t)}remove(t){return this.world.remove(this._id,t),this}despawn(){this.world.despawn(this._id)}isAlive(){return this.world.isAlive(this._id)}get id(){return this._id}getMutable(t){const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].getMutable(this._id)}beginUpdate(){return this.isBatching=!0,s.batchLength=0,this}flush(){const t=s.batchArrays,e=s.batchIndices,n=s.batchValues,r=s.batchLength;for(let o=0;o<r;o++)t[o][e[o]]=n[o];const i=s.preparedComponents,a=s.preparedCount;for(let o=0;o<a;o++){const h=i[o];h.__batchCache=void 0}return this.isBatching=!1,s.batchLength=0,s.preparedCount=0,this}}export{s as EntityHandle};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineComponent as t}from"./component";import{ComponentStore as p}from"./component-store";import{World as m}from"./world";import{EntityHandle as f}from"./entity-handle";export{p as ComponentStore,f as EntityHandle,m as World,t as defineComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class y{constructor(t,n,s,r,e){this.world=t;this.components=n;this.fieldMappings=s;this.userCallback=r;this.conditionPredicate=e}query(...t){return new y(this.world,t,this.fieldMappings,this.userCallback,this.conditionPredicate)}fields(t){return new y(this.world,this.components,t,this.userCallback,this.conditionPredicate)}when(t){if(!this.fieldMappings)throw new Error("Must call .fields() before .when()");const n={};for(let e=0;e<this.components.length;e++){const o=this.components[e],i=this.fieldMappings[e];if(!i)continue;const a=Object.keys(i)[0],x=i[a];for(const f of x){const m=`${a}_${f}`,d=this.world.getFieldArray(o,f);n[m]=d}}const s={eid:0};for(const e in n){const o=n[e];Object.defineProperty(s,e,{get(){return o[this.eid]},set(i){o[this.eid]=i},enumerable:!0,configurable:!1}),s[`${e}_array`]=o}Object.seal(s);const r=t;return new y(this.world,this.components,this.fieldMappings,this.userCallback,r)}run(t){return new y(this.world,this.components,this.fieldMappings,t,this.conditionPredicate).buildAndRegister()}buildAndRegister(){if(!this.userCallback)throw new Error("System callback must be set");if(!this.fieldMappings)throw new Error("Field mappings must be set");const t=this.world,n=this.components,s=this.fieldMappings,r=this.userCallback,e={},o={},i=[];for(let d=0;d<n.length;d++){const p=n[d],l=s[d];if(!l)continue;const c=Object.keys(l)[0],g=l[c];i.push(c),o[c]=p,e[c]={};for(const u of g){const C=t.getFieldArray(p,u);e[c][u]=C}}const a=[];for(const d of i){const p=e[d];for(const l in p)a.push({prop:`${d}_${l}`,array:p[l]})}t.query(...n);const x=t._getQueryMaskKey(n),f=t.getQueryMask(n),m=new h(t,n,r,a,x,f,this.conditionPredicate);return t._registerSystem(m),m}}class h{constructor(t,n,s,r,e,o,i){this.world=t;this.components=n;this.userCallback=s;this.fieldDescs=r;this.queryMaskKey=e;this.queryMask=o;this.conditionPredicate=i;this.proxyEntity=this.createProxyEntity()}execute(t){const n=this.world._queryByMaskKey(this.queryMaskKey,this.queryMask),s=this.userCallback,r=this.world,e=this.proxyEntity,o=n.length;if(this.conditionPredicate){const i=this.conditionPredicate;for(let a=0;a<o;a++)e.eid=n[a],i(e)&&s(e,t,r)}else for(let i=0;i<o;i++)e.eid=n[i],s(e,t,r)}createProxyEntity(){const t=this.world,n={eid:0,despawn(){t.despawn(this.eid)}};for(let s=0;s<this.fieldDescs.length;s++){const{prop:r,array:e}=this.fieldDescs[s];n[`${r}_array`]=e,Object.defineProperty(n,r,{get(){return e[this.eid]},set(o){e[this.eid]=o},enumerable:!0,configurable:!1})}return Object.seal(n),Object.preventExtensions(n),n}getComponents(){return this.components}}export{h as ExecutableSystem,y as SystemBuilder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SystemBuilder as t}from"./system-builder";class S{constructor(){this.registeredSystems=[]}addSystem(){return new t(this,[],void 0,void 0)}runSystems(e){for(let s=0;s<this.registeredSystems.length;s++)this.registeredSystems[s].execute(e)}_registerSystem(e){this.registeredSystems.push(e)}}export{S as WorldSystems};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateId as E}from"../core/generate-id";import{ComponentStore as v}from"./component-store";import{EntityHandle as C}from"./entity-handle";import{WorldSystems as g}from"./world-systems";class B extends g{constructor(t){super();this.nextEntityId=0;this.freeEntityHead=0;this.freeEntityTail=0;this.freeEntityCount=0;this.freeEntityMask=0;this.aliveEntitiesArray=[];this.numMaskWords=0;this.components=[];this.queryResultBuffers={};this.archetypeVersion=0;this.queryCacheVersions={};this.queryMaskCache={};this.despawnedCount=0;this.worldId=E({prefix:"world_"});this.maxEntities=t.maxEntities??1e4,this.numMaskWords=Math.ceil(t.components.length/32),this.componentMasks=[];for(let n=0;n<this.numMaskWords;n++)this.componentMasks.push(new Uint32Array(this.maxEntities));this.numMaskWords>0&&(this.componentMasks0=this.componentMasks[0]);const e=Math.pow(2,Math.ceil(Math.log2(this.maxEntities)));this.freeEntityIds=new Uint32Array(e),this.freeEntityMask=e-1,this.aliveEntitiesIndices=new Uint32Array(this.maxEntities),this.aliveEntityFlags=new Uint8Array(this.maxEntities),this.despawnedBuffer=new Uint32Array(this.maxEntities),this.componentStoresArray=new Array(t.components.length),t.components.forEach((n,s)=>{this.components.push(n),n.__worldIndex=s;const c=new v(n,this.maxEntities);this.componentStoresArray[s]=c})}getComponentIndex(t){const e=t.__worldIndex;if(e===void 0){const n=this.components.map(s=>s.name).join(", ");throw new Error(`Component ${t.name} not registered in World[${this.worldId}]. Registered components: [${n}]. Did you forget to include it in the WorldConfig?`)}return e}setComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]|=1<<s}clearComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]&=~(1<<s)}hasComponentBit(t,e){const n=e>>>5,s=e&31;return(this.componentMasks[n][t]&1<<s)!==0}clearAllComponentBits(t){if(this.numMaskWords===1)this.componentMasks0[t]=0;else if(this.numMaskWords===2)this.componentMasks0[t]=0,this.componentMasks[1][t]=0;else if(this.numMaskWords===3)this.componentMasks0[t]=0,this.componentMasks[1][t]=0,this.componentMasks[2][t]=0;else for(let e=0;e<this.numMaskWords;e++)this.componentMasks[e][t]=0}matchesComponentMask(t,e){const n=e.length;if(n===1)return(this.componentMasks0[t]&e[0])===e[0];if(n===2)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1];if(n===3)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2];if(n===4)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2]&&(this.componentMasks[3][t]&e[3])===e[3];for(let s=0;s<n;s++)if((this.componentMasks[s][t]&e[s])!==e[s])return!1;return!0}getQueryMask(t){const e=t.map(i=>i.name).sort().join(","),n=this.queryMaskCache[e];if(n)return n;let s=-1;const c=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)return null;c.push(o),o>s&&(s=o)}const h=Math.floor(s/32)+1,p=new Array(h).fill(0);for(const i of c){const o=i>>>5,r=i&31;p[o]|=1<<r}return this.queryMaskCache[e]=p,p}maskToKey(t){let e="";for(let n=0;n<t.length;n++)t[n]!==0&&(e+=`${n}:${t[n].toString(36)},`);return e}_getQueryMaskKey(t){const e=this.getQueryMask(t);return e?this.maskToKey(e):""}_queryByMaskKey(t,e){let n=this.queryResultBuffers[t];if(n||(n=[],this.queryResultBuffers[t]=n),this.queryCacheVersions[t]===this.archetypeVersion)return n;const s=this.aliveEntitiesArray,c=s.length,h=e.length;let p=0;if(h===1){const i=e[0],o=this.componentMasks0;for(let r=0;r<c;r++){const a=s[r];(o[a]&i)===i&&(n[p++]=a)}}else if(h===2){const i=e[0],o=e[1],r=this.componentMasks0,a=this.componentMasks[1];for(let m=0;m<c;m++){const l=s[m];(r[l]&i)===i&&(a[l]&o)===o&&(n[p++]=l)}}else if(h===3){const i=e[0],o=e[1],r=e[2],a=this.componentMasks0,m=this.componentMasks[1],l=this.componentMasks[2];for(let y=0;y<c;y++){const d=s[y];(a[d]&i)===i&&(m[d]&o)===o&&(l[d]&r)===r&&(n[p++]=d)}}else if(h===4){const i=e[0],o=e[1],r=e[2],a=e[3],m=this.componentMasks0,l=this.componentMasks[1],y=this.componentMasks[2],d=this.componentMasks[3];for(let f=0;f<c;f++){const u=s[f];(m[u]&i)===i&&(l[u]&o)===o&&(y[u]&r)===r&&(d[u]&a)===a&&(n[p++]=u)}}else{const i=this.componentMasks;t:for(let o=0;o<c;o++){const r=s[o];for(let a=0;a<h;a++)if((i[a][r]&e[a])!==e[a])continue t;n[p++]=r}}return n.length=p,this.queryCacheVersions[t]=this.archetypeVersion,n}spawn(){let t=this.nextEntityId;if(this.freeEntityCount>0?(t=this.freeEntityIds[this.freeEntityTail],this.freeEntityTail=this.freeEntityTail+1&this.freeEntityMask,this.freeEntityCount--):this.nextEntityId++,t>=this.maxEntities)throw new Error(`Maximum entities (${this.maxEntities}) reached. Current alive: ${this.aliveEntitiesArray.length}, Free list: ${this.freeEntityCount}`);return this.aliveEntityFlags[t]=1,this.aliveEntitiesIndices[t]=this.aliveEntitiesArray.length,this.aliveEntitiesArray.push(t),this.clearAllComponentBits(t),this.invalidateQueryCache(),t}despawn(t){if(this.aliveEntityFlags[t]===0)return;this.despawnedBuffer[this.despawnedCount++]=t,this.aliveEntityFlags[t]=0;const e=this.aliveEntitiesIndices[t],n=this.aliveEntitiesArray.length-1;if(e!==n){const h=this.aliveEntitiesArray[n];this.aliveEntitiesArray[e]=h,this.aliveEntitiesIndices[h]=e}this.aliveEntitiesArray.pop();const s=this.componentStoresArray,c=this.components.length;for(let h=0;h<c;h++)this.hasComponentBit(t,h)&&s[h].clear(t);this.clearAllComponentBits(t),this.freeEntityIds[this.freeEntityHead]=t,this.freeEntityHead=this.freeEntityHead+1&this.freeEntityMask,this.freeEntityCount++,this.invalidateQueryCache()}isAlive(t){return this.aliveEntityFlags[t]===1}getDespawned(){return this.despawnedBuffer.subarray(0,this.despawnedCount)}flushDespawned(){this.despawnedCount=0}invalidateQueryCache(){this.archetypeVersion++}add(t,e,n){if(this.aliveEntityFlags[t]===0)throw new Error(`Cannot add component ${e.name} to entity ${t}: entity is not alive (was it despawned?). Current alive entities: ${this.aliveEntitiesArray.length}`);const s=this.getComponentIndex(e),c=this.componentStoresArray[s];this.setComponentBit(t,s),c.set(t,n),this.invalidateQueryCache()}remove(t,e){const n=e.__worldIndex;if(n===void 0)return;this.clearComponentBit(t,n);const s=this.componentStoresArray[n];s&&s.clear(t),this.invalidateQueryCache()}has(t,e){const n=e.__worldIndex;return n===void 0?!1:this.hasComponentBit(t,n)}get(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n)){const s=this.getEntityComponentNames(t);throw new Error(`Cannot get component ${e.name} from entity ${t}: entity does not have this component. Entity has: [${s.join(", ")}]. Did you forget to call world.add()?`)}return this.componentStoresArray[n].get(t)}getMutable(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n))throw new Error(`Entity ${t} does not have component ${e.name}`);return this.componentStoresArray[n].getMutable(t)}set(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Cannot set component ${e.name} on entity ${t}: entity does not have this component. Use add() first.`);this.componentStoresArray[s].set(t,n)}update(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Entity ${t} does not have component ${e.name}`);this.componentStoresArray[s].update(t,n)}query(...t){const e=this.getQueryMask(t);if(e===null)return[];const n=this.maskToKey(e);let s=this.queryResultBuffers[n];if(s||(s=[],this.queryResultBuffers[n]=s),this.queryCacheVersions[n]===this.archetypeVersion)return s;const c=this.aliveEntitiesArray,h=c.length,p=e.length;let i=0;if(p===1){const o=e[0],r=this.componentMasks0;for(let a=0;a<h;a++){const m=c[a];(r[m]&o)===o&&(s[i++]=m)}}else for(let o=0;o<h;o++){const r=c[o];this.matchesComponentMask(r,e)&&(s[i++]=r)}return s.length=i,this.queryCacheVersions[n]=this.archetypeVersion,s}getEntities(){return this.aliveEntitiesArray}getEntityCount(){return this.aliveEntitiesArray.length}getMaxEntities(){return this.maxEntities}getComponents(){return this.components}getEntityComponentNames(t){const e=[];for(let n=0;n<this.components.length;n++)this.hasComponentBit(t,n)&&e.push(this.components[n].name);return e}serialize(t,e){const n=e??Array.from(this.aliveEntitiesArray),s=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)continue;const r=this.componentStoresArray[o];if(!r)continue;const a=[];for(const m of n)this.has(m,i)&&a.push({entity:m,...r.getMutable(m)});if(a.length>0){const m=i.arrayCodec.encode(a);s.push(m)}}const c=s.reduce((i,o)=>i+o.length,0),h=new Uint8Array(c);let p=0;for(const i of s)h.set(i,p),p+=i.length;return h}deserialize(t,e){throw new Error("Deserialization not yet implemented")}getFieldArray(t,e){const n=this.getComponentIndex(t);return this.componentStoresArray[n].getFieldArray(e)}entity(t){return new C(this,t)}}export{B as World};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./loop";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./loop";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createDriver as d,EventSystem as T,FixedTicker as _}from"../../core";import{InputManager as y,BrowserInputSource as E}from"../../core/input";class C{constructor(e){this.options=e;this.fps=0;this.status="stopped";this._tickData={deltaTime:0,tick:0,input:null};this._skipData={ticks:0};this._renderData={deltaTime:0,alpha:0,input:null};const a=new Set(["client","manual-client"]),r=new Set(["manual-client","manual-server"]);this._isClient=a.has(this.options.type),this._isManual=r.has(this.options.type);const c=["pre-tick","tick","post-tick","skip","start","stop","toggle-pause"];this._isClient&&c.push("render"),this.events=new T({events:c}),this._input=new y;const p=this.events;if(this.ticker=new _({rate:this.options.tickRate,onTick:(t,s=0)=>{const i=this._input.snapshot();this._tickData.deltaTime=t,this._tickData.tick=s,this._tickData.input=i,p.emit("pre-tick",this._tickData),this.options.onTick?.(t,s,i),p.emit("tick",this._tickData),p.emit("post-tick",this._tickData)},onTickSkipped:t=>{this._skipData.ticks=t,p.emit("skip",this._skipData)}}),this._isManual||(this._driver=d(this.options.type,t=>{this.step(t)})),this._isClient){const t=this.events,s=Math.round(this.options.tickRate/2),i=new Array(s).fill(0);let u=0,h=performance.now(),l=0,o=0;t.on("tick",()=>{l=(l+1)%s;const m=performance.now(),v=m-h;if(v>0){const n=u*1e3/v;i[l]=n,o<s&&o++}u=0,h=m;let k=0;for(let n=0;n<o;n++)k+=i[n];this.fps=Math.round(k/o)}),t.on("render",()=>{u++})}}step(e){if(this.ticker.tick(e),this._isClient){const a=this._input.peek(),r=this.ticker.alpha;this.options.onRender?.(e,r,a),this._renderData.deltaTime=e,this._renderData.alpha=r,this._renderData.input=a,this.events.emit("render",this._renderData)}}pause(){this._driver&&this._driver.stop(),this.status="paused",this.events.emit("toggle-pause",{paused:!0,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}resume(){this._driver&&this._driver.start(),this.status="running",this.events.emit("toggle-pause",{paused:!1,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}start(){if(this._driver&&this._driver.start(),this.status="running",this.events.emit("start",{startedAt:Date.now()}),this._isClient){const e=new E(document,document.body);this._input.listen(e)}}stop(){this._driver&&this._driver.stop(),this.ticker.resetTickCount(),this.status="stopped",this.events.emit("stop",{stoppedAt:Date.now()}),this._isClient&&this._input.unlisten()}}export{C as GameLoop};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./core";export*from"./protocol";export*from"./net";export*from"./ecs";export*from"./game";export*from"./renderer";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e){this.openHandler=null;this.messageHandler=null;this.closeHandler=null;this.errorHandler=null;this.isOpen=!1;this.pendingMessages=[];this.ws=new WebSocket(e),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{this.isOpen=!0;for(const s of this.pendingMessages)this.ws.send(s);this.pendingMessages=[],this.openHandler&&this.openHandler()},this.ws.onmessage=s=>{this.messageHandler&&s.data instanceof ArrayBuffer&&this.messageHandler(new Uint8Array(s.data))},this.ws.onclose=()=>{this.isOpen=!1,this.closeHandler&&this.closeHandler()},this.ws.onerror=()=>{this.errorHandler&&this.errorHandler(new Error("WebSocket error"))}}send(e){this.isOpen&&this.ws.readyState===WebSocket.OPEN?this.ws.send(e):this.ws.readyState===WebSocket.CONNECTING&&this.pendingMessages.push(e)}onMessage(e){this.messageHandler=e}onOpen(e){this.openHandler=e}onClose(e){this.closeHandler=e}onError(e){this.errorHandler=e}close(){this.ws.close()}}export{i as BrowserWebSocketClientTransport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateId as c}from"../../core/generate-id/generate-id";class a{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e,this.setupHandlers()}send(e){this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}setupHandlers(){this.socket.binaryType="arraybuffer",this.socket.addEventListener("message",e=>{if(e.data instanceof ArrayBuffer){const r=new Uint8Array(e.data);for(const t of this.messageHandlers)t(r)}else{const r=new Error(`Unexpected message type: ${typeof e.data}`);for(const t of this.errorHandlers)t(r)}}),this.socket.addEventListener("close",()=>{for(const e of this.closeHandlers)e()}),this.socket.addEventListener("error",()=>{const e=new Error("WebSocket error");for(const r of this.errorHandlers)r(e)})}static connect(e){return new Promise((r,t)=>{const o=new WebSocket(e),s=new a(o);o.addEventListener("open",()=>{r(s)}),o.addEventListener("error",n=>{t(n)})})}}class p{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e}send(e){this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}_handleOpen(){}_handleMessage(e){for(const r of this.messageHandlers)r(e)}_handleClose(){for(const e of this.closeHandlers)e()}_handleError(e){for(const r of this.errorHandlers)r(e)}}class d{constructor(e){this.peers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.server=e}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}getPeer(e){return this.peers.get(e)}getPeerIds(){return Array.from(this.peers.keys())}close(){this.server.stop(),this.peers.clear()}_registerPeer(e){const r=c({prefix:"peer_"}),t=new p(e);this.peers.set(r,t);for(const o of this.connectionHandlers)o(t,r);return r}_handlePeerMessage(e,r){const t=this.peers.get(e);t&&t._handleMessage(r)}_handlePeerDisconnection(e){const r=this.peers.get(e);if(r){r._handleClose(),this.peers.delete(e);for(const t of this.disconnectionHandlers)t(e)}}_handlePeerConnection(e){const r=this.peers.get(e);if(r)for(const t of this.connectionHandlers)t(r,e)}static create(e){const r=new WeakMap;let t;const o=Bun.serve({port:e,fetch(s,n){if(!n.upgrade(s))return new Response("Expected WebSocket connection",{status:400})},websocket:{open(s){const n=t._registerPeer(s);r.set(s,n),t._handlePeerConnection(n),t.connectionHandlers.forEach(i=>i(t.getPeer(n),n))},message(s,n){const i=r.get(s);i&&n instanceof Uint8Array?t._handlePeerMessage(i,n):i&&n instanceof ArrayBuffer&&t._handlePeerMessage(i,new Uint8Array(n))},close(s){const n=r.get(s);n&&(t._handlePeerDisconnection(n),r.delete(s))}}});return t=new d(o),t}}export{a as BunWebSocketClientTransport,p as BunWebSocketPeerTransport,d as BunWebSocketServerTransport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ObjectPool as l}from"../core/pooled-codec/pooled-codec";class f{constructor(s=256,e=!1){this.pools=new Map;this.sizeClass=s,this.zeroBuffersOnRelease=e}wrap(s,e){const o=1+e.byteLength,r=Math.ceil(o/this.sizeClass)*this.sizeClass;let t=this.pools.get(r);t||(t=new l(()=>new Uint8Array(r)),this.pools.set(r,t));const i=t.acquire();return i[0]=s,i.set(e,1),i.subarray(0,o)}release(s){const e=s.buffer.byteLength;if(e%this.sizeClass!==0)return;const o=this.pools.get(e);if(!o)return;const r=new Uint8Array(s.buffer);this.zeroBuffersOnRelease&&r.fill(0),o.release(r)}getStats(){return{poolSizes:Array.from(this.pools.keys()).sort((s,e)=>s-e)}}clear(){this.pools.clear()}}export{f as MessageWrapperPool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MessageType as i}from"./types";class d{constructor(t){this.snapshotHandlers=new Map;this.rpcHandlers=new Map;this.connectHandlers=[];this.disconnectHandlers=[];this.errorHandlers=[];this.connected=!1;this.lastSentIntents=new Map;this.messageCount=0;this.messageCountWindow=Date.now();this.heartbeatTimer=null;this.lastMessageReceivedAt=Date.now();this.transport=t.transport,this.intentRegistry=t.intentRegistry,this.snapshotRegistry=t.snapshotRegistry,this.rpcRegistry=t.rpcRegistry,this.config={maxMessageSize:t.config?.maxMessageSize??65536,debug:t.config?.debug??!1,enableBufferPooling:t.config?.enableBufferPooling??!0,maxMessagesPerSecond:t.config?.maxMessagesPerSecond??60,maxSendQueueSize:t.config?.maxSendQueueSize??100,heartbeatInterval:t.config?.heartbeatInterval??3e4,heartbeatTimeout:t.config?.heartbeatTimeout??6e4,lagSimulation:t.config?.lagSimulation},this.lagSimulation=t.config?.lagSimulation,this.setupTransportHandlers(),this.setupHeartbeat()}hasIntentChanged(t,e){const r=this.lastSentIntents.get(t.kind);if(!r)return!0;if(e)return e(r,t);const{tick:s,...n}=r,{tick:h,...o}=t;return JSON.stringify(n)!==JSON.stringify(o)}sendIntent(t){if(!this.connected){this.log("Cannot send intent: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping intent");return}try{const e=this.intentRegistry.encode(t),r=new Uint8Array(1+e.byteLength);r[0]=i.INTENT,r.set(e,1),this.transport.send(r),this.lastSentIntents.set(t.kind,{...t}),this.log(`Sent intent (kind: ${t.kind}, tick: ${t.tick})`)}catch(e){this.log(`Failed to send intent: ${e}`)}}onSnapshot(t,e){let r=this.snapshotHandlers.get(t);return r||(r=[],this.snapshotHandlers.set(t,r)),r.push(e),()=>{const s=this.snapshotHandlers.get(t);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}sendRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");if(!this.connected){this.log("Cannot send RPC: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping RPC");return}try{const r=this.rpcRegistry.encode(t,e),s=new Uint8Array(1+r.byteLength);s[0]=i.CUSTOM,s.set(r,1),this.transport.send(s),this.log(`Sent RPC (method: ${t.method})`)}catch(r){this.log(`Failed to send RPC: ${r}`)}}onRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");let r=this.rpcHandlers.get(t.method);return r||(r=[],this.rpcHandlers.set(t.method,r)),r.push(e),()=>{const s=this.rpcHandlers.get(t.method);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}onConnect(t){return this.connectHandlers.push(t),()=>{const e=this.connectHandlers.indexOf(t);e>-1&&this.connectHandlers.splice(e,1)}}onDisconnect(t){return this.disconnectHandlers.push(t),()=>{const e=this.disconnectHandlers.indexOf(t);e>-1&&this.disconnectHandlers.splice(e,1)}}onError(t){return this.errorHandlers.push(t),()=>{const e=this.errorHandlers.indexOf(t);e>-1&&this.errorHandlers.splice(e,1)}}isConnected(){return this.connected}disconnect(){return this.log("Disconnecting..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onOpen?this.transport.onOpen(()=>{this.log("Connected to server"),this.connected=!0,this.lastMessageReceivedAt=Date.now(),this.notifyConnectHandlers()}):(this.connected=!0,this.lastMessageReceivedAt=Date.now()),this.transport.onMessage(t=>{const e=this.getLagDelay();if(e>0){const r=new Uint8Array(t);setTimeout(()=>{this.handleMessage(r)},e)}else this.handleMessage(t)}),this.transport.onClose(()=>{this.handleDisconnection()}),this.transport.onError&&this.transport.onError(t=>{this.handleError(t)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeat()},this.config.heartbeatInterval))}checkHeartbeat(){const e=Date.now()-this.lastMessageReceivedAt;if(e>this.config.heartbeatTimeout){this.log(`Server timed out (no message for ${e}ms)`),this.disconnect();return}try{const r=new Uint8Array([i.HEARTBEAT]);this.transport.send(r)}catch(r){this.log(`Failed to send heartbeat: ${r}`)}}handleMessage(t){if(this.lastMessageReceivedAt=Date.now(),t.byteLength===0){this.log("Received empty message from server");return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const e=t[0],r=t.subarray(1);switch(e){case i.SNAPSHOT:this.handleSnapshot(r);break;case i.HEARTBEAT:this.log("Received heartbeat from server");break;case i.CUSTOM:this.handleRPC(r);break;default:this.log(`Unknown message type: ${e}`)}}handleSnapshot(t){try{const e=this.snapshotRegistry.decode(t);this.log(`Received snapshot (type: ${e.type}, tick: ${e.snapshot.tick})`);const r=this.snapshotHandlers.get(e.type);if(r&&r.length>0)for(const s of r)try{s(e.snapshot)}catch(n){this.log(`Error in snapshot handler: ${n}`)}else this.log(`No handler registered for snapshot type: ${e.type}`);this.snapshotRegistry.release(e.type,e.snapshot.updates)}catch(e){this.log(`Failed to decode snapshot: ${e}`)}}handleRPC(t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}try{const e=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${e.method})`);const r=this.rpcHandlers.get(e.method);if(r&&r.length>0)for(const s of r)try{s(e.data)}catch(n){this.log(`Error in RPC handler: ${n}`)}else this.log(`No handler registered for RPC method: ${e.method}`);this.rpcRegistry.release(e.method,e.data)}catch(e){this.log(`Failed to decode RPC: ${e}`)}}handleDisconnection(){this.log("Disconnected from server"),this.connected=!1,this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.notifyDisconnectHandlers()}notifyConnectHandlers(){for(const t of this.connectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in connect handler: ${e}`)}}notifyDisconnectHandlers(){for(const t of this.disconnectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in disconnect handler: ${e}`)}}handleError(t){this.log(`Transport error: ${t.message}`),this.notifyErrorHandlers(t)}notifyErrorHandlers(t){for(const e of this.errorHandlers)try{e(t)}catch(r){this.log(`Error in error handler: ${r}`)}}checkRateLimit(){if(this.config.maxMessagesPerSecond===0)return!0;const t=Date.now(),e=Math.floor(t/1e3)*1e3;return this.messageCountWindow!==e&&(this.messageCountWindow=e,this.messageCount=0),this.messageCount>=this.config.maxMessagesPerSecond?!1:(this.messageCount++,!0)}getLagDelay(){if(!this.lagSimulation)return 0;if(typeof this.lagSimulation=="number")return this.lagSimulation;const{min:t,max:e}=this.lagSimulation;return t+Math.random()*(e-t)}log(t){this.config.debug&&console.log(`[ClientNetwork] ${t}`)}}export{d as ClientNetwork};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./types";export*from"./server";export*from"./client";export*from"./adapters/bun-websocket";export*from"./buffer-pool";export*from"./validators";import{MessageType as s,MessagePriority as a}from"./types";export{a as MessagePriority,s as MessageType};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MessageType as h,MessagePriority as g}from"./types";import{MessageWrapperPool as u}from"./buffer-pool";class T{constructor(e){this.peers=new Map;this.peerSnapshotRegistries=new Map;this.lastProcessedClientTick=new Map;this.lastSnapshotHashes=new Map;this.intentHandlers=new Map;this.anyIntentHandlers=[];this.rpcHandlers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.messagePool=null;this.heartbeatTimer=null;this.transport=e.transport,this.intentRegistry=e.intentRegistry,this.createPeerSnapshotRegistry=e.createPeerSnapshotRegistry,this.rpcRegistry=e.rpcRegistry,this.config={maxMessageSize:e.config?.maxMessageSize??65536,debug:e.config?.debug??!1,maxMessagesPerSecond:e.config?.maxMessagesPerSecond??100,maxSendQueueSize:e.config?.maxSendQueueSize??100,enableBufferPooling:e.config?.enableBufferPooling??!0,heartbeatInterval:e.config?.heartbeatInterval??3e4,heartbeatTimeout:e.config?.heartbeatTimeout??6e4,lagSimulation:e.config?.lagSimulation??0},this.config.enableBufferPooling&&(this.messagePool=new u),this.setupTransportHandlers(),this.setupHeartbeat()}getPeerSnapshotRegistry(e){return this.peerSnapshotRegistries.get(e)}onIntent(e,t,s){let r=this.intentHandlers.get(e.kind);r||(r=[],this.intentHandlers.set(e.kind,r));const n=(i,o)=>{if(s&&!s(i,o)){this.log(`Intent validation failed for peer ${i}, kind ${o.kind}`);return}let a=this.lastProcessedClientTick.get(i);a||(a=new Map,this.lastProcessedClientTick.set(i,a)),a.set(o.kind,o.tick),t(i,o)};return r.push(n),()=>{const i=this.intentHandlers.get(e.kind);if(i){const o=i.indexOf(n);o>-1&&i.splice(o,1)}}}onAnyIntent(e){return this.anyIntentHandlers.push(e),()=>{const t=this.anyIntentHandlers.indexOf(e);t>-1&&this.anyIntentHandlers.splice(t,1)}}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}sendRPC(e,t,s,r=g.NORMAL){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");const n=this.peers.get(e);if(!n){this.log(`Cannot send RPC to unknown peer: ${e}`);return}try{const i=this.rpcRegistry.encode(t,s);let o;if(this.messagePool?o=this.messagePool.wrap(h.CUSTOM,i):(o=new Uint8Array(1+i.byteLength),o[0]=h.CUSTOM,o.set(i,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,o,r),this.messagePool&&this.messagePool.release(o);return}this.sendMessageToPeer(n,o),this.messagePool&&this.messagePool.release(o),this.log(`Sent RPC (method: ${t.method}) to peer: ${e}`)}catch(i){this.log(`Failed to send RPC to peer ${e}: ${i}`)}}sendRpcBroadcast(e,t,s=g.NORMAL){for(const r of this.getPeerIds())this.sendRPC(r,e,t,s)}onRPC(e,t){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");let s=this.rpcHandlers.get(e.method);return s||(s=[],this.rpcHandlers.set(e.method,s)),s.push(t),()=>{const r=this.rpcHandlers.get(e.method);if(r){const n=r.indexOf(t);n>-1&&r.splice(n,1)}}}sendSnapshotToPeer(e,t,s,r=g.NORMAL){const n=this.peers.get(e);if(!n){this.log(`Cannot send snapshot to unknown peer: ${e}`);return}const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a;if(this.messagePool?a=this.messagePool.wrap(h.SNAPSHOT,o):(a=new Uint8Array(1+o.byteLength),a[0]=h.SNAPSHOT,a.set(o,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,a,r),this.messagePool&&this.messagePool.release(a);return}this.sendMessageToPeer(n,a),n.lastSentTick=s.tick,this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`)}sendSnapshotToPeerIfChanged(e,t,s,r=g.NORMAL){const n=this.peers.get(e);if(!n)return this.log(`Cannot send snapshot to unknown peer: ${e}`),!1;const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a=this.lastSnapshotHashes.get(e);a||(a=new Map,this.lastSnapshotHashes.set(e,a));const p=o.subarray(5),c=this.hashBinary(p),l=a.get(t);if(l===void 0||c!==l){let d;return this.messagePool?d=this.messagePool.wrap(h.SNAPSHOT,o):(d=new Uint8Array(1+o.byteLength),d[0]=h.SNAPSHOT,d.set(o,1)),n.isBackpressured||n.sendQueue.length>0?(this.queueMessage(n,d,r),this.messagePool&&this.messagePool.release(d)):this.sendMessageToPeer(n,d),n.lastSentTick=s.tick,a.set(t,c),this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`),!0}return this.log(`Skipped snapshot (type: ${t}) to peer ${e} - no change detected`),!1}hashBinary(e){let t=2166136261;for(let s=0;s<e.length;s++)t^=e[s],t=Math.imul(t,16777619);return t>>>0}queueMessage(e,t,s){const r={data:new Uint8Array(t),priority:s,timestamp:Date.now()};if(e.sendQueue.length>=this.config.maxSendQueueSize){e.sendQueue.sort((o,a)=>o.priority-a.priority);const i=e.sendQueue.shift();this.log(`Send queue full for peer ${e.peerId}, dropping ${g[i.priority]} priority message`)}let n=e.sendQueue.length;for(let i=0;i<e.sendQueue.length;i++)if(r.priority>e.sendQueue[i].priority){n=i;break}e.sendQueue.splice(n,0,r)}sendMessageToPeer(e,t){this.trackBandwidth(e,t.byteLength);const s=e.transport.send(t);this.messagePool?s instanceof Promise?s.then(()=>{this.messagePool.release(t),this.flushSendQueue(e.peerId)}).catch(()=>{e.isBackpressured=!0,this.messagePool.release(t),this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)}):this.messagePool.release(t):s instanceof Promise&&s.catch(()=>{e.isBackpressured=!0,this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)})}flushSendQueue(e){const t=this.peers.get(e);if(!t||t.sendQueue.length===0)return;t.isBackpressured=!1;const s=10;let r=0;for(;t.sendQueue.length>0&&r<s;){const n=t.sendQueue.shift();if(this.sendMessageToPeer(t,n.data),r++,t.isBackpressured)break}t.sendQueue.length>0&&this.log(`Peer ${e} still has ${t.sendQueue.length} queued messages`)}trackBandwidth(e,t){const s=Date.now(),r=Math.floor(s/1e3)*1e3;e.bandwidthWindow!==r&&(e.bandwidthWindow=r,e.bytesSent=0),e.bytesSent+=t}broadcastSnapshot(e,t,s,r=g.NORMAL){for(const n of this.peers.keys())s&&!s(n)||this.sendSnapshotToPeer(n,e,t,r)}broadcastSnapshotWithCustomization(e,t,s,r=g.NORMAL){for(const n of this.peers.keys()){const i=s(n,t);this.sendSnapshotToPeer(n,e,i,r)}}getPeerIds(){return Array.from(this.peers.keys())}getPeerState(e){return this.peers.get(e)}setPeerMetadata(e,t,s){const r=this.peers.get(e);r&&(r.metadata[t]=s)}getPeerBandwidth(e){const t=this.peers.get(e);return t?t.bytesSent:0}getTotalBandwidth(){let e=0;for(const t of this.peers.values())e+=t.bytesSent;return e}isPeerBackpressured(e){const t=this.peers.get(e);return t?t.isBackpressured||t.sendQueue.length>0:!1}getConfirmedClientTick(e,t){const s=this.lastProcessedClientTick.get(e);return s?s.get(t)??0:0}setConfirmedClientTick(e,t,s){let r=this.lastProcessedClientTick.get(e);r||(r=new Map,this.lastProcessedClientTick.set(e,r)),r.set(t,s)}close(){return this.log("Closing server..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onConnection((e,t)=>{this.handleConnection(e,t)}),this.transport.onDisconnection(e=>{this.handleDisconnection(e)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeats()},this.config.heartbeatInterval))}checkHeartbeats(){const e=Date.now(),t=new Uint8Array([h.HEARTBEAT]);for(const[s,r]of this.peers.entries()){const n=e-r.lastMessageReceivedAt;if(n>this.config.heartbeatTimeout){this.log(`Peer ${s} timed out (no message for ${n}ms)`),r.transport.close();continue}try{r.transport.send(t),this.trackBandwidth(r,t.byteLength)}catch(i){this.log(`Failed to send heartbeat to peer ${s}: ${i}`)}}}handleConnection(e,t){this.log(`Peer connected: ${t}`);const s=Date.now(),r={peerId:t,transport:e,lastSentTick:0,connectedAt:s,metadata:{},messageCount:0,messageCountWindow:s,sendQueue:[],bytesSent:0,bandwidthWindow:s,isBackpressured:!1,lastMessageReceivedAt:s};this.peers.set(t,r);const n=this.createPeerSnapshotRegistry();this.peerSnapshotRegistries.set(t,n),this.lastProcessedClientTick.set(t,new Map),e.onMessage(i=>{this.handlePeerMessage(t,i)});for(const i of this.connectionHandlers)try{i(t)}catch(o){this.config.debug&&console.error(`[ServerNetwork] Error in connection handler: ${o}`)}}handleDisconnection(e){this.log(`Peer disconnected: ${e}`),this.peers.delete(e),this.peerSnapshotRegistries.delete(e),this.lastProcessedClientTick.delete(e),this.lastSnapshotHashes.delete(e);for(const t of this.disconnectionHandlers)try{t(e)}catch(s){this.config.debug&&console.error(`[ServerNetwork] Error in disconnection handler: ${s}`)}}handlePeerMessage(e,t){const s=this.peers.get(e);if(s&&(s.lastMessageReceivedAt=Date.now()),t.byteLength===0){this.log(`Received empty message from peer ${e}`);return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message from peer ${e} exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const r=t[0],n=t.subarray(1);switch(r){case h.INTENT:this.handleIntent(e,n);break;case h.HEARTBEAT:this.log(`Received heartbeat from peer ${e}`);break;case h.CUSTOM:this.handleRPC(e,n);break;default:this.log(`Unknown message type ${r} from peer ${e}`)}}handleIntent(e,t){if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping intent`);return}try{const s=this.intentRegistry.decode(t);this.log(`Received intent (kind: ${s.kind}) from peer ${e}`);for(const n of this.anyIntentHandlers)try{n(e,s)}catch(i){this.log(`Error in global intent handler: ${i}`)}const r=this.intentHandlers.get(s.kind);if(r&&r.length>0)for(const n of r)try{n(e,s)}catch(i){this.log(`Error in intent handler: ${i}`)}else this.log(`No handler registered for intent kind: ${s.kind}`)}catch(s){this.log(`Failed to decode intent from peer ${e}: ${s}`)}}handleRPC(e,t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping RPC`);return}try{const s=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${s.method}) from peer ${e}`);const r=this.rpcHandlers.get(s.method);if(r&&r.length>0)for(const n of r)try{n(e,s.data)}catch(i){this.log(`Error in RPC handler: ${i}`)}else this.log(`No handler registered for RPC method: ${s.method}`)}catch(s){this.log(`Failed to decode RPC from peer ${e}: ${s}`)}}checkRateLimit(e){if(this.config.maxMessagesPerSecond===0)return!0;const t=this.peers.get(e);if(!t)return!1;const s=Date.now(),r=Math.floor(s/1e3)*1e3;return t.messageCountWindow!==r&&(t.messageCountWindow=r,t.messageCount=0),t.messageCount>=this.config.maxMessagesPerSecond?!1:(t.messageCount++,!0)}log(e){this.config.debug&&console.log(`[ServerNetwork] ${e}`)}}export{T as ServerNetwork};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=(e=>(e[e.INTENT=1]="INTENT",e[e.SNAPSHOT=2]="SNAPSHOT",e[e.HEARTBEAT=3]="HEARTBEAT",e[e.CUSTOM=255]="CUSTOM",e))(n||{}),r=(e=>(e[e.LOW=0]="LOW",e[e.NORMAL=1]="NORMAL",e[e.HIGH=2]="HIGH",e[e.CRITICAL=3]="CRITICAL",e))(r||{});export{r as MessagePriority,n as MessageType};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function u(e,n=10){return(r,t)=>t.tick>=e-n}function a(e,n=5){return(r,t)=>t.tick<=e+n}function s(e,n=10,r=5){return(t,o)=>o.tick>=e-n&&o.tick<=e+r}function l(...e){return(n,r)=>{for(const t of e)if(!t(n,r))return!1;return!0}}function d(e,n,r){return(t,o)=>{const i=o[e];return typeof i!="number"?!1:i>=n&&i<=r}}function b(e,n){return(r,t)=>typeof t[e]===n}export{l as combineValidators,b as validateFieldType,d as validateRange,a as validateTickNotTooFuture,u as validateTickNotTooOld,s as validateTickRange};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./intent";export*from"./snapshot";export*from"./rpc";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BinaryCodec as n}from"../../core/binary-codec";class o{constructor(e){this.schema=e}encode(e){return n.encode(this.schema,e)}decode(e){const r={};for(const i of Object.keys(this.schema)){const c=this.schema[i];r[i]=c.toNil()}return n.decode(this.schema,e,r)}}function s(t){const e={kind:n.u8,tick:n.u32,...t.schema};return{type:void 0,codec:new o(e),kind:t.kind}}export{s as defineIntent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{IntentRegistry as n}from"./intent-registry";import{defineIntent as f}from"./define-intent";export{n as IntentRegistry,f as defineIntent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class c{constructor(){this.codecs=new Map}register(e){if(this.codecs.has(e.kind))throw new Error(`Intent kind ${e.kind} is already registered`);this.codecs.set(e.kind,e.codec)}encode(e){const r=this.codecs.get(e.kind);if(!r)throw new Error(`No codec registered for intent kind ${e.kind}`);return r.encode(e)}decode(e){if(e.byteLength===0)throw new Error("Cannot decode empty buffer");const r=e[0],n=this.codecs.get(r);if(!n)throw new Error(`No codec registered for intent kind ${r}`);return n.decode(e)}decodeWithKnownKind(e,r){const n=this.codecs.get(e);if(!n)throw new Error(`No codec registered for intent kind ${e}`);return n.decode(r)}has(e){return this.codecs.has(e)}unregister(e){return this.codecs.delete(e)}clear(){this.codecs.clear()}getKinds(){return Array.from(this.codecs.keys())}}export{c as IntentRegistry};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BinaryCodec as o}from"../../core/binary-codec";class s{constructor(e){this.schema=e}encode(e){return o.encode(this.schema,e)}decode(e){const c={};for(const n of Object.keys(this.schema)){const r=this.schema[n];c[n]=r.toNil()}return o.decode(this.schema,e,c)}}function a(t){const e=t.schema,c=new s(e);return{method:t.method,codec:c,type:void 0}}export{a as defineRPC};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./rpc";export*from"./define-rpc";export*from"./rpc-registry";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(){this.codecs=new Map;this.methodToId=new Map;this.idToMethod=new Map;this.nextId=0}register(e){if(this.codecs.has(e.method))throw new Error(`RPC "${e.method}" is already registered`);const o=this.nextId++;this.codecs.set(e.method,e.codec),this.methodToId.set(e.method,o),this.idToMethod.set(o,e.method)}encode(e,o){const t=this.codecs.get(e.method);if(!t)throw new Error(`RPC "${e.method}" is not registered`);const n=this.methodToId.get(e.method),d=t.encode(o),r=new Uint8Array(2+d.byteLength);return new DataView(r.buffer).setUint16(0,n,!0),r.set(new Uint8Array(d),2),r}decode(e){if(e.byteLength<2)throw new Error("Buffer too small for RPC message");const t=new DataView(e.buffer,e.byteOffset).getUint16(0,!0),n=this.idToMethod.get(t);if(!n)throw new Error(`Unknown RPC method ID: ${t}`);const r=this.codecs.get(n).decode(e.slice(2));return{method:n,data:r}}has(e){return this.codecs.has(e)}getMethods(){return Array.from(this.codecs.keys())}getMethodId(e){return this.methodToId.get(e)}release(e,o){const t=this.codecs.get(e);if(!t)throw new Error(`RPC "${e}" is not registered`);"release"in t&&typeof t.release=="function"&&t.release(o)}}export{i as RpcRegistry};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{applySnapshot as t}from"./snapshot";import{SnapshotCodec as e}from"./snapshot-codec";import{SnapshotRegistry as a}from"./snapshot-registry";export{e as SnapshotCodec,a as SnapshotRegistry,t as applySnapshot};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class o{constructor(e){this.updatesCodec=e}encode(e){if(this.updatesCodec.calculateSize&&this.updatesCodec.encodeInto){const n=this.updatesCodec.calculateSize(e.updates),r=new Uint8Array(4+n);return new DataView(r.buffer).setUint32(0,e.tick,!0),this.updatesCodec.encodeInto(e.updates,r,4),r}const a=this.updatesCodec.encode(e.updates),t=new Uint8Array(4+a.length);return new DataView(t.buffer).setUint32(0,e.tick,!0),t.set(a,4),t}decode(e){const a=new DataView(e.buffer,e.byteOffset).getUint32(0,!0),t=e.subarray(4),n=this.updatesCodec.decode(t);return{tick:a,updates:n}}}export{o as SnapshotCodec};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class d{constructor(){this.codecs=new Map;this.typeIds=new Map;this.idToType=new Map;this.nextId=0}register(e,r){if(this.codecs.has(e))throw new Error(`Snapshot type "${e}" is already registered`);const t=this.nextId++;this.codecs.set(e,r),this.typeIds.set(e,t),this.idToType.set(t,e)}encode(e,r){const t=this.codecs.get(e),s=this.typeIds.get(e);if(!t||s===void 0)throw new Error(`No codec registered for snapshot type "${e}"`);if(t.calculateSize&&t.encodeInto){const a=t.calculateSize(r.updates),i=new Uint8Array(5+a);return i[0]=s,new DataView(i.buffer).setUint32(1,r.tick,!0),t.encodeInto(r.updates,i,5),i}const o=t.encode(r.updates),n=new Uint8Array(5+o.length);return n[0]=s,new DataView(n.buffer).setUint32(1,r.tick,!0),n.set(o,5),n}decode(e){const r=e[0],t=this.idToType.get(r);if(!t)throw new Error(`Unknown snapshot type ID: ${r}`);const s=this.codecs.get(t);if(!s)throw new Error(`No codec registered for snapshot type "${t}"`);const o=new DataView(e.buffer,e.byteOffset+1).getUint32(0,!0),n=e.subarray(5),a=s.decode(n);return{type:t,snapshot:{tick:o,updates:a}}}has(e){return this.codecs.has(e)}getTypes(){return Array.from(this.codecs.keys())}release(e,r){const t=this.codecs.get(e);if(!t)throw new Error(`No codec registered for snapshot type "${e}"`);"release"in t&&typeof t.release=="function"&&t.release(r)}}export{d as SnapshotRegistry};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function i(t,n){s(t,n.updates)}function s(t,n){for(const a in n){if(!Object.prototype.hasOwnProperty.call(n,a))continue;const e=n[a],o=t[a];e==null||Array.isArray(e)?t[a]=e:typeof e=="object"&&typeof o=="object"?s(o,e):t[a]=e}}export{i as applySnapshot};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BaseRenderer as t}from"./base-renderer";class p extends t{constructor(r,e){super(r,e),this.maxSprites=e.maxSprites}}export{p as Base2DRenderer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BaseRenderer as a}from"./base-renderer";class n extends a{constructor(r,e){super(r,e),this.maxModels=e.maxModels}}export{n as Base3DRenderer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class o{constructor(e,r){this._width=0;this._height=0;this._initialized=!1;this.canvas=e,this.options=r,this._clearColor=r.clearColor??[0,0,0,1]}get clearColor(){return this._clearColor}set clearColor(e){this._clearColor=e}get width(){return this._width}get height(){return this._height}get initialized(){return this._initialized}}export{o as BaseRenderer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./types";export*from"./base-renderer";export*from"./base-2d-renderer";export*from"./base-3d-renderer";
|
|
File without changes
|
|
@@ -80,6 +80,8 @@ export declare class BinaryPrimitives {
|
|
|
80
80
|
static readonly i16: Field<number>;
|
|
81
81
|
/** Signed 32-bit integer (big-endian) */
|
|
82
82
|
static readonly i32: Field<number>;
|
|
83
|
+
/** 16-bit floating point number (IEEE 754, big-endian) */
|
|
84
|
+
static readonly f16: Field<number>;
|
|
83
85
|
/** 32-bit floating point number (IEEE 754, big-endian) */
|
|
84
86
|
static readonly f32: Field<number>;
|
|
85
87
|
/** 64-bit floating point number (double, big-endian) */
|
|
@@ -154,6 +156,8 @@ export declare class BinaryCodec extends BaseBinaryCodec {
|
|
|
154
156
|
static readonly i16: Field<number>;
|
|
155
157
|
/** Signed 32-bit integer field */
|
|
156
158
|
static readonly i32: Field<number>;
|
|
159
|
+
/** 16-bit floating point field */
|
|
160
|
+
static readonly f16: Field<number>;
|
|
157
161
|
/** 32-bit floating point field */
|
|
158
162
|
static readonly f32: Field<number>;
|
|
159
163
|
/** Boolean field */
|