sitespeed.io
Version:
sitespeed.io is an open-source tool for comprehensive web performance analysis, enabling you to test, monitor, and optimize your website’s speed using real browsers in various environments.
105 lines (95 loc) • 3.23 kB
JavaScript
// Moved from the co2.js project
// see https://github.com/thegreenwebfoundation/co2.js/issues/182
export function perDomain(pageXray, greenDomains, CO2) {
const co2PerDomain = [];
for (let domain of Object.keys(pageXray.domains)) {
let co2;
co2 =
greenDomains && greenDomains.includes(domain)
? CO2.perByte(pageXray.domains[domain].transferSize, true)
: CO2.perByte(pageXray.domains[domain].transferSize);
co2PerDomain.push({
domain,
co2,
transferSize: pageXray.domains[domain].transferSize
});
}
co2PerDomain.sort((a, b) => b.co2 - a.co2);
return co2PerDomain;
}
export function perPage(pageXray, green, CO2) {
// Accept an xray object, and if we receive a boolean as the second
// argument, we assume every request we make is sent to a server
// running on renwewable power.
// if we receive an array of domains, return a number accounting the
// reduced CO2 from green hosted domains
const domainCO2 = perDomain(pageXray, green, CO2);
let totalCO2 = 0;
for (let domain of domainCO2) {
totalCO2 += domain.co2;
}
return totalCO2;
}
export function perContentType(pageXray, greenDomains, CO2) {
const co2PerContentType = {};
for (let asset of pageXray.assets) {
const domain = new URL(asset.url).domain;
const transferSize = asset.transferSize;
const co2ForTransfer = CO2.perByte(
transferSize,
greenDomains && greenDomains.includes(domain)
);
const contentType = asset.type;
if (!co2PerContentType[contentType]) {
co2PerContentType[contentType] = { co2: 0, transferSize: 0 };
}
co2PerContentType[contentType].co2 += co2ForTransfer;
co2PerContentType[contentType].transferSize += transferSize;
}
// restructure and sort
const all = [];
for (let type of Object.keys(co2PerContentType)) {
all.push({
type,
co2: co2PerContentType[type].co2,
transferSize: co2PerContentType[type].transferSize
});
}
all.sort((a, b) => b.co2 - a.co2);
return all;
}
export function getDirtiestResources(pageXray, greenDomains, CO2) {
const allAssets = [];
for (let asset of pageXray.assets) {
const domain = new URL(asset.url).domain;
const transferSize = asset.transferSize;
const co2ForTransfer = CO2.perByte(
transferSize,
greenDomains && greenDomains.includes(domain)
);
allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize });
}
allAssets.sort((a, b) => b.co2 - a.co2);
return allAssets.slice(0, Math.min(allAssets.length, 10));
}
export function perParty(pageXray, greenDomains, CO2) {
let firstParty = 0;
let thirdParty = 0;
// calculate co2 per first/third party
const firstPartyRegEx = pageXray.firstPartyRegEx;
for (let d of Object.keys(pageXray.domains)) {
// eslint-disable-next-line unicorn/prefer-regexp-test
if (d.match(firstPartyRegEx)) {
thirdParty += CO2.perByte(
pageXray.domains[d].transferSize,
greenDomains && greenDomains.includes(d)
);
} else {
firstParty += CO2.perByte(
pageXray.domains[d].transferSize,
greenDomains && greenDomains.includes(d)
);
}
}
return { firstParty, thirdParty };
}