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,310 +0,0 @@
1
- import { describe, it, expect, beforeEach } from "bun:test";
2
- import { SnapshotRegistry } from "./snapshot-registry";
3
- import { Snapshot } from "./snapshot";
4
-
5
- // Mock codec for testing
6
- class MockCodec<T> {
7
- encode(value: T): Uint8Array {
8
- const json = JSON.stringify(value);
9
- return new TextEncoder().encode(json);
10
- }
11
-
12
- decode(buf: Uint8Array): T {
13
- const json = new TextDecoder().decode(buf);
14
- return JSON.parse(json);
15
- }
16
- }
17
-
18
- // Test update types
19
- interface PlayerUpdate {
20
- players: Array<{ entityId: number; x: number; y: number }>;
21
- }
22
-
23
- interface ScoreUpdate {
24
- score: number;
25
- }
26
-
27
- interface ProjectileUpdate {
28
- projectiles: Array<{ id: number; x: number; y: number }>;
29
- }
30
-
31
- type GameUpdate = PlayerUpdate & ScoreUpdate & ProjectileUpdate;
32
-
33
- describe("SnapshotRegistry", () => {
34
- let registry: SnapshotRegistry<GameUpdate>;
35
-
36
- beforeEach(() => {
37
- registry = new SnapshotRegistry<GameUpdate>();
38
- });
39
-
40
- describe("register", () => {
41
- it("should register a codec for a snapshot type", () => {
42
- registry.register("players", new MockCodec<PlayerUpdate>());
43
- expect(registry.has("players")).toBe(true);
44
- });
45
-
46
- it("should throw error when registering duplicate type", () => {
47
- registry.register("players", new MockCodec<PlayerUpdate>());
48
- expect(() => registry.register("players", new MockCodec<PlayerUpdate>())).toThrow(
49
- 'Snapshot type "players" is already registered'
50
- );
51
- });
52
-
53
- it("should allow registering multiple types", () => {
54
- registry.register("players", new MockCodec<PlayerUpdate>());
55
- registry.register("score", new MockCodec<ScoreUpdate>());
56
- registry.register("projectiles", new MockCodec<ProjectileUpdate>());
57
-
58
- expect(registry.has("players")).toBe(true);
59
- expect(registry.has("score")).toBe(true);
60
- expect(registry.has("projectiles")).toBe(true);
61
- });
62
- });
63
-
64
- describe("encode", () => {
65
- beforeEach(() => {
66
- registry.register("players", new MockCodec<PlayerUpdate>());
67
- registry.register("score", new MockCodec<ScoreUpdate>());
68
- });
69
-
70
- it("should encode a snapshot with type ID", () => {
71
- const snapshot: Snapshot<PlayerUpdate> = {
72
- tick: 100,
73
- updates: {
74
- players: [
75
- { entityId: 1, x: 10, y: 20 },
76
- ],
77
- },
78
- };
79
-
80
- const buf = registry.encode("players", snapshot);
81
-
82
- expect(buf).toBeInstanceOf(Uint8Array);
83
- expect(buf.length).toBeGreaterThan(5); // type(1) + tick(4) + data
84
- expect(buf[0]).toBe(0); // First registered type gets ID 0
85
- });
86
-
87
- it("should encode different types with different type IDs", () => {
88
- const playerSnapshot: Snapshot<PlayerUpdate> = {
89
- tick: 100,
90
- updates: { players: [{ entityId: 1, x: 10, y: 20 }] },
91
- };
92
-
93
- const scoreSnapshot: Snapshot<ScoreUpdate> = {
94
- tick: 101,
95
- updates: { score: 50 },
96
- };
97
-
98
- const buf1 = registry.encode("players", playerSnapshot);
99
- const buf2 = registry.encode("score", scoreSnapshot);
100
-
101
- expect(buf1[0]).toBe(0); // players = ID 0
102
- expect(buf2[0]).toBe(1); // score = ID 1
103
- });
104
-
105
- it("should throw error when encoding unregistered type", () => {
106
- const snapshot: Snapshot<ProjectileUpdate> = {
107
- tick: 100,
108
- updates: { projectiles: [] },
109
- };
110
-
111
- expect(() => registry.encode("projectiles", snapshot)).toThrow(
112
- 'No codec registered for snapshot type "projectiles"'
113
- );
114
- });
115
-
116
- it("should preserve tick number in encoding", () => {
117
- const snapshot: Snapshot<ScoreUpdate> = {
118
- tick: 12345,
119
- updates: { score: 100 },
120
- };
121
-
122
- const buf = registry.encode("score", snapshot);
123
-
124
- // Tick is at bytes 1-4 (after type ID)
125
- const tick = new DataView(buf.buffer, buf.byteOffset + 1).getUint32(0, true);
126
- expect(tick).toBe(12345);
127
- });
128
- });
129
-
130
- describe("decode", () => {
131
- beforeEach(() => {
132
- registry.register("players", new MockCodec<PlayerUpdate>());
133
- registry.register("score", new MockCodec<ScoreUpdate>());
134
- });
135
-
136
- it("should decode a snapshot and return type", () => {
137
- const original: Snapshot<PlayerUpdate> = {
138
- tick: 100,
139
- updates: {
140
- players: [
141
- { entityId: 1, x: 10, y: 20 },
142
- ],
143
- },
144
- };
145
-
146
- const buf = registry.encode("players", original);
147
- const { type, snapshot } = registry.decode<PlayerUpdate>(buf);
148
-
149
- expect(type).toBe("players");
150
- expect(snapshot.tick).toBe(100);
151
- expect(snapshot.updates).toEqual(original.updates);
152
- });
153
-
154
- it("should decode different snapshot types correctly", () => {
155
- const playerSnapshot: Snapshot<PlayerUpdate> = {
156
- tick: 100,
157
- updates: { players: [{ entityId: 1, x: 10, y: 20 }] },
158
- };
159
-
160
- const scoreSnapshot: Snapshot<ScoreUpdate> = {
161
- tick: 101,
162
- updates: { score: 50 },
163
- };
164
-
165
- const buf1 = registry.encode("players", playerSnapshot);
166
- const buf2 = registry.encode("score", scoreSnapshot);
167
-
168
- const decoded1 = registry.decode(buf1);
169
- const decoded2 = registry.decode(buf2);
170
-
171
- expect(decoded1.type).toBe("players");
172
- expect(decoded1.snapshot.updates).toEqual(playerSnapshot.updates);
173
-
174
- expect(decoded2.type).toBe("score");
175
- expect(decoded2.snapshot.updates).toEqual(scoreSnapshot.updates);
176
- });
177
-
178
- it("should throw error when decoding unknown type ID", () => {
179
- const buf = new Uint8Array([99, 0, 0, 0, 100]); // Unknown type ID 99
180
-
181
- expect(() => registry.decode(buf)).toThrow("Unknown snapshot type ID: 99");
182
- });
183
- });
184
-
185
- describe("round-trip encoding/decoding", () => {
186
- beforeEach(() => {
187
- registry.register("players", new MockCodec<PlayerUpdate>());
188
- registry.register("score", new MockCodec<ScoreUpdate>());
189
- registry.register("projectiles", new MockCodec<ProjectileUpdate>());
190
- });
191
-
192
- it("should preserve data through encode/decode cycle", () => {
193
- const original: Snapshot<PlayerUpdate> = {
194
- tick: 500,
195
- updates: {
196
- players: [
197
- { entityId: 1, x: 100, y: 200 },
198
- { entityId: 2, x: 300, y: 400 },
199
- ],
200
- },
201
- };
202
-
203
- const buf = registry.encode("players", original);
204
- const { type, snapshot } = registry.decode(buf);
205
-
206
- expect(type).toBe("players");
207
- expect(snapshot).toEqual(original);
208
- });
209
-
210
- it("should handle multiple round-trips", () => {
211
- const original: Snapshot<ScoreUpdate> = {
212
- tick: 1000,
213
- updates: { score: 99999 },
214
- };
215
-
216
- for (let i = 0; i < 10; i++) {
217
- const buf = registry.encode("score", original);
218
- const { type, snapshot } = registry.decode(buf);
219
- expect(type).toBe("score");
220
- expect(snapshot).toEqual(original);
221
- }
222
- });
223
-
224
- it("should handle arrays in updates", () => {
225
- const original: Snapshot<ProjectileUpdate> = {
226
- tick: 250,
227
- updates: {
228
- projectiles: [
229
- { id: 1, x: 10, y: 20 },
230
- { id: 2, x: 30, y: 40 },
231
- { id: 3, x: 50, y: 60 },
232
- ],
233
- },
234
- };
235
-
236
- const buf = registry.encode("projectiles", original);
237
- const { type, snapshot } = registry.decode(buf);
238
-
239
- expect(type).toBe("projectiles");
240
- expect(snapshot.updates).toEqual(original.updates);
241
- });
242
- });
243
-
244
- describe("getTypes", () => {
245
- it("should return empty array when no types registered", () => {
246
- expect(registry.getTypes()).toEqual([]);
247
- });
248
-
249
- it("should return all registered types", () => {
250
- registry.register("players", new MockCodec<PlayerUpdate>());
251
- registry.register("score", new MockCodec<ScoreUpdate>());
252
-
253
- const types = registry.getTypes();
254
- expect(types).toContain("players");
255
- expect(types).toContain("score");
256
- expect(types.length).toBe(2);
257
- });
258
- });
259
-
260
- describe("integration scenarios", () => {
261
- beforeEach(() => {
262
- registry.register("players", new MockCodec<PlayerUpdate>());
263
- registry.register("score", new MockCodec<ScoreUpdate>());
264
- });
265
-
266
- it("should allow sending only specific updates", () => {
267
- // Server only sends player updates this tick
268
- const playerBuf = registry.encode("players", {
269
- tick: 100,
270
- updates: { players: [{ entityId: 1, x: 5, y: 10 }] },
271
- });
272
-
273
- // Next tick, only send score
274
- const scoreBuf = registry.encode("score", {
275
- tick: 101,
276
- updates: { score: 100 },
277
- });
278
-
279
- // Client can decode both
280
- const decoded1 = registry.decode(playerBuf);
281
- const decoded2 = registry.decode(scoreBuf);
282
-
283
- expect(decoded1.type).toBe("players");
284
- expect(decoded2.type).toBe("score");
285
- });
286
-
287
- it("should maintain type safety with unions", () => {
288
- const snapshot: Snapshot<PlayerUpdate> = {
289
- tick: 100,
290
- updates: { players: [{ entityId: 1, x: 5, y: 10 }] },
291
- };
292
-
293
- const buf = registry.encode("players", snapshot);
294
- const { type, snapshot: decoded } = registry.decode<GameUpdate>(buf);
295
-
296
- if (('players' in decoded.updates)) {
297
- decoded.updates.players!.forEach((p) => {
298
- expect(typeof p.entityId).toBe("number");
299
- expect(typeof p.x).toBe("number");
300
- expect(typeof p.y).toBe("number");
301
- });
302
- }
303
-
304
- // Type narrowing based on type field
305
- expect(type).toBe("players");
306
- expect(type in decoded.updates).toBeDefined();
307
- expect(type in decoded.updates).toBe(true);
308
- });
309
- });
310
- });
@@ -1,201 +0,0 @@
1
- import type { Snapshot } from "./snapshot";
2
-
3
- /**
4
- * Generic codec interface (users import from core/pooled-codec)
5
- */
6
- interface Codec<T> {
7
- encode(value: T): Uint8Array;
8
- decode(buf: Uint8Array): T;
9
- calculateSize?(value: T): number;
10
- encodeInto?(value: T, buffer: Uint8Array, offset: number): number;
11
- }
12
-
13
- /**
14
- * Registry for multiple snapshot types with different update schemas.
15
- *
16
- * This allows efficient delta encoding by only sending specific update types
17
- * instead of encoding all fields (including empty/nil ones).
18
- *
19
- * ## Memory Efficiency
20
- *
21
- * The encoding path minimizes allocations:
22
- * 1. PooledCodec acquires a buffer from its pool (reused across calls)
23
- * 2. PooledCodec writes data directly to the buffer at sequential offsets
24
- * 3. SnapshotRegistry creates ONE final buffer: [typeId(1) + tick(4) + updatesBytes]
25
- * 4. Total allocations per encode: 1 pooled buffer + 1 final buffer
26
- *
27
- * Buffer Layout:
28
- * ```
29
- * ┌─────────┬────────────┬──────────────────┐
30
- * │ Type ID │ Tick │ Updates (codec) │
31
- * │ (u8) │ (u32) │ (variable) │
32
- * │ 1 byte │ 4 bytes │ N bytes │
33
- * └─────────┴────────────┴──────────────────┘
34
- * ```
35
- *
36
- * @example
37
- * ```ts
38
- * import { SnapshotRegistry } from './protocol/snapshot';
39
- * import { PooledCodec } from './core/pooled-codec';
40
- * import { BinaryPrimitives } from './core/binary-codec';
41
- *
42
- * // Define different update types
43
- * interface PlayerUpdate {
44
- * players: Array<{ entityId: number; x: number; y: number }>;
45
- * }
46
- *
47
- * interface ScoreUpdate {
48
- * score: number;
49
- * }
50
- *
51
- * // Create registry
52
- * const registry = new SnapshotRegistry<PlayerUpdate | ScoreUpdate>();
53
- *
54
- * // Register codecs for each update type
55
- * registry.register('players', new PooledCodec({
56
- * players: PooledCodec.array({
57
- * entityId: BinaryPrimitives.u32,
58
- * x: BinaryPrimitives.f32,
59
- * y: BinaryPrimitives.f32,
60
- * })
61
- * }));
62
- *
63
- * registry.register('score', new PooledCodec({
64
- * score: BinaryPrimitives.u32
65
- * }));
66
- *
67
- * // Server: Encode specific update type
68
- * const buf = registry.encode('players', {
69
- * tick: 100,
70
- * updates: { players: [{ entityId: 1, x: 5, y: 10 }] }
71
- * });
72
- *
73
- * // Client: Decode (type is embedded in message)
74
- * const { type, snapshot } = registry.decode(buf);
75
- * applySnapshot(state, snapshot);
76
- * ```
77
- */
78
- export class SnapshotRegistry<T extends Object = {}> {
79
- private codecs = new Map<string, Codec<any>>();
80
- private typeIds = new Map<string, number>();
81
- private idToType = new Map<number, string>();
82
- private nextId = 0;
83
-
84
- /**
85
- * Register a codec for a specific update type.
86
- * Call this once per update type at startup.
87
- */
88
- register<U extends Partial<T>>(type: string, codec: Codec<U>): void {
89
- if (this.codecs.has(type)) {
90
- throw new Error(`Snapshot type "${type}" is already registered`);
91
- }
92
-
93
- const typeId = this.nextId++;
94
- this.codecs.set(type, codec);
95
- this.typeIds.set(type, typeId);
96
- this.idToType.set(typeId, type);
97
- }
98
-
99
- /**
100
- * Encode a snapshot with a specific update type.
101
- * Format: [typeId: u8][tick: u32][updates: encoded by codec]
102
- *
103
- * Zero-copy encoding path:
104
- * - Calculate total size needed
105
- * - Allocate ONE final buffer for [typeId + tick + updates]
106
- * - Write directly into buffer using encodeInto (no intermediate allocations)
107
- *
108
- * Falls back to legacy encode() method if codec doesn't support encodeInto.
109
- */
110
- encode<U extends Partial<T>>(type: string, snapshot: Snapshot<U>): Uint8Array {
111
- const codec = this.codecs.get(type);
112
- const typeId = this.typeIds.get(type);
113
-
114
- if (!codec || typeId === undefined) {
115
- throw new Error(`No codec registered for snapshot type "${type}"`);
116
- }
117
-
118
- // Use zero-copy path if available
119
- if (codec.calculateSize && codec.encodeInto) {
120
- // Calculate total size
121
- const updatesSize = codec.calculateSize(snapshot.updates);
122
- const buf = new Uint8Array(5 + updatesSize);
123
-
124
- // Write type ID (1 byte)
125
- buf[0] = typeId;
126
-
127
- // Write tick (4 bytes, little-endian)
128
- new DataView(buf.buffer).setUint32(1, snapshot.tick, true);
129
-
130
- // Write updates directly into buffer (ZERO COPY!)
131
- codec.encodeInto(snapshot.updates, buf, 5);
132
-
133
- return buf;
134
- }
135
-
136
- // Fallback to legacy path for backward compatibility
137
- const updatesBytes = codec.encode(snapshot.updates);
138
- const buf = new Uint8Array(1 + 4 + updatesBytes.length);
139
-
140
- buf[0] = typeId;
141
- new DataView(buf.buffer).setUint32(1, snapshot.tick, true);
142
- buf.set(updatesBytes, 5);
143
-
144
- return buf;
145
- }
146
-
147
- /**
148
- * Decode a snapshot and return both the type and the snapshot.
149
- */
150
- decode<U extends Partial<T> = Partial<T>>(buf: Uint8Array): { type: string; snapshot: Snapshot<U> } {
151
- // Decode type ID (first byte)
152
- const typeId = buf[0];
153
- const type = this.idToType.get(typeId);
154
-
155
- if (!type) {
156
- throw new Error(`Unknown snapshot type ID: ${typeId}`);
157
- }
158
-
159
- const codec = this.codecs.get(type);
160
- if (!codec) {
161
- throw new Error(`No codec registered for snapshot type "${type}"`);
162
- }
163
-
164
- // Decode tick (bytes 1-4)
165
- const tick = new DataView(buf.buffer, buf.byteOffset + 1).getUint32(0, true);
166
-
167
- // Decode updates (remaining bytes)
168
- const updatesBytes = buf.subarray(5);
169
- const updates = codec.decode(updatesBytes) as U;
170
-
171
- return { type, snapshot: { tick, updates } };
172
- }
173
-
174
- has(type: string): boolean {
175
- return this.codecs.has(type);
176
- }
177
-
178
- getTypes(): string[] {
179
- return Array.from(this.codecs.keys());
180
- }
181
-
182
- /**
183
- * Release a decoded snapshot's updates object back to the pool.
184
- * Call this after you're done processing the snapshot to enable object pooling.
185
- *
186
- * @param type The snapshot type (same as used in decode)
187
- * @param updates The updates object to release
188
- */
189
- release<U extends Partial<T>>(type: string, updates: U): void {
190
- const codec = this.codecs.get(type);
191
-
192
- if (!codec) {
193
- throw new Error(`No codec registered for snapshot type "${type}"`);
194
- }
195
-
196
- // Only release if the codec supports pooling
197
- if ('release' in codec && typeof codec.release === 'function') {
198
- codec.release(updates);
199
- }
200
- }
201
- }
@@ -1,76 +0,0 @@
1
- import { describe, it, expect } from "bun:test";
2
- import { Snapshot, applySnapshot } from "./snapshot";
3
-
4
- interface TestState {
5
- x: number;
6
- y: number;
7
- health?: number;
8
- nested?: {
9
- a: number;
10
- b?: number;
11
- };
12
- items?: string[];
13
- }
14
-
15
- describe("Snapshot", () => {
16
- describe("applySnapshot", () => {
17
- it("should apply simple property updates", () => {
18
- const state: TestState = { x: 0, y: 0 };
19
- const snapshot: Snapshot<TestState> = {
20
- tick: 100,
21
- updates: { x: 10, y: 20 },
22
- };
23
-
24
- applySnapshot(state, snapshot);
25
- expect(state.x).toBe(10);
26
- expect(state.y).toBe(20);
27
- });
28
-
29
- it("should apply partial updates without affecting other properties", () => {
30
- const state: TestState = { x: 0, y: 0, health: 100 };
31
- const snapshot: Snapshot<TestState> = {
32
- tick: 100,
33
- updates: { x: 10 },
34
- };
35
-
36
- applySnapshot(state, snapshot);
37
- expect(state.x).toBe(10);
38
- expect(state.y).toBe(0);
39
- expect(state.health).toBe(100);
40
- });
41
-
42
- it("should handle nested object updates", () => {
43
- const state: TestState = { x: 0, y: 0, nested: { a: 1, b: 2 } };
44
- const snapshot: Snapshot<TestState> = {
45
- tick: 100,
46
- updates: { nested: { a: 10 } },
47
- };
48
-
49
- applySnapshot(state, snapshot);
50
- expect(state.nested?.a).toBe(10);
51
- expect(state.nested?.b).toBe(2);
52
- });
53
-
54
- it("should replace arrays entirely", () => {
55
- const state: TestState = { x: 0, y: 0, items: ["a", "b", "c"] };
56
- const snapshot: Snapshot<TestState> = {
57
- tick: 100,
58
- updates: { items: ["x", "y"] },
59
- };
60
-
61
- applySnapshot(state, snapshot);
62
- expect(state.items).toEqual(["x", "y"]);
63
- });
64
-
65
- it("should handle null values", () => {
66
- const state: TestState = { x: 0, y: 0, health: 100 };
67
- const snapshot: Snapshot<TestState> = {
68
- tick: 100,
69
- updates: { health: null as any },
70
- };
71
-
72
- applySnapshot(state, snapshot);
73
- expect(state.health).toBeNull();
74
- });
75
- });
76
- });
@@ -1,41 +0,0 @@
1
- /**
2
- * Server-authoritative snapshot with delta updates.
3
- *
4
- * @template T The full state type
5
- */
6
- export interface Snapshot<T> {
7
- /** Server tick when this snapshot was created */
8
- tick: number;
9
- /** Partial state updates (only what changed) */
10
- updates: Partial<T>;
11
- }
12
-
13
- /**
14
- * Apply snapshot updates to state (mutating).
15
- * Deep merges objects, replaces arrays.
16
- *
17
- * @param state State to update
18
- * @param snapshot Snapshot to apply
19
- */
20
- export function applySnapshot<T>(state: T, snapshot: Snapshot<T>): void {
21
- deepMerge(state, snapshot.updates);
22
- }
23
-
24
- function deepMerge<T>(target: T, update: Partial<T>): void {
25
- for (const key in update) {
26
- if (!Object.prototype.hasOwnProperty.call(update, key)) continue;
27
-
28
- const updateValue = update[key];
29
- const targetValue = target[key];
30
-
31
- if (updateValue === null || updateValue === undefined) {
32
- target[key] = updateValue as T[Extract<keyof T, string>];
33
- } else if (Array.isArray(updateValue)) {
34
- target[key] = updateValue as T[Extract<keyof T, string>];
35
- } else if (typeof updateValue === "object" && typeof targetValue === "object") {
36
- deepMerge(targetValue as any, updateValue as any);
37
- } else {
38
- target[key] = updateValue as T[Extract<keyof T, string>];
39
- }
40
- }
41
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes