@classytic/stage 0.2.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 (458) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -1
  3. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  4. package/dist/assets/index.mjs +0 -1
  5. package/dist/atomic/aufbau.d.mts +144 -0
  6. package/dist/atomic/aufbau.mjs +384 -0
  7. package/dist/atomic/elements.d.mts +67 -0
  8. package/dist/atomic/elements.mjs +785 -0
  9. package/dist/atomic/emission.d.mts +112 -0
  10. package/dist/atomic/emission.mjs +179 -0
  11. package/dist/atomic/index.d.mts +8 -0
  12. package/dist/atomic/index.mjs +9 -0
  13. package/dist/atomic/periodic.d.mts +82 -0
  14. package/dist/atomic/periodic.mjs +231 -0
  15. package/dist/atomic/properties.d.mts +100 -0
  16. package/dist/atomic/properties.mjs +574 -0
  17. package/dist/atomic/shells.d.mts +137 -0
  18. package/dist/atomic/shells.mjs +170 -0
  19. package/dist/atomic/trends.d.mts +148 -0
  20. package/dist/atomic/trends.mjs +225 -0
  21. package/dist/builder/Palette.mjs +50 -89
  22. package/dist/builder/SceneBuilder.mjs +15 -73
  23. package/dist/chem/chromatography.d.mts +66 -0
  24. package/dist/chem/chromatography.mjs +63 -0
  25. package/dist/chem/complex.d.mts +114 -0
  26. package/dist/chem/complex.mjs +234 -0
  27. package/dist/chem/cycle.d.mts +75 -0
  28. package/dist/chem/cycle.mjs +145 -0
  29. package/dist/chem/equation.d.mts +86 -0
  30. package/dist/chem/equation.mjs +168 -0
  31. package/dist/chem/formula.d.mts +90 -0
  32. package/dist/chem/formula.mjs +201 -0
  33. package/dist/chem/functional-groups.d.mts +31 -0
  34. package/dist/chem/functional-groups.mjs +187 -0
  35. package/dist/chem/hazard.d.mts +94 -0
  36. package/dist/chem/hazard.mjs +329 -0
  37. package/dist/chem/index.d.mts +34 -33
  38. package/dist/chem/index.mjs +34 -28
  39. package/dist/chem/ionic.d.mts +98 -0
  40. package/dist/chem/ionic.mjs +156 -0
  41. package/dist/chem/layout.d.mts +46 -0
  42. package/dist/chem/layout.mjs +342 -0
  43. package/dist/chem/lewis.d.mts +79 -0
  44. package/dist/chem/lewis.mjs +163 -0
  45. package/dist/chem/molecular-orbital.d.mts +114 -0
  46. package/dist/chem/molecular-orbital.mjs +201 -0
  47. package/dist/chem/molecule.d.mts +154 -0
  48. package/dist/chem/molecule.mjs +282 -0
  49. package/dist/chem/nmr.d.mts +153 -0
  50. package/dist/chem/nmr.mjs +165 -0
  51. package/dist/chem/polymer.d.mts +65 -0
  52. package/dist/chem/polymer.mjs +179 -0
  53. package/dist/chem/redox.d.mts +138 -0
  54. package/dist/chem/redox.mjs +328 -0
  55. package/dist/chem/relations.d.mts +183 -0
  56. package/dist/chem/relations.mjs +299 -0
  57. package/dist/chem/skeleton.d.mts +51 -0
  58. package/dist/chem/skeleton.mjs +186 -0
  59. package/dist/chem/solution.d.mts +116 -0
  60. package/dist/chem/solution.mjs +186 -0
  61. package/dist/chem/species.d.mts +47 -0
  62. package/dist/chem/species.mjs +128 -0
  63. package/dist/chem/stereo.d.mts +108 -0
  64. package/dist/chem/stereo.mjs +286 -0
  65. package/dist/chem/stoichiometry.d.mts +95 -0
  66. package/dist/chem/stoichiometry.mjs +145 -0
  67. package/dist/chem/synthesis.d.mts +113 -0
  68. package/dist/chem/synthesis.mjs +281 -0
  69. package/dist/chem/vsepr.d.mts +80 -0
  70. package/dist/chem/vsepr.mjs +247 -0
  71. package/dist/circuit/ac.d.mts +163 -0
  72. package/dist/circuit/ac.mjs +452 -0
  73. package/dist/circuit/dc.d.mts +92 -0
  74. package/dist/circuit/dc.mjs +333 -0
  75. package/dist/circuit/index.d.mts +5 -92
  76. package/dist/circuit/index.mjs +5 -332
  77. package/dist/circuit/network.d.mts +99 -0
  78. package/dist/circuit/network.mjs +440 -0
  79. package/dist/circuit/topology.d.mts +102 -0
  80. package/dist/circuit/topology.mjs +143 -0
  81. package/dist/colour/absorption.d.mts +79 -0
  82. package/dist/colour/absorption.mjs +137 -0
  83. package/dist/colour/index.d.mts +6 -0
  84. package/dist/colour/index.mjs +7 -0
  85. package/dist/colour/name.d.mts +14 -0
  86. package/dist/colour/name.mjs +76 -0
  87. package/dist/colour/observer.d.mts +31 -0
  88. package/dist/colour/observer.mjs +46 -0
  89. package/dist/colour/spectrum.d.mts +61 -0
  90. package/dist/colour/spectrum.mjs +108 -0
  91. package/dist/colour/srgb.d.mts +49 -0
  92. package/dist/colour/srgb.mjs +108 -0
  93. package/dist/core/constants.d.mts +138 -0
  94. package/dist/core/constants.mjs +139 -0
  95. package/dist/core/index.d.mts +4 -1
  96. package/dist/core/index.mjs +4 -1
  97. package/dist/core/math.d.mts +26 -0
  98. package/dist/core/math.mjs +37 -0
  99. package/dist/core/vec3.d.mts +94 -0
  100. package/dist/core/vec3.mjs +123 -0
  101. package/dist/core/worked.d.mts +35 -0
  102. package/dist/core/worked.mjs +44 -0
  103. package/dist/electro/cell.d.mts +102 -0
  104. package/dist/electro/cell.mjs +170 -0
  105. package/dist/electro/conductivity.d.mts +157 -0
  106. package/dist/electro/conductivity.mjs +156 -0
  107. package/dist/electro/couples.d.mts +114 -0
  108. package/dist/electro/couples.mjs +334 -0
  109. package/dist/electro/electrolysis.d.mts +96 -0
  110. package/dist/electro/electrolysis.mjs +274 -0
  111. package/dist/electro/faraday.d.mts +150 -0
  112. package/dist/electro/faraday.mjs +118 -0
  113. package/dist/electro/index.d.mts +6 -0
  114. package/dist/electro/index.mjs +7 -0
  115. package/dist/finance/accounting/adjustments.d.mts +17 -0
  116. package/dist/finance/accounting/adjustments.mjs +202 -0
  117. package/dist/finance/accounting/analysis.d.mts +8 -0
  118. package/dist/finance/accounting/analysis.mjs +205 -0
  119. package/dist/finance/accounting/clubs.d.mts +21 -0
  120. package/dist/finance/accounting/clubs.mjs +217 -0
  121. package/dist/finance/accounting/company-statements.d.mts +7 -0
  122. package/dist/finance/accounting/company-statements.mjs +150 -0
  123. package/dist/finance/accounting/harness.d.mts +7 -0
  124. package/dist/finance/accounting/harness.mjs +45 -0
  125. package/dist/finance/accounting/index.d.mts +18 -0
  126. package/dist/finance/accounting/index.mjs +18 -0
  127. package/dist/finance/accounting/journalize.d.mts +16 -0
  128. package/dist/finance/accounting/journalize.mjs +128 -0
  129. package/dist/finance/accounting/manufacturing.d.mts +8 -0
  130. package/dist/finance/accounting/manufacturing.mjs +236 -0
  131. package/dist/finance/accounting/partnership.d.mts +7 -0
  132. package/dist/finance/accounting/partnership.mjs +152 -0
  133. package/dist/finance/accounting/period-case.d.mts +6 -0
  134. package/dist/finance/accounting/period-case.mjs +71 -0
  135. package/dist/finance/accounting/post.d.mts +9 -0
  136. package/dist/finance/accounting/post.mjs +84 -0
  137. package/dist/finance/accounting/precision.d.mts +9 -0
  138. package/dist/finance/accounting/precision.mjs +15 -0
  139. package/dist/finance/accounting/rules.d.mts +21 -0
  140. package/dist/finance/accounting/rules.mjs +37 -0
  141. package/dist/finance/accounting/solve.d.mts +28 -0
  142. package/dist/finance/accounting/solve.mjs +92 -0
  143. package/dist/finance/accounting/statements.d.mts +7 -0
  144. package/dist/finance/accounting/statements.mjs +142 -0
  145. package/dist/finance/accounting/types.d.mts +649 -0
  146. package/dist/finance/accounting/validate.d.mts +7 -0
  147. package/dist/finance/accounting/validate.mjs +67 -0
  148. package/dist/finance/accounting/verification.d.mts +24 -0
  149. package/dist/finance/accounting/verification.mjs +386 -0
  150. package/dist/finance/bizsim.d.mts +75 -0
  151. package/dist/finance/bizsim.mjs +296 -0
  152. package/dist/finance/index.d.mts +95 -0
  153. package/dist/finance/index.mjs +145 -0
  154. package/dist/finance/investment-math.d.mts +7 -0
  155. package/dist/finance/investment-math.mjs +18 -0
  156. package/dist/finance/management-accounting/budgeting.d.mts +7 -0
  157. package/dist/finance/management-accounting/budgeting.mjs +189 -0
  158. package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
  159. package/dist/finance/management-accounting/cash-budget.mjs +154 -0
  160. package/dist/finance/management-accounting/costing.d.mts +8 -0
  161. package/dist/finance/management-accounting/costing.mjs +175 -0
  162. package/dist/finance/management-accounting/decisions.d.mts +8 -0
  163. package/dist/finance/management-accounting/decisions.mjs +164 -0
  164. package/dist/finance/management-accounting/index.d.mts +13 -0
  165. package/dist/finance/management-accounting/index.mjs +13 -0
  166. package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
  167. package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
  168. package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
  169. package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
  170. package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
  171. package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
  172. package/dist/finance/management-accounting/management-case.d.mts +8 -0
  173. package/dist/finance/management-accounting/management-case.mjs +91 -0
  174. package/dist/finance/management-accounting/master-budget.d.mts +7 -0
  175. package/dist/finance/management-accounting/master-budget.mjs +137 -0
  176. package/dist/finance/management-accounting/production-costing.d.mts +8 -0
  177. package/dist/finance/management-accounting/production-costing.mjs +214 -0
  178. package/dist/finance/management-accounting/types.d.mts +644 -0
  179. package/dist/finance/management-accounting/variances.d.mts +7 -0
  180. package/dist/finance/management-accounting/variances.mjs +150 -0
  181. package/dist/index.d.mts +9 -8
  182. package/dist/index.mjs +5 -5
  183. package/dist/interaction/MovableDot.mjs +19 -0
  184. package/dist/interaction/useDraggable.mjs +24 -4
  185. package/dist/math/analysis.d.mts +61 -0
  186. package/dist/math/analysis.mjs +187 -0
  187. package/dist/math/answer-check.d.mts +50 -0
  188. package/dist/math/answer-check.mjs +106 -0
  189. package/dist/math/calculus.d.mts +17 -1
  190. package/dist/math/calculus.mjs +365 -2
  191. package/dist/math/complex.d.mts +93 -0
  192. package/dist/math/complex.mjs +239 -0
  193. package/dist/math/expr.d.mts +23 -0
  194. package/dist/math/expr.mjs +36 -0
  195. package/dist/math/index.d.mts +9 -23
  196. package/dist/math/index.mjs +9 -38
  197. package/dist/math/latex.mjs +10 -1
  198. package/dist/math/parse.mjs +1 -1
  199. package/dist/math/poly.d.mts +55 -0
  200. package/dist/math/poly.mjs +273 -0
  201. package/dist/math/rearrange.d.mts +14 -0
  202. package/dist/math/rearrange.mjs +125 -0
  203. package/dist/math/solve.d.mts +21 -0
  204. package/dist/math/solve.mjs +75 -0
  205. package/dist/networking/addressing.d.mts +26 -0
  206. package/dist/networking/addressing.mjs +33 -0
  207. package/dist/networking/cloud/access.d.mts +36 -0
  208. package/dist/networking/cloud/access.mjs +95 -0
  209. package/dist/networking/cloud/containers.d.mts +43 -0
  210. package/dist/networking/cloud/containers.mjs +54 -0
  211. package/dist/networking/cloud/edge.d.mts +17 -0
  212. package/dist/networking/cloud/edge.mjs +31 -0
  213. package/dist/networking/cloud/failure-domains.d.mts +19 -0
  214. package/dist/networking/cloud/failure-domains.mjs +22 -0
  215. package/dist/networking/cloud/geo-routing.d.mts +22 -0
  216. package/dist/networking/cloud/geo-routing.mjs +64 -0
  217. package/dist/networking/cloud/index.d.mts +18 -0
  218. package/dist/networking/cloud/index.mjs +19 -0
  219. package/dist/networking/cloud/inference-reliability.d.mts +30 -0
  220. package/dist/networking/cloud/inference-reliability.mjs +76 -0
  221. package/dist/networking/cloud/inference.d.mts +118 -0
  222. package/dist/networking/cloud/inference.mjs +179 -0
  223. package/dist/networking/cloud/infrastructure.d.mts +45 -0
  224. package/dist/networking/cloud/infrastructure.mjs +96 -0
  225. package/dist/networking/cloud/observability.d.mts +24 -0
  226. package/dist/networking/cloud/observability.mjs +34 -0
  227. package/dist/networking/cloud/orchestration.d.mts +32 -0
  228. package/dist/networking/cloud/orchestration.mjs +38 -0
  229. package/dist/networking/cloud/recovery.d.mts +21 -0
  230. package/dist/networking/cloud/recovery.mjs +27 -0
  231. package/dist/networking/cloud/releases.d.mts +42 -0
  232. package/dist/networking/cloud/releases.mjs +135 -0
  233. package/dist/networking/cloud/scaling.d.mts +25 -0
  234. package/dist/networking/cloud/scaling.mjs +65 -0
  235. package/dist/networking/cloud/secrets.d.mts +39 -0
  236. package/dist/networking/cloud/secrets.mjs +68 -0
  237. package/dist/networking/cloud/server-deployment.d.mts +29 -0
  238. package/dist/networking/cloud/server-deployment.mjs +72 -0
  239. package/dist/networking/cloud/storage.d.mts +16 -0
  240. package/dist/networking/cloud/storage.mjs +58 -0
  241. package/dist/networking/cloud/vpc.d.mts +18 -0
  242. package/dist/networking/cloud/vpc.mjs +100 -0
  243. package/dist/networking/delivery.d.mts +34 -0
  244. package/dist/networking/delivery.mjs +52 -0
  245. package/dist/networking/index.d.mts +47 -0
  246. package/dist/networking/index.mjs +47 -0
  247. package/dist/networking/ipv6.d.mts +28 -0
  248. package/dist/networking/ipv6.mjs +17 -0
  249. package/dist/networking/journeys.d.mts +83 -0
  250. package/dist/networking/journeys.mjs +161 -0
  251. package/dist/networking/models/airtime.d.mts +87 -0
  252. package/dist/networking/models/airtime.mjs +130 -0
  253. package/dist/networking/models/cellular.d.mts +157 -0
  254. package/dist/networking/models/cellular.mjs +252 -0
  255. package/dist/networking/models/encapsulation.d.mts +98 -0
  256. package/dist/networking/models/encapsulation.mjs +132 -0
  257. package/dist/networking/models/handover.d.mts +116 -0
  258. package/dist/networking/models/handover.mjs +209 -0
  259. package/dist/networking/models/handshake.d.mts +90 -0
  260. package/dist/networking/models/handshake.mjs +122 -0
  261. package/dist/networking/models/index.d.mts +14 -0
  262. package/dist/networking/models/index.mjs +15 -0
  263. package/dist/networking/models/media.d.mts +82 -0
  264. package/dist/networking/models/media.mjs +188 -0
  265. package/dist/networking/models/satellite.d.mts +86 -0
  266. package/dist/networking/models/satellite.mjs +121 -0
  267. package/dist/networking/models/spectrum.d.mts +83 -0
  268. package/dist/networking/models/spectrum.mjs +235 -0
  269. package/dist/networking/models/switch.d.mts +80 -0
  270. package/dist/networking/models/switch.mjs +155 -0
  271. package/dist/networking/models/vlan.d.mts +62 -0
  272. package/dist/networking/models/vlan.mjs +100 -0
  273. package/dist/networking/models/vpn.d.mts +66 -0
  274. package/dist/networking/models/vpn.mjs +125 -0
  275. package/dist/networking/models/wifi-privacy.d.mts +82 -0
  276. package/dist/networking/models/wifi-privacy.mjs +130 -0
  277. package/dist/networking/models/wifi.d.mts +240 -0
  278. package/dist/networking/models/wifi.mjs +562 -0
  279. package/dist/networking/nat-traversal.d.mts +24 -0
  280. package/dist/networking/nat-traversal.mjs +38 -0
  281. package/dist/networking/protocols.d.mts +17 -0
  282. package/dist/networking/protocols.mjs +57 -0
  283. package/dist/networking/queue.d.mts +12 -0
  284. package/dist/networking/queue.mjs +18 -0
  285. package/dist/networking/route-learning.d.mts +23 -0
  286. package/dist/networking/route-learning.mjs +43 -0
  287. package/dist/networking/routing.d.mts +11 -0
  288. package/dist/networking/routing.mjs +25 -0
  289. package/dist/networking/signals.d.mts +26 -0
  290. package/dist/networking/signals.mjs +35 -0
  291. package/dist/networking/subnet.d.mts +49 -0
  292. package/dist/networking/subnet.mjs +89 -0
  293. package/dist/networking/tcp-reliability.d.mts +24 -0
  294. package/dist/networking/tcp-reliability.mjs +38 -0
  295. package/dist/networking/topology/contract.d.mts +123 -0
  296. package/dist/networking/topology/index.d.mts +4 -0
  297. package/dist/networking/topology/index.mjs +4 -0
  298. package/dist/networking/topology/presets.d.mts +7 -0
  299. package/dist/networking/topology/presets.mjs +302 -0
  300. package/dist/networking/topology/simulation.d.mts +8 -0
  301. package/dist/networking/topology/simulation.mjs +179 -0
  302. package/dist/networking/wireless.d.mts +11 -0
  303. package/dist/networking/wireless.mjs +17 -0
  304. package/dist/optics/imaging.d.mts +218 -0
  305. package/dist/optics/imaging.mjs +276 -0
  306. package/dist/optics/index.d.mts +7 -0
  307. package/dist/optics/index.mjs +8 -0
  308. package/dist/optics/laws.d.mts +70 -0
  309. package/dist/optics/laws.mjs +195 -0
  310. package/dist/optics/prism.d.mts +148 -0
  311. package/dist/optics/prism.mjs +197 -0
  312. package/dist/optics/refraction.d.mts +201 -0
  313. package/dist/optics/refraction.mjs +270 -0
  314. package/dist/optics/wave-optics.d.mts +171 -0
  315. package/dist/optics/wave-optics.mjs +259 -0
  316. package/dist/physics/ac/index.d.mts +183 -0
  317. package/dist/physics/ac/index.mjs +203 -0
  318. package/dist/physics/dynamics/forces.d.mts +98 -0
  319. package/dist/physics/dynamics/forces.mjs +153 -0
  320. package/dist/physics/dynamics/friction.d.mts +76 -0
  321. package/dist/physics/dynamics/friction.mjs +119 -0
  322. package/dist/physics/dynamics/system.d.mts +68 -0
  323. package/dist/physics/dynamics/system.mjs +125 -0
  324. package/dist/physics/electrostatics/index.d.mts +169 -0
  325. package/dist/physics/electrostatics/index.mjs +249 -0
  326. package/dist/physics/energy/centre-of-mass.d.mts +115 -0
  327. package/dist/physics/energy/centre-of-mass.mjs +180 -0
  328. package/dist/physics/energy/conservation.d.mts +81 -0
  329. package/dist/physics/energy/conservation.mjs +129 -0
  330. package/dist/physics/energy/power.d.mts +90 -0
  331. package/dist/physics/energy/power.mjs +167 -0
  332. package/dist/physics/energy/spring.d.mts +73 -0
  333. package/dist/physics/energy/spring.mjs +129 -0
  334. package/dist/physics/energy/store.d.mts +63 -0
  335. package/dist/physics/energy/store.mjs +108 -0
  336. package/dist/physics/energy/theorem.d.mts +65 -0
  337. package/dist/physics/energy/theorem.mjs +113 -0
  338. package/dist/physics/energy/work.d.mts +114 -0
  339. package/dist/physics/energy/work.mjs +219 -0
  340. package/dist/physics/gravitation/body.d.mts +85 -0
  341. package/dist/physics/gravitation/body.mjs +168 -0
  342. package/dist/physics/gravitation/kepler.d.mts +127 -0
  343. package/dist/physics/gravitation/kepler.mjs +216 -0
  344. package/dist/physics/gravitation/law.d.mts +117 -0
  345. package/dist/physics/gravitation/law.mjs +175 -0
  346. package/dist/physics/gravitation/orbit.d.mts +119 -0
  347. package/dist/physics/gravitation/orbit.mjs +202 -0
  348. package/dist/physics/gravitation/potential.d.mts +114 -0
  349. package/dist/physics/gravitation/potential.mjs +202 -0
  350. package/dist/physics/gravitation/variation.d.mts +97 -0
  351. package/dist/physics/gravitation/variation.mjs +175 -0
  352. package/dist/physics/index.d.mts +35 -0
  353. package/dist/physics/index.mjs +36 -0
  354. package/dist/physics/integral-sweep.d.mts +63 -0
  355. package/dist/physics/integral-sweep.mjs +126 -0
  356. package/dist/physics/kinematics/equations.d.mts +47 -0
  357. package/dist/physics/kinematics/equations.mjs +126 -0
  358. package/dist/physics/kinematics/free-fall.d.mts +53 -0
  359. package/dist/physics/kinematics/free-fall.mjs +71 -0
  360. package/dist/physics/kinematics/given.d.mts +16 -0
  361. package/dist/physics/kinematics/given.mjs +55 -0
  362. package/dist/physics/kinematics/roots.d.mts +41 -0
  363. package/dist/physics/kinematics/roots.mjs +72 -0
  364. package/dist/physics/kinematics/solve.d.mts +52 -0
  365. package/dist/physics/kinematics/solve.mjs +172 -0
  366. package/dist/physics/magnetism/biot-savart.d.mts +161 -0
  367. package/dist/physics/magnetism/biot-savart.mjs +353 -0
  368. package/dist/physics/magnetism/flux.d.mts +94 -0
  369. package/dist/physics/magnetism/flux.mjs +313 -0
  370. package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
  371. package/dist/physics/magnetism/geomagnetism.mjs +184 -0
  372. package/dist/physics/magnetism/index.d.mts +12 -0
  373. package/dist/physics/magnetism/index.mjs +74 -0
  374. package/dist/physics/magnetism/lorentz.d.mts +28 -0
  375. package/dist/physics/magnetism/lorentz.mjs +88 -0
  376. package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
  377. package/dist/physics/magnetism/magnetic-force.mjs +169 -0
  378. package/dist/physics/momentum/collide.d.mts +77 -0
  379. package/dist/physics/momentum/collide.mjs +115 -0
  380. package/dist/physics/momentum/impulse.d.mts +89 -0
  381. package/dist/physics/momentum/impulse.mjs +159 -0
  382. package/dist/physics/momentum/planar.d.mts +60 -0
  383. package/dist/physics/momentum/planar.mjs +110 -0
  384. package/dist/physics/projectile.d.mts +107 -0
  385. package/dist/physics/projectile.mjs +185 -0
  386. package/dist/physics/rotation/angular.d.mts +85 -0
  387. package/dist/physics/rotation/angular.mjs +130 -0
  388. package/dist/physics/rotation/circular.d.mts +79 -0
  389. package/dist/physics/rotation/circular.mjs +131 -0
  390. package/dist/physics/rotation/inertia.d.mts +164 -0
  391. package/dist/physics/rotation/inertia.mjs +332 -0
  392. package/dist/physics/rotation/torque.d.mts +65 -0
  393. package/dist/physics/rotation/torque.mjs +134 -0
  394. package/dist/physics/vectors.d.mts +64 -0
  395. package/dist/physics/vectors.mjs +114 -0
  396. package/dist/primitives/Dot.d.mts +2 -15
  397. package/dist/primitives/Dot.mjs +6 -4
  398. package/dist/primitives/Grid.d.mts +33 -17
  399. package/dist/primitives/Grid.mjs +89 -17
  400. package/dist/primitives/Label.d.mts +1 -14
  401. package/dist/primitives/Label.mjs +3 -2
  402. package/dist/primitives/Lines.d.mts +4 -32
  403. package/dist/primitives/Lines.mjs +10 -8
  404. package/dist/primitives/Shapes.d.mts +5 -43
  405. package/dist/primitives/Shapes.mjs +12 -10
  406. package/dist/primitives/index.d.mts +2 -2
  407. package/dist/primitives/index.mjs +2 -2
  408. package/dist/primitives/props.mjs +31 -0
  409. package/dist/quantity/index.d.mts +119 -0
  410. package/dist/quantity/index.mjs +417 -0
  411. package/dist/relation/derive.d.mts +74 -0
  412. package/dist/relation/derive.mjs +73 -0
  413. package/dist/relation/index.d.mts +56 -0
  414. package/dist/relation/index.mjs +234 -0
  415. package/dist/scene/Scene.d.mts +6 -1
  416. package/dist/scene/Scene.mjs +15 -40
  417. package/dist/scene/evaluators.mjs +1 -1
  418. package/dist/sim/thermal.mjs +45 -20
  419. package/dist/thermo/calorimetry.d.mts +207 -0
  420. package/dist/thermo/calorimetry.mjs +345 -0
  421. package/dist/thermo/cycles.d.mts +142 -0
  422. package/dist/thermo/cycles.mjs +256 -0
  423. package/dist/thermo/entropy.d.mts +87 -0
  424. package/dist/thermo/entropy.mjs +140 -0
  425. package/dist/thermo/expansion.d.mts +130 -0
  426. package/dist/thermo/expansion.mjs +178 -0
  427. package/dist/thermo/gas.d.mts +197 -0
  428. package/dist/thermo/gas.mjs +279 -0
  429. package/dist/thermo/heat-transfer.d.mts +164 -0
  430. package/dist/thermo/heat-transfer.mjs +217 -0
  431. package/dist/thermo/index.d.mts +9 -82
  432. package/dist/thermo/index.mjs +9 -132
  433. package/dist/thermo/processes.d.mts +95 -0
  434. package/dist/thermo/processes.mjs +154 -0
  435. package/dist/thermo/temperature.d.mts +174 -0
  436. package/dist/thermo/temperature.mjs +236 -0
  437. package/dist/view/Stage.mjs +4 -11
  438. package/dist/waves/damping.d.mts +224 -0
  439. package/dist/waves/damping.mjs +317 -0
  440. package/dist/waves/doppler.d.mts +72 -0
  441. package/dist/waves/doppler.mjs +125 -0
  442. package/dist/waves/index.d.mts +10 -0
  443. package/dist/waves/index.mjs +10 -0
  444. package/dist/waves/pendulum.d.mts +130 -0
  445. package/dist/waves/pendulum.mjs +211 -0
  446. package/dist/waves/pitch.d.mts +125 -0
  447. package/dist/waves/pitch.mjs +158 -0
  448. package/dist/waves/shm.d.mts +170 -0
  449. package/dist/waves/shm.mjs +279 -0
  450. package/dist/waves/springs.d.mts +103 -0
  451. package/dist/waves/springs.mjs +176 -0
  452. package/dist/waves/superposition.d.mts +124 -0
  453. package/dist/waves/superposition.mjs +196 -0
  454. package/dist/waves/wave.d.mts +154 -0
  455. package/dist/waves/wave.mjs +178 -0
  456. package/package.json +103 -23
  457. package/styles.css +125 -8
  458. package/dist/assets/kit/index.mjs +0 -4
