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