murow 0.0.60 → 0.0.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/README.md +52 -37
  2. package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
  3. package/dist/cjs/core/binary-codec/index.js +1 -0
  4. package/dist/cjs/core/driver/driver.js +1 -0
  5. package/dist/cjs/core/driver/drivers/immediate.js +1 -0
  6. package/dist/cjs/core/driver/drivers/index.js +1 -0
  7. package/dist/cjs/core/driver/drivers/raf.js +1 -0
  8. package/dist/cjs/core/driver/drivers/timeout.js +1 -0
  9. package/dist/cjs/core/driver/index.js +1 -0
  10. package/dist/cjs/core/events/event-system.js +1 -0
  11. package/dist/cjs/core/events/index.js +1 -0
  12. package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
  13. package/dist/cjs/core/fixed-ticker/index.js +1 -0
  14. package/dist/cjs/core/free-list/free-list.js +1 -0
  15. package/dist/cjs/core/free-list/index.js +1 -0
  16. package/dist/cjs/core/generate-id/generate-id.js +1 -0
  17. package/dist/cjs/core/generate-id/index.js +1 -0
  18. package/dist/cjs/core/index.js +1 -0
  19. package/dist/cjs/core/input/index.js +1 -0
  20. package/dist/cjs/core/input/manager.js +1 -0
  21. package/dist/cjs/core/input/sources/browser.js +1 -0
  22. package/dist/cjs/core/input/sources/index.js +1 -0
  23. package/dist/cjs/core/input/types.js +1 -0
  24. package/dist/cjs/core/lerp/index.js +1 -0
  25. package/dist/cjs/core/lerp/lerp.js +1 -0
  26. package/dist/cjs/core/navmesh/index.js +1 -0
  27. package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
  28. package/dist/cjs/core/navmesh/navmesh.js +1 -0
  29. package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
  30. package/dist/cjs/core/pooled-codec/index.js +1 -0
  31. package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
  32. package/dist/cjs/core/prediction/index.js +1 -0
  33. package/dist/cjs/core/prediction/prediction.js +1 -0
  34. package/dist/cjs/core/ray/index.js +1 -0
  35. package/dist/cjs/core/ray/ray-2d.js +1 -0
  36. package/dist/cjs/core/ray/ray-3d.js +1 -0
  37. package/dist/cjs/core/simple-rng/index.js +1 -0
  38. package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
  39. package/dist/cjs/core/sparse-batcher/index.js +1 -0
  40. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
  41. package/dist/cjs/ecs/component-store.js +1 -0
  42. package/dist/cjs/ecs/component.js +1 -0
  43. package/dist/cjs/ecs/entity-handle.js +1 -0
  44. package/dist/cjs/ecs/index.js +1 -0
  45. package/dist/cjs/ecs/system-builder.js +1 -0
  46. package/dist/cjs/ecs/world-systems.js +1 -0
  47. package/dist/cjs/ecs/world.js +1 -0
  48. package/dist/cjs/game/index.js +1 -0
  49. package/dist/cjs/game/loop/index.js +1 -0
  50. package/dist/cjs/game/loop/loop.js +1 -0
  51. package/dist/cjs/index.js +1 -0
  52. package/dist/cjs/net/adapters/browser-websocket.js +1 -0
  53. package/dist/cjs/net/adapters/bun-websocket.js +1 -0
  54. package/dist/cjs/net/buffer-pool.js +1 -0
  55. package/dist/cjs/net/client.js +1 -0
  56. package/dist/cjs/net/index.js +1 -0
  57. package/dist/cjs/net/server.js +1 -0
  58. package/dist/cjs/net/types.js +1 -0
  59. package/dist/cjs/net/validators.js +1 -0
  60. package/dist/cjs/protocol/index.js +1 -0
  61. package/dist/cjs/protocol/intent/define-intent.js +1 -0
  62. package/dist/cjs/protocol/intent/index.js +1 -0
  63. package/dist/cjs/protocol/intent/intent-registry.js +1 -0
  64. package/dist/cjs/protocol/intent/intent.js +1 -0
  65. package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
  66. package/dist/cjs/protocol/rpc/index.js +1 -0
  67. package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
  68. package/dist/cjs/protocol/rpc/rpc.js +1 -0
  69. package/dist/cjs/protocol/snapshot/index.js +1 -0
  70. package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
  71. package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
  72. package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
  73. package/dist/cjs/renderer/base-2d-renderer.js +1 -0
  74. package/dist/cjs/renderer/base-3d-renderer.js +1 -0
  75. package/dist/cjs/renderer/base-renderer.js +1 -0
  76. package/dist/cjs/renderer/index.js +1 -0
  77. package/dist/cjs/renderer/types.js +1 -0
  78. package/dist/esm/core/binary-codec/binary-codec.js +1 -0
  79. package/dist/esm/core/binary-codec/index.js +1 -0
  80. package/dist/esm/core/driver/driver.js +1 -0
  81. package/dist/esm/core/driver/drivers/immediate.js +1 -0
  82. package/dist/esm/core/driver/drivers/index.js +1 -0
  83. package/dist/esm/core/driver/drivers/raf.js +1 -0
  84. package/dist/esm/core/driver/drivers/timeout.js +1 -0
  85. package/dist/esm/core/driver/index.js +1 -0
  86. package/dist/esm/core/events/event-system.js +1 -0
  87. package/dist/esm/core/events/index.js +1 -0
  88. package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
  89. package/dist/esm/core/fixed-ticker/index.js +1 -0
  90. package/dist/esm/core/free-list/free-list.js +1 -0
  91. package/dist/esm/core/free-list/index.js +1 -0
  92. package/dist/esm/core/generate-id/generate-id.js +1 -0
  93. package/dist/esm/core/generate-id/index.js +1 -0
  94. package/dist/esm/core/index.js +1 -0
  95. package/dist/esm/core/input/index.js +1 -0
  96. package/dist/esm/core/input/manager.js +1 -0
  97. package/dist/esm/core/input/sources/browser.js +1 -0
  98. package/dist/esm/core/input/sources/index.js +1 -0
  99. package/dist/esm/core/input/types.js +0 -0
  100. package/dist/esm/core/lerp/index.js +1 -0
  101. package/dist/esm/core/lerp/lerp.js +1 -0
  102. package/dist/esm/core/navmesh/index.js +1 -0
  103. package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
  104. package/dist/esm/core/navmesh/navmesh.js +1 -0
  105. package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
  106. package/dist/esm/core/pooled-codec/index.js +1 -0
  107. package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
  108. package/dist/esm/core/prediction/index.js +1 -0
  109. package/dist/esm/core/prediction/prediction.js +1 -0
  110. package/dist/esm/core/ray/index.js +1 -0
  111. package/dist/esm/core/ray/ray-2d.js +1 -0
  112. package/dist/esm/core/ray/ray-3d.js +1 -0
  113. package/dist/esm/core/simple-rng/index.js +1 -0
  114. package/dist/esm/core/simple-rng/simple-rng.js +1 -0
  115. package/dist/esm/core/sparse-batcher/index.js +1 -0
  116. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
  117. package/dist/esm/ecs/component-store.js +1 -0
  118. package/dist/esm/ecs/component.js +1 -0
  119. package/dist/esm/ecs/entity-handle.js +1 -0
  120. package/dist/esm/ecs/index.js +1 -0
  121. package/dist/esm/ecs/system-builder.js +1 -0
  122. package/dist/esm/ecs/world-systems.js +1 -0
  123. package/dist/esm/ecs/world.js +1 -0
  124. package/dist/esm/game/index.js +1 -0
  125. package/dist/esm/game/loop/index.js +1 -0
  126. package/dist/esm/game/loop/loop.js +1 -0
  127. package/dist/esm/index.js +1 -0
  128. package/dist/esm/net/adapters/browser-websocket.js +1 -0
  129. package/dist/esm/net/adapters/bun-websocket.js +1 -0
  130. package/dist/esm/net/buffer-pool.js +1 -0
  131. package/dist/esm/net/client.js +1 -0
  132. package/dist/esm/net/index.js +1 -0
  133. package/dist/esm/net/server.js +1 -0
  134. package/dist/esm/net/types.js +1 -0
  135. package/dist/esm/net/validators.js +1 -0
  136. package/dist/esm/protocol/index.js +1 -0
  137. package/dist/esm/protocol/intent/define-intent.js +1 -0
  138. package/dist/esm/protocol/intent/index.js +1 -0
  139. package/dist/esm/protocol/intent/intent-registry.js +1 -0
  140. package/dist/esm/protocol/intent/intent.js +0 -0
  141. package/dist/esm/protocol/rpc/define-rpc.js +1 -0
  142. package/dist/esm/protocol/rpc/index.js +1 -0
  143. package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
  144. package/dist/esm/protocol/rpc/rpc.js +0 -0
  145. package/dist/esm/protocol/snapshot/index.js +1 -0
  146. package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
  147. package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
  148. package/dist/esm/protocol/snapshot/snapshot.js +1 -0
  149. package/dist/esm/renderer/base-2d-renderer.js +1 -0
  150. package/dist/esm/renderer/base-3d-renderer.js +1 -0
  151. package/dist/esm/renderer/base-renderer.js +1 -0
  152. package/dist/esm/renderer/index.js +1 -0
  153. package/dist/esm/renderer/types.js +0 -0
  154. package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
  155. package/dist/{core/loop → types/core/driver}/drivers/immediate.d.ts +1 -1
  156. package/dist/{core/loop → types/core/driver}/drivers/raf.d.ts +1 -1
  157. package/dist/{core/loop → types/core/driver}/drivers/timeout.d.ts +1 -1
  158. package/dist/{core/loop → types/core/driver}/index.d.ts +1 -1
  159. package/dist/{core → types/core}/events/event-system.d.ts +14 -33
  160. package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +1 -1
  161. package/dist/types/core/free-list/free-list.d.ts +31 -0
  162. package/dist/types/core/free-list/index.d.ts +1 -0
  163. package/dist/{core → types/core}/index.d.ts +7 -1
  164. package/dist/types/core/input/index.d.ts +3 -0
  165. package/dist/types/core/input/manager.d.ts +56 -0
  166. package/dist/types/core/input/sources/browser.d.ts +9 -0
  167. package/dist/types/core/input/sources/index.d.ts +1 -0
  168. package/dist/types/core/input/types.d.ts +36 -0
  169. package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
  170. package/dist/types/core/ray/index.d.ts +2 -0
  171. package/dist/types/core/ray/ray-2d.d.ts +37 -0
  172. package/dist/types/core/ray/ray-3d.d.ts +42 -0
  173. package/dist/types/core/simple-rng/index.d.ts +1 -0
  174. package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
  175. package/dist/types/core/sparse-batcher/index.d.ts +1 -0
  176. package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
  177. package/dist/{ecs → types/ecs}/system-builder.d.ts +20 -9
  178. package/dist/{ecs → types/ecs}/world.d.ts +11 -0
  179. package/dist/types/game/index.d.ts +1 -0
  180. package/dist/types/game/loop/index.d.ts +1 -0
  181. package/dist/types/game/loop/loop.d.ts +175 -0
  182. package/dist/{index.d.ts → types/index.d.ts} +2 -0
  183. package/dist/{net → types/net}/index.d.ts +2 -2
  184. package/dist/{net → types/net}/server.d.ts +39 -19
  185. package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +15 -0
  186. package/dist/{protocol → types/protocol}/intent/index.d.ts +1 -1
  187. package/dist/types/renderer/base-2d-renderer.d.ts +13 -0
  188. package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
  189. package/dist/types/renderer/base-renderer.d.ts +21 -0
  190. package/dist/types/renderer/index.d.ts +4 -0
  191. package/dist/types/renderer/types.d.ts +79 -0
  192. package/dist/webgpu/cjs/index.js +6004 -0
  193. package/dist/webgpu/esm/index.js +5972 -0
  194. package/dist/webgpu/types/2d/animation.d.ts +97 -0
  195. package/dist/webgpu/types/2d/renderer.d.ts +55 -0
  196. package/dist/webgpu/types/2d/shader.d.ts +61 -0
  197. package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
  198. package/dist/webgpu/types/2d/sprite-accessor.test.d.ts +1 -0
  199. package/dist/webgpu/types/3d/gltf-skin-parser.d.ts +101 -0
  200. package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
  201. package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
  202. package/dist/webgpu/types/3d/renderer.d.ts +216 -0
  203. package/dist/webgpu/types/3d/shader.d.ts +136 -0
  204. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
  205. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +8 -0
  206. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
  207. package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -0
  208. package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
  209. package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
  210. package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
  211. package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
  212. package/dist/webgpu/types/camera/index.d.ts +2 -0
  213. package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
  214. package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
  215. package/dist/webgpu/types/core/constants.d.ts +59 -0
  216. package/dist/webgpu/types/core/constants.test.d.ts +1 -0
  217. package/dist/webgpu/types/core/index.d.ts +2 -0
  218. package/dist/webgpu/types/core/math.d.ts +37 -0
  219. package/dist/webgpu/types/core/types.d.ts +125 -0
  220. package/dist/webgpu/types/core/types.test.d.ts +1 -0
  221. package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
  222. package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
  223. package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
  224. package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
  225. package/dist/webgpu/types/geometry/index.d.ts +2 -0
  226. package/dist/webgpu/types/index.d.ts +32 -0
  227. package/dist/webgpu/types/particle/emitter.d.ts +36 -0
  228. package/dist/webgpu/types/shaders/index.d.ts +2 -0
  229. package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
  230. package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
  231. package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
  232. package/dist/webgpu/types/shaders/utils.d.ts +28 -0
  233. package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
  234. package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
  235. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +57 -0
  236. package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
  237. package/package.json +96 -26
  238. package/dist/core/binary-codec/binary-codec.js +0 -354
  239. package/dist/core/binary-codec/index.js +0 -1
  240. package/dist/core/events/event-system.js +0 -88
  241. package/dist/core/events/index.js +0 -1
  242. package/dist/core/fixed-ticker/fixed-ticker.js +0 -101
  243. package/dist/core/fixed-ticker/index.js +0 -1
  244. package/dist/core/generate-id/generate-id.js +0 -25
  245. package/dist/core/generate-id/index.js +0 -1
  246. package/dist/core/index.js +0 -9
  247. package/dist/core/lerp/index.js +0 -1
  248. package/dist/core/lerp/lerp.js +0 -42
  249. package/dist/core/loop/drivers/immediate.js +0 -61
  250. package/dist/core/loop/drivers/index.js +0 -3
  251. package/dist/core/loop/drivers/raf.js +0 -62
  252. package/dist/core/loop/drivers/timeout.js +0 -71
  253. package/dist/core/loop/index.js +0 -2
  254. package/dist/core/loop/loop.js +0 -47
  255. package/dist/core/navmesh/index.js +0 -1
  256. package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
  257. package/dist/core/navmesh/navmesh.js +0 -799
  258. package/dist/core/navmesh/navmesh.worker.js +0 -79
  259. package/dist/core/pooled-codec/index.js +0 -1
  260. package/dist/core/pooled-codec/pooled-codec.js +0 -410
  261. package/dist/core/prediction/index.js +0 -1
  262. package/dist/core/prediction/prediction.js +0 -99
  263. package/dist/core.esm.js +0 -1
  264. package/dist/core.js +0 -1
  265. package/dist/ecs/component-store.js +0 -175
  266. package/dist/ecs/component.js +0 -43
  267. package/dist/ecs/entity-handle.js +0 -515
  268. package/dist/ecs/example.js +0 -125
  269. package/dist/ecs/index.js +0 -4
  270. package/dist/ecs/system-builder.js +0 -180
  271. package/dist/ecs/system.d.ts +0 -63
  272. package/dist/ecs/system.js +0 -92
  273. package/dist/ecs/world-systems.js +0 -79
  274. package/dist/ecs/world.js +0 -684
  275. package/dist/index.js +0 -24
  276. package/dist/net/adapters/browser-websocket.js +0 -74
  277. package/dist/net/adapters/bun-websocket.js +0 -245
  278. package/dist/net/buffer-pool.js +0 -89
  279. package/dist/net/client.js +0 -586
  280. package/dist/net/index.js +0 -58
  281. package/dist/net/server.js +0 -938
  282. package/dist/net/types.js +0 -31
  283. package/dist/net/validators.js +0 -88
  284. package/dist/protocol/index.js +0 -92
  285. package/dist/protocol/intent/define-intent.js +0 -125
  286. package/dist/protocol/intent/index.js +0 -91
  287. package/dist/protocol/intent/intent-registry.js +0 -91
  288. package/dist/protocol/rpc/define-rpc.js +0 -84
  289. package/dist/protocol/rpc/index.js +0 -3
  290. package/dist/protocol/rpc/rpc-registry.js +0 -159
  291. package/dist/protocol/rpc/rpc.js +0 -12
  292. package/dist/protocol/snapshot/index.js +0 -43
  293. package/dist/protocol/snapshot/snapshot-codec.js +0 -67
  294. package/dist/protocol/snapshot/snapshot-registry.js +0 -168
  295. package/dist/protocol/snapshot/snapshot.js +0 -30
  296. package/src/core/binary-codec/README.md +0 -60
  297. package/src/core/binary-codec/binary-codec.test.ts +0 -300
  298. package/src/core/binary-codec/binary-codec.ts +0 -448
  299. package/src/core/binary-codec/index.ts +0 -1
  300. package/src/core/events/README.md +0 -47
  301. package/src/core/events/event-system.test.ts +0 -243
  302. package/src/core/events/event-system.ts +0 -140
  303. package/src/core/events/index.ts +0 -1
  304. package/src/core/fixed-ticker/README.md +0 -77
  305. package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
  306. package/src/core/fixed-ticker/fixed-ticker.ts +0 -169
  307. package/src/core/fixed-ticker/index.ts +0 -1
  308. package/src/core/generate-id/README.md +0 -18
  309. package/src/core/generate-id/generate-id.test.ts +0 -79
  310. package/src/core/generate-id/generate-id.ts +0 -37
  311. package/src/core/generate-id/index.ts +0 -1
  312. package/src/core/index.ts +0 -9
  313. package/src/core/lerp/README.md +0 -79
  314. package/src/core/lerp/index.ts +0 -1
  315. package/src/core/lerp/lerp.test.ts +0 -90
  316. package/src/core/lerp/lerp.ts +0 -42
  317. package/src/core/loop/README.md +0 -97
  318. package/src/core/loop/drivers/immediate.ts +0 -66
  319. package/src/core/loop/drivers/index.ts +0 -3
  320. package/src/core/loop/drivers/raf.ts +0 -67
  321. package/src/core/loop/drivers/timeout.ts +0 -77
  322. package/src/core/loop/index.ts +0 -2
  323. package/src/core/loop/loop.test.ts +0 -414
  324. package/src/core/loop/loop.ts +0 -71
  325. package/src/core/navmesh/README.md +0 -164
  326. package/src/core/navmesh/index.ts +0 -1
  327. package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
  328. package/src/core/navmesh/navmesh-workers.test.ts +0 -356
  329. package/src/core/navmesh/navmesh.test.ts +0 -344
  330. package/src/core/navmesh/navmesh.ts +0 -1047
  331. package/src/core/navmesh/navmesh.worker.ts +0 -147
  332. package/src/core/pooled-codec/README.md +0 -70
  333. package/src/core/pooled-codec/index.ts +0 -1
  334. package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
  335. package/src/core/pooled-codec/pooled-codec.ts +0 -504
  336. package/src/core/prediction/README.md +0 -64
  337. package/src/core/prediction/index.ts +0 -1
  338. package/src/core/prediction/prediction.test.ts +0 -423
  339. package/src/core/prediction/prediction.ts +0 -112
  340. package/src/ecs/README.md +0 -427
  341. package/src/ecs/benchmark.test.ts +0 -1645
  342. package/src/ecs/component-store.ts +0 -198
  343. package/src/ecs/component.ts +0 -90
  344. package/src/ecs/entity-handle.test.ts +0 -393
  345. package/src/ecs/entity-handle.ts +0 -563
  346. package/src/ecs/example.ts +0 -152
  347. package/src/ecs/index.ts +0 -4
  348. package/src/ecs/system-builder.ts +0 -309
  349. package/src/ecs/system.ts +0 -111
  350. package/src/ecs/world-systems.ts +0 -83
  351. package/src/ecs/world.test.ts +0 -310
  352. package/src/ecs/world.ts +0 -828
  353. package/src/index.ts +0 -28
  354. package/src/net/README.md +0 -474
  355. package/src/net/adapters/browser-websocket.ts +0 -86
  356. package/src/net/adapters/bun-websocket.ts +0 -292
  357. package/src/net/buffer-pool.ts +0 -106
  358. package/src/net/client.test.ts +0 -807
  359. package/src/net/client.ts +0 -695
  360. package/src/net/index.ts +0 -60
  361. package/src/net/server.test.ts +0 -799
  362. package/src/net/server.ts +0 -1116
  363. package/src/net/types.ts +0 -228
  364. package/src/net/validators.ts +0 -104
  365. package/src/protocol/README.md +0 -469
  366. package/src/protocol/index.ts +0 -93
  367. package/src/protocol/intent/define-intent.test.ts +0 -397
  368. package/src/protocol/intent/define-intent.ts +0 -182
  369. package/src/protocol/intent/index.ts +0 -94
  370. package/src/protocol/intent/intent-registry.test.ts +0 -198
  371. package/src/protocol/intent/intent-registry.ts +0 -112
  372. package/src/protocol/intent/intent.ts +0 -12
  373. package/src/protocol/rpc/define-rpc.test.ts +0 -141
  374. package/src/protocol/rpc/define-rpc.ts +0 -113
  375. package/src/protocol/rpc/index.ts +0 -3
  376. package/src/protocol/rpc/rpc-registry.test.ts +0 -168
  377. package/src/protocol/rpc/rpc-registry.ts +0 -176
  378. package/src/protocol/rpc/rpc.ts +0 -37
  379. package/src/protocol/snapshot/index.ts +0 -45
  380. package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
  381. package/src/protocol/snapshot/snapshot-codec.ts +0 -87
  382. package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
  383. package/src/protocol/snapshot/snapshot-registry.ts +0 -201
  384. package/src/protocol/snapshot/snapshot.test.ts +0 -76
  385. package/src/protocol/snapshot/snapshot.ts +0 -41
  386. /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
  387. /package/dist/{core/loop/loop.d.ts → types/core/driver/driver.d.ts} +0 -0
  388. /package/dist/{core/loop → types/core/driver}/drivers/index.d.ts +0 -0
  389. /package/dist/{core → types/core}/events/index.d.ts +0 -0
  390. /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
  391. /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
  392. /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
  393. /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
  394. /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
  395. /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
  396. /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
  397. /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
  398. /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
  399. /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
  400. /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
  401. /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
  402. /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
  403. /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
  404. /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
  405. /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
  406. /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
  407. /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
  408. /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
  409. /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
  410. /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
  411. /package/dist/{net → types/net}/client.d.ts +0 -0
  412. /package/dist/{net → types/net}/types.d.ts +0 -0
  413. /package/dist/{net → types/net}/validators.d.ts +0 -0
  414. /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
  415. /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
  416. /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
  417. /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
  418. /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
  419. /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
  420. /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
  421. /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
  422. /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
  423. /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
  424. /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
  425. /package/dist/{protocol/intent/intent.js → webgpu/types/2d/animation.test.d.ts} +0 -0
