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,423 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { IntentTracker, Reconciliator } from "./prediction";
3
-
4
- describe("IntentTracker", () => {
5
- test("should initialize with size 0", () => {
6
- const tracker = new IntentTracker<string>();
7
- expect(tracker.size).toBe(0);
8
- });
9
-
10
- test("should track intent for a tick", () => {
11
- const tracker = new IntentTracker<string>();
12
- tracker.track(1, "move_forward");
13
- expect(tracker.size).toBe(1);
14
- });
15
-
16
- test("should track multiple intents", () => {
17
- const tracker = new IntentTracker<string>();
18
- tracker.track(1, "move_forward");
19
- tracker.track(2, "jump");
20
- tracker.track(3, "shoot");
21
- expect(tracker.size).toBe(3);
22
- });
23
-
24
- test("should return all intents in ascending tick order", () => {
25
- const tracker = new IntentTracker<string>();
26
- tracker.track(3, "third");
27
- tracker.track(1, "first");
28
- tracker.track(2, "second");
29
-
30
- const values = tracker.values();
31
- expect(values).toEqual(["first", "second", "third"]);
32
- });
33
-
34
- test("should drop intents up to specified tick", () => {
35
- const tracker = new IntentTracker<string>();
36
- tracker.track(1, "intent1");
37
- tracker.track(2, "intent2");
38
- tracker.track(3, "intent3");
39
- tracker.track(4, "intent4");
40
-
41
- const remaining = tracker.dropUpTo(2);
42
- expect(remaining).toEqual(["intent3", "intent4"]);
43
- expect(tracker.size).toBe(2);
44
- });
45
-
46
- test("should drop all intents when tick is at the end", () => {
47
- const tracker = new IntentTracker<string>();
48
- tracker.track(1, "intent1");
49
- tracker.track(2, "intent2");
50
- tracker.track(3, "intent3");
51
-
52
- const remaining = tracker.dropUpTo(5);
53
- expect(remaining).toEqual([]);
54
- expect(tracker.size).toBe(0);
55
- });
56
-
57
- test("should keep all intents when drop tick is before all", () => {
58
- const tracker = new IntentTracker<string>();
59
- tracker.track(5, "intent1");
60
- tracker.track(6, "intent2");
61
- tracker.track(7, "intent3");
62
-
63
- const remaining = tracker.dropUpTo(4);
64
- expect(remaining).toEqual(["intent1", "intent2", "intent3"]);
65
- expect(tracker.size).toBe(3);
66
- });
67
-
68
- test("should handle dropping from empty tracker", () => {
69
- const tracker = new IntentTracker<string>();
70
- const remaining = tracker.dropUpTo(10);
71
- expect(remaining).toEqual([]);
72
- expect(tracker.size).toBe(0);
73
- });
74
-
75
- test("should handle complex intent objects", () => {
76
- interface MoveIntent {
77
- action: string;
78
- x: number;
79
- y: number;
80
- }
81
-
82
- const tracker = new IntentTracker<MoveIntent>();
83
- tracker.track(1, { action: "move", x: 10, y: 20 });
84
- tracker.track(2, { action: "move", x: 15, y: 25 });
85
-
86
- const values = tracker.values();
87
- expect(values.length).toBe(2);
88
- expect(values[0]).toEqual({ action: "move", x: 10, y: 20 });
89
- expect(values[1]).toEqual({ action: "move", x: 15, y: 25 });
90
- });
91
-
92
- test("should handle multiple intents at same tick", () => {
93
- const tracker = new IntentTracker<string>();
94
- tracker.track(1, "first");
95
- tracker.track(1, "second"); // Add to same tick
96
-
97
- expect(tracker.size).toBe(1); // Still one tick
98
- const values = tracker.values();
99
- expect(values).toEqual(["first", "second"]); // Both intents stored
100
- });
101
-
102
- test("should maintain correct size after operations", () => {
103
- const tracker = new IntentTracker<number>();
104
- expect(tracker.size).toBe(0);
105
-
106
- tracker.track(1, 100);
107
- expect(tracker.size).toBe(1);
108
-
109
- tracker.track(2, 200);
110
- expect(tracker.size).toBe(2);
111
-
112
- tracker.dropUpTo(1);
113
- expect(tracker.size).toBe(1);
114
-
115
- tracker.dropUpTo(10);
116
- expect(tracker.size).toBe(0);
117
- });
118
- });
119
-
120
- describe("Reconciliator", () => {
121
- interface PlayerState {
122
- x: number;
123
- y: number;
124
- health: number;
125
- }
126
-
127
- interface PlayerIntent {
128
- dx: number;
129
- dy: number;
130
- }
131
-
132
- test("should initialize with callbacks", () => {
133
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
134
- onLoadState: () => {},
135
- onReplay: () => {},
136
- });
137
-
138
- expect(reconciliator).toBeDefined();
139
- });
140
-
141
- test("should track intents", () => {
142
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
143
- onLoadState: () => {},
144
- onReplay: () => {},
145
- });
146
-
147
- reconciliator.trackIntent(1, { dx: 1, dy: 0 });
148
- reconciliator.trackIntent(2, { dx: 0, dy: 1 });
149
-
150
- // No direct way to check size, but we can verify through snapshot
151
- expect(reconciliator).toBeDefined();
152
- });
153
-
154
- test("should load state and replay intents on snapshot", () => {
155
- let loadedState: PlayerState | null = null;
156
- let replayedIntents: PlayerIntent[] = [];
157
-
158
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
159
- onLoadState: (state) => {
160
- loadedState = state;
161
- },
162
- onReplay: (intents) => {
163
- replayedIntents = intents;
164
- },
165
- });
166
-
167
- // Track some intents
168
- reconciliator.trackIntent(1, { dx: 1, dy: 0 });
169
- reconciliator.trackIntent(2, { dx: 0, dy: 1 });
170
- reconciliator.trackIntent(3, { dx: -1, dy: 0 });
171
-
172
- // Receive snapshot at tick 2
173
- const snapshot = {
174
- tick: 2,
175
- state: { x: 10, y: 20, health: 100 },
176
- };
177
-
178
- reconciliator.onSnapshot(snapshot);
179
-
180
- // Should load state
181
- expect(loadedState!).toEqual({ x: 10, y: 20, health: 100 });
182
-
183
- // Should replay only intent at tick 3 (after tick 2)
184
- expect(replayedIntents).toEqual([{ dx: -1, dy: 0 }]);
185
- });
186
-
187
- test("should drop all intents when snapshot is ahead", () => {
188
- let replayedIntents: PlayerIntent[] = [];
189
-
190
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
191
- onLoadState: () => {},
192
- onReplay: (intents) => {
193
- replayedIntents = intents;
194
- },
195
- });
196
-
197
- reconciliator.trackIntent(1, { dx: 1, dy: 0 });
198
- reconciliator.trackIntent(2, { dx: 0, dy: 1 });
199
-
200
- // Snapshot ahead of all intents
201
- reconciliator.onSnapshot({
202
- tick: 10,
203
- state: { x: 100, y: 100, health: 50 },
204
- });
205
-
206
- expect(replayedIntents).toEqual([]);
207
- });
208
-
209
- test("should keep all intents when snapshot is behind", () => {
210
- let replayedIntents: PlayerIntent[] = [];
211
-
212
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
213
- onLoadState: () => {},
214
- onReplay: (intents) => {
215
- replayedIntents = intents;
216
- },
217
- });
218
-
219
- reconciliator.trackIntent(5, { dx: 1, dy: 0 });
220
- reconciliator.trackIntent(6, { dx: 0, dy: 1 });
221
- reconciliator.trackIntent(7, { dx: -1, dy: 0 });
222
-
223
- // Snapshot before all intents
224
- reconciliator.onSnapshot({
225
- tick: 3,
226
- state: { x: 0, y: 0, health: 100 },
227
- });
228
-
229
- expect(replayedIntents.length).toBe(3);
230
- expect(replayedIntents).toEqual([
231
- { dx: 1, dy: 0 },
232
- { dx: 0, dy: 1 },
233
- { dx: -1, dy: 0 },
234
- ]);
235
- });
236
-
237
- test("should handle multiple snapshots", () => {
238
- let loadedStates: PlayerState[] = [];
239
- let allReplayedIntents: PlayerIntent[][] = [];
240
-
241
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
242
- onLoadState: (state) => {
243
- loadedStates.push({ ...state });
244
- },
245
- onReplay: (intents) => {
246
- allReplayedIntents.push([...intents]);
247
- },
248
- });
249
-
250
- // Track intents 1-5
251
- for (let i = 1; i <= 5; i++) {
252
- reconciliator.trackIntent(i, { dx: i, dy: i });
253
- }
254
-
255
- // First snapshot at tick 2
256
- reconciliator.onSnapshot({
257
- tick: 2,
258
- state: { x: 20, y: 20, health: 100 },
259
- });
260
-
261
- // Track more intents 6-8
262
- for (let i = 6; i <= 8; i++) {
263
- reconciliator.trackIntent(i, { dx: i, dy: i });
264
- }
265
-
266
- // Second snapshot at tick 6
267
- reconciliator.onSnapshot({
268
- tick: 6,
269
- state: { x: 60, y: 60, health: 90 },
270
- });
271
-
272
- expect(loadedStates.length).toBe(2);
273
- expect(loadedStates[0]).toEqual({ x: 20, y: 20, health: 100 });
274
- expect(loadedStates[1]).toEqual({ x: 60, y: 60, health: 90 });
275
-
276
- // After first snapshot, should replay ticks 3, 4, 5
277
- expect(allReplayedIntents[0].length).toBe(3);
278
-
279
- // After second snapshot, should replay ticks 7, 8
280
- expect(allReplayedIntents[1].length).toBe(2);
281
- });
282
-
283
- test("should handle empty intent list", () => {
284
- let onReplayCalled = false;
285
-
286
- const reconciliator = new Reconciliator<PlayerIntent, PlayerState>({
287
- onLoadState: () => {},
288
- onReplay: (intents) => {
289
- onReplayCalled = true;
290
- },
291
- });
292
-
293
- // Receive snapshot with no tracked intents
294
- reconciliator.onSnapshot({
295
- tick: 5,
296
- state: { x: 50, y: 50, health: 100 },
297
- });
298
-
299
- // onReplay should not be called when there are no intents to replay
300
- expect(onReplayCalled).toBe(false);
301
- });
302
-
303
- test("should work with complex intent types", () => {
304
- interface ComplexIntent {
305
- type: "move" | "attack" | "defend";
306
- target?: { x: number; y: number };
307
- data?: Record<string, any>;
308
- }
309
-
310
- interface ComplexState {
311
- position: { x: number; y: number };
312
- inventory: string[];
313
- }
314
-
315
- let capturedState: ComplexState | null = null;
316
- let capturedIntents: ComplexIntent[] = [];
317
-
318
- const reconciliator = new Reconciliator<ComplexIntent, ComplexState>({
319
- onLoadState: (state) => {
320
- capturedState = state;
321
- },
322
- onReplay: (intents) => {
323
- capturedIntents = intents;
324
- },
325
- });
326
-
327
- reconciliator.trackIntent(1, { type: "move", target: { x: 10, y: 10 } });
328
- reconciliator.trackIntent(2, { type: "attack", data: { damage: 50 } });
329
- reconciliator.trackIntent(3, { type: "defend" });
330
-
331
- reconciliator.onSnapshot({
332
- tick: 1,
333
- state: {
334
- position: { x: 5, y: 5 },
335
- inventory: ["sword", "shield"],
336
- },
337
- });
338
-
339
- expect(capturedState!).toEqual({
340
- position: { x: 5, y: 5 },
341
- inventory: ["sword", "shield"],
342
- });
343
-
344
- expect(capturedIntents.length).toBe(2);
345
- expect(capturedIntents[0].type).toBe("attack");
346
- expect(capturedIntents[1].type).toBe("defend");
347
- });
348
-
349
- test("should handle rapid intent tracking", () => {
350
- let replayCount = 0;
351
-
352
- const reconciliator = new Reconciliator<number, { value: number }>({
353
- onLoadState: () => {},
354
- onReplay: (intents) => {
355
- replayCount = intents.length;
356
- },
357
- });
358
-
359
- // Track 1000 intents rapidly
360
- for (let i = 1; i <= 1000; i++) {
361
- reconciliator.trackIntent(i, i);
362
- }
363
-
364
- // Snapshot in the middle
365
- reconciliator.onSnapshot({
366
- tick: 500,
367
- state: { value: 500 },
368
- });
369
-
370
- // Should replay remaining 500 intents
371
- expect(replayCount).toBe(500);
372
- });
373
- });
374
-
375
- describe("Reconciliator - Integration", () => {
376
- test("should correctly reconcile game state", () => {
377
- interface Position {
378
- x: number;
379
- y: number;
380
- }
381
-
382
- interface MoveIntent {
383
- dx: number;
384
- dy: number;
385
- }
386
-
387
- let playerPos: Position = { x: 0, y: 0 };
388
-
389
- const reconciliator = new Reconciliator<MoveIntent, Position>({
390
- onLoadState: (state) => {
391
- playerPos = { ...state };
392
- },
393
- onReplay: (intents) => {
394
- // Apply all remaining intents
395
- for (const intent of intents) {
396
- playerPos.x += intent.dx;
397
- playerPos.y += intent.dy;
398
- }
399
- },
400
- });
401
-
402
- // Client predicts movements
403
- reconciliator.trackIntent(1, { dx: 1, dy: 0 });
404
- playerPos.x += 1;
405
-
406
- reconciliator.trackIntent(2, { dx: 1, dy: 0 });
407
- playerPos.x += 1;
408
-
409
- reconciliator.trackIntent(3, { dx: 0, dy: 1 });
410
- playerPos.y += 1;
411
-
412
- // Server snapshot arrives (slightly different due to lag)
413
- // Snapshot at tick 2 means intents 1 and 2 are confirmed
414
- reconciliator.onSnapshot({
415
- tick: 2,
416
- state: { x: 1.9, y: 0 }, // Server processed ticks 1 and 2
417
- });
418
-
419
- // After reconciliation: server state + replayed intent (3 only)
420
- expect(playerPos.x).toBeCloseTo(1.9, 1); // 1.9 + 0
421
- expect(playerPos.y).toBeCloseTo(1, 1); // 0 + 1
422
- });
423
- });
@@ -1,112 +0,0 @@
1
- /**
2
- * @template T
3
- * @description
4
- * Tracks client-side intents that have been sent to the server but not yet confirmed.
5
- * Used for prediction and reconciliation in a server-authoritative architecture.
6
- */
7
- export class IntentTracker<T> {
8
- tracker = new Map<number, T[]>();
9
-
10
- get size() {
11
- return this.tracker.size;
12
- }
13
-
14
- /**
15
- * Adds a new intent for a specific tick.
16
- * @param {number} tick - The tick number associated with the intent.
17
- * @param {T} intent - The intent data.
18
- */
19
- track(tick: number, intent: T): T {
20
- if (!this.tracker.has(tick)) {
21
- this.tracker.set(tick, []);
22
- }
23
-
24
- this.tracker.get(tick).push(intent);
25
- return intent;
26
- }
27
-
28
- /**
29
- * Removes all intents up to and including a given tick.
30
- * Returns the remaining intents in ascending tick order.
31
- * @param {number} tick - The tick up to which intents should be dropped.
32
- * @returns {T[]} Array of remaining intents.
33
- */
34
- dropUpTo(tick: number): T[] {
35
- const remaining: [number, T[]][] = [];
36
-
37
- for (const [t, intents] of this.tracker) {
38
- if (t <= tick) this.tracker.delete(t);
39
- else remaining.push([t, intents]);
40
- }
41
-
42
- // sort by tick ascending
43
- remaining.sort(([a], [b]) => a - b);
44
- return remaining.map(([_, intents]) => intents).flat();
45
- }
46
-
47
- /**
48
- * Returns all currently tracked intents in ascending tick order.
49
- * @returns {T[]}
50
- */
51
- values(): T[] {
52
- return Array.from(this.tracker.entries())
53
- .sort(([a], [b]) => a - b)
54
- .map(([_, intents]) => intents)
55
- .flat();
56
- }
57
- }
58
-
59
- /**
60
- * @template T,U
61
- * @description
62
- * Handles client-side reconciliation of authoritative snapshots with unconfirmed intents.
63
- * Used for prediction correction in server-authoritative multiplayer games.
64
- */
65
- export class Reconciliator<T, U> {
66
- tracker: IntentTracker<T> = new IntentTracker<T>();
67
-
68
- /**
69
- * @param {Object} options - Callbacks for applying snapshot state and replaying intents.
70
- * @param {(snapshotState: U) => void} options.onLoadState - Called to load authoritative snapshot state.
71
- * @param {(remainingIntents: T[]) => void} options.onReplay - Called to reapply remaining intents for prediction.
72
- */
73
- constructor(
74
- private options: {
75
- onLoadState: (snapshotState: U) => void;
76
- onReplay: (remainingIntents: T[]) => void;
77
- }
78
- ) { }
79
-
80
- /**
81
- * Adds a new intent to the tracker.
82
- * @param {number} tick - Tick number associated with the intent.
83
- * @param {T} intent - The intent data.
84
- */
85
- trackIntent(tick: number, intent: T) {
86
- this.tracker.track(tick, intent);
87
- }
88
-
89
- /**
90
- * Called when an authoritative snapshot is received from the server.
91
- * Resets client state and replays unconfirmed intents.
92
- * @param {Object} snapshot - The snapshot from the server.
93
- * @param {number} snapshot.tick - Tick number of the snapshot.
94
- * @param {U} snapshot.state - The authoritative state.
95
- */
96
- onSnapshot(snapshot: { tick: number; state: U }) {
97
- // 1. Load authoritative state
98
- this.options.onLoadState(snapshot.state);
99
-
100
- // 2. Remove confirmed intents and get remaining
101
- const remainingIntents = this.tracker.dropUpTo(snapshot.tick);
102
-
103
- // 3. Only replay if there are actually remaining intents
104
- if (remainingIntents.length > 0) {
105
- this.options.onReplay(remainingIntents);
106
- }
107
- }
108
-
109
- replay(intents: T[]) {
110
- this.options.onReplay(intents);
111
- }
112
- }