-
-
Notifications
You must be signed in to change notification settings - Fork 65
Closed
Milestone
Description
Describe the bug
There's a bunch of Page X-ray specific functions in the CO2.js library. This isn't specific to any model. I am not aware of any other user (besides sitespeedio/sitespeed.io) who are using these functions.
@soulgalore would it be possible to move these functions into the Sitespeed sustainbility plugin itself? That would help reduce the code we ship with the library (#121) as well as reduce the size of our tests.
We would not make this change for a few months, and would socialise it with the community to try and ensure no other projects are impacted.
Additional context
Lines 190 to 290 in 51b85e2
| perDomain(pageXray, greenDomains) { | |
| const co2PerDomain = []; | |
| for (let domain of Object.keys(pageXray.domains)) { | |
| let co2; | |
| if (greenDomains && greenDomains.indexOf(domain) > -1) { | |
| co2 = this.perByte(pageXray.domains[domain].transferSize, true); | |
| } else { | |
| co2 = this.perByte(pageXray.domains[domain].transferSize); | |
| } | |
| co2PerDomain.push({ | |
| domain, | |
| co2, | |
| transferSize: pageXray.domains[domain].transferSize, | |
| }); | |
| } | |
| co2PerDomain.sort((a, b) => b.co2 - a.co2); | |
| return co2PerDomain; | |
| } | |
| perPage(pageXray, green) { | |
| // 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 = this.perDomain(pageXray, green); | |
| let totalCO2 = 0; | |
| for (let domain of domainCO2) { | |
| totalCO2 += domain.co2; | |
| } | |
| return totalCO2; | |
| } | |
| perContentType(pageXray, greenDomains) { | |
| const co2PerContentType = {}; | |
| for (let asset of pageXray.assets) { | |
| const domain = new URL(asset.url).domain; | |
| const transferSize = asset.transferSize; | |
| const co2ForTransfer = this.perByte( | |
| transferSize, | |
| greenDomains && greenDomains.indexOf(domain) > -1 | |
| ); | |
| 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; | |
| } | |
| dirtiestResources(pageXray, greenDomains) { | |
| const allAssets = []; | |
| for (let asset of pageXray.assets) { | |
| const domain = new URL(asset.url).domain; | |
| const transferSize = asset.transferSize; | |
| const co2ForTransfer = this.perByte( | |
| transferSize, | |
| greenDomains && greenDomains.indexOf(domain) > -1 | |
| ); | |
| allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize }); | |
| } | |
| allAssets.sort((a, b) => b.co2 - a.co2); | |
| return allAssets.slice(0, allAssets.length > 10 ? 10 : allAssets.length); | |
| } | |
| perParty(pageXray, greenDomains) { | |
| let firstParty = 0; | |
| let thirdParty = 0; | |
| // calculate co2 per first/third party | |
| const firstPartyRegEx = pageXray.firstPartyRegEx; | |
| for (let d of Object.keys(pageXray.domains)) { | |
| if (!d.match(firstPartyRegEx)) { | |
| thirdParty += this.perByte( | |
| pageXray.domains[d].transferSize, | |
| greenDomains && greenDomains.indexOf(d) > -1 | |
| ); | |
| } else { | |
| firstParty += this.perByte( | |
| pageXray.domains[d].transferSize, | |
| greenDomains && greenDomains.indexOf(d) > -1 | |
| ); | |
| } | |
| } | |
| return { firstParty, thirdParty }; | |
| } |
Metadata
Metadata
Assignees
Labels
No labels