murow 0.0.70 → 0.0.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +52 -37
  2. package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
  3. package/dist/cjs/core/binary-codec/index.js +1 -0
  4. package/dist/cjs/core/driver/driver.js +1 -0
  5. package/dist/cjs/core/driver/drivers/immediate.js +1 -0
  6. package/dist/cjs/core/driver/drivers/index.js +1 -0
  7. package/dist/cjs/core/driver/drivers/raf.js +1 -0
  8. package/dist/cjs/core/driver/drivers/timeout.js +1 -0
  9. package/dist/cjs/core/driver/index.js +1 -0
  10. package/dist/cjs/core/events/event-system.js +1 -0
  11. package/dist/cjs/core/events/index.js +1 -0
  12. package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
  13. package/dist/cjs/core/fixed-ticker/index.js +1 -0
  14. package/dist/cjs/core/free-list/free-list.js +1 -0
  15. package/dist/cjs/core/free-list/index.js +1 -0
  16. package/dist/cjs/core/generate-id/generate-id.js +1 -0
  17. package/dist/cjs/core/generate-id/index.js +1 -0
  18. package/dist/cjs/core/index.js +1 -0
  19. package/dist/cjs/core/input/index.js +1 -0
  20. package/dist/cjs/core/input/manager.js +1 -0
  21. package/dist/cjs/core/input/sources/browser.js +1 -0
  22. package/dist/cjs/core/input/sources/index.js +1 -0
  23. package/dist/cjs/core/input/types.js +1 -0
  24. package/dist/cjs/core/lerp/index.js +1 -0
  25. package/dist/cjs/core/lerp/lerp.js +1 -0
  26. package/dist/cjs/core/navmesh/index.js +1 -0
  27. package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
  28. package/dist/cjs/core/navmesh/navmesh.js +1 -0
  29. package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
  30. package/dist/cjs/core/pooled-codec/index.js +1 -0
  31. package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
  32. package/dist/cjs/core/prediction/index.js +1 -0
  33. package/dist/cjs/core/prediction/prediction.js +1 -0
  34. package/dist/cjs/core/ray/index.js +1 -0
  35. package/dist/cjs/core/ray/ray-2d.js +1 -0
  36. package/dist/cjs/core/ray/ray-3d.js +1 -0
  37. package/dist/cjs/core/simple-rng/index.js +1 -0
  38. package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
  39. package/dist/cjs/core/sparse-batcher/index.js +1 -0
  40. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
  41. package/dist/cjs/ecs/component-store.js +1 -0
  42. package/dist/cjs/ecs/component.js +1 -0
  43. package/dist/cjs/ecs/entity-handle.js +1 -0
  44. package/dist/cjs/ecs/index.js +1 -0
  45. package/dist/cjs/ecs/system-builder.js +1 -0
  46. package/dist/cjs/ecs/world-systems.js +1 -0
  47. package/dist/cjs/ecs/world.js +1 -0
  48. package/dist/cjs/game/index.js +1 -0
  49. package/dist/cjs/game/loop/index.js +1 -0
  50. package/dist/cjs/game/loop/loop.js +1 -0
  51. package/dist/cjs/index.js +1 -0
  52. package/dist/cjs/net/adapters/browser-websocket.js +1 -0
  53. package/dist/cjs/net/adapters/bun-websocket.js +1 -0
  54. package/dist/cjs/net/buffer-pool.js +1 -0
  55. package/dist/cjs/net/client.js +1 -0
  56. package/dist/cjs/net/index.js +1 -0
  57. package/dist/cjs/net/server.js +1 -0
  58. package/dist/cjs/net/types.js +1 -0
  59. package/dist/cjs/net/validators.js +1 -0
  60. package/dist/cjs/protocol/index.js +1 -0
  61. package/dist/cjs/protocol/intent/define-intent.js +1 -0
  62. package/dist/cjs/protocol/intent/index.js +1 -0
  63. package/dist/cjs/protocol/intent/intent-registry.js +1 -0
  64. package/dist/cjs/protocol/intent/intent.js +1 -0
  65. package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
  66. package/dist/cjs/protocol/rpc/index.js +1 -0
  67. package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
  68. package/dist/cjs/protocol/rpc/rpc.js +1 -0
  69. package/dist/cjs/protocol/snapshot/index.js +1 -0
  70. package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
  71. package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
  72. package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
  73. package/dist/cjs/renderer/base-2d-renderer.js +1 -0
  74. package/dist/cjs/renderer/base-3d-renderer.js +1 -0
  75. package/dist/cjs/renderer/base-renderer.js +1 -0
  76. package/dist/cjs/renderer/index.js +1 -0
  77. package/dist/cjs/renderer/types.js +1 -0
  78. package/dist/esm/core/binary-codec/binary-codec.js +1 -0
  79. package/dist/esm/core/binary-codec/index.js +1 -0
  80. package/dist/esm/core/driver/driver.js +1 -0
  81. package/dist/esm/core/driver/drivers/immediate.js +1 -0
  82. package/dist/esm/core/driver/drivers/index.js +1 -0
  83. package/dist/esm/core/driver/drivers/raf.js +1 -0
  84. package/dist/esm/core/driver/drivers/timeout.js +1 -0
  85. package/dist/esm/core/driver/index.js +1 -0
  86. package/dist/esm/core/events/event-system.js +1 -0
  87. package/dist/esm/core/events/index.js +1 -0
  88. package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
  89. package/dist/esm/core/fixed-ticker/index.js +1 -0
  90. package/dist/esm/core/free-list/free-list.js +1 -0
  91. package/dist/esm/core/free-list/index.js +1 -0
  92. package/dist/esm/core/generate-id/generate-id.js +1 -0
  93. package/dist/esm/core/generate-id/index.js +1 -0
  94. package/dist/esm/core/index.js +1 -0
  95. package/dist/esm/core/input/index.js +1 -0
  96. package/dist/esm/core/input/manager.js +1 -0
  97. package/dist/esm/core/input/sources/browser.js +1 -0
  98. package/dist/esm/core/input/sources/index.js +1 -0
  99. package/dist/esm/core/input/types.js +0 -0
  100. package/dist/esm/core/lerp/index.js +1 -0
  101. package/dist/esm/core/lerp/lerp.js +1 -0
  102. package/dist/esm/core/navmesh/index.js +1 -0
  103. package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
  104. package/dist/esm/core/navmesh/navmesh.js +1 -0
  105. package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
  106. package/dist/esm/core/pooled-codec/index.js +1 -0
  107. package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
  108. package/dist/esm/core/prediction/index.js +1 -0
  109. package/dist/esm/core/prediction/prediction.js +1 -0
  110. package/dist/esm/core/ray/index.js +1 -0
  111. package/dist/esm/core/ray/ray-2d.js +1 -0
  112. package/dist/esm/core/ray/ray-3d.js +1 -0
  113. package/dist/esm/core/simple-rng/index.js +1 -0
  114. package/dist/esm/core/simple-rng/simple-rng.js +1 -0
  115. package/dist/esm/core/sparse-batcher/index.js +1 -0
  116. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
  117. package/dist/esm/ecs/component-store.js +1 -0
  118. package/dist/esm/ecs/component.js +1 -0
  119. package/dist/esm/ecs/entity-handle.js +1 -0
  120. package/dist/esm/ecs/index.js +1 -0
  121. package/dist/esm/ecs/system-builder.js +1 -0
  122. package/dist/esm/ecs/world-systems.js +1 -0
  123. package/dist/esm/ecs/world.js +1 -0
  124. package/dist/esm/game/index.js +1 -0
  125. package/dist/esm/game/loop/index.js +1 -0
  126. package/dist/esm/game/loop/loop.js +1 -0
  127. package/dist/esm/index.js +1 -0
  128. package/dist/esm/net/adapters/browser-websocket.js +1 -0
  129. package/dist/esm/net/adapters/bun-websocket.js +1 -0
  130. package/dist/esm/net/buffer-pool.js +1 -0
  131. package/dist/esm/net/client.js +1 -0
  132. package/dist/esm/net/index.js +1 -0
  133. package/dist/esm/net/server.js +1 -0
  134. package/dist/esm/net/types.js +1 -0
  135. package/dist/esm/net/validators.js +1 -0
  136. package/dist/esm/protocol/index.js +1 -0
  137. package/dist/esm/protocol/intent/define-intent.js +1 -0
  138. package/dist/esm/protocol/intent/index.js +1 -0
  139. package/dist/esm/protocol/intent/intent-registry.js +1 -0
  140. package/dist/esm/protocol/intent/intent.js +0 -0
  141. package/dist/esm/protocol/rpc/define-rpc.js +1 -0
  142. package/dist/esm/protocol/rpc/index.js +1 -0
  143. package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
  144. package/dist/esm/protocol/rpc/rpc.js +0 -0
  145. package/dist/esm/protocol/snapshot/index.js +1 -0
  146. package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
  147. package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
  148. package/dist/esm/protocol/snapshot/snapshot.js +1 -0
  149. package/dist/esm/renderer/base-2d-renderer.js +1 -0
  150. package/dist/esm/renderer/base-3d-renderer.js +1 -0
  151. package/dist/esm/renderer/base-renderer.js +1 -0
  152. package/dist/esm/renderer/index.js +1 -0
  153. package/dist/esm/renderer/types.js +0 -0
  154. package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
  155. package/dist/{core → types/core}/events/event-system.d.ts +14 -33
  156. package/dist/types/core/free-list/free-list.d.ts +31 -0
  157. package/dist/types/core/free-list/index.d.ts +1 -0
  158. package/dist/{core → types/core}/index.d.ts +5 -0
  159. package/dist/{core → types/core}/input/index.d.ts +1 -0
  160. package/dist/{core → types/core}/input/manager.d.ts +2 -0
  161. package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
  162. package/dist/types/core/ray/index.d.ts +2 -0
  163. package/dist/types/core/ray/ray-2d.d.ts +37 -0
  164. package/dist/types/core/ray/ray-3d.d.ts +42 -0
  165. package/dist/types/core/simple-rng/index.d.ts +1 -0
  166. package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
  167. package/dist/types/core/sparse-batcher/index.d.ts +1 -0
  168. package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
  169. package/dist/{ecs → types/ecs}/world.d.ts +11 -0
  170. package/dist/{game → types/game}/loop/loop.d.ts +33 -29
  171. package/dist/{index.d.ts → types/index.d.ts} +1 -0
  172. package/dist/{net → types/net}/index.d.ts +2 -2
  173. package/dist/types/renderer/base-2d-renderer.d.ts +13 -0
  174. package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
  175. package/dist/types/renderer/base-renderer.d.ts +21 -0
  176. package/dist/types/renderer/index.d.ts +4 -0
  177. package/dist/types/renderer/types.d.ts +79 -0
  178. package/dist/webgpu/cjs/index.js +6004 -0
  179. package/dist/webgpu/esm/index.js +5972 -0
  180. package/dist/webgpu/types/2d/animation.d.ts +97 -0
  181. package/dist/webgpu/types/2d/renderer.d.ts +55 -0
  182. package/dist/webgpu/types/2d/shader.d.ts +61 -0
  183. package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
  184. package/dist/webgpu/types/3d/gltf-skin-parser.d.ts +101 -0
  185. package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
  186. package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
  187. package/dist/webgpu/types/3d/renderer.d.ts +216 -0
  188. package/dist/webgpu/types/3d/shader.d.ts +136 -0
  189. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
  190. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +8 -0
  191. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
  192. package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -0
  193. package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
  194. package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
  195. package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
  196. package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
  197. package/dist/webgpu/types/camera/index.d.ts +2 -0
  198. package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
  199. package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
  200. package/dist/webgpu/types/core/constants.d.ts +59 -0
  201. package/dist/webgpu/types/core/constants.test.d.ts +1 -0
  202. package/dist/webgpu/types/core/index.d.ts +2 -0
  203. package/dist/webgpu/types/core/math.d.ts +37 -0
  204. package/dist/webgpu/types/core/types.d.ts +125 -0
  205. package/dist/webgpu/types/core/types.test.d.ts +1 -0
  206. package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
  207. package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
  208. package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
  209. package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
  210. package/dist/webgpu/types/geometry/index.d.ts +2 -0
  211. package/dist/webgpu/types/index.d.ts +32 -0
  212. package/dist/webgpu/types/particle/emitter.d.ts +36 -0
  213. package/dist/webgpu/types/shaders/index.d.ts +2 -0
  214. package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
  215. package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
  216. package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
  217. package/dist/webgpu/types/shaders/utils.d.ts +28 -0
  218. package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
  219. package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
  220. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +57 -0
  221. package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
  222. package/package.json +96 -26
  223. package/dist/core/binary-codec/binary-codec.js +0 -354
  224. package/dist/core/binary-codec/index.js +0 -1
  225. package/dist/core/driver/driver.js +0 -47
  226. package/dist/core/driver/drivers/immediate.js +0 -61
  227. package/dist/core/driver/drivers/index.js +0 -3
  228. package/dist/core/driver/drivers/raf.js +0 -62
  229. package/dist/core/driver/drivers/timeout.js +0 -71
  230. package/dist/core/driver/index.js +0 -2
  231. package/dist/core/events/event-system.js +0 -88
  232. package/dist/core/events/index.js +0 -1
  233. package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
  234. package/dist/core/fixed-ticker/index.js +0 -1
  235. package/dist/core/generate-id/generate-id.js +0 -25
  236. package/dist/core/generate-id/index.js +0 -1
  237. package/dist/core/index.js +0 -10
  238. package/dist/core/input/index.js +0 -2
  239. package/dist/core/input/manager.js +0 -211
  240. package/dist/core/input/sources/browser.js +0 -29
  241. package/dist/core/input/sources/index.js +0 -1
  242. package/dist/core/lerp/index.js +0 -1
  243. package/dist/core/lerp/lerp.js +0 -42
  244. package/dist/core/navmesh/index.js +0 -1
  245. package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
  246. package/dist/core/navmesh/navmesh.js +0 -799
  247. package/dist/core/navmesh/navmesh.worker.js +0 -79
  248. package/dist/core/pooled-codec/index.js +0 -1
  249. package/dist/core/pooled-codec/pooled-codec.js +0 -410
  250. package/dist/core/prediction/index.js +0 -1
  251. package/dist/core/prediction/prediction.js +0 -99
  252. package/dist/core.esm.js +0 -1
  253. package/dist/core.js +0 -1
  254. package/dist/ecs/component-store.js +0 -175
  255. package/dist/ecs/component.js +0 -43
  256. package/dist/ecs/entity-handle.js +0 -515
  257. package/dist/ecs/example.js +0 -125
  258. package/dist/ecs/index.js +0 -4
  259. package/dist/ecs/system-builder.js +0 -249
  260. package/dist/ecs/world-systems.js +0 -79
  261. package/dist/ecs/world.js +0 -767
  262. package/dist/game/index.js +0 -1
  263. package/dist/game/loop/index.js +0 -1
  264. package/dist/game/loop/loop.js +0 -108
  265. package/dist/index.js +0 -26
  266. package/dist/net/adapters/browser-websocket.js +0 -74
  267. package/dist/net/adapters/bun-websocket.js +0 -245
  268. package/dist/net/buffer-pool.js +0 -89
  269. package/dist/net/client.js +0 -586
  270. package/dist/net/index.js +0 -58
  271. package/dist/net/server.js +0 -974
  272. package/dist/net/types.js +0 -31
  273. package/dist/net/validators.js +0 -88
  274. package/dist/protocol/index.js +0 -92
  275. package/dist/protocol/intent/define-intent.js +0 -125
  276. package/dist/protocol/intent/index.js +0 -91
  277. package/dist/protocol/intent/intent-registry.js +0 -91
  278. package/dist/protocol/rpc/define-rpc.js +0 -84
  279. package/dist/protocol/rpc/index.js +0 -3
  280. package/dist/protocol/rpc/rpc-registry.js +0 -159
  281. package/dist/protocol/rpc/rpc.js +0 -12
  282. package/dist/protocol/snapshot/index.js +0 -43
  283. package/dist/protocol/snapshot/snapshot-codec.js +0 -67
  284. package/dist/protocol/snapshot/snapshot-registry.js +0 -168
  285. package/dist/protocol/snapshot/snapshot.js +0 -30
  286. package/src/core/binary-codec/README.md +0 -60
  287. package/src/core/binary-codec/binary-codec.test.ts +0 -300
  288. package/src/core/binary-codec/binary-codec.ts +0 -448
  289. package/src/core/binary-codec/index.ts +0 -1
  290. package/src/core/driver/README.md +0 -97
  291. package/src/core/driver/driver.test.ts +0 -414
  292. package/src/core/driver/driver.ts +0 -71
  293. package/src/core/driver/drivers/immediate.ts +0 -66
  294. package/src/core/driver/drivers/index.ts +0 -3
  295. package/src/core/driver/drivers/raf.ts +0 -67
  296. package/src/core/driver/drivers/timeout.ts +0 -77
  297. package/src/core/driver/index.ts +0 -2
  298. package/src/core/events/README.md +0 -47
  299. package/src/core/events/event-system.test.ts +0 -243
  300. package/src/core/events/event-system.ts +0 -140
  301. package/src/core/events/index.ts +0 -1
  302. package/src/core/fixed-ticker/README.md +0 -77
  303. package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
  304. package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
  305. package/src/core/fixed-ticker/index.ts +0 -1
  306. package/src/core/generate-id/README.md +0 -18
  307. package/src/core/generate-id/generate-id.test.ts +0 -79
  308. package/src/core/generate-id/generate-id.ts +0 -37
  309. package/src/core/generate-id/index.ts +0 -1
  310. package/src/core/index.ts +0 -10
  311. package/src/core/input/README.md +0 -24
  312. package/src/core/input/index.ts +0 -2
  313. package/src/core/input/manager.ts +0 -259
  314. package/src/core/input/sources/browser.ts +0 -39
  315. package/src/core/input/sources/index.ts +0 -1
  316. package/src/core/input/types.ts +0 -40
  317. package/src/core/lerp/README.md +0 -79
  318. package/src/core/lerp/index.ts +0 -1
  319. package/src/core/lerp/lerp.test.ts +0 -90
  320. package/src/core/lerp/lerp.ts +0 -42
  321. package/src/core/navmesh/README.md +0 -164
  322. package/src/core/navmesh/index.ts +0 -1
  323. package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
  324. package/src/core/navmesh/navmesh-workers.test.ts +0 -356
  325. package/src/core/navmesh/navmesh.test.ts +0 -344
  326. package/src/core/navmesh/navmesh.ts +0 -1047
  327. package/src/core/navmesh/navmesh.worker.ts +0 -147
  328. package/src/core/pooled-codec/README.md +0 -70
  329. package/src/core/pooled-codec/index.ts +0 -1
  330. package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
  331. package/src/core/pooled-codec/pooled-codec.ts +0 -504
  332. package/src/core/prediction/README.md +0 -64
  333. package/src/core/prediction/index.ts +0 -1
  334. package/src/core/prediction/prediction.test.ts +0 -423
  335. package/src/core/prediction/prediction.ts +0 -112
  336. package/src/ecs/README.md +0 -427
  337. package/src/ecs/benchmark.test.ts +0 -1645
  338. package/src/ecs/component-store.ts +0 -198
  339. package/src/ecs/component.ts +0 -90
  340. package/src/ecs/entity-handle.test.ts +0 -393
  341. package/src/ecs/entity-handle.ts +0 -563
  342. package/src/ecs/example.ts +0 -152
  343. package/src/ecs/index.ts +0 -4
  344. package/src/ecs/system-builder.ts +0 -404
  345. package/src/ecs/world-systems.ts +0 -83
  346. package/src/ecs/world.test.ts +0 -310
  347. package/src/ecs/world.ts +0 -904
  348. package/src/game/index.ts +0 -1
  349. package/src/game/loop/README.md +0 -32
  350. package/src/game/loop/index.ts +0 -1
  351. package/src/game/loop/loop.ts +0 -236
  352. package/src/index.ts +0 -32
  353. package/src/net/README.md +0 -474
  354. package/src/net/adapters/browser-websocket.ts +0 -86
  355. package/src/net/adapters/bun-websocket.ts +0 -292
  356. package/src/net/buffer-pool.ts +0 -106
  357. package/src/net/client.test.ts +0 -807
  358. package/src/net/client.ts +0 -695
  359. package/src/net/index.ts +0 -60
  360. package/src/net/server.test.ts +0 -799
  361. package/src/net/server.ts +0 -1152
  362. package/src/net/types.ts +0 -228
  363. package/src/net/validators.ts +0 -104
  364. package/src/protocol/README.md +0 -469
  365. package/src/protocol/index.ts +0 -93
  366. package/src/protocol/intent/define-intent.test.ts +0 -397
  367. package/src/protocol/intent/define-intent.ts +0 -201
  368. package/src/protocol/intent/index.ts +0 -94
  369. package/src/protocol/intent/intent-registry.test.ts +0 -198
  370. package/src/protocol/intent/intent-registry.ts +0 -112
  371. package/src/protocol/intent/intent.ts +0 -12
  372. package/src/protocol/rpc/define-rpc.test.ts +0 -141
  373. package/src/protocol/rpc/define-rpc.ts +0 -113
  374. package/src/protocol/rpc/index.ts +0 -3
  375. package/src/protocol/rpc/rpc-registry.test.ts +0 -168
  376. package/src/protocol/rpc/rpc-registry.ts +0 -176
  377. package/src/protocol/rpc/rpc.ts +0 -37
  378. package/src/protocol/snapshot/index.ts +0 -45
  379. package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
  380. package/src/protocol/snapshot/snapshot-codec.ts +0 -87
  381. package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
  382. package/src/protocol/snapshot/snapshot-registry.ts +0 -201
  383. package/src/protocol/snapshot/snapshot.test.ts +0 -76
  384. package/src/protocol/snapshot/snapshot.ts +0 -41
  385. /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
  386. /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
  387. /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
  388. /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
  389. /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
  390. /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
  391. /package/dist/{core → types/core}/driver/index.d.ts +0 -0
  392. /package/dist/{core → types/core}/events/index.d.ts +0 -0
  393. /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
  394. /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
  395. /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
  396. /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
  397. /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
  398. /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
  399. /package/dist/{core → types/core}/input/types.d.ts +0 -0
  400. /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
  401. /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
  402. /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
  403. /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
  404. /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
  405. /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
  406. /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
  407. /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
  408. /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
  409. /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
  410. /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
  411. /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
  412. /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
  413. /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
  414. /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
  415. /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
  416. /package/dist/{game → types/game}/index.d.ts +0 -0
  417. /package/dist/{game → types/game}/loop/index.d.ts +0 -0
  418. /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
  419. /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
  420. /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
  421. /package/dist/{net → types/net}/client.d.ts +0 -0
  422. /package/dist/{net → types/net}/server.d.ts +0 -0
  423. /package/dist/{net → types/net}/types.d.ts +0 -0
  424. /package/dist/{net → types/net}/validators.d.ts +0 -0
  425. /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
  426. /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
  427. /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
  428. /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
  429. /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
  430. /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
  431. /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
  432. /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
  433. /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
  434. /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
  435. /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
  436. /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
  437. /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
  438. /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
  439. /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
