@classytic/stage 0.3.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.
- package/dist/_virtual/_rolldown/runtime.mjs +18 -0
- package/dist/atomic/aufbau.d.mts +144 -0
- package/dist/atomic/aufbau.mjs +384 -0
- package/dist/atomic/elements.d.mts +67 -0
- package/dist/atomic/elements.mjs +785 -0
- package/dist/atomic/emission.d.mts +112 -0
- package/dist/atomic/emission.mjs +179 -0
- package/dist/atomic/index.d.mts +8 -0
- package/dist/atomic/index.mjs +9 -0
- package/dist/atomic/periodic.d.mts +82 -0
- package/dist/atomic/periodic.mjs +231 -0
- package/dist/atomic/properties.d.mts +100 -0
- package/dist/atomic/properties.mjs +574 -0
- package/dist/atomic/shells.d.mts +137 -0
- package/dist/atomic/shells.mjs +170 -0
- package/dist/atomic/trends.d.mts +148 -0
- package/dist/atomic/trends.mjs +225 -0
- package/dist/chem/chromatography.d.mts +66 -0
- package/dist/chem/chromatography.mjs +63 -0
- package/dist/chem/complex.d.mts +114 -0
- package/dist/chem/complex.mjs +234 -0
- package/dist/chem/cycle.d.mts +75 -0
- package/dist/chem/cycle.mjs +145 -0
- package/dist/chem/equation.d.mts +86 -0
- package/dist/chem/equation.mjs +168 -0
- package/dist/chem/formula.d.mts +90 -0
- package/dist/chem/formula.mjs +201 -0
- package/dist/chem/functional-groups.d.mts +31 -0
- package/dist/chem/functional-groups.mjs +187 -0
- package/dist/chem/hazard.d.mts +94 -0
- package/dist/chem/hazard.mjs +329 -0
- package/dist/chem/index.d.mts +34 -33
- package/dist/chem/index.mjs +34 -28
- package/dist/chem/ionic.d.mts +98 -0
- package/dist/chem/ionic.mjs +156 -0
- package/dist/chem/layout.d.mts +46 -0
- package/dist/chem/layout.mjs +342 -0
- package/dist/chem/lewis.d.mts +79 -0
- package/dist/chem/lewis.mjs +163 -0
- package/dist/chem/molecular-orbital.d.mts +114 -0
- package/dist/chem/molecular-orbital.mjs +201 -0
- package/dist/chem/molecule.d.mts +154 -0
- package/dist/chem/molecule.mjs +282 -0
- package/dist/chem/nmr.d.mts +153 -0
- package/dist/chem/nmr.mjs +165 -0
- package/dist/chem/polymer.d.mts +65 -0
- package/dist/chem/polymer.mjs +179 -0
- package/dist/chem/redox.d.mts +138 -0
- package/dist/chem/redox.mjs +328 -0
- package/dist/chem/relations.d.mts +183 -0
- package/dist/chem/relations.mjs +299 -0
- package/dist/chem/skeleton.d.mts +51 -0
- package/dist/chem/skeleton.mjs +186 -0
- package/dist/chem/solution.d.mts +116 -0
- package/dist/chem/solution.mjs +186 -0
- package/dist/chem/species.d.mts +47 -0
- package/dist/chem/species.mjs +128 -0
- package/dist/chem/stereo.d.mts +108 -0
- package/dist/chem/stereo.mjs +286 -0
- package/dist/chem/stoichiometry.d.mts +95 -0
- package/dist/chem/stoichiometry.mjs +145 -0
- package/dist/chem/synthesis.d.mts +113 -0
- package/dist/chem/synthesis.mjs +281 -0
- package/dist/chem/vsepr.d.mts +80 -0
- package/dist/chem/vsepr.mjs +247 -0
- package/dist/circuit/ac.d.mts +163 -0
- package/dist/circuit/ac.mjs +452 -0
- package/dist/circuit/dc.d.mts +92 -0
- package/dist/circuit/dc.mjs +333 -0
- package/dist/circuit/index.d.mts +5 -92
- package/dist/circuit/index.mjs +5 -332
- package/dist/circuit/network.d.mts +99 -0
- package/dist/circuit/network.mjs +440 -0
- package/dist/circuit/topology.d.mts +102 -0
- package/dist/circuit/topology.mjs +143 -0
- package/dist/colour/absorption.d.mts +79 -0
- package/dist/colour/absorption.mjs +137 -0
- package/dist/colour/index.d.mts +6 -0
- package/dist/colour/index.mjs +7 -0
- package/dist/colour/name.d.mts +14 -0
- package/dist/colour/name.mjs +76 -0
- package/dist/colour/observer.d.mts +31 -0
- package/dist/colour/observer.mjs +46 -0
- package/dist/colour/spectrum.d.mts +61 -0
- package/dist/colour/spectrum.mjs +108 -0
- package/dist/colour/srgb.d.mts +49 -0
- package/dist/colour/srgb.mjs +108 -0
- package/dist/core/constants.d.mts +138 -0
- package/dist/core/constants.mjs +139 -0
- package/dist/core/index.d.mts +3 -1
- package/dist/core/index.mjs +3 -1
- package/dist/core/vec3.d.mts +94 -0
- package/dist/core/vec3.mjs +123 -0
- package/dist/core/worked.d.mts +35 -0
- package/dist/core/worked.mjs +44 -0
- package/dist/electro/cell.d.mts +102 -0
- package/dist/electro/cell.mjs +170 -0
- package/dist/electro/conductivity.d.mts +157 -0
- package/dist/electro/conductivity.mjs +156 -0
- package/dist/electro/couples.d.mts +114 -0
- package/dist/electro/couples.mjs +334 -0
- package/dist/electro/electrolysis.d.mts +96 -0
- package/dist/electro/electrolysis.mjs +274 -0
- package/dist/electro/faraday.d.mts +150 -0
- package/dist/electro/faraday.mjs +118 -0
- package/dist/electro/index.d.mts +6 -0
- package/dist/electro/index.mjs +7 -0
- package/dist/finance/accounting/adjustments.d.mts +17 -0
- package/dist/finance/accounting/adjustments.mjs +202 -0
- package/dist/finance/accounting/analysis.d.mts +8 -0
- package/dist/finance/accounting/analysis.mjs +205 -0
- package/dist/finance/accounting/clubs.d.mts +21 -0
- package/dist/finance/accounting/clubs.mjs +217 -0
- package/dist/finance/accounting/company-statements.d.mts +7 -0
- package/dist/finance/accounting/company-statements.mjs +150 -0
- package/dist/finance/accounting/harness.d.mts +7 -0
- package/dist/finance/accounting/harness.mjs +45 -0
- package/dist/finance/accounting/index.d.mts +18 -0
- package/dist/finance/accounting/index.mjs +18 -0
- package/dist/finance/accounting/journalize.d.mts +16 -0
- package/dist/finance/accounting/journalize.mjs +128 -0
- package/dist/finance/accounting/manufacturing.d.mts +8 -0
- package/dist/finance/accounting/manufacturing.mjs +236 -0
- package/dist/finance/accounting/partnership.d.mts +7 -0
- package/dist/finance/accounting/partnership.mjs +152 -0
- package/dist/finance/accounting/period-case.d.mts +6 -0
- package/dist/finance/accounting/period-case.mjs +71 -0
- package/dist/finance/accounting/post.d.mts +9 -0
- package/dist/finance/accounting/post.mjs +84 -0
- package/dist/finance/accounting/precision.d.mts +9 -0
- package/dist/finance/accounting/precision.mjs +15 -0
- package/dist/finance/accounting/rules.d.mts +21 -0
- package/dist/finance/accounting/rules.mjs +37 -0
- package/dist/finance/accounting/solve.d.mts +28 -0
- package/dist/finance/accounting/solve.mjs +92 -0
- package/dist/finance/accounting/statements.d.mts +7 -0
- package/dist/finance/accounting/statements.mjs +142 -0
- package/dist/finance/accounting/types.d.mts +649 -0
- package/dist/finance/accounting/validate.d.mts +7 -0
- package/dist/finance/accounting/validate.mjs +67 -0
- package/dist/finance/accounting/verification.d.mts +24 -0
- package/dist/finance/accounting/verification.mjs +386 -0
- package/dist/finance/bizsim.d.mts +21 -39
- package/dist/finance/bizsim.mjs +276 -97
- package/dist/finance/index.d.mts +20 -43
- package/dist/finance/index.mjs +19 -77
- package/dist/finance/investment-math.d.mts +7 -0
- package/dist/finance/investment-math.mjs +18 -0
- package/dist/finance/management-accounting/budgeting.d.mts +7 -0
- package/dist/finance/management-accounting/budgeting.mjs +189 -0
- package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
- package/dist/finance/management-accounting/cash-budget.mjs +154 -0
- package/dist/finance/management-accounting/costing.d.mts +8 -0
- package/dist/finance/management-accounting/costing.mjs +175 -0
- package/dist/finance/management-accounting/decisions.d.mts +8 -0
- package/dist/finance/management-accounting/decisions.mjs +164 -0
- package/dist/finance/management-accounting/index.d.mts +13 -0
- package/dist/finance/management-accounting/index.mjs +13 -0
- package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
- package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
- package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
- package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
- package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
- package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
- package/dist/finance/management-accounting/management-case.d.mts +8 -0
- package/dist/finance/management-accounting/management-case.mjs +91 -0
- package/dist/finance/management-accounting/master-budget.d.mts +7 -0
- package/dist/finance/management-accounting/master-budget.mjs +137 -0
- package/dist/finance/management-accounting/production-costing.d.mts +8 -0
- package/dist/finance/management-accounting/production-costing.mjs +214 -0
- package/dist/finance/management-accounting/types.d.mts +644 -0
- package/dist/finance/management-accounting/variances.d.mts +7 -0
- package/dist/finance/management-accounting/variances.mjs +150 -0
- package/dist/index.d.mts +6 -6
- package/dist/index.mjs +1 -1
- package/dist/math/analysis.d.mts +61 -0
- package/dist/math/analysis.mjs +187 -0
- package/dist/math/answer-check.d.mts +50 -0
- package/dist/math/answer-check.mjs +106 -0
- package/dist/math/calculus.d.mts +4 -9
- package/dist/math/calculus.mjs +216 -7
- package/dist/math/complex.d.mts +93 -0
- package/dist/math/complex.mjs +239 -0
- package/dist/math/expr.d.mts +23 -0
- package/dist/math/expr.mjs +36 -0
- package/dist/math/index.d.mts +8 -22
- package/dist/math/index.mjs +8 -37
- package/dist/math/latex.mjs +2 -1
- package/dist/math/parse.mjs +1 -1
- package/dist/math/poly.d.mts +55 -0
- package/dist/math/poly.mjs +273 -0
- package/dist/math/rearrange.d.mts +14 -0
- package/dist/math/rearrange.mjs +125 -0
- package/dist/math/solve.d.mts +21 -0
- package/dist/math/solve.mjs +75 -0
- package/dist/networking/addressing.d.mts +26 -0
- package/dist/networking/addressing.mjs +33 -0
- package/dist/networking/cloud/access.d.mts +36 -0
- package/dist/networking/cloud/access.mjs +95 -0
- package/dist/networking/cloud/containers.d.mts +43 -0
- package/dist/networking/cloud/containers.mjs +54 -0
- package/dist/networking/cloud/edge.d.mts +17 -0
- package/dist/networking/cloud/edge.mjs +31 -0
- package/dist/networking/cloud/failure-domains.d.mts +19 -0
- package/dist/networking/cloud/failure-domains.mjs +22 -0
- package/dist/networking/cloud/geo-routing.d.mts +22 -0
- package/dist/networking/cloud/geo-routing.mjs +64 -0
- package/dist/networking/cloud/index.d.mts +18 -0
- package/dist/networking/cloud/index.mjs +19 -0
- package/dist/networking/cloud/inference-reliability.d.mts +30 -0
- package/dist/networking/cloud/inference-reliability.mjs +76 -0
- package/dist/networking/cloud/inference.d.mts +118 -0
- package/dist/networking/cloud/inference.mjs +179 -0
- package/dist/networking/cloud/infrastructure.d.mts +45 -0
- package/dist/networking/cloud/infrastructure.mjs +96 -0
- package/dist/networking/cloud/observability.d.mts +24 -0
- package/dist/networking/cloud/observability.mjs +34 -0
- package/dist/networking/cloud/orchestration.d.mts +32 -0
- package/dist/networking/cloud/orchestration.mjs +38 -0
- package/dist/networking/cloud/recovery.d.mts +21 -0
- package/dist/networking/cloud/recovery.mjs +27 -0
- package/dist/networking/cloud/releases.d.mts +42 -0
- package/dist/networking/cloud/releases.mjs +135 -0
- package/dist/networking/cloud/scaling.d.mts +25 -0
- package/dist/networking/cloud/scaling.mjs +65 -0
- package/dist/networking/cloud/secrets.d.mts +39 -0
- package/dist/networking/cloud/secrets.mjs +68 -0
- package/dist/networking/cloud/server-deployment.d.mts +29 -0
- package/dist/networking/cloud/server-deployment.mjs +72 -0
- package/dist/networking/cloud/storage.d.mts +16 -0
- package/dist/networking/cloud/storage.mjs +58 -0
- package/dist/networking/cloud/vpc.d.mts +18 -0
- package/dist/networking/cloud/vpc.mjs +100 -0
- package/dist/networking/delivery.d.mts +34 -0
- package/dist/networking/delivery.mjs +52 -0
- package/dist/networking/index.d.mts +47 -0
- package/dist/networking/index.mjs +47 -0
- package/dist/networking/ipv6.d.mts +28 -0
- package/dist/networking/ipv6.mjs +17 -0
- package/dist/networking/journeys.d.mts +83 -0
- package/dist/networking/journeys.mjs +161 -0
- package/dist/networking/models/airtime.d.mts +87 -0
- package/dist/networking/models/airtime.mjs +130 -0
- package/dist/networking/models/cellular.d.mts +157 -0
- package/dist/networking/models/cellular.mjs +252 -0
- package/dist/networking/models/encapsulation.d.mts +98 -0
- package/dist/networking/models/encapsulation.mjs +132 -0
- package/dist/networking/models/handover.d.mts +116 -0
- package/dist/networking/models/handover.mjs +209 -0
- package/dist/networking/models/handshake.d.mts +90 -0
- package/dist/networking/models/handshake.mjs +122 -0
- package/dist/networking/models/index.d.mts +14 -0
- package/dist/networking/models/index.mjs +15 -0
- package/dist/networking/models/media.d.mts +82 -0
- package/dist/networking/models/media.mjs +188 -0
- package/dist/networking/models/satellite.d.mts +86 -0
- package/dist/networking/models/satellite.mjs +121 -0
- package/dist/networking/models/spectrum.d.mts +83 -0
- package/dist/networking/models/spectrum.mjs +235 -0
- package/dist/networking/models/switch.d.mts +80 -0
- package/dist/networking/models/switch.mjs +155 -0
- package/dist/networking/models/vlan.d.mts +62 -0
- package/dist/networking/models/vlan.mjs +100 -0
- package/dist/networking/models/vpn.d.mts +66 -0
- package/dist/networking/models/vpn.mjs +125 -0
- package/dist/networking/models/wifi-privacy.d.mts +82 -0
- package/dist/networking/models/wifi-privacy.mjs +130 -0
- package/dist/networking/models/wifi.d.mts +240 -0
- package/dist/networking/models/wifi.mjs +562 -0
- package/dist/networking/nat-traversal.d.mts +24 -0
- package/dist/networking/nat-traversal.mjs +38 -0
- package/dist/networking/protocols.d.mts +17 -0
- package/dist/networking/protocols.mjs +57 -0
- package/dist/networking/queue.d.mts +12 -0
- package/dist/networking/queue.mjs +18 -0
- package/dist/networking/route-learning.d.mts +23 -0
- package/dist/networking/route-learning.mjs +43 -0
- package/dist/networking/routing.d.mts +11 -0
- package/dist/networking/routing.mjs +25 -0
- package/dist/networking/signals.d.mts +26 -0
- package/dist/networking/signals.mjs +35 -0
- package/dist/networking/subnet.d.mts +49 -0
- package/dist/networking/subnet.mjs +89 -0
- package/dist/networking/tcp-reliability.d.mts +24 -0
- package/dist/networking/tcp-reliability.mjs +38 -0
- package/dist/networking/topology/contract.d.mts +123 -0
- package/dist/networking/topology/index.d.mts +4 -0
- package/dist/networking/topology/index.mjs +4 -0
- package/dist/networking/topology/presets.d.mts +7 -0
- package/dist/networking/topology/presets.mjs +302 -0
- package/dist/networking/topology/simulation.d.mts +8 -0
- package/dist/networking/topology/simulation.mjs +179 -0
- package/dist/networking/wireless.d.mts +11 -0
- package/dist/networking/wireless.mjs +17 -0
- package/dist/optics/imaging.d.mts +218 -0
- package/dist/optics/imaging.mjs +276 -0
- package/dist/optics/index.d.mts +7 -0
- package/dist/optics/index.mjs +8 -0
- package/dist/optics/laws.d.mts +70 -0
- package/dist/optics/laws.mjs +195 -0
- package/dist/optics/prism.d.mts +148 -0
- package/dist/optics/prism.mjs +197 -0
- package/dist/optics/refraction.d.mts +201 -0
- package/dist/optics/refraction.mjs +270 -0
- package/dist/optics/wave-optics.d.mts +171 -0
- package/dist/optics/wave-optics.mjs +259 -0
- package/dist/physics/ac/index.d.mts +183 -0
- package/dist/physics/ac/index.mjs +203 -0
- package/dist/physics/dynamics/forces.d.mts +98 -0
- package/dist/physics/dynamics/forces.mjs +153 -0
- package/dist/physics/dynamics/friction.d.mts +76 -0
- package/dist/physics/dynamics/friction.mjs +119 -0
- package/dist/physics/dynamics/system.d.mts +68 -0
- package/dist/physics/dynamics/system.mjs +125 -0
- package/dist/physics/electrostatics/index.d.mts +169 -0
- package/dist/physics/electrostatics/index.mjs +249 -0
- package/dist/physics/energy/centre-of-mass.d.mts +115 -0
- package/dist/physics/energy/centre-of-mass.mjs +180 -0
- package/dist/physics/energy/conservation.d.mts +81 -0
- package/dist/physics/energy/conservation.mjs +129 -0
- package/dist/physics/energy/power.d.mts +90 -0
- package/dist/physics/energy/power.mjs +167 -0
- package/dist/physics/energy/spring.d.mts +73 -0
- package/dist/physics/energy/spring.mjs +129 -0
- package/dist/physics/energy/store.d.mts +63 -0
- package/dist/physics/energy/store.mjs +108 -0
- package/dist/physics/energy/theorem.d.mts +65 -0
- package/dist/physics/energy/theorem.mjs +113 -0
- package/dist/physics/energy/work.d.mts +114 -0
- package/dist/physics/energy/work.mjs +219 -0
- package/dist/physics/gravitation/body.d.mts +85 -0
- package/dist/physics/gravitation/body.mjs +168 -0
- package/dist/physics/gravitation/kepler.d.mts +127 -0
- package/dist/physics/gravitation/kepler.mjs +216 -0
- package/dist/physics/gravitation/law.d.mts +117 -0
- package/dist/physics/gravitation/law.mjs +175 -0
- package/dist/physics/gravitation/orbit.d.mts +119 -0
- package/dist/physics/gravitation/orbit.mjs +202 -0
- package/dist/physics/gravitation/potential.d.mts +114 -0
- package/dist/physics/gravitation/potential.mjs +202 -0
- package/dist/physics/gravitation/variation.d.mts +97 -0
- package/dist/physics/gravitation/variation.mjs +175 -0
- package/dist/physics/index.d.mts +35 -0
- package/dist/physics/index.mjs +36 -0
- package/dist/physics/integral-sweep.d.mts +63 -0
- package/dist/physics/integral-sweep.mjs +126 -0
- package/dist/physics/kinematics/equations.d.mts +47 -0
- package/dist/physics/kinematics/equations.mjs +126 -0
- package/dist/physics/kinematics/free-fall.d.mts +53 -0
- package/dist/physics/kinematics/free-fall.mjs +71 -0
- package/dist/physics/kinematics/given.d.mts +16 -0
- package/dist/physics/kinematics/given.mjs +55 -0
- package/dist/physics/kinematics/roots.d.mts +41 -0
- package/dist/physics/kinematics/roots.mjs +72 -0
- package/dist/physics/kinematics/solve.d.mts +52 -0
- package/dist/physics/kinematics/solve.mjs +172 -0
- package/dist/physics/magnetism/biot-savart.d.mts +161 -0
- package/dist/physics/magnetism/biot-savart.mjs +353 -0
- package/dist/physics/magnetism/flux.d.mts +94 -0
- package/dist/physics/magnetism/flux.mjs +313 -0
- package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
- package/dist/physics/magnetism/geomagnetism.mjs +184 -0
- package/dist/physics/magnetism/index.d.mts +12 -0
- package/dist/physics/magnetism/index.mjs +74 -0
- package/dist/physics/magnetism/lorentz.d.mts +28 -0
- package/dist/physics/magnetism/lorentz.mjs +88 -0
- package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
- package/dist/physics/magnetism/magnetic-force.mjs +169 -0
- package/dist/physics/momentum/collide.d.mts +77 -0
- package/dist/physics/momentum/collide.mjs +115 -0
- package/dist/physics/momentum/impulse.d.mts +89 -0
- package/dist/physics/momentum/impulse.mjs +159 -0
- package/dist/physics/momentum/planar.d.mts +60 -0
- package/dist/physics/momentum/planar.mjs +110 -0
- package/dist/physics/projectile.d.mts +107 -0
- package/dist/physics/projectile.mjs +185 -0
- package/dist/physics/rotation/angular.d.mts +85 -0
- package/dist/physics/rotation/angular.mjs +130 -0
- package/dist/physics/rotation/circular.d.mts +79 -0
- package/dist/physics/rotation/circular.mjs +131 -0
- package/dist/physics/rotation/inertia.d.mts +164 -0
- package/dist/physics/rotation/inertia.mjs +332 -0
- package/dist/physics/rotation/torque.d.mts +65 -0
- package/dist/physics/rotation/torque.mjs +134 -0
- package/dist/physics/vectors.d.mts +64 -0
- package/dist/physics/vectors.mjs +114 -0
- package/dist/quantity/index.d.mts +119 -0
- package/dist/quantity/index.mjs +417 -0
- package/dist/relation/derive.d.mts +74 -0
- package/dist/relation/derive.mjs +73 -0
- package/dist/relation/index.d.mts +56 -0
- package/dist/relation/index.mjs +234 -0
- package/dist/scene/evaluators.mjs +1 -1
- package/dist/sim/thermal.mjs +45 -20
- package/dist/thermo/calorimetry.d.mts +207 -0
- package/dist/thermo/calorimetry.mjs +345 -0
- package/dist/thermo/cycles.d.mts +142 -0
- package/dist/thermo/cycles.mjs +256 -0
- package/dist/thermo/entropy.d.mts +87 -0
- package/dist/thermo/entropy.mjs +140 -0
- package/dist/thermo/expansion.d.mts +130 -0
- package/dist/thermo/expansion.mjs +178 -0
- package/dist/thermo/gas.d.mts +197 -0
- package/dist/thermo/gas.mjs +279 -0
- package/dist/thermo/heat-transfer.d.mts +164 -0
- package/dist/thermo/heat-transfer.mjs +217 -0
- package/dist/thermo/index.d.mts +9 -82
- package/dist/thermo/index.mjs +9 -132
- package/dist/thermo/processes.d.mts +95 -0
- package/dist/thermo/processes.mjs +154 -0
- package/dist/thermo/temperature.d.mts +174 -0
- package/dist/thermo/temperature.mjs +236 -0
- package/dist/waves/damping.d.mts +224 -0
- package/dist/waves/damping.mjs +317 -0
- package/dist/waves/doppler.d.mts +72 -0
- package/dist/waves/doppler.mjs +125 -0
- package/dist/waves/index.d.mts +10 -0
- package/dist/waves/index.mjs +10 -0
- package/dist/waves/pendulum.d.mts +130 -0
- package/dist/waves/pendulum.mjs +211 -0
- package/dist/waves/pitch.d.mts +125 -0
- package/dist/waves/pitch.mjs +158 -0
- package/dist/waves/shm.d.mts +170 -0
- package/dist/waves/shm.mjs +279 -0
- package/dist/waves/springs.d.mts +103 -0
- package/dist/waves/springs.mjs +176 -0
- package/dist/waves/superposition.d.mts +124 -0
- package/dist/waves/superposition.mjs +196 -0
- package/dist/waves/wave.d.mts +154 -0
- package/dist/waves/wave.mjs +178 -0
- package/package.json +74 -2
|
@@ -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 };
|