@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,18 @@
|
|
|
1
|
+
//#region src/networking/queue.ts
|
|
2
|
+
function queueAtTime(arrivalPps, servicePps, bufferPackets, elapsedSeconds) {
|
|
3
|
+
const accumulated = Math.max(0, arrivalPps - servicePps) * Math.max(0, elapsedSeconds);
|
|
4
|
+
const queued = Math.min(Math.max(0, bufferPackets), accumulated);
|
|
5
|
+
const dropped = Math.max(0, accumulated - Math.max(0, bufferPackets));
|
|
6
|
+
return {
|
|
7
|
+
queued,
|
|
8
|
+
dropped,
|
|
9
|
+
delayMs: servicePps > 0 ? Math.round(queued / servicePps * 1e3) : 0,
|
|
10
|
+
state: dropped > 0 ? "dropping" : queued > 0 ? "building" : "clear"
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function bottleneckQueue(arrivalPps, servicePps, bufferPackets) {
|
|
14
|
+
return queueAtTime(arrivalPps, servicePps, bufferPackets, 2);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { bottleneckQueue, queueAtTime };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/networking/route-learning.d.ts
|
|
2
|
+
interface OspfLink {
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
cost: number;
|
|
6
|
+
}
|
|
7
|
+
interface LearnedRoute {
|
|
8
|
+
path: readonly string[];
|
|
9
|
+
metric: number;
|
|
10
|
+
reason: string;
|
|
11
|
+
}
|
|
12
|
+
declare function learnOspfRoute(source: string, destination: string, links: readonly OspfLink[]): LearnedRoute | null;
|
|
13
|
+
interface BgpCandidate {
|
|
14
|
+
id: string;
|
|
15
|
+
asPath: readonly number[];
|
|
16
|
+
localPreference: number;
|
|
17
|
+
allowed: boolean;
|
|
18
|
+
}
|
|
19
|
+
declare function selectBgpRoute(candidates: readonly BgpCandidate[]): (BgpCandidate & {
|
|
20
|
+
reason: string;
|
|
21
|
+
}) | null;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { BgpCandidate, LearnedRoute, OspfLink, learnOspfRoute, selectBgpRoute };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/networking/route-learning.ts
|
|
2
|
+
function learnOspfRoute(source, destination, links) {
|
|
3
|
+
const nodes = new Set(links.flatMap((link) => [link.from, link.to]));
|
|
4
|
+
if (!nodes.has(source) || !nodes.has(destination)) return null;
|
|
5
|
+
const distance = new Map([[source, 0]]);
|
|
6
|
+
const previous = /* @__PURE__ */ new Map();
|
|
7
|
+
const unvisited = new Set(nodes);
|
|
8
|
+
while (unvisited.size > 0) {
|
|
9
|
+
const current = [...unvisited].sort((a, b) => (distance.get(a) ?? Infinity) - (distance.get(b) ?? Infinity) || a.localeCompare(b))[0];
|
|
10
|
+
unvisited.delete(current);
|
|
11
|
+
if (current === destination) break;
|
|
12
|
+
const currentDistance = distance.get(current);
|
|
13
|
+
if (currentDistance == null) break;
|
|
14
|
+
for (const link of links.filter((item) => item.from === current || item.to === current)) {
|
|
15
|
+
const neighbor = link.from === current ? link.to : link.from;
|
|
16
|
+
if (!unvisited.has(neighbor)) continue;
|
|
17
|
+
const candidate = currentDistance + Math.max(1, link.cost);
|
|
18
|
+
if (candidate < (distance.get(neighbor) ?? Infinity)) {
|
|
19
|
+
distance.set(neighbor, candidate);
|
|
20
|
+
previous.set(neighbor, current);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const metric = distance.get(destination);
|
|
25
|
+
if (metric == null) return null;
|
|
26
|
+
const path = [destination];
|
|
27
|
+
while (path[0] !== source) path.unshift(previous.get(path[0]));
|
|
28
|
+
return {
|
|
29
|
+
path,
|
|
30
|
+
metric,
|
|
31
|
+
reason: `Lowest accumulated link cost: ${metric}.`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function selectBgpRoute(candidates) {
|
|
35
|
+
const selected = candidates.filter((candidate) => candidate.allowed).sort((a, b) => b.localPreference - a.localPreference || a.asPath.length - b.asPath.length || a.id.localeCompare(b.id))[0];
|
|
36
|
+
return selected ? {
|
|
37
|
+
...selected,
|
|
38
|
+
reason: "Policy preference wins first; AS-path length breaks the tie."
|
|
39
|
+
} : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { learnOspfRoute, selectBgpRoute };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NetworkRoute } from "./topology/contract.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/networking/routing.d.ts
|
|
4
|
+
declare function parseCidr(cidr: string): {
|
|
5
|
+
network: number;
|
|
6
|
+
prefix: number;
|
|
7
|
+
} | undefined;
|
|
8
|
+
declare function cidrContains(cidr: string, ip: string): boolean;
|
|
9
|
+
declare function longestPrefixMatch(routes: readonly NetworkRoute[], destinationIp: string): NetworkRoute | undefined;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { cidrContains, longestPrefixMatch, parseCidr };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ipv4ToInt } from "./subnet.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/networking/routing.ts
|
|
4
|
+
function parseCidr(cidr) {
|
|
5
|
+
const [ip, rawPrefix] = cidr.split("/");
|
|
6
|
+
const value = ipv4ToInt(ip ?? "");
|
|
7
|
+
const prefix = Number(rawPrefix);
|
|
8
|
+
if (value == null || !Number.isInteger(prefix) || prefix < 0 || prefix > 32) return void 0;
|
|
9
|
+
return {
|
|
10
|
+
network: value & (prefix === 0 ? 0 : 4294967295 << 32 - prefix >>> 0),
|
|
11
|
+
prefix
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function cidrContains(cidr, ip) {
|
|
15
|
+
const parsed = parseCidr(cidr);
|
|
16
|
+
const value = ipv4ToInt(ip);
|
|
17
|
+
if (!parsed || value == null) return false;
|
|
18
|
+
return (value & (parsed.prefix === 0 ? 0 : 4294967295 << 32 - parsed.prefix >>> 0)) === parsed.network;
|
|
19
|
+
}
|
|
20
|
+
function longestPrefixMatch(routes, destinationIp) {
|
|
21
|
+
return routes.filter((route) => cidrContains(route.prefix, destinationIp)).sort((left, right) => (parseCidr(right.prefix)?.prefix ?? -1) - (parseCidr(left.prefix)?.prefix ?? -1) || (left.metric ?? 0) - (right.metric ?? 0))[0];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { cidrContains, longestPrefixMatch, parseCidr };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/networking/signals.d.ts
|
|
2
|
+
type ModulationScheme = "ask" | "bpsk";
|
|
3
|
+
interface ModulationResult {
|
|
4
|
+
readonly bits: string;
|
|
5
|
+
readonly recovered: string;
|
|
6
|
+
readonly errors: number;
|
|
7
|
+
readonly symbols: readonly {
|
|
8
|
+
bit: "0" | "1";
|
|
9
|
+
amplitude: number;
|
|
10
|
+
phase: number;
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
declare function modulate(bits: string, scheme: ModulationScheme, noisePercent: number): ModulationResult;
|
|
14
|
+
type MediaKind = "voice" | "video";
|
|
15
|
+
type MediaQuality = "efficient" | "detailed";
|
|
16
|
+
interface EncodingResult {
|
|
17
|
+
readonly bitrateKbps: number;
|
|
18
|
+
readonly units: number;
|
|
19
|
+
readonly packets: number;
|
|
20
|
+
readonly received: number;
|
|
21
|
+
readonly lost: number;
|
|
22
|
+
readonly fidelity: number;
|
|
23
|
+
}
|
|
24
|
+
declare function encodeMedia(kind: MediaKind, quality: MediaQuality, lossPercent: number): EncodingResult;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { EncodingResult, MediaKind, MediaQuality, ModulationResult, ModulationScheme, encodeMedia, modulate };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/networking/signals.ts
|
|
2
|
+
function modulate(bits, scheme, noisePercent) {
|
|
3
|
+
const clean = bits.replace(/[^01]/g, "").slice(0, 8) || "0";
|
|
4
|
+
const errorBudget = noisePercent < 20 ? 0 : noisePercent < 35 ? 1 : Math.min(2, clean.length);
|
|
5
|
+
const errorIndexes = new Set(Array.from({ length: errorBudget }, (_, index) => clean.length - 1 - index * 2));
|
|
6
|
+
return {
|
|
7
|
+
bits: clean,
|
|
8
|
+
recovered: [...clean].map((bit, index) => errorIndexes.has(index) ? bit === "1" ? "0" : "1" : bit).join(""),
|
|
9
|
+
errors: errorBudget,
|
|
10
|
+
symbols: [...clean].map((bit) => ({
|
|
11
|
+
bit,
|
|
12
|
+
amplitude: scheme === "ask" ? bit === "1" ? 1 : .35 : 1,
|
|
13
|
+
phase: scheme === "bpsk" && bit === "0" ? Math.PI : 0
|
|
14
|
+
}))
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function encodeMedia(kind, quality, lossPercent) {
|
|
18
|
+
const detailed = quality === "detailed";
|
|
19
|
+
const bitrateKbps = kind === "voice" ? detailed ? 64 : 16 : detailed ? 2500 : 500;
|
|
20
|
+
const units = kind === "voice" ? detailed ? 16 : 8 : detailed ? 12 : 6;
|
|
21
|
+
const packets = kind === "voice" ? 8 : 12;
|
|
22
|
+
const lost = Math.min(packets, Math.round(packets * Math.max(0, lossPercent) / 100));
|
|
23
|
+
const received = packets - lost;
|
|
24
|
+
return {
|
|
25
|
+
bitrateKbps,
|
|
26
|
+
units,
|
|
27
|
+
packets,
|
|
28
|
+
received,
|
|
29
|
+
lost,
|
|
30
|
+
fidelity: Math.max(0, Math.round(received / packets * (detailed ? 100 : 78)))
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { encodeMedia, modulate };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/networking/subnet.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Subnetting, reduced to the one question it actually answers.
|
|
4
|
+
*
|
|
5
|
+
* "Are these two addresses on the same network?" is the whole of it, and the answer is mechanical:
|
|
6
|
+
* compare the first `prefix` bits. Same, and the two can talk directly. Different, and everything
|
|
7
|
+
* has to go through a router. Every other subnetting fact (mask, network address, broadcast, usable
|
|
8
|
+
* count) falls out of where that boundary sits.
|
|
9
|
+
*
|
|
10
|
+
* Students drown here because it is taught in dotted decimal, where the boundary is invisible. In
|
|
11
|
+
* binary it is a vertical line, and the moment it crosses the first differing bit the answer flips.
|
|
12
|
+
* That is the thing to show.
|
|
13
|
+
*/
|
|
14
|
+
declare function ipv4ToInt(ip: string): number | undefined;
|
|
15
|
+
declare const intToIpv4: (value: number) => string;
|
|
16
|
+
/** The mask for a prefix, as a 32-bit unsigned value. /0 is all zeros. */
|
|
17
|
+
declare const maskFor: (prefix: number) => number;
|
|
18
|
+
interface Bit {
|
|
19
|
+
value: 0 | 1;
|
|
20
|
+
/** True while this bit is inside the network portion. */
|
|
21
|
+
network: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** The 32 bits of an address, flagged by which side of the prefix boundary they fall. */
|
|
24
|
+
declare function bitsOf(address: string, prefix: number): Bit[] | null;
|
|
25
|
+
interface SubnetInfo {
|
|
26
|
+
address: string;
|
|
27
|
+
prefix: number;
|
|
28
|
+
mask: string;
|
|
29
|
+
network: string;
|
|
30
|
+
broadcast: string;
|
|
31
|
+
firstUsable: string | null;
|
|
32
|
+
lastUsable: string | null;
|
|
33
|
+
/** Addresses that can be given to a device. Excludes network and broadcast. */
|
|
34
|
+
usableHosts: number;
|
|
35
|
+
bits: Bit[];
|
|
36
|
+
}
|
|
37
|
+
declare function describe(address: string, prefix: number): SubnetInfo | null;
|
|
38
|
+
/** Do two addresses share a network under this prefix? */
|
|
39
|
+
declare function sameNetwork(a: string, b: string, prefix: number): boolean | null;
|
|
40
|
+
/**
|
|
41
|
+
* The index (0-based from the left) of the first bit where two addresses differ, or -1 when they
|
|
42
|
+
* are identical. This is the number the whole lab turns on: any prefix at or below it puts the two
|
|
43
|
+
* on the same network, and any prefix above it separates them.
|
|
44
|
+
*/
|
|
45
|
+
declare function firstDifferingBit(a: string, b: string): number;
|
|
46
|
+
/** The largest prefix that still keeps both addresses together. */
|
|
47
|
+
declare function widestSharedPrefix(a: string, b: string): number;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { Bit, SubnetInfo, bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//#region src/networking/subnet.ts
|
|
2
|
+
/**
|
|
3
|
+
* Subnetting, reduced to the one question it actually answers.
|
|
4
|
+
*
|
|
5
|
+
* "Are these two addresses on the same network?" is the whole of it, and the answer is mechanical:
|
|
6
|
+
* compare the first `prefix` bits. Same, and the two can talk directly. Different, and everything
|
|
7
|
+
* has to go through a router. Every other subnetting fact (mask, network address, broadcast, usable
|
|
8
|
+
* count) falls out of where that boundary sits.
|
|
9
|
+
*
|
|
10
|
+
* Students drown here because it is taught in dotted decimal, where the boundary is invisible. In
|
|
11
|
+
* binary it is a vertical line, and the moment it crosses the first differing bit the answer flips.
|
|
12
|
+
* That is the thing to show.
|
|
13
|
+
*/
|
|
14
|
+
function ipv4ToInt(ip) {
|
|
15
|
+
const parts = ip.split(".");
|
|
16
|
+
if (parts.length !== 4) return void 0;
|
|
17
|
+
const nums = parts.map(Number);
|
|
18
|
+
if (nums.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return void 0;
|
|
19
|
+
return nums.reduce((acc, n) => acc * 256 + n >>> 0, 0);
|
|
20
|
+
}
|
|
21
|
+
const intToIpv4 = (value) => [
|
|
22
|
+
24,
|
|
23
|
+
16,
|
|
24
|
+
8,
|
|
25
|
+
0
|
|
26
|
+
].map((shift) => value >>> shift & 255).join(".");
|
|
27
|
+
/** The mask for a prefix, as a 32-bit unsigned value. /0 is all zeros. */
|
|
28
|
+
const maskFor = (prefix) => prefix <= 0 ? 0 : prefix >= 32 ? 4294967295 : 4294967295 << 32 - prefix >>> 0;
|
|
29
|
+
/** The 32 bits of an address, flagged by which side of the prefix boundary they fall. */
|
|
30
|
+
function bitsOf(address, prefix) {
|
|
31
|
+
const value = ipv4ToInt(address);
|
|
32
|
+
if (value == null) return null;
|
|
33
|
+
return Array.from({ length: 32 }, (_, index) => ({
|
|
34
|
+
value: value >>> 31 - index & 1,
|
|
35
|
+
network: index < prefix
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function describe(address, prefix) {
|
|
39
|
+
const value = ipv4ToInt(address);
|
|
40
|
+
const bits = bitsOf(address, prefix);
|
|
41
|
+
if (value == null || !bits || prefix < 0 || prefix > 32) return null;
|
|
42
|
+
const mask = maskFor(prefix);
|
|
43
|
+
const network = (value & mask) >>> 0;
|
|
44
|
+
const broadcast = (network | ~mask >>> 0) >>> 0;
|
|
45
|
+
const total = 2 ** (32 - prefix);
|
|
46
|
+
const usableHosts = total > 2 ? total - 2 : 0;
|
|
47
|
+
return {
|
|
48
|
+
address,
|
|
49
|
+
prefix,
|
|
50
|
+
mask: intToIpv4(mask),
|
|
51
|
+
network: intToIpv4(network),
|
|
52
|
+
broadcast: intToIpv4(broadcast),
|
|
53
|
+
firstUsable: usableHosts ? intToIpv4(network + 1) : null,
|
|
54
|
+
lastUsable: usableHosts ? intToIpv4(broadcast - 1) : null,
|
|
55
|
+
usableHosts,
|
|
56
|
+
bits
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Do two addresses share a network under this prefix? */
|
|
60
|
+
function sameNetwork(a, b, prefix) {
|
|
61
|
+
const left = ipv4ToInt(a);
|
|
62
|
+
const right = ipv4ToInt(b);
|
|
63
|
+
if (left == null || right == null) return null;
|
|
64
|
+
const mask = maskFor(prefix);
|
|
65
|
+
return (left & mask) >>> 0 === (right & mask) >>> 0;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The index (0-based from the left) of the first bit where two addresses differ, or -1 when they
|
|
69
|
+
* are identical. This is the number the whole lab turns on: any prefix at or below it puts the two
|
|
70
|
+
* on the same network, and any prefix above it separates them.
|
|
71
|
+
*/
|
|
72
|
+
function firstDifferingBit(a, b) {
|
|
73
|
+
const left = ipv4ToInt(a);
|
|
74
|
+
const right = ipv4ToInt(b);
|
|
75
|
+
if (left == null || right == null) return -1;
|
|
76
|
+
for (let index = 0; index < 32; index++) {
|
|
77
|
+
const shift = 31 - index;
|
|
78
|
+
if ((left >>> shift & 1) !== (right >>> shift & 1)) return index;
|
|
79
|
+
}
|
|
80
|
+
return -1;
|
|
81
|
+
}
|
|
82
|
+
/** The largest prefix that still keeps both addresses together. */
|
|
83
|
+
function widestSharedPrefix(a, b) {
|
|
84
|
+
const differing = firstDifferingBit(a, b);
|
|
85
|
+
return differing === -1 ? 32 : differing;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//#endregion
|
|
89
|
+
export { bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/networking/tcp-reliability.d.ts
|
|
2
|
+
type TcpFeedback = "ack" | "triple-duplicate-ack" | "timeout";
|
|
3
|
+
interface TcpSenderOptions {
|
|
4
|
+
congestionWindow: number;
|
|
5
|
+
receiverWindow: number;
|
|
6
|
+
slowStartThreshold: number;
|
|
7
|
+
feedback: TcpFeedback;
|
|
8
|
+
}
|
|
9
|
+
interface TcpSenderResult {
|
|
10
|
+
sendWindow: number;
|
|
11
|
+
nextCongestionWindow: number;
|
|
12
|
+
nextSlowStartThreshold: number;
|
|
13
|
+
phase: "slow-start" | "congestion-avoidance" | "fast-recovery" | "timeout-recovery";
|
|
14
|
+
retransmit: boolean;
|
|
15
|
+
reason: string;
|
|
16
|
+
}
|
|
17
|
+
declare function advanceTcpSender({
|
|
18
|
+
congestionWindow,
|
|
19
|
+
receiverWindow,
|
|
20
|
+
slowStartThreshold,
|
|
21
|
+
feedback
|
|
22
|
+
}: TcpSenderOptions): TcpSenderResult;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { TcpFeedback, TcpSenderOptions, TcpSenderResult, advanceTcpSender };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/networking/tcp-reliability.ts
|
|
2
|
+
function advanceTcpSender({ congestionWindow, receiverWindow, slowStartThreshold, feedback }) {
|
|
3
|
+
const cwnd = Math.max(1, Math.floor(congestionWindow));
|
|
4
|
+
const rwnd = Math.max(0, Math.floor(receiverWindow));
|
|
5
|
+
const threshold = Math.max(2, Math.floor(slowStartThreshold));
|
|
6
|
+
const sendWindow = Math.min(cwnd, rwnd);
|
|
7
|
+
if (feedback === "timeout") return {
|
|
8
|
+
sendWindow,
|
|
9
|
+
nextCongestionWindow: 1,
|
|
10
|
+
nextSlowStartThreshold: Math.max(2, Math.floor(cwnd / 2)),
|
|
11
|
+
phase: "timeout-recovery",
|
|
12
|
+
retransmit: true,
|
|
13
|
+
reason: "A timeout is strong congestion evidence: retransmit and restart cautiously."
|
|
14
|
+
};
|
|
15
|
+
if (feedback === "triple-duplicate-ack") {
|
|
16
|
+
const halved = Math.max(2, Math.floor(cwnd / 2));
|
|
17
|
+
return {
|
|
18
|
+
sendWindow,
|
|
19
|
+
nextCongestionWindow: halved,
|
|
20
|
+
nextSlowStartThreshold: halved,
|
|
21
|
+
phase: "fast-recovery",
|
|
22
|
+
retransmit: true,
|
|
23
|
+
reason: "Duplicate acknowledgements identify a gap while later data is still arriving."
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const slowStart = cwnd < threshold;
|
|
27
|
+
return {
|
|
28
|
+
sendWindow,
|
|
29
|
+
nextCongestionWindow: slowStart ? cwnd * 2 : cwnd + 1,
|
|
30
|
+
nextSlowStartThreshold: threshold,
|
|
31
|
+
phase: slowStart ? "slow-start" : "congestion-avoidance",
|
|
32
|
+
retransmit: false,
|
|
33
|
+
reason: slowStart ? "Acknowledgements rapidly grow the congestion window." : "Acknowledgements grow the window cautiously after the threshold."
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { advanceTcpSender };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
//#region src/networking/topology/contract.d.ts
|
|
2
|
+
type NetworkDeviceKind = "client" | "server" | "switch" | "router" | "access-point" | "firewall" | "load-balancer" | "dns" | "broker" | "cloud";
|
|
3
|
+
interface NetworkInterface {
|
|
4
|
+
id: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
mac?: string;
|
|
7
|
+
addresses?: string[];
|
|
8
|
+
}
|
|
9
|
+
interface NetworkDevice {
|
|
10
|
+
id: string;
|
|
11
|
+
kind: NetworkDeviceKind;
|
|
12
|
+
label: string;
|
|
13
|
+
at: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
};
|
|
17
|
+
interfaces: NetworkInterface[];
|
|
18
|
+
services?: {
|
|
19
|
+
kind: "dhcp" | "dns" | "http" | "https" | "ftp" | "websocket";
|
|
20
|
+
port?: number;
|
|
21
|
+
label?: string;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
interface NetworkEndpoint {
|
|
25
|
+
deviceId: string;
|
|
26
|
+
interfaceId: string;
|
|
27
|
+
}
|
|
28
|
+
interface NetworkLink {
|
|
29
|
+
id: string;
|
|
30
|
+
a: NetworkEndpoint;
|
|
31
|
+
b: NetworkEndpoint;
|
|
32
|
+
label?: string;
|
|
33
|
+
cost?: number;
|
|
34
|
+
latencyMs?: number;
|
|
35
|
+
bandwidthMbps?: number;
|
|
36
|
+
loss?: number;
|
|
37
|
+
mtu?: number;
|
|
38
|
+
state?: "up" | "down";
|
|
39
|
+
}
|
|
40
|
+
interface NetworkRoute {
|
|
41
|
+
id: string;
|
|
42
|
+
deviceId: string;
|
|
43
|
+
prefix: string;
|
|
44
|
+
via?: string;
|
|
45
|
+
interfaceId: string;
|
|
46
|
+
metric?: number;
|
|
47
|
+
}
|
|
48
|
+
interface NetworkDoc {
|
|
49
|
+
schemaVersion: 1;
|
|
50
|
+
type: "network";
|
|
51
|
+
devices: NetworkDevice[];
|
|
52
|
+
links: NetworkLink[];
|
|
53
|
+
routes?: NetworkRoute[];
|
|
54
|
+
title?: string;
|
|
55
|
+
}
|
|
56
|
+
type PacketLayerKind = "application" | "transport" | "network" | "data-link" | "physical";
|
|
57
|
+
interface PacketLayer {
|
|
58
|
+
kind: PacketLayerKind;
|
|
59
|
+
protocol: string;
|
|
60
|
+
summary: string;
|
|
61
|
+
fields?: Record<string, string | number>;
|
|
62
|
+
}
|
|
63
|
+
interface NetworkPacket {
|
|
64
|
+
id: string;
|
|
65
|
+
from: string;
|
|
66
|
+
to: string;
|
|
67
|
+
bytes: number;
|
|
68
|
+
layers: PacketLayer[];
|
|
69
|
+
}
|
|
70
|
+
type NetworkEvent = {
|
|
71
|
+
type: "packet-created";
|
|
72
|
+
at: string;
|
|
73
|
+
packet: NetworkPacket;
|
|
74
|
+
message: string;
|
|
75
|
+
} | {
|
|
76
|
+
type: "arp-requested";
|
|
77
|
+
at: string;
|
|
78
|
+
target: string;
|
|
79
|
+
message: string;
|
|
80
|
+
} | {
|
|
81
|
+
type: "arp-resolved";
|
|
82
|
+
at: string;
|
|
83
|
+
target: string;
|
|
84
|
+
message: string;
|
|
85
|
+
} | {
|
|
86
|
+
type: "route-selected";
|
|
87
|
+
at: string;
|
|
88
|
+
next: string;
|
|
89
|
+
prefix?: string;
|
|
90
|
+
message: string;
|
|
91
|
+
} | {
|
|
92
|
+
type: "frame-sent";
|
|
93
|
+
at: string;
|
|
94
|
+
linkId: string;
|
|
95
|
+
next: string;
|
|
96
|
+
packet: NetworkPacket;
|
|
97
|
+
message: string;
|
|
98
|
+
} | {
|
|
99
|
+
type: "frame-received";
|
|
100
|
+
at: string;
|
|
101
|
+
linkId: string;
|
|
102
|
+
from: string;
|
|
103
|
+
packet: NetworkPacket;
|
|
104
|
+
message: string;
|
|
105
|
+
} | {
|
|
106
|
+
type: "packet-dropped";
|
|
107
|
+
at: string;
|
|
108
|
+
reason: "unreachable" | "link-down" | "loss" | "mtu";
|
|
109
|
+
message: string;
|
|
110
|
+
} | {
|
|
111
|
+
type: "packet-delivered";
|
|
112
|
+
at: string;
|
|
113
|
+
packet: NetworkPacket;
|
|
114
|
+
message: string;
|
|
115
|
+
};
|
|
116
|
+
interface NetworkTrace {
|
|
117
|
+
delivered: boolean;
|
|
118
|
+
path: string[];
|
|
119
|
+
totalLatencyMs: number;
|
|
120
|
+
events: NetworkEvent[];
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind } from "./contract.mjs";
|
|
2
|
+
import { COMPANY_NETWORK, HOME_NETWORK } from "./presets.mjs";
|
|
3
|
+
import { createPacket, simulatePacket } from "./simulation.mjs";
|
|
4
|
+
export { COMPANY_NETWORK, HOME_NETWORK, NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind, createPacket, simulatePacket };
|