package/README.md CHANGED
@@ -11,57 +11,72 @@ npm install murow
11
11
  ## Usage
12
12
 
13
13
  ```typescript
14
- import {
15
- FixedTicker,
16
- EventSystem,
17
- BinaryCodec,
18
- generateId,
19
- lerp,
20
- NavMesh,
21
- PooledCodec,
22
- IntentTracker,
23
- Reconciliator
24
- } from 'murow';
14
+ import { FixedTicker, EventSystem, BinaryCodec, generateId, lerp } from 'murow';
25
15
  // or
26
16
  import { FixedTicker } from 'murow/core';
17
+ import { WebGPU2DRenderer } from 'murow/webgpu';
27
18
  ```
28
19
 
29
20
  ## Modules
30
21
 
31
- ### Core Utilities
32
- - `FixedTicker`: Deterministic fixed-rate update loop
33
- - `EventSystem`: High-performance event handling
34
- - `BinaryCodec`: Schema-driven binary serialization
35
- - `generateId`: Cryptographically secure ID generation
36
- - `lerp`: Linear interpolation utility
37
- - `NavMesh`: Pathfinding with dynamic obstacles
38
- - `PooledCodec`: Object-pooled binary codec with array support (via `PooledCodec.array()`) for efficient snapshot encoding. Supports zero-copy encoding with `encodeInto()` for minimal allocations
39
- - `IntentTracker` & `Reconciliator`: Client-side prediction
40
-
41
- ### Protocol Layer
22
+ ### [Core](./src/core) — Low-level utilities and systems
23
+ - [`BinaryCodec`](./src/core/binary-codec) Schema-driven binary serialization
24
+ - [`PooledCodec`](./src/core/pooled-codec) — Object-pooled binary codec with array support
25
+ - [`EventSystem`](./src/core/events) — High-performance event handling
26
+ - [`FixedTicker`](./src/core/fixed-ticker) Deterministic fixed-rate update loop
27
+ - [`Driver`](./src/core/driver) Event-driven update orchestration
28
+ - [`generateId`](./src/core/generate-id) Cryptographically secure ID generation
29
+ - [`lerp`](./src/core/lerp) Linear interpolation utility
30
+ - [`NavMesh`](./src/core/navmesh) Pathfinding with dynamic obstacles
31
+ - [`IntentTracker` & `Reconciliator`](./src/core/prediction) — Client-side prediction
32
+ - [`InputTracker`](./src/core/input) — Cross-platform input state tracking
33
+ - [`FreeList`](./src/core/free-list) — Slot allocator for reusable handles
34
+ - [`SparseBatcher`](./src/core/sparse-batcher) — Layer/sheet bucketing for batched rendering
35
+ - [`SimpleRNG`](./src/core/simple-rng) — Seedable deterministic random number generator
36
+ - [`Ray2D` / `Ray3D`](./src/core/ray) — Zero-allocation ray intersection tests (segment, circle/sphere, AABB, plane, triangle)
37
+
38
+ ### [ECS](./src/ecs) — Entity Component System
39
+ High-performance ECS with **SoA (Structure of Arrays)** storage, bitmask queries, and zero-allocation hot paths:
40
+ - `World` — Manages entities and components
41
+ - `defineComponent` — Define typed components with binary schemas
42
+ - `EntityHandle` — Fluent chainable entity API
43
+
44
+ ### [Game](./src/game) — Game loop abstractions
45
+ - [`GameLoop`](./src/game/loop) — Client/server tick loop with rendering, input tracking, and interpolation
46
+
47
+ ### [Protocol](./src/protocol) — Networking primitives
42
48
  Minimalist networking primitives:
43
- - `IntentRegistry`: Type-safe intent codec registry
44
- - `SnapshotCodec`: Binary encoding for state deltas
45
- - `Snapshot<T>`: Delta-based state updates
46
- - `applySnapshot()`: Deep merge snapshots into state
49
+ - [`IntentRegistry`](./src/protocol/intent) Type-safe intent codec registry
50
+ - [`SnapshotCodec` & `SnapshotRegistry`](./src/protocol/snapshot) — Binary encoding for state deltas
51
+ - [`Snapshot<T>`](./src/protocol/snapshot) Delta-based state updates
52
+ - [`applySnapshot()`](./src/protocol/snapshot) Deep merge snapshots into state
53
+ - [`RpcRegistry` & `defineRpc()`](./src/protocol/rpc) — Type-safe RPC definitions
47
54
 
48
- Works harmoniously with core utilities (`FixedTicker`, `IntentTracker`, `Reconciliator`).
49
-
50
- See [Protocol Layer Documentation](./src/protocol/README.md) for usage.
51
-
52
- ### Network Layer
55
+ ### [Network](./src/net) Transport-agnostic networking
53
56
  Transport-agnostic client/server abstractions:
54
- - `ServerNetwork`: Multiplayer game server with per-peer snapshot registries
55
- - `ClientNetwork`: Game client with intent/snapshot handling
56
- - `TransportAdapter`: Pluggable transport interface
57
- - `BunWebSocketTransport`: Bun WebSocket implementation (reference)
57
+ - `ServerNetwork` Multiplayer game server with per-peer snapshot registries
58
+ - `ClientNetwork` Game client with intent/snapshot handling
59
+ - `TransportAdapter` Pluggable transport interface
60
+ - `BunWebSocketTransport` Bun WebSocket implementation (reference)
58
61
 
59
62
  Key features:
60
63
  - **Per-peer snapshot registries** for fog of war and interest management
61
- - **Transport agnostic** - works with WebSocket, WebRTC, UDP, etc.
64
+ - **Transport agnostic** works with WebSocket, WebRTC, UDP, etc.
62
65
  - **Type-safe** protocol integration with `IntentRegistry` and `SnapshotRegistry`
63
66
 
64
- See [Network Layer Documentation](./src/net/README.md) for usage and [examples/multiplayer-game.ts](./examples/multiplayer-game.ts) for a complete example.
67
+ ### [Renderer](./src/renderer) Abstract renderer interfaces
68
+ - `BaseRenderer` — Core renderer lifecycle
69
+ - `Base2DRenderer` — 2D rendering primitives
70
+ - `Base3DRenderer` — 3D rendering primitives
71
+
72
+ ### [WebGPU](./src/../webgpu) — WebGPU rendering backend
73
+ The WebGPU renderer is bundled with murow and accessible via `murow/webgpu`:
74
+
75
+ ```typescript
76
+ import { WebGPU2DRenderer, WebGPU3DRenderer } from 'murow/webgpu';
77
+ ```
78
+
79
+ See [WebGPU README](../webgpu/README.md) for full documentation.
65
80
 
66
81
  ## Building
67
82
 
