@v12-engine/engine 0.1.0 → 0.4.0

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 (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat.js","names":[],"sources":["../../src/server/seat.ts"],"sourcesContent":["/**\n * A seat of a server's game (`Seat`): who holds it, and what each step of its life clears, said in one place\n * (design review E12). Taken by a connection (`take`), let go of by one that may come back to it (`drop`), given up\n * (`free`), made new for a new game (`reset`), held no more by whoever it was (`revoke`: a kick)\n */\nimport type { PlayerId } from '#engine/entity'\nimport type { ServerSeat } from '#engine/game'\nimport type { ModeSeat } from './mode'\nimport type { Connection } from './websocket'\n\n/** A token to come back to a seat with: what only who has it knows */\nexport function randomToken(): string {\n\tconst bytes = new Uint8Array(16)\n\tcrypto.getRandomValues(bytes)\n\treturn [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * A seat of a server's game and who holds it\n *\n * @internal\n */\nexport class Seat implements ServerSeat {\n\t/** The world's player this seat plays */\n\treadonly player: PlayerId\n\t/** The name shown for the seat: the mode's, or the one its player gave */\n\tname: string\n\t/** A computer plays it */\n\tai: boolean\n\t/** Someone is in it now */\n\tconnected = false\n\t/** Whether the player has said they are ready to start, in the lobby */\n\tready = false\n\t/** The seat's chosen settings by name, such as its race, team and colour */\n\tsettings?: Record<string, string>\n\t/** Who it is rated as (`ratedId`), where the server rates */\n\trated?: string\n\t/** Its player's rating in the mode (`Rating.rating`), where the server rates */\n\trating?: number\n\t/** What lets who held it back in: theirs while they hold it, in the lobby and in the game */\n\ttoken?: string\n\t/** Who holds it, as the `seat` hook said (`SeatAnswer.id`) */\n\tid?: string\n\t/** When what an honest client never sends came from it, in this game: the last `cheating.seconds`' worth, and how many in all */\n\tcheats: { at: number[]; total: number } = { at: [], total: 0 }\n\t/** The connection of who is in it */\n\tconnection?: Connection\n\n\tconstructor(\n\t\t/** What the mode says of it */\n\t\treadonly mode: ModeSeat,\n\t\t/** Whether a computer plays it when nobody holds it */\n\t\tprivate readonly computer: boolean,\n\t\tsettings: Record<string, string>\n\t) {\n\t\tthis.player = mode.player\n\t\tthis.name = mode.name\n\t\tthis.ai = computer\n\t\tthis.settings = settings\n\t}\n\n\t/** Nobody in it, nor holding it in a game to come back to, nor a computer */\n\tget isFree(): boolean {\n\t\treturn !this.ai && !this.connected && this.token === undefined\n\t}\n\n\t/**\n\t * Taken by a connection: whoever was in it before is closed out (a player back from another page), and its token is\n\t * kept, or made. A name it is given is taken. Gives the token\n\t */\n\ttake(connection: Connection, name?: string): string {\n\t\tif (this.connection && this.connection !== connection) this.connection.close()\n\t\tthis.connected = true\n\t\tthis.connection = connection\n\t\tthis.token ??= randomToken()\n\t\tif (name) this.name = name.slice(0, 24)\n\t\treturn this.token\n\t}\n\n\t/** Whoever holds another seat moves here, in the lobby: their connection, token, who they are and their name; not ready */\n\ttakeFrom(other: Seat): void {\n\t\tthis.connected = true\n\t\tthis.connection = other.connection\n\t\tthis.token = other.token\n\t\tthis.id = other.id\n\t\tthis.rated = other.rated\n\t\tthis.name = other.name\n\t\tthis.ready = false\n\t\tother.free()\n\t}\n\n\t/** Its connection gone, held for who had it to come back to (a game on): their token, who they are and their name stay */\n\tdrop(): void {\n\t\tthis.connected = false\n\t\tthis.connection = undefined\n\t}\n\n\t/** Given up: free for anyone, with the mode's name, nobody's token, not ready */\n\tfree(): void {\n\t\tthis.drop()\n\t\tthis.token = undefined\n\t\tthis.id = undefined\n\t\tthis.rated = undefined\n\t\tthis.ready = false\n\t\tthis.name = this.mode.name\n\t}\n\n\t/** Held no more by who it was: their token and who they are no good (a kick). Their connection is closed by the caller */\n\trevoke(): void {\n\t\tthis.token = undefined\n\t\tthis.id = undefined\n\t\tthis.rated = undefined\n\t}\n\n\t/** What a new game starts it with: nobody's cheats, not ready, the computer's where the server says */\n\tnewGame(): void {\n\t\tthis.cheats = { at: [], total: 0 }\n\t\tthis.ready = false\n\t\tthis.ai = this.computer\n\t}\n\n\t/** New, for a new game with nobody: free, and as a new game starts it */\n\treset(): void {\n\t\tthis.free()\n\t\tthis.newGame()\n\t}\n}\n"],"mappings":";;AAWA,SAAgB,cAAsB;CACrC,MAAM,wBAAQ,IAAI,WAAW,EAAE;CAC/B,OAAO,gBAAgB,KAAK;CAC5B,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAC5E;;;;;;AAOA,IAAa,OAAb,MAAwC;CA4B7B;CAEQ;;CA5BlB;;CAEA;;CAEA;;CAEA,YAAY;;CAEZ,QAAQ;;CAER;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA,SAA0C;EAAE,IAAI,CAAC;EAAG,OAAO;CAAE;;CAE7D;CAEA,YAEC,MAEA,UACA,UACC;EAJQ,KAAA,OAAA;EAEQ,KAAA,WAAA;EAGjB,KAAK,SAAS,KAAK;EACnB,KAAK,OAAO,KAAK;EACjB,KAAK,KAAK;EACV,KAAK,WAAW;CACjB;;CAGA,IAAI,SAAkB;EACrB,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,aAAa,KAAK,UAAU,KAAA;CACtD;;;;;CAMA,KAAK,YAAwB,MAAuB;EACnD,IAAI,KAAK,cAAc,KAAK,eAAe,YAAY,KAAK,WAAW,MAAM;EAC7E,KAAK,YAAY;EACjB,KAAK,aAAa;EAClB,KAAK,UAAU,YAAY;EAC3B,IAAI,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,EAAE;EACtC,OAAO,KAAK;CACb;;CAGA,SAAS,OAAmB;EAC3B,KAAK,YAAY;EACjB,KAAK,aAAa,MAAM;EACxB,KAAK,QAAQ,MAAM;EACnB,KAAK,KAAK,MAAM;EAChB,KAAK,QAAQ,MAAM;EACnB,KAAK,OAAO,MAAM;EAClB,KAAK,QAAQ;EACb,MAAM,KAAK;CACZ;;CAGA,OAAa;EACZ,KAAK,YAAY;EACjB,KAAK,aAAa,KAAA;CACnB;;CAGA,OAAa;EACZ,KAAK,KAAK;EACV,KAAK,QAAQ,KAAA;EACb,KAAK,KAAK,KAAA;EACV,KAAK,QAAQ,KAAA;EACb,KAAK,QAAQ;EACb,KAAK,OAAO,KAAK,KAAK;CACvB;;CAGA,SAAe;EACd,KAAK,QAAQ,KAAA;EACb,KAAK,KAAK,KAAA;EACV,KAAK,QAAQ,KAAA;CACd;;CAGA,UAAgB;EACf,KAAK,SAAS;GAAE,IAAI,CAAC;GAAG,OAAO;EAAE;EACjC,KAAK,QAAQ;EACb,KAAK,KAAK,KAAK;CAChB;;CAGA,QAAc;EACb,KAAK,KAAK;EACV,KAAK,QAAQ;CACd;AACD"}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * What a lobby offers to choose for each seat (`seatSettingsOf`): a race where the game has races, and for a game that
3
- * says how its computers play (`GameModule.ai`) a difficulty and a personality, the engine's and the game's own. On the
3
+ * says how its computers play (`Rules.ai`) a difficulty and a personality, the engine's and the game's own. On the
4
4
  * server's side: it reads the computer player's profiles (`@v12-engine/engine/ai`), which the engine's core does not load
5
5
  */
6
- import type { GameModule, ServerHooks } from '#engine/game';
6
+ import type { Rules, ServerHooks } from '#engine/game';
7
7
  /**
8
8
  * What a game offers to choose for each seat in a lobby (`ServerHooks.seatSettings`), with a race among them where the
9
9
  * game has races and does not offer its own choice of one: each race, by its name, and `random` where there are two
@@ -12,4 +12,4 @@ import type { GameModule, ServerHooks } from '#engine/game';
12
12
  *
13
13
  * @beta
14
14
  */
15
- export declare function seatSettingsOf(game: GameModule, races?: readonly string[]): NonNullable<ServerHooks['seatSettings']>;
15
+ export declare function seatSettingsOf(game: Rules, races?: readonly string[]): NonNullable<ServerHooks['seatSettings']>;
@@ -0,0 +1,63 @@
1
+ import { RANDOM_RACE } from "../races.js";
2
+ import { difficultiesOf, personalitiesOf } from "../ai/profiles.js";
3
+ //#region src/server/seatSettings.ts
4
+ /** A name as a lobby shows it: `insane` as `Insane` */
5
+ var titled = (id) => id.charAt(0).toUpperCase() + id.slice(1);
6
+ /**
7
+ * What a lobby offers a computer's seat of a game that says how its computers play (`Rules.ai`, AI plan D1): a
8
+ * difficulty and a personality, the engine's and the game's own. Nothing for a game that says nothing, or `lobby: false`
9
+ */
10
+ function computerSettingsOf(game) {
11
+ if (!game.ai || game.ai.lobby === false) return {};
12
+ const registry = { module: game };
13
+ const difficulties = Object.keys(difficultiesOf(registry));
14
+ const personalities = Object.keys(personalitiesOf(registry));
15
+ return {
16
+ difficulty: {
17
+ label: "Difficulty",
18
+ options: difficulties,
19
+ labels: Object.fromEntries(difficulties.map((id) => [id, titled(id)])),
20
+ default: game.ai.defaults?.difficulty ?? "normal"
21
+ },
22
+ personality: {
23
+ label: "Personality",
24
+ options: personalities,
25
+ labels: Object.fromEntries(personalities.map((id) => [id, titled(id)])),
26
+ default: game.ai.defaults?.personality ?? "balanced"
27
+ }
28
+ };
29
+ }
30
+ /**
31
+ * What a game offers to choose for each seat in a lobby (`ServerHooks.seatSettings`), with a race among them where the
32
+ * game has races and does not offer its own choice of one: each race, by its name, and `random` where there are two
33
+ * or more; only those of
34
+ * `races` where given (the races a map offers, `GameMap.races`). The first is chosen until someone does
35
+ *
36
+ * @beta
37
+ */
38
+ function seatSettingsOf(game, races) {
39
+ const own = {
40
+ ...computerSettingsOf(game),
41
+ ...game.server?.seatSettings
42
+ };
43
+ const all = game.races ?? [];
44
+ if (!all.length || own.race) return own;
45
+ const offered = races?.length ? all.filter((race) => races.includes(race.id)) : all;
46
+ const options = [...offered.map((race) => race.id), ...offered.length > 1 ? [RANDOM_RACE] : []];
47
+ return {
48
+ race: {
49
+ label: "Race",
50
+ options: options.length ? options : [all[0].id],
51
+ labels: {
52
+ ...Object.fromEntries(all.map((race) => [race.id, race.name])),
53
+ [RANDOM_RACE]: "Random"
54
+ },
55
+ default: options[0] ?? all[0].id
56
+ },
57
+ ...own
58
+ };
59
+ }
60
+ //#endregion
61
+ export { seatSettingsOf };
62
+
63
+ //# sourceMappingURL=seatSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seatSettings.js","names":[],"sources":["../../src/server/seatSettings.ts"],"sourcesContent":["/**\n * What a lobby offers to choose for each seat (`seatSettingsOf`): a race where the game has races, and for a game that\n * says how its computers play (`Rules.ai`) a difficulty and a personality, the engine's and the game's own. On the\n * server's side: it reads the computer player's profiles (`@v12-engine/engine/ai`), which the engine's core does not load\n */\nimport type { Rules, ServerHooks } from '#engine/game'\nimport { RANDOM_RACE } from '#engine/races'\nimport { difficultiesOf, personalitiesOf } from '#engine/ai/profiles'\n\n/** A name as a lobby shows it: `insane` as `Insane` */\nconst titled = (id: string) => id.charAt(0).toUpperCase() + id.slice(1)\n\n/**\n * What a lobby offers a computer's seat of a game that says how its computers play (`Rules.ai`, AI plan D1): a\n * difficulty and a personality, the engine's and the game's own. Nothing for a game that says nothing, or `lobby: false`\n */\nfunction computerSettingsOf(game: Rules): NonNullable<ServerHooks['seatSettings']> {\n\tif (!game.ai || game.ai.lobby === false) return {}\n\tconst registry = { module: game }\n\tconst difficulties = Object.keys(difficultiesOf(registry))\n\tconst personalities = Object.keys(personalitiesOf(registry))\n\treturn {\n\t\tdifficulty: {\n\t\t\tlabel: 'Difficulty',\n\t\t\toptions: difficulties,\n\t\t\tlabels: Object.fromEntries(difficulties.map((id) => [id, titled(id)])),\n\t\t\tdefault: game.ai.defaults?.difficulty ?? 'normal'\n\t\t},\n\t\tpersonality: {\n\t\t\tlabel: 'Personality',\n\t\t\toptions: personalities,\n\t\t\tlabels: Object.fromEntries(personalities.map((id) => [id, titled(id)])),\n\t\t\tdefault: game.ai.defaults?.personality ?? 'balanced'\n\t\t}\n\t}\n}\n\n/**\n * What a game offers to choose for each seat in a lobby (`ServerHooks.seatSettings`), with a race among them where the\n * game has races and does not offer its own choice of one: each race, by its name, and `random` where there are two\n * or more; only those of\n * `races` where given (the races a map offers, `GameMap.races`). The first is chosen until someone does\n *\n * @beta\n */\nexport function seatSettingsOf(game: Rules, races?: readonly string[]): NonNullable<ServerHooks['seatSettings']> {\n\tconst own = { ...computerSettingsOf(game), ...game.server?.seatSettings }\n\tconst all = game.races ?? []\n\tif (!all.length || own.race) return own\n\tconst offered = races?.length ? all.filter((race) => races.includes(race.id)) : all\n\t// random where there is more than one to draw from\n\tconst options = [...offered.map((race) => race.id), ...(offered.length > 1 ? [RANDOM_RACE] : [])]\n\treturn {\n\t\trace: {\n\t\t\tlabel: 'Race',\n\t\t\toptions: options.length ? options : [all[0].id],\n\t\t\t// every race's name, those a map fixes for a seat among them\n\t\t\tlabels: { ...Object.fromEntries(all.map((race) => [race.id, race.name])), [RANDOM_RACE]: 'Random' },\n\t\t\tdefault: options[0] ?? all[0].id\n\t\t},\n\t\t...own\n\t}\n}\n"],"mappings":";;;;AAUA,IAAM,UAAU,OAAe,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,MAAM,CAAC;;;;;AAMtE,SAAS,mBAAmB,MAAuD;CAClF,IAAI,CAAC,KAAK,MAAM,KAAK,GAAG,UAAU,OAAO,OAAO,CAAC;CACjD,MAAM,WAAW,EAAE,QAAQ,KAAK;CAChC,MAAM,eAAe,OAAO,KAAK,eAAe,QAAQ,CAAC;CACzD,MAAM,gBAAgB,OAAO,KAAK,gBAAgB,QAAQ,CAAC;CAC3D,OAAO;EACN,YAAY;GACX,OAAO;GACP,SAAS;GACT,QAAQ,OAAO,YAAY,aAAa,KAAK,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;GACrE,SAAS,KAAK,GAAG,UAAU,cAAc;EAC1C;EACA,aAAa;GACZ,OAAO;GACP,SAAS;GACT,QAAQ,OAAO,YAAY,cAAc,KAAK,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;GACtE,SAAS,KAAK,GAAG,UAAU,eAAe;EAC3C;CACD;AACD;;;;;;;;;AAUA,SAAgB,eAAe,MAAa,OAAqE;CAChH,MAAM,MAAM;EAAE,GAAG,mBAAmB,IAAI;EAAG,GAAG,KAAK,QAAQ;CAAa;CACxE,MAAM,MAAM,KAAK,SAAS,CAAC;CAC3B,IAAI,CAAC,IAAI,UAAU,IAAI,MAAM,OAAO;CACpC,MAAM,UAAU,OAAO,SAAS,IAAI,QAAQ,SAAS,MAAM,SAAS,KAAK,EAAE,CAAC,IAAI;CAEhF,MAAM,UAAU,CAAC,GAAG,QAAQ,KAAK,SAAS,KAAK,EAAE,GAAG,GAAI,QAAQ,SAAS,IAAI,CAAC,WAAW,IAAI,CAAC,CAAE;CAChG,OAAO;EACN,MAAM;GACL,OAAO;GACP,SAAS,QAAQ,SAAS,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE;GAE9C,QAAQ;IAAE,GAAG,OAAO,YAAY,IAAI,KAAK,SAAS,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;KAAI,cAAc;GAAS;GAClG,SAAS,QAAQ,MAAM,IAAI,EAAE,CAAC;EAC/B;EACA,GAAG;CACJ;AACD"}
@@ -0,0 +1,13 @@
1
+ import { createHash, timingSafeEqual } from "node:crypto";
2
+ //#region src/server/secret.ts
3
+ /** A secret as bytes of one length, whatever its own: what is compared takes as long whatever it is */
4
+ var digest = (text) => createHash("sha256").update(text).digest();
5
+ /**
6
+ * Whether what was brought is the secret (an admin's key, a key to watch, to the numbers), compared in a time that
7
+ * says nothing of how much of it is right (RV37)
8
+ */
9
+ var sameSecret = (brought, secret) => timingSafeEqual(digest(brought), digest(secret));
10
+ //#endregion
11
+ export { sameSecret };
12
+
13
+ //# sourceMappingURL=secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret.js","names":[],"sources":["../../src/server/secret.ts"],"sourcesContent":["import { createHash, timingSafeEqual } from 'node:crypto'\n\n/** A secret as bytes of one length, whatever its own: what is compared takes as long whatever it is */\nconst digest = (text: string) => createHash('sha256').update(text).digest()\n\n/**\n * Whether what was brought is the secret (an admin's key, a key to watch, to the numbers), compared in a time that\n * says nothing of how much of it is right (RV37)\n */\nexport const sameSecret = (brought: string, secret: string): boolean => timingSafeEqual(digest(brought), digest(secret))\n"],"mappings":";;;AAGA,IAAM,UAAU,SAAiB,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;;;;;AAM1E,IAAa,cAAc,SAAiB,WAA4B,gBAAgB,OAAO,OAAO,GAAG,OAAO,MAAM,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Logger } from '#engine/log';
2
2
  import type { BrainDef } from '#engine/ai/brain';
3
- import type { GameModule } from '#engine/game';
3
+ import type { Rules } from '#engine/game';
4
+ import { type Game } from '#engine/createGame';
4
5
  import type { GameMap } from '#engine/map';
5
6
  import type { World } from '#engine/world';
6
7
  import { GameServer, type GameServerOptions } from './gameServer';
@@ -11,8 +12,13 @@ import { type GameMode, type ModeSeat } from './mode';
11
12
  * @beta
12
13
  */
13
14
  export interface StartServerOptions extends Omit<GameServerOptions, 'mode' | 'port'> {
14
- /** The rules of the game (`GameModule`): of a game defined whole, its `rules`. A server never sees a game's view */
15
- game: GameModule;
15
+ /**
16
+ * The game (`createGame`): its rules, its start (`Game.onStart`) where `onStart` is left out, and its first map where
17
+ * `map`, `makeWorld` and `mode` are. A server never fetches a game's view. Or `rules` in its place
18
+ */
19
+ game?: Game<unknown>;
20
+ /** The module of the game (`Rules`), in the place of `game`: the full API underneath, its start and map said here */
21
+ rules?: Rules;
16
22
  /** The port to listen on: 8787 when left out, 0 for any free one */
17
23
  port?: number;
18
24
  /** A map of the game: each game is played on a world made from it, with a seat for each of its players with a start */
@@ -24,7 +30,7 @@ export interface StartServerOptions extends Omit<GameServerOptions, 'mode' | 'po
24
30
  /** The seats a player may take. Those of the map when left out */
25
31
  seats?: ModeSeat[];
26
32
  /** What the game does once a world is made, before anyone plays: a mission given, the first wave sent */
27
- start?: (world: World, context: {
33
+ onStart?: (world: World, context: {
28
34
  map?: GameMap;
29
35
  settings: Record<string, string>;
30
36
  }) => void | Promise<void>;
@@ -44,11 +50,12 @@ export interface StartServerOptions extends Omit<GameServerOptions, 'mode' | 'po
44
50
  * Starts a server of a game, and resolves once it listens: a lobby that seats who joins, then games of it, one after
45
51
  * the other, each on a world made anew.
46
52
  *
47
- * const server = await startServer({ game: rules, map, start: (world) => startMission(world) })
53
+ * const server = await startServer({ game })
54
+ * const server = await startServer({ rules, map, onStart: (world) => startMission(world) })
48
55
  * // server.port, server.close()
49
56
  *
50
57
  * The parts are there on their own: `GameServer.start` with a `GameMode`, `mapMode`, `SessionHost`
51
58
  *
52
- * @beta
59
+ * @public
53
60
  */
54
61
  export declare function startServer(options: StartServerOptions): Promise<GameServer>;
@@ -0,0 +1,76 @@
1
+ import { isGame } from "../createGame.js";
2
+ import { GameServer } from "./gameServer.js";
3
+ import { againstTheRest, mapMode, seatsOf } from "./mode.js";
4
+ //#region src/server/start.ts
5
+ /**
6
+ * Starts a server of a game, and resolves once it listens: a lobby that seats who joins, then games of it, one after
7
+ * the other, each on a world made anew.
8
+ *
9
+ * const server = await startServer({ game })
10
+ * const server = await startServer({ rules, map, onStart: (world) => startMission(world) })
11
+ * // server.port, server.close()
12
+ *
13
+ * The parts are there on their own: `GameServer.start` with a `GameMode`, `mapMode`, `SessionHost`
14
+ *
15
+ * @public
16
+ */
17
+ async function startServer(options) {
18
+ const { game, rules: givenRules, port = 8787, map: givenMap, makeWorld, seats, onStart: givenStart, computer, mode: givenMode, name, ...server } = options;
19
+ if (game && !isGame(game)) throw new Error("startServer: `game` is a game made by createGame; a module (`Rules`) is given as `rules`");
20
+ const rules = game ? game.toRules() : givenRules;
21
+ if (!rules) throw new Error("startServer: say the game (`game`, made by createGame) or its module (`rules`)");
22
+ const onStart = givenStart ?? game?.toStart();
23
+ const map = givenMap ?? (game && !makeWorld && !givenMode ? await game.loadMap() : void 0);
24
+ return GameServer.start({
25
+ ...server,
26
+ port,
27
+ mode: givenMode ?? modeOf(rules, {
28
+ map,
29
+ makeWorld,
30
+ seats,
31
+ onStart,
32
+ computer,
33
+ name
34
+ })
35
+ });
36
+ }
37
+ /** The mode a server runs, from what it was started with */
38
+ function modeOf(game, options) {
39
+ const { map, makeWorld, onStart } = options;
40
+ if (!map && !makeWorld) throw new Error("startServer: a server needs a map of the game, or a makeWorld, to make the world of each game from");
41
+ const seats = options.seats ?? (map ? seatsOf(map) : void 0);
42
+ if (!seats?.length) throw new Error(map ? `startServer: the map "${map.name}" has no player with a start. Give its players starts, or say the seats` : "startServer: say the seats players may take (seats), with a world made in code");
43
+ const { computer } = options;
44
+ const brain = computer && typeof computer === "object" ? computer : void 0;
45
+ const ai = brain ? againstTheRest : computer;
46
+ const base = map && !makeWorld ? mapMode(game, map, {
47
+ seats,
48
+ ai,
49
+ brain
50
+ }) : void 0;
51
+ return {
52
+ id: base?.id ?? game.id,
53
+ name: options.name ?? base?.name ?? game.name,
54
+ rules: game,
55
+ seats,
56
+ async makeWorld(settings, context) {
57
+ const world = base ? await base.makeWorld(settings, context) : await makeWorld(settings, context);
58
+ try {
59
+ await onStart?.(world, {
60
+ map,
61
+ settings
62
+ });
63
+ } catch (error) {
64
+ world.dispose();
65
+ throw error;
66
+ }
67
+ return world;
68
+ },
69
+ ...ai !== null && { ai: ai ?? againstTheRest },
70
+ ...brain && { brain }
71
+ };
72
+ }
73
+ //#endregion
74
+ export { startServer };
75
+
76
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","names":[],"sources":["../../src/server/start.ts"],"sourcesContent":["import type { Logger } from '#engine/log'\nimport type { BrainDef } from '#engine/ai/brain'\nimport type { Rules } from '#engine/game'\nimport { type Game, isGame } from '#engine/createGame'\nimport type { GameMap } from '#engine/map'\nimport type { World } from '#engine/world'\nimport { GameServer, type GameServerOptions } from './gameServer'\nimport { againstTheRest, type GameMode, mapMode, type ModeSeat, seatsOf } from './mode'\n\n/**\n * What a game server is started with: the game, where its worlds come from, and the server's own options\n *\n * @beta\n */\nexport interface StartServerOptions extends Omit<GameServerOptions, 'mode' | 'port'> {\n\t/**\n\t * The game (`createGame`): its rules, its start (`Game.onStart`) where `onStart` is left out, and its first map where\n\t * `map`, `makeWorld` and `mode` are. A server never fetches a game's view. Or `rules` in its place\n\t */\n\tgame?: Game<unknown>\n\t/** The module of the game (`Rules`), in the place of `game`: the full API underneath, its start and map said here */\n\trules?: Rules\n\t/** The port to listen on: 8787 when left out, 0 for any free one */\n\tport?: number\n\t/** A map of the game: each game is played on a world made from it, with a seat for each of its players with a start */\n\tmap?: GameMap\n\t/** A world made in code for each game, with the lobby's settings: in the place of a map. Says its `seats` too */\n\tmakeWorld?: (settings: Record<string, string>, context?: { log?: Logger }) => World | Promise<World>\n\t/** The seats a player may take. Those of the map when left out */\n\tseats?: ModeSeat[]\n\t/** What the game does once a world is made, before anyone plays: a mission given, the first wave sent */\n\tonStart?: (world: World, context: { map?: GameMap; settings: Record<string, string> }) => void | Promise<void>\n\t/**\n\t * How a computer player in a seat plays (`ai` says which seats, and those nobody took are its too): its options by\n\t * seat (`GameMode.ai`), or the brain that plays every seat of the computer (`defineBrain`), against everyone else's\n\t * base; the first brain the game lists, against everyone else's base when left out; `null` for\n\t * a game the computer does not play. `mode` for a brain by seat (`GameMode.brain`)\n\t */\n\tcomputer?: GameMode['ai'] | BrainDef | null\n\t/** A mode put together elsewhere, in the place of all of the above but the game */\n\tmode?: GameMode\n\t/** What the mode is called. The map's name, or the game's */\n\tname?: string\n}\n\n/**\n * Starts a server of a game, and resolves once it listens: a lobby that seats who joins, then games of it, one after\n * the other, each on a world made anew.\n *\n * const server = await startServer({ game })\n * const server = await startServer({ rules, map, onStart: (world) => startMission(world) })\n * // server.port, server.close()\n *\n * The parts are there on their own: `GameServer.start` with a `GameMode`, `mapMode`, `SessionHost`\n *\n * @public\n */\nexport async function startServer(options: StartServerOptions): Promise<GameServer> {\n\tconst { game, rules: givenRules, port = 8787, map: givenMap, makeWorld, seats, onStart: givenStart, computer, mode: givenMode, name, ...server } = options\n\tif (game && !isGame(game)) throw new Error('startServer: `game` is a game made by createGame; a module (`Rules`) is given as `rules`')\n\tconst rules = game ? game.toRules() : givenRules\n\tif (!rules) throw new Error('startServer: say the game (`game`, made by createGame) or its module (`rules`)')\n\tconst onStart = givenStart ?? game?.toStart()\n\tconst map = givenMap ?? (game && !makeWorld && !givenMode ? await game.loadMap() : undefined)\n\treturn GameServer.start({ ...server, port, mode: givenMode ?? modeOf(rules, { map, makeWorld, seats, onStart, computer, name }) })\n}\n\n/** The mode a server runs, from what it was started with */\nfunction modeOf(game: Rules, options: Pick<StartServerOptions, 'map' | 'makeWorld' | 'seats' | 'onStart' | 'computer' | 'name'>): GameMode {\n\tconst { map, makeWorld, onStart } = options\n\tif (!map && !makeWorld) throw new Error('startServer: a server needs a map of the game, or a makeWorld, to make the world of each game from')\n\tconst seats = options.seats ?? (map ? seatsOf(map) : undefined)\n\tif (!seats?.length) {\n\t\tthrow new Error(\n\t\t\tmap\n\t\t\t\t? `startServer: the map \"${map.name}\" has no player with a start. Give its players starts, or say the seats`\n\t\t\t\t: 'startServer: say the seats players may take (seats), with a world made in code'\n\t\t)\n\t}\n\tconst { computer } = options\n\t// a brain, or the options of each seat\n\tconst brain = computer && typeof computer === 'object' ? computer : undefined\n\tconst ai = brain ? againstTheRest : (computer as GameMode['ai'] | null | undefined)\n\tconst base = map && !makeWorld ? mapMode(game, map, { seats, ai, brain }) : undefined\n\treturn {\n\t\tid: base?.id ?? game.id,\n\t\tname: options.name ?? base?.name ?? game.name,\n\t\trules: game,\n\t\tseats,\n\t\tasync makeWorld(settings, context) {\n\t\t\tconst world = base ? await base.makeWorld(settings, context) : await makeWorld!(settings, context)\n\t\t\ttry {\n\t\t\t\tawait onStart?.(world, { map, settings })\n\t\t\t} catch (error) {\n\t\t\t\tworld.dispose()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\treturn world\n\t\t},\n\t\t...(ai !== null && { ai: ai ?? againstTheRest }),\n\t\t...(brain && { brain })\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyDA,eAAsB,YAAY,SAAkD;CACnF,MAAM,EAAE,MAAM,OAAO,YAAY,OAAO,MAAM,KAAK,UAAU,WAAW,OAAO,SAAS,YAAY,UAAU,MAAM,WAAW,MAAM,GAAG,WAAW;CACnJ,IAAI,QAAQ,CAAC,OAAO,IAAI,GAAG,MAAM,IAAI,MAAM,0FAA0F;CACrI,MAAM,QAAQ,OAAO,KAAK,QAAQ,IAAI;CACtC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,gFAAgF;CAC5G,MAAM,UAAU,cAAc,MAAM,QAAQ;CAC5C,MAAM,MAAM,aAAa,QAAQ,CAAC,aAAa,CAAC,YAAY,MAAM,KAAK,QAAQ,IAAI,KAAA;CACnF,OAAO,WAAW,MAAM;EAAE,GAAG;EAAQ;EAAM,MAAM,aAAa,OAAO,OAAO;GAAE;GAAK;GAAW;GAAO;GAAS;GAAU;EAAK,CAAC;CAAE,CAAC;AAClI;;AAGA,SAAS,OAAO,MAAa,SAA8G;CAC1I,MAAM,EAAE,KAAK,WAAW,YAAY;CACpC,IAAI,CAAC,OAAO,CAAC,WAAW,MAAM,IAAI,MAAM,oGAAoG;CAC5I,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,GAAG,IAAI,KAAA;CACrD,IAAI,CAAC,OAAO,QACX,MAAM,IAAI,MACT,MACG,yBAAyB,IAAI,KAAK,2EAClC,gFACJ;CAED,MAAM,EAAE,aAAa;CAErB,MAAM,QAAQ,YAAY,OAAO,aAAa,WAAW,WAAW,KAAA;CACpE,MAAM,KAAK,QAAQ,iBAAkB;CACrC,MAAM,OAAO,OAAO,CAAC,YAAY,QAAQ,MAAM,KAAK;EAAE;EAAO;EAAI;CAAM,CAAC,IAAI,KAAA;CAC5E,OAAO;EACN,IAAI,MAAM,MAAM,KAAK;EACrB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK;EACzC,OAAO;EACP;EACA,MAAM,UAAU,UAAU,SAAS;GAClC,MAAM,QAAQ,OAAO,MAAM,KAAK,UAAU,UAAU,OAAO,IAAI,MAAM,UAAW,UAAU,OAAO;GACjG,IAAI;IACH,MAAM,UAAU,OAAO;KAAE;KAAK;IAAS,CAAC;GACzC,SAAS,OAAO;IACf,MAAM,QAAQ;IACd,MAAM;GACP;GACA,OAAO;EACR;EACA,GAAI,OAAO,QAAQ,EAAE,IAAI,MAAM,eAAe;EAC9C,GAAI,SAAS,EAAE,MAAM;CACtB;AACD"}
@@ -7,15 +7,22 @@ import type { Transport } from '#engine/session/remote';
7
7
  * @beta
8
8
  */
9
9
  export interface Connection extends Transport {
10
+ /** The address the connection was asked at */
10
11
  readonly url: string;
12
+ /** The network address the connection comes from */
11
13
  readonly address: string;
12
14
  /** Bytes written to it so far, as they go over the wire: compressed, where it is */
13
15
  readonly bytesSent: number;
14
16
  /** Whether what goes over it is compressed (`permessage-deflate`) */
15
17
  readonly compressed: boolean;
16
18
  }
17
- /** @beta */
19
+ /**
20
+ * What `startSocketServer` is started with: the port, the log and the limits and compression of its connections
21
+ *
22
+ * @beta
23
+ */
18
24
  export interface SocketServerOptions {
25
+ /** Port to listen on: 0 for any free one */
19
26
  port: number;
20
27
  /** Where it says what goes wrong with a connection. The root logger when left out */
21
28
  log?: Logger;
@@ -62,6 +69,7 @@ export interface ConnectionSource {
62
69
  * @beta
63
70
  */
64
71
  export interface SocketServer extends ConnectionSource {
72
+ /** The underlying Node HTTP server */
65
73
  readonly server: Server;
66
74
  /** The port it listens on: the one given, or the one it was given for 0 */
67
75
  readonly port: number;
@@ -0,0 +1,306 @@
1
+ import { errorFields, rootLogger } from "../log.js";
2
+ import { createHash } from "node:crypto";
3
+ import { createServer } from "node:http";
4
+ import { constants, createDeflateRaw, inflateRawSync } from "node:zlib";
5
+ //#region src/server/websocket.ts
6
+ var GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
7
+ var TEXT = 1;
8
+ var CONTINUATION = 0;
9
+ var CLOSE = 8;
10
+ var PING = 9;
11
+ var PONG = 10;
12
+ /**
13
+ * Starts a WebSocket server, and resolves once it listens
14
+ *
15
+ * @beta
16
+ */
17
+ function startSocketServer(options) {
18
+ const maxMessage = options.maxMessage ?? 65536;
19
+ const maxConnections = options.maxConnections ?? 1024;
20
+ const limits = {
21
+ idle: (options.idleTimeout ?? 60) * 1e3,
22
+ buffered: options.maxBuffered ?? 16777216
23
+ };
24
+ let handler = () => {};
25
+ const open = /* @__PURE__ */ new Set();
26
+ /** Each connection's own check: pinged when quiet, closed when silent too long */
27
+ const sweeps = /* @__PURE__ */ new Set();
28
+ const sweeper = setInterval(() => {
29
+ for (const sweep of sweeps) sweep();
30
+ }, Math.max(Math.min(limits.idle / 3, 2e4), 50));
31
+ sweeper.unref?.();
32
+ const server = createServer(options.onRequest ?? ((_request, response) => {
33
+ response.writeHead(426, { "content-type": "text/plain" });
34
+ response.end("A game server: connect with a WebSocket\n");
35
+ }));
36
+ server.on("upgrade", (request, socket) => {
37
+ const key = request.headers["sec-websocket-key"];
38
+ if (request.headers.upgrade?.toLowerCase() !== "websocket" || typeof key !== "string") {
39
+ socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
40
+ return;
41
+ }
42
+ if (open.size >= maxConnections) {
43
+ socket.end("HTTP/1.1 503 Service Unavailable\r\nContent-Length: 0\r\n\r\n");
44
+ return;
45
+ }
46
+ const accept = createHash("sha1").update(key + GUID).digest("base64");
47
+ const offered = String(request.headers["sec-websocket-extensions"] ?? "");
48
+ const compressed = (options.compress ?? true) && /(^|,)\s*permessage-deflate\b/.test(offered);
49
+ const extension = compressed ? "Sec-WebSocket-Extensions: permessage-deflate; client_no_context_takeover\r\n" : "";
50
+ socket.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: ${accept}\r\n${extension}\r\n`);
51
+ open.add(socket);
52
+ const { connection, sweep } = connectionOf(socket, request, maxMessage, compressed, limits, options.log ?? rootLogger);
53
+ sweeps.add(sweep);
54
+ socket.on("close", () => {
55
+ open.delete(socket);
56
+ sweeps.delete(sweep);
57
+ });
58
+ handler(connection);
59
+ });
60
+ return new Promise((resolve) => server.listen(options.port, () => {
61
+ const address = server.address();
62
+ resolve({
63
+ server,
64
+ port: typeof address === "object" && address ? address.port : options.port,
65
+ onConnection: (next) => handler = next,
66
+ close: () => new Promise((done) => {
67
+ clearInterval(sweeper);
68
+ for (const socket of open) socket.destroy();
69
+ server.close(() => done());
70
+ })
71
+ });
72
+ }));
73
+ }
74
+ /** The end every compressed message has, which the wire leaves off (RFC 7692): an empty block of a sync flush */
75
+ var SYNC_TAIL = Buffer.from([
76
+ 0,
77
+ 0,
78
+ 255,
79
+ 255
80
+ ]);
81
+ /** Messages shorter than this go as they are: compressing them would save next to nothing */
82
+ var COMPRESS_FROM = 64;
83
+ /** Milliseconds a connection closed from here stays open for the other end's own close, which says it has read everything */
84
+ var CLOSE_WAIT = 1e3;
85
+ /** A frame to send: a server's are never masked. `deflated` marks a compressed message (RSV1) */
86
+ function frame(opcode, payload, deflated = false) {
87
+ const length = payload.length;
88
+ const head = length < 126 ? Buffer.alloc(2) : length < 65536 ? Buffer.alloc(4) : Buffer.alloc(10);
89
+ head[0] = 128 | (deflated ? 64 : 0) | opcode;
90
+ if (length < 126) head[1] = length;
91
+ else if (length < 65536) {
92
+ head[1] = 126;
93
+ head.writeUInt16BE(length, 2);
94
+ } else {
95
+ head[1] = 127;
96
+ head.writeBigUInt64BE(BigInt(length), 2);
97
+ }
98
+ return Buffer.concat([head, payload]);
99
+ }
100
+ /**
101
+ * Compresses messages one after another against all the ones before (`permessage-deflate` with context): a delta
102
+ * says much of what the one before it said, which the compressor remembers. In order, as zlib works in the background
103
+ */
104
+ var Compressor = class {
105
+ deflate = createDeflateRaw({
106
+ windowBits: 15,
107
+ memLevel: 8
108
+ });
109
+ chunks = [];
110
+ /** The last message being compressed: the next waits for it, so that they go out in order */
111
+ queue = Promise.resolve();
112
+ /** Closed: what is still queued is let go, not written into a stream that is gone */
113
+ closed = false;
114
+ constructor() {
115
+ this.deflate.on("data", (chunk) => this.chunks.push(chunk));
116
+ }
117
+ /** Compresses a message, and hands it on when done: in the order they were given */
118
+ compress(message, done) {
119
+ this.queue = this.queue.then(() => new Promise((resolve) => {
120
+ if (this.closed) return resolve();
121
+ this.deflate.write(message);
122
+ this.deflate.flush(constants.Z_SYNC_FLUSH, () => {
123
+ const all = Buffer.concat(this.chunks.splice(0));
124
+ done(all.subarray(0, all.length - SYNC_TAIL.length));
125
+ resolve();
126
+ });
127
+ }));
128
+ }
129
+ /** Runs once what is being compressed has gone: for what goes as it is, in its turn */
130
+ after(run) {
131
+ this.queue = this.queue.then(run);
132
+ }
133
+ close() {
134
+ if (this.closed) return;
135
+ this.closed = true;
136
+ this.deflate.close();
137
+ }
138
+ };
139
+ function connectionOf(socket, request, maxMessage, compressed, limits, log) {
140
+ let onMessage = () => {};
141
+ let onClose = () => {};
142
+ let closed = false;
143
+ let buffer = Buffer.alloc(0);
144
+ /** The parts of a text message sent in several frames, until its last, and whether it came compressed */
145
+ let parts = [];
146
+ let deflated = false;
147
+ let bytesSent = 0;
148
+ const compressor = compressed ? new Compressor() : void 0;
149
+ /** Whether the close frame has gone: nothing more is written after it */
150
+ let ended = false;
151
+ /** When something last came in */
152
+ let heardAt = Date.now();
153
+ const write = (data) => {
154
+ if (ended || socket.destroyed) return;
155
+ bytesSent += data.length;
156
+ socket.write(data);
157
+ if (socket.writableLength > limits.buffered) {
158
+ log.warn("server", "a connection took in too slowly, it is closed", {
159
+ waiting: socket.writableLength,
160
+ address: request.socket.remoteAddress
161
+ });
162
+ ended = true;
163
+ socket.destroy();
164
+ }
165
+ };
166
+ const shut = () => {
167
+ if (closed) return;
168
+ closed = true;
169
+ onClose();
170
+ };
171
+ /** Our close has gone, and the other end's is waited for, a moment: what comes in is read for that alone */
172
+ let lingering;
173
+ const end = () => {
174
+ clearTimeout(lingering);
175
+ lingering = void 0;
176
+ socket.end();
177
+ };
178
+ /** `answering`: the other end closed first, and has nothing more to say or to read */
179
+ const close = (code = 1e3, answering = false) => {
180
+ if (closed) return;
181
+ const payload = Buffer.alloc(2);
182
+ payload.writeUInt16BE(code, 0);
183
+ const finish = () => {
184
+ write(frame(CLOSE, payload));
185
+ ended = true;
186
+ compressor?.close();
187
+ if (answering || socket.destroyed) return end();
188
+ lingering = setTimeout(end, CLOSE_WAIT);
189
+ lingering.unref?.();
190
+ };
191
+ if (compressor) compressor.after(finish);
192
+ else finish();
193
+ shut();
194
+ };
195
+ socket.on("data", (data) => {
196
+ if (closed && !lingering) return;
197
+ heardAt = Date.now();
198
+ buffer = Buffer.concat([buffer, data]);
199
+ for (;;) {
200
+ if (closed && !lingering || buffer.length < 2) return;
201
+ const fin = (buffer[0] & 128) !== 0;
202
+ const rsv1 = (buffer[0] & 64) !== 0;
203
+ const opcode = buffer[0] & 15;
204
+ const masked = (buffer[1] & 128) !== 0;
205
+ let length = buffer[1] & 127;
206
+ let at = 2;
207
+ if (length === 126) {
208
+ if (buffer.length < 4) return;
209
+ length = buffer.readUInt16BE(2);
210
+ at = 4;
211
+ } else if (length === 127) {
212
+ if (buffer.length < 10) return;
213
+ const long = buffer.readBigUInt64BE(2);
214
+ if (long > BigInt(maxMessage)) return closed ? end() : close(1009);
215
+ length = Number(long);
216
+ at = 10;
217
+ }
218
+ if (!masked) return closed ? end() : close(1002);
219
+ if (length > maxMessage) return closed ? end() : close(1009);
220
+ if (buffer.length < at + 4 + length) return;
221
+ const mask = buffer.subarray(at, at + 4);
222
+ const payload = Buffer.from(buffer.subarray(at + 4, at + 4 + length));
223
+ for (let i = 0; i < payload.length; i++) payload[i] ^= mask[i & 3];
224
+ buffer = buffer.subarray(at + 4 + length);
225
+ if (closed) {
226
+ if (opcode === CLOSE) return end();
227
+ continue;
228
+ }
229
+ if (opcode === TEXT || opcode === CONTINUATION) {
230
+ if (opcode === TEXT) deflated = rsv1 && compressed;
231
+ parts.push(payload);
232
+ if (parts.reduce((sum, part) => sum + part.length, 0) > maxMessage) return close(1009);
233
+ if (!fin) continue;
234
+ let data = Buffer.concat(parts);
235
+ parts = [];
236
+ if (deflated) try {
237
+ data = inflateRawSync(Buffer.concat([data, SYNC_TAIL]), {
238
+ maxOutputLength: maxMessage,
239
+ finishFlush: constants.Z_SYNC_FLUSH
240
+ });
241
+ } catch {
242
+ return close(1009);
243
+ }
244
+ try {
245
+ onMessage(data.toString("utf8"));
246
+ } catch (error) {
247
+ log.error("server", "a message could not be handled, the connection is closed", {
248
+ error: errorFields(error),
249
+ address: request.socket.remoteAddress
250
+ });
251
+ return close(1011);
252
+ }
253
+ } else if (opcode === PING) write(frame(PONG, payload));
254
+ else if (opcode === CLOSE) return close(1e3, true);
255
+ }
256
+ });
257
+ const gone = () => {
258
+ clearTimeout(lingering);
259
+ lingering = void 0;
260
+ ended = true;
261
+ compressor?.close();
262
+ shut();
263
+ };
264
+ socket.on("close", gone);
265
+ socket.on("error", gone);
266
+ const connection = {
267
+ url: request.url ?? "/",
268
+ address: request.socket.remoteAddress ?? "",
269
+ compressed,
270
+ get bytesSent() {
271
+ return bytesSent;
272
+ },
273
+ send(message) {
274
+ if (closed) return;
275
+ const data = Buffer.from(message, "utf8");
276
+ if (!compressor || data.length < COMPRESS_FROM) {
277
+ if (compressor) compressor.after(() => write(frame(TEXT, data)));
278
+ else write(frame(TEXT, data));
279
+ return;
280
+ }
281
+ compressor.compress(data, (deflatedData) => write(frame(TEXT, deflatedData, true)));
282
+ },
283
+ onMessage(next) {
284
+ onMessage = next;
285
+ },
286
+ onClose(next) {
287
+ onClose = next;
288
+ },
289
+ close: () => close()
290
+ };
291
+ /** Pings a connection that has been quiet, and closes one that has said nothing for longer than it may */
292
+ const sweep = () => {
293
+ if (closed) return;
294
+ const quiet = Date.now() - heardAt;
295
+ if (quiet > limits.idle) return close(1001);
296
+ if (quiet > limits.idle / 3) write(frame(PING, Buffer.alloc(0)));
297
+ };
298
+ return {
299
+ connection,
300
+ sweep
301
+ };
302
+ }
303
+ //#endregion
304
+ export { startSocketServer };
305
+
306
+ //# sourceMappingURL=websocket.js.map