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
package/src/net/client.ts DELETED
@@ -1,695 +0,0 @@
1
- import type { IntentRegistry } from "../protocol/intent/intent-registry";
2
- import type { SnapshotRegistry } from "../protocol/snapshot/snapshot-registry";
3
- import type { Snapshot } from "../protocol/snapshot/snapshot";
4
- import type { Intent } from "../protocol/intent/intent";
5
- import type { RpcRegistry } from "../protocol/rpc/rpc-registry";
6
- import type { DefinedRPC } from "../protocol/rpc/rpc";
7
- import { MessageType, type TransportAdapter, type NetworkConfig, type LagSimulation } from "./types";
8
-
9
- /**
10
- * Configuration for ClientNetwork
11
- */
12
- export interface ClientNetworkConfig<TSnapshots> {
13
- /** Transport adapter for server connection */
14
- transport: TransportAdapter;
15
-
16
- /** Intent registry for encoding client intents */
17
- intentRegistry: IntentRegistry;
18
-
19
- /** Snapshot registry for decoding server snapshots */
20
- snapshotRegistry: SnapshotRegistry<TSnapshots>;
21
-
22
- /** RPC registry for bidirectional remote procedure calls (optional) */
23
- rpcRegistry?: RpcRegistry;
24
-
25
- /** Network configuration */
26
- config?: NetworkConfig;
27
- }
28
-
29
- /**
30
- * Generic game client for multiplayer networking
31
- * Handles intent sending and snapshot receiving with full type safety
32
- *
33
- * @template TSnapshots Union type of all possible snapshot update types
34
- *
35
- * @example
36
- * ```ts
37
- * type GameSnapshots = PlayerUpdate | ScoreUpdate | ProjectileUpdate;
38
- *
39
- * const client = new ClientNetwork<GameSnapshots>({
40
- * transport: wsTransport,
41
- * intentRegistry,
42
- * snapshotRegistry,
43
- * });
44
- *
45
- * // Type-safe snapshot handlers
46
- * client.onSnapshot<PlayerUpdate>('players', (snapshot) => {
47
- * snapshot.updates.players // ✅ Correctly typed
48
- * });
49
- * ```
50
- */
51
- export class ClientNetwork<TSnapshots = unknown> {
52
- private transport: TransportAdapter;
53
- private intentRegistry: IntentRegistry;
54
- private snapshotRegistry: SnapshotRegistry<TSnapshots>;
55
- private rpcRegistry?: RpcRegistry;
56
- private config: Required<NetworkConfig>;
57
-
58
- /** Snapshot type handlers: type -> handler[] (supports multiple handlers) */
59
- private snapshotHandlers = new Map<string, Array<(snapshot: Snapshot<any>) => void>>();
60
-
61
- /** RPC method handlers: method -> handler[] (supports multiple handlers) */
62
- private rpcHandlers = new Map<string, Array<(data: any) => void>>();
63
-
64
- /** Connection lifecycle handlers */
65
- private connectHandlers: Array<() => void> = [];
66
- private disconnectHandlers: Array<() => void> = [];
67
- private errorHandlers: Array<(error: Error) => void> = [];
68
-
69
- /** Connection state */
70
- private connected = false;
71
-
72
- /** Last sent intent per kind (for change detection) */
73
- private lastSentIntents = new Map<number, Intent>();
74
-
75
- /** Rate limiting state */
76
- private messageCount = 0;
77
- private messageCountWindow = Date.now();
78
-
79
- /** Heartbeat timer */
80
- private heartbeatTimer: ReturnType<typeof setInterval> | null = null;
81
-
82
- /** Last time we received a message from server */
83
- private lastMessageReceivedAt = Date.now();
84
-
85
- /** Lag simulation configuration */
86
- private lagSimulation?: LagSimulation;
87
-
88
- constructor(config: ClientNetworkConfig<TSnapshots>) {
89
- this.transport = config.transport;
90
- this.intentRegistry = config.intentRegistry;
91
- this.snapshotRegistry = config.snapshotRegistry;
92
- this.rpcRegistry = config.rpcRegistry;
93
- this.config = {
94
- maxMessageSize: config.config?.maxMessageSize ?? 65536,
95
- debug: config.config?.debug ?? false,
96
- enableBufferPooling: config.config?.enableBufferPooling ?? true,
97
- maxMessagesPerSecond: config.config?.maxMessagesPerSecond ?? 60,
98
- maxSendQueueSize: config.config?.maxSendQueueSize ?? 100,
99
- heartbeatInterval: config.config?.heartbeatInterval ?? 30000,
100
- heartbeatTimeout: config.config?.heartbeatTimeout ?? 60000,
101
- lagSimulation: config.config?.lagSimulation,
102
- };
103
-
104
- this.lagSimulation = config.config?.lagSimulation;
105
-
106
- this.setupTransportHandlers();
107
- this.setupHeartbeat();
108
- }
109
-
110
- /**
111
- * Send an intent to the server (type-safe)
112
- */
113
- /**
114
- * Check if an intent has changed compared to the last sent intent of the same kind.
115
- * Useful for bandwidth optimization - only send intents when they actually change.
116
- *
117
- * @param intent The intent to check
118
- * @param compareFn Optional custom comparison function. If not provided, uses JSON.stringify.
119
- * @returns true if the intent is different from the last sent intent of this kind
120
- *
121
- * @example
122
- * ```ts
123
- * const moveIntent = { kind: IntentKind.Move, tick: 100, dx: 1, dy: 0 };
124
- *
125
- * // Only send if input changed
126
- * if (client.hasIntentChanged(moveIntent)) {
127
- * client.sendIntent(moveIntent);
128
- * }
129
- *
130
- * // Custom comparison (more efficient than JSON.stringify)
131
- * if (client.hasIntentChanged(moveIntent, (last, current) =>
132
- * last.dx !== current.dx || last.dy !== current.dy
133
- * )) {
134
- * client.sendIntent(moveIntent);
135
- * }
136
- * ```
137
- */
138
- hasIntentChanged<T extends Intent>(
139
- intent: T,
140
- compareFn?: (last: T, current: T) => boolean
141
- ): boolean {
142
- const lastIntent = this.lastSentIntents.get(intent.kind) as T | undefined;
143
-
144
- if (!lastIntent) {
145
- return true; // First time sending this intent kind
146
- }
147
-
148
- if (compareFn) {
149
- return compareFn(lastIntent, intent);
150
- }
151
-
152
- // Default comparison: stringify everything except tick
153
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
154
- const { tick: _lastTick, ...lastData } = lastIntent;
155
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
156
- const { tick: _currentTick, ...currentData } = intent;
157
-
158
- return JSON.stringify(lastData) !== JSON.stringify(currentData);
159
- }
160
-
161
- sendIntent<T extends Intent>(intent: T): void {
162
- if (!this.connected) {
163
- this.log("Cannot send intent: not connected");
164
- return;
165
- }
166
-
167
- // Client-side rate limiting
168
- if (!this.checkRateLimit()) {
169
- this.log("Rate limit exceeded, dropping intent");
170
- return;
171
- }
172
-
173
- try {
174
- // Encode intent
175
- const intentData = this.intentRegistry.encode(intent);
176
-
177
- // Wrap with message type header
178
- const message = new Uint8Array(1 + intentData.byteLength);
179
- message[0] = MessageType.INTENT;
180
- message.set(intentData, 1);
181
-
182
- // Send to server
183
- this.transport.send(message);
184
-
185
- // Track this intent for change detection (clone to avoid reference issues)
186
- this.lastSentIntents.set(intent.kind, { ...intent });
187
-
188
- this.log(`Sent intent (kind: ${intent.kind}, tick: ${intent.tick})`);
189
- } catch (error) {
190
- this.log(`Failed to send intent: ${error}`);
191
- }
192
- }
193
-
194
- /**
195
- * Register a handler for a specific snapshot type (type-safe)
196
- * Supports multiple handlers per snapshot type
197
- * @template T The specific snapshot update type for this handler
198
- * @returns Unsubscribe function to remove this handler
199
- */
200
- onSnapshot<T extends Partial<TSnapshots>>(
201
- type: string,
202
- handler: (snapshot: Snapshot<T>) => void
203
- ): () => void {
204
- let handlers = this.snapshotHandlers.get(type);
205
- if (!handlers) {
206
- handlers = [];
207
- this.snapshotHandlers.set(type, handlers);
208
- }
209
- handlers.push(handler as (snapshot: Snapshot<any>) => void);
210
-
211
- // Return unsubscribe function
212
- return () => {
213
- const handlers = this.snapshotHandlers.get(type);
214
- if (handlers) {
215
- const index = handlers.indexOf(handler as (snapshot: Snapshot<any>) => void);
216
- if (index > -1) {
217
- handlers.splice(index, 1);
218
- }
219
- }
220
- };
221
- }
222
-
223
- /**
224
- * Send an RPC to the server (type-safe)
225
- *
226
- * @template TSchema The RPC data type
227
- * @param rpc The RPC definition created by defineRPC()
228
- * @param data The RPC data to send
229
- *
230
- * @example
231
- * ```ts
232
- * const BuyItem = defineRPC({
233
- * method: 'buyItem',
234
- * schema: { itemId: BinaryCodec.string(32) }
235
- * });
236
- *
237
- * client.sendRpc(BuyItem, { itemId: 'long_sword' });
238
- * ```
239
- */
240
- sendRPC<TSchema extends Record<string, any>>(rpc: DefinedRPC<TSchema>, data: TSchema): void {
241
- if (!this.rpcRegistry) {
242
- throw new Error('RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.');
243
- }
244
-
245
- if (!this.connected) {
246
- this.log("Cannot send RPC: not connected");
247
- return;
248
- }
249
-
250
- // Client-side rate limiting
251
- if (!this.checkRateLimit()) {
252
- this.log("Rate limit exceeded, dropping RPC");
253
- return;
254
- }
255
-
256
- try {
257
- // Encode RPC
258
- const rpcData = this.rpcRegistry.encode(rpc, data);
259
-
260
- // Wrap with message type header
261
- const message = new Uint8Array(1 + rpcData.byteLength);
262
- message[0] = MessageType.CUSTOM;
263
- message.set(rpcData, 1);
264
-
265
- // Send to server
266
- this.transport.send(message);
267
-
268
- this.log(`Sent RPC (method: ${rpc.method})`);
269
- } catch (error) {
270
- this.log(`Failed to send RPC: ${error}`);
271
- }
272
- }
273
-
274
- /**
275
- * Register a handler for incoming RPCs from the server (type-safe)
276
- * Supports multiple handlers per RPC method
277
- *
278
- * @template TSchema The RPC data type
279
- * @param rpc The RPC definition created by defineRPC()
280
- * @param handler Callback function to handle the RPC
281
- * @returns Unsubscribe function to remove this handler
282
- *
283
- * @example
284
- * ```ts
285
- * const MatchCountdown = defineRPC({
286
- * method: 'matchCountdown',
287
- * schema: { secondsRemaining: BinaryCodec.u8 }
288
- * });
289
- *
290
- * client.onRpc(MatchCountdown, (rpc) => {
291
- * console.log(`Match starting in ${rpc.secondsRemaining}s`);
292
- * });
293
- * ```
294
- */
295
- onRPC<TSchema extends Record<string, any>>(
296
- rpc: DefinedRPC<TSchema>,
297
- handler: (data: TSchema) => void
298
- ): () => void {
299
- if (!this.rpcRegistry) {
300
- throw new Error('RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.');
301
- }
302
-
303
- let handlers = this.rpcHandlers.get(rpc.method);
304
- if (!handlers) {
305
- handlers = [];
306
- this.rpcHandlers.set(rpc.method, handlers);
307
- }
308
- handlers.push(handler as (data: any) => void);
309
-
310
- // Return unsubscribe function
311
- return () => {
312
- const handlers = this.rpcHandlers.get(rpc.method);
313
- if (handlers) {
314
- const index = handlers.indexOf(handler as (data: any) => void);
315
- if (index > -1) {
316
- handlers.splice(index, 1);
317
- }
318
- }
319
- };
320
- }
321
-
322
- /**
323
- * Register a handler for connection events
324
- */
325
- onConnect(handler: () => void): () => void {
326
- this.connectHandlers.push(handler);
327
- return () => {
328
- const index = this.connectHandlers.indexOf(handler);
329
- if (index > -1) this.connectHandlers.splice(index, 1);
330
- };
331
- }
332
-
333
- /**
334
- * Register a handler for disconnection events
335
- */
336
- onDisconnect(handler: () => void): () => void {
337
- this.disconnectHandlers.push(handler);
338
- return () => {
339
- const index = this.disconnectHandlers.indexOf(handler);
340
- if (index > -1) this.disconnectHandlers.splice(index, 1);
341
- };
342
- }
343
-
344
- /**
345
- * Register a handler for transport errors
346
- */
347
- onError(handler: (error: Error) => void): () => void {
348
- this.errorHandlers.push(handler);
349
- return () => {
350
- const index = this.errorHandlers.indexOf(handler);
351
- if (index > -1) this.errorHandlers.splice(index, 1);
352
- };
353
- }
354
-
355
- /**
356
- * Check if connected to server
357
- */
358
- isConnected(): boolean {
359
- return this.connected;
360
- }
361
-
362
- /**
363
- * Disconnect from server
364
- */
365
- disconnect(): void | Promise<void> {
366
- this.log("Disconnecting...");
367
-
368
- // Stop heartbeat timer
369
- if (this.heartbeatTimer) {
370
- clearInterval(this.heartbeatTimer);
371
- this.heartbeatTimer = null;
372
- }
373
-
374
- return this.transport.close();
375
- }
376
-
377
- /**
378
- * Setup transport event handlers
379
- */
380
- private setupTransportHandlers(): void {
381
- // Setup open handler if transport supports it
382
- if (this.transport.onOpen) {
383
- this.transport.onOpen(() => {
384
- this.log("Connected to server");
385
- this.connected = true;
386
- this.lastMessageReceivedAt = Date.now();
387
- this.notifyConnectHandlers();
388
- });
389
- } else {
390
- // If transport doesn't support onOpen, assume already connected
391
- this.connected = true;
392
- this.lastMessageReceivedAt = Date.now();
393
- }
394
-
395
- this.transport.onMessage((data) => {
396
- const lagDelay = this.getLagDelay();
397
-
398
- if (lagDelay > 0) {
399
- // Simulate lag by delaying message handling
400
- // IMPORTANT: Copy the data buffer as it may be reused by the transport
401
- const dataCopy = new Uint8Array(data);
402
- setTimeout(() => {
403
- this.handleMessage(dataCopy);
404
- }, lagDelay);
405
- } else {
406
- this.handleMessage(data);
407
- }
408
- });
409
-
410
- this.transport.onClose(() => {
411
- this.handleDisconnection();
412
- });
413
-
414
- // Setup error handler if transport supports it
415
- if (this.transport.onError) {
416
- this.transport.onError((error) => {
417
- this.handleError(error);
418
- });
419
- }
420
- }
421
-
422
- /**
423
- * Setup heartbeat mechanism
424
- */
425
- private setupHeartbeat(): void {
426
- if (this.config.heartbeatInterval === 0) {
427
- return; // Heartbeats disabled
428
- }
429
-
430
- this.heartbeatTimer = setInterval(() => {
431
- this.checkHeartbeat();
432
- }, this.config.heartbeatInterval);
433
- }
434
-
435
- /**
436
- * Check server heartbeat timeout and send heartbeat
437
- */
438
- private checkHeartbeat(): void {
439
- const now = Date.now();
440
- const timeSinceLastMessage = now - this.lastMessageReceivedAt;
441
-
442
- // Check if server has timed out
443
- if (timeSinceLastMessage > this.config.heartbeatTimeout) {
444
- this.log(`Server timed out (no message for ${timeSinceLastMessage}ms)`);
445
- this.disconnect();
446
- return;
447
- }
448
-
449
- // Send heartbeat to server
450
- try {
451
- const heartbeatMessage = new Uint8Array([MessageType.HEARTBEAT]);
452
- this.transport.send(heartbeatMessage);
453
- } catch (error) {
454
- this.log(`Failed to send heartbeat: ${error}`);
455
- }
456
- }
457
-
458
- /**
459
- * Handle incoming message from server
460
- */
461
- private handleMessage(data: Uint8Array): void {
462
- // Update last message received timestamp
463
- this.lastMessageReceivedAt = Date.now();
464
-
465
- if (data.byteLength === 0) {
466
- this.log("Received empty message from server");
467
- return;
468
- }
469
-
470
- if (data.byteLength > this.config.maxMessageSize) {
471
- this.log(`Message exceeds max size: ${data.byteLength} > ${this.config.maxMessageSize}`);
472
- return;
473
- }
474
-
475
- const messageType = data[0];
476
- const payload = data.subarray(1);
477
-
478
- switch (messageType) {
479
- case MessageType.SNAPSHOT:
480
- this.handleSnapshot(payload);
481
- break;
482
- case MessageType.HEARTBEAT:
483
- // Heartbeat received - already updated lastMessageReceivedAt above
484
- this.log("Received heartbeat from server");
485
- break;
486
- case MessageType.CUSTOM:
487
- this.handleRPC(payload);
488
- break;
489
- default:
490
- this.log(`Unknown message type: ${messageType}`);
491
- }
492
- }
493
-
494
- /**
495
- * Decode and handle a snapshot from server
496
- *
497
- * IMPORTANT: Handlers receive the pooled object directly (zero-copy).
498
- * Handlers MUST extract any data they need immediately - do NOT store references to the snapshot.updates object.
499
- * The object will be released back to the pool after all handlers complete.
500
- */
501
- private handleSnapshot(data: Uint8Array): void {
502
- try {
503
- // Decode using snapshot registry (returns { type, snapshot })
504
- const decoded = this.snapshotRegistry.decode<Partial<TSnapshots>>(data);
505
-
506
- this.log(`Received snapshot (type: ${decoded.type}, tick: ${decoded.snapshot.tick})`);
507
-
508
- // Call all type-specific handlers if registered
509
- // HANDLERS MUST NOT STORE REFERENCES - extract data immediately!
510
- const handlers = this.snapshotHandlers.get(decoded.type);
511
- if (handlers && handlers.length > 0) {
512
- for (const handler of handlers) {
513
- try {
514
- handler(decoded.snapshot);
515
- } catch (error) {
516
- this.log(`Error in snapshot handler: ${error}`);
517
- }
518
- }
519
- } else {
520
- this.log(`No handler registered for snapshot type: ${decoded.type}`);
521
- }
522
-
523
- // Release the pooled object back to the pool
524
- // This enables efficient memory reuse across snapshot updates (zero GC pressure)
525
- this.snapshotRegistry.release(decoded.type, decoded.snapshot.updates);
526
- } catch (error) {
527
- this.log(`Failed to decode snapshot: ${error}`);
528
- }
529
- }
530
-
531
- /**
532
- * Handle incoming RPC message from server
533
- *
534
- * IMPORTANT: Handlers receive the pooled object directly (zero-copy).
535
- * Handlers MUST extract any data they need immediately - do NOT store references to the RPC data object.
536
- * The object will be released back to the pool after all handlers complete.
537
- */
538
- private handleRPC(data: Uint8Array): void {
539
- if (!this.rpcRegistry) {
540
- this.log("Received RPC but RpcRegistry not configured");
541
- return;
542
- }
543
-
544
- try {
545
- // Decode using RPC registry (returns { method, data })
546
- const decoded = this.rpcRegistry.decode(data);
547
-
548
- this.log(`Received RPC (method: ${decoded.method})`);
549
-
550
- // Call all method-specific handlers if registered
551
- // HANDLERS MUST NOT STORE REFERENCES - extract data immediately!
552
- const handlers = this.rpcHandlers.get(decoded.method);
553
- if (handlers && handlers.length > 0) {
554
- for (const handler of handlers) {
555
- try {
556
- handler(decoded.data);
557
- } catch (error) {
558
- this.log(`Error in RPC handler: ${error}`);
559
- }
560
- }
561
- } else {
562
- this.log(`No handler registered for RPC method: ${decoded.method}`);
563
- }
564
-
565
- // Release the pooled object back to the pool
566
- // This enables efficient memory reuse across RPC calls (zero GC pressure)
567
- this.rpcRegistry.release(decoded.method, decoded.data);
568
- } catch (error) {
569
- this.log(`Failed to decode RPC: ${error}`);
570
- }
571
- }
572
-
573
- /**
574
- * Handle disconnection from server
575
- */
576
- private handleDisconnection(): void {
577
- this.log("Disconnected from server");
578
- this.connected = false;
579
-
580
- // Stop heartbeat timer
581
- if (this.heartbeatTimer) {
582
- clearInterval(this.heartbeatTimer);
583
- this.heartbeatTimer = null;
584
- }
585
-
586
- this.notifyDisconnectHandlers();
587
- }
588
-
589
- /**
590
- * Notify connect handlers
591
- */
592
- private notifyConnectHandlers(): void {
593
- for (const handler of this.connectHandlers) {
594
- try {
595
- handler();
596
- } catch (error) {
597
- // Don't call log here as it might throw, use console.error directly
598
- if (this.config.debug) {
599
- console.error(`[ClientNetwork] Error in connect handler: ${error}`);
600
- }
601
- }
602
- }
603
- }
604
-
605
- /**
606
- * Notify disconnect handlers
607
- */
608
- private notifyDisconnectHandlers(): void {
609
- for (const handler of this.disconnectHandlers) {
610
- try {
611
- handler();
612
- } catch (error) {
613
- // Don't call log here as it might throw, use console.error directly
614
- if (this.config.debug) {
615
- console.error(`[ClientNetwork] Error in disconnect handler: ${error}`);
616
- }
617
- }
618
- }
619
- }
620
-
621
- /**
622
- * Handle transport errors
623
- */
624
- private handleError(error: Error): void {
625
- this.log(`Transport error: ${error.message}`);
626
- this.notifyErrorHandlers(error);
627
- }
628
-
629
- /**
630
- * Notify error handlers
631
- */
632
- private notifyErrorHandlers(error: Error): void {
633
- for (const handler of this.errorHandlers) {
634
- try {
635
- handler(error);
636
- } catch (err) {
637
- this.log(`Error in error handler: ${err}`);
638
- }
639
- }
640
- }
641
-
642
- /**
643
- * Check client-side rate limit
644
- * Returns true if message should be sent, false if rate limit exceeded
645
- */
646
- private checkRateLimit(): boolean {
647
- if (this.config.maxMessagesPerSecond === 0) {
648
- return true; // Rate limiting disabled
649
- }
650
-
651
- const now = Date.now();
652
- const windowStart = Math.floor(now / 1000) * 1000; // Start of current second
653
-
654
- // Reset counter if we're in a new time window
655
- if (this.messageCountWindow !== windowStart) {
656
- this.messageCountWindow = windowStart;
657
- this.messageCount = 0;
658
- }
659
-
660
- // Check if limit would be exceeded BEFORE incrementing
661
- if (this.messageCount >= this.config.maxMessagesPerSecond) {
662
- return false;
663
- }
664
-
665
- // Only increment if we're allowing this message
666
- this.messageCount++;
667
- return true;
668
- }
669
-
670
- /**
671
- * Calculate lag delay based on lag simulation configuration
672
- */
673
- private getLagDelay(): number {
674
- if (!this.lagSimulation) {
675
- return 0;
676
- }
677
-
678
- if (typeof this.lagSimulation === 'number') {
679
- return this.lagSimulation;
680
- }
681
-
682
- // Random delay between min and max
683
- const { min, max } = this.lagSimulation;
684
- return min + Math.random() * (max - min);
685
- }
686
-
687
- /**
688
- * Debug logging
689
- */
690
- private log(message: string): void {
691
- if (this.config.debug) {
692
- console.log(`[ClientNetwork] ${message}`);
693
- }
694
- }
695
- }