murow 0.0.60 → 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.
Files changed (425) hide show
  1. package/README.md +52 -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-2d-renderer.js +1 -0
  74. package/dist/cjs/renderer/base-3d-renderer.js +1 -0
  75. package/dist/cjs/renderer/base-renderer.js +1 -0
  76. package/dist/cjs/renderer/index.js +1 -0
  77. package/dist/cjs/renderer/types.js +1 -0
  78. package/dist/esm/core/binary-codec/binary-codec.js +1 -0
  79. package/dist/esm/core/binary-codec/index.js +1 -0
  80. package/dist/esm/core/driver/driver.js +1 -0
  81. package/dist/esm/core/driver/drivers/immediate.js +1 -0
  82. package/dist/esm/core/driver/drivers/index.js +1 -0
  83. package/dist/esm/core/driver/drivers/raf.js +1 -0
  84. package/dist/esm/core/driver/drivers/timeout.js +1 -0
  85. package/dist/esm/core/driver/index.js +1 -0
  86. package/dist/esm/core/events/event-system.js +1 -0
  87. package/dist/esm/core/events/index.js +1 -0
  88. package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
  89. package/dist/esm/core/fixed-ticker/index.js +1 -0
  90. package/dist/esm/core/free-list/free-list.js +1 -0
  91. package/dist/esm/core/free-list/index.js +1 -0
  92. package/dist/esm/core/generate-id/generate-id.js +1 -0
  93. package/dist/esm/core/generate-id/index.js +1 -0
  94. package/dist/esm/core/index.js +1 -0
  95. package/dist/esm/core/input/index.js +1 -0
  96. package/dist/esm/core/input/manager.js +1 -0
  97. package/dist/esm/core/input/sources/browser.js +1 -0
  98. package/dist/esm/core/input/sources/index.js +1 -0
  99. package/dist/esm/core/input/types.js +0 -0
  100. package/dist/esm/core/lerp/index.js +1 -0
  101. package/dist/esm/core/lerp/lerp.js +1 -0
  102. package/dist/esm/core/navmesh/index.js +1 -0
  103. package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
  104. package/dist/esm/core/navmesh/navmesh.js +1 -0
  105. package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
  106. package/dist/esm/core/pooled-codec/index.js +1 -0
  107. package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
  108. package/dist/esm/core/prediction/index.js +1 -0
  109. package/dist/esm/core/prediction/prediction.js +1 -0
  110. package/dist/esm/core/ray/index.js +1 -0
  111. package/dist/esm/core/ray/ray-2d.js +1 -0
  112. package/dist/esm/core/ray/ray-3d.js +1 -0
  113. package/dist/esm/core/simple-rng/index.js +1 -0
  114. package/dist/esm/core/simple-rng/simple-rng.js +1 -0
  115. package/dist/esm/core/sparse-batcher/index.js +1 -0
  116. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
  117. package/dist/esm/ecs/component-store.js +1 -0
  118. package/dist/esm/ecs/component.js +1 -0
  119. package/dist/esm/ecs/entity-handle.js +1 -0
  120. package/dist/esm/ecs/index.js +1 -0
  121. package/dist/esm/ecs/system-builder.js +1 -0
  122. package/dist/esm/ecs/world-systems.js +1 -0
  123. package/dist/esm/ecs/world.js +1 -0
  124. package/dist/esm/game/index.js +1 -0
  125. package/dist/esm/game/loop/index.js +1 -0
  126. package/dist/esm/game/loop/loop.js +1 -0
  127. package/dist/esm/index.js +1 -0
  128. package/dist/esm/net/adapters/browser-websocket.js +1 -0
  129. package/dist/esm/net/adapters/bun-websocket.js +1 -0
  130. package/dist/esm/net/buffer-pool.js +1 -0
  131. package/dist/esm/net/client.js +1 -0
  132. package/dist/esm/net/index.js +1 -0
  133. package/dist/esm/net/server.js +1 -0
  134. package/dist/esm/net/types.js +1 -0
  135. package/dist/esm/net/validators.js +1 -0
  136. package/dist/esm/protocol/index.js +1 -0
  137. package/dist/esm/protocol/intent/define-intent.js +1 -0
  138. package/dist/esm/protocol/intent/index.js +1 -0
  139. package/dist/esm/protocol/intent/intent-registry.js +1 -0
  140. package/dist/esm/protocol/intent/intent.js +0 -0
  141. package/dist/esm/protocol/rpc/define-rpc.js +1 -0
  142. package/dist/esm/protocol/rpc/index.js +1 -0
  143. package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
  144. package/dist/esm/protocol/rpc/rpc.js +0 -0
  145. package/dist/esm/protocol/snapshot/index.js +1 -0
  146. package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
  147. package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
  148. package/dist/esm/protocol/snapshot/snapshot.js +1 -0
  149. package/dist/esm/renderer/base-2d-renderer.js +1 -0
  150. package/dist/esm/renderer/base-3d-renderer.js +1 -0
  151. package/dist/esm/renderer/base-renderer.js +1 -0
  152. package/dist/esm/renderer/index.js +1 -0
  153. package/dist/esm/renderer/types.js +0 -0
  154. package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
  155. package/dist/{core/loop → types/core/driver}/drivers/immediate.d.ts +1 -1
  156. package/dist/{core/loop → types/core/driver}/drivers/raf.d.ts +1 -1
  157. package/dist/{core/loop → types/core/driver}/drivers/timeout.d.ts +1 -1
  158. package/dist/{core/loop → types/core/driver}/index.d.ts +1 -1
  159. package/dist/{core → types/core}/events/event-system.d.ts +14 -33
  160. package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +1 -1
  161. package/dist/types/core/free-list/free-list.d.ts +31 -0
  162. package/dist/types/core/free-list/index.d.ts +1 -0
  163. package/dist/{core → types/core}/index.d.ts +7 -1
  164. package/dist/types/core/input/index.d.ts +3 -0
  165. package/dist/types/core/input/manager.d.ts +56 -0
  166. package/dist/types/core/input/sources/browser.d.ts +9 -0
  167. package/dist/types/core/input/sources/index.d.ts +1 -0
  168. package/dist/types/core/input/types.d.ts +36 -0
  169. package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
  170. package/dist/types/core/ray/index.d.ts +2 -0
  171. package/dist/types/core/ray/ray-2d.d.ts +37 -0
  172. package/dist/types/core/ray/ray-3d.d.ts +42 -0
  173. package/dist/types/core/simple-rng/index.d.ts +1 -0
  174. package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
  175. package/dist/types/core/sparse-batcher/index.d.ts +1 -0
  176. package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
  177. package/dist/{ecs → types/ecs}/system-builder.d.ts +20 -9
  178. package/dist/{ecs → types/ecs}/world.d.ts +11 -0
  179. package/dist/types/game/index.d.ts +1 -0
  180. package/dist/types/game/loop/index.d.ts +1 -0
  181. package/dist/types/game/loop/loop.d.ts +175 -0
  182. package/dist/{index.d.ts → types/index.d.ts} +2 -0
  183. package/dist/{net → types/net}/index.d.ts +2 -2
  184. package/dist/{net → types/net}/server.d.ts +39 -19
  185. package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +15 -0
  186. package/dist/{protocol → types/protocol}/intent/index.d.ts +1 -1
  187. package/dist/types/renderer/base-2d-renderer.d.ts +13 -0
  188. package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
  189. package/dist/types/renderer/base-renderer.d.ts +21 -0
  190. package/dist/types/renderer/index.d.ts +4 -0
  191. package/dist/types/renderer/types.d.ts +79 -0
  192. package/dist/webgpu/cjs/index.js +6004 -0
  193. package/dist/webgpu/esm/index.js +5972 -0
  194. package/dist/webgpu/types/2d/animation.d.ts +97 -0
  195. package/dist/webgpu/types/2d/renderer.d.ts +55 -0
  196. package/dist/webgpu/types/2d/shader.d.ts +61 -0
  197. package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
  198. package/dist/webgpu/types/2d/sprite-accessor.test.d.ts +1 -0
  199. package/dist/webgpu/types/3d/gltf-skin-parser.d.ts +101 -0
  200. package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
  201. package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
  202. package/dist/webgpu/types/3d/renderer.d.ts +216 -0
  203. package/dist/webgpu/types/3d/shader.d.ts +136 -0
  204. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
  205. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +8 -0
  206. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
  207. package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -0
  208. package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
  209. package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
  210. package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
  211. package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
  212. package/dist/webgpu/types/camera/index.d.ts +2 -0
  213. package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
  214. package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
  215. package/dist/webgpu/types/core/constants.d.ts +59 -0
  216. package/dist/webgpu/types/core/constants.test.d.ts +1 -0
  217. package/dist/webgpu/types/core/index.d.ts +2 -0
  218. package/dist/webgpu/types/core/math.d.ts +37 -0
  219. package/dist/webgpu/types/core/types.d.ts +125 -0
  220. package/dist/webgpu/types/core/types.test.d.ts +1 -0
  221. package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
  222. package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
  223. package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
  224. package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
  225. package/dist/webgpu/types/geometry/index.d.ts +2 -0
  226. package/dist/webgpu/types/index.d.ts +32 -0
  227. package/dist/webgpu/types/particle/emitter.d.ts +36 -0
  228. package/dist/webgpu/types/shaders/index.d.ts +2 -0
  229. package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
  230. package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
  231. package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
  232. package/dist/webgpu/types/shaders/utils.d.ts +28 -0
  233. package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
  234. package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
  235. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +57 -0
  236. package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
  237. package/package.json +96 -26
  238. package/dist/core/binary-codec/binary-codec.js +0 -354
  239. package/dist/core/binary-codec/index.js +0 -1
  240. package/dist/core/events/event-system.js +0 -88
  241. package/dist/core/events/index.js +0 -1
  242. package/dist/core/fixed-ticker/fixed-ticker.js +0 -101
  243. package/dist/core/fixed-ticker/index.js +0 -1
  244. package/dist/core/generate-id/generate-id.js +0 -25
  245. package/dist/core/generate-id/index.js +0 -1
  246. package/dist/core/index.js +0 -9
  247. package/dist/core/lerp/index.js +0 -1
  248. package/dist/core/lerp/lerp.js +0 -42
  249. package/dist/core/loop/drivers/immediate.js +0 -61
  250. package/dist/core/loop/drivers/index.js +0 -3
  251. package/dist/core/loop/drivers/raf.js +0 -62
  252. package/dist/core/loop/drivers/timeout.js +0 -71
  253. package/dist/core/loop/index.js +0 -2
  254. package/dist/core/loop/loop.js +0 -47
  255. package/dist/core/navmesh/index.js +0 -1
  256. package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
  257. package/dist/core/navmesh/navmesh.js +0 -799
  258. package/dist/core/navmesh/navmesh.worker.js +0 -79
  259. package/dist/core/pooled-codec/index.js +0 -1
  260. package/dist/core/pooled-codec/pooled-codec.js +0 -410
  261. package/dist/core/prediction/index.js +0 -1
  262. package/dist/core/prediction/prediction.js +0 -99
  263. package/dist/core.esm.js +0 -1
  264. package/dist/core.js +0 -1
  265. package/dist/ecs/component-store.js +0 -175
  266. package/dist/ecs/component.js +0 -43
  267. package/dist/ecs/entity-handle.js +0 -515
  268. package/dist/ecs/example.js +0 -125
  269. package/dist/ecs/index.js +0 -4
  270. package/dist/ecs/system-builder.js +0 -180
  271. package/dist/ecs/system.d.ts +0 -63
  272. package/dist/ecs/system.js +0 -92
  273. package/dist/ecs/world-systems.js +0 -79
  274. package/dist/ecs/world.js +0 -684
  275. package/dist/index.js +0 -24
  276. package/dist/net/adapters/browser-websocket.js +0 -74
  277. package/dist/net/adapters/bun-websocket.js +0 -245
  278. package/dist/net/buffer-pool.js +0 -89
  279. package/dist/net/client.js +0 -586
  280. package/dist/net/index.js +0 -58
  281. package/dist/net/server.js +0 -938
  282. package/dist/net/types.js +0 -31
  283. package/dist/net/validators.js +0 -88
  284. package/dist/protocol/index.js +0 -92
  285. package/dist/protocol/intent/define-intent.js +0 -125
  286. package/dist/protocol/intent/index.js +0 -91
  287. package/dist/protocol/intent/intent-registry.js +0 -91
  288. package/dist/protocol/rpc/define-rpc.js +0 -84
  289. package/dist/protocol/rpc/index.js +0 -3
  290. package/dist/protocol/rpc/rpc-registry.js +0 -159
  291. package/dist/protocol/rpc/rpc.js +0 -12
  292. package/dist/protocol/snapshot/index.js +0 -43
  293. package/dist/protocol/snapshot/snapshot-codec.js +0 -67
  294. package/dist/protocol/snapshot/snapshot-registry.js +0 -168
  295. package/dist/protocol/snapshot/snapshot.js +0 -30
  296. package/src/core/binary-codec/README.md +0 -60
  297. package/src/core/binary-codec/binary-codec.test.ts +0 -300
  298. package/src/core/binary-codec/binary-codec.ts +0 -448
  299. package/src/core/binary-codec/index.ts +0 -1
  300. package/src/core/events/README.md +0 -47
  301. package/src/core/events/event-system.test.ts +0 -243
  302. package/src/core/events/event-system.ts +0 -140
  303. package/src/core/events/index.ts +0 -1
  304. package/src/core/fixed-ticker/README.md +0 -77
  305. package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
  306. package/src/core/fixed-ticker/fixed-ticker.ts +0 -169
  307. package/src/core/fixed-ticker/index.ts +0 -1
  308. package/src/core/generate-id/README.md +0 -18
  309. package/src/core/generate-id/generate-id.test.ts +0 -79
  310. package/src/core/generate-id/generate-id.ts +0 -37
  311. package/src/core/generate-id/index.ts +0 -1
  312. package/src/core/index.ts +0 -9
  313. package/src/core/lerp/README.md +0 -79
  314. package/src/core/lerp/index.ts +0 -1
  315. package/src/core/lerp/lerp.test.ts +0 -90
  316. package/src/core/lerp/lerp.ts +0 -42
  317. package/src/core/loop/README.md +0 -97
  318. package/src/core/loop/drivers/immediate.ts +0 -66
  319. package/src/core/loop/drivers/index.ts +0 -3
  320. package/src/core/loop/drivers/raf.ts +0 -67
  321. package/src/core/loop/drivers/timeout.ts +0 -77
  322. package/src/core/loop/index.ts +0 -2
  323. package/src/core/loop/loop.test.ts +0 -414
  324. package/src/core/loop/loop.ts +0 -71
  325. package/src/core/navmesh/README.md +0 -164
  326. package/src/core/navmesh/index.ts +0 -1
  327. package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
  328. package/src/core/navmesh/navmesh-workers.test.ts +0 -356
  329. package/src/core/navmesh/navmesh.test.ts +0 -344
  330. package/src/core/navmesh/navmesh.ts +0 -1047
  331. package/src/core/navmesh/navmesh.worker.ts +0 -147
  332. package/src/core/pooled-codec/README.md +0 -70
  333. package/src/core/pooled-codec/index.ts +0 -1
  334. package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
  335. package/src/core/pooled-codec/pooled-codec.ts +0 -504
  336. package/src/core/prediction/README.md +0 -64
  337. package/src/core/prediction/index.ts +0 -1
  338. package/src/core/prediction/prediction.test.ts +0 -423
  339. package/src/core/prediction/prediction.ts +0 -112
  340. package/src/ecs/README.md +0 -427
  341. package/src/ecs/benchmark.test.ts +0 -1645
  342. package/src/ecs/component-store.ts +0 -198
  343. package/src/ecs/component.ts +0 -90
  344. package/src/ecs/entity-handle.test.ts +0 -393
  345. package/src/ecs/entity-handle.ts +0 -563
  346. package/src/ecs/example.ts +0 -152
  347. package/src/ecs/index.ts +0 -4
  348. package/src/ecs/system-builder.ts +0 -309
  349. package/src/ecs/system.ts +0 -111
  350. package/src/ecs/world-systems.ts +0 -83
  351. package/src/ecs/world.test.ts +0 -310
  352. package/src/ecs/world.ts +0 -828
  353. package/src/index.ts +0 -28
  354. package/src/net/README.md +0 -474
  355. package/src/net/adapters/browser-websocket.ts +0 -86
  356. package/src/net/adapters/bun-websocket.ts +0 -292
  357. package/src/net/buffer-pool.ts +0 -106
  358. package/src/net/client.test.ts +0 -807
  359. package/src/net/client.ts +0 -695
  360. package/src/net/index.ts +0 -60
  361. package/src/net/server.test.ts +0 -799
  362. package/src/net/server.ts +0 -1116
  363. package/src/net/types.ts +0 -228
  364. package/src/net/validators.ts +0 -104
  365. package/src/protocol/README.md +0 -469
  366. package/src/protocol/index.ts +0 -93
  367. package/src/protocol/intent/define-intent.test.ts +0 -397
  368. package/src/protocol/intent/define-intent.ts +0 -182
  369. package/src/protocol/intent/index.ts +0 -94
  370. package/src/protocol/intent/intent-registry.test.ts +0 -198
  371. package/src/protocol/intent/intent-registry.ts +0 -112
  372. package/src/protocol/intent/intent.ts +0 -12
  373. package/src/protocol/rpc/define-rpc.test.ts +0 -141
  374. package/src/protocol/rpc/define-rpc.ts +0 -113
  375. package/src/protocol/rpc/index.ts +0 -3
  376. package/src/protocol/rpc/rpc-registry.test.ts +0 -168
  377. package/src/protocol/rpc/rpc-registry.ts +0 -176
  378. package/src/protocol/rpc/rpc.ts +0 -37
  379. package/src/protocol/snapshot/index.ts +0 -45
  380. package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
  381. package/src/protocol/snapshot/snapshot-codec.ts +0 -87
  382. package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
  383. package/src/protocol/snapshot/snapshot-registry.ts +0 -201
  384. package/src/protocol/snapshot/snapshot.test.ts +0 -76
  385. package/src/protocol/snapshot/snapshot.ts +0 -41
  386. /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
  387. /package/dist/{core/loop/loop.d.ts → types/core/driver/driver.d.ts} +0 -0
  388. /package/dist/{core/loop → types/core/driver}/drivers/index.d.ts +0 -0
  389. /package/dist/{core → types/core}/events/index.d.ts +0 -0
  390. /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
  391. /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
  392. /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
  393. /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
  394. /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
  395. /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
  396. /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
  397. /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
  398. /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
  399. /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
  400. /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
  401. /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
  402. /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
  403. /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
  404. /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
  405. /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
  406. /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
  407. /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
  408. /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
  409. /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
  410. /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
  411. /package/dist/{net → types/net}/client.d.ts +0 -0
  412. /package/dist/{net → types/net}/types.d.ts +0 -0
  413. /package/dist/{net → types/net}/validators.d.ts +0 -0
  414. /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
  415. /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
  416. /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
  417. /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
  418. /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
  419. /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
  420. /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
  421. /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
  422. /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
  423. /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
  424. /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
  425. /package/dist/{protocol/intent/intent.js → webgpu/types/2d/animation.test.d.ts} +0 -0
@@ -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
- });