mirror of
https://github.com/DeNNiiInc/Web-Page-Performance-Test.git
synced 2026-04-17 20:05:58 +00:00
V2 Feature overhaul and improvements
This commit is contained in:
82
lib/analysis/carbon-calculator.js
Normal file
82
lib/analysis/carbon-calculator.js
Normal file
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* Carbon Calculator
|
||||
* Based on the Sustainable Web Design model.
|
||||
*/
|
||||
|
||||
// 1 byte = X kWh?
|
||||
// The model: 0.81 kWh / GB for data transfer (2021/2022 estimate)
|
||||
// Carbon intensity: ~442g/kWh (global average)
|
||||
//
|
||||
// Formula:
|
||||
// Energy = (Data Transfer (GB) * 0.81) * 0.75 (system boundary)
|
||||
// Carbon = Energy * 442g
|
||||
|
||||
const SWD_KWH_PER_GB = 0.81;
|
||||
const CARBON_INTENSITY_GLOBAL = 442; // g/kWh
|
||||
|
||||
/**
|
||||
* Checks if a domain is hosted on green infrastructure.
|
||||
* @param {string} domain
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async function checkGreenHosting(domain) {
|
||||
try {
|
||||
const res = await fetch(`https://api.thegreenwebfoundation.org/greencheck/${domain}`);
|
||||
const data = await res.json();
|
||||
return data.green || false;
|
||||
} catch (e) {
|
||||
console.warn('Green hosting check failed:', e.message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the carbon footprint of a page load.
|
||||
* @param {number} bytes - Total transfer size in bytes.
|
||||
* @param {boolean} isGreen - Whether the host is green.
|
||||
* @returns {object} - { co2: number (grams), rating: string }
|
||||
*/
|
||||
function calculateCarbon(bytes, isGreen) {
|
||||
const gb = bytes / (1024 * 1024 * 1024);
|
||||
let energy = gb * SWD_KWH_PER_GB * 0.75; // kWh
|
||||
|
||||
// Carbon intensity adjustment
|
||||
// If green, we assume a lower intensity or offset (often considered 0 or low, but let's say 50g/kWh for production/network overhead)
|
||||
// The standard generally keeps network intensity the same but reduced datacenter intensity.
|
||||
// For simplicity/standard SWD: Green hosting reduces the data center portion.
|
||||
// Let's use simple factor: if green, reduce total by 10-20%?
|
||||
// Actually, SWD v3 splits it:
|
||||
// Consumer device: 52%
|
||||
// Network: 14%
|
||||
// Data Center: 15%
|
||||
// Hardware production: 19%
|
||||
//
|
||||
// Green hosting only affects Data Center (15%).
|
||||
// So if green, we assume 0 emissions for that 15%, reducing total by 15%.
|
||||
|
||||
const intensity = isGreen ? CARBON_INTENSITY_GLOBAL * 0.85 : CARBON_INTENSITY_GLOBAL;
|
||||
|
||||
const co2 = energy * intensity;
|
||||
|
||||
// Rating (Eco-Index style)
|
||||
// < 0.5g -> A+
|
||||
// < 1g -> A
|
||||
// < 2g -> B
|
||||
// < 3g -> C
|
||||
// > 5g -> F
|
||||
let rating = 'F';
|
||||
if(co2 < 0.5) rating = 'A+';
|
||||
else if(co2 < 1.0) rating = 'A';
|
||||
else if(co2 < 2.0) rating = 'B';
|
||||
else if(co2 < 3.0) rating = 'C';
|
||||
else if(co2 < 4.0) rating = 'D';
|
||||
else if(co2 < 5.0) rating = 'E';
|
||||
|
||||
return {
|
||||
co2: parseFloat(co2.toFixed(3)),
|
||||
rating,
|
||||
energy: parseFloat(energy.toFixed(5))
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { checkGreenHosting, calculateCarbon };
|
||||
Reference in New Issue
Block a user