@@ -0,0 +1,52 @@
1
+ //#region src/networking/delivery.ts
2
+ function compareDelivery(mode, viewers, bitrateMbps) {
3
+ const audience = Math.max(1, Math.round(viewers));
4
+ const rate = Math.max(.1, bitrateMbps);
5
+ const unicast = mode === "unicast";
6
+ return {
7
+ mode,
8
+ viewers: audience,
9
+ bitrateMbps: rate,
10
+ sourceStreams: unicast ? audience : 1,
11
+ segmentCopies: unicast ? audience : 1,
12
+ segmentMbps: rate * (unicast ? audience : 1),
13
+ returnPath: mode !== "terrestrial",
14
+ personalized: unicast
15
+ };
16
+ }
17
+ function deliverGroupMessage(recipients, devicesEach, offlineDevices) {
18
+ const copies = Math.max(0, recipients) * Math.max(1, devicesEach);
19
+ const queued = Math.min(copies, Math.max(0, offlineDevices));
20
+ return {
21
+ copies,
22
+ queued,
23
+ delivered: copies - queued
24
+ };
25
+ }
26
+ const roundTenth = (value) => Math.round(value * 10) / 10;
27
+ function simulateLiveStream(segmentSeconds, bufferSeconds, outageSeconds) {
28
+ const segment = Math.max(.5, segmentSeconds);
29
+ const buffer = Math.max(0, bufferSeconds);
30
+ const outage = Math.max(0, outageSeconds);
31
+ const stallSeconds = Math.max(0, outage - buffer);
32
+ return {
33
+ segmentSeconds: segment,
34
+ bufferSeconds: buffer,
35
+ outageSeconds: outage,
36
+ startupSeconds: roundTenth(segment + buffer + .4),
37
+ liveLatencySeconds: roundTenth(segment + buffer + .8),
38
+ stallSeconds: roundTenth(stallSeconds),
39
+ bufferedThroughDrop: stallSeconds === 0
40
+ };
41
+ }
42
+ const STREAM_STAGES = [
43
+ "camera",
44
+ "encoder",
45
+ "origin",
46
+ "cdn",
47
+ "buffer",
48
+ "viewer"
49
+ ];
50
+
51
+ //#endregion
52
+ export { STREAM_STAGES, compareDelivery, deliverGroupMessage, simulateLiveStream };
@@ -0,0 +1,47 @@
1
+ import { AccessDesign, AccessIncident, AccessSnapshot, CloudResource, Permission, ResourceAccess, ResourceAction, WorkloadKind, evaluateWorkloadAccess } from "./cloud/access.mjs";
2
+ import { Artifact, ContainerDeploymentResult, HostDrift, ReplicaVersion, StatePlacement, VERSION_TEXT, evaluateContainerDeployment } from "./cloud/containers.mjs";
3
+ import { CachePolicy, EdgeResult, OriginState, simulateEdgeCache } from "./cloud/edge.mjs";
4
+ import { DataPlacement, FailureDomainResult, FailureScope, Placement, simulateFailureDomains } from "./cloud/failure-domains.mjs";
5
+ import { CustomerContext, GeoMarketResult, GeoRoutingPolicy, ShopperLocation, resolveGeoMarket } from "./cloud/geo-routing.mjs";
6
+ import { BatchSize, ContextSize, DistributedInferenceResult, DistributedStrategy, GpuCount, GpuInterconnect, GpuMemory, InferenceCapacityResult, InferenceRequestResult, InferenceScheduler, InferenceWorkloadMix, ModelRoutingPolicy, ModelRoutingResult, ModelSize, OutputTokens, Precision, PrefixCacheResult, PrefixCacheScope, PrefixCacheState, PrefixRequester, PrefixTokens, PromptTokens, ResponseQualityTarget, UniquePromptTokens, planInference, simulateDistributedInference, simulateInferenceRequest, simulateModelRouting, simulatePrefixCache } from "./cloud/inference.mjs";
7
+ import { InferenceCondition, InferenceDegradationPolicy, InferenceReliabilityResult, InferenceRisk, InferenceSli, simulateInferenceReliability } from "./cloud/inference-reliability.mjs";
8
+ import { DriftResolution, ExternalChange, InfrastructureCommand, InfrastructureIntent, InfrastructurePhase, InfrastructurePlan, InfrastructureShape, InfrastructureSnapshot, createInfrastructureEngine, infrastructureSnapshot, transitionInfrastructure } from "./cloud/infrastructure.mjs";
9
+ import { DependencyState, SloIncidentResult, SloTarget, Telemetry, observeService } from "./cloud/observability.mjs";
10
+ import { ClusterCapacity, ClusterFailure, OrchestrationResult, ReleaseState, reconcileWorkload } from "./cloud/orchestration.mjs";
11
+ import { Incident, RecoveryResult, RecoveryStrategy, WriteLoad, evaluateRecovery } from "./cloud/recovery.mjs";
12
+ import { CandidateHealth, DataCompatibility, ReleaseCommand, ReleasePlan, ReleaseSnapshot, ReleaseStatus, ReleaseStrategy, createReleaseEngine, releaseSnapshot, transitionRelease } from "./cloud/releases.mjs";
13
+ import { BackendHealth, BackendResult, LoadRoutingPolicy, ServiceScalingResult, simulateServiceScaling } from "./cloud/scaling.mjs";
14
+ import { ConsumerRefresh, RotationPhase, RotationTrigger, SecretRotationCommand, SecretRotationPlan, SecretRotationSnapshot, SecretStrategy, createSecretRotationEngine, secretRotationSnapshot, transitionSecretRotation } from "./cloud/secrets.mjs";
15
+ import { DEPLOYMENT_STAGES, DeploymentFault, DeploymentScope, DeploymentStage, ServerDeploymentResult, ServerFrontEnd, deploymentStageState, simulateServerDeployment } from "./cloud/server-deployment.mjs";
16
+ import { CloudStorage, CloudWorkload, StorageResult, evaluateCloudStorage } from "./cloud/storage.mjs";
17
+ import { VpcDesign, VpcRouteResult, VpcScenario, VpcZone, planVpcRoute } from "./cloud/vpc.mjs";
18
+ import { QueueResult, bottleneckQueue, queueAtTime } from "./queue.mjs";
19
+ import { CertificateKind, DNS_HOPS, DnsCache, DnsHop, TLS_STEPS, certificateAccepted, dnsHops, dnsLookupMs, dnsPath, visibleOnWire } from "./protocols.mjs";
20
+ import { EncodingResult, MediaKind, MediaQuality, ModulationResult, ModulationScheme, encodeMedia, modulate } from "./signals.mjs";
21
+ import { ContentionResult, simulateContention } from "./wireless.mjs";
22
+ import { BroadcastDeliveryResult, DeliveryMode, DeviceState, GroupDeliveryResult, LiveStreamResult, STREAM_STAGES, StreamStage, compareDelivery, deliverGroupMessage, simulateLiveStream } from "./delivery.mjs";
23
+ import { AdaptationPolicy, BROADBAND_STAGES, BroadbandAccess, BroadbandFault, BroadbandJourneyResult, BroadbandStage, CALL_STAGES, CAPACITY_PATTERNS, CallCondition, CallJourneyResult, CallService, CallStage, CapacityPattern, ConversationKind, MESSAGE_STAGES, MessageJourneyResult, MessageNetwork, MessageStage, VIDEO_RATES, VideoCallTrace, VideoMoment, VideoTier, broadbandStageReached, callStageIndex, messageStageIndex, simulateBroadband, simulateCall, simulateMessage, simulateVideoCall } from "./journeys.mjs";
24
+ import { Bit, SubnetInfo, bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix } from "./subnet.mjs";
25
+ import { NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind } from "./topology/contract.mjs";
26
+ import { cidrContains, longestPrefixMatch, parseCidr } from "./routing.mjs";
27
+ import { DhcpClientState, DhcpLeaseOptions, DhcpLeaseResult, simulateDhcpLease } from "./addressing.mjs";
28
+ import { Ipv6AddressMode, Ipv6HostOptions, Ipv6HostResult, configureIpv6Host } from "./ipv6.mjs";
29
+ import { NatBehavior, NatTraversalOptions, NatTraversalResult, TraversalStrategy, simulateNatTraversal } from "./nat-traversal.mjs";
30
+ import { TcpFeedback, TcpSenderOptions, TcpSenderResult, advanceTcpSender } from "./tcp-reliability.mjs";
31
+ import { BgpCandidate, LearnedRoute, OspfLink, learnOspfRoute, selectBgpRoute } from "./route-learning.mjs";
32
+ import { AirtimeResult, Client, ClientShare, HOUSEHOLD, PAYLOAD_BITS, TURN_OVERHEAD_US, rateFromRssi, shareAirtime, signalWord } from "./models/airtime.mjs";
33
+ import { Blocker, EIRP_DBM, GENERATIONS, Generation, GenerationId, HANDSET_SENSITIVITY_DBM, MAX_PATH_LOSS_DB, TASKS, TERRAIN, Task, Terrain, TerrainSpec, blockedBy, canServe, cellAreaKm2, cellRadiusKm, firstGenerationFor, generationById, pathLossDb, rssiFromMast, towersFor } from "./models/cellular.mjs";
34
+ import { DEFAULT_PATH, Encapsulation, EncapsulationSegment, HEADERS, Header, LayerKind, NodeKind, OVERHEAD_BYTES, PathNode, WireFrame, decapsulate, encapsulate, frameOn, journey, opensTo, segmentsOf } from "./models/encapsulation.mjs";
35
+ import { DEFAULT_DRIVE, DRIVE_WINDOW, DROP_AFTER_KM, DriveOptions, DriveResult, DriveSample, HandoverEvent, MarginVerdict, Mast, TWO_MAST_ROAD, drive, judgeMargin } from "./models/handover.mjs";
36
+ import { DEFAULT_RTO_MS, DROPS, DropSpec, DropWhich, HandshakeOptions, HandshakeResult, Side, TcpSegment, firstResponseMs, handshake } from "./models/handshake.mjs";
37
+ import { MEDIA, Medium, MediumId, PAIRS, PINOUTS, PinoutCheck, PinoutStandard, SCENARIOS, Scenario, WIRE_INK, WIRE_LABEL, WireColor, cableKind, checkPinout, isSplitPair, isStriped, pairOf, pairPins, ruleOut } from "./models/media.mjs";
38
+ import { C_KM_S, EARTH_AREA_KM2, EARTH_RADIUS_KM, MU_EARTH, ORBITS, Orbit, centralAngleRad, footprintAreaKm2, footprintRadiusKm, oneWayMs, orbitById, orbitalPeriodMin, passMinutes, roundTripMs, satellitesForCoverage } from "./models/satellite.mjs";
39
+ import { C, PENETRATION, Penetration, PenetrationSpec, SPECTRUM, SpectrumBand, bandById, decades, humanFrequency, humanLength, logPosition, quarterWaveM, wavelengthM } from "./models/spectrum.mjs";
40
+ import { FrameResult, MacEntry, SwitchDevice, SwitchEvent, SwitchPort, SwitchState, clearTable, linkUp, makeSwitch, sendFrame, setPortEnabled } from "./models/switch.mjs";
41
+ import { BroadcastResult, DeliveryResult, Vlan, VlanPort, VlanState, broadcastFrom, domainCount, domainOf, isLive, makeVlanSwitch, sendBetween, setPortVlan, setRouting } from "./models/vlan.mjs";
42
+ import { Field, OBSERVERS, Observer, ObserverId, Setup, Sighting, TUNNEL_OVERHEAD_BYTES, canReadContents, canSeeDestination, observe, observersFor, surveyOf, usableBytes } from "./models/vpn.mjs";
43
+ import { ADVICE, Exposure, LISTENERS, Listener, PROTECTIONS, PrivacyVerdict, Protection, ProtectionSpec, Transport, judgePrivacy, linkReadable, whatTheySee } from "./models/wifi-privacy.mjs";
44
+ import { BANDS, Band, BandSpec, FLOOR_PLANS, FloorPlan, GRADES, Grade, GradeSpec, MATERIALS, MaterialSpec, NOISE_FLOOR_DBM, PATH_LOSS_EXPONENT, Point, Reading, Room, RoomVerdict, Spot, TX_POWER_DBM, Wall, WallMaterial, bestPlacement, coverageGrid, coverageScore, grade, referenceLossDb, roomVerdicts, signalAt, throughputMbps, wallsBetween } from "./models/wifi.mjs";
45
+ import { COMPANY_NETWORK, HOME_NETWORK } from "./topology/presets.mjs";
46
+ import { createPacket, simulatePacket } from "./topology/simulation.mjs";
47
+ export { ADVICE, AccessDesign, AccessIncident, AccessSnapshot, AdaptationPolicy, AirtimeResult, Artifact, BANDS, BROADBAND_STAGES, BackendHealth, BackendResult, Band, BandSpec, BatchSize, BgpCandidate, Bit, Blocker, BroadbandAccess, BroadbandFault, BroadbandJourneyResult, BroadbandStage, BroadcastDeliveryResult, BroadcastResult, C, CALL_STAGES, CAPACITY_PATTERNS, COMPANY_NETWORK, C_KM_S, CachePolicy, CallCondition, CallJourneyResult, CallService, CallStage, CandidateHealth, CapacityPattern, CertificateKind, Client, ClientShare, CloudResource, CloudStorage, CloudWorkload, ClusterCapacity, ClusterFailure, ConsumerRefresh, ContainerDeploymentResult, ContentionResult, ContextSize, ConversationKind, CustomerContext, DEFAULT_DRIVE, DEFAULT_PATH, DEFAULT_RTO_MS, DEPLOYMENT_STAGES, DNS_HOPS, DRIVE_WINDOW, DROPS, DROP_AFTER_KM, DataCompatibility, DataPlacement, DeliveryMode, DeliveryResult, DependencyState, DeploymentFault, DeploymentScope, DeploymentStage, DeviceState, DhcpClientState, DhcpLeaseOptions, DhcpLeaseResult, DistributedInferenceResult, DistributedStrategy, DnsCache, DnsHop, DriftResolution, DriveOptions, DriveResult, DriveSample, DropSpec, DropWhich, EARTH_AREA_KM2, EARTH_RADIUS_KM, EIRP_DBM, EdgeResult, Encapsulation, EncapsulationSegment, EncodingResult, Exposure, ExternalChange, FLOOR_PLANS, FailureDomainResult, FailureScope, Field, FloorPlan, FrameResult, GENERATIONS, GRADES, Generation, GenerationId, GeoMarketResult, GeoRoutingPolicy, GpuCount, GpuInterconnect, GpuMemory, Grade, GradeSpec, GroupDeliveryResult, HANDSET_SENSITIVITY_DBM, HEADERS, HOME_NETWORK, HOUSEHOLD, HandoverEvent, HandshakeOptions, HandshakeResult, Header, HostDrift, Incident, InferenceCapacityResult, InferenceCondition, InferenceDegradationPolicy, InferenceReliabilityResult, InferenceRequestResult, InferenceRisk, InferenceScheduler, InferenceSli, InferenceWorkloadMix, InfrastructureCommand, InfrastructureIntent, InfrastructurePhase, InfrastructurePlan, InfrastructureShape, InfrastructureSnapshot, Ipv6AddressMode, Ipv6HostOptions, Ipv6HostResult, LISTENERS, LayerKind, LearnedRoute, Listener, LiveStreamResult, LoadRoutingPolicy, MATERIALS, MAX_PATH_LOSS_DB, MEDIA, MESSAGE_STAGES, MU_EARTH, MacEntry, MarginVerdict, Mast, MaterialSpec, MediaKind, MediaQuality, Medium, MediumId, MessageJourneyResult, MessageNetwork, MessageStage, ModelRoutingPolicy, ModelRoutingResult, ModelSize, ModulationResult, ModulationScheme, NOISE_FLOOR_DBM, NatBehavior, NatTraversalOptions, NatTraversalResult, NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, NodeKind, OBSERVERS, ORBITS, OVERHEAD_BYTES, Observer, ObserverId, Orbit, OrchestrationResult, OriginState, OspfLink, OutputTokens, PAIRS, PATH_LOSS_EXPONENT, PAYLOAD_BITS, PENETRATION, PINOUTS, PROTECTIONS, PacketLayer, PacketLayerKind, PathNode, Penetration, PenetrationSpec, Permission, PinoutCheck, PinoutStandard, Placement, Point, Precision, PrefixCacheResult, PrefixCacheScope, PrefixCacheState, PrefixRequester, PrefixTokens, PrivacyVerdict, PromptTokens, Protection, ProtectionSpec, QueueResult, Reading, RecoveryResult, RecoveryStrategy, ReleaseCommand, ReleasePlan, ReleaseSnapshot, ReleaseState, ReleaseStatus, ReleaseStrategy, ReplicaVersion, ResourceAccess, ResourceAction, ResponseQualityTarget, Room, RoomVerdict, RotationPhase, RotationTrigger, SCENARIOS, SPECTRUM, STREAM_STAGES, Scenario, SecretRotationCommand, SecretRotationPlan, SecretRotationSnapshot, SecretStrategy, ServerDeploymentResult, ServerFrontEnd, ServiceScalingResult, Setup, ShopperLocation, Side, Sighting, SloIncidentResult, SloTarget, SpectrumBand, Spot, StatePlacement, StorageResult, StreamStage, SubnetInfo, SwitchDevice, SwitchEvent, SwitchPort, SwitchState, TASKS, TERRAIN, TLS_STEPS, TUNNEL_OVERHEAD_BYTES, TURN_OVERHEAD_US, TWO_MAST_ROAD, TX_POWER_DBM, Task, TcpFeedback, TcpSegment, TcpSenderOptions, TcpSenderResult, Telemetry, Terrain, TerrainSpec, Transport, TraversalStrategy, UniquePromptTokens, VERSION_TEXT, VIDEO_RATES, VideoCallTrace, VideoMoment, VideoTier, Vlan, VlanPort, VlanState, VpcDesign, VpcRouteResult, VpcScenario, VpcZone, WIRE_INK, WIRE_LABEL, Wall, WallMaterial, WireColor, WireFrame, WorkloadKind, WriteLoad, advanceTcpSender, bandById, bestPlacement, bitsOf, blockedBy, bottleneckQueue, broadbandStageReached, broadcastFrom, cableKind, callStageIndex, canReadContents, canSeeDestination, canServe, cellAreaKm2, cellRadiusKm, centralAngleRad, certificateAccepted, checkPinout, cidrContains, clearTable, compareDelivery, configureIpv6Host, coverageGrid, coverageScore, createInfrastructureEngine, createPacket, createReleaseEngine, createSecretRotationEngine, decades, decapsulate, deliverGroupMessage, deploymentStageState, describe, dnsHops, dnsLookupMs, dnsPath, domainCount, domainOf, drive, encapsulate, encodeMedia, evaluateCloudStorage, evaluateContainerDeployment, evaluateRecovery, evaluateWorkloadAccess, firstDifferingBit, firstGenerationFor, firstResponseMs, footprintAreaKm2, footprintRadiusKm, frameOn, generationById, grade, handshake, humanFrequency, humanLength, infrastructureSnapshot, intToIpv4, ipv4ToInt, isLive, isSplitPair, isStriped, journey, judgeMargin, judgePrivacy, learnOspfRoute, linkReadable, linkUp, logPosition, longestPrefixMatch, makeSwitch, makeVlanSwitch, maskFor, messageStageIndex, modulate, observe, observeService, observersFor, oneWayMs, opensTo, orbitById, orbitalPeriodMin, pairOf, pairPins, parseCidr, passMinutes, pathLossDb, planInference, planVpcRoute, quarterWaveM, queueAtTime, rateFromRssi, reconcileWorkload, referenceLossDb, releaseSnapshot, resolveGeoMarket, roomVerdicts, roundTripMs, rssiFromMast, ruleOut, sameNetwork, satellitesForCoverage, secretRotationSnapshot, segmentsOf, selectBgpRoute, sendBetween, sendFrame, setPortEnabled, setPortVlan, setRouting, shareAirtime, signalAt, signalWord, simulateBroadband, simulateCall, simulateContention, simulateDhcpLease, simulateDistributedInference, simulateEdgeCache, simulateFailureDomains, simulateInferenceReliability, simulateInferenceRequest, simulateLiveStream, simulateMessage, simulateModelRouting, simulateNatTraversal, simulatePacket, simulatePrefixCache, simulateServerDeployment, simulateServiceScaling, simulateVideoCall, surveyOf, throughputMbps, towersFor, transitionInfrastructure, transitionRelease, transitionSecretRotation, usableBytes, visibleOnWire, wallsBetween, wavelengthM, whatTheySee, widestSharedPrefix };
@@ -0,0 +1,47 @@
1
+ import { bottleneckQueue, queueAtTime } from "./queue.mjs";
2
+ import { DNS_HOPS, TLS_STEPS, certificateAccepted, dnsHops, dnsLookupMs, dnsPath, visibleOnWire } from "./protocols.mjs";
3
+ import { encodeMedia, modulate } from "./signals.mjs";
4
+ import { simulateContention } from "./wireless.mjs";
5
+ import { STREAM_STAGES, compareDelivery, deliverGroupMessage, simulateLiveStream } from "./delivery.mjs";
6
+ import { BROADBAND_STAGES, CALL_STAGES, CAPACITY_PATTERNS, MESSAGE_STAGES, VIDEO_RATES, broadbandStageReached, callStageIndex, messageStageIndex, simulateBroadband, simulateCall, simulateMessage, simulateVideoCall } from "./journeys.mjs";
7
+ import { bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix } from "./subnet.mjs";
8
+ import { cidrContains, longestPrefixMatch, parseCidr } from "./routing.mjs";
9
+ import { simulateDhcpLease } from "./addressing.mjs";
10
+ import { configureIpv6Host } from "./ipv6.mjs";
11
+ import { simulateNatTraversal } from "./nat-traversal.mjs";
12
+ import { advanceTcpSender } from "./tcp-reliability.mjs";
13
+ import { learnOspfRoute, selectBgpRoute } from "./route-learning.mjs";
14
+ import { HOUSEHOLD, PAYLOAD_BITS, TURN_OVERHEAD_US, rateFromRssi, shareAirtime, signalWord } from "./models/airtime.mjs";
15
+ import { EIRP_DBM, GENERATIONS, HANDSET_SENSITIVITY_DBM, MAX_PATH_LOSS_DB, TASKS, TERRAIN, blockedBy, canServe, cellAreaKm2, cellRadiusKm, firstGenerationFor, generationById, pathLossDb, rssiFromMast, towersFor } from "./models/cellular.mjs";
16
+ import { DEFAULT_PATH, HEADERS, OVERHEAD_BYTES, decapsulate, encapsulate, frameOn, journey, opensTo, segmentsOf } from "./models/encapsulation.mjs";
17
+ import { DEFAULT_DRIVE, DRIVE_WINDOW, DROP_AFTER_KM, TWO_MAST_ROAD, drive, judgeMargin } from "./models/handover.mjs";
18
+ import { DEFAULT_RTO_MS, DROPS, firstResponseMs, handshake } from "./models/handshake.mjs";
19
+ import { MEDIA, PAIRS, PINOUTS, SCENARIOS, WIRE_INK, WIRE_LABEL, cableKind, checkPinout, isSplitPair, isStriped, pairOf, pairPins, ruleOut } from "./models/media.mjs";
20
+ import { C_KM_S, EARTH_AREA_KM2, EARTH_RADIUS_KM, MU_EARTH, ORBITS, centralAngleRad, footprintAreaKm2, footprintRadiusKm, oneWayMs, orbitById, orbitalPeriodMin, passMinutes, roundTripMs, satellitesForCoverage } from "./models/satellite.mjs";
21
+ import { C, PENETRATION, SPECTRUM, bandById, decades, humanFrequency, humanLength, logPosition, quarterWaveM, wavelengthM } from "./models/spectrum.mjs";
22
+ import { clearTable, linkUp, makeSwitch, sendFrame, setPortEnabled } from "./models/switch.mjs";
23
+ import { broadcastFrom, domainCount, domainOf, isLive, makeVlanSwitch, sendBetween, setPortVlan, setRouting } from "./models/vlan.mjs";
24
+ import { OBSERVERS, TUNNEL_OVERHEAD_BYTES, canReadContents, canSeeDestination, observe, observersFor, surveyOf, usableBytes } from "./models/vpn.mjs";
25
+ import { ADVICE, LISTENERS, PROTECTIONS, judgePrivacy, linkReadable, whatTheySee } from "./models/wifi-privacy.mjs";
26
+ import { BANDS, FLOOR_PLANS, GRADES, MATERIALS, NOISE_FLOOR_DBM, PATH_LOSS_EXPONENT, TX_POWER_DBM, bestPlacement, coverageGrid, coverageScore, grade, referenceLossDb, roomVerdicts, signalAt, throughputMbps, wallsBetween } from "./models/wifi.mjs";
27
+ import { COMPANY_NETWORK, HOME_NETWORK } from "./topology/presets.mjs";
28
+ import { createPacket, simulatePacket } from "./topology/simulation.mjs";
29
+ import { evaluateWorkloadAccess } from "./cloud/access.mjs";
30
+ import { VERSION_TEXT, evaluateContainerDeployment } from "./cloud/containers.mjs";
31
+ import { simulateEdgeCache } from "./cloud/edge.mjs";
32
+ import { simulateFailureDomains } from "./cloud/failure-domains.mjs";
33
+ import { resolveGeoMarket } from "./cloud/geo-routing.mjs";
34
+ import { planInference, simulateDistributedInference, simulateInferenceRequest, simulateModelRouting, simulatePrefixCache } from "./cloud/inference.mjs";
35
+ import { simulateInferenceReliability } from "./cloud/inference-reliability.mjs";
36
+ import { createInfrastructureEngine, infrastructureSnapshot, transitionInfrastructure } from "./cloud/infrastructure.mjs";
37
+ import { observeService } from "./cloud/observability.mjs";
38
+ import { reconcileWorkload } from "./cloud/orchestration.mjs";
39
+ import { evaluateRecovery } from "./cloud/recovery.mjs";
40
+ import { createReleaseEngine, releaseSnapshot, transitionRelease } from "./cloud/releases.mjs";
41
+ import { simulateServiceScaling } from "./cloud/scaling.mjs";
42
+ import { createSecretRotationEngine, secretRotationSnapshot, transitionSecretRotation } from "./cloud/secrets.mjs";
43
+ import { DEPLOYMENT_STAGES, deploymentStageState, simulateServerDeployment } from "./cloud/server-deployment.mjs";
44
+ import { evaluateCloudStorage } from "./cloud/storage.mjs";
45
+ import { planVpcRoute } from "./cloud/vpc.mjs";
46
+
47
+ export { ADVICE, BANDS, BROADBAND_STAGES, C, CALL_STAGES, CAPACITY_PATTERNS, COMPANY_NETWORK, C_KM_S, DEFAULT_DRIVE, DEFAULT_PATH, DEFAULT_RTO_MS, DEPLOYMENT_STAGES, DNS_HOPS, DRIVE_WINDOW, DROPS, DROP_AFTER_KM, EARTH_AREA_KM2, EARTH_RADIUS_KM, EIRP_DBM, FLOOR_PLANS, GENERATIONS, GRADES, HANDSET_SENSITIVITY_DBM, HEADERS, HOME_NETWORK, HOUSEHOLD, LISTENERS, MATERIALS, MAX_PATH_LOSS_DB, MEDIA, MESSAGE_STAGES, MU_EARTH, NOISE_FLOOR_DBM, OBSERVERS, ORBITS, OVERHEAD_BYTES, PAIRS, PATH_LOSS_EXPONENT, PAYLOAD_BITS, PENETRATION, PINOUTS, PROTECTIONS, SCENARIOS, SPECTRUM, STREAM_STAGES, TASKS, TERRAIN, TLS_STEPS, TUNNEL_OVERHEAD_BYTES, TURN_OVERHEAD_US, TWO_MAST_ROAD, TX_POWER_DBM, VERSION_TEXT, VIDEO_RATES, WIRE_INK, WIRE_LABEL, advanceTcpSender, bandById, bestPlacement, bitsOf, blockedBy, bottleneckQueue, broadbandStageReached, broadcastFrom, cableKind, callStageIndex, canReadContents, canSeeDestination, canServe, cellAreaKm2, cellRadiusKm, centralAngleRad, certificateAccepted, checkPinout, cidrContains, clearTable, compareDelivery, configureIpv6Host, coverageGrid, coverageScore, createInfrastructureEngine, createPacket, createReleaseEngine, createSecretRotationEngine, decades, decapsulate, deliverGroupMessage, deploymentStageState, describe, dnsHops, dnsLookupMs, dnsPath, domainCount, domainOf, drive, encapsulate, encodeMedia, evaluateCloudStorage, evaluateContainerDeployment, evaluateRecovery, evaluateWorkloadAccess, firstDifferingBit, firstGenerationFor, firstResponseMs, footprintAreaKm2, footprintRadiusKm, frameOn, generationById, grade, handshake, humanFrequency, humanLength, infrastructureSnapshot, intToIpv4, ipv4ToInt, isLive, isSplitPair, isStriped, journey, judgeMargin, judgePrivacy, learnOspfRoute, linkReadable, linkUp, logPosition, longestPrefixMatch, makeSwitch, makeVlanSwitch, maskFor, messageStageIndex, modulate, observe, observeService, observersFor, oneWayMs, opensTo, orbitById, orbitalPeriodMin, pairOf, pairPins, parseCidr, passMinutes, pathLossDb, planInference, planVpcRoute, quarterWaveM, queueAtTime, rateFromRssi, reconcileWorkload, referenceLossDb, releaseSnapshot, resolveGeoMarket, roomVerdicts, roundTripMs, rssiFromMast, ruleOut, sameNetwork, satellitesForCoverage, secretRotationSnapshot, segmentsOf, selectBgpRoute, sendBetween, sendFrame, setPortEnabled, setPortVlan, setRouting, shareAirtime, signalAt, signalWord, simulateBroadband, simulateCall, simulateContention, simulateDhcpLease, simulateDistributedInference, simulateEdgeCache, simulateFailureDomains, simulateInferenceReliability, simulateInferenceRequest, simulateLiveStream, simulateMessage, simulateModelRouting, simulateNatTraversal, simulatePacket, simulatePrefixCache, simulateServerDeployment, simulateServiceScaling, simulateVideoCall, surveyOf, throughputMbps, towersFor, transitionInfrastructure, transitionRelease, transitionSecretRotation, usableBytes, visibleOnWire, wallsBetween, wavelengthM, whatTheySee, widestSharedPrefix };
@@ -0,0 +1,28 @@
1
+ //#region src/networking/ipv6.d.ts
2
+ type Ipv6AddressMode = "slaac" | "dhcpv6" | "static";
3
+ interface Ipv6HostOptions {
4
+ mode: Ipv6AddressMode;
5
+ routerAdvertisement: boolean;
6
+ dhcpv6Available?: boolean;
7
+ prefix?: string;
8
+ interfaceId?: string;
9
+ peer: "link-local" | "same-prefix" | "remote-prefix";
10
+ }
11
+ interface Ipv6HostResult {
12
+ linkLocalAddress: string;
13
+ globalAddress: string | null;
14
+ defaultRouter: boolean;
15
+ path: "neighbor-discovery" | "router" | "unreachable";
16
+ usesBroadcast: false;
17
+ explanation: string;
18
+ }
19
+ declare function configureIpv6Host({
20
+ mode,
21
+ routerAdvertisement,
22
+ dhcpv6Available,
23
+ prefix,
24
+ interfaceId,
25
+ peer
26
+ }: Ipv6HostOptions): Ipv6HostResult;
27
+ //#endregion
28
+ export { Ipv6AddressMode, Ipv6HostOptions, Ipv6HostResult, configureIpv6Host };
@@ -0,0 +1,17 @@
1
+ //#region src/networking/ipv6.ts
2
+ function configureIpv6Host({ mode, routerAdvertisement, dhcpv6Available = false, prefix = "2001:db8:1", interfaceId = "42", peer }) {
3
+ const globalAddress = mode === "static" || mode === "slaac" && routerAdvertisement || mode === "dhcpv6" && dhcpv6Available ? `${prefix}::${interfaceId}` : null;
4
+ const defaultRouter = routerAdvertisement;
5
+ const path = peer === "link-local" ? "neighbor-discovery" : peer === "same-prefix" && globalAddress ? "neighbor-discovery" : peer === "remote-prefix" && globalAddress && defaultRouter ? "router" : "unreachable";
6
+ return {
7
+ linkLocalAddress: `fe80::${interfaceId}`,
8
+ globalAddress,
9
+ defaultRouter,
10
+ path,
11
+ usesBroadcast: false,
12
+ explanation: path === "neighbor-discovery" ? "Resolve the neighbor with multicast, then send directly." : path === "router" ? "Send the packet to the default router learned from its advertisement." : "This host has no usable address or route for that peer."
13
+ };
14
+ }
15
+
16
+ //#endregion
17
+ export { configureIpv6Host };
@@ -0,0 +1,83 @@
1
+ import { DnsCache } from "./protocols.mjs";
2
+ import { MediaKind, MediaQuality } from "./signals.mjs";
3
+
4
+ //#region src/networking/journeys.d.ts
5
+ type AdaptationPolicy = "fixed" | "adaptive";
6
+ type CapacityPattern = "steady" | "drop-recover";
7
+ type VideoTier = "HD" | "SD" | "low";
8
+ declare const VIDEO_RATES: Record<VideoTier, number>;
9
+ declare const CAPACITY_PATTERNS: Record<CapacityPattern, readonly number[]>;
10
+ interface VideoMoment {
11
+ readonly index: number;
12
+ readonly capacityKbps: number;
13
+ readonly bitrateKbps: number;
14
+ readonly tier: VideoTier;
15
+ readonly queued: number;
16
+ readonly dropped: number;
17
+ readonly delayMs: number;
18
+ readonly state: "clear" | "delayed" | "dropping";
19
+ }
20
+ interface VideoCallTrace {
21
+ readonly moments: readonly VideoMoment[];
22
+ readonly totalDropped: number;
23
+ }
24
+ declare function simulateVideoCall(policy: AdaptationPolicy, pattern: CapacityPattern): VideoCallTrace;
25
+ type BroadbandAccess = "fibre" | "cable" | "mobile";
26
+ type BroadbandFault = "none" | "wifi" | "access" | "dns";
27
+ type BroadbandStage = "device" | "router" | "terminal" | "isp" | "dns" | "internet" | "server";
28
+ declare const BROADBAND_STAGES: readonly BroadbandStage[];
29
+ interface BroadbandJourneyResult {
30
+ readonly stages: readonly BroadbandStage[];
31
+ readonly terminal: string;
32
+ readonly medium: string;
33
+ readonly downMbps: number;
34
+ readonly latencyMs: number;
35
+ readonly stoppedAt: BroadbandStage | null;
36
+ readonly privateAddress: string;
37
+ readonly publicAddress: string;
38
+ }
39
+ declare function simulateBroadband(access: BroadbandAccess, fault: BroadbandFault): BroadbandJourneyResult;
40
+ declare function broadbandStageReached(current: number, stage: BroadbandStage, stoppedAt: BroadbandStage | null): "idle" | "active" | "success" | "error";
41
+ type ConversationKind = "direct" | "group";
42
+ type MessageNetwork = "clear" | "congested";
43
+ type MessageStage = "compose" | "resolve" | "secure" | "deliver" | "synchronize";
44
+ declare const MESSAGE_STAGES: readonly MessageStage[];
45
+ interface MessageJourneyResult {
46
+ readonly hostname: string;
47
+ readonly lookupMs: number;
48
+ readonly tlsAccepted: boolean;
49
+ readonly encrypted: true;
50
+ readonly recipients: number;
51
+ readonly copies: number;
52
+ readonly delivered: number;
53
+ readonly offline: number;
54
+ readonly networkDrops: number;
55
+ readonly queueDelayMs: number;
56
+ readonly totalMs: number;
57
+ }
58
+ declare function simulateMessage(conversation: ConversationKind, recipients: number, offlineDevices: number, cache: DnsCache, network: MessageNetwork, hostname?: string): MessageJourneyResult;
59
+ declare const messageStageIndex: (stage: MessageStage) => number;
60
+ type CallService = "carrier" | "app";
61
+ type CallCondition = "strong" | "moving" | "congested";
62
+ type CallStage = "capture" | "encode" | "radio" | "route" | "reconstruct";
63
+ declare const CALL_STAGES: readonly CallStage[];
64
+ interface CallJourneyResult {
65
+ readonly service: CallService;
66
+ readonly kind: MediaKind;
67
+ readonly quality: MediaQuality;
68
+ readonly condition: CallCondition;
69
+ readonly bitrateKbps: number;
70
+ readonly packets: number;
71
+ readonly received: number;
72
+ readonly lost: number;
73
+ readonly fidelity: number;
74
+ readonly latencyMs: number;
75
+ readonly handoffs: number;
76
+ readonly encrypted: true;
77
+ readonly routeLabel: string;
78
+ readonly recoveredBits: string;
79
+ }
80
+ declare function simulateCall(service: CallService, kind: MediaKind, quality: MediaQuality, condition: CallCondition): CallJourneyResult;
81
+ declare const callStageIndex: (stage: CallStage) => number;
82
+ //#endregion
83
+ export { AdaptationPolicy, BROADBAND_STAGES, BroadbandAccess, BroadbandFault, BroadbandJourneyResult, BroadbandStage, CALL_STAGES, CAPACITY_PATTERNS, CallCondition, CallJourneyResult, CallService, CallStage, CapacityPattern, ConversationKind, MESSAGE_STAGES, MessageJourneyResult, MessageNetwork, MessageStage, VIDEO_RATES, VideoCallTrace, VideoMoment, VideoTier, broadbandStageReached, callStageIndex, messageStageIndex, simulateBroadband, simulateCall, simulateMessage, simulateVideoCall };
@@ -0,0 +1,161 @@
1
+ import { queueAtTime } from "./queue.mjs";
2
+ import { certificateAccepted, dnsLookupMs } from "./protocols.mjs";
3
+ import { encodeMedia, modulate } from "./signals.mjs";
4
+ import { deliverGroupMessage } from "./delivery.mjs";
5
+
6
+ //#region src/networking/journeys.ts
7
+ const VIDEO_RATES = {
8
+ HD: 2500,
9
+ SD: 1e3,
10
+ low: 350
11
+ };
12
+ const CAPACITY_PATTERNS = {
13
+ steady: [
14
+ 3e3,
15
+ 3e3,
16
+ 3e3,
17
+ 3e3,
18
+ 3e3
19
+ ],
20
+ "drop-recover": [
21
+ 3e3,
22
+ 1400,
23
+ 500,
24
+ 1400,
25
+ 3e3
26
+ ]
27
+ };
28
+ const adaptiveTier = (capacity) => capacity >= 2800 ? "HD" : capacity >= 1100 ? "SD" : "low";
29
+ function simulateVideoCall(policy, pattern) {
30
+ const capacities = CAPACITY_PATTERNS[pattern];
31
+ let queued = 0;
32
+ let totalDropped = 0;
33
+ return {
34
+ moments: capacities.map((capacityKbps, index) => {
35
+ const observedCapacity = capacities[Math.max(0, index - 1)] ?? capacityKbps;
36
+ const tier = policy === "fixed" ? "HD" : adaptiveTier(observedCapacity);
37
+ const bitrateKbps = VIDEO_RATES[tier];
38
+ const service = capacityKbps / 100;
39
+ const offered = Math.max(0, queued + bitrateKbps / 100 - service);
40
+ const dropped = Math.max(0, offered - 20);
41
+ queued = Math.min(20, offered);
42
+ totalDropped += dropped;
43
+ return {
44
+ index,
45
+ capacityKbps,
46
+ bitrateKbps,
47
+ tier,
48
+ queued: Math.round(queued),
49
+ dropped: Math.round(dropped),
50
+ delayMs: service > 0 ? Math.round(queued / service * 1e3) : 0,
51
+ state: dropped > 0 ? "dropping" : queued > 0 ? "delayed" : "clear"
52
+ };
53
+ }),
54
+ totalDropped: Math.round(totalDropped)
55
+ };
56
+ }
57
+ const BROADBAND_STAGES = [
58
+ "device",
59
+ "router",
60
+ "terminal",
61
+ "isp",
62
+ "dns",
63
+ "internet",
64
+ "server"
65
+ ];
66
+ const ACCESS = {
67
+ fibre: {
68
+ terminal: "ONT",
69
+ medium: "light in fibre",
70
+ downMbps: 500,
71
+ latencyMs: 7
72
+ },
73
+ cable: {
74
+ terminal: "Cable modem",
75
+ medium: "radio-frequency signal in coax",
76
+ downMbps: 200,
77
+ latencyMs: 14
78
+ },
79
+ mobile: {
80
+ terminal: "5G radio",
81
+ medium: "radio to a cell tower",
82
+ downMbps: 120,
83
+ latencyMs: 24
84
+ }
85
+ };
86
+ function simulateBroadband(access, fault) {
87
+ const stoppedAt = fault === "wifi" ? "router" : fault === "access" ? "isp" : fault === "dns" ? "dns" : null;
88
+ return {
89
+ stages: BROADBAND_STAGES,
90
+ ...ACCESS[access],
91
+ stoppedAt,
92
+ privateAddress: "192.168.1.24",
93
+ publicAddress: "203.0.113.18"
94
+ };
95
+ }
96
+ function broadbandStageReached(current, stage, stoppedAt) {
97
+ const index = BROADBAND_STAGES.indexOf(stage);
98
+ const stop = stoppedAt ? BROADBAND_STAGES.indexOf(stoppedAt) : Infinity;
99
+ if (index === stop && current >= index) return "error";
100
+ if (index === current && index < stop) return "active";
101
+ if (index < current && index < stop) return "success";
102
+ return "idle";
103
+ }
104
+ const MESSAGE_STAGES = [
105
+ "compose",
106
+ "resolve",
107
+ "secure",
108
+ "deliver",
109
+ "synchronize"
110
+ ];
111
+ function simulateMessage(conversation, recipients, offlineDevices, cache, network, hostname = "chat.example") {
112
+ const safeRecipients = conversation === "direct" ? 1 : Math.min(8, Math.max(2, recipients));
113
+ const delivery = deliverGroupMessage(safeRecipients, 2, offlineDevices);
114
+ const queue = network === "congested" ? queueAtTime(18, 8, 6, 1) : queueAtTime(5, 10, 6, 1);
115
+ const lookupMs = dnsLookupMs(cache, 20);
116
+ return {
117
+ hostname,
118
+ lookupMs,
119
+ tlsAccepted: certificateAccepted("trusted"),
120
+ encrypted: true,
121
+ recipients: safeRecipients,
122
+ copies: delivery.copies,
123
+ delivered: delivery.delivered,
124
+ offline: delivery.queued,
125
+ networkDrops: queue.dropped,
126
+ queueDelayMs: queue.delayMs,
127
+ totalMs: lookupMs + 45 + queue.delayMs
128
+ };
129
+ }
130
+ const messageStageIndex = (stage) => MESSAGE_STAGES.indexOf(stage);
131
+ const CALL_STAGES = [
132
+ "capture",
133
+ "encode",
134
+ "radio",
135
+ "route",
136
+ "reconstruct"
137
+ ];
138
+ function simulateCall(service, kind, quality, condition) {
139
+ const encoding = encodeMedia(kind, quality, condition === "congested" ? 25 : condition === "moving" ? 10 : 0);
140
+ const radio = modulate("10110010", "bpsk", condition === "strong" ? 0 : condition === "moving" ? 22 : 40);
141
+ return {
142
+ service,
143
+ kind,
144
+ quality,
145
+ condition,
146
+ bitrateKbps: encoding.bitrateKbps,
147
+ packets: encoding.packets,
148
+ received: encoding.received,
149
+ lost: encoding.lost,
150
+ fidelity: encoding.fidelity,
151
+ latencyMs: condition === "congested" ? 310 : condition === "moving" ? 145 : 55,
152
+ handoffs: condition === "moving" ? 1 : 0,
153
+ encrypted: true,
154
+ routeLabel: service === "app" ? "app service" : "mobile core",
155
+ recoveredBits: radio.recovered
156
+ };
157
+ }
158
+ const callStageIndex = (stage) => CALL_STAGES.indexOf(stage);
159
+
160
+ //#endregion
161
+ export { BROADBAND_STAGES, CALL_STAGES, CAPACITY_PATTERNS, MESSAGE_STAGES, VIDEO_RATES, broadbandStageReached, callStageIndex, messageStageIndex, simulateBroadband, simulateCall, simulateMessage, simulateVideoCall };
@@ -0,0 +1,87 @@
1
+ //#region src/networking/models/airtime.d.ts
2
+ /**
3
+ * One channel, several devices, and the thing everyone is actually sharing.
4
+ *
5
+ * A switch gives every port its own wire. Wi-Fi gives everybody the same air, so devices take turns,
6
+ * and what they are taking turns at is TIME rather than bandwidth. That one substitution explains the
7
+ * most confusing thing about a home network: a laptop sitting beside the router, showing a perfect
8
+ * signal, can be slow because of a phone in a distant bedroom.
9
+ *
10
+ * The mechanism has a name, the 802.11 performance anomaly, and it is worth stating precisely because
11
+ * it is so counter-intuitive. The access point gives each device roughly the same number of turns.
12
+ * A device with a weak signal negotiates a low data rate, so ITS turn takes far longer to deliver the
13
+ * same bytes. While that turn runs, nobody else may transmit at all. With one device at 260 Mbps and
14
+ * one at 15 Mbps, the fast device does not get 260: both end up near 14, because the slow device is
15
+ * occupying the channel for most of every round.
16
+ *
17
+ * So chapter 1 is not finished when a room reaches a usable signal. A room that is merely usable
18
+ * drags down every other room, and the fix for a slow house is often to improve the WORST corner
19
+ * rather than to buy a faster router. That is the opposite of what the advertising suggests and it
20
+ * follows from one line of arithmetic.
21
+ */
22
+ /**
23
+ * Bits carried in one transmission opportunity.
24
+ *
25
+ * Not one frame. Modern Wi-Fi aggregates dozens of frames into a single transmission, precisely
26
+ * because the fixed cost below would otherwise dominate at high rates. Modelling a lone 1500-byte
27
+ * frame would show a 300 Mbps link delivering 60 Mbps, which is what 802.11 looked like twenty years
28
+ * ago and would teach an efficiency problem that has since been solved.
29
+ */
30
+ declare const PAYLOAD_BITS: number;
31
+ /**
32
+ * Fixed cost of taking a turn, in microseconds.
33
+ *
34
+ * Contention, the gap before transmitting, the preamble and the acknowledgement. It is paid per turn
35
+ * regardless of how fast the device is, which is why it hurts fast devices most and why aggregation
36
+ * exists.
37
+ */
38
+ declare const TURN_OVERHEAD_US = 200;
39
+ interface Client {
40
+ id: string;
41
+ label: string;
42
+ /** Signal at the device, in dBm. The rate follows from it. */
43
+ rssiDbm: number;
44
+ }
45
+ interface ClientShare {
46
+ client: Client;
47
+ /** Rate this device negotiates from its signal, in Mbps. */
48
+ rateMbps: number;
49
+ /** Microseconds of channel time its turn consumes. */
50
+ turnUs: number;
51
+ /** Fraction of the channel's time this device occupies, 0 to 1. */
52
+ airtimeShare: number;
53
+ /** What it actually achieves once everyone is taking turns, in Mbps. */
54
+ effectiveMbps: number;
55
+ }
56
+ interface AirtimeResult {
57
+ shares: ClientShare[];
58
+ /** Everything the cell delivers, added up, in Mbps. */
59
+ totalMbps: number;
60
+ /** What the fastest device alone would have achieved, for comparison. */
61
+ aloneMbps: number;
62
+ /** Airtime taken by the single worst offender, 0 to 1. */
63
+ worstShare: number;
64
+ }
65
+ /**
66
+ * Data rate a device negotiates from its signal, in Mbps.
67
+ *
68
+ * A staircase rather than a curve, because rate selection is a ladder of modulation schemes and a
69
+ * device drops a whole rung at a time. The figures are for a two-stream client on a modern 5 GHz
70
+ * channel. The shape is what matters: rate holds up and then falls off a cliff, so a room that is
71
+ * merely "usable" is already several rungs down.
72
+ */
73
+ declare function rateFromRssi(rssiDbm: number): number;
74
+ /**
75
+ * Share the channel between devices that all want to send at once.
76
+ *
77
+ * Each device gets an equal number of turns, so a round is the sum of everyone's turn length, and
78
+ * every device delivers one payload per round. That is why the effective rates come out EQUAL: the
79
+ * arithmetic makes the fast device wait through the slow one's turn, every round, forever.
80
+ */
81
+ declare function shareAirtime(clients: readonly Client[]): AirtimeResult;
82
+ /** A device's signal placed into words, so a share can be read without decoding dBm. */
83
+ declare function signalWord(rssiDbm: number): string;
84
+ /** A household worth arguing about: three healthy devices and one in the corner that is not. */
85
+ declare const HOUSEHOLD: Client[];
86
+ //#endregion
87
+ export { AirtimeResult, Client, ClientShare, HOUSEHOLD, PAYLOAD_BITS, TURN_OVERHEAD_US, rateFromRssi, shareAirtime, signalWord };