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,3 +0,0 @@
1
- export * from "./immediate";
2
- export * from "./raf";
3
- export * from "./timeout";
@@ -1,67 +0,0 @@
1
- import { LoopDriver } from "../loop";
2
-
3
- /**
4
- * Client-side game loop driver using requestAnimationFrame.
5
- *
6
- * This driver synchronizes updates with the browser's display refresh rate (typically 60 FPS),
7
- * providing smooth rendering and automatic throttling when the tab is not visible.
8
- *
9
- * Delta time is automatically calculated between frames and passed to the update callback in seconds.
10
- *
11
- * @example
12
- * ```typescript
13
- * const driver = new RafDriver((dt) => {
14
- * player.update(dt);
15
- * renderer.render();
16
- * });
17
- * driver.start();
18
- * ```
19
- */
20
- export class RafDriver implements LoopDriver {
21
- /**
22
- * @param update - Callback invoked each frame with delta time in seconds
23
- */
24
- constructor(public update: (dt: number) => void) { }
25
-
26
- private last = performance.now();
27
- private running = false;
28
- private rafId: number | null = null;
29
-
30
- /**
31
- * Starts the game loop using requestAnimationFrame.
32
- *
33
- * Resets timing to prevent large initial delta.
34
- */
35
- start() {
36
- this.running = true;
37
- this.last = performance.now();
38
- this.rafId = requestAnimationFrame(this.loop);
39
- }
40
-
41
- /**
42
- * Stops the game loop and cancels any pending animation frame.
43
- */
44
- stop() {
45
- this.running = false;
46
- if (this.rafId !== null) {
47
- cancelAnimationFrame(this.rafId);
48
- this.rafId = null;
49
- }
50
- }
51
-
52
- /**
53
- * Internal loop method that calculates delta time and schedules the next frame.
54
- *
55
- * Delta time is provided in seconds.
56
- */
57
- loop = () => {
58
- if (!this.running) return;
59
-
60
- const now = performance.now();
61
- const dt = (now - this.last) / 1000;
62
- this.last = now;
63
-
64
- this.update(dt);
65
- requestAnimationFrame(this.loop);
66
- };
67
- }
@@ -1,77 +0,0 @@
1
- import { LoopDriver } from "../loop";
2
-
3
- /**
4
- * Minimal delay for setTimeout-based loop scheduling.
5
- * Using 1ms allows the event loop to process I/O while still maintaining high tick rates.
6
- */
7
- const TIMEOUT_DELAY = 1;
8
-
9
- /**
10
- * Server-side game loop driver using setTimeout.
11
- *
12
- * This driver provides a more controlled alternative to setImmediate, running the game loop
13
- * with a minimal delay (1ms) between iterations. This ensures the event loop can process
14
- * I/O operations while maintaining high tick rates.
15
- *
16
- * Unlike setImmediate which runs as fast as possible, setTimeout provides better I/O responsiveness
17
- * by yielding to the event loop between ticks with a minimal delay.
18
- *
19
- * Delta time is automatically calculated between iterations and passed to the update callback in seconds.
20
- *
21
- * **Note:** This driver is designed for Node.js/Bun server environments. For maximum performance
22
- * without I/O concerns, use ImmediateDriver instead.
23
- *
24
- * @example
25
- * ```typescript
26
- * const driver = new TimeoutDriver((dt) => {
27
- * world.tick(dt);
28
- * broadcastState();
29
- * });
30
- * driver.start();
31
- * ```
32
- */
33
- export class TimeoutDriver implements LoopDriver {
34
- /**
35
- * @param update - Callback invoked each tick with delta time in seconds
36
- */
37
- constructor(public update: (dt: number) => void) { }
38
-
39
- private last = performance.now();
40
- private running = false;
41
-
42
- /**
43
- * Starts the game loop using setTimeout with minimal delay.
44
- *
45
- * Resets timing to prevent large initial delta.
46
- */
47
- start() {
48
- this.running = true;
49
- this.last = performance.now();
50
- this.loop();
51
- }
52
-
53
- /**
54
- * Stops the game loop.
55
- *
56
- * Note: Does not cancel already queued setTimeout callbacks.
57
- */
58
- stop() {
59
- this.running = false;
60
- }
61
-
62
- /**
63
- * Internal loop method that calculates delta time and schedules the next iteration.
64
- *
65
- * Delta time is provided in seconds. Uses 1ms delay to allow I/O processing.
66
- */
67
- loop = () => {
68
- if (!this.running) return;
69
-
70
- const now = performance.now();
71
- const dt = (now - this.last) / 1000;
72
- this.last = now;
73
-
74
- this.update(dt);
75
- setTimeout(this.loop, TIMEOUT_DELAY);
76
- };
77
- }
@@ -1,2 +0,0 @@
1
- export * from './loop';
2
- export * from './drivers';
@@ -1,414 +0,0 @@
1
- import { describe, expect, test, beforeEach, afterEach } from "bun:test";
2
- import { RafDriver, ImmediateDriver, TimeoutDriver } from "./drivers";
3
- import { createDriver } from "./loop";
4
-
5
- // Mock requestAnimationFrame for testing (Node.js doesn't have it)
6
- (() => {
7
- let rafId = 0;
8
- const callbacks = new Map<number, FrameRequestCallback>();
9
- let running = false;
10
- let intervalId: Timer | null = null;
11
-
12
- (globalThis as any).requestAnimationFrame = (callback: FrameRequestCallback): number => {
13
- const id = ++rafId;
14
- callbacks.set(id, callback);
15
-
16
- if (!running) {
17
- running = true;
18
- intervalId = setInterval(() => {
19
- const now = performance.now();
20
- const cbs = Array.from(callbacks.entries());
21
- callbacks.clear();
22
- for (const [_, cb] of cbs) {
23
- cb(now);
24
- }
25
- if (callbacks.size === 0) {
26
- running = false;
27
- if (intervalId) clearInterval(intervalId);
28
- }
29
- }, 16); // ~60fps
30
- }
31
-
32
- return id;
33
- };
34
-
35
- (globalThis as any).cancelAnimationFrame = (id: number): void => {
36
- callbacks.delete(id);
37
- if (callbacks.size === 0) {
38
- running = false;
39
- if (intervalId) clearInterval(intervalId);
40
- }
41
- };
42
- })();
43
-
44
- describe("Loop", () => {
45
- describe("createDriver", () => {
46
- test("should create RafDriver for client type", () => {
47
- const driver = createDriver('client', () => {});
48
- expect(driver).toBeInstanceOf(RafDriver);
49
- });
50
-
51
- test("should create ImmediateDriver for server-immediate type", () => {
52
- const driver = createDriver('server-immediate', () => {});
53
- expect(driver).toBeInstanceOf(ImmediateDriver);
54
- });
55
-
56
- test("should create TimeoutDriver for server-timeout type", () => {
57
- const driver = createDriver('server-timeout', () => {});
58
- expect(driver).toBeInstanceOf(TimeoutDriver);
59
- });
60
-
61
- test("should pass update callback to driver", () => {
62
- let called = false;
63
- const update = () => { called = true; };
64
- const driver = createDriver('server-immediate', update);
65
-
66
- // Access the update function directly
67
- (driver as ImmediateDriver).update(0.016);
68
- expect(called).toBe(true);
69
- });
70
- });
71
-
72
- describe("ImmediateDriver", () => {
73
- let driver: ImmediateDriver;
74
- let updateCalls: number[] = [];
75
-
76
- beforeEach(() => {
77
- updateCalls = [];
78
- driver = new ImmediateDriver((dt) => {
79
- updateCalls.push(dt);
80
- });
81
- });
82
-
83
- afterEach(() => {
84
- driver.stop();
85
- });
86
-
87
- test("should initialize without starting", () => {
88
- expect(updateCalls.length).toBe(0);
89
- });
90
-
91
- test("should call update with delta time", async () => {
92
- driver.start();
93
-
94
- // Wait for a few ticks
95
- await new Promise(resolve => setTimeout(resolve, 50));
96
- driver.stop();
97
-
98
- expect(updateCalls.length).toBeGreaterThan(0);
99
-
100
- // Delta times should be positive and in seconds
101
- for (const dt of updateCalls) {
102
- expect(dt).toBeGreaterThan(0);
103
- expect(dt).toBeLessThan(1); // Should be less than 1 second
104
- }
105
- });
106
-
107
- test("should stop calling update after stop", async () => {
108
- driver.start();
109
- await new Promise(resolve => setTimeout(resolve, 20));
110
- driver.stop();
111
-
112
- const callsAfterStop = updateCalls.length;
113
-
114
- // Wait a bit more
115
- await new Promise(resolve => setTimeout(resolve, 20));
116
-
117
- // Should not have significantly more calls (allow 1-2 in-flight)
118
- expect(updateCalls.length - callsAfterStop).toBeLessThanOrEqual(2);
119
- });
120
-
121
- test("should calculate delta time correctly", async () => {
122
- driver.start();
123
-
124
- await new Promise(resolve => setTimeout(resolve, 50));
125
- driver.stop();
126
-
127
- // Sum of all deltas should approximately equal wall time
128
- const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
129
- expect(totalTime).toBeGreaterThan(0.04); // At least 40ms
130
- expect(totalTime).toBeLessThan(0.1); // Less than 100ms
131
- });
132
-
133
- test("should handle restart", async () => {
134
- driver.start();
135
- await new Promise(resolve => setTimeout(resolve, 20));
136
- driver.stop();
137
-
138
- const firstBatch = updateCalls.length;
139
- updateCalls = [];
140
-
141
- driver.start();
142
- await new Promise(resolve => setTimeout(resolve, 20));
143
- driver.stop();
144
-
145
- expect(updateCalls.length).toBeGreaterThan(0);
146
- });
147
- });
148
-
149
- describe("RafDriver", () => {
150
- let driver: RafDriver;
151
- let updateCalls: number[] = [];
152
-
153
- beforeEach(() => {
154
- updateCalls = [];
155
- driver = new RafDriver((dt) => {
156
- updateCalls.push(dt);
157
- });
158
- });
159
-
160
- afterEach(() => {
161
- driver.stop();
162
- });
163
-
164
- test("should initialize without starting", () => {
165
- expect(updateCalls.length).toBe(0);
166
- });
167
-
168
- test("should call update with delta time", async () => {
169
- driver.start();
170
-
171
- // Wait for a few frames (at 60fps, 100ms = ~6 frames)
172
- await new Promise(resolve => setTimeout(resolve, 100));
173
- driver.stop();
174
-
175
- expect(updateCalls.length).toBeGreaterThan(0);
176
-
177
- // Delta times should be positive and reasonable for 60fps
178
- for (const dt of updateCalls) {
179
- expect(dt).toBeGreaterThan(0);
180
- expect(dt).toBeLessThan(0.1); // Less than 100ms per frame
181
- }
182
- });
183
-
184
- test("should stop calling update after stop", async () => {
185
- driver.start();
186
- await new Promise(resolve => setTimeout(resolve, 50));
187
- driver.stop();
188
-
189
- const callsAfterStop = updateCalls.length;
190
-
191
- // Wait for potential in-flight RAF
192
- await new Promise(resolve => setTimeout(resolve, 50));
193
-
194
- // Should not have any more calls (RAF properly cancelled)
195
- expect(updateCalls.length).toBe(callsAfterStop);
196
- });
197
-
198
- test("should calculate delta time correctly", async () => {
199
- driver.start();
200
-
201
- await new Promise(resolve => setTimeout(resolve, 100));
202
- driver.stop();
203
-
204
- // Sum of all deltas should approximately equal wall time
205
- const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
206
- expect(totalTime).toBeGreaterThan(0.08); // At least 80ms
207
- expect(totalTime).toBeLessThan(0.15); // Less than 150ms
208
- });
209
-
210
- test("should handle restart", async () => {
211
- driver.start();
212
- await new Promise(resolve => setTimeout(resolve, 50));
213
- driver.stop();
214
-
215
- const firstBatch = updateCalls.length;
216
- updateCalls = [];
217
-
218
- driver.start();
219
- await new Promise(resolve => setTimeout(resolve, 50));
220
- driver.stop();
221
-
222
- expect(updateCalls.length).toBeGreaterThan(0);
223
- });
224
-
225
- test("should cancel RAF on stop", async () => {
226
- driver.start();
227
- await new Promise(resolve => setTimeout(resolve, 50));
228
-
229
- // Stop should cancel the RAF
230
- driver.stop();
231
-
232
- // rafId should be cleared
233
- expect((driver as any).rafId).toBe(null);
234
- });
235
- });
236
-
237
- describe("TimeoutDriver", () => {
238
- let driver: TimeoutDriver;
239
- let updateCalls: number[] = [];
240
-
241
- beforeEach(() => {
242
- updateCalls = [];
243
- driver = new TimeoutDriver((dt) => {
244
- updateCalls.push(dt);
245
- });
246
- });
247
-
248
- afterEach(() => {
249
- driver.stop();
250
- });
251
-
252
- test("should initialize without starting", () => {
253
- expect(updateCalls.length).toBe(0);
254
- });
255
-
256
- test("should call update with delta time", async () => {
257
- driver.start();
258
-
259
- // Wait for a few ticks
260
- await new Promise(resolve => setTimeout(resolve, 50));
261
- driver.stop();
262
-
263
- expect(updateCalls.length).toBeGreaterThan(0);
264
-
265
- // Delta times should be positive and in seconds
266
- for (const dt of updateCalls) {
267
- expect(dt).toBeGreaterThan(0);
268
- expect(dt).toBeLessThan(1); // Should be less than 1 second
269
- }
270
- });
271
-
272
- test("should stop calling update after stop", async () => {
273
- driver.start();
274
- await new Promise(resolve => setTimeout(resolve, 20));
275
- driver.stop();
276
-
277
- const callsAfterStop = updateCalls.length;
278
-
279
- // Wait a bit more
280
- await new Promise(resolve => setTimeout(resolve, 20));
281
-
282
- // Should not have significantly more calls (allow 1-2 in-flight)
283
- expect(updateCalls.length - callsAfterStop).toBeLessThanOrEqual(2);
284
- });
285
-
286
- test("should calculate delta time correctly", async () => {
287
- driver.start();
288
-
289
- await new Promise(resolve => setTimeout(resolve, 50));
290
- driver.stop();
291
-
292
- // Sum of all deltas should approximately equal wall time
293
- const totalTime = updateCalls.reduce((sum, dt) => sum + dt, 0);
294
- expect(totalTime).toBeGreaterThan(0.04); // At least 40ms
295
- expect(totalTime).toBeLessThan(0.1); // Less than 100ms
296
- });
297
-
298
- test("should handle restart", async () => {
299
- driver.start();
300
- await new Promise(resolve => setTimeout(resolve, 20));
301
- driver.stop();
302
-
303
- const firstBatch = updateCalls.length;
304
- updateCalls = [];
305
-
306
- driver.start();
307
- await new Promise(resolve => setTimeout(resolve, 20));
308
- driver.stop();
309
-
310
- expect(updateCalls.length).toBeGreaterThan(0);
311
- });
312
-
313
- test("should run slower than ImmediateDriver due to 1ms delay", async () => {
314
- let timeoutTicks = 0;
315
- let immediateTicks = 0;
316
-
317
- const timeoutDriver = new TimeoutDriver(() => { timeoutTicks++; });
318
- const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
319
-
320
- timeoutDriver.start();
321
- immediateDriver.start();
322
-
323
- await new Promise(resolve => setTimeout(resolve, 100));
324
-
325
- timeoutDriver.stop();
326
- immediateDriver.stop();
327
-
328
- // ImmediateDriver should tick significantly more than TimeoutDriver
329
- expect(immediateTicks).toBeGreaterThan(timeoutTicks);
330
- });
331
- });
332
-
333
- describe("Driver comparison", () => {
334
- test("ImmediateDriver should run faster than RAF", async () => {
335
- let immediateTicks = 0;
336
- let rafTicks = 0;
337
-
338
- const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
339
- const rafDriver = new RafDriver(() => { rafTicks++; });
340
-
341
- immediateDriver.start();
342
- rafDriver.start();
343
-
344
- await new Promise(resolve => setTimeout(resolve, 100));
345
-
346
- immediateDriver.stop();
347
- rafDriver.stop();
348
-
349
- // setImmediate should tick way more than RAF (~60fps)
350
- expect(immediateTicks).toBeGreaterThan(rafTicks * 2);
351
- });
352
-
353
- test("TimeoutDriver should run faster than RAF but slower than Immediate", async () => {
354
- let timeoutTicks = 0;
355
- let rafTicks = 0;
356
- let immediateTicks = 0;
357
-
358
- const timeoutDriver = new TimeoutDriver(() => { timeoutTicks++; });
359
- const rafDriver = new RafDriver(() => { rafTicks++; });
360
- const immediateDriver = new ImmediateDriver(() => { immediateTicks++; });
361
-
362
- timeoutDriver.start();
363
- rafDriver.start();
364
- immediateDriver.start();
365
-
366
- await new Promise(resolve => setTimeout(resolve, 100));
367
-
368
- timeoutDriver.stop();
369
- rafDriver.stop();
370
- immediateDriver.stop();
371
-
372
- // TimeoutDriver should be between RAF and Immediate
373
- expect(timeoutTicks).toBeGreaterThan(rafTicks);
374
- expect(immediateTicks).toBeGreaterThan(timeoutTicks);
375
- });
376
- });
377
-
378
- describe("Edge cases", () => {
379
- test("should handle multiple stops gracefully", () => {
380
- const driver = new ImmediateDriver(() => {});
381
- driver.start();
382
- driver.stop();
383
- driver.stop(); // Should not throw
384
- driver.stop(); // Should not throw
385
- });
386
-
387
- test("should handle stop before start", () => {
388
- const driver = new RafDriver(() => {});
389
- driver.stop(); // Should not throw
390
- });
391
-
392
- test("should reset timing on restart to prevent large delta", async () => {
393
- let firstDelta = 0;
394
- const driver = new ImmediateDriver((dt) => {
395
- if (firstDelta === 0) firstDelta = dt;
396
- });
397
-
398
- driver.start();
399
- await new Promise(resolve => setTimeout(resolve, 10));
400
- driver.stop();
401
-
402
- // Wait a bit
403
- await new Promise(resolve => setTimeout(resolve, 100));
404
-
405
- firstDelta = 0;
406
- driver.start();
407
- await new Promise(resolve => setTimeout(resolve, 10));
408
- driver.stop();
409
-
410
- // First delta after restart should be small, not 100ms+
411
- expect(firstDelta).toBeLessThan(0.05);
412
- });
413
- });
414
- });
@@ -1,71 +0,0 @@
1
- import { ImmediateDriver, RafDriver, TimeoutDriver } from "./drivers";
2
-
3
- // Re-export driver classes for testing and direct usage
4
- export { ImmediateDriver, RafDriver, TimeoutDriver };
5
-
6
- /**
7
- * Interface for game loop drivers that handle frame updates.
8
- * Drivers are responsible for scheduling and executing the game loop
9
- * at the appropriate rate for their environment (client or server).
10
- */
11
- export interface LoopDriver {
12
- /** Starts the game loop */
13
- start(): void;
14
- /** Stops the game loop */
15
- stop(): void;
16
- /** Internal loop iteration method */
17
- loop(): void;
18
- /** Update callback invoked each frame with delta time in seconds */
19
- update(dt: number): void;
20
- }
21
-
22
- /**
23
- * Type of driver to use for the game loop.
24
- * - `'client'`: Uses requestAnimationFrame for browser environments (syncs with display refresh rate)
25
- * - `'server-immediate'`: Uses setImmediate for Node.js environments (runs as fast as possible, maximum performance)
26
- * - `'server-timeout'`: Uses setTimeout with 1ms delay for Node.js environments (balanced performance with better I/O responsiveness)
27
- */
28
- export type DriverType = 'server-immediate' | 'client' | 'server-timeout';
29
-
30
- /**
31
- * Factory function to create a loop driver for the specified environment.
32
- *
33
- * @param type - The environment type
34
- * - `'client'`: Browser RAF driver (60 FPS, syncs with display)
35
- * - `'server'`: Node.js setImmediate driver (maximum performance)
36
- * - `'server-timeout'`: Node.js setTimeout driver (balanced with I/O)
37
- * @param update - Callback function invoked each frame with delta time in seconds
38
- * @returns A configured LoopDriver instance ready to start
39
- *
40
- * @example
41
- * ```typescript
42
- * // Client
43
- * const clientDriver = createDriver('client', (dt) => {
44
- * game.update(dt);
45
- * renderer.render();
46
- * });
47
- * clientDriver.start();
48
- *
49
- * // Server (maximum performance)
50
- * const serverDriver = createDriver('server', (dt) => {
51
- * simulation.tick(dt);
52
- * });
53
- * serverDriver.start();
54
- *
55
- * // Server (balanced with I/O)
56
- * const balancedDriver = createDriver('server-timeout', (dt) => {
57
- * simulation.tick(dt);
58
- * handleNetworkIO();
59
- * });
60
- * balancedDriver.start();
61
- * ```
62
- */
63
- export function createDriver(type: DriverType, update: (dt: number) => void) {
64
- if (type === 'server-immediate') {
65
- return new ImmediateDriver(update);
66
- } else if (type === 'server-timeout') {
67
- return new TimeoutDriver(update);
68
- } else {
69
- return new RafDriver(update);
70
- }
71
- }