murow 0.0.70 → 0.0.72

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.
Files changed (470) hide show
  1. package/README.md +54 -37
  2. package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
  3. package/dist/cjs/core/binary-codec/index.js +1 -0
  4. package/dist/cjs/core/driver/driver.js +1 -0
  5. package/dist/cjs/core/driver/drivers/immediate.js +1 -0
  6. package/dist/cjs/core/driver/drivers/index.js +1 -0
  7. package/dist/cjs/core/driver/drivers/raf.js +1 -0
  8. package/dist/cjs/core/driver/drivers/timeout.js +1 -0
  9. package/dist/cjs/core/driver/index.js +1 -0
  10. package/dist/cjs/core/events/event-system.js +1 -0
  11. package/dist/cjs/core/events/index.js +1 -0
  12. package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
  13. package/dist/cjs/core/fixed-ticker/index.js +1 -0
  14. package/dist/cjs/core/free-list/free-list.js +1 -0
  15. package/dist/cjs/core/free-list/index.js +1 -0
  16. package/dist/cjs/core/generate-id/generate-id.js +1 -0
  17. package/dist/cjs/core/generate-id/index.js +1 -0
  18. package/dist/cjs/core/index.js +1 -0
  19. package/dist/cjs/core/input/index.js +1 -0
  20. package/dist/cjs/core/input/manager.js +1 -0
  21. package/dist/cjs/core/input/sources/browser.js +1 -0
  22. package/dist/cjs/core/input/sources/index.js +1 -0
  23. package/dist/cjs/core/input/types.js +1 -0
  24. package/dist/cjs/core/lerp/index.js +1 -0
  25. package/dist/cjs/core/lerp/lerp.js +1 -0
  26. package/dist/cjs/core/navmesh/index.js +1 -0
  27. package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
  28. package/dist/cjs/core/navmesh/navmesh.js +1 -0
  29. package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
  30. package/dist/cjs/core/pooled-codec/index.js +1 -0
  31. package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
  32. package/dist/cjs/core/prediction/index.js +1 -0
  33. package/dist/cjs/core/prediction/prediction.js +1 -0
  34. package/dist/cjs/core/ray/index.js +1 -0
  35. package/dist/cjs/core/ray/ray-2d.js +1 -0
  36. package/dist/cjs/core/ray/ray-3d.js +1 -0
  37. package/dist/cjs/core/simple-rng/index.js +1 -0
  38. package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
  39. package/dist/cjs/core/sparse-batcher/index.js +1 -0
  40. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
  41. package/dist/cjs/ecs/component-store.js +1 -0
  42. package/dist/cjs/ecs/component.js +1 -0
  43. package/dist/cjs/ecs/entity-handle.js +1 -0
  44. package/dist/cjs/ecs/index.js +1 -0
  45. package/dist/cjs/ecs/system-builder.js +1 -0
  46. package/dist/cjs/ecs/world-systems.js +1 -0
  47. package/dist/cjs/ecs/world.js +1 -0
  48. package/dist/cjs/game/index.js +1 -0
  49. package/dist/cjs/game/loop/index.js +1 -0
  50. package/dist/cjs/game/loop/loop.js +1 -0
  51. package/dist/cjs/index.js +1 -0
  52. package/dist/cjs/net/adapters/browser-websocket.js +1 -0
  53. package/dist/cjs/net/adapters/bun-websocket.js +1 -0
  54. package/dist/cjs/net/buffer-pool.js +1 -0
  55. package/dist/cjs/net/client.js +1 -0
  56. package/dist/cjs/net/index.js +1 -0
  57. package/dist/cjs/net/server.js +1 -0
  58. package/dist/cjs/net/types.js +1 -0
  59. package/dist/cjs/net/validators.js +1 -0
  60. package/dist/cjs/protocol/index.js +1 -0
  61. package/dist/cjs/protocol/intent/define-intent.js +1 -0
  62. package/dist/cjs/protocol/intent/index.js +1 -0
  63. package/dist/cjs/protocol/intent/intent-registry.js +1 -0
  64. package/dist/cjs/protocol/intent/intent.js +1 -0
  65. package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
  66. package/dist/cjs/protocol/rpc/index.js +1 -0
  67. package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
  68. package/dist/cjs/protocol/rpc/rpc.js +1 -0
  69. package/dist/cjs/protocol/snapshot/index.js +1 -0
  70. package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
  71. package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
  72. package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
  73. package/dist/cjs/renderer/base/renderer-2d.js +1 -0
  74. package/dist/cjs/renderer/base/renderer-3d.js +1 -0
  75. package/dist/cjs/renderer/base/renderer.js +1 -0
  76. package/dist/cjs/renderer/gltf/helpers.js +1 -0
  77. package/dist/cjs/renderer/gltf/parser.js +1 -0
  78. package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
  79. package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
  80. package/dist/cjs/renderer/index.js +1 -0
  81. package/dist/cjs/renderer/math.js +1 -0
  82. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
  83. package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
  84. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
  85. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
  86. package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
  87. package/dist/cjs/renderer/spritesheet/parser.js +1 -0
  88. package/dist/cjs/renderer/types.js +1 -0
  89. package/dist/esm/core/binary-codec/binary-codec.js +1 -0
  90. package/dist/esm/core/binary-codec/index.js +1 -0
  91. package/dist/esm/core/driver/driver.js +1 -0
  92. package/dist/esm/core/driver/drivers/immediate.js +1 -0
  93. package/dist/esm/core/driver/drivers/index.js +1 -0
  94. package/dist/esm/core/driver/drivers/raf.js +1 -0
  95. package/dist/esm/core/driver/drivers/timeout.js +1 -0
  96. package/dist/esm/core/driver/index.js +1 -0
  97. package/dist/esm/core/events/event-system.js +1 -0
  98. package/dist/esm/core/events/index.js +1 -0
  99. package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
  100. package/dist/esm/core/fixed-ticker/index.js +1 -0
  101. package/dist/esm/core/free-list/free-list.js +1 -0
  102. package/dist/esm/core/free-list/index.js +1 -0
  103. package/dist/esm/core/generate-id/generate-id.js +1 -0
  104. package/dist/esm/core/generate-id/index.js +1 -0
  105. package/dist/esm/core/index.js +1 -0
  106. package/dist/esm/core/input/index.js +1 -0
  107. package/dist/esm/core/input/manager.js +1 -0
  108. package/dist/esm/core/input/sources/browser.js +1 -0
  109. package/dist/esm/core/input/sources/index.js +1 -0
  110. package/dist/esm/core/input/types.js +0 -0
  111. package/dist/esm/core/lerp/index.js +1 -0
  112. package/dist/esm/core/lerp/lerp.js +1 -0
  113. package/dist/esm/core/navmesh/index.js +1 -0
  114. package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
  115. package/dist/esm/core/navmesh/navmesh.js +1 -0
  116. package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
  117. package/dist/esm/core/pooled-codec/index.js +1 -0
  118. package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
  119. package/dist/esm/core/prediction/index.js +1 -0
  120. package/dist/esm/core/prediction/prediction.js +1 -0
  121. package/dist/esm/core/ray/index.js +1 -0
  122. package/dist/esm/core/ray/ray-2d.js +1 -0
  123. package/dist/esm/core/ray/ray-3d.js +1 -0
  124. package/dist/esm/core/simple-rng/index.js +1 -0
  125. package/dist/esm/core/simple-rng/simple-rng.js +1 -0
  126. package/dist/esm/core/sparse-batcher/index.js +1 -0
  127. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
  128. package/dist/esm/ecs/component-store.js +1 -0
  129. package/dist/esm/ecs/component.js +1 -0
  130. package/dist/esm/ecs/entity-handle.js +1 -0
  131. package/dist/esm/ecs/index.js +1 -0
  132. package/dist/esm/ecs/system-builder.js +1 -0
  133. package/dist/esm/ecs/world-systems.js +1 -0
  134. package/dist/esm/ecs/world.js +1 -0
  135. package/dist/esm/game/index.js +1 -0
  136. package/dist/esm/game/loop/index.js +1 -0
  137. package/dist/esm/game/loop/loop.js +1 -0
  138. package/dist/esm/index.js +1 -0
  139. package/dist/esm/net/adapters/browser-websocket.js +1 -0
  140. package/dist/esm/net/adapters/bun-websocket.js +1 -0
  141. package/dist/esm/net/buffer-pool.js +1 -0
  142. package/dist/esm/net/client.js +1 -0
  143. package/dist/esm/net/index.js +1 -0
  144. package/dist/esm/net/server.js +1 -0
  145. package/dist/esm/net/types.js +1 -0
  146. package/dist/esm/net/validators.js +1 -0
  147. package/dist/esm/protocol/index.js +1 -0
  148. package/dist/esm/protocol/intent/define-intent.js +1 -0
  149. package/dist/esm/protocol/intent/index.js +1 -0
  150. package/dist/esm/protocol/intent/intent-registry.js +1 -0
  151. package/dist/esm/protocol/intent/intent.js +0 -0
  152. package/dist/esm/protocol/rpc/define-rpc.js +1 -0
  153. package/dist/esm/protocol/rpc/index.js +1 -0
  154. package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
  155. package/dist/esm/protocol/rpc/rpc.js +0 -0
  156. package/dist/esm/protocol/snapshot/index.js +1 -0
  157. package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
  158. package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
  159. package/dist/esm/protocol/snapshot/snapshot.js +1 -0
  160. package/dist/esm/renderer/base/renderer-2d.js +1 -0
  161. package/dist/esm/renderer/base/renderer-3d.js +1 -0
  162. package/dist/esm/renderer/base/renderer.js +1 -0
  163. package/dist/esm/renderer/gltf/helpers.js +1 -0
  164. package/dist/esm/renderer/gltf/parser.js +1 -0
  165. package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
  166. package/dist/esm/renderer/gltf/skin-parser.js +1 -0
  167. package/dist/esm/renderer/index.js +1 -0
  168. package/dist/esm/renderer/math.js +1 -0
  169. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
  170. package/dist/esm/renderer/prefab-bucket/index.js +1 -0
  171. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
  172. package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
  173. package/dist/esm/renderer/spritesheet/helpers.js +1 -0
  174. package/dist/esm/renderer/spritesheet/parser.js +1 -0
  175. package/dist/esm/renderer/types.js +0 -0
  176. package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
  177. package/dist/{core → types/core}/events/event-system.d.ts +14 -33
  178. package/dist/types/core/free-list/free-list.d.ts +31 -0
  179. package/dist/types/core/free-list/index.d.ts +1 -0
  180. package/dist/{core → types/core}/index.d.ts +5 -0
  181. package/dist/{core → types/core}/input/index.d.ts +1 -0
  182. package/dist/{core → types/core}/input/manager.d.ts +2 -0
  183. package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
  184. package/dist/types/core/ray/index.d.ts +2 -0
  185. package/dist/types/core/ray/ray-2d.d.ts +37 -0
  186. package/dist/types/core/ray/ray-3d.d.ts +42 -0
  187. package/dist/types/core/simple-rng/index.d.ts +1 -0
  188. package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
  189. package/dist/types/core/sparse-batcher/index.d.ts +1 -0
  190. package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
  191. package/dist/{ecs → types/ecs}/world.d.ts +11 -0
  192. package/dist/{game → types/game}/loop/loop.d.ts +33 -29
  193. package/dist/{index.d.ts → types/index.d.ts} +1 -0
  194. package/dist/{net → types/net}/index.d.ts +2 -2
  195. package/dist/types/renderer/base/renderer-2d.d.ts +13 -0
  196. package/dist/types/renderer/base/renderer-3d.d.ts +10 -0
  197. package/dist/types/renderer/base/renderer.d.ts +21 -0
  198. package/dist/types/renderer/gltf/helpers.d.ts +43 -0
  199. package/dist/types/renderer/gltf/parser.d.ts +49 -0
  200. package/dist/types/renderer/gltf/skeletal-animation.d.ts +96 -0
  201. package/dist/types/renderer/gltf/skin-parser.d.ts +107 -0
  202. package/dist/types/renderer/index.d.ts +15 -0
  203. package/dist/types/renderer/math.d.ts +37 -0
  204. package/dist/types/renderer/prefab-bucket/concrete.d.ts +55 -0
  205. package/dist/types/renderer/prefab-bucket/index.d.ts +113 -0
  206. package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
  207. package/dist/types/renderer/prefab-bucket/specs.d.ts +166 -0
  208. package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
  209. package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
  210. package/dist/types/renderer/types.d.ts +89 -0
  211. package/dist/webgpu/cjs/index.js +5401 -0
  212. package/dist/webgpu/esm/index.js +5378 -0
  213. package/dist/webgpu/types/2d/animation.d.ts +97 -0
  214. package/dist/webgpu/types/2d/renderer.d.ts +86 -0
  215. package/dist/webgpu/types/2d/shader.d.ts +61 -0
  216. package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
  217. package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
  218. package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
  219. package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
  220. package/dist/webgpu/types/3d/renderer.d.ts +266 -0
  221. package/dist/webgpu/types/3d/shader.d.ts +136 -0
  222. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
  223. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +25 -0
  224. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
  225. package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
  226. package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
  227. package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
  228. package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
  229. package/dist/webgpu/types/camera/index.d.ts +2 -0
  230. package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
  231. package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
  232. package/dist/webgpu/types/core/constants.d.ts +59 -0
  233. package/dist/webgpu/types/core/constants.test.d.ts +1 -0
  234. package/dist/webgpu/types/core/index.d.ts +2 -0
  235. package/dist/webgpu/types/core/types.d.ts +125 -0
  236. package/dist/webgpu/types/core/types.test.d.ts +1 -0
  237. package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
  238. package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
  239. package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
  240. package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
  241. package/dist/webgpu/types/geometry/index.d.ts +2 -0
  242. package/dist/webgpu/types/index.d.ts +35 -0
  243. package/dist/webgpu/types/particle/emitter.d.ts +36 -0
  244. package/dist/webgpu/types/shaders/index.d.ts +2 -0
  245. package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
  246. package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
  247. package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
  248. package/dist/webgpu/types/shaders/utils.d.ts +28 -0
  249. package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
  250. package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
  251. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +28 -0
  252. package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
  253. package/package.json +96 -26
  254. package/dist/core/binary-codec/binary-codec.js +0 -354
  255. package/dist/core/binary-codec/index.js +0 -1
  256. package/dist/core/driver/driver.js +0 -47
  257. package/dist/core/driver/drivers/immediate.js +0 -61
  258. package/dist/core/driver/drivers/index.js +0 -3
  259. package/dist/core/driver/drivers/raf.js +0 -62
  260. package/dist/core/driver/drivers/timeout.js +0 -71
  261. package/dist/core/driver/index.js +0 -2
  262. package/dist/core/events/event-system.js +0 -88
  263. package/dist/core/events/index.js +0 -1
  264. package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
  265. package/dist/core/fixed-ticker/index.js +0 -1
  266. package/dist/core/generate-id/generate-id.js +0 -25
  267. package/dist/core/generate-id/index.js +0 -1
  268. package/dist/core/index.js +0 -10
  269. package/dist/core/input/index.js +0 -2
  270. package/dist/core/input/manager.js +0 -211
  271. package/dist/core/input/sources/browser.js +0 -29
  272. package/dist/core/input/sources/index.js +0 -1
  273. package/dist/core/lerp/index.js +0 -1
  274. package/dist/core/lerp/lerp.js +0 -42
  275. package/dist/core/navmesh/index.js +0 -1
  276. package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
  277. package/dist/core/navmesh/navmesh.js +0 -799
  278. package/dist/core/navmesh/navmesh.worker.js +0 -79
  279. package/dist/core/pooled-codec/index.js +0 -1
  280. package/dist/core/pooled-codec/pooled-codec.js +0 -410
  281. package/dist/core/prediction/index.js +0 -1
  282. package/dist/core/prediction/prediction.js +0 -99
  283. package/dist/core.esm.js +0 -1
  284. package/dist/core.js +0 -1
  285. package/dist/ecs/component-store.js +0 -175
  286. package/dist/ecs/component.js +0 -43
  287. package/dist/ecs/entity-handle.js +0 -515
  288. package/dist/ecs/example.js +0 -125
  289. package/dist/ecs/index.js +0 -4
  290. package/dist/ecs/system-builder.js +0 -249
  291. package/dist/ecs/world-systems.js +0 -79
  292. package/dist/ecs/world.js +0 -767
  293. package/dist/game/index.js +0 -1
  294. package/dist/game/loop/index.js +0 -1
  295. package/dist/game/loop/loop.js +0 -108
  296. package/dist/index.js +0 -26
  297. package/dist/net/adapters/browser-websocket.js +0 -74
  298. package/dist/net/adapters/bun-websocket.js +0 -245
  299. package/dist/net/buffer-pool.js +0 -89
  300. package/dist/net/client.js +0 -586
  301. package/dist/net/index.js +0 -58
  302. package/dist/net/server.js +0 -974
  303. package/dist/net/types.js +0 -31
  304. package/dist/net/validators.js +0 -88
  305. package/dist/protocol/index.js +0 -92
  306. package/dist/protocol/intent/define-intent.js +0 -125
  307. package/dist/protocol/intent/index.js +0 -91
  308. package/dist/protocol/intent/intent-registry.js +0 -91
  309. package/dist/protocol/rpc/define-rpc.js +0 -84
  310. package/dist/protocol/rpc/index.js +0 -3
  311. package/dist/protocol/rpc/rpc-registry.js +0 -159
  312. package/dist/protocol/rpc/rpc.js +0 -12
  313. package/dist/protocol/snapshot/index.js +0 -43
  314. package/dist/protocol/snapshot/snapshot-codec.js +0 -67
  315. package/dist/protocol/snapshot/snapshot-registry.js +0 -168
  316. package/dist/protocol/snapshot/snapshot.js +0 -30
  317. package/src/core/binary-codec/README.md +0 -60
  318. package/src/core/binary-codec/binary-codec.test.ts +0 -300
  319. package/src/core/binary-codec/binary-codec.ts +0 -448
  320. package/src/core/binary-codec/index.ts +0 -1
  321. package/src/core/driver/README.md +0 -97
  322. package/src/core/driver/driver.test.ts +0 -414
  323. package/src/core/driver/driver.ts +0 -71
  324. package/src/core/driver/drivers/immediate.ts +0 -66
  325. package/src/core/driver/drivers/index.ts +0 -3
  326. package/src/core/driver/drivers/raf.ts +0 -67
  327. package/src/core/driver/drivers/timeout.ts +0 -77
  328. package/src/core/driver/index.ts +0 -2
  329. package/src/core/events/README.md +0 -47
  330. package/src/core/events/event-system.test.ts +0 -243
  331. package/src/core/events/event-system.ts +0 -140
  332. package/src/core/events/index.ts +0 -1
  333. package/src/core/fixed-ticker/README.md +0 -77
  334. package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
  335. package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
  336. package/src/core/fixed-ticker/index.ts +0 -1
  337. package/src/core/generate-id/README.md +0 -18
  338. package/src/core/generate-id/generate-id.test.ts +0 -79
  339. package/src/core/generate-id/generate-id.ts +0 -37
  340. package/src/core/generate-id/index.ts +0 -1
  341. package/src/core/index.ts +0 -10
  342. package/src/core/input/README.md +0 -24
  343. package/src/core/input/index.ts +0 -2
  344. package/src/core/input/manager.ts +0 -259
  345. package/src/core/input/sources/browser.ts +0 -39
  346. package/src/core/input/sources/index.ts +0 -1
  347. package/src/core/input/types.ts +0 -40
  348. package/src/core/lerp/README.md +0 -79
  349. package/src/core/lerp/index.ts +0 -1
  350. package/src/core/lerp/lerp.test.ts +0 -90
  351. package/src/core/lerp/lerp.ts +0 -42
  352. package/src/core/navmesh/README.md +0 -164
  353. package/src/core/navmesh/index.ts +0 -1
  354. package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
  355. package/src/core/navmesh/navmesh-workers.test.ts +0 -356
  356. package/src/core/navmesh/navmesh.test.ts +0 -344
  357. package/src/core/navmesh/navmesh.ts +0 -1047
  358. package/src/core/navmesh/navmesh.worker.ts +0 -147
  359. package/src/core/pooled-codec/README.md +0 -70
  360. package/src/core/pooled-codec/index.ts +0 -1
  361. package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
  362. package/src/core/pooled-codec/pooled-codec.ts +0 -504
  363. package/src/core/prediction/README.md +0 -64
  364. package/src/core/prediction/index.ts +0 -1
  365. package/src/core/prediction/prediction.test.ts +0 -423
  366. package/src/core/prediction/prediction.ts +0 -112
  367. package/src/ecs/README.md +0 -427
  368. package/src/ecs/benchmark.test.ts +0 -1645
  369. package/src/ecs/component-store.ts +0 -198
  370. package/src/ecs/component.ts +0 -90
  371. package/src/ecs/entity-handle.test.ts +0 -393
  372. package/src/ecs/entity-handle.ts +0 -563
  373. package/src/ecs/example.ts +0 -152
  374. package/src/ecs/index.ts +0 -4
  375. package/src/ecs/system-builder.ts +0 -404
  376. package/src/ecs/world-systems.ts +0 -83
  377. package/src/ecs/world.test.ts +0 -310
  378. package/src/ecs/world.ts +0 -904
  379. package/src/game/index.ts +0 -1
  380. package/src/game/loop/README.md +0 -32
  381. package/src/game/loop/index.ts +0 -1
  382. package/src/game/loop/loop.ts +0 -236
  383. package/src/index.ts +0 -32
  384. package/src/net/README.md +0 -474
  385. package/src/net/adapters/browser-websocket.ts +0 -86
  386. package/src/net/adapters/bun-websocket.ts +0 -292
  387. package/src/net/buffer-pool.ts +0 -106
  388. package/src/net/client.test.ts +0 -807
  389. package/src/net/client.ts +0 -695
  390. package/src/net/index.ts +0 -60
  391. package/src/net/server.test.ts +0 -799
  392. package/src/net/server.ts +0 -1152
  393. package/src/net/types.ts +0 -228
  394. package/src/net/validators.ts +0 -104
  395. package/src/protocol/README.md +0 -469
  396. package/src/protocol/index.ts +0 -93
  397. package/src/protocol/intent/define-intent.test.ts +0 -397
  398. package/src/protocol/intent/define-intent.ts +0 -201
  399. package/src/protocol/intent/index.ts +0 -94
  400. package/src/protocol/intent/intent-registry.test.ts +0 -198
  401. package/src/protocol/intent/intent-registry.ts +0 -112
  402. package/src/protocol/intent/intent.ts +0 -12
  403. package/src/protocol/rpc/define-rpc.test.ts +0 -141
  404. package/src/protocol/rpc/define-rpc.ts +0 -113
  405. package/src/protocol/rpc/index.ts +0 -3
  406. package/src/protocol/rpc/rpc-registry.test.ts +0 -168
  407. package/src/protocol/rpc/rpc-registry.ts +0 -176
  408. package/src/protocol/rpc/rpc.ts +0 -37
  409. package/src/protocol/snapshot/index.ts +0 -45
  410. package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
  411. package/src/protocol/snapshot/snapshot-codec.ts +0 -87
  412. package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
  413. package/src/protocol/snapshot/snapshot-registry.ts +0 -201
  414. package/src/protocol/snapshot/snapshot.test.ts +0 -76
  415. package/src/protocol/snapshot/snapshot.ts +0 -41
  416. /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
  417. /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
  418. /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
  419. /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
  420. /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
  421. /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
  422. /package/dist/{core → types/core}/driver/index.d.ts +0 -0
  423. /package/dist/{core → types/core}/events/index.d.ts +0 -0
  424. /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
  425. /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
  426. /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
  427. /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
  428. /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
  429. /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
  430. /package/dist/{core → types/core}/input/types.d.ts +0 -0
  431. /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
  432. /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
  433. /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
  434. /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
  435. /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
  436. /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
  437. /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
  438. /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
  439. /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
  440. /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
  441. /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
  442. /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
  443. /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
  444. /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
  445. /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
  446. /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
  447. /package/dist/{game → types/game}/index.d.ts +0 -0
  448. /package/dist/{game → types/game}/loop/index.d.ts +0 -0
  449. /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
  450. /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
  451. /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
  452. /package/dist/{net → types/net}/client.d.ts +0 -0
  453. /package/dist/{net → types/net}/server.d.ts +0 -0
  454. /package/dist/{net → types/net}/types.d.ts +0 -0
  455. /package/dist/{net → types/net}/validators.d.ts +0 -0
  456. /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
  457. /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
  458. /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
  459. /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
  460. /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
  461. /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
  462. /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
  463. /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
  464. /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
  465. /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
  466. /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
  467. /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
  468. /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
  469. /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
  470. /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
