PerfHandler.ts 1.47 KB
import {PrefReport, PrefReportResource} from '../libs/PrefReport';
import Handler from './Handler';
import createLog from '../utils/Log';

const log = createLog('pref');

class PrefHandler extends Handler<PrefReport> {
  start() {
    log('start');
    window.addEventListener && window.addEventListener('load', this.onLoad.bind(this), false);
  }
  onLoad() {
    log('onload');
    const rd = new PrefReport();

    if (window.performance && window.performance.timing) {
      this.collectTimeing(rd);
      this.collectResources(rd);
    } else {
      rd.low = true;
    }

    this.send(rd);
  }
  collectTimeing(rd: PrefReport) {
    const timing = window.performance.timing;

    rd.dns = timing.domainLookupEnd - timing.domainLookupStart;
    rd.tcp = timing.connectEnd - timing.connectStart;
    rd.redirect = timing.redirectEnd - timing.redirectStart;
    rd.req = timing.responseStart - timing.requestStart;
    rd.res = timing.responseEnd - timing.responseStart;
    rd.dom = timing.domComplete - timing.domInteractive;
    rd.white = timing.responseStart - timing.navigationStart;
    rd.ready = timing.domContentLoadedEventEnd - timing.navigationStart;
  }
  collectResources(rd: PrefReport) {
    if (window.performance.getEntries) {
      const entries = window.performance.getEntries();

      rd.resources = entries
        .filter(({name}) => /https?:\/\/cdn\.yoho\.cn/.test(name))
        .map(e => new PrefReportResource(e.name, e.duration));
    }
  }
}

export default PrefHandler;