UNPKG

cardamon

Version:

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

1 lines 13.6 kB
'use strict';var __importDefault=this&&this['__importDefault']||function(_0x30c323){return _0x30c323&&_0x30c323['__esModule']?_0x30c323:{'default':_0x30c323};};Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports['CardamonMeasurer']=void 0x0;const puppeteer_1=__importDefault(require('puppeteer')),os=require('os-utils'),MEASUREMENT_DURATION_MS=0x2710,NAVIGATION_TIMEOUT=0x7530;class CardamonMeasurer{constructor(){this['browser']=null,this['CPU_COUNT']=os['cpuCount']();}async['initialize'](){this['browser']=await puppeteer_1['default']['launch']({'headless':'new','args':['--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage','--disable-gpu']});}async['measurePage'](_0xa66d8f){if(!this['browser'])throw new Error('Measurer\x20not\x20initialized');const _0x3549a9=await this['browser']['newPage']();try{await _0x3549a9['setUserAgent']('Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64;\x20rv:138.0)\x20Gecko/20100101\x20Firefox/138.0'),await _0x3549a9['setExtraHTTPHeaders']({'Accept-Language':'en-US,en;q=0.9'}),await _0x3549a9['setViewport']({'width':0x780,'height':0x438,'deviceScaleFactor':0x1});const _0x47bb01=await this['performPageLoad'](_0x3549a9,_0xa66d8f['url'],![],_0xa66d8f['quick']),_0x9c5968=await this['performPageLoad'](_0x3549a9,_0xa66d8f['url'],!![],_0xa66d8f['quick']),_0x3045c9=this['calculateTotalSize'](_0x9c5968['resourceBreakdown']),_0x4b194e=this['calculateTotalSize'](_0x47bb01['resourceBreakdown']);return{'frontend':{'cpu':_0x47bb01['cpuUsages'],'colorProfile':_0x47bb01['colorProfiles']['map'](_0x10df0c=>({'value':(0x64-_0x10df0c['powerMetrics']['powerEfficiencyScore'])/0x64,'timestamp':_0x10df0c['timestamp']})),'duration':_0xa66d8f['duration']},'network':{'requests':[],'totalBytes':_0x4b194e,'cachedBytes':_0x3045c9,'loadEventSize':_0x47bb01['loadEventSize']||0x0,'resourceBreakdown':_0x47bb01['resourceBreakdown'],'duration':_0xa66d8f['duration']}};}finally{await _0x3549a9['close']();}}async['performPageLoad'](_0x57f240,_0x5f19e7,_0x1b857b,_0xca4406){const _0x572acd={'requests':{},'resourceBreakdown':{},'loadEventSize':null,'colorProfiles':[],'totalColorEfficiencyScores':0x0,'totalColorProfiles':0x0,'totalCpuUsage':0x0,'cpuSamples':0x0,'cpuUsages':[],'baseTimestamp':Date['now']()},_0xff788a=await _0x57f240['target']()['createCDPSession']();await _0xff788a['send']('Network.enable'),await _0xff788a['send']('Page.enable'),await this['setupNetworkTracking'](_0xff788a,_0x572acd,_0x5f19e7),await _0x57f240['setCacheEnabled'](_0x1b857b);let _0x34e91f;if(!_0x1b857b){await _0xff788a['send']('Network.clearBrowserCache'),await _0xff788a['send']('Network.setCacheDisabled',{'cacheDisabled':!![]});const _0x11d9b6=this['browser']['process']();_0x11d9b6&&_0x11d9b6['pid']&&(_0x34e91f=await this['setupCpuMeasurement'](_0x11d9b6['pid'],_0x572acd),_0x34e91f['start']());}await _0x57f240['goto'](_0x5f19e7,{'waitUntil':'load','timeout':NAVIGATION_TIMEOUT}),_0x572acd['loadEventSize']=this['calculateTotalSize'](_0x572acd['resourceBreakdown']);!_0x1b857b&&await this['captureColorProfile'](_0x57f240,_0x572acd);const _0x311f71=await this['handlePageScrolling'](_0x57f240,_0x572acd,_0x1b857b,_0xca4406);return!_0x1b857b&&_0x34e91f&&_0x34e91f['stop'](),this['_finalizePendingRequests'](_0x572acd),await _0xff788a['detach'](),{..._0x572acd,'scrollData':_0x311f71};}async['setupNetworkTracking'](_0x3dc337,_0x51ba34,_0x201770){_0x3dc337['on']('Network.responseReceived',_0x2cfafa=>{_0x2cfafa['response']['url']['replace'](/^https?:\/\/(www\.)?/,'')===_0x201770['replace'](/^https?:\/\/(www\.)?/,'')&&_0x2cfafa['type']==='Document'&&(_0x51ba34['statusCode']=_0x2cfafa['response']['status']['toString']());const _0x1c9268=_0x2cfafa['requestId'],_0x2d1c09=_0x2cfafa['response'],_0x285e11=_0x2cfafa['type']||'Other';if(_0x51ba34['requests'][_0x1c9268])return;!_0x51ba34['cdpBaseTimestamp']&&(_0x51ba34['cdpBaseTimestamp']=_0x2cfafa['timestamp']);const _0x2ec256=(_0x2cfafa['timestamp']-(_0x51ba34['cdpBaseTimestamp']||0x0))*0x3e8,_0x548df7=(_0x51ba34['baseTimestamp']||Date['now']())+_0x2ec256;_0x51ba34['requests'][_0x1c9268]={'url':_0x2d1c09['url'],'status':_0x2d1c09['status'],'type':_0x285e11,'reqId':_0x1c9268,'size':0x0,'hasLoadingFinished':![],'startTimestamp':_0x548df7},!_0x51ba34['resourceBreakdown'][_0x285e11]&&(_0x51ba34['resourceBreakdown'][_0x285e11]={'size':0x0,'count':0x0,'details':[],'urlSet':new Set()}),_0x51ba34['resourceBreakdown'][_0x285e11]['count']++;}),_0x3dc337['on']('Network.dataReceived',_0x28456c=>{const {requestId:_0x3d2f7e,dataLength:_0x474a08}=_0x28456c;_0x51ba34['requests'][_0x3d2f7e]&&!_0x51ba34['requests'][_0x3d2f7e]['hasLoadingFinished']&&(_0x51ba34['requests'][_0x3d2f7e]['size']+=_0x474a08);}),_0x3dc337['on']('Network.loadingFinished',_0x1d73ac=>{const {requestId:_0x5a61a3,encodedDataLength:_0x722c10,timestamp:_0x1e40c0}=_0x1d73ac;if(!_0x51ba34['requests'][_0x5a61a3])return;_0x51ba34['requests'][_0x5a61a3]['hasLoadingFinished']=!![],_0x51ba34['requests'][_0x5a61a3]['size']=_0x722c10;const _0x56ecd6=_0x51ba34['requests'][_0x5a61a3]['type']||'Other';if(!_0x51ba34['resourceBreakdown'][_0x56ecd6])return;_0x51ba34['resourceBreakdown'][_0x56ecd6]['size']+=_0x51ba34['requests'][_0x5a61a3]['size'];const _0x58f435=_0x51ba34['requests'][_0x5a61a3]['url'],_0x447042=_0x51ba34['requests'][_0x5a61a3]['size'],_0x4d3a15=_0x51ba34['requests'][_0x5a61a3]['startTimestamp'];if(!_0x51ba34['resourceBreakdown'][_0x56ecd6]['urlSet']['has'](_0x58f435)){const _0x5e3c29=(_0x1e40c0-(_0x51ba34['cdpBaseTimestamp']||0x0))*0x3e8,_0x317ac8=(_0x51ba34['baseTimestamp']||Date['now']())+_0x5e3c29;_0x51ba34['resourceBreakdown'][_0x56ecd6]['details']['push']({'size':_0x447042,'link':_0x58f435,'startTimestamp':_0x4d3a15,'endTimestamp':_0x317ac8}),_0x51ba34['resourceBreakdown'][_0x56ecd6]['urlSet']['add'](_0x58f435);}delete _0x51ba34['requests'][_0x5a61a3];});}async['setupCpuMeasurement'](_0x164efc,_0x1162f5){let _0xe1c91c;const _0x5c06d6=()=>{_0xe1c91c=setInterval(async()=>{try{const _0x3dd6ea=Date['now'](),_0x4e9285=await this['getChromeCPU'](_0x164efc);_0x1162f5['totalCpuUsage']+=_0x4e9285,_0x1162f5['cpuSamples']++,_0x1162f5['cpuUsages']['push']({'value':_0x4e9285,'timestamp':_0x3dd6ea});}catch(_0x299aa3){console['error']('Error\x20in\x20CPU\x20measurement:',_0x299aa3);}},0x3e8);},_0x335f0d=()=>clearInterval(_0xe1c91c);return{'start':_0x5c06d6,'stop':_0x335f0d};}async['getChromeCPU'](_0x2a7bfc){try{const _0x5ae56d=require('pidusage'),{execSync:_0x2feddf}=require('child_process'),_0x119e07=process['platform']==='darwin'?'ps\x20-ax\x20-o\x20pid,ppid':'ps\x20-ax\x20-o\x20pid,ppid\x20--no-headers',_0x541771=_0x2feddf(_0x119e07,{'encoding':'utf-8'}),processes=_0x541771['trim']()['split']('\x0a')['map'](_0x4801d1=>{const [_0x5e3f3b,_0x1612ab]=_0x4801d1['trim']()['split'](/\s+/);return{'pid':parseInt(_0x5e3f3b),'ppid':parseInt(_0x1612ab)};}),_0x40168a=[_0x2a7bfc];let _0x1da35e=0x1;while(_0x1da35e>0x0){const _0x530a68=processes['filter'](_0x33129c=>_0x40168a['includes'](_0x33129c['ppid'])&&!_0x40168a['includes'](_0x33129c['pid']))['map'](_0x59b782=>_0x59b782['pid']);_0x1da35e=_0x530a68['length'],_0x40168a['push'](..._0x530a68);}const _0x5ebdb4=await Promise['all'](_0x40168a['map'](_0x5ae56d)),_0x5c9ec0=_0x5ebdb4['reduce']((_0x143357,_0x25f08b)=>_0x143357+_0x25f08b['cpu'],0x0);return _0x5c9ec0;}catch(_0x3b285f){return console['error']('Error\x20measuring\x20CPU\x20usage:',_0x3b285f),0x0;}}async['captureColorProfile'](_0x2ce633,_0x324954){try{if(_0x324954['colorProfiles']['length']>=0xa)return;const _0x4ec16a=await _0x2ce633['screenshot']({'type':'jpeg','quality':0x2,'encoding':'base64'}),_0xe6f3dd='data:image/jpeg;base64,'+_0x4ec16a,_0x4ba3af=await this['analyzeColorProfile'](_0xe6f3dd,{'width':0x780,'height':0x438});_0x324954['totalColorProfiles']++,_0x324954['totalColorEfficiencyScores']+=_0x4ba3af?.['powerMetrics']['powerEfficiencyScore']||0x0,_0x324954['colorProfiles']['push']({..._0x4ba3af,'url':''});}catch(_0x59b531){console['error']('Error\x20in\x20color\x20profile\x20analysis:',_0x59b531);}}async['handlePageScrolling'](_0x5177b9,_0x4a8ff6,_0x479008,_0x3627a7){const _0x533794=Date['now']();let _0x41d7b5=![];if(_0x3627a7)while(!_0x41d7b5&&Date['now']()-_0x533794<MEASUREMENT_DURATION_MS){_0x41d7b5=await _0x5177b9['evaluate'](()=>{const _0x315f65=window['scrollY']+window['innerHeight'],_0x3cffa7=document['body']['scrollHeight'];return window['scrollBy'](0x0,0x3e8),_0x315f65>=_0x3cffa7;}),!_0x41d7b5&&(!_0x479008&&await this['captureColorProfile'](_0x5177b9,_0x4a8ff6),await new Promise(_0x5a92d=>setTimeout(_0x5a92d,0x64)));}else{if(_0x479008)while(!_0x41d7b5&&Date['now']()-_0x533794<MEASUREMENT_DURATION_MS){_0x41d7b5=await _0x5177b9['evaluate'](()=>{const _0x3dd0ca=window['scrollY']+window['innerHeight'],_0x175861=document['body']['scrollHeight'];return window['scrollBy'](0x0,0x3e8),_0x3dd0ca>=_0x175861;});if(_0x41d7b5){await new Promise(_0x9a0d46=>setTimeout(_0x9a0d46,0x3e8));break;}await new Promise(_0x2e93c=>setTimeout(_0x2e93c,0x3e8));}else while(Date['now']()-_0x533794<MEASUREMENT_DURATION_MS){!_0x41d7b5&&(_0x41d7b5=await _0x5177b9['evaluate'](()=>{const _0x3d881c=window['scrollY']+window['innerHeight'],_0x4355a5=document['body']['scrollHeight'];return window['scrollBy'](0x0,0x3e8),_0x3d881c>=_0x4355a5;}),!_0x41d7b5&&await this['captureColorProfile'](_0x5177b9,_0x4a8ff6)),await new Promise(_0x15b0c1=>setTimeout(_0x15b0c1,0x3e8));}}return!_0x41d7b5&&(_0x41d7b5=await _0x5177b9['evaluate'](()=>{const _0x1a8af5=window['scrollY']+window['innerHeight'],_0x465414=document['body']['scrollHeight'];return _0x1a8af5>=_0x465414;})),{'isBottomReached':_0x41d7b5,'totalDuration':Date['now']()-_0x533794};}async['analyzeColorProfile'](_0x3f2d13,_0x4703f4){try{const _0xe70ea0=0.7,_0x4ed21e=0x1,_0x46d422=1.5,{createCanvas:_0x467fef,loadImage:_0x10c39e}=require('canvas'),_0x8489ab=_0x467fef(_0x4703f4['width'],_0x4703f4['height']),_0xa22163=_0x8489ab['getContext']('2d'),_0x5a0a68=await _0x10c39e(_0x3f2d13);_0xa22163['drawImage'](_0x5a0a68,0x0,0x0,_0x4703f4['width'],_0x4703f4['height']);const _0x204a3d=_0xa22163['getImageData'](0x0,0x0,_0x4703f4['width'],_0x4703f4['height']),_0x1a3ef9=_0x204a3d['data'],colorMap=new Map();let _0x16250f=0x0,_0x1c6c89=0x0,_0x4f5505=0x0,_0x316628=0x0,_0x4901a3=0x0;const _0x4ae85e=(_0xe70ea0+_0x4ed21e+_0x46d422)*0xff;for(let _0x37e636=0x0;_0x37e636<_0x1a3ef9['length'];_0x37e636+=0x4){const _0x3cdde7=_0x1a3ef9[_0x37e636],_0x2662f6=_0x1a3ef9[_0x37e636+0x1],_0x1cec8d=_0x1a3ef9[_0x37e636+0x2],_0xa2df6b=_0x1a3ef9[_0x37e636+0x3];if(_0xa2df6b>0x0){const _0x2e9a94=_0xa2df6b/0xff,_0x2cd845=_0x3cdde7*_0x2e9a94,_0x4a5a0b=_0x2662f6*_0x2e9a94,_0x47f677=_0x1cec8d*_0x2e9a94,_0x5f2d64=Math['min'](Math['round'](_0x2cd845/0x10)*0x10,0xff),_0x3c3c4a=Math['min'](Math['round'](_0x4a5a0b/0x10)*0x10,0xff),_0xa1cbfa=Math['min'](Math['round'](_0x47f677/0x10)*0x10,0xff),_0x2f4980=(_0xe70ea0*_0x2cd845+_0x4ed21e*_0x4a5a0b+_0x46d422*_0x47f677)/_0x4ae85e;_0x16250f+=_0x2f4980;const _0x48ddfe='#'+_0x5f2d64['toString'](0x10)['padStart'](0x2,'0')+_0x3c3c4a['toString'](0x10)['padStart'](0x2,'0')+_0xa1cbfa['toString'](0x10)['padStart'](0x2,'0');colorMap['set'](_0x48ddfe,(colorMap['get'](_0x48ddfe)||0x0)+0x1),_0x4f5505+=_0x2cd845,_0x316628+=_0x4a5a0b,_0x4901a3+=_0x47f677,_0x1c6c89++;}}const _0xde979=Array['from'](colorMap['entries']())['sort']((_0x3cfaee,_0x27ab66)=>_0x27ab66[0x1]-_0x3cfaee[0x1])['slice'](0x0,0x5)['map'](([_0x4ab72a,_0x5c69cf])=>({'color':_0x4ab72a,'percentage':_0x5c69cf/_0x1c6c89*0x64})),_0x1ffe51=_0x1c6c89>0x0?{'r':Math['round'](_0x4f5505/_0x1c6c89),'g':Math['round'](_0x316628/_0x1c6c89),'b':Math['round'](_0x4901a3/_0x1c6c89)}:{'r':0x0,'g':0x0,'b':0x0},_0x2363f8=_0x1c6c89>0x0?_0x16250f/_0x1c6c89:0x0;return{'dominantColors':_0xde979,'averageColor':{..._0x1ffe51,'hex':'#'+_0x1ffe51['r']['toString'](0x10)['padStart'](0x2,'0')+_0x1ffe51['g']['toString'](0x10)['padStart'](0x2,'0')+_0x1ffe51['b']['toString'](0x10)['padStart'](0x2,'0')},'powerMetrics':{'powerEfficiencyScore':Math['round'](_0x2363f8*0x64),'totalPixels':_0x1c6c89},'timestamp':Date['now'](),'url':_0x3f2d13};}catch(_0x228bb1){return console['error']('Error\x20analyzing\x20color\x20profile:',_0x228bb1),{'dominantColors':[],'averageColor':{'r':0x0,'g':0x0,'b':0x0,'hex':'#000000'},'powerMetrics':{'powerEfficiencyScore':0x0,'totalPixels':0x0},'timestamp':Date['now'](),'url':_0x3f2d13};}}['_finalizePendingRequests'](_0x1d071c){const _0x4b54ad=new Map();for(const _0x83b865 of Object['values'](_0x1d071c['resourceBreakdown'])){if(_0x83b865['details'])for(const _0x46e608 of _0x83b865['details']){_0x4b54ad['set'](_0x46e608['link'],_0x46e608);}}for(const _0x43c874 of Object['values'](_0x1d071c['requests'])){if(!_0x43c874||_0x43c874['size']<=0x0)continue;const _0x52962d=_0x43c874['type']||'Other',_0x45c983=_0x1d071c['resourceBreakdown'][_0x52962d];if(_0x45c983){_0x45c983['size']=(_0x45c983['size']||0x0)+_0x43c874['size'];const _0x53cd87=_0x4b54ad['get'](_0x43c874['url']);if(_0x53cd87)_0x53cd87['size']=(_0x53cd87['size']||0x0)+_0x43c874['size'];else{const _0x12d769={'link':_0x43c874['url'],'size':_0x43c874['size'],'startTimestamp':_0x43c874['startTimestamp'],'endTimestamp':null};_0x45c983['details']['push'](_0x12d769),_0x45c983['urlSet']['add'](_0x43c874['url']),_0x4b54ad['set'](_0x43c874['url'],_0x12d769);}}}_0x1d071c['requests']={};}['calculateTotalSize'](_0x258142){return Object['values'](_0x258142)['reduce']((_0x2f3ccb,_0x4a8211)=>_0x2f3ccb+(_0x4a8211['size']||0x0),0x0);}async['cleanup'](){this['browser']&&(await this['browser']['close'](),this['browser']=null);}}exports['CardamonMeasurer']=CardamonMeasurer;