@@ -1,47 +0,0 @@
1
- # EventSystem
2
-
3
- `EventSystem` is a callback-based event handling system designed to simplify event-driven programming.
4
- It allows you to register, emit, and manage events with flexible callback support, making it easy to build modular and decoupled applications.
5
-
6
- ## Features
7
-
8
- - Register Callbacks: Attach functions to specific events using `on`.
9
- - One-Time Listeners: Use `once` to register callbacks that run only once.
10
- - Emit Events: Trigger events with optional data using `emit`.
11
- - Remove Callbacks: Detach specific callbacks with `off`.
12
- - Clear Events: Remove all callbacks globally or for specific events with `clear`.
13
-
14
- ## Why use this?
15
-
16
- Callbacks are often way faster than events, on both the browser and node, but they are also harder to manage. This system allows you to use callbacks in a more event-like way, and it is TypeScript-friendly, offering strong type safety for event names and payloads when using EventTuple definitions.
17
-
18
- ### Source
19
-
20
- Benchmarks:
21
-
22
- - https://jsbench.me/qmkkfcfpcw/2
23
- - https://hackernoon.com/nodejs-48x-faster-if-you-go-back-to-callbacks
24
-
25
- ## Usage
26
-
27
- ```ts
28
- import { EventSystem } from "...";
29
-
30
- interface FooProps {
31
- foo: string;
32
- }
33
-
34
- interface BarProps {
35
- bar: number;
36
- }
37
-
38
- const events = new EventSystem<[["foo", FooProps], ["bar", BarProps]]>({
39
- events: ["foo", "bar"],
40
- });
41
-
42
- events.on("bar", ({ bar }) => {
43
- console.log("bar event listened", bar);
44
- });
45
-
46
- events.emit("bar", { bar: 42 });
47
- ```
@@ -1,243 +0,0 @@
1
- import { describe, expect, test, spyOn } from "bun:test";
2
- import { EventSystem } from "./event-system";
3
-
4
- type TestEvents = [
5
- ["userJoined", { userId: string; name: string }],
6
- ["userLeft", { userId: string }],
7
- ["messageReceived", { from: string; message: string }],
8
- ["scoreUpdated", { playerId: string; score: number }]
9
- ];
10
-
11
- describe("EventSystem", () => {
12
- test("should initialize with provided events", () => {
13
- const events = new EventSystem<TestEvents>({
14
- events: ["userJoined", "userLeft"],
15
- });
16
- expect(events).toBeDefined();
17
- });
18
-
19
- test("should register and call event callback", () => {
20
- const events = new EventSystem<TestEvents>({
21
- events: ["userJoined"],
22
- });
23
-
24
- let called = false;
25
- events.on("userJoined", (data) => {
26
- called = true;
27
- expect(data.userId).toBe("123");
28
- expect(data.name).toBe("Alice");
29
- });
30
-
31
- events.emit("userJoined", { userId: "123", name: "Alice" });
32
- expect(called).toBe(true);
33
- });
34
-
35
- test("should call multiple callbacks for same event", () => {
36
- const events = new EventSystem<TestEvents>({
37
- events: ["userJoined"],
38
- });
39
-
40
- let count = 0;
41
- events.on("userJoined", () => count++);
42
- events.on("userJoined", () => count++);
43
- events.on("userJoined", () => count++);
44
-
45
- events.emit("userJoined", { userId: "123", name: "Bob" });
46
- expect(count).toBe(3);
47
- });
48
-
49
- test("should handle once() callback that runs only once", () => {
50
- const events = new EventSystem<TestEvents>({
51
- events: ["messageReceived"],
52
- });
53
-
54
- let count = 0;
55
- events.once("messageReceived", () => count++);
56
-
57
- events.emit("messageReceived", { from: "Alice", message: "Hello" });
58
- events.emit("messageReceived", { from: "Bob", message: "Hi" });
59
- events.emit("messageReceived", { from: "Charlie", message: "Hey" });
60
-
61
- expect(count).toBe(1);
62
- });
63
-
64
- test("should remove callback with off()", () => {
65
- const events = new EventSystem<TestEvents>({
66
- events: ["scoreUpdated"],
67
- });
68
-
69
- let count = 0;
70
- const callback = () => count++;
71
-
72
- events.on("scoreUpdated", callback);
73
- events.emit("scoreUpdated", { playerId: "p1", score: 100 });
74
- expect(count).toBe(1);
75
-
76
- events.off("scoreUpdated", callback);
77
- events.emit("scoreUpdated", { playerId: "p1", score: 200 });
78
- expect(count).toBe(1); // Should still be 1
79
- });
80
-
81
- test("should clear specific event callbacks", () => {
82
- const events = new EventSystem<TestEvents>({
83
- events: ["userJoined", "userLeft"],
84
- });
85
-
86
- let joinCount = 0;
87
- let leaveCount = 0;
88
-
89
- events.on("userJoined", () => joinCount++);
90
- events.on("userJoined", () => joinCount++);
91
- events.on("userLeft", () => leaveCount++);
92
-
93
- events.clear("userJoined");
94
-
95
- events.emit("userJoined", { userId: "123", name: "Alice" });
96
- events.emit("userLeft", { userId: "123" });
97
-
98
- expect(joinCount).toBe(0);
99
- expect(leaveCount).toBe(1);
100
- });
101
-
102
- test("should clear all event callbacks", () => {
103
- const events = new EventSystem<TestEvents>({
104
- events: ["userJoined", "userLeft", "messageReceived"],
105
- });
106
-
107
- let count = 0;
108
- events.on("userJoined", () => count++);
109
- events.on("userLeft", () => count++);
110
- events.on("messageReceived", () => count++);
111
-
112
- events.clear();
113
-
114
- events.emit("userJoined", { userId: "123", name: "Alice" });
115
- events.emit("userLeft", { userId: "123" });
116
- events.emit("messageReceived", { from: "Alice", message: "Hi" });
117
-
118
- expect(count).toBe(0);
119
- });
120
-
121
- test("should warn when registering callback for non-existent event", () => {
122
- const events = new EventSystem<TestEvents>({
123
- events: ["userJoined"],
124
- });
125
-
126
- const consoleWarn = spyOn(console, "warn");
127
- // @ts-expect-error Testing invalid event name
128
- events.on("nonExistent", () => {});
129
- expect(consoleWarn).toHaveBeenCalledWith('Event "nonExistent" does not exist.');
130
- consoleWarn.mockRestore();
131
- });
132
-
133
- test("should warn when emitting non-existent event", () => {
134
- const events = new EventSystem<TestEvents>({
135
- events: ["userJoined"],
136
- });
137
-
138
- const consoleWarn = spyOn(console, "warn");
139
- // @ts-expect-error Testing invalid event name
140
- events.emit("nonExistent", {});
141
- expect(consoleWarn).toHaveBeenCalledWith('Event "nonExistent" does not exist.');
142
- consoleWarn.mockRestore();
143
- });
144
-
145
- test("should pass correct data to callbacks", () => {
146
- const events = new EventSystem<TestEvents>({
147
- events: ["scoreUpdated"],
148
- });
149
-
150
- const receivedData: Array<{ playerId: string; score: number }> = [];
151
- events.on("scoreUpdated", (data) => receivedData.push(data));
152
-
153
- events.emit("scoreUpdated", { playerId: "p1", score: 100 });
154
- events.emit("scoreUpdated", { playerId: "p2", score: 200 });
155
-
156
- expect(receivedData).toEqual([
157
- { playerId: "p1", score: 100 },
158
- { playerId: "p2", score: 200 },
159
- ]);
160
- });
161
-
162
- test("should handle callbacks that throw errors", () => {
163
- const events = new EventSystem<TestEvents>({
164
- events: ["userJoined"],
165
- });
166
-
167
- let successCount = 0;
168
- events.on("userJoined", () => {
169
- throw new Error("Callback error");
170
- });
171
- events.on("userJoined", () => successCount++);
172
-
173
- expect(() =>
174
- events.emit("userJoined", { userId: "123", name: "Alice" })
175
- ).toThrow();
176
-
177
- // First callback threw, so second wasn't reached
178
- expect(successCount).toBe(0);
179
- });
180
-
181
- test("should maintain callback order", () => {
182
- const events = new EventSystem<TestEvents>({
183
- events: ["messageReceived"],
184
- });
185
-
186
- const order: number[] = [];
187
- events.on("messageReceived", () => order.push(1));
188
- events.on("messageReceived", () => order.push(2));
189
- events.on("messageReceived", () => order.push(3));
190
-
191
- events.emit("messageReceived", { from: "Test", message: "Hello" });
192
- expect(order).toEqual([1, 2, 3]);
193
- });
194
-
195
- test("should allow same callback to be registered multiple times", () => {
196
- const events = new EventSystem<TestEvents>({
197
- events: ["userJoined"],
198
- });
199
-
200
- let count = 0;
201
- const callback = () => count++;
202
-
203
- events.on("userJoined", callback);
204
- events.on("userJoined", callback);
205
-
206
- events.emit("userJoined", { userId: "123", name: "Alice" });
207
- // Set only stores unique callbacks, so it should be called once
208
- expect(count).toBe(1);
209
- });
210
-
211
- test("should handle rapid event emissions", () => {
212
- const events = new EventSystem<TestEvents>({
213
- events: ["scoreUpdated"],
214
- });
215
-
216
- let count = 0;
217
- events.on("scoreUpdated", () => count++);
218
-
219
- for (let i = 0; i < 1000; i++) {
220
- events.emit("scoreUpdated", { playerId: "p1", score: i });
221
- }
222
-
223
- expect(count).toBe(1000);
224
- });
225
-
226
- test("should handle once() with multiple callbacks", () => {
227
- const events = new EventSystem<TestEvents>({
228
- events: ["userJoined"],
229
- });
230
-
231
- let count1 = 0;
232
- let count2 = 0;
233
-
234
- events.once("userJoined", () => count1++);
235
- events.on("userJoined", () => count2++);
236
-
237
- events.emit("userJoined", { userId: "123", name: "Alice" });
238
- events.emit("userJoined", { userId: "456", name: "Bob" });
239
-
240
- expect(count1).toBe(1);
241
- expect(count2).toBe(2);
242
- });
243
- });
@@ -1,140 +0,0 @@
1
- /* ---------- Types ---------- */
2
- type Callback<Props> = (props: Props) => void;
3
-
4
-
5
- type EventMapFromTuple<T extends [string, unknown][]> = {
6
- [K in T[number]as K[0]]: K[1];
7
- };
8
-
9
- /* ---------- Interfaces ---------- */
10
- interface EventSystemProps<EventNames extends string> {
11
- /**
12
- * @description
13
- * The list of events to ever be registered.
14
- */
15
- events: EventNames[];
16
- }
17
-
18
- /**
19
- * @description
20
- * A callback-based event handling system designed to simplify
21
- * event-driven programming.
22
- */
23
- export class EventSystem<EventTuple extends [string, unknown][]> {
24
- /**
25
- * @private
26
- * @description
27
- * The map of registered events and their callbacks.
28
- */
29
- private callbacks: Map<string, Set<Callback<unknown>>>;
30
-
31
- /**
32
- * @private
33
- * @description
34
- * The list of events that were registered.
35
- */
36
- private events: string[];
37
-
38
- constructor({ events }: EventSystemProps<string>) {
39
- this.callbacks = new Map();
40
- this.events = events;
41
-
42
- for (const name of this.events) {
43
- this.callbacks.set(name, new Set());
44
- }
45
- }
46
-
47
- /**
48
- * @description
49
- * Registers a callback for an event.
50
- *
51
- * @param name Event name
52
- * @param callback Callback to run when the event is emitted
53
- */
54
- on<EventName extends keyof EventMapFromTuple<EventTuple> & string>(
55
- name: EventName,
56
- callback: Callback<EventMapFromTuple<EventTuple>[EventName]>
57
- ): void {
58
- const event = this.callbacks.get(name) as Set<Callback<EventMapFromTuple<EventTuple>[EventName]>> | undefined;
59
- if (!event) return console.warn(`Event "${name}" does not exist.`);
60
-
61
- event.add(callback);
62
- }
63
-
64
- /**
65
- * @description
66
- * Registers a callback for an event that runs only once.
67
- *
68
- * @param name Event name
69
- * @param callback Callback to run when the event is emitted
70
- */
71
- once<EventName extends keyof EventMapFromTuple<EventTuple> & string>(
72
- name: EventName,
73
- callback: Callback<EventMapFromTuple<EventTuple>[EventName]>
74
- ): void {
75
- const wrapper: Callback<EventMapFromTuple<EventTuple>[EventName]> = (props) => {
76
- callback(props);
77
- this.off(name, wrapper);
78
- };
79
-
80
- this.on(name, wrapper);
81
- }
82
-
83
- /**
84
- * @description
85
- * Emits an event, running all registered callbacks.
86
- *
87
- * @param name Event name
88
- * @param data Event data
89
- */
90
- emit<EventName extends keyof EventMapFromTuple<EventTuple> & string>(
91
- name: EventName,
92
- data: EventMapFromTuple<EventTuple>[EventName]
93
- ) {
94
- const event = this.callbacks.get(name);
95
- if (!event) return console.warn(`Event "${name}" does not exist.`);
96
-
97
- for (const callback of event) {
98
- callback(data);
99
- }
100
- }
101
-
102
- /**
103
- * @description
104
- * Removes a callback from an event.
105
- *
106
- * @param name Event name
107
- * @param callback Callback to remove
108
- */
109
- off<EventName extends keyof EventMapFromTuple<EventTuple> & string>(
110
- name: EventName,
111
- callback: Callback<EventMapFromTuple<EventTuple>[EventName]>
112
- ): void {
113
- const event = this.callbacks.get(name) as Set<Callback<EventMapFromTuple<EventTuple>[EventName]>> | undefined;
114
- if (!event) return console.warn(`Event "${name}" does not exist.`);
115
-
116
- event.delete(callback);
117
- }
118
-
119
- /**
120
- * @description
121
- * Removes all callbacks.
122
- *
123
- * @param name Optional event name
124
- */
125
- clear<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name?: EventName): void {
126
- if (!name) {
127
- this.callbacks.clear();
128
- for (const name of this.events) {
129
- this.callbacks.set(name, new Set());
130
- }
131
-
132
- return;
133
- }
134
-
135
- const event = this.callbacks.get(name);
136
- if (!event) return console.warn(`Event "${name}" does not exist.`);
137
-
138
- event.clear();
139
- }
140
- }
@@ -1 +0,0 @@
1
- export * from './event-system';
@@ -1,77 +0,0 @@
1
- # FixedTicker
2
-
3
- `FixedTicker` is a utility class for managing fixed-rate update ticks in JavaScript/TypeScript applications. It is designed for deterministic game loops, working both in the browser (e.g., with Pixi.js) and on Node.js servers.
4
-
5
- This class ensures that updates run at a fixed timestep, which is essential for predictable, lockstep multiplayer simulations.
6
-
7
- ---
8
-
9
- ## Features
10
-
11
- - Fixed-timestep updates with configurable tick rate.
12
- - Accumulates elapsed time and determines how many ticks to process per frame.
13
- - Limits the maximum number of ticks per frame to prevent runaway loops.
14
- - Provides a tick count for deterministic simulation.
15
- - Optional callback for detecting skipped ticks (useful for debugging or network reconciliation).
16
- - Compatible with both client and server environments.
17
-
18
- ## Usage
19
-
20
- ```typescript
21
- import { FixedTicker } from './fixed-ticker';
22
-
23
- const ticker = new FixedTicker({
24
- rate: 30, // ticks per second
25
- onTick: (deltaTime, tick) => {
26
- // Your fixed-step game logic here
27
- // deltaTime = 1 / rate
28
- console.log(`Tick ${tick} - dt: ${deltaTime}`);
29
- },
30
- onTickSkipped: (skipped) => {
31
- console.warn(`Skipped ${skipped} ticks due to high delta time`);
32
- }
33
- });
34
-
35
- // Call once per frame, passing elapsed time in seconds
36
- function gameLoop(deltaTime: number) {
37
- ticker.tick(deltaTime);
38
-
39
- // Optional: interpolate visuals using alpha (0-1)
40
- render(ticker.alpha); // for smooth rendering between ticks
41
- }
42
- ```
43
-
44
- ## Notes
45
-
46
- - This class does not automatically guarantee determinism; your game logic must also be deterministic (e.g., using seeded random numbers and consistent math operations).
47
- - For lockstep multiplayer, always use the tickCount to synchronize inputs and simulation steps.
48
- - Use `ticker.alpha` for smooth client-side rendering between fixed ticks (automatically clamped to prevent extrapolation).
49
-
50
- ## Example: Deterministic Multiplayer Loop
51
-
52
- ```typescript
53
- const ticker = new FixedTicker({
54
- rate: 12, // will fire the onTick callback 12 times per second
55
- onTick: (deltaTime, tick) => {
56
- applyInputsForTick(tick);
57
- updateSimulation(deltaTime);
58
- }
59
- });
60
-
61
- // in browser
62
- function frame(deltaTime: number) {
63
- ticker.tick(deltaTime);
64
- render(interpolate(ticker.alpha));
65
- }
66
-
67
- // in Node.js
68
- setInterval(() => {
69
- const deltaTime = 1 / ticker.rate; // fixed timestep
70
- ticker.tick(deltaTime);
71
- updateSimulation(deltaTime);
72
- }, 1000 / ticker.rate);
73
- ```
74
-
75
- ---
76
-
77
- `FixedTicker` provides a reliable, minimal, and deterministic foundation for game loops and simulations where consistent, fixed-step updates are crucial.
@@ -1,151 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { FixedTicker } from "./fixed-ticker";
3
-
4
- describe("FixedTicker", () => {
5
- test("should initialize with correct rate", () => {
6
- const ticker = new FixedTicker({ rate: 60, onTick: () => { } });
7
- expect(ticker.rate).toBe(60);
8
- });
9
-
10
- test("should call onTick with correct deltaTime", () => {
11
- let calledDelta = 0;
12
- const ticker = new FixedTicker({
13
- rate: 60,
14
- onTick: (dt) => {
15
- calledDelta = dt;
16
- },
17
- });
18
-
19
- ticker.tick(1 / 60);
20
- expect(calledDelta).toBeCloseTo(1 / 60, 5);
21
- });
22
-
23
- test("should accumulate time and execute multiple ticks", () => {
24
- let tickCount = 0;
25
- const ticker = new FixedTicker({
26
- rate: 60,
27
- onTick: () => {
28
- tickCount++;
29
- },
30
- });
31
-
32
- // Simulate 3 frames worth of time (add small epsilon for floating point)
33
- ticker.tick(3.01 / 60);
34
- expect(tickCount).toBe(3);
35
- });
36
-
37
- test("should track tick count correctly", () => {
38
- const ticker = new FixedTicker({
39
- rate: 60,
40
- onTick: () => { },
41
- });
42
-
43
- ticker.tick(5.01 / 60);
44
- expect(ticker.tickCount).toBe(5);
45
- });
46
-
47
- test("should reset tick count", () => {
48
- const ticker = new FixedTicker({
49
- rate: 60,
50
- onTick: () => { },
51
- });
52
-
53
- ticker.tick(3.01 / 60);
54
- expect(ticker.tickCount).toBe(3);
55
-
56
- ticker.resetTickCount();
57
- expect(ticker.tickCount).toBe(0);
58
- });
59
-
60
- test("should pass tick number to onTick callback", () => {
61
- const tickNumbers: number[] = [];
62
- const ticker = new FixedTicker({
63
- rate: 60,
64
- onTick: (_dt, tick) => {
65
- if (tick !== undefined) tickNumbers.push(tick);
66
- },
67
- });
68
-
69
- ticker.tick(3.01 / 60);
70
- expect(tickNumbers).toEqual([0, 1, 2]);
71
- });
72
-
73
- test("should limit ticks per frame to maxTicksPerFrame", () => {
74
- let tickCount = 0;
75
- const ticker = new FixedTicker({
76
- rate: 60,
77
- onTick: () => {
78
- tickCount++;
79
- },
80
- });
81
-
82
- // Simulate a huge delta time (2 seconds)
83
- ticker.tick(2);
84
- // maxTicksPerFrame should be Math.max(1, Math.floor(60 / 2)) = 30
85
- expect(tickCount).toBe(30);
86
- });
87
-
88
- test("should provide accumulated time", () => {
89
- const ticker = new FixedTicker({
90
- rate: 60,
91
- onTick: () => { },
92
- });
93
-
94
- // Give it 1.5 ticks worth of time
95
- ticker.tick(1.5 / 60);
96
- expect(ticker.accumulatedTime).toBeCloseTo(0.5 / 60, 5);
97
- });
98
-
99
- test("should call onTickSkipped when ticks are skipped", () => {
100
- let skippedCount = 0;
101
- const ticker = new FixedTicker({
102
- rate: 60,
103
- onTick: () => { },
104
- });
105
-
106
- // Access the private onTickSkipped through constructor
107
- const tickerWithSkip = new FixedTicker({
108
- rate: 60,
109
- onTick: () => { },
110
- });
111
-
112
- // Monkey patch to add onTickSkipped
113
- (tickerWithSkip as any).onTickSkipped = (count: number) => {
114
- skippedCount = count;
115
- };
116
-
117
- // Simulate huge delta that exceeds maxTicksPerFrame
118
- tickerWithSkip.tick(2);
119
- expect(skippedCount).toBeGreaterThan(0);
120
- });
121
-
122
- test("should handle zero delta time", () => {
123
- let tickCount = 0;
124
- const ticker = new FixedTicker({
125
- rate: 60,
126
- onTick: () => {
127
- tickCount++;
128
- },
129
- });
130
-
131
- ticker.tick(0);
132
- expect(tickCount).toBe(0);
133
- expect(ticker.tickCount).toBe(0);
134
- });
135
-
136
- test("should handle very small delta times", () => {
137
- let tickCount = 0;
138
- const ticker = new FixedTicker({
139
- rate: 60,
140
- onTick: () => {
141
- tickCount++;
142
- },
143
- });
144
-
145
- // Simulate 100 very small frames that add up to slightly more than 1 tick
146
- for (let i = 0; i < 100; i++) {
147
- ticker.tick(1.01 / 60 / 100);
148
- }
149
- expect(tickCount).toBe(1);
150
- });
151
- });