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,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
- }