-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
speedline.js
55 lines (48 loc) · 1.77 KB
/
speedline.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import speedline from 'speedline-core';
import {makeComputedArtifact} from './computed-artifact.js';
import {LighthouseError} from '../lib/lh-error.js';
import {ProcessedTrace} from './processed-trace.js';
class Speedline {
/**
* @param {LH.Trace} trace
* @param {LH.Artifacts.ComputedContext} context
* @return {Promise<LH.Artifacts.Speedline>}
*/
static async compute_(trace, context) {
// speedline() may throw without a promise, so we resolve immediately
// to get in a promise chain.
return ProcessedTrace.request(trace, context).then(processedTrace => {
// Use a shallow copy of traceEvents so speedline can sort as it pleases.
// See https://github.com/GoogleChrome/lighthouse/issues/2333
const traceEvents = trace.traceEvents.slice();
// Force use of timeOrigin as reference point for speedline
// See https://github.com/GoogleChrome/lighthouse/issues/2095
const timeOrigin = processedTrace.timestamps.timeOrigin;
return speedline(traceEvents, {
timeOrigin,
fastMode: true,
include: 'speedIndex',
});
}).catch(err => {
if (/No screenshots found in trace/.test(err.message)) {
throw new LighthouseError(LighthouseError.errors.NO_SCREENSHOTS);
}
throw err;
}).then(speedline => {
if (speedline.frames.length === 0) {
throw new LighthouseError(LighthouseError.errors.NO_SPEEDLINE_FRAMES);
}
if (speedline.speedIndex === 0) {
throw new LighthouseError(LighthouseError.errors.SPEEDINDEX_OF_ZERO);
}
return speedline;
});
}
}
const SpeedlineComputed = makeComputedArtifact(Speedline, null);
export {SpeedlineComputed as Speedline};