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,198 +0,0 @@
1
- import { Component } from "./component";
2
-
3
- /**
4
- * Stores component data using separate TypedArrays per field (SoA - Structure of Arrays).
5
- * Alternative to DataView-based storage for comparison.
6
- *
7
- * Tradeoffs:
8
- * + Faster individual field access (native typed array operations)
9
- * + Better for column-major access patterns
10
- * + SIMD-friendly (can vectorize single-field operations)
11
- * - Worse cache locality for row-major access (whole component reads)
12
- * - More memory fragmentation (separate arrays)
13
- * - Slightly higher memory overhead (each TypedArray has its own header)
14
- */
15
- export class ComponentStore<T extends object> {
16
- private arrays: (Float32Array | Int32Array | Uint32Array | Uint16Array | Uint8Array)[];
17
- private stride: number; // Component size in bytes (for compatibility)
18
- private component: Component<T>;
19
- private maxEntities: number;
20
-
21
- // Single reusable object for get() - zero allocations!
22
- private reusableObject: T;
23
-
24
- // Pre-computed field metadata for fast access
25
- private fields: any[];
26
- private fieldKeys: (keyof T)[];
27
- private fieldIndexMap: Record<string, number>;
28
-
29
- constructor(component: Component<T>, maxEntities: number) {
30
- this.component = component;
31
- this.maxEntities = maxEntities;
32
- this.stride = component.size;
33
-
34
- // Pre-compute field metadata
35
- this.fieldKeys = component.fieldNames;
36
- this.fields = [];
37
- this.fieldIndexMap = {};
38
- this.arrays = [];
39
-
40
- // Create separate typed array for each field
41
- for (let i = 0; i < this.fieldKeys.length; i++) {
42
- const key = this.fieldKeys[i];
43
- const field = component.schema[key];
44
- this.fields.push(field);
45
- this.fieldIndexMap[key as string] = i;
46
-
47
- // Allocate appropriate typed array based on field type
48
- switch (field.size) {
49
- case 4:
50
- // Could be f32, i32, or u32 - check field type
51
- if (field.read.toString().includes("getFloat32")) {
52
- this.arrays.push(new Float32Array(maxEntities));
53
- } else if (field.read.toString().includes("getInt32")) {
54
- this.arrays.push(new Int32Array(maxEntities));
55
- } else {
56
- this.arrays.push(new Uint32Array(maxEntities));
57
- }
58
- break;
59
- case 2:
60
- this.arrays.push(new Uint16Array(maxEntities));
61
- break;
62
- case 1:
63
- this.arrays.push(new Uint8Array(maxEntities));
64
- break;
65
- default:
66
- // Fallback to Uint8Array with multiple elements
67
- this.arrays.push(new Uint8Array(maxEntities * field.size));
68
- }
69
- }
70
-
71
- // Create single reusable object
72
- this.reusableObject = {} as T;
73
- for (let i = 0; i < this.fieldKeys.length; i++) {
74
- this.reusableObject[this.fieldKeys[i]] = this.fields[i].toNil();
75
- }
76
- }
77
-
78
- /**
79
- * Get component data for an entity.
80
- *
81
- * ⚠️ IMPORTANT: Returns a REUSED object that is overwritten on the next get() call.
82
- */
83
- get(entityId: number): Readonly<T> {
84
- const length = this.fields.length;
85
-
86
- // Unrolled loop for common cases
87
- if (length === 2) {
88
- this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId] as any;
89
- this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId] as any;
90
- } else if (length === 3) {
91
- this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId] as any;
92
- this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId] as any;
93
- this.reusableObject[this.fieldKeys[2]] = this.arrays[2][entityId] as any;
94
- } else if (length === 4) {
95
- this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId] as any;
96
- this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId] as any;
97
- this.reusableObject[this.fieldKeys[2]] = this.arrays[2][entityId] as any;
98
- this.reusableObject[this.fieldKeys[3]] = this.arrays[3][entityId] as any;
99
- } else {
100
- // Generic loop for other sizes
101
- for (let i = 0; i < length; i++) {
102
- this.reusableObject[this.fieldKeys[i]] = this.arrays[i][entityId] as any;
103
- }
104
- }
105
-
106
- return this.reusableObject as Readonly<T>;
107
- }
108
-
109
- /**
110
- * Get a mutable copy of component data.
111
- */
112
- getMutable(entityId: number): T {
113
- const copy = {} as T;
114
- this.copyTo(entityId, copy);
115
- return copy;
116
- }
117
-
118
- /**
119
- * Copy component data into a provided object.
120
- */
121
- copyTo(entityId: number, target: T): void {
122
- for (let i = 0; i < this.fields.length; i++) {
123
- target[this.fieldKeys[i]] = this.arrays[i][entityId] as any;
124
- }
125
- }
126
-
127
- /**
128
- * Set component data for an entity.
129
- */
130
- set(entityId: number, data: T): void {
131
- const length = this.fields.length;
132
-
133
- // Unrolled loop for common cases
134
- if (length === 2) {
135
- this.arrays[0][entityId] = data[this.fieldKeys[0]] as any;
136
- this.arrays[1][entityId] = data[this.fieldKeys[1]] as any;
137
- } else if (length === 3) {
138
- this.arrays[0][entityId] = data[this.fieldKeys[0]] as any;
139
- this.arrays[1][entityId] = data[this.fieldKeys[1]] as any;
140
- this.arrays[2][entityId] = data[this.fieldKeys[2]] as any;
141
- } else if (length === 4) {
142
- this.arrays[0][entityId] = data[this.fieldKeys[0]] as any;
143
- this.arrays[1][entityId] = data[this.fieldKeys[1]] as any;
144
- this.arrays[2][entityId] = data[this.fieldKeys[2]] as any;
145
- this.arrays[3][entityId] = data[this.fieldKeys[3]] as any;
146
- } else {
147
- // Generic loop for other sizes
148
- for (let i = 0; i < length; i++) {
149
- this.arrays[i][entityId] = data[this.fieldKeys[i]] as any;
150
- }
151
- }
152
- }
153
-
154
- /**
155
- * Update specific fields of a component.
156
- * Optimized to avoid Object.keys() allocation in hot path.
157
- */
158
- update(entityId: number, partial: Partial<T>): void {
159
- // Direct iteration
160
- for (const key in partial) {
161
- const i = this.fieldIndexMap[key];
162
- this.arrays[i][entityId] = partial[key as keyof T] as any;
163
- }
164
- }
165
-
166
- /**
167
- * Clear component data for an entity (set to default values)
168
- */
169
- clear(entityId: number): void {
170
- for (let i = 0; i < this.fields.length; i++) {
171
- this.arrays[i][entityId] = this.fields[i].toNil();
172
- }
173
- }
174
-
175
- /**
176
- * Get direct access to the underlying arrays.
177
- * Advanced use only - for SIMD operations, batch processing, etc.
178
- */
179
- getRawArrays(): readonly (Float32Array | Int32Array | Uint32Array | Uint16Array | Uint8Array)[] {
180
- return this.arrays;
181
- }
182
-
183
- /**
184
- * Get a specific field's array directly.
185
- * Useful for vectorized operations on a single field across all entities.
186
- */
187
- getFieldArray(fieldName: keyof T): Float32Array | Int32Array | Uint32Array | Uint16Array | Uint8Array {
188
- const index = this.fieldIndexMap[fieldName as string];
189
- return this.arrays[index];
190
- }
191
-
192
- /**
193
- * Get the stride in bytes (for compatibility with DataView version).
194
- */
195
- getStride(): number {
196
- return this.stride;
197
- }
198
- }
@@ -1,90 +0,0 @@
1
- import { Schema } from "../core/binary-codec";
2
- import { PooledCodec, ArrayField } from "../core/pooled-codec";
3
-
4
- /**
5
- * Metadata for a component definition
6
- */
7
- export interface ComponentMeta<T extends object> {
8
- /** Schema defining the component's binary layout */
9
- schema: Schema<T>;
10
-
11
- /** Unique name for this component type */
12
- name: string;
13
-
14
- /** Size of the component in bytes */
15
- size: number;
16
-
17
- /** Number of fields in the schema */
18
- fieldCount: number;
19
-
20
- /** Field names in order */
21
- fieldNames: (keyof T)[];
22
-
23
- /** Codec for array serialization */
24
- arrayCodec: ArrayField<T>;
25
- }
26
-
27
- /**
28
- * Component type returned by defineComponent
29
- */
30
- export type Component<T extends object = any> = ComponentMeta<T> & {
31
- /** Type marker for TypeScript inference */
32
- __type?: T;
33
-
34
- /** Internal: Index assigned by World when registered */
35
- __worldIndex?: number;
36
- };
37
-
38
- /**
39
- * Infer the data type from a Component
40
- */
41
- export type InferComponentType<C> = C extends Component<infer T> ? T : never;
42
-
43
- /**
44
- * Calculate the byte size of a schema
45
- */
46
- function calculateSchemaSize<T extends object>(schema: Schema<T>): number {
47
- let size = 0;
48
- for (const key of Object.keys(schema) as (keyof T)[]) {
49
- size += schema[key].size;
50
- }
51
- return size;
52
- }
53
-
54
- /**
55
- * Define a component type with its binary schema.
56
- *
57
- * @example
58
- * ```typescript
59
- * const Transform = defineComponent('Transform', {
60
- * x: BinaryCodec.f32,
61
- * y: BinaryCodec.f32,
62
- * rotation: BinaryCodec.f32,
63
- * });
64
- *
65
- * const Health = defineComponent('Health', {
66
- * current: BinaryCodec.u16,
67
- * max: BinaryCodec.u16,
68
- * });
69
- * ```
70
- */
71
- export function defineComponent<T extends object>(
72
- name: string,
73
- schema: Schema<T>
74
- ): Component<T> {
75
- const size = calculateSchemaSize(schema);
76
- const fieldNames = Object.keys(schema) as (keyof T)[];
77
- const fieldCount = fieldNames.length;
78
-
79
- // Create PooledCodec for array serialization
80
- const arrayCodec = PooledCodec.array(schema);
81
-
82
- return {
83
- name,
84
- schema,
85
- size,
86
- fieldCount,
87
- fieldNames,
88
- arrayCodec,
89
- };
90
- }
@@ -1,393 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { BinaryCodec } from "../core/binary-codec";
3
- import { defineComponent } from "./component";
4
- import { EntityHandle } from "./entity-handle";
5
- import { World } from "./world";
6
-
7
- // Define test components
8
- const Transform = defineComponent("Transform", {
9
- x: BinaryCodec.f32,
10
- y: BinaryCodec.f32,
11
- rotation: BinaryCodec.f32,
12
- });
13
-
14
- const Velocity = defineComponent("Velocity", {
15
- vx: BinaryCodec.f32,
16
- vy: BinaryCodec.f32,
17
- });
18
-
19
- const Health = defineComponent("Health", {
20
- current: BinaryCodec.u16,
21
- max: BinaryCodec.u16,
22
- });
23
-
24
- describe("EntityHandle", () => {
25
- test("should create entity handle and expose raw id", () => {
26
- const world = new World({
27
- maxEntities: 100,
28
- components: [Transform],
29
- });
30
-
31
- const entityId = world.spawn();
32
- const handle = new EntityHandle(world, entityId);
33
-
34
- expect(handle.id).toBe(entityId);
35
- });
36
-
37
- test("should support fluent API with method chaining", () => {
38
- const world = new World({
39
- maxEntities: 100,
40
- components: [Transform, Velocity, Health],
41
- });
42
-
43
- const entity = world.entity(world.spawn())
44
- .add(Transform, { x: 100, y: 200, rotation: 0 })
45
- .add(Velocity, { vx: 10, vy: 20 })
46
- .add(Health, { current: 100, max: 100 });
47
-
48
- // Verify all components were added
49
- expect(world.has(entity.id, Transform)).toBe(true);
50
- expect(world.has(entity.id, Velocity)).toBe(true);
51
- expect(world.has(entity.id, Health)).toBe(true);
52
-
53
- // Verify data is correct
54
- const transform = entity.get(Transform);
55
- expect(transform.x).toBe(100);
56
- expect(transform.y).toBe(200);
57
-
58
- const velocity = entity.get(Velocity);
59
- expect(velocity.vx).toBe(10);
60
- expect(velocity.vy).toBe(20);
61
- });
62
-
63
- test("should support add operation", () => {
64
- const world = new World({
65
- maxEntities: 100,
66
- components: [Transform],
67
- });
68
-
69
- const entity = world.entity(world.spawn());
70
- entity.add(Transform, { x: 50, y: 100, rotation: 0 });
71
-
72
- expect(entity.has(Transform)).toBe(true);
73
- const t = entity.get(Transform);
74
- expect(t.x).toBe(50);
75
- expect(t.y).toBe(100);
76
- });
77
-
78
- test("should support get operation", () => {
79
- const world = new World({
80
- maxEntities: 100,
81
- components: [Transform],
82
- });
83
-
84
- const entity = world.entity(world.spawn());
85
- entity.add(Transform, { x: 10, y: 20, rotation: 0.5 });
86
-
87
- const transform = entity.get(Transform);
88
- expect(transform.x).toBe(10);
89
- expect(transform.y).toBe(20);
90
- expect(transform.rotation).toBe(0.5);
91
-
92
- // TypeScript prevents mutation at compile time (Readonly<T>)
93
- // At runtime, it's the same reusable object from ComponentStore
94
- });
95
-
96
- test("should support update operation with chaining", () => {
97
- const world = new World({
98
- maxEntities: 100,
99
- components: [Transform, Health],
100
- });
101
-
102
- const entity = world.entity(world.spawn())
103
- .add(Transform, { x: 0, y: 0, rotation: 0 })
104
- .add(Health, { current: 100, max: 100 });
105
-
106
- entity
107
- .update(Transform, { x: 150 })
108
- .update(Health, { current: 50 });
109
-
110
- const transform = entity.get(Transform);
111
- expect(transform.x).toBe(150);
112
- expect(transform.y).toBe(0); // Unchanged
113
-
114
- const health = entity.get(Health);
115
- expect(health.current).toBe(50);
116
- expect(health.max).toBe(100); // Unchanged
117
- });
118
-
119
- test("should support set operation with chaining", () => {
120
- const world = new World({
121
- maxEntities: 100,
122
- components: [Transform],
123
- });
124
-
125
- const entity = world.entity(world.spawn())
126
- .add(Transform, { x: 0, y: 0, rotation: 0 });
127
-
128
- entity.set(Transform, { x: 100, y: 200, rotation: 1.5 });
129
-
130
- const transform = entity.get(Transform);
131
- expect(transform.x).toBe(100);
132
- expect(transform.y).toBe(200);
133
- expect(transform.rotation).toBe(1.5);
134
- });
135
-
136
- test("should support has operation", () => {
137
- const world = new World({
138
- maxEntities: 100,
139
- components: [Transform, Velocity],
140
- });
141
-
142
- const entity = world.entity(world.spawn())
143
- .add(Transform, { x: 0, y: 0, rotation: 0 });
144
-
145
- expect(entity.has(Transform)).toBe(true);
146
- expect(entity.has(Velocity)).toBe(false);
147
- });
148
-
149
- test("should support remove operation with chaining", () => {
150
- const world = new World({
151
- maxEntities: 100,
152
- components: [Transform, Velocity, Health],
153
- });
154
-
155
- const entity = world.entity(world.spawn())
156
- .add(Transform, { x: 0, y: 0, rotation: 0 })
157
- .add(Velocity, { vx: 10, vy: 20 })
158
- .add(Health, { current: 100, max: 100 });
159
-
160
- entity
161
- .remove(Velocity)
162
- .remove(Health);
163
-
164
- expect(entity.has(Transform)).toBe(true);
165
- expect(entity.has(Velocity)).toBe(false);
166
- expect(entity.has(Health)).toBe(false);
167
- });
168
-
169
- test("should support despawn operation", () => {
170
- const world = new World({
171
- maxEntities: 100,
172
- components: [Transform],
173
- });
174
-
175
- const entity = world.entity(world.spawn())
176
- .add(Transform, { x: 0, y: 0, rotation: 0 });
177
-
178
- expect(entity.isAlive()).toBe(true);
179
-
180
- entity.despawn();
181
-
182
- expect(entity.isAlive()).toBe(false);
183
- expect(world.isAlive(entity.id)).toBe(false);
184
- });
185
-
186
- test("should support isAlive check", () => {
187
- const world = new World({
188
- maxEntities: 100,
189
- components: [Transform],
190
- });
191
-
192
- const entity = world.entity(world.spawn());
193
-
194
- expect(entity.isAlive()).toBe(true);
195
-
196
- world.despawn(entity.id);
197
-
198
- expect(entity.isAlive()).toBe(false);
199
- });
200
-
201
- test("should support getMutable operation", () => {
202
- const world = new World({
203
- maxEntities: 100,
204
- components: [Transform],
205
- });
206
-
207
- const entity = world.entity(world.spawn())
208
- .add(Transform, { x: 10, y: 20, rotation: 0 });
209
-
210
- const transform = entity.getMutable(Transform);
211
- transform.x = 100;
212
- transform.y = 200;
213
-
214
- entity.set(Transform, transform);
215
-
216
- const updated = entity.get(Transform);
217
- expect(updated.x).toBe(100);
218
- expect(updated.y).toBe(200);
219
- });
220
-
221
- test("should work in realistic game loop", () => {
222
- const world = new World({
223
- maxEntities: 100,
224
- components: [Transform, Velocity, Health],
225
- });
226
-
227
- // Create entities using fluent API
228
- const player = world.entity(world.spawn())
229
- .add(Transform, { x: 0, y: 0, rotation: 0 })
230
- .add(Velocity, { vx: 5, vy: 0 })
231
- .add(Health, { current: 100, max: 100 });
232
-
233
- const enemy = world.entity(world.spawn())
234
- .add(Transform, { x: 100, y: 0, rotation: 0 })
235
- .add(Velocity, { vx: -2, vy: 0 })
236
- .add(Health, { current: 50, max: 50 });
237
-
238
- // Simulate 10 frames
239
- const deltaTime = 0.016;
240
- for (let i = 0; i < 10; i++) {
241
- // Movement system
242
- for (const entityId of world.query(Transform, Velocity)) {
243
- const entity = world.entity(entityId);
244
- const t = entity.get(Transform);
245
- const v = entity.get(Velocity);
246
-
247
- entity.update(Transform, {
248
- x: t.x + v.vx * deltaTime,
249
- y: t.y + v.vy * deltaTime,
250
- });
251
- }
252
- }
253
-
254
- // Verify positions changed
255
- const playerTransform = player.get(Transform);
256
- expect(playerTransform.x).toBeCloseTo(0.8, 1);
257
-
258
- const enemyTransform = enemy.get(Transform);
259
- expect(enemyTransform.x).toBeCloseTo(99.68, 1);
260
- });
261
-
262
- test("PERFORMANCE: EntityHandle should have zero overhead vs raw API", () => {
263
- const world = new World({
264
- maxEntities: 10000,
265
- components: [Transform, Velocity],
266
- });
267
-
268
- const iterations = 10000;
269
-
270
- // Benchmark raw API
271
- const rawStart = performance.now();
272
- for (let i = 0; i < iterations; i++) {
273
- const id = world.spawn();
274
- world.add(id, Transform, { x: i, y: i, rotation: 0 });
275
- world.add(id, Velocity, { vx: 1, vy: 1 });
276
- world.update(id, Transform, { x: i + 1 });
277
- const t = world.get(id, Transform);
278
- world.remove(id, Velocity);
279
- world.despawn(id);
280
- }
281
- const rawTime = performance.now() - rawStart;
282
-
283
- // Benchmark EntityHandle API
284
- const handleStart = performance.now();
285
- for (let i = 0; i < iterations; i++) {
286
- const entity = world.entity(world.spawn())
287
- .add(Transform, { x: i, y: i, rotation: 0 })
288
- .add(Velocity, { vx: 1, vy: 1 })
289
- .update(Transform, { x: i + 1 });
290
-
291
- const t = entity.get(Transform);
292
- entity.remove(Velocity).despawn();
293
- }
294
- const handleTime = performance.now() - handleStart;
295
-
296
- console.log(`\nEntityHandle Performance Test (${iterations} iterations):`);
297
- console.log(`Raw API time: ${rawTime.toFixed(2)}ms`);
298
- console.log(`Handle API time: ${handleTime.toFixed(2)}ms`);
299
- console.log(`Overhead: ${((handleTime / rawTime - 1) * 100).toFixed(1)}%`);
300
-
301
- // Handle should be within 50% of raw performance (accounting for JIT warmup and variance)
302
- // In real-world usage with proper JIT optimization, overhead is typically <5%
303
- expect(handleTime).toBeLessThan(rawTime * 1.5);
304
- });
305
-
306
- test("PERFORMANCE: EntityHandle in query loops should match raw API", () => {
307
- const world = new World({
308
- maxEntities: 5000,
309
- components: [Transform, Velocity],
310
- });
311
-
312
- // Setup entities
313
- const entities: number[] = [];
314
- for (let i = 0; i < 5000; i++) {
315
- const id = world.spawn();
316
- world.add(id, Transform, { x: i, y: i, rotation: 0 });
317
- world.add(id, Velocity, { vx: 1, vy: 1 });
318
- entities.push(id);
319
- }
320
-
321
- const iterations = 100;
322
- const deltaTime = 0.016;
323
-
324
- // Benchmark raw API
325
- const rawStart = performance.now();
326
- for (let iter = 0; iter < iterations; iter++) {
327
- for (const id of world.query(Transform, Velocity)) {
328
- const t = world.get(id, Transform);
329
- const v = world.get(id, Velocity);
330
- world.update(id, Transform, {
331
- x: t.x + v.vx * deltaTime,
332
- y: t.y + v.vy * deltaTime,
333
- });
334
- }
335
- }
336
- const rawTime = performance.now() - rawStart;
337
-
338
- // Reset positions
339
- for (const id of entities) {
340
- world.update(id, Transform, { x: 0, y: 0 });
341
- }
342
-
343
- // Benchmark EntityHandle API
344
- const handleStart = performance.now();
345
- for (let iter = 0; iter < iterations; iter++) {
346
- for (const id of world.query(Transform, Velocity)) {
347
- const entity = world.entity(id);
348
- const t = entity.get(Transform);
349
- const v = entity.get(Velocity);
350
- entity.update(Transform, {
351
- x: t.x + v.vx * deltaTime,
352
- y: t.y + v.vy * deltaTime,
353
- });
354
- }
355
- }
356
- const handleTime = performance.now() - handleStart;
357
-
358
- console.log(`\nEntityHandle Query Loop Performance (5k entities, ${iterations} frames):`);
359
- console.log(`Raw API time: ${rawTime.toFixed(2)}ms`);
360
- console.log(`Handle API time: ${handleTime.toFixed(2)}ms`);
361
- console.log(`Overhead: ${((handleTime / rawTime - 1) * 100).toFixed(1)}%`);
362
-
363
- // Handle should be within 25% of raw performance in query loops (accounting for variance)
364
- // Typical overhead in production: 0-5%
365
- expect(handleTime).toBeLessThan(rawTime * 1.25);
366
- });
367
-
368
- test("PERFORMANCE: EntityHandle construction should be negligible", () => {
369
- const world = new World({
370
- maxEntities: 10000,
371
- components: [Transform],
372
- });
373
-
374
- const entities = [];
375
- for (let i = 0; i < 10000; i++) {
376
- entities.push(world.spawn());
377
- }
378
-
379
- // Benchmark handle construction
380
- const start = performance.now();
381
- for (let i = 0; i < 10000; i++) {
382
- const handle = world.entity(entities[i]);
383
- const id = handle.id; // Use it to prevent optimization
384
- }
385
- const elapsed = performance.now() - start;
386
-
387
- console.log(`\nEntityHandle Construction (10k handles): ${elapsed.toFixed(2)}ms`);
388
- console.log(`Per handle: ${(elapsed / 10000 * 1000).toFixed(2)}µs`);
389
-
390
- // Should be extremely fast (< 1ms for 10k constructions)
391
- expect(elapsed).toBeLessThan(1.0);
392
- });
393
- });