package/src/index.ts DELETED
@@ -1,28 +0,0 @@
1
- /**
2
- * GameDev Utils
3
- *
4
- * A collection of utilities for game development, including:
5
- * - Binary codecs for efficient serialization
6
- * - Event system for decoupled communication
7
- * - Fixed-timestep ticker for deterministic simulation
8
- * - ID generation utilities
9
- * - Linear interpolation (lerp) utilities
10
- * - NavMesh pathfinding with obstacle management
11
- * - Pooled codecs for zero-allocation networking
12
- * - Prediction system for client-side prediction
13
- * - Protocol layer for networked multiplayer games
14
- * - Transport-agnostic networking layer (client/server abstractions)
15
- * - Entity Component System (ECS) for scalable game architecture
16
- */
17
-
18
- // Core utilities
19
- export * from "./core";
20
-
21
- // Protocol layer for networking
22
- export * from "./protocol";
23
-
24
- // Networking layer (client/server abstractions)
25
- export * from "./net";
26
-
27
- // Entity Component System
28
- export * from "./ecs";
package/src/net/README.md DELETED
@@ -1,474 +0,0 @@
1
- # Network Layer (`@mococa/net`)
2
-
3
- Transport-agnostic networking layer for multiplayer games. Provides generic client/server abstractions that work with any transport (WebSocket, WebRTC, UDP, Socket.io, etc.)
4
-
5
- ## Key Features
6
-
7
- - **Per-Peer Snapshot Registries** - Each player gets their own snapshot codec, enabling:
8
- - Fog of war (only send visible entities)
9
- - Interest management (only send relevant data)
10
- - Player-specific compression/optimization
11
-
12
- - **Transport Agnostic** - Pluggable transport adapters for:
13
- - Bun WebSocket (included)
14
- - Browser WebSocket
15
- - WebRTC
16
- - UDP
17
- - Socket.io
18
- - Custom transports
19
-
20
- - **Type-Safe Protocol** - Integrates with `@mococa/protocol`:
21
- - Intent encoding/decoding (client inputs)
22
- - Snapshot encoding/decoding (state sync)
23
- - RPC encoding/decoding (one-off events)
24
- - Binary serialization
25
-
26
- - **Connection Lifecycle** - Built-in handling for:
27
- - Connection/disconnection events
28
- - Per-peer state tracking
29
- - Message routing
30
-
31
- ## Architecture
32
-
33
- ```
34
- ┌─────────────┐ ┌─────────────┐
35
- │ Game Client │ │ Game Server │
36
- └──────┬──────┘ └──────┬──────┘
37
- │ │
38
- │ Intents (MoveIntent) │
39
- ├─────────────────────────────────>│
40
- │ │
41
- │ Snapshots (GameState) │
42
- │<─────────────────────────────────┤
43
- │ │
44
- │ RPCs (BuyItem) │
45
- ├─────────────────────────────────>│
46
- │ │
47
- │ RPCs (MatchCountdown) │
48
- │<─────────────────────────────────┤
49
- │ │
50
- ▼ ▼
51
- ┌─────────────┐ ┌─────────────┐
52
- │ ClientNetwork│ │ServerNetwork│
53
- │ Class │ │ Class │
54
- └──────┬──────┘ └──────┬──────┘
55
- │ │
56
- │ Binary Messages (Uint8Array) │
57
- ├─────────────────────────────────>│
58
- │<─────────────────────────────────┤
59
- │ │
60
- ▼ ▼
61
- ┌─────────────┐ ┌─────────────┐
62
- │ Transport │ │ Transport │
63
- │ Adapter │◄──────WebSocket───►│ Adapter │
64
- └─────────────┘ └─────────────┘
65
- ```
66
-
67
- ## Quick Start
68
-
69
- ### 1. Define Your Game Protocol
70
-
71
- ```typescript
72
- import { BinaryCodec, defineIntent, IntentRegistry, SnapshotRegistry } from '@mococa/gamedev-utils';
73
-
74
- // Define intents (client -> server)
75
- enum IntentKind {
76
- Move = 1,
77
- Attack = 2,
78
- }
79
-
80
- const MoveIntent = defineIntent({
81
- kind: IntentKind.Move,
82
- schema: {
83
- dx: BinaryCodec.f32,
84
- dy: BinaryCodec.f32,
85
- }
86
- });
87
-
88
- // Define game state (server -> client)
89
- const GameStateCodec = BinaryCodec.object({
90
- players: BinaryCodec.record(BinaryCodec.string, BinaryCodec.object({
91
- x: BinaryCodec.f32,
92
- y: BinaryCodec.f32,
93
- health: BinaryCodec.u8,
94
- })),
95
- tick: BinaryCodec.u32,
96
- });
97
- ```
98
-
99
- ### 2. Create Server
100
-
101
- ```typescript
102
- import { ServerNetwork, BunWebSocketServerTransport } from '@mococa/gamedev-utils';
103
-
104
- // Create transport
105
- const transport = BunWebSocketServerTransport.create(3000);
106
-
107
- // Create intent registry
108
- const intentRegistry = new IntentRegistry();
109
- intentRegistry.register(IntentKind.Move, MoveIntent.codec);
110
-
111
- // Create server with per-peer snapshot registry factory
112
- const server = new ServerNetwork({
113
- transport,
114
- intentRegistry,
115
- createPeerSnapshotRegistry: () => {
116
- // Factory called for each new peer connection
117
- const registry = new SnapshotRegistry();
118
- registry.register('GameState', GameStateCodec);
119
- return registry;
120
- },
121
- config: { debug: true }
122
- });
123
-
124
- // Handle intents
125
- server.onIntent(IntentKind.Move, (peerId, intent) => {
126
- const { dx, dy } = intent as MoveIntent;
127
- // Update game state...
128
- });
129
-
130
- // Broadcast snapshots
131
- setInterval(() => {
132
- server.broadcastSnapshot('GameState', {
133
- tick: currentTick++,
134
- updates: gameState
135
- });
136
- }, 50); // 20 Hz
137
- ```
138
-
139
- ### 3. Create Client
140
-
141
- ```typescript
142
- import { ClientNetwork, BunWebSocketClientTransport } from '@mococa/gamedev-utils';
143
-
144
- // Connect to server
145
- const transport = await BunWebSocketClientTransport.connect('ws://localhost:3000');
146
-
147
- // Create registries
148
- const intentRegistry = new IntentRegistry();
149
- intentRegistry.register(IntentKind.Move, MoveIntent.codec);
150
-
151
- const snapshotRegistry = new SnapshotRegistry();
152
- snapshotRegistry.register('GameState', GameStateCodec);
153
-
154
- // Create client
155
- const client = new ClientNetwork({
156
- transport,
157
- intentRegistry,
158
- snapshotRegistry,
159
- config: { debug: true }
160
- });
161
-
162
- // Handle snapshots
163
- client.onSnapshot('GameState', (snapshot) => {
164
- // Apply to local game state
165
- gameState = applySnapshot(gameState, snapshot);
166
- });
167
-
168
- // Send intents
169
- client.sendIntent({
170
- kind: IntentKind.Move,
171
- tick: currentTick,
172
- dx: 1.0,
173
- dy: 0.5
174
- });
175
- ```
176
-
177
- ## RPCs (Remote Procedure Calls)
178
-
179
- For one-off events that don't fit intents (inputs) or snapshots (state sync), use RPCs. See [Protocol README](../protocol/README.md#rpcs-remote-procedure-calls) for full documentation.
180
-
181
- ### Quick Example
182
-
183
- ```typescript
184
- import { defineRPC, RpcRegistry } from '@mococa/gamedev-utils';
185
-
186
- // Define RPCs
187
- const MatchCountdown = defineRPC({
188
- method: 'matchCountdown',
189
- schema: {
190
- secondsRemaining: BinaryCodec.u8,
191
- }
192
- });
193
-
194
- const BuyItem = defineRPC({
195
- method: 'buyItem',
196
- schema: {
197
- itemId: BinaryCodec.string(32),
198
- }
199
- });
200
-
201
- // Register RPCs
202
- const rpcRegistry = new RpcRegistry();
203
- rpcRegistry.register(MatchCountdown);
204
- rpcRegistry.register(BuyItem);
205
-
206
- // Add to client/server config
207
- const client = new ClientNetwork({
208
- transport,
209
- intentRegistry,
210
- snapshotRegistry,
211
- rpcRegistry, // ← Optional
212
- });
213
-
214
- // Client: Send RPC to server
215
- client.sendRpc(BuyItem, { itemId: 'long_sword' });
216
-
217
- // Client: Receive RPC from server
218
- client.onRpc(MatchCountdown, (rpc) => {
219
- showCountdownUI(rpc.secondsRemaining);
220
- });
221
-
222
- // Server: Receive RPC from client
223
- server.onRpc(BuyItem, (peerId, rpc) => {
224
- handlePurchase(peerId, rpc.itemId);
225
- });
226
-
227
- // Server: Send RPC to specific client
228
- server.sendRpc(peerId, MatchCountdown, { secondsRemaining: 10 });
229
-
230
- // Server: Broadcast RPC to all clients
231
- server.sendRpcBroadcast(MatchCountdown, { secondsRemaining: 3 });
232
- ```
233
-
234
- **When to use:**
235
- - ✅ Match lifecycle events (countdown, pause, end)
236
- - ✅ Meta-game events (achievements, notifications)
237
- - ✅ Chat messages
238
- - ✅ UI feedback (purchase confirmations, errors)
239
-
240
- **When NOT to use:**
241
- - ❌ Game state (use Snapshots)
242
- - ❌ Player inputs (use Intents)
243
- - ❌ Anything late joiners need to know
244
-
245
- ## Per-Peer Snapshot Registries
246
-
247
- The killer feature! Each peer automatically gets their own snapshot registry via the factory function, enabling powerful optimizations:
248
-
249
- ### Fog of War (Runtime Filtering)
250
-
251
- Use `broadcastSnapshotWithCustomization` to filter data per-peer at runtime:
252
-
253
- ```typescript
254
- server.broadcastSnapshotWithCustomization('GameState', baseSnapshot, (peerId, snapshot) => {
255
- const player = gameState.players[peerId];
256
-
257
- // Only send visible entities to this player
258
- const visibleEntities = entities.filter(entity =>
259
- distance(player, entity) < VISIBILITY_RADIUS
260
- );
261
-
262
- return {
263
- tick: snapshot.tick,
264
- updates: {
265
- ...snapshot.updates,
266
- entities: visibleEntities
267
- }
268
- };
269
- });
270
- ```
271
-
272
- ### Platform-Specific Encoding (Factory Pattern)
273
-
274
- Different clients can use different codecs by customizing the factory:
275
-
276
- ```typescript
277
- const server = new ServerNetwork({
278
- transport,
279
- intentRegistry,
280
- createPeerSnapshotRegistry: () => {
281
- // You could inspect peer metadata here to decide which codec to use
282
- const registry = new SnapshotRegistry();
283
-
284
- // All peers use same codec by default
285
- // For different codecs per peer, use peer metadata and create
286
- // registries conditionally in the factory
287
- registry.register('GameState', GameStateCodec);
288
- return registry;
289
- },
290
- });
291
-
292
- // To customize per-peer, set metadata on connection:
293
- server.onConnection((peerId) => {
294
- const userAgent = /* get from transport metadata */;
295
- server.setPeerMetadata(peerId, 'platform', userAgent.includes('Mobile') ? 'mobile' : 'desktop');
296
-
297
- // Then in factory, check metadata (note: factory runs before onConnection)
298
- // So you'd need to create registries lazily or use customization method
299
- });
300
- ```
301
-
302
- **Note**: The factory runs once per peer automatically. For truly dynamic per-peer codecs, use `broadcastSnapshotWithCustomization` to filter/transform data at send time.
303
-
304
- ## Creating Custom Transports
305
-
306
- Implement the `TransportAdapter` interface:
307
-
308
- ```typescript
309
- import { TransportAdapter, ServerTransportAdapter } from '@mococa/net';
310
-
311
- // Client-side transport
312
- class MyTransport implements TransportAdapter {
313
- send(data: Uint8Array): void {
314
- // Send binary data through your transport
315
- }
316
-
317
- onOpen?(handler: () => void): void {
318
- // Register open handler (optional - if omitted, assumes already connected)
319
- }
320
-
321
- onMessage(handler: (data: Uint8Array) => void): void {
322
- // Register message handler
323
- }
324
-
325
- onClose(handler: () => void): void {
326
- // Register close handler
327
- }
328
-
329
- close(): void {
330
- // Close connection
331
- }
332
- }
333
-
334
- // Server-side transport
335
- class MyServerTransport implements ServerTransportAdapter<MyTransport> {
336
- onConnection(handler: (peer: MyTransport, peerId: string) => void): void {
337
- // Register connection handler
338
- }
339
-
340
- onDisconnection(handler: (peerId: string) => void): void {
341
- // Register disconnection handler
342
- }
343
-
344
- getPeer(peerId: string): MyTransport | undefined {
345
- // Get peer by ID
346
- }
347
-
348
- getPeerIds(): string[] {
349
- // Get all peer IDs
350
- }
351
-
352
- close(): void {
353
- // Close server
354
- }
355
- }
356
- ```
357
-
358
- ## Message Protocol
359
-
360
- Messages are prefixed with a single byte indicating type:
361
-
362
- ```
363
- ┌────────────┬──────────────────────┐
364
- │ Type (u8) │ Payload (variable) │
365
- ├────────────┼──────────────────────┤
366
- │ 0x01 │ Intent data │ (Client -> Server)
367
- │ 0x02 │ Snapshot data │ (Server -> Client)
368
- │ 0xFF │ Custom data │ (Bidirectional)
369
- └────────────┴──────────────────────┘
370
- ```
371
-
372
- This allows the layer to automatically route messages without requiring separate channels.
373
-
374
- ## API Reference
375
-
376
- ### `ServerNetwork<TPeer>`
377
-
378
- #### Constructor
379
- ```typescript
380
- constructor(config: {
381
- transport: ServerTransportAdapter<TPeer>;
382
- intentRegistry: IntentRegistry;
383
- createPeerSnapshotRegistry: () => SnapshotRegistry<TSnapshots>;
384
- config?: NetworkConfig;
385
- })
386
- ```
387
-
388
- **Parameters**:
389
- - `transport`: Server transport adapter for connection management
390
- - `intentRegistry`: Registry for decoding client intents
391
- - `createPeerSnapshotRegistry`: Factory function called once per new peer to create their snapshot registry
392
- - `config`: Optional network configuration (debug, rate limits, buffer pooling, etc.)
393
-
394
- #### Methods
395
- - `onIntent(kind: number, handler: (peerId: string, intent: unknown) => void)` - Handle specific intent type
396
- - `onConnection(handler: (peerId: string) => void)` - Handle new connections
397
- - `onDisconnection(handler: (peerId: string) => void)` - Handle disconnections
398
- - `sendSnapshotToPeer<T>(peerId: string, type: string, snapshot: Snapshot<T>)` - Send to specific peer
399
- - `broadcastSnapshot<T>(type: string, snapshot: Snapshot<T>, filter?: (peerId: string) => boolean)` - Broadcast to all
400
- - `broadcastSnapshotWithCustomization<T>(type: string, baseSnapshot: Snapshot<T>, customize: (peerId: string, snapshot: Snapshot<T>) => Snapshot<T>)` - Broadcast with per-peer customization
401
- - `getPeerIds()` - Get all connected peer IDs
402
- - `getPeerState(peerId: string)` - Get peer state
403
- - `setPeerMetadata(peerId: string, key: string, value: unknown)` - Update peer metadata
404
- - `close()` - Close server
405
-
406
- ### `ClientNetwork`
407
-
408
- #### Constructor
409
- ```typescript
410
- constructor(config: {
411
- transport: TransportAdapter;
412
- intentRegistry: IntentRegistry;
413
- snapshotRegistry: SnapshotRegistry;
414
- config?: NetworkConfig;
415
- })
416
- ```
417
-
418
- #### Methods
419
- - `sendIntent(intent: unknown)` - Send intent to server
420
- - `onSnapshot<T>(type: string, handler: (snapshot: Snapshot<T>) => void)` - Handle specific snapshot type
421
- - `onAnySnapshot(handler: (type: string, snapshot: Snapshot<unknown>) => void)` - Handle all snapshots
422
- - `onClose(handler: () => void)` - Handle connection close
423
- - `getLastReceivedTick()` - Get last received tick number
424
- - `isConnected()` - Check connection status
425
- - `close()` - Close connection
426
-
427
- ## Examples
428
-
429
- See [examples/multiplayer-game.ts](../../examples/multiplayer-game.ts) for a complete working example with:
430
- - Server setup with per-peer registries
431
- - Client prediction
432
- - Multiple intent types
433
- - Fog of war implementation
434
- - Movement, combat, and chat
435
-
436
- ## Best Practices
437
-
438
- 1. **Provide a snapshot registry factory** - Required parameter in ServerNetwork constructor
439
- 2. **Keep snapshots small** - Only send delta updates (use `Partial<T>` for snapshot.updates)
440
- 3. **Use fog of war** - Filter data with `broadcastSnapshotWithCustomization`
441
- 4. **Handle disconnections** - Clean up game state in `onDisconnection` handlers (registries auto-cleaned)
442
- 5. **Rate limit snapshots** - Typical game tick rates: 10-25 Hz (don't exceed 60Hz)
443
- 6. **Validate intents** - Always sanitize/validate data from clients (see validators)
444
- 7. **Use tick numbers** - Include tick in intents for prediction/rollback
445
- 8. **Transport buffer copying** - Custom transports MUST copy buffers in `send()` if queuing internally
446
-
447
- ## Performance Tips
448
-
449
- - Use pooled codecs for zero-allocation encoding
450
- - Batch snapshot updates when possible
451
- - Implement delta compression for large states
452
- - Use binary encoding (not JSON!)
453
- - Consider different update rates for different data (e.g., position vs. health)
454
- - Profile your snapshot sizes - aim for < 1KB per snapshot
455
-
456
- ## Current Features
457
-
458
- Already implemented:
459
- - ✅ Message priority/ordering (priority queue with backpressure)
460
- - ✅ Bandwidth tracking (per-peer bandwidth monitoring)
461
- - ✅ Rate limiting (configurable maxMessagesPerSecond)
462
- - ✅ Buffer pooling (zero-copy message wrapping)
463
- - ✅ Heartbeat/timeout detection (automatic disconnection)
464
- - ✅ Intent validators (composable validation)
465
-
466
- ## Future Enhancements
467
-
468
- Potential additions:
469
- - Reliable message channels (with acks/retries)
470
- - Automatic compression (LZ4/Zstd)
471
- - Latency measurement (RTT tracking)
472
- - Built-in lag compensation helpers
473
- - Delta compression for snapshots
474
- - Connection migration/reconnection
@@ -1,86 +0,0 @@
1
- import type { TransportAdapter } from "../types";
2
-
3
- /**
4
- * Browser WebSocket transport adapter for ClientNetwork
5
- *
6
- * @example
7
- * ```ts
8
- * const transport = new BrowserWebSocketClientTransport("ws://localhost:3007");
9
- * const client = new ClientNetwork({ transport, ... });
10
- * ```
11
- */
12
- export class BrowserWebSocketClientTransport implements TransportAdapter {
13
- private ws: WebSocket;
14
- private openHandler: (() => void) | null = null;
15
- private messageHandler: ((data: Uint8Array) => void) | null = null;
16
- private closeHandler: (() => void) | null = null;
17
- private errorHandler: ((error: Error) => void) | null = null;
18
- private isOpen = false;
19
- private pendingMessages: Uint8Array[] = [];
20
-
21
- constructor(url: string) {
22
- this.ws = new WebSocket(url);
23
- this.ws.binaryType = 'arraybuffer';
24
-
25
- this.ws.onopen = () => {
26
- this.isOpen = true;
27
- // Flush any pending messages
28
- for (const msg of this.pendingMessages) {
29
- this.ws.send(msg);
30
- }
31
- this.pendingMessages = [];
32
- if (this.openHandler) {
33
- this.openHandler();
34
- };
35
- }
36
-
37
- this.ws.onmessage = (event) => {
38
- if (this.messageHandler && event.data instanceof ArrayBuffer) {
39
- this.messageHandler(new Uint8Array(event.data));
40
- }
41
- };
42
-
43
- this.ws.onclose = () => {
44
- this.isOpen = false;
45
- if (this.closeHandler) {
46
- this.closeHandler();
47
- }
48
- };
49
-
50
- this.ws.onerror = () => {
51
- if (this.errorHandler) {
52
- this.errorHandler(new Error('WebSocket error'));
53
- }
54
- };
55
- }
56
-
57
- send(data: Uint8Array): void {
58
- if (this.isOpen && this.ws.readyState === WebSocket.OPEN) {
59
- // WebSocket.send() copies the buffer, so this is safe
60
- this.ws.send(data);
61
- } else if (this.ws.readyState === WebSocket.CONNECTING) {
62
- // Queue messages sent before connection is established
63
- this.pendingMessages.push(data);
64
- }
65
- }
66
-
67
- onMessage(handler: (data: Uint8Array) => void): void {
68
- this.messageHandler = handler;
69
- }
70
-
71
- onOpen(handler: () => void): void {
72
- this.openHandler = handler;
73
- }
74
-
75
- onClose(handler: () => void): void {
76
- this.closeHandler = handler;
77
- }
78
-
79
- onError(handler: (error: Error) => void): void {
80
- this.errorHandler = handler;
81
- }
82
-
83
- close(): void {
84
- this.ws.close();
85
- }
86
- }