@@ -0,0 +1 @@
1
+ var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var U=(s,e)=>{for(var t in e)f(s,t,{get:e[t],enumerable:!0})},T=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of x(e))!z.call(s,a)&&a!==t&&f(s,a,{get:()=>e[a],enumerable:!(r=m(e,a))||r.enumerable});return s};var N=s=>T(f({},"__esModule",{value:!0}),s);var p={};U(p,{BaseBinaryCodec:()=>g,BinaryCodec:()=>I,BinaryPrimitives:()=>l});module.exports=N(p);const y=Symbol("schemaSize");function b(s){const e=s[y];if(e!==void 0)return e;let t=0;for(const r of Object.keys(s))t+=s[r].size;return s[y]=t,t}class g{static encodeInto(e,t){const r=b(e),a=new ArrayBuffer(r),o=new DataView(a);let n=0;for(const i of Object.keys(e)){const c=e[i];c.write(o,n,t[i]),n+=c.size}return new Uint8Array(a)}static decodeInto(e,t,r){const a=b(e);if(t.byteLength<a)throw new RangeError(`Buffer too small: expected ${a} bytes, got ${t.byteLength}`);const o=new DataView(t.buffer,t.byteOffset,t.byteLength);let n=0;for(const i of Object.keys(e)){const c=e[i];r[i]=c.read(o,n),n+=c.size}return r}}class l{static{this.u8={size:1,write:(e,t,r)=>e.setUint8(t,r),read:(e,t)=>e.getUint8(t),toNil:()=>0}}static{this.u16={size:2,write:(e,t,r)=>e.setUint16(t,r,!1),read:(e,t)=>e.getUint16(t,!1),toNil:()=>0}}static{this.u32={size:4,write:(e,t,r)=>e.setUint32(t,r,!1),read:(e,t)=>e.getUint32(t,!1),toNil:()=>0}}static{this.i8={size:1,write:(e,t,r)=>e.setInt8(t,r),read:(e,t)=>e.getInt8(t),toNil:()=>0}}static{this.i16={size:2,write:(e,t,r)=>e.setInt16(t,r,!1),read:(e,t)=>e.getInt16(t,!1),toNil:()=>0}}static{this.i32={size:4,write:(e,t,r)=>e.setInt32(t,r,!1),read:(e,t)=>e.getInt32(t,!1),toNil:()=>0}}static{this.f16={size:2,write:(e,t,r)=>{const a=new Float32Array(1),o=new Uint32Array(a.buffer);a[0]=r;const n=o[0],i=n>>>31&1;let c=n>>>23&255,d=n&8388607,u;if(c===255)u=i<<15|31744|(d?512:0);else if(c===0)u=i<<15;else{const F=c-127+15;if(F>=31)u=i<<15|31744;else if(F<=0)u=i<<15;else{const w=d>>>13;u=i<<15|F<<10|w}}e.setUint16(t,u,!1)},read:(e,t)=>{const r=e.getUint16(t,!1),a=r>>>15&1,o=r>>>10&31,n=r&1023;let i;if(o===0)i=a<<31;else if(o===31)i=a<<31|255<<23|(n?n<<13:0);else{const u=o-15+127;i=a<<31|u<<23|n<<13}const c=new Uint32Array([i]);return new Float32Array(c.buffer)[0]},toNil:()=>0}}static{this.f32={size:4,write:(e,t,r)=>e.setFloat32(t,r,!1),read:(e,t)=>e.getFloat32(t,!1),toNil:()=>0}}static{this.f64={size:8,write:(e,t,r)=>e.setFloat64(t,r,!1),read:(e,t)=>e.getFloat64(t,!1),toNil:()=>0}}static{this.bool={size:1,write:(e,t,r)=>e.setUint8(t,r?1:0),read:(e,t)=>e.getUint8(t)!==0,toNil:()=>!1}}static string(e){return{size:e+2,write(t,r,a){const n=new TextEncoder().encode(a);if(n.length>e)throw new RangeError(`String too long, max ${e} bytes`);t.setUint16(r,n.length,!1);for(let i=0;i<n.length;i++)t.setUint8(r+2+i,n[i]);for(let i=n.length;i<e;i++)t.setUint8(r+2+i,0)},read(t,r){const a=t.getUint16(r,!1),o=new Uint8Array(a);for(let n=0;n<a;n++)o[n]=t.getUint8(r+2+n);return new TextDecoder().decode(o)},toNil:()=>""}}static{this.vec2={size:8,write(e,t,r){e.setFloat32(t,r.x,!1),e.setFloat32(t+4,r.y,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1)}},toNil:()=>({x:0,y:0})}}static{this.vec3={size:12,write(e,t,r){e.setFloat32(t,r.x,!1),e.setFloat32(t+4,r.y,!1),e.setFloat32(t+8,r.z,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1),z:e.getFloat32(t+8,!1)}},toNil:()=>({x:0,y:0,z:0})}}static{this.color={size:4,write(e,t,r){e.setUint8(t,r.r),e.setUint8(t+1,r.g),e.setUint8(t+2,r.b),e.setUint8(t+3,r.a)},read(e,t){return{r:e.getUint8(t),g:e.getUint8(t+1),b:e.getUint8(t+2),a:e.getUint8(t+3)}},toNil:()=>({r:0,g:0,b:0,a:0})}}static{this.f32_le={size:4,write:(e,t,r)=>e.setFloat32(t,r,!0),read:(e,t)=>e.getFloat32(t,!0),toNil:()=>0}}static{this.f64_le={size:8,write:(e,t,r)=>e.setFloat64(t,r,!0),read:(e,t)=>e.getFloat64(t,!0),toNil:()=>0}}static{this.u16_le={size:2,write:(e,t,r)=>e.setUint16(t,r,!0),read:(e,t)=>e.getUint16(t,!0),toNil:()=>0}}static{this.u32_le={size:4,write:(e,t,r)=>e.setUint32(t,r,!0),read:(e,t)=>e.getUint32(t,!0),toNil:()=>0}}static{this.i16_le={size:2,write:(e,t,r)=>e.setInt16(t,r,!0),read:(e,t)=>e.getInt16(t,!0),toNil:()=>0}}static{this.i32_le={size:4,write:(e,t,r)=>e.setInt32(t,r,!0),read:(e,t)=>e.getInt32(t,!0),toNil:()=>0}}static{this.vec2_le={size:8,write:(e,t,r)=>{e.setFloat32(t,r[0],!0),e.setFloat32(t+4,r[1],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0)],toNil:()=>[0,0]}}static{this.vec3_le={size:12,write:(e,t,r)=>{e.setFloat32(t,r[0],!0),e.setFloat32(t+4,r[1],!0),e.setFloat32(t+8,r[2],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0)],toNil:()=>[0,0,0]}}static{this.vec4_le={size:16,write:(e,t,r)=>{e.setFloat32(t,r[0],!0),e.setFloat32(t+4,r[1],!0),e.setFloat32(t+8,r[2],!0),e.setFloat32(t+12,r[3],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0),e.getFloat32(t+12,!0)],toNil:()=>[0,0,0,0]}}}class I extends g{static{this.u8=l.u8}static{this.u16=l.u16}static{this.u32=l.u32}static{this.i8=l.i8}static{this.i16=l.i16}static{this.i32=l.i32}static{this.f16=l.f16}static{this.f32=l.f32}static{this.bool=l.bool}static{this.string=l.string}static{this.vec2=l.vec2}static{this.vec3=l.vec3}static{this.color=l.color}static encode(e,t){return this.encodeInto(e,t)}static decode(e,t,r){return this.decodeInto(e,t,r)}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./binary-codec"),module.exports);
@@ -0,0 +1 @@
1
+ var v=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var s=(i,e)=>{for(var o in e)v(i,o,{get:e[o],enumerable:!0})},u=(i,e,o,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!p.call(i,t)&&t!==o&&v(i,t,{get:()=>e[t],enumerable:!(m=n(e,t))||m.enumerable});return i};var D=i=>u(v({},"__esModule",{value:!0}),i);var f={};s(f,{ImmediateDriver:()=>r.ImmediateDriver,RafDriver:()=>r.RafDriver,TimeoutDriver:()=>r.TimeoutDriver,createDriver:()=>a});module.exports=D(f);var r=require("./drivers");function a(i,e){return i==="server-immediate"?new r.ImmediateDriver(e):i==="server-timeout"?new r.TimeoutDriver(e):new r.RafDriver(e)}
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(r,t)=>{for(var e in t)i(r,e,{get:t[e],enumerable:!0})},m=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of a(t))!p.call(r,o)&&o!==e&&i(r,o,{get:()=>t[o],enumerable:!(n=s(t,o))||n.enumerable});return r};var u=r=>m(i({},"__esModule",{value:!0}),r);var h={};l(h,{ImmediateDriver:()=>c});module.exports=u(h);class c{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),e=(t-this.last)/1e3;this.last=t,this.update(e),setImmediate(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,r,p,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of c(r))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>r[m],enumerable:!(x=b(r,m))||x.enumerable});return f},e=(f,r,p)=>(t(f,r,"default"),p&&t(p,r,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);e(o,require("./immediate"),module.exports);e(o,require("./raf"),module.exports);e(o,require("./timeout"),module.exports);
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(r,t)=>{for(var n in t)e(r,n,{get:t[n],enumerable:!0})},u=(r,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of s(t))!l.call(r,i)&&i!==n&&e(r,i,{get:()=>t[i],enumerable:!(a=o(t,i))||a.enumerable});return r};var m=r=>u(e({},"__esModule",{value:!0}),r);var h={};p(h,{RafDriver:()=>f});module.exports=m(h);class f{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.rafId=null;this.loop=()=>{if(!this.running)return;const t=performance.now(),n=(t-this.last)/1e3;this.last=t,this.update(n),requestAnimationFrame(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.rafId=requestAnimationFrame(this.loop)}stop(){this.running=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}}
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var e=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var u=(o,t)=>{for(var r in t)i(o,r,{get:t[r],enumerable:!0})},l=(o,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of p(t))!a.call(o,n)&&n!==r&&i(o,n,{get:()=>t[n],enumerable:!(s=e(t,n))||s.enumerable});return o};var c=o=>l(i({},"__esModule",{value:!0}),o);var f={};u(f,{TimeoutDriver:()=>h});module.exports=c(f);const m=1;class h{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),r=(t-this.last)/1e3;this.last=t,this.update(r),setTimeout(this.loop,m)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(r,o,p,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let m of c(o))!d.call(r,m)&&m!==p&&a(r,m,{get:()=>o[m],enumerable:!(x=b(o,m))||x.enumerable});return r},f=(r,o,p)=>(t(r,o,"default"),p&&t(p,o,"default"));var g=r=>t(a({},"__esModule",{value:!0}),r);var e={};module.exports=g(e);f(e,require("./driver"),module.exports);f(e,require("./drivers"),module.exports);
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var p=(r,e)=>{for(var n in e)i(r,n,{get:e[n],enumerable:!0})},E=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of v(e))!u.call(r,s)&&s!==n&&i(r,s,{get:()=>e[s],enumerable:!(t=c(e,s))||t.enumerable});return r};var h=r=>E(i({},"__esModule",{value:!0}),r);var m={};p(m,{EventSystem:()=>d});module.exports=h(m);class d{constructor({events:e}){this.emitting=-1;this.events=e,this.eventIndex={},this.callbackArrays=new Array(this.events.length),this.callbackCounts=new Array(this.events.length).fill(0);for(let n=0;n<this.events.length;n++)this.eventIndex[this.events[n]]=n,this.callbackArrays[n]=[]}on(e,n){const t=this.eventIndex[e];if(t===void 0)return console.warn(`Event "${e}" does not exist.`);const s=this.callbackArrays[t],a=this.callbackCounts[t];for(let l=0;l<a;l++)if(s[l]===n)return;s[a]=n,this.callbackCounts[t]++}once(e,n){const t=s=>{n(s),this.off(e,t)};this.on(e,t)}emit(e,n){const t=this.eventIndex[e];if(t===void 0)return console.warn(`Event "${e}" does not exist.`);const s=this.callbackArrays[t],a=this.callbackCounts[t];this.emitting=t;for(let l=0;l<a;l++){const o=s[l];o!==null&&o(n)}this.emitting=-1,this.compact(t)}off(e,n){const t=this.eventIndex[e];if(t===void 0)return console.warn(`Event "${e}" does not exist.`);const s=this.callbackArrays[t],a=this.callbackCounts[t];for(let l=0;l<a;l++)if(s[l]===n){this.emitting===t?s[l]=null:(s[l]=s[a-1],s[a-1]=null,this.callbackCounts[t]--);return}}clear(e){if(!e){for(let t=0;t<this.callbackArrays.length;t++)this.callbackArrays[t].length=0,this.callbackCounts[t]=0;return}const n=this.eventIndex[e];if(n===void 0)return console.warn(`Event "${e}" does not exist.`);this.callbackArrays[n].length=0,this.callbackCounts[n]=0}compact(e){const n=this.callbackArrays[e];let t=0;const s=this.callbackCounts[e];for(let a=0;a<s;a++)n[a]!==null&&(n[t++]=n[a]);for(let a=t;a<s;a++)n[a]=null;this.callbackCounts[e]=t}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./event-system"),module.exports);
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var o=(e,i)=>{for(var t in i)s(e,t,{get:i[t],enumerable:!0})},k=(e,i,t,c)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of n(i))!u.call(e,r)&&r!==t&&s(e,r,{get:()=>i[r],enumerable:!(c=a(i,r))||c.enumerable});return e};var m=e=>k(s({},"__esModule",{value:!0}),e);var l={};o(l,{FixedTicker:()=>h});module.exports=m(l);class h{constructor({rate:i,onTick:t}){this.accumulator=0;this._tickCount=0;this.rate=i,this.intervalMs=1e3/this.rate,this.onTick=t,this.maxTicksPerFrame=Math.max(1,Math.floor(i/2))}getTicks(i){this.accumulator+=i*1e3;let t=0;const c=this.intervalMs*.001;for(;this.accumulator>=this.intervalMs-c&&t<this.maxTicksPerFrame;)this.accumulator-=this.intervalMs,t++;const r=Math.floor(this.accumulator/this.intervalMs);return r>0&&this.onTickSkipped&&this.onTickSkipped(r),t}tick(i){const t=this.getTicks(i);for(let c=0;c<t;c++)this.onTick(1/this.rate,this._tickCount++)}get tickCount(){return this._tickCount}resetTickCount(){this._tickCount=0,this.accumulator=0}get accumulatedTime(){return this.accumulator/1e3}get alpha(){return Math.min(this.accumulatedTime/(1/this.rate),1)}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./fixed-ticker"),module.exports);
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var a=(r,e)=>{for(var t in e)n(r,t,{get:e[t],enumerable:!0})},h=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of o(e))!f.call(r,i)&&i!==t&&n(r,i,{get:()=>e[i],enumerable:!(s=u(e,i))||s.enumerable});return r};var l=r=>h(n({},"__esModule",{value:!0}),r);var C={};a(C,{FreeList:()=>b});module.exports=l(C);class b{constructor(e){this.capacity=e,this.freeList=new Uint32Array(e);for(let t=0;t<e;t++)this.freeList[t]=t;this.freeCount=e}allocate(){return this.freeCount===0?-1:this.freeList[--this.freeCount]}free(e){if(this.freeCount>=this.capacity)throw new Error("Double free detected!");this.freeList[this.freeCount++]=e}hasAvailable(){return this.freeCount>0}getAvailableCount(){return this.freeCount}getAllocatedCount(){return this.capacity-this.freeCount}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./free-list"),module.exports);
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var u=(e,t)=>{for(var r in t)s(e,r,{get:t[r],enumerable:!0})},h=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of p(t))!g.call(e,n)&&n!==r&&s(e,n,{get:()=>t[n],enumerable:!(a=d(t,n))||a.enumerable});return e};var l=e=>h(s({},"__esModule",{value:!0}),e);var f={};u(f,{generateId:()=>x});module.exports=l(f);function x(e={}){const{prefix:t="",size:r=16}=e,a=Math.max(r-t.length,8),n=Math.ceil(a/8);let i=crypto.getRandomValues(new Uint32Array(n)).reduce((o,c)=>o+c.toString(16).padStart(8,"0"),"");return i=i.slice(0,a).padStart(a,"0"),`${t}${i}`}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./generate-id"),module.exports);
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,e,p,x)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of c(e))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>e[m],enumerable:!(x=b(e,m))||x.enumerable});return f},r=(f,e,p)=>(t(f,e,"default"),p&&t(p,e,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);r(o,require("./binary-codec"),module.exports);r(o,require("./events"),module.exports);r(o,require("./fixed-ticker"),module.exports);r(o,require("./generate-id"),module.exports);r(o,require("./lerp"),module.exports);r(o,require("./driver"),module.exports);r(o,require("./navmesh"),module.exports);r(o,require("./pooled-codec"),module.exports);r(o,require("./prediction"),module.exports);r(o,require("./input"),module.exports);r(o,require("./free-list"),module.exports);r(o,require("./sparse-batcher"),module.exports);r(o,require("./simple-rng"),module.exports);r(o,require("./ray"),module.exports);r(o,require("../renderer"),module.exports);
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var m=(p,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of y(o))!a.call(p,e)&&e!==f&&n(p,e,{get:()=>o[e],enumerable:!(x=s(o,e))||x.enumerable});return p},r=(p,o,f)=>(m(p,o,"default"),f&&m(f,o,"default"));var h=p=>m(n({},"__esModule",{value:!0}),p);var t={};module.exports=h(t);r(t,require("./manager"),module.exports);r(t,require("./sources"),module.exports);
@@ -0,0 +1 @@
1
+ var u=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var m=(e,t)=>{for(var s in t)u(e,s,{get:t[s],enumerable:!0})},y=(e,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of c(t))!f.call(e,i)&&i!==s&&u(e,i,{get:()=>t[i],enumerable:!(o=p(t,i))||o.enumerable});return e};var v=e=>y(u({},"__esModule",{value:!0}),e);var M={};m(M,{InputManager:()=>g});module.exports=v(M);class g{constructor(){this.keys=Object.create(null);this.prevKeys=Object.create(null);this.mouse={x:0,y:0,dx:0,dy:0,left:!1,right:!1,middle:!1,scrollX:0,scrollY:0};this.lastClientX=null;this.lastClientY=null;this.prevMouse={left:!1,right:!1,middle:!1};this.snapshotFlip=!1;this.handlers={keydown:t=>this.onKeyDown(t),keyup:t=>this.onKeyUp(t),mousemove:t=>this.onMouseMove(t),mousedown:t=>this.onMouseDown(t),mouseup:t=>this.onMouseUp(t),wheel:t=>this.onMouseWheel(t),swipe:t=>this.onSwipe(t),pinch:t=>this.onPinch(t)};this.snapshotA=d(),this.snapshotB=d()}peek(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return w(t,this.keys,this.mouse),t}snapshot(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return this.snapshotFlip=!this.snapshotFlip,S(t,this.keys,this.prevKeys,this.mouse,this.prevMouse),this.mouse.dx=0,this.mouse.dy=0,this.mouse.scrollX=0,this.mouse.scrollY=0,this.prevMouse.left=this.mouse.left,this.prevMouse.right=this.mouse.right,this.prevMouse.middle=this.mouse.middle,t}listen(t){this.inputSource&&this.inputSource.detach(),this.inputSource=t,t.attach(this.handlers)}unlisten(){this.inputSource&&this.inputSource.detach()}onKeyDown(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!0}onKeyUp(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!1}onMouseMove(t){const s=t.target.getBoundingClientRect(),o=t.clientX-s.left,i=t.clientY-s.top;typeof document<"u"&&document.pointerLockElement===t.target?(this.mouse.dx+=t.movementX,this.mouse.dy+=t.movementY):this.lastClientX!==null&&this.lastClientY!==null&&(this.mouse.dx+=t.clientX-this.lastClientX,this.mouse.dy+=t.clientY-this.lastClientY),this.lastClientX=t.clientX,this.lastClientY=t.clientY,this.mouse.x=o,this.mouse.y=i}onMouseDown(t){t.button===0&&(this.mouse.left=!0),t.button===1&&(this.mouse.middle=!0),t.button===2&&(this.mouse.right=!0)}onMouseUp(t){t.button===0&&(this.mouse.left=!1),t.button===1&&(this.mouse.middle=!1),t.button===2&&(this.mouse.right=!1),this.lastClientX=null,this.lastClientY=null}onMouseWheel(t){this.mouse.scrollX+=t.deltaX,this.mouse.scrollY+=t.deltaY}onSwipe(t){}onPinch(t){}}function d(){return{mouse:{position:{x:0,y:0},delta:{position:{x:0,y:0},scroll:{x:0,y:0}},left:{down:!1,hit:!1,released:!1},right:{down:!1,hit:!1,released:!1},middle:{down:!1,hit:!1,released:!1}},keys:Object.create(null)}}function w(e,t,s){for(const o in t){const i=e.keys[o]??={down:!1,hit:!1,released:!1};i.down=t[o].down,i.hit=!1,i.released=!1}e.mouse.position.x=s.x,e.mouse.position.y=s.y,e.mouse.delta.position.x=s.dx,e.mouse.delta.position.y=s.dy,e.mouse.delta.scroll.x=s.scrollX,e.mouse.delta.scroll.y=s.scrollY,e.mouse.left.down=s.left,e.mouse.right.down=s.right,e.mouse.middle.down=s.middle,e.mouse.left.hit=e.mouse.left.released=!1,e.mouse.right.hit=e.mouse.right.released=!1,e.mouse.middle.hit=e.mouse.middle.released=!1}function S(e,t,s,o,i){for(const l in t){const n=t[l].down,r=s[l]??!1,a=e.keys[l]??={down:!1,hit:!1,released:!1};a.down=n,a.hit=n&&!r,a.released=!n&&r,s[l]=n}e.mouse.position.x=o.x,e.mouse.position.y=o.y,e.mouse.delta.position.x=o.dx,e.mouse.delta.position.y=o.dy,e.mouse.delta.scroll.x=o.scrollX,e.mouse.delta.scroll.y=o.scrollY,h(e.mouse.left,o.left,i.left),h(e.mouse.right,o.right,i.right),h(e.mouse.middle,o.middle,i.middle)}function h(e,t,s){e.down=t,e.hit=t&&!s,e.released=!t&&s}
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var r in e)s(t,r,{get:e[r],enumerable:!0})},m=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!u.call(t,n)&&n!==r&&s(t,n,{get:()=>e[n],enumerable:!(o=i(e,n))||o.enumerable});return t};var p=t=>m(s({},"__esModule",{value:!0}),t);var h={};d(h,{BrowserInputSource:()=>v});module.exports=p(h);class v{constructor(e,r){this.keyboardTarget=e;this.mouseTarget=r}attach(e){this.handlers&&this.detach(),this.handlers=e,this.keyboardTarget.addEventListener("keydown",e.keydown),this.keyboardTarget.addEventListener("keyup",e.keyup),this.mouseTarget.addEventListener("pointermove",e.mousemove),this.mouseTarget.addEventListener("pointerdown",e.mousedown),this.mouseTarget.addEventListener("pointerup",e.mouseup),this.mouseTarget.addEventListener("pointercancel",e.mouseup),this.mouseTarget.addEventListener("wheel",e.wheel)}detach(){const e=this.handlers;e&&(this.keyboardTarget.removeEventListener("keydown",e.keydown),this.keyboardTarget.removeEventListener("keyup",e.keyup),this.mouseTarget.removeEventListener("pointermove",e.mousemove),this.mouseTarget.removeEventListener("pointerdown",e.mousedown),this.mouseTarget.removeEventListener("pointerup",e.mouseup),this.mouseTarget.removeEventListener("pointercancel",e.mouseup),this.mouseTarget.removeEventListener("wheel",e.wheel))}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./browser"),module.exports);
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var p=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of u(e))!a.call(t,o)&&o!==r&&d(t,o,{get:()=>e[o],enumerable:!(n=i(e,o))||n.enumerable});return t};var s=t=>p(d({},"__esModule",{value:!0}),t);var v={};module.exports=s(v);
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./lerp"),module.exports);
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var f=(n,e)=>{for(var r in e)b(n,r,{get:e[r],enumerable:!0})},i=(n,e,r,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of p(e))!c.call(n,u)&&u!==r&&b(n,u,{get:()=>e[u],enumerable:!(m=o(e,u))||m.enumerable});return n};var l=n=>i(b({},"__esModule",{value:!0}),n);var x={};f(x,{lerp:()=>t});module.exports=l(x);function t(n,e,r){return n+(e-n)*r}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./navmesh"),module.exports);
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var h=(a,e)=>{for(var i in e)d(a,i,{get:e[i],enumerable:!0})},u=(a,e,i,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of m(e))!c.call(a,r)&&r!==i&&d(a,r,{get:()=>e[r],enumerable:!(t=l(e,r))||t.enumerable});return a};var g=a=>u(d({},"__esModule",{value:!0}),a);var E={};h(E,{NavMeshWorkerPool:()=>v});module.exports=g(E);class v{constructor(e,i,t="grid",r=[]){this.poolSize=e;this.workerPath=i;this.navType=t;this.obstacles=r;this.workers=[];this.nextWorkerIndex=0;this.requestId=0;this.pendingRequests=new Map;this.initialized=!1}async init(){if(this.initialized)return;const e=[];for(let i=0;i<this.poolSize;i++){const t=new Worker(this.workerPath,{type:"module"});t.onmessage=n=>{const s=n.data;if(s.type==="PATH_RESULT"){const o=this.pendingRequests.get(s.id);o&&(o.resolve(s.path),this.pendingRequests.delete(s.id))}else if(s.type==="ERROR")for(const[o,p]of this.pendingRequests.entries())p.reject(new Error(s.error)),this.pendingRequests.delete(o)},t.onerror=n=>{console.error("Worker error:",n);for(const[s,o]of this.pendingRequests.entries())o.reject(new Error("Worker error")),this.pendingRequests.delete(s)},this.workers.push(t);const r=new Promise(n=>{const s=o=>{o.data.type==="READY"&&(t.removeEventListener("message",s),n())};t.addEventListener("message",s)});t.postMessage({type:"INIT",navType:this.navType,obstacles:this.obstacles}),e.push(r)}await Promise.all(e),this.initialized=!0}async findPath(e,i){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.requestId++,r=this.workers[this.nextWorkerIndex];return this.nextWorkerIndex=(this.nextWorkerIndex+1)%this.workers.length,new Promise((n,s)=>{this.pendingRequests.set(t,{id:t,from:e,to:i,resolve:n,reject:s}),r.postMessage({type:"FIND_PATH",id:t,from:e,to:i})})}async addObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const i=this.workers.map(r=>new Promise(n=>{const s=o=>{o.data.type==="OBSTACLE_ADDED"&&(r.removeEventListener("message",s),n(o.data.obstacleId))};r.addEventListener("message",s),r.postMessage({type:"ADD_OBSTACLE",obstacle:e})}));return(await Promise.all(i))[0]}async removeObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const i=this.workers.map(t=>new Promise(r=>{const n=s=>{s.data.type==="OBSTACLE_REMOVED"&&(t.removeEventListener("message",n),r())};t.addEventListener("message",n),t.postMessage({type:"REMOVE_OBSTACLE",obstacleId:e})}));await Promise.all(i)}async moveObstacle(e,i){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.workers.map(r=>new Promise(n=>{const s=o=>{o.data.type==="OBSTACLE_MOVED"&&(r.removeEventListener("message",s),n())};r.addEventListener("message",s),r.postMessage({type:"MOVE_OBSTACLE",obstacleId:e,pos:i})}));await Promise.all(t)}terminate(){for(const e of this.workers)e.terminate();this.workers=[],this.pendingRequests.clear(),this.initialized=!1}get pendingCount(){return this.pendingRequests.size}get size(){return this.workers.length}}
@@ -0,0 +1 @@
1
+ var X=Object.create;var x=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var W=(r,t)=>{for(var e in t)x(r,e,{get:t[e],enumerable:!0})},v=(r,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of C(t))!R.call(r,i)&&i!==e&&x(r,i,{get:()=>t[i],enumerable:!(s=Y(t,i))||s.enumerable});return r};var N=(r,t,e)=>(e=r!=null?X(T(r)):{},v(t||!r||!r.__esModule?x(e,"default",{value:r,enumerable:!0}):e,r)),F=r=>v(x({},"__esModule",{value:!0}),r);var G={};W(G,{NavMesh:()=>D});module.exports=F(G);var V=require("../ray/ray-2d");const j=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}],g=r=>({x:Math.floor(r.x),y:Math.floor(r.y)}),w=r=>({x:r.x+.5,y:r.y+.5}),d=(r,t)=>r&65535|(t&65535)<<16,O=r=>({x:r<<16>>16,y:r>>16});class q{constructor(t){this.scoreFn=t;this.heap=[]}push(t){this.heap.push(t),this.bubbleUp(this.heap.length-1)}pop(){const t=this.heap[0],e=this.heap.pop();return this.heap.length>0&&e!==void 0&&(this.heap[0]=e,this.sinkDown(0)),t}get size(){return this.heap.length}clear(){this.heap.length=0}bubbleUp(t){const e=this.heap[t],s=this.scoreFn(e);for(;t>0;){const i=(t+1>>1)-1,a=this.heap[i];if(s>=this.scoreFn(a))break;this.heap[i]=e,this.heap[t]=a,t=i}}sinkDown(t){const e=this.heap.length,s=this.heap[t],i=this.scoreFn(s);for(;;){const a=t+1<<1,c=a-1;let o=null,n;if(c<e){const l=this.heap[c];n=this.scoreFn(l),n<i&&(o=c)}if(a<e){const l=this.heap[a];this.scoreFn(l)<(o===null?i:n)&&(o=a)}if(o===null)break;this.heap[t]=this.heap[o],this.heap[o]=s,t=o}}}class B{constructor(t=1){this.grid=new Map;this.obstacleCells=new Map;this.cellSize=t}hash(t,e){const s=Math.floor(t/this.cellSize),i=Math.floor(e/this.cellSize);return d(s,i)}add(t,e){const s=this.getCellsForObstacle(e);for(const i of s)this.grid.has(i)||this.grid.set(i,new Set),this.grid.get(i).add(t);this.obstacleCells.set(t,s)}remove(t){const e=this.obstacleCells.get(t);if(e){for(const s of e){const i=this.grid.get(s);i&&(i.delete(t),i.size===0&&this.grid.delete(s))}this.obstacleCells.delete(t)}}query(t){const e=this.hash(t.x,t.y);return this.grid.get(e)||new Set}queryRay(t,e,s,i,a){const c=new Set,o=this.cellSize;let n=Math.floor(t/o),l=Math.floor(e/o);const h=s>=0?1:-1,p=i>=0?1:-1,u=Math.abs(s)<1e-10?1/0:o/Math.abs(s),f=Math.abs(i)<1e-10?1/0:o/Math.abs(i);let b=Math.abs(s)<1e-10?1/0:s>0?((n+1)*o-t)/s:(t-n*o)/-s,y=Math.abs(i)<1e-10?1/0:i>0?((l+1)*o-e)/i:(e-l*o)/-i;for(;;){const m=this.grid.get(d(n,l));if(m)for(const I of m)c.add(I);if((b<y?b:y)>a)break;b<=y?(b+=u,n+=h):(y+=f,l+=p)}return c}clear(){this.grid.clear(),this.obstacleCells.clear()}getCellsForObstacle(t){const e=[];if(t.type==="circle"){const s=t.radius,i=Math.floor((t.pos.x-s)/this.cellSize),a=Math.floor((t.pos.x+s)/this.cellSize),c=Math.floor((t.pos.y-s)/this.cellSize),o=Math.floor((t.pos.y+s)/this.cellSize);for(let n=i;n<=a;n++)for(let l=c;l<=o;l++)e.push(d(n,l))}else if(t.type==="rect"){const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,a=t.size.x/2,c=t.size.y/2,o=Math.sqrt(a*a+c*c),n=Math.floor((s-o)/this.cellSize),l=Math.floor((s+o)/this.cellSize),h=Math.floor((i-o)/this.cellSize),p=Math.floor((i+o)/this.cellSize);for(let u=n;u<=l;u++)for(let f=h;f<=p;f++)e.push(d(u,f))}else if(t.type==="polygon"){const s=S(t),i=Math.floor(s.minX/this.cellSize),a=Math.floor(s.maxX/this.cellSize),c=Math.floor(s.minY/this.cellSize),o=Math.floor(s.maxY/this.cellSize);for(let n=i;n<=a;n++)for(let l=c;l<=o;l++)e.push(d(n,l))}return e}}function k(r,t){const e=r.x-t.pos.x,s=r.y-t.pos.y;return e*e+s*s<=t.radius*t.radius}function M(r,t){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2;if(t.rotation){const i=Math.cos(-t.rotation),a=Math.sin(-t.rotation),c=r.x-e,o=r.y-s,n=c*i-o*a,l=c*a+o*i;return Math.abs(n)<=t.size.x/2&&Math.abs(l)<=t.size.y/2}return r.x>=t.pos.x&&r.y>=t.pos.y&&r.x<=t.pos.x+t.size.x&&r.y<=t.pos.y+t.size.y}function P(r,t){let e=!1;const s=t.points,i=t.rotation?Math.cos(t.rotation):1,a=t.rotation?Math.sin(t.rotation):0;for(let c=0,o=s.length-1;c<s.length;o=c++){let n=s[c].x,l=s[c].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-l*a,b=n*a+l*i,y=h*i-p*a,m=h*a+p*i;n=f,l=b,h=y,p=m}n+=t.pos.x,l+=t.pos.y,h+=t.pos.x,p+=t.pos.y,l>r.y!=p>r.y&&r.x<(h-n)*(r.y-l)/(p-l)+n&&(e=!e)}return e}function S(r){let t=1/0,e=1/0,s=-1/0,i=-1/0;const a=r.rotation?Math.cos(r.rotation):1,c=r.rotation?Math.sin(r.rotation):0;for(const o of r.points){let n=o.x,l=o.y;if(r.rotation){const h=n*a-l*c,p=n*c+l*a;n=h,l=p}n+=r.pos.x,l+=r.pos.y,t=Math.min(t,n),e=Math.min(e,l),s=Math.max(s,n),i=Math.max(i,l)}return{minX:t,minY:e,maxX:s,maxY:i}}class A{constructor(){this.items=new Map;this.spatial=new B(1);this._cachedItems=[];this.nextId=1;this.dirty=!0;this.version=0}add(t){const e=this.nextId++,s={...t,id:e};return this.items.set(e,s),this.spatial.add(e,s),this.dirty=!0,this.version++,e}move(t,e){const s=this.items.get(t);if(!s)return;this.spatial.remove(t);const i={...s,pos:{...e}};this.items.set(t,i),this.spatial.add(t,i),this.dirty=!0,this.version++}remove(t){this.spatial.remove(t),this.items.delete(t),this.dirty=!0,this.version++}at(t){const e=this.spatial.query(t);for(const s of e){const i=this.items.get(s);if(!(!i||i.solid===!1)&&(i.type==="circle"&&k(t,i)||i.type==="rect"&&M(t,i)||i.type==="polygon"&&P(t,i)))return i}}get(t){return this.items.get(t)}queryRay(t,e){return this.spatial.queryRay(t.origin[0],t.origin[1],t.direction[0],t.direction[1],e)}get values(){return this.dirty?(this._cachedItems=[...this.items.values()],this.dirty=!1,this._cachedItems):this._cachedItems}}class z{constructor(){this.cameFrom=new Map;this.g=new Map;this.closed=new Set;this.openSet=new Set;this.goalX=0;this.goalY=0;this.open=new q(t=>{const e=O(t);return(this.g.get(t)??0)+Math.abs(e.x-this.goalX)+Math.abs(e.y-this.goalY)})}run(t,e,s){this.goalX=e.x,this.goalY=e.y,this.cameFrom.clear(),this.g.clear(),this.closed.clear(),this.openSet.clear(),this.open.clear();const i=d(t.x,t.y);for(this.g.set(i,0),this.open.push(i),this.openSet.add(i);this.open.size>0;){const a=this.open.pop();this.openSet.delete(a);const c=O(a);if(c.x===e.x&&c.y===e.y)return E(this.cameFrom,c);this.closed.add(a);for(const o of j){const n=c.x+o.x,l=c.y+o.y;if(!s(n,l))continue;const h=d(n,l);if(this.closed.has(h))continue;const p=this.g.get(a)+1;p<(this.g.get(h)??1/0)&&(this.g.set(h,p),this.cameFrom.set(h,a),this.openSet.has(h)||(this.open.push(h),this.openSet.add(h)))}}return[]}}class _{constructor(t){this.obstacles=t;this.blocked=new Set;this.astar=new z;this.pathCache=new Map;this.pathCacheVersion=-1}rebuild(){this.blocked.clear();for(const t of this.obstacles.values)if(t.solid!==!1){if(t.type==="circle"){const e=Math.ceil(t.radius),s=Math.floor(t.pos.x),i=Math.floor(t.pos.y);for(let a=-e;a<=e;a++)for(let c=-e;c<=e;c++){const o=s+a,n=i+c,l={x:o+.5,y:n+.5};k(l,t)&&this.blocked.add(d(o,n))}}else if(t.type==="rect"){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2,i=t.size.x/2,a=t.size.y/2,c=Math.sqrt(i*i+a*a),o=Math.floor(e-c),n=Math.ceil(e+c),l=Math.floor(s-c),h=Math.ceil(s+c);for(let p=o;p<=n;p++)for(let u=l;u<=h;u++){const f={x:p+.5,y:u+.5};M(f,t)&&this.blocked.add(d(p,u))}}else if(t.type==="polygon"){const e=S(t),s=Math.floor(e.minX),i=Math.ceil(e.maxX),a=Math.floor(e.minY),c=Math.ceil(e.maxY);for(let o=s;o<=i;o++)for(let n=a;n<=c;n++){const l={x:o+.5,y:n+.5};P(l,t)&&this.blocked.add(d(o,n))}}}}findPath(t,e){const s=g(t),i=g(e),a=`${d(s.x,s.y)}|${d(i.x,i.y)}`;this.obstacles.version!==this.pathCacheVersion&&(this.pathCache.clear(),this.pathCacheVersion=this.obstacles.version);const c=this.pathCache.get(a);if(c)return c;const o=this.astar.run(s,i,(n,l)=>!this.blocked.has(d(n,l))).map(w);return this.pathCache.set(a,o),o}}function H(r,t,e){if(t.solid===!1)return!1;if(t.type==="circle"){const s=r.intersectsCircle(t.pos.x,t.pos.y,t.radius);return s!==null&&s<=e}if(t.type==="rect"){if(!t.rotation){const h=r.intersectsAABB(t.pos.x,t.pos.y,t.pos.x+t.size.x,t.pos.y+t.size.y);return h!==null&&h<=e}const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,a=t.size.x/2,c=t.size.y/2,o=Math.cos(t.rotation),n=Math.sin(t.rotation),l=[[s+a*o-c*n,i+a*n+c*o],[s-a*o-c*n,i-a*n+c*o],[s-a*o+c*n,i-a*n-c*o],[s+a*o+c*n,i+a*n-c*o]];for(let h=0;h<4;h++){const[p,u]=l[h],[f,b]=l[(h+1)%4],y=r.intersectsSegment(p,u,f,b);if(y!==null&&y<=e)return!0}return!1}if(t.type==="polygon"){const s=t.points,i=t.rotation?Math.cos(t.rotation):1,a=t.rotation?Math.sin(t.rotation):0;for(let c=0;c<s.length;c++){const o=(c+1)%s.length;let n=s[c].x,l=s[c].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-l*a;l=n*a+l*i,n=f;const b=h*i-p*a;p=h*a+p*i,h=b}n+=t.pos.x,l+=t.pos.y,h+=t.pos.x,p+=t.pos.y;const u=r.intersectsSegment(n,l,h,p);if(u!==null&&u<=e)return!0}return!1}return!1}class U{constructor(t){this.obstacles=t;this.astar=new z}rebuild(){}findPath(t,e){const s=e.x-t.x,i=e.y-t.y,a=Math.hypot(s,i);if(a>0){const c=new V.Ray2D;c.set(t.x,t.y,s,i);const o=this.obstacles.queryRay(c,a);for(const n of o){const l=this.obstacles.get(n);if(l&&H(c,l,a))return this.astar.run(g(t),g(e),(h,p)=>!this.obstacles.at({x:h+.5,y:p+.5})).map(w)}}return[t,e]}}class D{constructor(t,e){this.type=t;this.lastVersion=-1;this.pendingPaths=0;this.AUTO_WORKER_THRESHOLD=20;this.obstacles=new A,this.options={workers:e?.workers??!1,workerPoolSize:e?.workerPoolSize??4,workerPath:e?.workerPath??"./navmesh.worker.js"},t==="grid"&&(this.grid=new _(this.obstacles)),t==="graph"&&(this.graph=new U(this.obstacles)),this.options.workers===!0&&this.initWorkerPool()}async initWorkerPool(){if(!this.workerPool)try{const{NavMeshWorkerPool:t}=await import("./navmesh-worker-pool");this.workerPool=new t(this.options.workerPoolSize,this.options.workerPath,this.type,this.obstacles.values),await this.workerPool.init()}catch(t){console.warn("Failed to initialize worker pool, falling back to sync:",t),this.options.workers=!1}}shouldUseWorkers(){return this.options.workers===!1?!1:this.options.workers===!0?!0:this.pendingPaths>=this.AUTO_WORKER_THRESHOLD}addObstacle(t){return this.obstacles.add(t)}moveObstacle(t,e){this.obstacles.move(t,e)}removeObstacle(t){this.obstacles.remove(t)}getObstacles(){return this.obstacles.values}findPath({from:t,to:e}){return this.shouldUseWorkers()&&this.workerPool?(this.pendingPaths++,this.findPathAsync(t,e).finally(()=>{this.pendingPaths--})):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}async findPathAsync(t,e){return this.options.workers==="auto"&&!this.workerPool&&await this.initWorkerPool(),this.workerPool?this.workerPool.findPath(t,e):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}rebuild(){this.lastVersion!==this.obstacles.version&&(this.grid?.rebuild(),this.graph?.rebuild(),this.lastVersion=this.obstacles.version)}dispose(){this.workerPool&&(this.workerPool.terminate(),this.workerPool=void 0)}getWorkerStatus(){return{workersEnabled:this.options.workers,workerPoolActive:!!this.workerPool,pendingPaths:this.pendingPaths,usingWorkersNow:this.shouldUseWorkers()}}}function E(r,t){const e=[t];let s=d(t.x,t.y);for(;r.has(s);)s=r.get(s),e.push(O(s));return e.reverse()}
@@ -0,0 +1 @@
1
+ var o=require("./navmesh");let s=null;self.onmessage=r=>{const e=r.data;try{switch(e.type){case"INIT":{if(s=new o.NavMesh(e.navType),e.obstacles)for(const t of e.obstacles)s.addObstacle(t);self.postMessage({type:"READY"});break}case"FIND_PATH":{if(!s)throw new Error("NavMesh not initialized");const t=performance.now(),a=s.findPath({from:e.from,to:e.to}),n=performance.now()-t,c={type:"PATH_RESULT",id:e.id,path:a,duration:n};self.postMessage(c);break}case"ADD_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");const a={type:"OBSTACLE_ADDED",obstacleId:s.addObstacle(e.obstacle)};self.postMessage(a);break}case"REMOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.removeObstacle(e.obstacleId),self.postMessage({type:"OBSTACLE_REMOVED"});break}case"MOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.moveObstacle(e.obstacleId,e.pos),self.postMessage({type:"OBSTACLE_MOVED"});break}}}catch(t){self.postMessage({type:"ERROR",error:t instanceof Error?t.message:String(t)})}};
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./pooled-codec"),module.exports);
@@ -0,0 +1 @@
1
+ var T=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var O=(d,e)=>{for(var t in e)T(d,t,{get:e[t],enumerable:!0})},j=(d,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of m(e))!S.call(d,s)&&s!==t&&T(d,s,{get:()=>e[s],enumerable:!(o=w(e,s))||o.enumerable});return d};var v=d=>j(T({},"__esModule",{value:!0}),d);var I={};O(I,{ObjectPool:()=>p,PooledArrayDecoder:()=>x,PooledCodec:()=>z,PooledDecoder:()=>A,PooledEncoder:()=>k});module.exports=v(I);var U=require("../binary-codec");class p{constructor(e){this.factory=e;this.pool=[]}acquire(){return this.pool.pop()??this.factory()}release(e){this.pool.push(e)}releaseAll(e){this.pool.push(...e)}}class A{constructor(e){this.schema=e;this.pool=new p(()=>this.createNil())}createNil(){const e={};for(const t of Object.keys(this.schema)){const o=this.schema[t];e[t]="toNil"in o?o.toNil():void 0}return e}decode(e){const t=this.pool.acquire();return this.decodeInto(e,t),t}decodeInto(e,t){let o=0;for(const s of Object.keys(this.schema)){const a=this.schema[s];if("decodeAll"in a){const n=a.decodeAll(e.subarray(o));t[s]=n.value,o+=n.bytesRead}else if("decodeField"in a){const n=a.decodeField(e.subarray(o));t[s]=n.value,o+=n.bytesRead}else if("decode"in a){const n=a.decode(e.subarray(o));t[s]=n.value,o+=n.bytesRead}else{const n=a.size||0,i=e.subarray(o,o+n);U.BinaryCodec.decodeInto({[s]:a},i,t),o+=n}}}release(e){this.pool.release(e)}}class x{constructor(e){this.pooledDecoder=new A(e)}decodeAll(e){return e.map(t=>this.pooledDecoder.decode(t))}releaseAll(e){e.forEach(t=>this.pooledDecoder.release(t))}}class k{constructor(e,t=1024){this.schema=e;this.bufferSize=t;this.pool=new p(()=>new Uint8Array(t))}encode(e){const t=this.pool.acquire();let o=0;for(const s of Object.keys(this.schema)){const a=this.schema[s];if("encode"in a){const n=a.encode(e[s]);t.set(n,o),o+=n.length}else if("encodeAll"in a){const n=a.encodeAll(e[s]);let i=0;for(const r of n)t.set(r,o+i),i+=r.length;o+=i}else{const n=U.BinaryCodec.encode({[s]:a},{[s]:e[s]});t.set(n,o),o+=n.length}}return t.subarray(0,o)}release(e){this.pool.release(e)}}class z{constructor(e){this.schema=e;this.encoder=new k(e),this.decoder=new A(e)}calculateSize(e){let t=0;for(const o of Object.keys(this.schema)){const s=this.schema[o];"size"in s?t+=s.size:"calculateSize"in s&&(t+=s.calculateSize(e[o]))}return t}encodeInto(e,t,o){const s=new DataView(t.buffer,t.byteOffset);let a=o;for(const n of Object.keys(this.schema)){const i=this.schema[n];if("write"in i)i.write(s,a,e[n]),a+=i.size;else if("encodeInto"in i){const r=i.encodeInto(e[n],t,a);a+=r}else if("encode"in i){const r=i.encode(e[n]);t.set(r,a),a+=r.length}}return a-o}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}release(e){this.decoder.release(e)}static array(e){let t=0;for(const r of Object.keys(e)){const l=e[r];t+=l.size||0}const o=new p(()=>new Uint8Array(16384)),s=new p(()=>{const r={};for(const l of Object.keys(e)){const c=e[l];r[l]="toNil"in c?c.toNil():void 0}return r}),a=new p(()=>[]);let n=null,i=null;return{__arrayType:void 0,calculateSize(r){return 2+r.length*t},encodeInto(r,l,c){const y=new DataView(l.buffer,l.byteOffset);y.setUint16(c,r.length,!1);let f=c+2;for(const b of r)for(const u of Object.keys(e)){const h=e[u];h.write(y,f,b[u]),f+=h.size}return f-c},encode(r){const l=2+r.length*t;let c=o.acquire();c.length<l&&(o.release(c),c=new Uint8Array(Math.max(l,c.length*2))),(!n||n.buffer!==c.buffer)&&(n=new DataView(c.buffer,c.byteOffset)),n.setUint16(0,r.length,!1);let y=2;for(const b of r)for(const u of Object.keys(e)){const h=e[u];h.write(n,y,b[u]),y+=h.size}const f=new Uint8Array(y);return f.set(c.subarray(0,y)),o.release(c),f},decodeField(r){const l=r[0]<<8|r[1],c=a.acquire();c.length=l,(!i||i.buffer!==r.buffer||i.byteOffset!==r.byteOffset)&&(i=new DataView(r.buffer,r.byteOffset));let y=2;for(let f=0;f<l;f++){const b=s.acquire();for(const u of Object.keys(e)){const h=e[u];b[u]=h.read(i,y),y+=h.size}c[f]=b}return{value:c,bytesRead:y}},decode(r){return this.decodeField(r).value},toNil(){return[]}}}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./prediction"),module.exports);
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var h=(n,t)=>{for(var r in t)s(n,r,{get:t[r],enumerable:!0})},T=(n,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of c(t))!p.call(n,e)&&e!==r&&s(n,e,{get:()=>t[e],enumerable:!(a=i(t,e))||a.enumerable});return n};var k=n=>T(s({},"__esModule",{value:!0}),n);var l={};h(l,{IntentTracker:()=>o,Reconciliator:()=>u});module.exports=k(l);class o{constructor(){this.tracker=new Map}get size(){return this.tracker.size}track(t,r){return this.tracker.has(t)||this.tracker.set(t,[]),this.tracker.get(t).push(r),r}dropUpTo(t){const r=[];for(const[a,e]of this.tracker)a<=t?this.tracker.delete(a):r.push([a,e]);return r.sort(([a],[e])=>a-e),r.map(([a,e])=>e).flat()}values(){return Array.from(this.tracker.entries()).sort(([t],[r])=>t-r).map(([t,r])=>r).flat()}}class u{constructor(t){this.options=t;this.tracker=new o}trackIntent(t,r){this.tracker.track(t,r)}onSnapshot(t){this.options.onLoadState(t.state);const r=this.tracker.dropUpTo(t.tick);r.length>0&&this.options.onReplay(r)}replay(t){this.options.onReplay(t)}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(r,o,p,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let m of c(o))!d.call(r,m)&&m!==p&&a(r,m,{get:()=>o[m],enumerable:!(x=b(o,m))||x.enumerable});return r},f=(r,o,p)=>(t(r,o,"default"),p&&t(p,o,"default"));var g=r=>t(a({},"__esModule",{value:!0}),r);var e={};module.exports=g(e);f(e,require("./ray-2d"),module.exports);f(e,require("./ray-3d"),module.exports);
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var p=(b,i)=>{for(var o in i)m(b,o,{get:i[o],enumerable:!0})},y=(b,i,o,u)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of a(i))!M.call(b,t)&&t!==o&&m(b,t,{get:()=>i[t],enumerable:!(u=d(i,t))||u.enumerable});return b};var x=b=>y(m({},"__esModule",{value:!0}),b);var q={};p(q,{Ray2D:()=>_});module.exports=x(q);class _{constructor(){this.origin=[0,0];this.direction=[1,0];this._point=[0,0]}set(i,o,u,t){this.origin[0]=i,this.origin[1]=o;const n=Math.sqrt(u*u+t*t);n>0&&(this.direction[0]=u/n,this.direction[1]=t/n)}at(i){return this._point[0]=this.origin[0]+this.direction[0]*i,this._point[1]=this.origin[1]+this.direction[1]*i,this._point}intersectsSegment(i,o,u,t){const n=this.direction[0],e=this.direction[1],c=u-i,s=t-o,r=n*s-e*c;if(Math.abs(r)<1e-10)return null;const h=i-this.origin[0],l=o-this.origin[1],f=(h*s-l*c)/r,g=(h*e-l*n)/r;return f<0||g<0||g>1?null:f}intersectsCircle(i,o,u){const t=this.origin[0]-i,n=this.origin[1]-o,e=2*(t*this.direction[0]+n*this.direction[1]),c=t*t+n*n-u*u,s=e*e-4*c;if(s<0)return null;const r=Math.sqrt(s),h=(-e-r)/2,l=(-e+r)/2;return h>=0?h:l>=0?l:null}intersectsAABB(i,o,u,t){let n=-1/0,e=1/0;if(Math.abs(this.direction[0])<1e-10){if(this.origin[0]<i||this.origin[0]>u)return null}else{const c=1/this.direction[0];let s=(i-this.origin[0])*c,r=(u-this.origin[0])*c;if(s>r){const h=s;s=r,r=h}n=Math.max(n,s),e=Math.min(e,r)}if(Math.abs(this.direction[1])<1e-10){if(this.origin[1]<o||this.origin[1]>t)return null}else{const c=1/this.direction[1];let s=(o-this.origin[1])*c,r=(t-this.origin[1])*c;if(s>r){const h=s;s=r,r=h}n=Math.max(n,s),e=Math.min(e,r)}return n>e||e<0?null:n>=0?n:e}}
@@ -0,0 +1 @@
1
+ var z=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var E=(l,n)=>{for(var t in n)z(l,t,{get:n[t],enumerable:!0})},F=(l,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of w(n))!C.call(l,i)&&i!==t&&z(l,i,{get:()=>n[i],enumerable:!(e=k(n,i))||e.enumerable});return l};var G=l=>F(z({},"__esModule",{value:!0}),l);var J={};E(J,{Ray3D:()=>H});module.exports=G(J);class H{constructor(){this.origin=[0,0,0];this.direction=[0,0,1];this._point=[0,0,0]}set(n,t,e,i,s,o){this.origin[0]=n,this.origin[1]=t,this.origin[2]=e;const r=Math.sqrt(i*i+s*s+o*o);r>0&&(this.direction[0]=i/r,this.direction[1]=s/r,this.direction[2]=o/r)}at(n){return this._point[0]=this.origin[0]+this.direction[0]*n,this._point[1]=this.origin[1]+this.direction[1]*n,this._point[2]=this.origin[2]+this.direction[2]*n,this._point}intersectsPlane(n,t,e,i){const s=n*this.direction[0]+t*this.direction[1]+e*this.direction[2];if(Math.abs(s)<1e-10)return null;const o=(i-(n*this.origin[0]+t*this.origin[1]+e*this.origin[2]))/s;return o>=0?o:null}intersectsSphere(n,t,e,i){const s=this.origin[0]-n,o=this.origin[1]-t,r=this.origin[2]-e,u=2*(s*this.direction[0]+o*this.direction[1]+r*this.direction[2]),a=s*s+o*o+r*r-i*i,m=u*u-4*a;if(m<0)return null;const c=Math.sqrt(m),b=(-u-c)/2,h=(-u+c)/2;return b>=0?b:h>=0?h:null}intersectsAABB(n,t,e,i,s,o){let r=-1/0,u=1/0;const a=[[this.direction[0],this.origin[0],n,i,0],[this.direction[1],this.origin[1],t,s,1],[this.direction[2],this.origin[2],e,o,2]];for(const[m,c,b,h]of a){if(Math.abs(m)<1e-10){if(c<b||c>h)return null}else{const g=1/m;let f=(b-c)*g,d=(h-c)*g;if(f>d){const p=f;f=d,d=p}r=Math.max(r,f),u=Math.min(u,d)}if(r>u)return null}return u<0?null:r>=0?r:u}intersectsTriangle(n,t,e,i,s,o,r,u,a){const m=i-n,c=s-t,b=o-e,h=r-n,g=u-t,f=a-e,d=this.direction[0],p=this.direction[1],M=this.direction[2],A=p*f-M*g,B=M*h-d*f,D=d*g-p*h,I=m*A+c*B+b*D;if(Math.abs(I)<1e-10)return null;const x=1/I,q=this.origin[0]-n,y=this.origin[1]-t,_=this.origin[2]-e,v=x*(q*A+y*B+_*D);if(v<0||v>1)return null;const P=y*b-_*c,R=_*m-q*b,S=q*c-y*m,T=x*(d*P+p*R+M*S);if(T<0||v+T>1)return null;const j=x*(h*P+g*R+f*S);return j>=0?j:null}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./simple-rng"),module.exports);
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var r in t)n(e,r,{get:t[r],enumerable:!0})},b=(e,t,r,F)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of i(t))!u.call(e,s)&&s!==r&&n(e,s,{get:()=>t[s],enumerable:!(F=a(t,s))||F.enumerable});return e};var m=e=>b(n({},"__esModule",{value:!0}),e);var o={};h(o,{SimpleRNG:()=>d});module.exports=m(o);class d{constructor(t){this.state=(t??Math.random()*2147483647)|0,this.state===0&&(this.state=1)}rand(){return this.state=this.state*1664525+1013904223&2147483647,this.state/2147483647}range(t,r){return t+this.rand()*(r-t)}int(t,r){return t+(this.rand()*(r-t+1)|0)}chance(t){return this.rand()<t}pick(t){return t[this.rand()*t.length|0]}seed(t){this.state=t|0,this.state===0&&(this.state=1)}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./sparse-batcher"),module.exports);
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var v=(c,i)=>{for(var e in i)a(c,e,{get:i[e],enumerable:!0})},f=(c,i,e,s)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of b(i))!k.call(c,t)&&t!==e&&a(c,t,{get:()=>i[t],enumerable:!(s=h(i,t))||s.enumerable});return c};var y=c=>f(a({},"__esModule",{value:!0}),c);var l={};v(l,{SparseBatcher:()=>n});module.exports=y(l);class n{constructor(i){this.BUCKET_INITIAL_SIZE=256;this.buckets=new Map;this.bucketSizes=new Uint32Array(n.MAX_BUCKETS);this.activeBuckets=new Uint16Array(n.MAX_BUCKETS);this.sortBuffer=new Uint16Array(n.MAX_BUCKETS);this.activeCount=0;this.capacity=i}static{this.MAX_LAYERS=256}static{this.MAX_SHEETS=64}static{this.MAX_BUCKETS=n.MAX_LAYERS*n.MAX_SHEETS}key(i,e){return i*n.MAX_SHEETS+e}add(i,e,s){const t=this.key(i,e);this.buckets.has(t)||(this.buckets.set(t,new Uint32Array(this.BUCKET_INITIAL_SIZE)),this.activeBuckets[this.activeCount++]=t);const u=this.buckets.get(t);if(this.bucketSizes[t]>=u.length){const r=new Uint32Array(u.length*2);r.set(u),this.buckets.set(t,r)}this.buckets.get(t)[this.bucketSizes[t]++]=s}remove(i,e,s){const t=this.key(i,e),u=this.bucketSizes[t];if(u===0)return;const o=this.buckets.get(t);for(let r=0;r<u;r++)if(o[r]===s){o[r]=o[u-1],this.bucketSizes[t]--;break}if(this.bucketSizes[t]===0){for(let r=0;r<this.activeCount;r++)if(this.activeBuckets[r]===t){this.activeBuckets[r]=this.activeBuckets[--this.activeCount];break}}}each(i){this.sortBuffer.set(this.activeBuckets.subarray(0,this.activeCount));for(let e=1;e<this.activeCount;e++){const s=this.sortBuffer[e];let t=e-1;for(;t>=0&&this.sortBuffer[t]>s;)this.sortBuffer[t+1]=this.sortBuffer[t--];this.sortBuffer[t+1]=s}for(let e=0;e<this.activeCount;e++){const s=this.sortBuffer[e],t=s%n.MAX_SHEETS,u=this.bucketSizes[s];i(t,this.buckets.get(s).subarray(0,u),u)}}getActiveCount(){return this.activeCount}getTotalCount(){let i=0;for(let e=0;e<this.activeCount;e++)i+=this.bucketSizes[this.activeBuckets[e]];return i}clear(){this.buckets.clear(),this.bucketSizes.fill(0),this.activeCount=0}}
@@ -0,0 +1 @@
1
+ var h=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var f=(i,s)=>{for(var e in s)h(i,e,{get:s[e],enumerable:!0})},o=(i,s,e,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let a of l(s))!n.call(i,a)&&a!==e&&h(i,a,{get:()=>s[a],enumerable:!(r=y(s,a))||r.enumerable});return i};var b=i=>o(h({},"__esModule",{value:!0}),i);var d={};f(d,{ComponentStore:()=>u});module.exports=b(d);class u{constructor(s,e){this.component=s,this.maxEntities=e,this.stride=s.size,this.fieldKeys=s.fieldNames,this.fields=[],this.fieldIndexMap={},this.arrays=[];for(let r=0;r<this.fieldKeys.length;r++){const a=this.fieldKeys[r],t=s.schema[a];switch(this.fields.push(t),this.fieldIndexMap[a]=r,t.size){case 4:t.read.toString().includes("getFloat32")?this.arrays.push(new Float32Array(e)):t.read.toString().includes("getInt32")?this.arrays.push(new Int32Array(e)):this.arrays.push(new Uint32Array(e));break;case 2:this.arrays.push(new Uint16Array(e));break;case 1:this.arrays.push(new Uint8Array(e));break;default:this.arrays.push(new Uint8Array(e*t.size))}}this.reusableObject={};for(let r=0;r<this.fieldKeys.length;r++)this.reusableObject[this.fieldKeys[r]]=this.fields[r].toNil()}get(s){const e=this.fields.length;if(e===2)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][s],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][s];else if(e===3)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][s],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][s],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][s];else if(e===4)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][s],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][s],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][s],this.reusableObject[this.fieldKeys[3]]=this.arrays[3][s];else for(let r=0;r<e;r++)this.reusableObject[this.fieldKeys[r]]=this.arrays[r][s];return this.reusableObject}getMutable(s){const e={};return this.copyTo(s,e),e}copyTo(s,e){for(let r=0;r<this.fields.length;r++)e[this.fieldKeys[r]]=this.arrays[r][s]}set(s,e){const r=this.fields.length;if(r===2)this.arrays[0][s]=e[this.fieldKeys[0]],this.arrays[1][s]=e[this.fieldKeys[1]];else if(r===3)this.arrays[0][s]=e[this.fieldKeys[0]],this.arrays[1][s]=e[this.fieldKeys[1]],this.arrays[2][s]=e[this.fieldKeys[2]];else if(r===4)this.arrays[0][s]=e[this.fieldKeys[0]],this.arrays[1][s]=e[this.fieldKeys[1]],this.arrays[2][s]=e[this.fieldKeys[2]],this.arrays[3][s]=e[this.fieldKeys[3]];else for(let a=0;a<r;a++)this.arrays[a][s]=e[this.fieldKeys[a]]}update(s,e){for(const r in e){const a=this.fieldIndexMap[r];this.arrays[a][s]=e[r]}}clear(s){for(let e=0;e<this.fields.length;e++)this.arrays[e][s]=this.fields[e].toNil()}getRawArrays(){return this.arrays}getFieldArray(s){const e=this.fieldIndexMap[s];return this.arrays[e]}getStride(){return this.stride}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var f=(n,e)=>{for(var o in e)a(n,o,{get:e[o],enumerable:!0})},p=(n,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of s(e))!d.call(n,t)&&t!==o&&a(n,t,{get:()=>e[t],enumerable:!(r=m(e,t))||r.enumerable});return n};var T=n=>p(a({},"__esModule",{value:!0}),n);var l={};f(l,{defineComponent:()=>C});module.exports=T(l);var c=require("../core/pooled-codec");function y(n){let e=0;for(const o of Object.keys(n))e+=n[o].size;return e}function C(n,e){const o=y(e),r=Object.keys(e),t=r.length,i=c.PooledCodec.array(e);return{name:n,schema:e,size:o,fieldCount:t,fieldNames:r,arrayCodec:i}}
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var l=(a,t)=>{for(var e in t)d(a,e,{get:t[e],enumerable:!0})},b=(a,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of u(t))!m.call(a,s)&&s!==e&&d(a,s,{get:()=>t[s],enumerable:!(n=p(t,s))||n.enumerable});return a};var x=a=>b(d({},"__esModule",{value:!0}),a);var C={};l(C,{EntityHandle:()=>r});module.exports=x(C);class r{constructor(t,e){this.world=t;this._id=e;this.isBatching=!1}static{this.batchArrays=[]}static{this.batchIndices=[]}static{this.batchValues=[]}static{this.batchLength=0}static{this.preparedComponents=[]}static{this.preparedCount=0}_reset(t){this._id=t}getComponentIndex(t){let e=t.__cachedIndex;return e===void 0&&(e=t.__worldIndex,t.__cachedIndex=e),e}field(t,e){const n=`__fieldCache_${String(e)}`;let s=t[n];if(s===void 0){const i=this.getComponentIndex(t);s=this.world.componentStoresArray[i].getFieldArray(e),t[n]=s}return s}add(t,e){return this.world.add(this._id,t,e),this}get(t){if(this.isBatching){const n=t.__batchCache;if(n!==void 0)return n}const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].get(this._id)}prepare(...t){if(this.isBatching){const e=r.preparedComponents;let n=r.preparedCount;for(let s=0;s<t.length;s++){const i=t[s],h=this.getComponentIndex(i),o=this.world.componentStoresArray[h].get(this._id);i.__batchCache=o,n<e.length?e[n]=i:e.push(i),n++}r.preparedCount=n}return this}update(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].update(this._id,e),this}setFields(t,e){const n=this.getComponentIndex(t),s=this.world.componentStoresArray[n],i=s.getMutable(this._id);return e(i),s.set(this._id,i),this}setField(t,e,n){const s=this.getComponentIndex(t),h=this.world.componentStoresArray[s].getFieldArray(e);if(this.isBatching){const o=r.batchLength;r.batchArrays[o]=h,r.batchIndices[o]=this._id,r.batchValues[o]=n,r.batchLength++}else h[this._id]=n;return this}getField(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].getFieldArray(e)[this._id]}set(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].set(this._id,e),this}has(t){return this.world.has(this._id,t)}remove(t){return this.world.remove(this._id,t),this}despawn(){this.world.despawn(this._id)}isAlive(){return this.world.isAlive(this._id)}get id(){return this._id}getMutable(t){const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].getMutable(this._id)}beginUpdate(){return this.isBatching=!0,r.batchLength=0,this}flush(){const t=r.batchArrays,e=r.batchIndices,n=r.batchValues,s=r.batchLength;for(let o=0;o<s;o++)t[o][e[o]]=n[o];const i=r.preparedComponents,h=r.preparedCount;for(let o=0;o<h;o++){const c=i[o];c.__batchCache=void 0}return this.isBatching=!1,r.batchLength=0,r.preparedCount=0,this}}
@@ -0,0 +1 @@
1
+ var p=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var l=(e,o)=>{for(var n in o)p(e,n,{get:o[n],enumerable:!0})},a=(e,o,n,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of i(o))!x.call(e,t)&&t!==n&&p(e,t,{get:()=>o[t],enumerable:!(r=d(o,t))||r.enumerable});return e};var E=e=>a(p({},"__esModule",{value:!0}),e);var W={};l(W,{ComponentStore:()=>y.ComponentStore,EntityHandle:()=>C.EntityHandle,World:()=>f.World,defineComponent:()=>m.defineComponent});module.exports=E(W);var m=require("./component"),y=require("./component-store"),f=require("./world"),C=require("./entity-handle");
@@ -0,0 +1 @@
1
+ var g=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var v=(l,e)=>{for(var n in e)g(l,n,{get:e[n],enumerable:!0})},I=(l,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of w(e))!k.call(l,s)&&s!==n&&g(l,s,{get:()=>e[s],enumerable:!(i=F(e,s))||i.enumerable});return l};var E=l=>I(g({},"__esModule",{value:!0}),l);var P={};v(P,{ExecutableSystem:()=>h,SystemBuilder:()=>c});module.exports=E(P);class c{constructor(e,n,i,s,t){this.world=e;this.components=n;this.fieldMappings=i;this.userCallback=s;this.conditionPredicate=t}query(...e){return new c(this.world,e,this.fieldMappings,this.userCallback,this.conditionPredicate)}fields(e){return new c(this.world,this.components,e,this.userCallback,this.conditionPredicate)}when(e){if(!this.fieldMappings)throw new Error("Must call .fields() before .when()");const n={};for(let t=0;t<this.components.length;t++){const r=this.components[t],o=this.fieldMappings[t];if(!o)continue;const a=Object.keys(o)[0],u=o[a];for(const m of u){const x=`${a}_${m}`,d=this.world.getFieldArray(r,m);n[x]=d}}const i={eid:0};for(const t in n){const r=n[t];Object.defineProperty(i,t,{get(){return r[this.eid]},set(o){r[this.eid]=o},enumerable:!0,configurable:!1}),i[`${t}_array`]=r}Object.seal(i);const s=e;return new c(this.world,this.components,this.fieldMappings,this.userCallback,s)}run(e){return new c(this.world,this.components,this.fieldMappings,e,this.conditionPredicate).buildAndRegister()}buildAndRegister(){if(!this.userCallback)throw new Error("System callback must be set");if(!this.fieldMappings)throw new Error("Field mappings must be set");const e=this.world,n=this.components,i=this.fieldMappings,s=this.userCallback,t={},r={},o=[];for(let d=0;d<n.length;d++){const y=n[d],p=i[d];if(!p)continue;const f=Object.keys(p)[0],M=p[f];o.push(f),r[f]=y,t[f]={};for(const C of M){const b=e.getFieldArray(y,C);t[f][C]=b}}const a=[];for(const d of o){const y=t[d];for(const p in y)a.push({prop:`${d}_${p}`,array:y[p]})}e.query(...n);const u=e._getQueryMaskKey(n),m=e.getQueryMask(n),x=new h(e,n,s,a,u,m,this.conditionPredicate);return e._registerSystem(x),x}}class h{constructor(e,n,i,s,t,r,o){this.world=e;this.components=n;this.userCallback=i;this.fieldDescs=s;this.queryMaskKey=t;this.queryMask=r;this.conditionPredicate=o;this.proxyEntity=this.createProxyEntity()}execute(e){const n=this.world._queryByMaskKey(this.queryMaskKey,this.queryMask),i=this.userCallback,s=this.world,t=this.proxyEntity,r=n.length;if(this.conditionPredicate){const o=this.conditionPredicate;for(let a=0;a<r;a++)t.eid=n[a],o(t)&&i(t,e,s)}else for(let o=0;o<r;o++)t.eid=n[o],i(t,e,s)}createProxyEntity(){const e=this.world,n={eid:0,despawn(){e.despawn(this.eid)}};for(let i=0;i<this.fieldDescs.length;i++){const{prop:s,array:t}=this.fieldDescs[i];n[`${s}_array`]=t,Object.defineProperty(n,s,{get(){return t[this.eid]},set(r){t[this.eid]=r},enumerable:!0,configurable:!1})}return Object.seal(n),Object.preventExtensions(n),n}getComponents(){return this.components}}
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var l=(s,e)=>{for(var t in e)i(s,t,{get:e[t],enumerable:!0})},o=(s,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of S(e))!u.call(s,r)&&r!==t&&i(s,r,{get:()=>e[r],enumerable:!(m=y(e,r))||m.enumerable});return s};var n=s=>o(i({},"__esModule",{value:!0}),s);var g={};l(g,{WorldSystems:()=>a});module.exports=n(g);var d=require("./system-builder");class a{constructor(){this.registeredSystems=[]}addSystem(){return new d.SystemBuilder(this,[],void 0,void 0)}runSystems(e){for(let t=0;t<this.registeredSystems.length;t++)this.registeredSystems[t].execute(e)}_registerSystem(e){this.registeredSystems.push(e)}}
@@ -0,0 +1 @@
1
+ var C=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var I=(d,l)=>{for(var t in l)C(d,t,{get:l[t],enumerable:!0})},T=(d,l,t,e)=>{if(l&&typeof l=="object"||typeof l=="function")for(let n of k(l))!b.call(d,n)&&n!==t&&C(d,n,{get:()=>l[n],enumerable:!(e=A(l,n))||e.enumerable});return d};var B=d=>T(C({},"__esModule",{value:!0}),d);var U={};I(U,{World:()=>$});module.exports=B(U);var g=require("../core/generate-id"),x=require("./component-store"),M=require("./entity-handle"),w=require("./world-systems");class $ extends w.WorldSystems{constructor(t){super();this.nextEntityId=0;this.freeEntityHead=0;this.freeEntityTail=0;this.freeEntityCount=0;this.freeEntityMask=0;this.aliveEntitiesArray=[];this.numMaskWords=0;this.components=[];this.queryResultBuffers={};this.archetypeVersion=0;this.queryCacheVersions={};this.queryMaskCache={};this.despawnedCount=0;this.worldId=(0,g.generateId)({prefix:"world_"});this.maxEntities=t.maxEntities??1e4,this.numMaskWords=Math.ceil(t.components.length/32),this.componentMasks=[];for(let n=0;n<this.numMaskWords;n++)this.componentMasks.push(new Uint32Array(this.maxEntities));this.numMaskWords>0&&(this.componentMasks0=this.componentMasks[0]);const e=Math.pow(2,Math.ceil(Math.log2(this.maxEntities)));this.freeEntityIds=new Uint32Array(e),this.freeEntityMask=e-1,this.aliveEntitiesIndices=new Uint32Array(this.maxEntities),this.aliveEntityFlags=new Uint8Array(this.maxEntities),this.despawnedBuffer=new Uint32Array(this.maxEntities),this.componentStoresArray=new Array(t.components.length),t.components.forEach((n,s)=>{this.components.push(n),n.__worldIndex=s;const c=new x.ComponentStore(n,this.maxEntities);this.componentStoresArray[s]=c})}getComponentIndex(t){const e=t.__worldIndex;if(e===void 0){const n=this.components.map(s=>s.name).join(", ");throw new Error(`Component ${t.name} not registered in World[${this.worldId}]. Registered components: [${n}]. Did you forget to include it in the WorldConfig?`)}return e}setComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]|=1<<s}clearComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]&=~(1<<s)}hasComponentBit(t,e){const n=e>>>5,s=e&31;return(this.componentMasks[n][t]&1<<s)!==0}clearAllComponentBits(t){if(this.numMaskWords===1)this.componentMasks0[t]=0;else if(this.numMaskWords===2)this.componentMasks0[t]=0,this.componentMasks[1][t]=0;else if(this.numMaskWords===3)this.componentMasks0[t]=0,this.componentMasks[1][t]=0,this.componentMasks[2][t]=0;else for(let e=0;e<this.numMaskWords;e++)this.componentMasks[e][t]=0}matchesComponentMask(t,e){const n=e.length;if(n===1)return(this.componentMasks0[t]&e[0])===e[0];if(n===2)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1];if(n===3)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2];if(n===4)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2]&&(this.componentMasks[3][t]&e[3])===e[3];for(let s=0;s<n;s++)if((this.componentMasks[s][t]&e[s])!==e[s])return!1;return!0}getQueryMask(t){const e=t.map(i=>i.name).sort().join(","),n=this.queryMaskCache[e];if(n)return n;let s=-1;const c=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)return null;c.push(o),o>s&&(s=o)}const h=Math.floor(s/32)+1,p=new Array(h).fill(0);for(const i of c){const o=i>>>5,r=i&31;p[o]|=1<<r}return this.queryMaskCache[e]=p,p}maskToKey(t){let e="";for(let n=0;n<t.length;n++)t[n]!==0&&(e+=`${n}:${t[n].toString(36)},`);return e}_getQueryMaskKey(t){const e=this.getQueryMask(t);return e?this.maskToKey(e):""}_queryByMaskKey(t,e){let n=this.queryResultBuffers[t];if(n||(n=[],this.queryResultBuffers[t]=n),this.queryCacheVersions[t]===this.archetypeVersion)return n;const s=this.aliveEntitiesArray,c=s.length,h=e.length;let p=0;if(h===1){const i=e[0],o=this.componentMasks0;for(let r=0;r<c;r++){const a=s[r];(o[a]&i)===i&&(n[p++]=a)}}else if(h===2){const i=e[0],o=e[1],r=this.componentMasks0,a=this.componentMasks[1];for(let m=0;m<c;m++){const y=s[m];(r[y]&i)===i&&(a[y]&o)===o&&(n[p++]=y)}}else if(h===3){const i=e[0],o=e[1],r=e[2],a=this.componentMasks0,m=this.componentMasks[1],y=this.componentMasks[2];for(let f=0;f<c;f++){const u=s[f];(a[u]&i)===i&&(m[u]&o)===o&&(y[u]&r)===r&&(n[p++]=u)}}else if(h===4){const i=e[0],o=e[1],r=e[2],a=e[3],m=this.componentMasks0,y=this.componentMasks[1],f=this.componentMasks[2],u=this.componentMasks[3];for(let v=0;v<c;v++){const E=s[v];(m[E]&i)===i&&(y[E]&o)===o&&(f[E]&r)===r&&(u[E]&a)===a&&(n[p++]=E)}}else{const i=this.componentMasks;t:for(let o=0;o<c;o++){const r=s[o];for(let a=0;a<h;a++)if((i[a][r]&e[a])!==e[a])continue t;n[p++]=r}}return n.length=p,this.queryCacheVersions[t]=this.archetypeVersion,n}spawn(){let t=this.nextEntityId;if(this.freeEntityCount>0?(t=this.freeEntityIds[this.freeEntityTail],this.freeEntityTail=this.freeEntityTail+1&this.freeEntityMask,this.freeEntityCount--):this.nextEntityId++,t>=this.maxEntities)throw new Error(`Maximum entities (${this.maxEntities}) reached. Current alive: ${this.aliveEntitiesArray.length}, Free list: ${this.freeEntityCount}`);return this.aliveEntityFlags[t]=1,this.aliveEntitiesIndices[t]=this.aliveEntitiesArray.length,this.aliveEntitiesArray.push(t),this.clearAllComponentBits(t),this.invalidateQueryCache(),t}despawn(t){if(this.aliveEntityFlags[t]===0)return;this.despawnedBuffer[this.despawnedCount++]=t,this.aliveEntityFlags[t]=0;const e=this.aliveEntitiesIndices[t],n=this.aliveEntitiesArray.length-1;if(e!==n){const h=this.aliveEntitiesArray[n];this.aliveEntitiesArray[e]=h,this.aliveEntitiesIndices[h]=e}this.aliveEntitiesArray.pop();const s=this.componentStoresArray,c=this.components.length;for(let h=0;h<c;h++)this.hasComponentBit(t,h)&&s[h].clear(t);this.clearAllComponentBits(t),this.freeEntityIds[this.freeEntityHead]=t,this.freeEntityHead=this.freeEntityHead+1&this.freeEntityMask,this.freeEntityCount++,this.invalidateQueryCache()}isAlive(t){return this.aliveEntityFlags[t]===1}getDespawned(){return this.despawnedBuffer.subarray(0,this.despawnedCount)}flushDespawned(){this.despawnedCount=0}invalidateQueryCache(){this.archetypeVersion++}add(t,e,n){if(this.aliveEntityFlags[t]===0)throw new Error(`Cannot add component ${e.name} to entity ${t}: entity is not alive (was it despawned?). Current alive entities: ${this.aliveEntitiesArray.length}`);const s=this.getComponentIndex(e),c=this.componentStoresArray[s];this.setComponentBit(t,s),c.set(t,n),this.invalidateQueryCache()}remove(t,e){const n=e.__worldIndex;if(n===void 0)return;this.clearComponentBit(t,n);const s=this.componentStoresArray[n];s&&s.clear(t),this.invalidateQueryCache()}has(t,e){const n=e.__worldIndex;return n===void 0?!1:this.hasComponentBit(t,n)}get(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n)){const s=this.getEntityComponentNames(t);throw new Error(`Cannot get component ${e.name} from entity ${t}: entity does not have this component. Entity has: [${s.join(", ")}]. Did you forget to call world.add()?`)}return this.componentStoresArray[n].get(t)}getMutable(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n))throw new Error(`Entity ${t} does not have component ${e.name}`);return this.componentStoresArray[n].getMutable(t)}set(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Cannot set component ${e.name} on entity ${t}: entity does not have this component. Use add() first.`);this.componentStoresArray[s].set(t,n)}update(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Entity ${t} does not have component ${e.name}`);this.componentStoresArray[s].update(t,n)}query(...t){const e=this.getQueryMask(t);if(e===null)return[];const n=this.maskToKey(e);let s=this.queryResultBuffers[n];if(s||(s=[],this.queryResultBuffers[n]=s),this.queryCacheVersions[n]===this.archetypeVersion)return s;const c=this.aliveEntitiesArray,h=c.length,p=e.length;let i=0;if(p===1){const o=e[0],r=this.componentMasks0;for(let a=0;a<h;a++){const m=c[a];(r[m]&o)===o&&(s[i++]=m)}}else for(let o=0;o<h;o++){const r=c[o];this.matchesComponentMask(r,e)&&(s[i++]=r)}return s.length=i,this.queryCacheVersions[n]=this.archetypeVersion,s}getEntities(){return this.aliveEntitiesArray}getEntityCount(){return this.aliveEntitiesArray.length}getMaxEntities(){return this.maxEntities}getComponents(){return this.components}getEntityComponentNames(t){const e=[];for(let n=0;n<this.components.length;n++)this.hasComponentBit(t,n)&&e.push(this.components[n].name);return e}serialize(t,e){const n=e??Array.from(this.aliveEntitiesArray),s=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)continue;const r=this.componentStoresArray[o];if(!r)continue;const a=[];for(const m of n)this.has(m,i)&&a.push({entity:m,...r.getMutable(m)});if(a.length>0){const m=i.arrayCodec.encode(a);s.push(m)}}const c=s.reduce((i,o)=>i+o.length,0),h=new Uint8Array(c);let p=0;for(const i of s)h.set(i,p),p+=i.length;return h}deserialize(t,e){throw new Error("Deserialization not yet implemented")}getFieldArray(t,e){const n=this.getComponentIndex(t);return this.componentStoresArray[n].getFieldArray(e)}entity(t){return new M.EntityHandle(this,t)}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./loop"),module.exports);
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./loop"),module.exports);
@@ -0,0 +1 @@
1
+ var k=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var D=(i,t)=>{for(var e in t)k(i,e,{get:t[e],enumerable:!0})},f=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of g(t))!b.call(i,n)&&n!==e&&k(i,n,{get:()=>t[n],enumerable:!(a=E(t,n))||a.enumerable});return i};var S=i=>f(k({},"__esModule",{value:!0}),i);var L={};D(L,{GameLoop:()=>C});module.exports=S(L);var p=require("../../core"),h=require("../../core/input");class C{constructor(t){this.options=t;this.fps=0;this.status="stopped";this._tickData={deltaTime:0,tick:0,input:null};this._skipData={ticks:0};this._renderData={deltaTime:0,alpha:0,input:null};const e=new Set(["client","manual-client"]),a=new Set(["manual-client","manual-server"]);this._isClient=e.has(this.options.type),this._isManual=a.has(this.options.type);const n=["pre-tick","tick","post-tick","skip","start","stop","toggle-pause"];this._isClient&&n.push("render"),this.events=new p.EventSystem({events:n}),this._input=new h.InputManager;const l=this.events;if(this.ticker=new p.FixedTicker({rate:this.options.tickRate,onTick:(s,r=0)=>{const o=this._input.snapshot();this._tickData.deltaTime=s,this._tickData.tick=r,this._tickData.input=o,l.emit("pre-tick",this._tickData),this.options.onTick?.(s,r,o),l.emit("tick",this._tickData),l.emit("post-tick",this._tickData)},onTickSkipped:s=>{this._skipData.ticks=s,l.emit("skip",this._skipData)}}),this._isManual||(this._driver=(0,p.createDriver)(this.options.type,s=>{this.step(s)})),this._isClient){const s=this.events,r=Math.round(this.options.tickRate/2),o=new Array(r).fill(0);let m=0,d=performance.now(),v=0,c=0;s.on("tick",()=>{v=(v+1)%r;const T=performance.now(),_=T-d;if(_>0){const u=m*1e3/_;o[v]=u,c<r&&c++}m=0,d=T;let y=0;for(let u=0;u<c;u++)y+=o[u];this.fps=Math.round(y/c)}),s.on("render",()=>{m++})}}step(t){if(this.ticker.tick(t),this._isClient){const e=this._input.peek(),a=this.ticker.alpha;this.options.onRender?.(t,a,e),this._renderData.deltaTime=t,this._renderData.alpha=a,this._renderData.input=e,this.events.emit("render",this._renderData)}}pause(){this._driver&&this._driver.stop(),this.status="paused",this.events.emit("toggle-pause",{paused:!0,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}resume(){this._driver&&this._driver.start(),this.status="running",this.events.emit("toggle-pause",{paused:!1,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}start(){if(this._driver&&this._driver.start(),this.status="running",this.events.emit("start",{startedAt:Date.now()}),this._isClient){const t=new h.BrowserInputSource(document,document.body);this._input.listen(t)}}stop(){this._driver&&this._driver.stop(),this.ticker.resetTickCount(),this.status="stopped",this.events.emit("stop",{stoppedAt:Date.now()}),this._isClient&&this._input.unlisten()}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,e,p,x)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of c(e))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>e[m],enumerable:!(x=b(e,m))||x.enumerable});return f},r=(f,e,p)=>(t(f,e,"default"),p&&t(p,e,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);r(o,require("./core"),module.exports);r(o,require("./protocol"),module.exports);r(o,require("./net"),module.exports);r(o,require("./ecs"),module.exports);r(o,require("./game"),module.exports);r(o,require("./renderer"),module.exports);
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(r,e)=>{for(var s in e)n(r,s,{get:e[s],enumerable:!0})},p=(r,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of a(e))!l.call(r,i)&&i!==s&&n(r,i,{get:()=>e[i],enumerable:!(t=o(e,i))||t.enumerable});return r};var h=r=>p(n({},"__esModule",{value:!0}),r);var c={};d(c,{BrowserWebSocketClientTransport:()=>v});module.exports=h(c);class v{constructor(e){this.openHandler=null;this.messageHandler=null;this.closeHandler=null;this.errorHandler=null;this.isOpen=!1;this.pendingMessages=[];this.ws=new WebSocket(e),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{this.isOpen=!0;for(const s of this.pendingMessages)this.ws.send(s);this.pendingMessages=[],this.openHandler&&this.openHandler()},this.ws.onmessage=s=>{this.messageHandler&&s.data instanceof ArrayBuffer&&this.messageHandler(new Uint8Array(s.data))},this.ws.onclose=()=>{this.isOpen=!1,this.closeHandler&&this.closeHandler()},this.ws.onerror=()=>{this.errorHandler&&this.errorHandler(new Error("WebSocket error"))}}send(e){this.isOpen&&this.ws.readyState===WebSocket.OPEN?this.ws.send(e):this.ws.readyState===WebSocket.CONNECTING&&this.pendingMessages.push(e)}onMessage(e){this.messageHandler=e}onOpen(e){this.openHandler=e}onClose(e){this.closeHandler=e}onError(e){this.errorHandler=e}close(){this.ws.close()}}
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var u=(i,e)=>{for(var r in e)d(i,r,{get:e[r],enumerable:!0})},g=(i,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of f(e))!k.call(i,s)&&s!==r&&d(i,s,{get:()=>e[s],enumerable:!(t=v(e,s))||t.enumerable});return i};var S=i=>g(d({},"__esModule",{value:!0}),i);var y={};u(y,{BunWebSocketClientTransport:()=>c,BunWebSocketPeerTransport:()=>h,BunWebSocketServerTransport:()=>p});module.exports=S(y);var l=require("../../core/generate-id/generate-id");class c{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e,this.setupHandlers()}send(e){this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}setupHandlers(){this.socket.binaryType="arraybuffer",this.socket.addEventListener("message",e=>{if(e.data instanceof ArrayBuffer){const r=new Uint8Array(e.data);for(const t of this.messageHandlers)t(r)}else{const r=new Error(`Unexpected message type: ${typeof e.data}`);for(const t of this.errorHandlers)t(r)}}),this.socket.addEventListener("close",()=>{for(const e of this.closeHandlers)e()}),this.socket.addEventListener("error",()=>{const e=new Error("WebSocket error");for(const r of this.errorHandlers)r(e)})}static connect(e){return new Promise((r,t)=>{const s=new WebSocket(e),o=new c(s);s.addEventListener("open",()=>{r(o)}),s.addEventListener("error",n=>{t(n)})})}}class h{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e}send(e){this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}_handleOpen(){}_handleMessage(e){for(const r of this.messageHandlers)r(e)}_handleClose(){for(const e of this.closeHandlers)e()}_handleError(e){for(const r of this.errorHandlers)r(e)}}class p{constructor(e){this.peers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.server=e}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}getPeer(e){return this.peers.get(e)}getPeerIds(){return Array.from(this.peers.keys())}close(){this.server.stop(),this.peers.clear()}_registerPeer(e){const r=(0,l.generateId)({prefix:"peer_"}),t=new h(e);this.peers.set(r,t);for(const s of this.connectionHandlers)s(t,r);return r}_handlePeerMessage(e,r){const t=this.peers.get(e);t&&t._handleMessage(r)}_handlePeerDisconnection(e){const r=this.peers.get(e);if(r){r._handleClose(),this.peers.delete(e);for(const t of this.disconnectionHandlers)t(e)}}_handlePeerConnection(e){const r=this.peers.get(e);if(r)for(const t of this.connectionHandlers)t(r,e)}static create(e){const r=new WeakMap;let t;const s=Bun.serve({port:e,fetch(o,n){if(!n.upgrade(o))return new Response("Expected WebSocket connection",{status:400})},websocket:{open(o){const n=t._registerPeer(o);r.set(o,n),t._handlePeerConnection(n),t.connectionHandlers.forEach(a=>a(t.getPeer(n),n))},message(o,n){const a=r.get(o);a&&n instanceof Uint8Array?t._handlePeerMessage(a,n):a&&n instanceof ArrayBuffer&&t._handlePeerMessage(a,new Uint8Array(n))},close(o){const n=r.get(o);n&&(t._handlePeerDisconnection(n),r.delete(o))}}});return t=new p(s),t}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var s in e)a(o,s,{get:e[s],enumerable:!0})},b=(o,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!u.call(o,r)&&r!==s&&a(o,r,{get:()=>e[r],enumerable:!(t=f(e,r))||t.enumerable});return o};var h=o=>b(a({},"__esModule",{value:!0}),o);var y={};c(y,{MessageWrapperPool:()=>z});module.exports=h(y);var n=require("../core/pooled-codec/pooled-codec");class z{constructor(e=256,s=!1){this.pools=new Map;this.sizeClass=e,this.zeroBuffersOnRelease=s}wrap(e,s){const t=1+s.byteLength,r=Math.ceil(t/this.sizeClass)*this.sizeClass;let i=this.pools.get(r);i||(i=new n.ObjectPool(()=>new Uint8Array(r)),this.pools.set(r,i));const l=i.acquire();return l[0]=e,l.set(s,1),l.subarray(0,t)}release(e){const s=e.buffer.byteLength;if(s%this.sizeClass!==0)return;const t=this.pools.get(s);if(!t)return;const r=new Uint8Array(e.buffer);this.zeroBuffersOnRelease&&r.fill(0),t.release(r)}getStats(){return{poolSizes:Array.from(this.pools.keys()).sort((e,s)=>e-s)}}clear(){this.pools.clear()}}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(i,t)=>{for(var e in t)a(i,e,{get:t[e],enumerable:!0})},g=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of d(t))!l.call(i,s)&&s!==e&&a(i,s,{get:()=>t[s],enumerable:!(r=c(t,s))||r.enumerable});return i};var f=i=>g(a({},"__esModule",{value:!0}),i);var m={};p(m,{ClientNetwork:()=>y});module.exports=f(m);var o=require("./types");class y{constructor(t){this.snapshotHandlers=new Map;this.rpcHandlers=new Map;this.connectHandlers=[];this.disconnectHandlers=[];this.errorHandlers=[];this.connected=!1;this.lastSentIntents=new Map;this.messageCount=0;this.messageCountWindow=Date.now();this.heartbeatTimer=null;this.lastMessageReceivedAt=Date.now();this.transport=t.transport,this.intentRegistry=t.intentRegistry,this.snapshotRegistry=t.snapshotRegistry,this.rpcRegistry=t.rpcRegistry,this.config={maxMessageSize:t.config?.maxMessageSize??65536,debug:t.config?.debug??!1,enableBufferPooling:t.config?.enableBufferPooling??!0,maxMessagesPerSecond:t.config?.maxMessagesPerSecond??60,maxSendQueueSize:t.config?.maxSendQueueSize??100,heartbeatInterval:t.config?.heartbeatInterval??3e4,heartbeatTimeout:t.config?.heartbeatTimeout??6e4,lagSimulation:t.config?.lagSimulation},this.lagSimulation=t.config?.lagSimulation,this.setupTransportHandlers(),this.setupHeartbeat()}hasIntentChanged(t,e){const r=this.lastSentIntents.get(t.kind);if(!r)return!0;if(e)return e(r,t);const{tick:s,...n}=r,{tick:u,...h}=t;return JSON.stringify(n)!==JSON.stringify(h)}sendIntent(t){if(!this.connected){this.log("Cannot send intent: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping intent");return}try{const e=this.intentRegistry.encode(t),r=new Uint8Array(1+e.byteLength);r[0]=o.MessageType.INTENT,r.set(e,1),this.transport.send(r),this.lastSentIntents.set(t.kind,{...t}),this.log(`Sent intent (kind: ${t.kind}, tick: ${t.tick})`)}catch(e){this.log(`Failed to send intent: ${e}`)}}onSnapshot(t,e){let r=this.snapshotHandlers.get(t);return r||(r=[],this.snapshotHandlers.set(t,r)),r.push(e),()=>{const s=this.snapshotHandlers.get(t);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}sendRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");if(!this.connected){this.log("Cannot send RPC: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping RPC");return}try{const r=this.rpcRegistry.encode(t,e),s=new Uint8Array(1+r.byteLength);s[0]=o.MessageType.CUSTOM,s.set(r,1),this.transport.send(s),this.log(`Sent RPC (method: ${t.method})`)}catch(r){this.log(`Failed to send RPC: ${r}`)}}onRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");let r=this.rpcHandlers.get(t.method);return r||(r=[],this.rpcHandlers.set(t.method,r)),r.push(e),()=>{const s=this.rpcHandlers.get(t.method);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}onConnect(t){return this.connectHandlers.push(t),()=>{const e=this.connectHandlers.indexOf(t);e>-1&&this.connectHandlers.splice(e,1)}}onDisconnect(t){return this.disconnectHandlers.push(t),()=>{const e=this.disconnectHandlers.indexOf(t);e>-1&&this.disconnectHandlers.splice(e,1)}}onError(t){return this.errorHandlers.push(t),()=>{const e=this.errorHandlers.indexOf(t);e>-1&&this.errorHandlers.splice(e,1)}}isConnected(){return this.connected}disconnect(){return this.log("Disconnecting..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onOpen?this.transport.onOpen(()=>{this.log("Connected to server"),this.connected=!0,this.lastMessageReceivedAt=Date.now(),this.notifyConnectHandlers()}):(this.connected=!0,this.lastMessageReceivedAt=Date.now()),this.transport.onMessage(t=>{const e=this.getLagDelay();if(e>0){const r=new Uint8Array(t);setTimeout(()=>{this.handleMessage(r)},e)}else this.handleMessage(t)}),this.transport.onClose(()=>{this.handleDisconnection()}),this.transport.onError&&this.transport.onError(t=>{this.handleError(t)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeat()},this.config.heartbeatInterval))}checkHeartbeat(){const e=Date.now()-this.lastMessageReceivedAt;if(e>this.config.heartbeatTimeout){this.log(`Server timed out (no message for ${e}ms)`),this.disconnect();return}try{const r=new Uint8Array([o.MessageType.HEARTBEAT]);this.transport.send(r)}catch(r){this.log(`Failed to send heartbeat: ${r}`)}}handleMessage(t){if(this.lastMessageReceivedAt=Date.now(),t.byteLength===0){this.log("Received empty message from server");return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const e=t[0],r=t.subarray(1);switch(e){case o.MessageType.SNAPSHOT:this.handleSnapshot(r);break;case o.MessageType.HEARTBEAT:this.log("Received heartbeat from server");break;case o.MessageType.CUSTOM:this.handleRPC(r);break;default:this.log(`Unknown message type: ${e}`)}}handleSnapshot(t){try{const e=this.snapshotRegistry.decode(t);this.log(`Received snapshot (type: ${e.type}, tick: ${e.snapshot.tick})`);const r=this.snapshotHandlers.get(e.type);if(r&&r.length>0)for(const s of r)try{s(e.snapshot)}catch(n){this.log(`Error in snapshot handler: ${n}`)}else this.log(`No handler registered for snapshot type: ${e.type}`);this.snapshotRegistry.release(e.type,e.snapshot.updates)}catch(e){this.log(`Failed to decode snapshot: ${e}`)}}handleRPC(t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}try{const e=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${e.method})`);const r=this.rpcHandlers.get(e.method);if(r&&r.length>0)for(const s of r)try{s(e.data)}catch(n){this.log(`Error in RPC handler: ${n}`)}else this.log(`No handler registered for RPC method: ${e.method}`);this.rpcRegistry.release(e.method,e.data)}catch(e){this.log(`Failed to decode RPC: ${e}`)}}handleDisconnection(){this.log("Disconnected from server"),this.connected=!1,this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.notifyDisconnectHandlers()}notifyConnectHandlers(){for(const t of this.connectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in connect handler: ${e}`)}}notifyDisconnectHandlers(){for(const t of this.disconnectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in disconnect handler: ${e}`)}}handleError(t){this.log(`Transport error: ${t.message}`),this.notifyErrorHandlers(t)}notifyErrorHandlers(t){for(const e of this.errorHandlers)try{e(t)}catch(r){this.log(`Error in error handler: ${r}`)}}checkRateLimit(){if(this.config.maxMessagesPerSecond===0)return!0;const t=Date.now(),e=Math.floor(t/1e3)*1e3;return this.messageCountWindow!==e&&(this.messageCountWindow=e,this.messageCount=0),this.messageCount>=this.config.maxMessagesPerSecond?!1:(this.messageCount++,!0)}getLagDelay(){if(!this.lagSimulation)return 0;if(typeof this.lagSimulation=="number")return this.lagSimulation;const{min:t,max:e}=this.lagSimulation;return t+Math.random()*(e-t)}log(t){this.config.debug&&console.log(`[ClientNetwork] ${t}`)}}
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var M=(p,e)=>{for(var t in e)s(p,t,{get:e[t],enumerable:!0})},x=(p,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let f of i(e))!y.call(p,f)&&f!==t&&s(p,f,{get:()=>e[f],enumerable:!(a=g(e,f))||a.enumerable});return p},o=(p,e,t)=>(x(p,e,"default"),t&&x(t,e,"default"));var P=p=>x(s({},"__esModule",{value:!0}),p);var r={};M(r,{MessagePriority:()=>m.MessagePriority,MessageType:()=>m.MessageType});module.exports=P(r);o(r,require("./types"),module.exports);o(r,require("./server"),module.exports);o(r,require("./client"),module.exports);o(r,require("./adapters/bun-websocket"),module.exports);o(r,require("./buffer-pool"),module.exports);o(r,require("./validators"),module.exports);var m=require("./types");
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var P=(d,e)=>{for(var t in e)c(d,t,{get:e[t],enumerable:!0})},T=(d,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!S.call(d,r)&&r!==t&&c(d,r,{get:()=>e[r],enumerable:!(s=m(e,r))||s.enumerable});return d};var v=d=>T(c({},"__esModule",{value:!0}),d);var k={};P(k,{ServerNetwork:()=>R});module.exports=v(k);var h=require("./types"),u=require("./buffer-pool");class R{constructor(e){this.peers=new Map;this.peerSnapshotRegistries=new Map;this.lastProcessedClientTick=new Map;this.lastSnapshotHashes=new Map;this.intentHandlers=new Map;this.anyIntentHandlers=[];this.rpcHandlers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.messagePool=null;this.heartbeatTimer=null;this.transport=e.transport,this.intentRegistry=e.intentRegistry,this.createPeerSnapshotRegistry=e.createPeerSnapshotRegistry,this.rpcRegistry=e.rpcRegistry,this.config={maxMessageSize:e.config?.maxMessageSize??65536,debug:e.config?.debug??!1,maxMessagesPerSecond:e.config?.maxMessagesPerSecond??100,maxSendQueueSize:e.config?.maxSendQueueSize??100,enableBufferPooling:e.config?.enableBufferPooling??!0,heartbeatInterval:e.config?.heartbeatInterval??3e4,heartbeatTimeout:e.config?.heartbeatTimeout??6e4,lagSimulation:e.config?.lagSimulation??0},this.config.enableBufferPooling&&(this.messagePool=new u.MessageWrapperPool),this.setupTransportHandlers(),this.setupHeartbeat()}getPeerSnapshotRegistry(e){return this.peerSnapshotRegistries.get(e)}onIntent(e,t,s){let r=this.intentHandlers.get(e.kind);r||(r=[],this.intentHandlers.set(e.kind,r));const n=(i,o)=>{if(s&&!s(i,o)){this.log(`Intent validation failed for peer ${i}, kind ${o.kind}`);return}let a=this.lastProcessedClientTick.get(i);a||(a=new Map,this.lastProcessedClientTick.set(i,a)),a.set(o.kind,o.tick),t(i,o)};return r.push(n),()=>{const i=this.intentHandlers.get(e.kind);if(i){const o=i.indexOf(n);o>-1&&i.splice(o,1)}}}onAnyIntent(e){return this.anyIntentHandlers.push(e),()=>{const t=this.anyIntentHandlers.indexOf(e);t>-1&&this.anyIntentHandlers.splice(t,1)}}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}sendRPC(e,t,s,r=h.MessagePriority.NORMAL){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");const n=this.peers.get(e);if(!n){this.log(`Cannot send RPC to unknown peer: ${e}`);return}try{const i=this.rpcRegistry.encode(t,s);let o;if(this.messagePool?o=this.messagePool.wrap(h.MessageType.CUSTOM,i):(o=new Uint8Array(1+i.byteLength),o[0]=h.MessageType.CUSTOM,o.set(i,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,o,r),this.messagePool&&this.messagePool.release(o);return}this.sendMessageToPeer(n,o),this.messagePool&&this.messagePool.release(o),this.log(`Sent RPC (method: ${t.method}) to peer: ${e}`)}catch(i){this.log(`Failed to send RPC to peer ${e}: ${i}`)}}sendRpcBroadcast(e,t,s=h.MessagePriority.NORMAL){for(const r of this.getPeerIds())this.sendRPC(r,e,t,s)}onRPC(e,t){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");let s=this.rpcHandlers.get(e.method);return s||(s=[],this.rpcHandlers.set(e.method,s)),s.push(t),()=>{const r=this.rpcHandlers.get(e.method);if(r){const n=r.indexOf(t);n>-1&&r.splice(n,1)}}}sendSnapshotToPeer(e,t,s,r=h.MessagePriority.NORMAL){const n=this.peers.get(e);if(!n){this.log(`Cannot send snapshot to unknown peer: ${e}`);return}const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a;if(this.messagePool?a=this.messagePool.wrap(h.MessageType.SNAPSHOT,o):(a=new Uint8Array(1+o.byteLength),a[0]=h.MessageType.SNAPSHOT,a.set(o,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,a,r),this.messagePool&&this.messagePool.release(a);return}this.sendMessageToPeer(n,a),n.lastSentTick=s.tick,this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`)}sendSnapshotToPeerIfChanged(e,t,s,r=h.MessagePriority.NORMAL){const n=this.peers.get(e);if(!n)return this.log(`Cannot send snapshot to unknown peer: ${e}`),!1;const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a=this.lastSnapshotHashes.get(e);a||(a=new Map,this.lastSnapshotHashes.set(e,a));const f=o.subarray(5),l=this.hashBinary(f),p=a.get(t);if(p===void 0||l!==p){let g;return this.messagePool?g=this.messagePool.wrap(h.MessageType.SNAPSHOT,o):(g=new Uint8Array(1+o.byteLength),g[0]=h.MessageType.SNAPSHOT,g.set(o,1)),n.isBackpressured||n.sendQueue.length>0?(this.queueMessage(n,g,r),this.messagePool&&this.messagePool.release(g)):this.sendMessageToPeer(n,g),n.lastSentTick=s.tick,a.set(t,l),this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`),!0}return this.log(`Skipped snapshot (type: ${t}) to peer ${e} - no change detected`),!1}hashBinary(e){let t=2166136261;for(let s=0;s<e.length;s++)t^=e[s],t=Math.imul(t,16777619);return t>>>0}queueMessage(e,t,s){const r={data:new Uint8Array(t),priority:s,timestamp:Date.now()};if(e.sendQueue.length>=this.config.maxSendQueueSize){e.sendQueue.sort((o,a)=>o.priority-a.priority);const i=e.sendQueue.shift();this.log(`Send queue full for peer ${e.peerId}, dropping ${h.MessagePriority[i.priority]} priority message`)}let n=e.sendQueue.length;for(let i=0;i<e.sendQueue.length;i++)if(r.priority>e.sendQueue[i].priority){n=i;break}e.sendQueue.splice(n,0,r)}sendMessageToPeer(e,t){this.trackBandwidth(e,t.byteLength);const s=e.transport.send(t);this.messagePool?s instanceof Promise?s.then(()=>{this.messagePool.release(t),this.flushSendQueue(e.peerId)}).catch(()=>{e.isBackpressured=!0,this.messagePool.release(t),this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)}):this.messagePool.release(t):s instanceof Promise&&s.catch(()=>{e.isBackpressured=!0,this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)})}flushSendQueue(e){const t=this.peers.get(e);if(!t||t.sendQueue.length===0)return;t.isBackpressured=!1;const s=10;let r=0;for(;t.sendQueue.length>0&&r<s;){const n=t.sendQueue.shift();if(this.sendMessageToPeer(t,n.data),r++,t.isBackpressured)break}t.sendQueue.length>0&&this.log(`Peer ${e} still has ${t.sendQueue.length} queued messages`)}trackBandwidth(e,t){const s=Date.now(),r=Math.floor(s/1e3)*1e3;e.bandwidthWindow!==r&&(e.bandwidthWindow=r,e.bytesSent=0),e.bytesSent+=t}broadcastSnapshot(e,t,s,r=h.MessagePriority.NORMAL){for(const n of this.peers.keys())s&&!s(n)||this.sendSnapshotToPeer(n,e,t,r)}broadcastSnapshotWithCustomization(e,t,s,r=h.MessagePriority.NORMAL){for(const n of this.peers.keys()){const i=s(n,t);this.sendSnapshotToPeer(n,e,i,r)}}getPeerIds(){return Array.from(this.peers.keys())}getPeerState(e){return this.peers.get(e)}setPeerMetadata(e,t,s){const r=this.peers.get(e);r&&(r.metadata[t]=s)}getPeerBandwidth(e){const t=this.peers.get(e);return t?t.bytesSent:0}getTotalBandwidth(){let e=0;for(const t of this.peers.values())e+=t.bytesSent;return e}isPeerBackpressured(e){const t=this.peers.get(e);return t?t.isBackpressured||t.sendQueue.length>0:!1}getConfirmedClientTick(e,t){const s=this.lastProcessedClientTick.get(e);return s?s.get(t)??0:0}setConfirmedClientTick(e,t,s){let r=this.lastProcessedClientTick.get(e);r||(r=new Map,this.lastProcessedClientTick.set(e,r)),r.set(t,s)}close(){return this.log("Closing server..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onConnection((e,t)=>{this.handleConnection(e,t)}),this.transport.onDisconnection(e=>{this.handleDisconnection(e)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeats()},this.config.heartbeatInterval))}checkHeartbeats(){const e=Date.now(),t=new Uint8Array([h.MessageType.HEARTBEAT]);for(const[s,r]of this.peers.entries()){const n=e-r.lastMessageReceivedAt;if(n>this.config.heartbeatTimeout){this.log(`Peer ${s} timed out (no message for ${n}ms)`),r.transport.close();continue}try{r.transport.send(t),this.trackBandwidth(r,t.byteLength)}catch(i){this.log(`Failed to send heartbeat to peer ${s}: ${i}`)}}}handleConnection(e,t){this.log(`Peer connected: ${t}`);const s=Date.now(),r={peerId:t,transport:e,lastSentTick:0,connectedAt:s,metadata:{},messageCount:0,messageCountWindow:s,sendQueue:[],bytesSent:0,bandwidthWindow:s,isBackpressured:!1,lastMessageReceivedAt:s};this.peers.set(t,r);const n=this.createPeerSnapshotRegistry();this.peerSnapshotRegistries.set(t,n),this.lastProcessedClientTick.set(t,new Map),e.onMessage(i=>{this.handlePeerMessage(t,i)});for(const i of this.connectionHandlers)try{i(t)}catch(o){this.config.debug&&console.error(`[ServerNetwork] Error in connection handler: ${o}`)}}handleDisconnection(e){this.log(`Peer disconnected: ${e}`),this.peers.delete(e),this.peerSnapshotRegistries.delete(e),this.lastProcessedClientTick.delete(e),this.lastSnapshotHashes.delete(e);for(const t of this.disconnectionHandlers)try{t(e)}catch(s){this.config.debug&&console.error(`[ServerNetwork] Error in disconnection handler: ${s}`)}}handlePeerMessage(e,t){const s=this.peers.get(e);if(s&&(s.lastMessageReceivedAt=Date.now()),t.byteLength===0){this.log(`Received empty message from peer ${e}`);return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message from peer ${e} exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const r=t[0],n=t.subarray(1);switch(r){case h.MessageType.INTENT:this.handleIntent(e,n);break;case h.MessageType.HEARTBEAT:this.log(`Received heartbeat from peer ${e}`);break;case h.MessageType.CUSTOM:this.handleRPC(e,n);break;default:this.log(`Unknown message type ${r} from peer ${e}`)}}handleIntent(e,t){if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping intent`);return}try{const s=this.intentRegistry.decode(t);this.log(`Received intent (kind: ${s.kind}) from peer ${e}`);for(const n of this.anyIntentHandlers)try{n(e,s)}catch(i){this.log(`Error in global intent handler: ${i}`)}const r=this.intentHandlers.get(s.kind);if(r&&r.length>0)for(const n of r)try{n(e,s)}catch(i){this.log(`Error in intent handler: ${i}`)}else this.log(`No handler registered for intent kind: ${s.kind}`)}catch(s){this.log(`Failed to decode intent from peer ${e}: ${s}`)}}handleRPC(e,t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping RPC`);return}try{const s=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${s.method}) from peer ${e}`);const r=this.rpcHandlers.get(s.method);if(r&&r.length>0)for(const n of r)try{n(e,s.data)}catch(i){this.log(`Error in RPC handler: ${i}`)}else this.log(`No handler registered for RPC method: ${s.method}`)}catch(s){this.log(`Failed to decode RPC from peer ${e}: ${s}`)}}checkRateLimit(e){if(this.config.maxMessagesPerSecond===0)return!0;const t=this.peers.get(e);if(!t)return!1;const s=Date.now(),r=Math.floor(s/1e3)*1e3;return t.messageCountWindow!==r&&(t.messageCountWindow=r,t.messageCount=0),t.messageCount>=this.config.maxMessagesPerSecond?!1:(t.messageCount++,!0)}log(e){this.config.debug&&console.log(`[ServerNetwork] ${e}`)}}
@@ -0,0 +1 @@
1
+ var t=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var l=(r,n)=>{for(var o in n)t(r,o,{get:n[o],enumerable:!0})},v=(r,n,o,d)=>{if(n&&typeof n=="object"||typeof n=="function")for(let e of m(n))!b.call(r,e)&&e!==o&&t(r,e,{get:()=>n[e],enumerable:!(d=u(n,e))||d.enumerable});return r};var p=r=>v(t({},"__esModule",{value:!0}),r);var c={};l(c,{MessagePriority:()=>i,MessageType:()=>a});module.exports=p(c);var a=(e=>(e[e.INTENT=1]="INTENT",e[e.SNAPSHOT=2]="SNAPSHOT",e[e.HEARTBEAT=3]="HEARTBEAT",e[e.CUSTOM=255]="CUSTOM",e))(a||{}),i=(e=>(e[e.LOW=0]="LOW",e[e.NORMAL=1]="NORMAL",e[e.HIGH=2]="HIGH",e[e.CRITICAL=3]="CRITICAL",e))(i||{});
@@ -0,0 +1 @@
1
+ var u=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(n,e)=>{for(var t in e)u(n,t,{get:e[t],enumerable:!0})},b=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of s(e))!l.call(n,o)&&o!==t&&u(n,o,{get:()=>e[o],enumerable:!(r=a(e,o))||r.enumerable});return n};var p=n=>b(u({},"__esModule",{value:!0}),n);var x={};d(x,{combineValidators:()=>m,validateFieldType:()=>g,validateRange:()=>I,validateTickNotTooFuture:()=>c,validateTickNotTooOld:()=>T,validateTickRange:()=>f});module.exports=p(x);function T(n,e=10){return(t,r)=>r.tick>=n-e}function c(n,e=5){return(t,r)=>r.tick<=n+e}function f(n,e=10,t=5){return(r,o)=>o.tick>=n-e&&o.tick<=n+t}function m(...n){return(e,t)=>{for(const r of n)if(!r(e,t))return!1;return!0}}function I(n,e,t){return(r,o)=>{const i=o[n];return typeof i!="number"?!1:i>=e&&i<=t}}function g(n,e){return(t,r)=>typeof r[n]===e}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,r,p,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of c(r))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>r[m],enumerable:!(x=b(r,m))||x.enumerable});return f},e=(f,r,p)=>(t(f,r,"default"),p&&t(p,r,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);e(o,require("./intent"),module.exports);e(o,require("./snapshot"),module.exports);e(o,require("./rpc"),module.exports);
@@ -0,0 +1 @@
1
+ var o=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var y=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},m=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of s(e))!a.call(n,r)&&r!==t&&o(n,r,{get:()=>e[r],enumerable:!(i=d(e,r))||i.enumerable});return n};var f=n=>m(o({},"__esModule",{value:!0}),n);var T={};y(T,{defineIntent:()=>I});module.exports=f(T);var c=require("../../core/binary-codec");class p{constructor(e){this.schema=e}encode(e){return c.BinaryCodec.encode(this.schema,e)}decode(e){const t={};for(const i of Object.keys(this.schema)){const r=this.schema[i];t[i]=r.toNil()}return c.BinaryCodec.decode(this.schema,e,t)}}function I(n){const e={kind:c.BinaryCodec.u8,tick:c.BinaryCodec.u32,...n.schema};return{type:void 0,codec:new p(e),kind:n.kind}}
@@ -0,0 +1 @@
1
+ var f=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var r in t)f(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of y(t))!m.call(e,n)&&n!==r&&f(e,n,{get:()=>t[n],enumerable:!(o=i(t,n))||o.enumerable});return e};var a=e=>d(f({},"__esModule",{value:!0}),e);var D={};x(D,{IntentRegistry:()=>p.IntentRegistry,defineIntent:()=>I.defineIntent});module.exports=a(D);var p=require("./intent-registry"),I=require("./define-intent");
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var a=(n,e)=>{for(var r in e)d(n,r,{get:e[r],enumerable:!0})},u=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!s.call(n,o)&&o!==r&&d(n,o,{get:()=>e[o],enumerable:!(t=c(e,o))||t.enumerable});return n};var f=n=>u(d({},"__esModule",{value:!0}),n);var m={};a(m,{IntentRegistry:()=>h});module.exports=f(m);class h{constructor(){this.codecs=new Map}register(e){if(this.codecs.has(e.kind))throw new Error(`Intent kind ${e.kind} is already registered`);this.codecs.set(e.kind,e.codec)}encode(e){const r=this.codecs.get(e.kind);if(!r)throw new Error(`No codec registered for intent kind ${e.kind}`);return r.encode(e)}decode(e){if(e.byteLength===0)throw new Error("Cannot decode empty buffer");const r=e[0],t=this.codecs.get(r);if(!t)throw new Error(`No codec registered for intent kind ${r}`);return t.decode(e)}decodeWithKnownKind(e,r){const t=this.codecs.get(e);if(!t)throw new Error(`No codec registered for intent kind ${e}`);return t.decode(r)}has(e){return this.codecs.has(e)}unregister(e){return this.codecs.delete(e)}clear(){this.codecs.clear()}getKinds(){return Array.from(this.codecs.keys())}}
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e,b,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of k(e))!m.call(n,t)&&t!==b&&i(n,t,{get:()=>e[t],enumerable:!(r=c(e,t))||r.enumerable});return n};var a=n=>u(i({},"__esModule",{value:!0}),n);var d={};module.exports=a(d);