UNPKG

cardamon

Version:

A CLI tool for measuring the carbon footprint and energy consumption of web pages using the Cardamon model

1 lines 15.7 kB
'use strict';Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports['Cardamon']=void 0x0;const constants_1=require('./constants'),reference_server_1=require('./reference-server');class EnergyCalculator{static['calculateCPUEnergy'](_0x46b34e,_0x13bb30,_0xc187dc){if(!_0x46b34e['length'])return 0x0;const _0x4d5cab=_0x46b34e['reduce']((_0x1bf69c,_0x2ec323,_0x1057d1)=>{const _0x5f38a2=_0x1057d1===_0x46b34e['length']-0x1?Math['max'](0x0,_0xc187dc-(_0x2ec323['timestamp']-_0x46b34e[0x0]['timestamp'])):Math['max'](0x0,_0x46b34e[_0x1057d1+0x1]['timestamp']-_0x2ec323['timestamp']),_0x3354c6=_0x13bb30['info']?.['specs']['cpu']['cores'],_0x39a394=_0x2ec323['value']/_0x3354c6,{a:_0x14b8a7,b:_0x56b1e1,c:_0x139ed7,d:_0x48377e}=_0x13bb30['boaviztaCoefficients'],_0x44f169=Math['min'](Math['max'](_0x39a394,0x0),0x64),_0x351d11=_0x14b8a7*Math['log'](_0x56b1e1*(_0x44f169+_0x139ed7))+_0x48377e,_0x317c76=_0x351d11*_0x5f38a2/(0x3e8*0xe10);return _0x1bf69c+_0x317c76;},0x0);return _0x4d5cab;}static['calculateScreenEnergy'](_0x2862bd,_0xc7e41e,_0x238130){if(!_0x2862bd['length'])return 0x0;const _0x2a99f0=_0x2862bd['reduce']((_0x136b1c,_0x18b7ed,_0x331591)=>{const _0x25b4f9=_0x331591===_0x2862bd['length']-0x1?constants_1['MEASUREMENT_DURATION_MS']-(_0x18b7ed['timestamp']-_0x2862bd[0x0]['timestamp']):_0x2862bd[_0x331591+0x1]['timestamp']-_0x18b7ed['timestamp'],_0x371f5f=_0xc7e41e['oledProportion']*(_0xc7e41e['oledMinPower']+_0x18b7ed['value']*(_0xc7e41e['oledMaxPower']-_0xc7e41e['oledMinPower'])),_0x26d416=(0x1-_0xc7e41e['oledProportion'])*_0xc7e41e['lcdPower'],_0x5488db=_0x371f5f+_0x26d416,_0x51f122=_0x5488db*_0x25b4f9/(0x3e8*0xe10);return _0x136b1c+_0x51f122;},0x0);if(_0x238130){const _0x5469af=_0x238130*0x3e8;return _0x2a99f0*(_0x5469af/constants_1['MEASUREMENT_DURATION_MS']);}return _0x2a99f0;}static['calculateNetworkEnergy'](_0x501755,_0x5c19b0,_0x2a581d){const _0x6fc9cd=_0x2a581d['return_visit_count']/_0x2a581d['page_visit_count'],_0x2a84ee=_0x6fc9cd*_0x501755['cachedBytes']+(0x1-_0x6fc9cd)*_0x501755['uncachedBytes'],_0x425f4e=_0x2a84ee/_0x5c19b0['networkTransferRate'],_0x4e8f9b=_0x5c19b0['networkMaxPower']*_0x425f4e/(0x3e8*0xe10);return _0x4e8f9b;}static['calculateIdleEnergy'](_0x44b12b,_0x1f50d4){return _0x44b12b['idlePower']*_0x1f50d4/(0x3e8*0xe10);}static['calculateNetworkInfrastructureEnergy'](_0x23872b,_0x3d16af){const _0x3ee7d0=_0x3d16af['return_visit_count']/_0x3d16af['page_visit_count'],_0xc7a46c=_0x3ee7d0*_0x23872b['cachedBytes']+(0x1-_0x3ee7d0)*_0x23872b['uncachedBytes'];return _0xc7a46c*constants_1['NETWORK_INFRASTRUCTURE_ENERGY_COEFFICIENT']*_0x3d16af['page_visit_count'];}}class Cardamon{constructor(_0x5dbca6){this['co2BreakdownByRegion']=[],this['config']=this['validateConfig'](_0x5dbca6),this['backendMeasurementDurationMs']=new Date(this['config']['userAnalytics']['end_date'])['getTime']()-new Date(this['config']['userAnalytics']['start_date'])['getTime']();}['validateConfig'](_0x1bd330){const _0x19cfd6=_0x263207=>({..._0x263207,'value':Math['max'](constants_1['VALIDATION']['MIN_CPU_UTILIZATION'],Math['min'](constants_1['VALIDATION']['MAX_CPU_UTILIZATION'],_0x263207['value']))}),_0x5abccf=_0x290638=>({..._0x290638,'value':Math['max'](constants_1['VALIDATION']['MIN_PIXEL_COLOR'],Math['min'](constants_1['VALIDATION']['MAX_PIXEL_COLOR'],_0x290638['value']))});return{'frontend':{..._0x1bd330['frontend'],'cpu':_0x1bd330['frontend']['cpu']['map'](_0x19cfd6),'screen':_0x1bd330['frontend']['screen']['map'](_0x5abccf)},'backend':{..._0x1bd330['backend']},'userAnalytics':_0x1bd330['userAnalytics'],'scalingMethod':_0x1bd330['scalingMethod']};}['calculateMetrics'](){const _0xd6ddc5={'cpu':this['calculateFrontendCPUEnergy'](),'screen':this['calculateFrontendScreenEnergy'](),'network':this['calculateFrontendNetworkEnergy'](),'idle':this['calculateFrontendIdleEnergy']()},_0xc03140={'cpu':this['calculateBackendCPUEnergy'](),'network':this['calculateBackendNetworkEnergy'](),'idle':this['calculateBackendIdleEnergy']()},_0x1fb1da={'frontend':{..._0xd6ddc5,'operational':Object['values'](_0xd6ddc5)['reduce']((_0x1747fc,_0x83e0e2)=>_0x1747fc+_0x83e0e2,0x0),get 'total'(){return this['operational'];}},'backend':{..._0xc03140,'operational':Object['values'](_0xc03140)['reduce']((_0x32ca3d,_0x4dfd1c)=>_0x32ca3d+_0x4dfd1c,0x0),get 'total'(){return this['operational'];}},'infrastructure':{'network':EnergyCalculator['calculateNetworkInfrastructureEnergy'](this['config']['frontend']['network'],this['config']['userAnalytics'])},get 'operational'(){return this['frontend']['operational']+this['backend']['operational']+this['infrastructure']['network'];},get 'total'(){return this['operational'];}},_0x43024a={'cpu':this['calculateEmissions'](_0x1fb1da['frontend']['cpu'],'frontend_cpu_operational')['emissions'],'screen':this['calculateEmissions'](_0x1fb1da['frontend']['screen'],'frontend_screen_operational')['emissions'],'network':this['calculateEmissions'](_0x1fb1da['frontend']['network'],'frontend_data_operational')['emissions'],'idle':this['calculateEmissions'](_0x1fb1da['frontend']['idle'],'frontend_idle_operational')['emissions']},_0x384f0b={'cpu':this['calculateEmissions'](_0x1fb1da['backend']['cpu'],'backend_cpu_operational',this['config']['backend']['serverConfig'])['emissions'],'network':this['calculateEmissions'](_0x1fb1da['backend']['network'],'backend_data_operational',this['config']['backend']['serverConfig'])['emissions'],'idle':this['calculateEmissions'](_0x1fb1da['backend']['idle'],'backend_idle_operational',this['config']['backend']['serverConfig'])['emissions']},_0x2ee48d=this['calculateFrontendEmbodiedEmissions'](),_0x52ce08=this['calculateBackendEmbodiedEmissions'](),_0x271c32={'frontend':{..._0x43024a,'operational':Object['values'](_0x43024a)['reduce']((_0xea96a4,_0x3e9e25)=>_0xea96a4+_0x3e9e25,0x0),'embodied':_0x2ee48d,get 'total'(){return this['operational']+this['embodied'];}},'backend':{..._0x384f0b,'operational':Object['values'](_0x384f0b)['reduce']((_0x474cb7,_0x19f43c)=>_0x474cb7+_0x19f43c,0x0),'embodied':_0x52ce08,get 'total'(){return this['operational']+this['embodied'];}},'infrastructure':{'network':this['calculateEmissions'](_0x1fb1da['infrastructure']['network'],'network')['emissions']},get 'operational'(){return this['frontend']['operational']+this['backend']['operational']+this['infrastructure']['network'];},get 'embodied'(){return this['frontend']['embodied']+this['backend']['embodied'];},get 'total'(){return this['operational']+this['embodied'];}};return{'energy':_0x1fb1da,'emissions':_0x271c32};}['calculateFrontendCPUEnergy'](){const _0x4b0e8d=EnergyCalculator['calculateCPUEnergy'](this['config']['frontend']['cpu'],this['config']['frontend']['device'],constants_1['MEASUREMENT_DURATION_MS']);if(this['config']['scalingMethod']==='frontend'){const _0x4e4113=this['config']['backend']['serverConfig'][0x0]['totalServerVisit']/this['config']['backend']['serverConfig'][0x0]['totalReportVisit'];return _0x4b0e8d*_0x4e4113*this['config']['userAnalytics']['page_visit_count'];}return _0x4b0e8d*this['config']['userAnalytics']['page_visit_count'];}['calculateFrontendScreenEnergy'](){const _0x44bc8a=EnergyCalculator['calculateScreenEnergy'](this['config']['frontend']['screen'],this['config']['frontend']['device'],this['config']?.['userAnalytics']?.['average_session_duration']);if(this['config']['scalingMethod']==='frontend'){const _0xd70a64=this['config']['backend']['serverConfig'][0x0]['totalServerVisit']/this['config']['backend']['serverConfig'][0x0]['totalReportVisit'];return _0x44bc8a*_0xd70a64*this['config']['userAnalytics']['page_visit_count'];}return _0x44bc8a*this['config']['userAnalytics']['page_visit_count'];}['calculateFrontendNetworkEnergy'](){const _0x45f0c1=EnergyCalculator['calculateNetworkEnergy'](this['config']['frontend']['network'],this['config']['frontend']['device'],this['config']['userAnalytics']);if(this['config']['scalingMethod']==='frontend'){const _0x1cc1ed=this['config']['backend']['serverConfig'][0x0]['totalServerVisit']/this['config']['backend']['serverConfig'][0x0]['totalReportVisit'];return _0x45f0c1*_0x1cc1ed*this['config']['userAnalytics']['page_visit_count'];}return _0x45f0c1*this['config']['userAnalytics']['page_visit_count'];}['calculateFrontendIdleEnergy'](){const _0x264259=EnergyCalculator['calculateIdleEnergy'](this['config']['frontend']['device'],constants_1['MEASUREMENT_DURATION_MS']);if(this['config']['scalingMethod']==='frontend'){const _0x2295ea=this['config']['backend']['serverConfig'][0x0]['totalServerVisit']/this['config']['backend']['serverConfig'][0x0]['totalReportVisit'];return _0x264259*_0x2295ea*this['config']['userAnalytics']['page_visit_count'];}return _0x264259*this['config']['userAnalytics']['page_visit_count'];}['calculateBackendCPUEnergy'](){if(!this['config']['backend']['serverConfig']||this['config']['backend']['serverConfig']['length']===0x0)return 0x0;let _0xe8b115=0x0;return this['config']['backend']['serverConfig']['forEach'](_0x352c9a=>{let _0xec4882;if(_0x352c9a['specs'])_0xec4882=_0x352c9a['specs'];else{_0xec4882=reference_server_1['REFERENCE_SERVERS'][_0x352c9a['serverId']];if(!_0xec4882)throw new Error('Invalid\x20server\x20configuration:\x20'+_0x352c9a['serverId']);}const _0x52762f=_0xec4882['info']['specs']['cpu']['vcpu'],_0x10553c=_0x352c9a['vcpu'],_0x510991=_0xec4882['info']['guessCpuUtilization'],_0x5a5e0e=_0x352c9a['cpuUtilization'],_0xcae056=(_0x52762f-_0x10553c)/_0x52762f*_0x510991,_0x296b16=_0x10553c/_0x52762f*_0x5a5e0e,_0x5e911e=_0xcae056+_0x296b16,_0x1b5fe7=[{'value':_0x5e911e,'timestamp':Date['now']()},{'value':_0x5e911e,'timestamp':Date['now']()+this['backendMeasurementDurationMs']}],_0x1b9104=[{'value':0x0,'timestamp':Date['now']()},{'value':0x0,'timestamp':Date['now']()+this['backendMeasurementDurationMs']}],_0x4e6b0b=EnergyCalculator['calculateCPUEnergy'](_0x1b5fe7,_0xec4882,this['backendMeasurementDurationMs']),_0x45e115=EnergyCalculator['calculateCPUEnergy'](_0x1b9104,_0xec4882,this['backendMeasurementDurationMs']),_0x40d65f=_0xec4882['info']['specs']['cpu']['count'],_0x38b3d6=_0x296b16/_0x5e911e*_0x40d65f*(_0x4e6b0b-_0x45e115),_0x218ccf=this['config']['scalingMethod']==='backend'?this['config']['userAnalytics']['page_visit_count']/_0x352c9a['totalServerVisit']:this['config']['userAnalytics']['page_visit_count']/_0x352c9a['totalReportVisit'],_0x1b23a8=_0x38b3d6*_0x352c9a['quantity']*(_0xec4882['info']?.['pue']||0x1)*_0x218ccf;_0xe8b115+=_0x1b23a8;}),_0xe8b115;}['calculateBackendNetworkEnergy'](){if(!this['config']['backend']['serverConfig']||this['config']['backend']['serverConfig']['length']===0x0)return 0x0;let _0x2d4e14=0x0;return this['config']['backend']['serverConfig']['forEach'](_0x445b94=>{let _0x4bfdf1;if(_0x445b94['specs'])_0x4bfdf1=_0x445b94['specs'];else{_0x4bfdf1=reference_server_1['REFERENCE_SERVERS'][_0x445b94['serverId']];if(!_0x4bfdf1)throw new Error('Invalid\x20server\x20configuration:\x20'+_0x445b94['serverId']);}const _0x2a12aa=EnergyCalculator['calculateNetworkEnergy'](this['config']['backend']['network'],_0x4bfdf1,this['config']['userAnalytics']),_0x3e944c=this['config']['scalingMethod']==='backend'?this['config']['userAnalytics']['page_visit_count']/_0x445b94['totalServerVisit']:this['config']['userAnalytics']['page_visit_count']/_0x445b94['totalReportVisit'];_0x2d4e14+=_0x2a12aa*_0x445b94['quantity']*(_0x4bfdf1['info']?.['pue']||0x1)*_0x3e944c;}),_0x2d4e14;}['calculateBackendIdleEnergy'](){if(!this['config']['backend']['serverConfig']||this['config']['backend']['serverConfig']['length']===0x0)return 0x0;let _0x55ad99=0x0;return this['config']['backend']['serverConfig']['forEach'](_0x3aeecf=>{let _0x538064;if(_0x3aeecf['specs'])_0x538064=_0x3aeecf['specs'];else{_0x538064=reference_server_1['REFERENCE_SERVERS'][_0x3aeecf['serverId']];if(!_0x538064)throw new Error('Invalid\x20server\x20configuration:\x20'+_0x3aeecf['serverId']);}const _0x27bed0=EnergyCalculator['calculateIdleEnergy'](_0x538064,this['backendMeasurementDurationMs']),_0x105049=_0x3aeecf['vcpu']/_0x538064['info']['specs']['cpu']['vcpu'],_0x1a8dbe=this['config']['scalingMethod']==='backend'?this['config']['userAnalytics']['page_visit_count']/_0x3aeecf['totalServerVisit']:this['config']['userAnalytics']['page_visit_count']/_0x3aeecf['totalReportVisit'],_0x126b37=_0x27bed0*_0x3aeecf['quantity']*(_0x538064['info']?.['pue']||0x1)*_0x105049*_0x1a8dbe;_0x55ad99+=_0x126b37;}),_0x55ad99;}['calculateBackendEmbodiedEmissions'](){if(!this['config']['backend']['serverConfig']||this['config']['backend']['serverConfig']['length']===0x0)return 0x0;let _0x5da1c1=0x0;const _0x48d4d8=[];return this['config']['backend']['serverConfig']['forEach'](_0x324797=>{let _0x5ba7d6;if(_0x324797['specs'])_0x5ba7d6=_0x324797['specs'];else{_0x5ba7d6=reference_server_1['REFERENCE_SERVERS'][_0x324797['serverId']];if(!_0x5ba7d6)throw new Error('Invalid\x20server\x20configuration:\x20'+_0x324797['serverId']);}const {manufacturing:_0x3485ae,lifetime:_0x598472}=_0x5ba7d6['embodiedEmissions'],_0x17b0b0=new Date(this['config']['userAnalytics']['end_date'])['getTime']()-new Date(this['config']['userAnalytics']['start_date'])['getTime'](),_0x3e9bc1=_0x3485ae*_0x17b0b0/_0x598472,_0x92f651=this['config']['scalingMethod']==='backend'?this['config']['userAnalytics']['page_visit_count']/_0x324797['totalServerVisit']:this['config']['userAnalytics']['page_visit_count']/_0x324797['totalReportVisit'],_0x4fba84=_0x324797['vcpu']/_0x5ba7d6['info']['specs']['cpu']['vcpu'],_0xba0a5=_0x3e9bc1*_0x324797['quantity']*_0x4fba84*_0x92f651;_0x48d4d8['push']({'region_code':_0x324797['regionalDistribution']['regionCode'],'carbon_intensity':_0x324797['regionalDistribution']['carbonIntensity'],'proportion':0x1,'co2':_0xba0a5,'type':'backend_embodied'}),_0x5da1c1+=_0xba0a5;}),this['co2BreakdownByRegion']['push'](..._0x48d4d8),_0x5da1c1;}['calculateFrontendEmbodiedEmissions'](){let _0x71cbe8=0x0;const {manufacturing:_0x50e787,lifetime:_0x51f080}=this['config']['frontend']['device']['embodiedEmissions'],_0x349c13=_0x50e787*constants_1['MEASUREMENT_DURATION_MS']/_0x51f080;if(this['config']['scalingMethod']==='frontend'){const _0x42d71a=this['config']['backend']['serverConfig'][0x0]['totalServerVisit']/this['config']['backend']['serverConfig'][0x0]['totalReportVisit'];_0x71cbe8=_0x349c13*_0x42d71a*this['config']['userAnalytics']['page_visit_count'];}else _0x71cbe8=_0x349c13*this['config']['userAnalytics']['page_visit_count'];const _0x1bf5b7=this['config']['userAnalytics']['regional_distribution']['map'](_0x1aac16=>({..._0x1aac16,'co2':_0x71cbe8*_0x1aac16['proportion'],'type':'frontend_embodied'}));return this['co2BreakdownByRegion']['push'](..._0x1bf5b7),_0x71cbe8;}['getCO2BreakdownByRegion'](){return this['co2BreakdownByRegion'];}['calculateEmissions'](_0x3d2bc5,_0x186455,_0x236348){const _0x4e764b=_0x3d2bc5/0x3e8;let _0x526824=[],_0x4eeaab=0x0;return!_0x236348?(_0x526824=this['config']['userAnalytics']['regional_distribution']['map'](_0x636ead=>({..._0x636ead,'type':_0x186455,'co2':_0x4e764b*_0x636ead['carbon_intensity']*_0x636ead['proportion']})),_0x4eeaab=_0x526824['reduce']((_0x39c938,_0x19004c)=>_0x39c938+_0x19004c['co2'],0x0),this['co2BreakdownByRegion']['push'](..._0x526824)):(_0x236348['forEach'](_0x5e4093=>{const _0x537ab5=_0x5e4093['regionalDistribution'];_0x537ab5&&_0x526824['push']({'region_code':_0x537ab5['regionCode'],'carbon_intensity':_0x537ab5['carbonIntensity'],'proportion':0x1,'type':_0x186455,'co2':_0x4e764b*_0x537ab5['carbonIntensity']});}),_0x4eeaab=_0x526824['reduce']((_0x3bf07f,_0x1310eb)=>_0x3bf07f+_0x1310eb['co2'],0x0),this['co2BreakdownByRegion']['push'](..._0x526824)),{'emissions':_0x4eeaab,'co2ByRegion':_0x526824};}}exports['Cardamon']=Cardamon;