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,168 +0,0 @@
1
- import { describe, it, expect, beforeEach } from "bun:test";
2
- import { RpcRegistry } from "./rpc-registry";
3
- import { defineRPC } from "./define-rpc";
4
- import { BinaryCodec } from "../../core/binary-codec";
5
-
6
- // Define RPCs for testing
7
- const MockRpc = defineRPC({
8
- method: 'mockRpc',
9
- schema: {
10
- value: BinaryCodec.u32,
11
- },
12
- });
13
-
14
- const AnotherRpc = defineRPC({
15
- method: 'anotherRpc',
16
- schema: {
17
- data: BinaryCodec.string(64),
18
- },
19
- });
20
-
21
- type MockRpcType = typeof MockRpc.type;
22
- type AnotherRpcType = typeof AnotherRpc.type;
23
-
24
- describe("RpcRegistry", () => {
25
- let registry: RpcRegistry;
26
-
27
- beforeEach(() => {
28
- registry = new RpcRegistry();
29
- });
30
-
31
- describe("register", () => {
32
- it("should register an RPC", () => {
33
- registry.register(MockRpc);
34
- expect(registry.has('mockRpc')).toBe(true);
35
- });
36
-
37
- it("should throw error when registering duplicate method", () => {
38
- registry.register(MockRpc);
39
- expect(() => registry.register(MockRpc)).toThrow(
40
- 'RPC "mockRpc" is already registered'
41
- );
42
- });
43
-
44
- it("should allow registering multiple different RPCs", () => {
45
- registry.register(MockRpc);
46
- registry.register(AnotherRpc);
47
- expect(registry.has('mockRpc')).toBe(true);
48
- expect(registry.has('anotherRpc')).toBe(true);
49
- });
50
-
51
- it("should assign sequential method IDs", () => {
52
- registry.register(MockRpc);
53
- registry.register(AnotherRpc);
54
-
55
- expect(registry.getMethodId('mockRpc')).toBe(0);
56
- expect(registry.getMethodId('anotherRpc')).toBe(1);
57
- });
58
- });
59
-
60
- describe("encode", () => {
61
- it("should encode an RPC using registered codec", () => {
62
- registry.register(MockRpc);
63
- const data: MockRpcType = { value: 42 };
64
- const buf = registry.encode(MockRpc, data);
65
-
66
- expect(buf).toBeInstanceOf(Uint8Array);
67
- expect(buf.byteLength).toBeGreaterThan(2); // At least methodId (2 bytes) + data
68
- });
69
-
70
- it("should throw error when encoding unregistered RPC", () => {
71
- const data: MockRpcType = { value: 42 };
72
- expect(() => registry.encode(MockRpc, data)).toThrow(
73
- 'RPC "mockRpc" is not registered'
74
- );
75
- });
76
-
77
- it("should encode different RPC types correctly", () => {
78
- registry.register(MockRpc);
79
- registry.register(AnotherRpc);
80
-
81
- const data1: MockRpcType = { value: 42 };
82
- const data2: AnotherRpcType = { data: "test" };
83
-
84
- const buf1 = registry.encode(MockRpc, data1);
85
- const buf2 = registry.encode(AnotherRpc, data2);
86
-
87
- expect(buf1).toBeInstanceOf(Uint8Array);
88
- expect(buf2).toBeInstanceOf(Uint8Array);
89
- expect(buf1[0]).not.toBe(buf2[0]); // Different method IDs
90
- });
91
- });
92
-
93
- describe("decode", () => {
94
- it("should decode an RPC using registered codec", () => {
95
- registry.register(MockRpc);
96
- const data: MockRpcType = { value: 42 };
97
- const encoded = registry.encode(MockRpc, data);
98
- const decoded = registry.decode(encoded);
99
-
100
- expect(decoded.method).toBe('mockRpc');
101
- expect(decoded.data.value).toBe(42);
102
- });
103
-
104
- it("should throw error when decoding unknown method ID", () => {
105
- // Create buffer with invalid method ID
106
- const buf = new Uint8Array([0xFF, 0xFF]);
107
-
108
- expect(() => registry.decode(buf)).toThrow(
109
- 'Unknown RPC method ID: 65535'
110
- );
111
- });
112
-
113
- it("should throw error when buffer is too small", () => {
114
- const buf = new Uint8Array([0x00]); // Only 1 byte, needs at least 2
115
-
116
- expect(() => registry.decode(buf)).toThrow(
117
- 'Buffer too small for RPC message'
118
- );
119
- });
120
-
121
- it("should roundtrip encode/decode correctly", () => {
122
- registry.register(MockRpc);
123
- registry.register(AnotherRpc);
124
-
125
- const data1: MockRpcType = { value: 12345 };
126
- const data2: AnotherRpcType = { data: "hello world" };
127
-
128
- const encoded1 = registry.encode(MockRpc, data1);
129
- const encoded2 = registry.encode(AnotherRpc, data2);
130
-
131
- const decoded1 = registry.decode(encoded1);
132
- const decoded2 = registry.decode(encoded2);
133
-
134
- expect(decoded1.method).toBe('mockRpc');
135
- expect(decoded1.data.value).toBe(12345);
136
-
137
- expect(decoded2.method).toBe('anotherRpc');
138
- expect(decoded2.data.data).toBe('hello world');
139
- });
140
- });
141
-
142
- describe("getMethods", () => {
143
- it("should return empty array when no RPCs registered", () => {
144
- expect(registry.getMethods()).toEqual([]);
145
- });
146
-
147
- it("should return all registered method names", () => {
148
- registry.register(MockRpc);
149
- registry.register(AnotherRpc);
150
-
151
- const methods = registry.getMethods();
152
- expect(methods).toContain('mockRpc');
153
- expect(methods).toContain('anotherRpc');
154
- expect(methods.length).toBe(2);
155
- });
156
- });
157
-
158
- describe("getMethodId", () => {
159
- it("should return undefined for unregistered method", () => {
160
- expect(registry.getMethodId('unknown')).toBeUndefined();
161
- });
162
-
163
- it("should return correct method ID", () => {
164
- registry.register(MockRpc);
165
- expect(registry.getMethodId('mockRpc')).toBe(0);
166
- });
167
- });
168
- });
@@ -1,176 +0,0 @@
1
- import type { DefinedRPC, RpcCodec } from './rpc';
2
-
3
- /**
4
- * Registry for managing RPC definitions with binary encoding/decoding
5
- *
6
- * Maps RPC method names to numeric IDs for efficient binary protocol:
7
- * - Method names are assigned sequential IDs (0, 1, 2, ...)
8
- * - Binary format: [methodId: u16][data: variable]
9
- * - Supports bidirectional RPCs (client ↔ server)
10
- *
11
- * @example
12
- * ```ts
13
- * const registry = new RpcRegistry();
14
- *
15
- * // Register RPCs
16
- * registry.register(MatchCountdown);
17
- * registry.register(BuyItem);
18
- *
19
- * // Encode RPC to binary
20
- * const binary = registry.encode(MatchCountdown, { secondsRemaining: 10 });
21
- *
22
- * // Decode RPC from binary
23
- * const { method, data } = registry.decode(binary);
24
- * console.log(method); // 'matchCountdown'
25
- * console.log(data.secondsRemaining); // 10
26
- * ```
27
- */
28
- export class RpcRegistry {
29
- private codecs = new Map<string, RpcCodec<any>>();
30
- private methodToId = new Map<string, number>();
31
- private idToMethod = new Map<number, string>();
32
- private nextId = 0;
33
-
34
- /**
35
- * Register an RPC definition
36
- *
37
- * @param rpc The RPC definition created by defineRPC()
38
- * @throws Error if method is already registered
39
- *
40
- * @example
41
- * ```ts
42
- * const MatchCountdown = defineRPC({
43
- * method: 'matchCountdown',
44
- * schema: { secondsRemaining: BinaryCodec.u8 }
45
- * });
46
- *
47
- * registry.register(MatchCountdown);
48
- * ```
49
- */
50
- register<TSchema extends Record<string, any>>(rpc: DefinedRPC<TSchema>): void {
51
- if (this.codecs.has(rpc.method)) {
52
- throw new Error(`RPC "${rpc.method}" is already registered`);
53
- }
54
-
55
- const id = this.nextId++;
56
- this.codecs.set(rpc.method, rpc.codec);
57
- this.methodToId.set(rpc.method, id);
58
- this.idToMethod.set(id, rpc.method);
59
- }
60
-
61
- /**
62
- * Encode an RPC to binary format
63
- *
64
- * Binary format: [methodId: u16][data: variable]
65
- *
66
- * @param rpc The RPC definition
67
- * @param data The RPC data to encode
68
- * @returns Encoded binary data
69
- * @throws Error if RPC is not registered
70
- *
71
- * @example
72
- * ```ts
73
- * const binary = registry.encode(MatchCountdown, {
74
- * secondsRemaining: 10
75
- * });
76
- * ```
77
- */
78
- encode<TSchema extends Record<string, any>>(rpc: DefinedRPC<TSchema>, data: TSchema): Uint8Array {
79
- const codec = this.codecs.get(rpc.method);
80
- if (!codec) {
81
- throw new Error(`RPC "${rpc.method}" is not registered`);
82
- }
83
-
84
- const methodId = this.methodToId.get(rpc.method)!;
85
- const encodedData = codec.encode(data);
86
-
87
- // Message format: [methodId: u16][data]
88
- const buffer = new Uint8Array(2 + encodedData.byteLength);
89
- new DataView(buffer.buffer).setUint16(0, methodId, true);
90
- buffer.set(new Uint8Array(encodedData), 2);
91
-
92
- return buffer;
93
- }
94
-
95
- /**
96
- * Decode an RPC from binary format
97
- *
98
- * @param buffer Binary data to decode
99
- * @returns Object with method name and decoded data
100
- * @throws Error if method ID is unknown
101
- *
102
- * @example
103
- * ```ts
104
- * const { method, data } = registry.decode(binary);
105
- * console.log(method); // 'matchCountdown'
106
- * console.log(data.secondsRemaining); // 10
107
- * ```
108
- */
109
- decode(buffer: Uint8Array): { method: string; data: any } {
110
- if (buffer.byteLength < 2) {
111
- throw new Error('Buffer too small for RPC message');
112
- }
113
-
114
- const view = new DataView(buffer.buffer, buffer.byteOffset);
115
- const methodId = view.getUint16(0, true);
116
-
117
- const method = this.idToMethod.get(methodId);
118
- if (!method) {
119
- throw new Error(`Unknown RPC method ID: ${methodId}`);
120
- }
121
-
122
- const codec = this.codecs.get(method)!;
123
- const data = codec.decode(buffer.slice(2));
124
-
125
- return { method, data };
126
- }
127
-
128
- /**
129
- * Check if an RPC method is registered
130
- *
131
- * @param method Method name to check
132
- * @returns True if registered, false otherwise
133
- */
134
- has(method: string): boolean {
135
- return this.codecs.has(method);
136
- }
137
-
138
- /**
139
- * Get all registered RPC method names
140
- *
141
- * @returns Array of method names
142
- */
143
- getMethods(): string[] {
144
- return Array.from(this.codecs.keys());
145
- }
146
-
147
- /**
148
- * Get the numeric ID for a method
149
- *
150
- * @param method Method name
151
- * @returns Method ID or undefined if not registered
152
- */
153
- getMethodId(method: string): number | undefined {
154
- return this.methodToId.get(method);
155
- }
156
-
157
- /**
158
- * Release a decoded RPC data object back to the pool.
159
- * Call this after you're done processing the RPC to enable object pooling.
160
- *
161
- * @param method The RPC method name (same as used in decode)
162
- * @param data The RPC data object to release
163
- */
164
- release(method: string, data: any): void {
165
- const codec = this.codecs.get(method);
166
-
167
- if (!codec) {
168
- throw new Error(`RPC "${method}" is not registered`);
169
- }
170
-
171
- // Only release if the codec supports pooling
172
- if ('release' in codec && typeof codec.release === 'function') {
173
- codec.release(data);
174
- }
175
- }
176
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * RPC (Remote Procedure Call) type definitions
3
- *
4
- * RPCs are bidirectional one-off events/commands for:
5
- * - Meta-game events (achievements, notifications)
6
- * - Match lifecycle (countdown, results)
7
- * - Request/response patterns
8
- * - System announcements
9
- *
10
- * NOT for game state synchronization (use Snapshots) or player inputs (use Intents)
11
- */
12
-
13
- /**
14
- * Codec interface for encoding/decoding RPCs
15
- */
16
- export interface RpcCodec<T> {
17
- encode(value: T): Uint8Array;
18
- decode(buf: Uint8Array): T;
19
- }
20
-
21
- /**
22
- * Runtime RPC message structure
23
- */
24
- export interface RPC<T = unknown> {
25
- method: string;
26
- data: T;
27
- }
28
-
29
- /**
30
- * Compile-time RPC definition with type safety
31
- * Created by defineRPC() helper
32
- */
33
- export interface DefinedRPC<TSchema extends Record<string, any>> {
34
- method: string;
35
- codec: RpcCodec<TSchema>;
36
- type: TSchema; // Phantom type for inference
37
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * Snapshot system for server-to-client state updates.
3
- *
4
- * Snapshots are delta updates that contain:
5
- * 1. Server tick number
6
- * 2. Partial state updates (only what changed)
7
- *
8
- * They need to be:
9
- * 1. Encoded efficiently (binary)
10
- * 2. Sent over network
11
- * 3. Decoded on the client
12
- * 4. Merged into client state
13
- *
14
- * @example
15
- * ```ts
16
- * import { Snapshot, SnapshotCodec, applySnapshot } from './protocol/snapshot';
17
- * import { PooledCodec } from '../core/pooled-codec';
18
- * import { BinaryCodec } from '../core/binary-codec';
19
- *
20
- * interface GameState {
21
- * players: Record<number, { x: number; y: number }>;
22
- * }
23
- *
24
- * // 1. Create codec once (reuse this instance)
25
- * const snapshotCodec = new SnapshotCodec<GameState>(
26
- * new PooledCodec({ players: // ... your schema })
27
- * );
28
- *
29
- * // 2. Server: Encode snapshot
30
- * const snapshot: Snapshot<GameState> = {
31
- * tick: 100,
32
- * updates: { players: { 1: { x: 5, y: 10 } } }
33
- * };
34
- * const buf = snapshotCodec.encode(snapshot);
35
- *
36
- * // 3. Client: Decode and apply
37
- * const snapshot = snapshotCodec.decode(buf);
38
- * applySnapshot(clientState, snapshot);
39
- * ```
40
- */
41
-
42
- export type { Snapshot } from "./snapshot";
43
- export { applySnapshot } from "./snapshot";
44
- export { SnapshotCodec } from "./snapshot-codec";
45
- export { SnapshotRegistry } from "./snapshot-registry";
@@ -1,138 +0,0 @@
1
- import { describe, it, expect } from "bun:test";
2
- import { SnapshotCodec } from "./snapshot-codec";
3
- import { Snapshot } from "./snapshot";
4
- import { Codec } from "./snapshot-codec";
5
-
6
- // Simple mock codec for testing
7
- class MockCodec<T> implements Codec<T> {
8
- encode(value: T): Uint8Array {
9
- const json = JSON.stringify(value);
10
- return new TextEncoder().encode(json);
11
- }
12
-
13
- decode(buf: Uint8Array): T {
14
- const json = new TextDecoder().decode(buf);
15
- return JSON.parse(json);
16
- }
17
- }
18
-
19
- interface TestState {
20
- x: number;
21
- y: number;
22
- health?: number;
23
- }
24
-
25
- describe("SnapshotCodec", () => {
26
- it("should encode and decode a snapshot", () => {
27
- const codec = new SnapshotCodec<TestState>(new MockCodec());
28
- const snapshot: Snapshot<TestState> = {
29
- tick: 100,
30
- updates: { x: 10, y: 20 },
31
- };
32
-
33
- const buf = codec.encode(snapshot);
34
- const decoded = codec.decode(buf);
35
-
36
- expect(decoded.tick).toBe(100);
37
- expect(decoded.updates.x).toBe(10);
38
- expect(decoded.updates.y).toBe(20);
39
- });
40
-
41
- it("should handle partial updates", () => {
42
- const codec = new SnapshotCodec<TestState>(new MockCodec());
43
- const snapshot: Snapshot<TestState> = {
44
- tick: 50,
45
- updates: { x: 5 },
46
- };
47
-
48
- const buf = codec.encode(snapshot);
49
- const decoded = codec.decode(buf);
50
-
51
- expect(decoded.tick).toBe(50);
52
- expect(decoded.updates.x).toBe(5);
53
- expect(decoded.updates.y).toBeUndefined();
54
- });
55
-
56
- it("should handle large tick numbers", () => {
57
- const codec = new SnapshotCodec<TestState>(new MockCodec());
58
- const snapshot: Snapshot<TestState> = {
59
- tick: 4294967295, // Max u32
60
- updates: { x: 1, y: 2 },
61
- };
62
-
63
- const buf = codec.encode(snapshot);
64
- const decoded = codec.decode(buf);
65
-
66
- expect(decoded.tick).toBe(4294967295);
67
- });
68
-
69
- it("should preserve tick in binary format", () => {
70
- const codec = new SnapshotCodec<TestState>(new MockCodec());
71
- const snapshot: Snapshot<TestState> = {
72
- tick: 12345,
73
- updates: { x: 1 },
74
- };
75
-
76
- const buf = codec.encode(snapshot);
77
-
78
- // First 4 bytes should be the tick (little-endian)
79
- const tick = new DataView(buf.buffer, buf.byteOffset).getUint32(0, true);
80
- expect(tick).toBe(12345);
81
- });
82
-
83
- it("should handle empty updates", () => {
84
- const codec = new SnapshotCodec<TestState>(new MockCodec());
85
- const snapshot: Snapshot<TestState> = {
86
- tick: 100,
87
- updates: {},
88
- };
89
-
90
- const buf = codec.encode(snapshot);
91
- const decoded = codec.decode(buf);
92
-
93
- expect(decoded.tick).toBe(100);
94
- expect(decoded.updates).toEqual({});
95
- });
96
-
97
- it("should handle nested state", () => {
98
- interface NestedState {
99
- player: {
100
- position: { x: number; y: number };
101
- health: number;
102
- };
103
- }
104
-
105
- const codec = new SnapshotCodec<NestedState>(new MockCodec());
106
- const snapshot: Snapshot<NestedState> = {
107
- tick: 200,
108
- updates: {
109
- player: {
110
- position: { x: 10, y: 20 },
111
- health: 80,
112
- },
113
- },
114
- };
115
-
116
- const buf = codec.encode(snapshot);
117
- const decoded = codec.decode(buf);
118
-
119
- expect(decoded.tick).toBe(200);
120
- expect(decoded.updates.player?.position.x).toBe(10);
121
- expect(decoded.updates.player?.position.y).toBe(20);
122
- expect(decoded.updates.player?.health).toBe(80);
123
- });
124
-
125
- it("should round-trip multiple times", () => {
126
- const codec = new SnapshotCodec<TestState>(new MockCodec());
127
- const original: Snapshot<TestState> = {
128
- tick: 999,
129
- updates: { x: 123, y: 456, health: 78 },
130
- };
131
-
132
- for (let i = 0; i < 10; i++) {
133
- const buf = codec.encode(original);
134
- const decoded = codec.decode(buf);
135
- expect(decoded).toEqual(original);
136
- }
137
- });
138
- });
@@ -1,87 +0,0 @@
1
- import type { Snapshot } from "./snapshot";
2
-
3
- /**
4
- * Generic codec interface (users import from core/pooled-codec)
5
- */
6
- export 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
- * Codec for encoding/decoding snapshots with binary serialization.
15
- *
16
- * Users instantiate this once with a PooledCodec for their state schema.
17
- *
18
- * @example
19
- * ```ts
20
- * import { SnapshotCodec } from './protocol/snapshot';
21
- * import { PooledCodec } from './core/pooled-codec';
22
- * import { BinaryCodec } from './core/binary-codec';
23
- *
24
- * interface GameState {
25
- * players: Record<number, { x: number; y: number }>;
26
- * }
27
- *
28
- * const snapshotCodec = new SnapshotCodec<GameState>(
29
- * new PooledCodec({ players: // schema })
30
- * );
31
- *
32
- * // Encode/decode
33
- * const buf = snapshotCodec.encode(snapshot);
34
- * const decoded = snapshotCodec.decode(buf);
35
- * ```
36
- */
37
- export class SnapshotCodec<T> {
38
- /**
39
- * @param updatesCodec Codec for encoding/decoding the state updates
40
- */
41
- constructor(private updatesCodec: Codec<Partial<T>>) {}
42
-
43
- /**
44
- * Encode a snapshot into binary format.
45
- * Format: [tick: u32][updates: encoded by updatesCodec]
46
- *
47
- * Uses zero-copy path if codec supports calculateSize and encodeInto.
48
- */
49
- encode(snapshot: Snapshot<T>): Uint8Array {
50
- // Use zero-copy path if available
51
- if (this.updatesCodec.calculateSize && this.updatesCodec.encodeInto) {
52
- const updatesSize = this.updatesCodec.calculateSize(snapshot.updates);
53
- const buf = new Uint8Array(4 + updatesSize);
54
-
55
- // Encode tick (4 bytes, little-endian)
56
- new DataView(buf.buffer).setUint32(0, snapshot.tick, true);
57
-
58
- // Write updates directly into buffer (ZERO COPY!)
59
- this.updatesCodec.encodeInto(snapshot.updates, buf, 4);
60
-
61
- return buf;
62
- }
63
-
64
- // Fallback to legacy path
65
- const updatesBytes = this.updatesCodec.encode(snapshot.updates);
66
- const buf = new Uint8Array(4 + updatesBytes.length);
67
-
68
- new DataView(buf.buffer).setUint32(0, snapshot.tick, true);
69
- buf.set(updatesBytes, 4);
70
-
71
- return buf;
72
- }
73
-
74
- /**
75
- * Decode binary data into a snapshot.
76
- */
77
- decode(buf: Uint8Array): Snapshot<T> {
78
- // Decode tick (first 4 bytes)
79
- const tick = new DataView(buf.buffer, buf.byteOffset).getUint32(0, true);
80
-
81
- // Decode updates (remaining bytes)
82
- const updatesBytes = buf.subarray(4);
83
- const updates = this.updatesCodec.decode(updatesBytes);
84
-
85
- return { tick, updates };
86
- }
87
- }