lighthouse 12.1.0 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/cli-flags.d.ts +2 -2
- package/cli/cli-flags.js +1 -1
- package/cli/sentry-prompt.js +2 -2
- package/cli/test/smokehouse/frontends/lib.d.ts +1 -1
- package/cli/test/smokehouse/lib/concurrent-mapper.d.ts +6 -6
- package/cli/test/smokehouse/lighthouse-runners/bundle.d.ts +1 -1
- package/cli/test/smokehouse/lighthouse-runners/cli.d.ts +1 -2
- package/cli/test/smokehouse/lighthouse-runners/devtools.d.ts +1 -1
- package/cli/test/smokehouse/report-assert.d.ts +0 -1
- package/cli/test/smokehouse/version-check.d.ts +3 -3
- package/core/audits/accessibility/accesskeys.d.ts +3 -3
- package/core/audits/accessibility/aria-allowed-attr.d.ts +3 -3
- package/core/audits/accessibility/aria-allowed-role.d.ts +3 -3
- package/core/audits/accessibility/aria-command-name.d.ts +3 -3
- package/core/audits/accessibility/aria-conditional-attr.d.ts +3 -3
- package/core/audits/accessibility/aria-deprecated-role.d.ts +3 -3
- package/core/audits/accessibility/aria-dialog-name.d.ts +3 -3
- package/core/audits/accessibility/aria-hidden-body.d.ts +3 -3
- package/core/audits/accessibility/aria-hidden-focus.d.ts +3 -3
- package/core/audits/accessibility/aria-input-field-name.d.ts +3 -3
- package/core/audits/accessibility/aria-meter-name.d.ts +3 -3
- package/core/audits/accessibility/aria-progressbar-name.d.ts +3 -3
- package/core/audits/accessibility/aria-prohibited-attr.d.ts +3 -3
- package/core/audits/accessibility/aria-required-attr.d.ts +3 -3
- package/core/audits/accessibility/aria-required-children.d.ts +3 -3
- package/core/audits/accessibility/aria-required-parent.d.ts +3 -3
- package/core/audits/accessibility/aria-roles.d.ts +3 -3
- package/core/audits/accessibility/aria-text.d.ts +3 -3
- package/core/audits/accessibility/aria-toggle-field-name.d.ts +3 -3
- package/core/audits/accessibility/aria-tooltip-name.d.ts +3 -3
- package/core/audits/accessibility/aria-treeitem-name.d.ts +3 -3
- package/core/audits/accessibility/aria-valid-attr-value.d.ts +3 -3
- package/core/audits/accessibility/aria-valid-attr.d.ts +3 -3
- package/core/audits/accessibility/axe-audit.d.ts +1 -1
- package/core/audits/accessibility/button-name.d.ts +3 -3
- package/core/audits/accessibility/bypass.d.ts +3 -3
- package/core/audits/accessibility/color-contrast.d.ts +3 -3
- package/core/audits/accessibility/definition-list.d.ts +3 -3
- package/core/audits/accessibility/dlitem.d.ts +3 -3
- package/core/audits/accessibility/document-title.d.ts +3 -3
- package/core/audits/accessibility/duplicate-id-aria.d.ts +3 -3
- package/core/audits/accessibility/empty-heading.d.ts +3 -3
- package/core/audits/accessibility/form-field-multiple-labels.d.ts +3 -3
- package/core/audits/accessibility/frame-title.d.ts +3 -3
- package/core/audits/accessibility/heading-order.d.ts +3 -3
- package/core/audits/accessibility/html-has-lang.d.ts +3 -3
- package/core/audits/accessibility/html-lang-valid.d.ts +3 -3
- package/core/audits/accessibility/html-xml-lang-mismatch.d.ts +3 -3
- package/core/audits/accessibility/identical-links-same-purpose.d.ts +3 -3
- package/core/audits/accessibility/image-alt.d.ts +3 -3
- package/core/audits/accessibility/image-redundant-alt.d.ts +3 -3
- package/core/audits/accessibility/input-button-name.d.ts +3 -3
- package/core/audits/accessibility/input-image-alt.d.ts +3 -3
- package/core/audits/accessibility/label-content-name-mismatch.d.ts +3 -3
- package/core/audits/accessibility/label.d.ts +3 -3
- package/core/audits/accessibility/landmark-one-main.d.ts +3 -3
- package/core/audits/accessibility/link-in-text-block.d.ts +3 -3
- package/core/audits/accessibility/link-name.d.ts +3 -3
- package/core/audits/accessibility/list.d.ts +3 -3
- package/core/audits/accessibility/listitem.d.ts +3 -3
- package/core/audits/accessibility/meta-refresh.d.ts +3 -3
- package/core/audits/accessibility/meta-viewport.d.ts +3 -3
- package/core/audits/accessibility/object-alt.d.ts +3 -3
- package/core/audits/accessibility/select-name.d.ts +3 -3
- package/core/audits/accessibility/skip-link.d.ts +3 -3
- package/core/audits/accessibility/tabindex.d.ts +3 -3
- package/core/audits/accessibility/table-duplicate-name.d.ts +3 -3
- package/core/audits/accessibility/table-fake-caption.d.ts +3 -3
- package/core/audits/accessibility/target-size.d.ts +3 -3
- package/core/audits/accessibility/td-has-header.d.ts +3 -3
- package/core/audits/accessibility/td-headers-attr.d.ts +3 -3
- package/core/audits/accessibility/th-has-data-cells.d.ts +3 -3
- package/core/audits/accessibility/valid-lang.d.ts +3 -3
- package/core/audits/accessibility/video-caption.d.ts +3 -3
- package/core/audits/audit.d.ts +17 -17
- package/core/audits/autocomplete.d.ts +9 -9
- package/core/audits/bf-cache.d.ts +10 -10
- package/core/audits/bootup-time.d.ts +7 -7
- package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +6 -8
- package/core/audits/byte-efficiency/byte-efficiency-audit.js +3 -6
- package/core/audits/byte-efficiency/duplicated-javascript.d.ts +4 -4
- package/core/audits/byte-efficiency/efficient-animated-content.d.ts +3 -4
- package/core/audits/byte-efficiency/legacy-javascript.d.ts +7 -8
- package/core/audits/byte-efficiency/modern-image-formats.d.ts +3 -3
- package/core/audits/byte-efficiency/offscreen-images.d.ts +3 -4
- package/core/audits/byte-efficiency/render-blocking-resources.d.ts +5 -9
- package/core/audits/byte-efficiency/render-blocking-resources.js +10 -16
- package/core/audits/byte-efficiency/total-byte-weight.d.ts +4 -4
- package/core/audits/byte-efficiency/unminified-css.d.ts +3 -3
- package/core/audits/byte-efficiency/unminified-javascript.d.ts +3 -3
- package/core/audits/byte-efficiency/unused-css-rules.d.ts +3 -3
- package/core/audits/byte-efficiency/unused-javascript.d.ts +3 -3
- package/core/audits/byte-efficiency/uses-long-cache-ttl.d.ts +4 -6
- package/core/audits/byte-efficiency/uses-optimized-images.d.ts +3 -3
- package/core/audits/byte-efficiency/uses-responsive-images-snapshot.d.ts +4 -4
- package/core/audits/byte-efficiency/uses-responsive-images.d.ts +4 -5
- package/core/audits/byte-efficiency/uses-text-compression.d.ts +3 -3
- package/core/audits/critical-request-chains.d.ts +3 -3
- package/core/audits/csp-xss.d.ts +8 -8
- package/core/audits/deprecations.d.ts +6 -6
- package/core/audits/dobetterweb/charset.d.ts +3 -3
- package/core/audits/dobetterweb/doctype.d.ts +9 -9
- package/core/audits/dobetterweb/dom-size.d.ts +9 -9
- package/core/audits/dobetterweb/geolocation-on-start.d.ts +3 -3
- package/core/audits/dobetterweb/inspector-issues.d.ts +6 -6
- package/core/audits/dobetterweb/js-libraries.d.ts +3 -3
- package/core/audits/dobetterweb/no-document-write.d.ts +3 -3
- package/core/audits/dobetterweb/notification-on-start.d.ts +3 -3
- package/core/audits/dobetterweb/paste-preventing-inputs.d.ts +3 -3
- package/core/audits/dobetterweb/uses-http2.d.ts +7 -11
- package/core/audits/dobetterweb/uses-http2.js +2 -5
- package/core/audits/dobetterweb/uses-passive-event-listeners.d.ts +3 -3
- package/core/audits/errors-in-console.d.ts +4 -4
- package/core/audits/font-display.d.ts +4 -4
- package/core/audits/image-aspect-ratio.d.ts +5 -5
- package/core/audits/image-size-responsive.d.ts +7 -7
- package/core/audits/is-on-https.d.ts +10 -10
- package/core/audits/largest-contentful-paint-element.d.ts +9 -9
- package/core/audits/layout-shifts.d.ts +9 -9
- package/core/audits/lcp-lazy-loaded.d.ts +3 -3
- package/core/audits/long-tasks.d.ts +11 -11
- package/core/audits/long-tasks.js +5 -5
- package/core/audits/mainthread-work-breakdown.d.ts +5 -5
- package/core/audits/metrics/cumulative-layout-shift.d.ts +1 -1
- package/core/audits/metrics/first-contentful-paint.d.ts +1 -1
- package/core/audits/metrics/first-meaningful-paint.d.ts +1 -1
- package/core/audits/metrics/interaction-to-next-paint.d.ts +1 -1
- package/core/audits/metrics/interactive.d.ts +1 -1
- package/core/audits/metrics/largest-contentful-paint.d.ts +1 -1
- package/core/audits/metrics/max-potential-fid.d.ts +2 -4
- package/core/audits/metrics/speed-index.d.ts +1 -1
- package/core/audits/metrics/total-blocking-time.d.ts +1 -1
- package/core/audits/network-rtt.d.ts +2 -2
- package/core/audits/network-server-latency.d.ts +2 -2
- package/core/audits/non-composited-animations.d.ts +9 -9
- package/core/audits/oopif-iframe-test-audit.d.ts +5 -5
- package/core/audits/preload-fonts.d.ts +3 -3
- package/core/audits/prioritize-lcp-image.d.ts +7 -7
- package/core/audits/redirects-http.d.ts +3 -3
- package/core/audits/redirects.d.ts +2 -3
- package/core/audits/resource-summary.d.ts +1 -1
- package/core/audits/screenshot-thumbnails.d.ts +2 -3
- package/core/audits/script-treemap-data.d.ts +1 -1
- package/core/audits/seo/canonical.d.ts +8 -8
- package/core/audits/seo/crawlable-anchors.d.ts +4 -4
- package/core/audits/seo/font-size.d.ts +11 -11
- package/core/audits/seo/hreflang.d.ts +6 -6
- package/core/audits/seo/http-status-code.d.ts +3 -3
- package/core/audits/seo/is-crawlable.d.ts +9 -10
- package/core/audits/seo/link-text.d.ts +4 -4
- package/core/audits/seo/manual/structured-data.d.ts +2 -2
- package/core/audits/seo/meta-description.d.ts +4 -4
- package/core/audits/seo/robots-txt.d.ts +6 -6
- package/core/audits/server-response-time.d.ts +4 -4
- package/core/audits/third-party-cookies.d.ts +4 -4
- package/core/audits/third-party-facades.d.ts +11 -12
- package/core/audits/third-party-summary.d.ts +5 -6
- package/core/audits/third-party-summary.js +7 -4
- package/core/audits/unsized-images.d.ts +3 -3
- package/core/audits/user-timings.d.ts +6 -6
- package/core/audits/uses-rel-preconnect.d.ts +5 -5
- package/core/audits/uses-rel-preload.d.ts +7 -7
- package/core/audits/uses-rel-preload.js +8 -6
- package/core/audits/valid-source-maps.d.ts +6 -7
- package/core/audits/viewport.d.ts +4 -4
- package/core/audits/work-during-interaction.d.ts +11 -12
- package/core/computed/computed-artifact.d.ts +2 -2
- package/core/computed/critical-request-chains.d.ts +9 -11
- package/core/computed/critical-request-chains.js +6 -6
- package/core/computed/document-urls.d.ts +3 -8
- package/core/computed/document-urls.js +1 -1
- package/core/computed/entity-classification.d.ts +6 -8
- package/core/computed/image-records.d.ts +3 -5
- package/core/computed/js-bundles.d.ts +2 -4
- package/core/computed/lcp-image-record.d.ts +3 -5
- package/core/computed/load-simulator.d.ts +7 -11
- package/core/computed/load-simulator.js +1 -1
- package/core/computed/main-resource.d.ts +5 -7
- package/core/computed/main-resource.js +1 -1
- package/core/computed/main-thread-tasks.d.ts +1 -3
- package/core/computed/metrics/cumulative-layout-shift.d.ts +2 -14
- package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -3
- package/core/computed/metrics/first-contentful-paint.d.ts +1 -3
- package/core/computed/metrics/interactive.d.ts +1 -3
- package/core/computed/metrics/lantern-first-contentful-paint.d.ts +3 -7
- package/core/computed/metrics/lantern-first-contentful-paint.js +3 -5
- package/core/computed/metrics/lantern-interactive.d.ts +3 -7
- package/core/computed/metrics/lantern-interactive.js +3 -5
- package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +3 -7
- package/core/computed/metrics/lantern-largest-contentful-paint.js +3 -5
- package/core/computed/metrics/lantern-max-potential-fid.d.ts +3 -7
- package/core/computed/metrics/lantern-max-potential-fid.js +3 -5
- package/core/computed/metrics/lantern-metric.d.ts +8 -8
- package/core/computed/metrics/lantern-metric.js +1 -1
- package/core/computed/metrics/lantern-speed-index.d.ts +3 -7
- package/core/computed/metrics/lantern-speed-index.js +3 -5
- package/core/computed/metrics/lantern-total-blocking-time.d.ts +3 -7
- package/core/computed/metrics/lantern-total-blocking-time.js +1 -3
- package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -3
- package/core/computed/metrics/largest-contentful-paint.d.ts +1 -3
- package/core/computed/metrics/lcp-breakdown.d.ts +3 -9
- package/core/computed/metrics/max-potential-fid.d.ts +1 -3
- package/core/computed/metrics/responsiveness.d.ts +7 -10
- package/core/computed/metrics/speed-index.d.ts +1 -3
- package/core/computed/metrics/time-to-first-byte.d.ts +1 -3
- package/core/computed/metrics/timing-summary.d.ts +8 -13
- package/core/computed/metrics/total-blocking-time.d.ts +1 -3
- package/core/computed/metrics/total-blocking-time.js +1 -1
- package/core/computed/module-duplication.d.ts +2 -8
- package/core/computed/navigation-insights.d.ts +2 -4
- package/core/computed/network-analysis.d.ts +2 -4
- package/core/computed/network-analysis.js +1 -1
- package/core/computed/network-records.d.ts +1 -3
- package/core/computed/page-dependency-graph.d.ts +9 -14
- package/core/computed/page-dependency-graph.js +3 -4
- package/core/computed/processed-navigation.d.ts +2 -5
- package/core/computed/processed-trace.d.ts +1 -3
- package/core/computed/resource-summary.d.ts +6 -10
- package/core/computed/screenshots.d.ts +1 -6
- package/core/computed/speedline.d.ts +1 -3
- package/core/computed/tbt-impact-tasks.d.ts +4 -5
- package/core/computed/tbt-impact-tasks.js +31 -8
- package/core/computed/trace-engine-result.d.ts +1 -3
- package/core/computed/trace-engine-result.js +10 -1
- package/core/computed/unused-css.d.ts +7 -9
- package/core/computed/unused-javascript-summary.d.ts +3 -5
- package/core/computed/user-timings.d.ts +3 -5
- package/core/computed/viewport-meta.d.ts +7 -9
- package/core/config/config-helpers.d.ts +5 -5
- package/core/config/config.d.ts +3 -3
- package/core/config/constants.d.ts +6 -6
- package/core/config/filters.d.ts +8 -8
- package/core/config/validation.d.ts +1 -1
- package/core/gather/driver/environment.d.ts +5 -5
- package/core/gather/driver/environment.js +1 -1
- package/core/gather/driver/execution-context.d.ts +6 -6
- package/core/gather/driver/navigation.d.ts +3 -3
- package/core/gather/driver/network-monitor.d.ts +6 -6
- package/core/gather/driver/storage.d.ts +4 -4
- package/core/gather/driver/target-manager.d.ts +4 -5
- package/core/gather/driver/target-manager.js +1 -1
- package/core/gather/driver/wait-for-condition.d.ts +3 -3
- package/core/gather/driver/wait-for-condition.js +4 -4
- package/core/gather/driver.d.ts +1 -1
- package/core/gather/gatherers/accessibility.d.ts +1 -1
- package/core/gather/gatherers/anchor-elements.d.ts +1 -1
- package/core/gather/gatherers/bf-cache-failures.d.ts +3 -3
- package/core/gather/gatherers/cache-contents.d.ts +1 -1
- package/core/gather/gatherers/console-messages.d.ts +1 -1
- package/core/gather/gatherers/css-usage.d.ts +1 -1
- package/core/gather/gatherers/devtools-log-compat.d.ts +3 -3
- package/core/gather/gatherers/devtools-log.d.ts +3 -3
- package/core/gather/gatherers/dobetterweb/doctype.d.ts +1 -1
- package/core/gather/gatherers/dobetterweb/domstats.d.ts +1 -1
- package/core/gather/gatherers/dobetterweb/optimized-images.d.ts +6 -7
- package/core/gather/gatherers/dobetterweb/response-compression.d.ts +4 -5
- package/core/gather/gatherers/full-page-screenshot.d.ts +3 -3
- package/core/gather/gatherers/iframe-elements.d.ts +1 -1
- package/core/gather/gatherers/image-elements.d.ts +1 -1
- package/core/gather/gatherers/inputs.d.ts +1 -1
- package/core/gather/gatherers/inspector-issues.d.ts +2 -2
- package/core/gather/gatherers/js-usage.d.ts +1 -1
- package/core/gather/gatherers/link-elements.d.ts +6 -10
- package/core/gather/gatherers/link-elements.js +5 -12
- package/core/gather/gatherers/main-document-content.d.ts +2 -2
- package/core/gather/gatherers/meta-elements.d.ts +1 -1
- package/core/gather/gatherers/network-user-agent.d.ts +4 -4
- package/core/gather/gatherers/root-causes.d.ts +3 -4
- package/core/gather/gatherers/seo/font-size.d.ts +19 -19
- package/core/gather/gatherers/seo/robots-txt.d.ts +1 -1
- package/core/gather/gatherers/source-maps.d.ts +2 -2
- package/core/gather/gatherers/stacks.d.ts +2 -2
- package/core/gather/gatherers/stylesheets.d.ts +1 -9
- package/core/gather/gatherers/stylesheets.js +8 -39
- package/core/gather/gatherers/trace-compat.d.ts +3 -3
- package/core/gather/gatherers/trace-elements.d.ts +4 -6
- package/core/gather/navigation-runner.d.ts +3 -4
- package/core/gather/runner-helpers.d.ts +3 -3
- package/core/gather/session.d.ts +4 -4
- package/core/gather/session.js +1 -1
- package/core/gather/snapshot-runner.d.ts +2 -2
- package/core/gather/timespan-runner.d.ts +3 -3
- package/core/index.d.cts +1 -7
- package/core/index.d.ts +6 -6
- package/core/lib/arbitrary-equality-map.d.ts +2 -2
- package/core/lib/asset-saver.d.ts +3 -3
- package/core/lib/asset-saver.js +1 -1
- package/core/lib/bf-cache-strings.d.ts +117 -117
- package/core/lib/cdt/Platform.d.ts +1 -1
- package/core/lib/cdt/SDK.d.ts +1 -1
- package/core/lib/cdt/generated/ParsedURL.js +2 -2
- package/core/lib/cdt/generated/SourceMap.d.ts +11 -11
- package/core/lib/cdt/generated/SourceMap.js +3 -3
- package/core/lib/csp-evaluator.d.ts +20 -20
- package/core/lib/deprecation-description.d.ts +3 -3
- package/core/lib/deprecations-strings.d.ts +112 -112
- package/core/lib/i18n/i18n.d.ts +48 -48
- package/core/lib/icons.d.ts +3 -3
- package/core/lib/lantern/lantern.d.ts +2 -19
- package/core/lib/lantern/lantern.js +2 -45
- package/core/lib/lantern-trace-saver.d.ts +5 -7
- package/core/lib/lantern-trace-saver.js +2 -3
- package/core/lib/lh-error.d.ts +87 -87
- package/core/lib/lighthouse-compatibility.d.ts +1 -1
- package/core/lib/manifest-parser.d.ts +1 -1
- package/core/lib/minify-devtoolslog.d.ts +1 -1
- package/core/lib/navigation-error.d.ts +4 -6
- package/core/lib/navigation-error.js +2 -2
- package/core/lib/network-recorder.js +1 -1
- package/core/lib/network-request.d.ts +5 -5
- package/core/lib/network-request.js +2 -2
- package/core/lib/page-functions.d.ts +2 -2
- package/core/lib/script-helpers.d.ts +0 -1
- package/core/lib/sentry.d.ts +8 -8
- package/core/lib/stack-packs.d.ts +1 -1
- package/core/lib/trace-engine.d.ts +2 -2
- package/core/lib/tracehouse/cpu-profile-model.d.ts +8 -8
- package/core/lib/tracehouse/cpu-profile-model.js +2 -2
- package/core/lib/tracehouse/main-thread-tasks.d.ts +5 -5
- package/core/lib/tracehouse/task-groups.d.ts +6 -38
- package/core/lib/tracehouse/task-summary.d.ts +0 -1
- package/core/lib/tracehouse/trace-processor.d.ts +9 -9
- package/core/lib/traces/metric-trace-events.d.ts +1 -1
- package/core/lib/url-utils.d.ts +4 -4
- package/core/runner.d.ts +3 -4
- package/core/runner.js +0 -1
- package/core/scoring.d.ts +0 -1
- package/core/user-flow.d.ts +5 -5
- package/dist/report/bundle.esm.js +1 -1
- package/dist/report/flow.js +1 -1
- package/dist/report/standalone.js +1 -1
- package/eslint-local-rules.d.cts +4 -1
- package/flow-report/src/i18n/localized-strings.d.ts +1 -1
- package/flow-report/src/i18n/ui-strings.d.ts +43 -43
- package/package.json +7 -7
- package/readme.md +0 -2
- package/report/generator/file-namer.d.ts +2 -2
- package/report/generator/flow-report-assets.d.ts +1 -1
- package/report/generator/report-generator.d.ts +4 -4
- package/report/renderer/api.d.ts +2 -5
- package/report/renderer/category-renderer.d.ts +8 -8
- package/report/renderer/components.d.ts +2 -2
- package/report/renderer/crc-details-renderer.d.ts +2 -2
- package/report/renderer/details-renderer.d.ts +7 -7
- package/report/renderer/dom.d.ts +7 -7
- package/report/renderer/drop-down-menu.d.ts +1 -1
- package/report/renderer/drop-down-menu.js +15 -17
- package/report/renderer/element-screenshot-renderer.d.ts +3 -3
- package/report/renderer/explodey-gauge.d.ts +2 -2
- package/report/renderer/features-util.d.ts +1 -1
- package/report/renderer/performance-category-renderer.d.ts +1 -1
- package/report/renderer/report-globals.d.ts +1 -1
- package/report/renderer/report-renderer.d.ts +1 -1
- package/report/renderer/report-ui-features.d.ts +1 -1
- package/report/renderer/report-utils.d.ts +62 -62
- package/report/renderer/snippet-renderer.d.ts +9 -9
- package/report/renderer/swap-locale-feature.d.ts +2 -2
- package/report/renderer/topbar-features.d.ts +2 -2
- package/report/types/augment-dom.d.ts +0 -11
- package/shared/localization/format.d.ts +3 -3
- package/shared/localization/locales/en-US.json +1 -1
- package/shared/localization/locales/en-XL.json +1 -1
- package/shared/localization/locales.d.ts +1 -1
- package/shared/type-verifiers.d.ts +1 -1
- package/shared/util.d.ts +6 -6
- package/tsconfig.json +1 -11
- package/types/artifacts.d.ts +4 -4
- package/types/gatherer.d.ts +4 -5
- package/types/internal/node.d.ts +0 -6
- package/types/internal/query-selector.d.ts +2 -2
- package/core/lib/lantern/BaseNode.d.ts +0 -163
- package/core/lib/lantern/BaseNode.js +0 -369
- package/core/lib/lantern/BaseNode.test.js +0 -385
- package/core/lib/lantern/CpuNode.d.ts +0 -43
- package/core/lib/lantern/CpuNode.js +0 -99
- package/core/lib/lantern/LanternError.d.ts +0 -8
- package/core/lib/lantern/LanternError.js +0 -9
- package/core/lib/lantern/Metric.d.ts +0 -69
- package/core/lib/lantern/Metric.js +0 -137
- package/core/lib/lantern/NetworkNode.d.ts +0 -49
- package/core/lib/lantern/NetworkNode.js +0 -136
- package/core/lib/lantern/PageDependencyGraph.d.ts +0 -82
- package/core/lib/lantern/PageDependencyGraph.js +0 -610
- package/core/lib/lantern/PageDependencyGraph.test.js +0 -654
- package/core/lib/lantern/TBTUtils.d.ts +0 -44
- package/core/lib/lantern/TBTUtils.js +0 -76
- package/core/lib/lantern/TBTUtils.test.d.ts +0 -2
- package/core/lib/lantern/TBTUtils.test.js +0 -130
- package/core/lib/lantern/TraceEngineComputationData.d.ts +0 -25
- package/core/lib/lantern/TraceEngineComputationData.js +0 -466
- package/core/lib/lantern/metrics/FirstContentfulPaint.d.ts +0 -79
- package/core/lib/lantern/metrics/FirstContentfulPaint.js +0 -198
- package/core/lib/lantern/metrics/FirstContentfulPaint.test.js +0 -54
- package/core/lib/lantern/metrics/Interactive.d.ts +0 -20
- package/core/lib/lantern/metrics/Interactive.js +0 -109
- package/core/lib/lantern/metrics/Interactive.test.js +0 -56
- package/core/lib/lantern/metrics/LargestContentfulPaint.d.ts +0 -19
- package/core/lib/lantern/metrics/LargestContentfulPaint.js +0 -105
- package/core/lib/lantern/metrics/LargestContentfulPaint.test.js +0 -42
- package/core/lib/lantern/metrics/MaxPotentialFID.d.ts +0 -24
- package/core/lib/lantern/metrics/MaxPotentialFID.js +0 -91
- package/core/lib/lantern/metrics/MetricTestUtils.d.ts +0 -19
- package/core/lib/lantern/metrics/MetricTestUtils.js +0 -48
- package/core/lib/lantern/metrics/SpeedIndex.d.ts +0 -32
- package/core/lib/lantern/metrics/SpeedIndex.js +0 -142
- package/core/lib/lantern/metrics/SpeedIndex.test.js +0 -83
- package/core/lib/lantern/metrics/TotalBlockingTime.d.ts +0 -25
- package/core/lib/lantern/metrics/TotalBlockingTime.js +0 -125
- package/core/lib/lantern/metrics/__snapshots__/FirstContentfulPaint.test.js.snap +0 -11
- package/core/lib/lantern/metrics/__snapshots__/Interactive.test.js.snap +0 -17
- package/core/lib/lantern/metrics/metrics.d.ts +0 -9
- package/core/lib/lantern/metrics/metrics.js +0 -16
- package/core/lib/lantern/simulation/ConnectionPool.d.ts +0 -48
- package/core/lib/lantern/simulation/ConnectionPool.js +0 -152
- package/core/lib/lantern/simulation/ConnectionPool.test.js +0 -195
- package/core/lib/lantern/simulation/Constants.d.ts +0 -52
- package/core/lib/lantern/simulation/Constants.js +0 -48
- package/core/lib/lantern/simulation/DNSCache.d.ts +0 -42
- package/core/lib/lantern/simulation/DNSCache.js +0 -74
- package/core/lib/lantern/simulation/DNSCache.test.js +0 -72
- package/core/lib/lantern/simulation/NetworkAnalyzer.d.ts +0 -209
- package/core/lib/lantern/simulation/NetworkAnalyzer.js +0 -597
- package/core/lib/lantern/simulation/NetworkAnalyzer.test.js +0 -475
- package/core/lib/lantern/simulation/SimulationTimingMap.d.ts +0 -153
- package/core/lib/lantern/simulation/SimulationTimingMap.js +0 -219
- package/core/lib/lantern/simulation/Simulator.d.ts +0 -157
- package/core/lib/lantern/simulation/Simulator.js +0 -593
- package/core/lib/lantern/simulation/Simulator.test.js +0 -434
- package/core/lib/lantern/simulation/TCPConnection.test.d.ts +0 -2
- package/core/lib/lantern/simulation/TCPConnection.test.js +0 -374
- package/core/lib/lantern/simulation/TcpConnection.d.ts +0 -89
- package/core/lib/lantern/simulation/TcpConnection.js +0 -230
- package/core/lib/lantern/simulation/simulation.d.ts +0 -21
- package/core/lib/lantern/simulation/simulation.js +0 -28
- package/core/lib/lantern/types/lantern.d.ts +0 -256
- package/core/lib/lantern/types/lantern.js +0 -7
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2017 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import assert from 'assert/strict';
|
|
8
|
-
|
|
9
|
-
import * as Lantern from '../lantern.js';
|
|
10
|
-
import {readJson} from '../../../test/test-utils.js';
|
|
11
|
-
import {runTraceEngine} from '../metrics/MetricTestUtils.js';
|
|
12
|
-
|
|
13
|
-
const {NetworkNode, CPUNode} = Lantern;
|
|
14
|
-
const {Simulator, DNSCache} = Lantern.Simulation;
|
|
15
|
-
|
|
16
|
-
const pwaTrace = readJson('../../../test/fixtures/artifacts/progressive-app/trace.json', import.meta);
|
|
17
|
-
|
|
18
|
-
let nextRequestId = 1;
|
|
19
|
-
let nextTid = 1;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @param {Lantern.Trace} trace
|
|
23
|
-
*/
|
|
24
|
-
async function createGraph(trace) {
|
|
25
|
-
const traceEngineData = await runTraceEngine(trace.traceEvents);
|
|
26
|
-
const requests =
|
|
27
|
-
Lantern.TraceEngineComputationData.createNetworkRequests(trace, traceEngineData);
|
|
28
|
-
return Lantern.TraceEngineComputationData.createGraph(requests, trace, traceEngineData);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function request(opts) {
|
|
32
|
-
const scheme = opts.scheme || 'http';
|
|
33
|
-
const url = `${scheme}://example.com`;
|
|
34
|
-
const rendererStartTime = opts.startTime;
|
|
35
|
-
const networkEndTime = opts.endTime;
|
|
36
|
-
delete opts.startTime;
|
|
37
|
-
delete opts.endTime;
|
|
38
|
-
|
|
39
|
-
return Object.assign({
|
|
40
|
-
requestId: opts.requestId || nextRequestId++,
|
|
41
|
-
url,
|
|
42
|
-
transferSize: opts.transferSize || 1000,
|
|
43
|
-
protocol: scheme,
|
|
44
|
-
parsedURL: {scheme, host: 'example.com', securityOrigin: url},
|
|
45
|
-
timing: opts.timing,
|
|
46
|
-
rendererStartTime,
|
|
47
|
-
networkEndTime,
|
|
48
|
-
}, opts);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function cpuTask({tid, ts, duration}) {
|
|
52
|
-
tid = tid || nextTid++;
|
|
53
|
-
ts = ts || 0;
|
|
54
|
-
const dur = ((duration || 0) * 1000) / 5;
|
|
55
|
-
return {tid, ts, dur};
|
|
56
|
-
}
|
|
57
|
-
describe('DependencyGraph/Simulator', () => {
|
|
58
|
-
// Insulate the simulator tests from DNS multiplier changes
|
|
59
|
-
let originalDNSMultiplier;
|
|
60
|
-
|
|
61
|
-
before(() => {
|
|
62
|
-
originalDNSMultiplier = DNSCache.RTT_MULTIPLIER;
|
|
63
|
-
DNSCache.RTT_MULTIPLIER = 1;
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
after(() => {
|
|
67
|
-
DNSCache.RTT_MULTIPLIER = originalDNSMultiplier;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
describe('.simulate', () => {
|
|
71
|
-
const serverResponseTimeByOrigin = new Map([['http://example.com', 500]]);
|
|
72
|
-
|
|
73
|
-
function assertNodeTiming(result, node, assertions) {
|
|
74
|
-
const timing = result.nodeTimings.get(node);
|
|
75
|
-
assert.ok(timing, 'missing node timing information');
|
|
76
|
-
Object.keys(assertions).forEach(key => {
|
|
77
|
-
assert.equal(timing[key], assertions[key]);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
it('should simulate basic network graphs', () => {
|
|
82
|
-
const rootNode = new NetworkNode(request({}));
|
|
83
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
84
|
-
const result = simulator.simulate(rootNode);
|
|
85
|
-
// should be 3 RTTs and 500ms for the server response time
|
|
86
|
-
assert.equal(result.timeInMs, 450 + 500);
|
|
87
|
-
assertNodeTiming(result, rootNode, {startTime: 0, endTime: 950});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('should simulate basic mixed graphs', () => {
|
|
91
|
-
const rootNode = new NetworkNode(request({}));
|
|
92
|
-
const cpuNode = new CPUNode(cpuTask({duration: 200}));
|
|
93
|
-
cpuNode.addDependency(rootNode);
|
|
94
|
-
|
|
95
|
-
const simulator = new Simulator({
|
|
96
|
-
serverResponseTimeByOrigin,
|
|
97
|
-
cpuSlowdownMultiplier: 5,
|
|
98
|
-
});
|
|
99
|
-
const result = simulator.simulate(rootNode);
|
|
100
|
-
// should be 3 RTTs and 500ms for the server response time + 200 CPU
|
|
101
|
-
assert.equal(result.timeInMs, 450 + 500 + 200);
|
|
102
|
-
assertNodeTiming(result, rootNode, {startTime: 0, endTime: 950});
|
|
103
|
-
assertNodeTiming(result, cpuNode, {startTime: 950, endTime: 1150});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should simulate basic network waterfall graphs', () => {
|
|
107
|
-
const nodeA = new NetworkNode(request({startTime: 0, endTime: 1}));
|
|
108
|
-
const nodeB = new NetworkNode(request({startTime: 0, endTime: 3}));
|
|
109
|
-
const nodeC = new NetworkNode(request({startTime: 0, endTime: 5}));
|
|
110
|
-
const nodeD = new NetworkNode(request({startTime: 0, endTime: 7}));
|
|
111
|
-
|
|
112
|
-
nodeA.addDependent(nodeB);
|
|
113
|
-
nodeB.addDependent(nodeC);
|
|
114
|
-
nodeC.addDependent(nodeD);
|
|
115
|
-
|
|
116
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
117
|
-
const result = simulator.simulate(nodeA);
|
|
118
|
-
// should be 950ms for A, 650ms each for B, C, D (no DNS and one-way connection)
|
|
119
|
-
assert.equal(result.timeInMs, 2900);
|
|
120
|
-
assertNodeTiming(result, nodeA, {startTime: 0, endTime: 950});
|
|
121
|
-
assertNodeTiming(result, nodeB, {startTime: 950, endTime: 1600});
|
|
122
|
-
assertNodeTiming(result, nodeC, {startTime: 1600, endTime: 2250});
|
|
123
|
-
assertNodeTiming(result, nodeD, {startTime: 2250, endTime: 2900});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should simulate cached network graphs', () => {
|
|
127
|
-
const nodeA = new NetworkNode(request({startTime: 0, endTime: 1,
|
|
128
|
-
fromDiskCache: true}));
|
|
129
|
-
const nodeB = new NetworkNode(request({startTime: 0, endTime: 3,
|
|
130
|
-
fromDiskCache: true}));
|
|
131
|
-
nodeA.addDependent(nodeB);
|
|
132
|
-
|
|
133
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
134
|
-
const result = simulator.simulate(nodeA);
|
|
135
|
-
// should be ~8ms each for A, B
|
|
136
|
-
assert.equal(result.timeInMs, 16);
|
|
137
|
-
assertNodeTiming(result, nodeA, {startTime: 0, endTime: 8});
|
|
138
|
-
assertNodeTiming(result, nodeB, {startTime: 8, endTime: 16});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should simulate data URL network graphs', () => {
|
|
142
|
-
const url = 'data:image/jpeg;base64,foobar';
|
|
143
|
-
const protocol = 'data';
|
|
144
|
-
const parsedURL = {scheme: 'data', host: '', securityOrigin: 'null'};
|
|
145
|
-
const nodeA = new NetworkNode(request({startTime: 0, endTime: 1, url,
|
|
146
|
-
parsedURL, protocol}));
|
|
147
|
-
const nodeB = new NetworkNode(request({startTime: 0, endTime: 3, url,
|
|
148
|
-
parsedURL, protocol, resourceSize: 1024 * 1024}));
|
|
149
|
-
nodeA.addDependent(nodeB);
|
|
150
|
-
|
|
151
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
152
|
-
const result = simulator.simulate(nodeA);
|
|
153
|
-
|
|
154
|
-
// should be ~2ms for A (resourceSize 0), ~12ms for B (resourceSize 1MB)
|
|
155
|
-
assert.equal(result.timeInMs, 14);
|
|
156
|
-
assertNodeTiming(result, nodeA, {startTime: 0, endTime: 2});
|
|
157
|
-
assertNodeTiming(result, nodeB, {startTime: 2, endTime: 14});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('should simulate basic CPU queue graphs', () => {
|
|
161
|
-
const nodeA = new NetworkNode(request({}));
|
|
162
|
-
const nodeB = new CPUNode(cpuTask({duration: 100}));
|
|
163
|
-
const nodeC = new CPUNode(cpuTask({duration: 600}));
|
|
164
|
-
const nodeD = new CPUNode(cpuTask({duration: 300}));
|
|
165
|
-
|
|
166
|
-
nodeA.addDependent(nodeB);
|
|
167
|
-
nodeA.addDependent(nodeC);
|
|
168
|
-
nodeA.addDependent(nodeD);
|
|
169
|
-
|
|
170
|
-
const simulator = new Simulator({
|
|
171
|
-
serverResponseTimeByOrigin,
|
|
172
|
-
cpuSlowdownMultiplier: 5,
|
|
173
|
-
});
|
|
174
|
-
const result = simulator.simulate(nodeA);
|
|
175
|
-
// should be 800ms A, then 1000 ms total for B, C, D in serial
|
|
176
|
-
assert.equal(result.timeInMs, 1950);
|
|
177
|
-
assertNodeTiming(result, nodeA, {startTime: 0, endTime: 950});
|
|
178
|
-
assertNodeTiming(result, nodeB, {startTime: 950, endTime: 1050});
|
|
179
|
-
assertNodeTiming(result, nodeC, {startTime: 1050, endTime: 1650});
|
|
180
|
-
assertNodeTiming(result, nodeD, {startTime: 1650, endTime: 1950});
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('should simulate basic network waterfall graphs with CPU', () => {
|
|
184
|
-
const nodeA = new NetworkNode(request({}));
|
|
185
|
-
const nodeB = new NetworkNode(request({}));
|
|
186
|
-
const nodeC = new NetworkNode(request({}));
|
|
187
|
-
const nodeD = new NetworkNode(request({}));
|
|
188
|
-
const nodeE = new CPUNode(cpuTask({duration: 1000}));
|
|
189
|
-
const nodeF = new CPUNode(cpuTask({duration: 1000}));
|
|
190
|
-
|
|
191
|
-
nodeA.addDependent(nodeB);
|
|
192
|
-
nodeB.addDependent(nodeC);
|
|
193
|
-
nodeB.addDependent(nodeE); // finishes 350 ms after C
|
|
194
|
-
nodeC.addDependent(nodeD);
|
|
195
|
-
nodeC.addDependent(nodeF); // finishes 700 ms after D
|
|
196
|
-
|
|
197
|
-
const simulator = new Simulator({
|
|
198
|
-
serverResponseTimeByOrigin,
|
|
199
|
-
cpuSlowdownMultiplier: 5,
|
|
200
|
-
});
|
|
201
|
-
const result = simulator.simulate(nodeA);
|
|
202
|
-
// should be 950ms for A, 650ms each for B, C, D, with F finishing 700 ms after D
|
|
203
|
-
assert.equal(result.timeInMs, 3600);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
it('should simulate basic parallel requests', () => {
|
|
207
|
-
const nodeA = new NetworkNode(request({}));
|
|
208
|
-
const nodeB = new NetworkNode(request({}));
|
|
209
|
-
const nodeC = new NetworkNode(request({transferSize: 15000}));
|
|
210
|
-
const nodeD = new NetworkNode(request({}));
|
|
211
|
-
|
|
212
|
-
nodeA.addDependent(nodeB);
|
|
213
|
-
nodeA.addDependent(nodeC);
|
|
214
|
-
nodeA.addDependent(nodeD);
|
|
215
|
-
|
|
216
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
217
|
-
const result = simulator.simulate(nodeA);
|
|
218
|
-
// should be 950ms for A and 950ms for C (2 round trips of downloading, but no DNS)
|
|
219
|
-
assert.equal(result.timeInMs, 950 + 950);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('should make connections in parallel', () => {
|
|
223
|
-
const nodeA = new NetworkNode(request({startTime: 0, networkRequestTime: 0, endTime: 1}));
|
|
224
|
-
const nodeB = new NetworkNode(request({startTime: 2, networkRequestTime: 2, endTime: 3}));
|
|
225
|
-
const nodeC = new NetworkNode(request({startTime: 2, networkRequestTime: 2, endTime: 5}));
|
|
226
|
-
const nodeD = new NetworkNode(request({startTime: 2, networkRequestTime: 2, endTime: 7}));
|
|
227
|
-
|
|
228
|
-
nodeA.addDependent(nodeB);
|
|
229
|
-
nodeA.addDependent(nodeC);
|
|
230
|
-
nodeA.addDependent(nodeD);
|
|
231
|
-
|
|
232
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
233
|
-
const result = simulator.simulate(nodeA);
|
|
234
|
-
// should be 950ms for A, 650ms for B reusing connection, 800ms for C and D in parallel.
|
|
235
|
-
assert.equal(result.timeInMs, 950 + 800);
|
|
236
|
-
assertNodeTiming(result, nodeA, {startTime: 0, endTime: 950});
|
|
237
|
-
assertNodeTiming(result, nodeB, {startTime: 950, endTime: 1600});
|
|
238
|
-
assertNodeTiming(result, nodeC, {startTime: 950, endTime: 1750});
|
|
239
|
-
assertNodeTiming(result, nodeD, {startTime: 950, endTime: 1750});
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('should adjust throughput based on number of requests', () => {
|
|
243
|
-
const nodeA = new NetworkNode(request({}));
|
|
244
|
-
const nodeB = new NetworkNode(request({}));
|
|
245
|
-
const nodeC = new NetworkNode(request({transferSize: 14000}));
|
|
246
|
-
const nodeD = new NetworkNode(request({}));
|
|
247
|
-
|
|
248
|
-
nodeA.addDependent(nodeB);
|
|
249
|
-
nodeA.addDependent(nodeC);
|
|
250
|
-
nodeA.addDependent(nodeD);
|
|
251
|
-
|
|
252
|
-
// 80 kbps while all 3 download at 150ms/RT = ~1460 bytes/RT
|
|
253
|
-
// 240 kbps while the last one finishes at 150ms/RT = ~4380 bytes/RT
|
|
254
|
-
// ~14000 bytes = 5 RTs
|
|
255
|
-
// 1 RT 80 kbps b/c its shared
|
|
256
|
-
// 1 RT 80 kbps b/c it needs to grow congestion window from being shared
|
|
257
|
-
// 1 RT 160 kbps b/c TCP
|
|
258
|
-
// 2 RT 240 kbps b/c throughput cap
|
|
259
|
-
const simulator = new Simulator({serverResponseTimeByOrigin, throughput: 240000});
|
|
260
|
-
const result = simulator.simulate(nodeA);
|
|
261
|
-
// should be 950ms for A and 1400ms for C (5 round trips of downloading)
|
|
262
|
-
assert.equal(result.timeInMs, 950 + (150 + 750 + 500));
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it('should start network requests in startTime order', () => {
|
|
266
|
-
const rootNode = new NetworkNode(request({startTime: 0, endTime: 0.05,
|
|
267
|
-
connectionId: 1}));
|
|
268
|
-
const imageNodes = [
|
|
269
|
-
new NetworkNode(request({startTime: 5})),
|
|
270
|
-
new NetworkNode(request({startTime: 4})),
|
|
271
|
-
new NetworkNode(request({startTime: 3})),
|
|
272
|
-
new NetworkNode(request({startTime: 2})),
|
|
273
|
-
new NetworkNode(request({startTime: 1})),
|
|
274
|
-
];
|
|
275
|
-
|
|
276
|
-
for (const imageNode of imageNodes) {
|
|
277
|
-
imageNode.request.connectionReused = true;
|
|
278
|
-
imageNode.request.connectionId = 1;
|
|
279
|
-
rootNode.addDependent(imageNode);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const simulator = new Simulator({serverResponseTimeByOrigin, maximumConcurrentRequests: 1});
|
|
283
|
-
const result = simulator.simulate(rootNode);
|
|
284
|
-
|
|
285
|
-
// should be 3 RTs + SRT for rootNode (950ms)
|
|
286
|
-
// should be 1 RT + SRT for image nodes in observed order (650ms)
|
|
287
|
-
assertNodeTiming(result, rootNode, {startTime: 0, endTime: 950});
|
|
288
|
-
assertNodeTiming(result, imageNodes[4], {startTime: 950, endTime: 1600});
|
|
289
|
-
assertNodeTiming(result, imageNodes[3], {startTime: 1600, endTime: 2250});
|
|
290
|
-
assertNodeTiming(result, imageNodes[2], {startTime: 2250, endTime: 2900});
|
|
291
|
-
assertNodeTiming(result, imageNodes[1], {startTime: 2900, endTime: 3550});
|
|
292
|
-
assertNodeTiming(result, imageNodes[0], {startTime: 3550, endTime: 4200});
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
it('should start network requests in priority order to break startTime ties', () => {
|
|
296
|
-
const rootNode = new NetworkNode(request({startTime: 0, endTime: 0.05,
|
|
297
|
-
connectionId: 1}));
|
|
298
|
-
const imageNodes = [
|
|
299
|
-
new NetworkNode(request({startTime: 0.1, priority: 'VeryLow'})),
|
|
300
|
-
new NetworkNode(request({startTime: 0.2, priority: 'Low'})),
|
|
301
|
-
new NetworkNode(request({startTime: 0.3, priority: 'Medium'})),
|
|
302
|
-
new NetworkNode(request({startTime: 0.4, priority: 'High'})),
|
|
303
|
-
new NetworkNode(request({startTime: 0.5, priority: 'VeryHigh'})),
|
|
304
|
-
];
|
|
305
|
-
|
|
306
|
-
for (const imageNode of imageNodes) {
|
|
307
|
-
imageNode.request.connectionReused = true;
|
|
308
|
-
imageNode.request.connectionId = 1;
|
|
309
|
-
rootNode.addDependent(imageNode);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const simulator = new Simulator({serverResponseTimeByOrigin, maximumConcurrentRequests: 1});
|
|
313
|
-
const result = simulator.simulate(rootNode);
|
|
314
|
-
|
|
315
|
-
// should be 3 RTs + SRT for rootNode (950ms)
|
|
316
|
-
// should be 1 RT + SRT for image nodes in priority order (650ms)
|
|
317
|
-
assertNodeTiming(result, rootNode, {startTime: 0, endTime: 950});
|
|
318
|
-
assertNodeTiming(result, imageNodes[4], {startTime: 950, endTime: 1600});
|
|
319
|
-
assertNodeTiming(result, imageNodes[3], {startTime: 1600, endTime: 2250});
|
|
320
|
-
assertNodeTiming(result, imageNodes[2], {startTime: 2250, endTime: 2900});
|
|
321
|
-
assertNodeTiming(result, imageNodes[1], {startTime: 2900, endTime: 3550});
|
|
322
|
-
assertNodeTiming(result, imageNodes[0], {startTime: 3550, endTime: 4200});
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it('should simulate two graphs in a row', () => {
|
|
326
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
327
|
-
|
|
328
|
-
const nodeA = new NetworkNode(request({}));
|
|
329
|
-
const nodeB = new NetworkNode(request({}));
|
|
330
|
-
const nodeC = new NetworkNode(request({transferSize: 15000}));
|
|
331
|
-
const nodeD = new NetworkNode(request({}));
|
|
332
|
-
|
|
333
|
-
nodeA.addDependent(nodeB);
|
|
334
|
-
nodeA.addDependent(nodeC);
|
|
335
|
-
nodeA.addDependent(nodeD);
|
|
336
|
-
|
|
337
|
-
const resultA = simulator.simulate(nodeA);
|
|
338
|
-
// should be 950ms for A and 950ms for C (2 round trips of downloading, no DNS)
|
|
339
|
-
assert.equal(resultA.timeInMs, 950 + 950);
|
|
340
|
-
|
|
341
|
-
const nodeE = new NetworkNode(request({}));
|
|
342
|
-
const nodeF = new NetworkNode(request({}));
|
|
343
|
-
const nodeG = new NetworkNode(request({}));
|
|
344
|
-
|
|
345
|
-
nodeE.addDependent(nodeF);
|
|
346
|
-
nodeE.addDependent(nodeG);
|
|
347
|
-
|
|
348
|
-
const resultB = simulator.simulate(nodeE);
|
|
349
|
-
// should be 950ms for E and 800ms for F/G
|
|
350
|
-
assert.equal(resultB.timeInMs, 950 + 800);
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
it('should maximize throughput with H2', () => {
|
|
354
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
355
|
-
const connectionDefaults = {protocol: 'h2', connectionId: 1};
|
|
356
|
-
const nodeA = new NetworkNode(request({startTime: 0, endTime: 1,
|
|
357
|
-
...connectionDefaults}));
|
|
358
|
-
const nodeB = new NetworkNode(request({startTime: 1, endTime: 2,
|
|
359
|
-
...connectionDefaults}));
|
|
360
|
-
const nodeC = new NetworkNode(request({startTime: 2, endTime: 3,
|
|
361
|
-
...connectionDefaults}));
|
|
362
|
-
const nodeD = new NetworkNode(request({startTime: 3, endTime: 4,
|
|
363
|
-
...connectionDefaults}));
|
|
364
|
-
|
|
365
|
-
nodeA.addDependent(nodeB);
|
|
366
|
-
nodeB.addDependent(nodeC);
|
|
367
|
-
nodeB.addDependent(nodeD);
|
|
368
|
-
|
|
369
|
-
// Run two simulations:
|
|
370
|
-
// - The first with C & D in parallel.
|
|
371
|
-
// - The second with C & D in series.
|
|
372
|
-
// Under HTTP/2 simulation these should be equivalent, but definitely parallel
|
|
373
|
-
// shouldn't be slower.
|
|
374
|
-
const resultA = simulator.simulate(nodeA);
|
|
375
|
-
nodeC.addDependent(nodeD);
|
|
376
|
-
const resultB = simulator.simulate(nodeA);
|
|
377
|
-
expect(resultA.timeInMs).toBeLessThanOrEqual(resultB.timeInMs);
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
it('should throw (not hang) on graphs with cycles', () => {
|
|
381
|
-
const rootNode = new NetworkNode(request({}));
|
|
382
|
-
const depNode = new NetworkNode(request({}));
|
|
383
|
-
rootNode.addDependency(depNode);
|
|
384
|
-
depNode.addDependency(rootNode);
|
|
385
|
-
|
|
386
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
387
|
-
assert.throws(() => simulator.simulate(rootNode), /cycle/);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
describe('on a real trace', () => {
|
|
391
|
-
const trace = pwaTrace;
|
|
392
|
-
|
|
393
|
-
it('should compute a timeInMs', async () => {
|
|
394
|
-
const graph = await createGraph(trace);
|
|
395
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
396
|
-
const result = simulator.simulate(graph);
|
|
397
|
-
expect(result.timeInMs).toBeGreaterThan(100);
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
it('should sort the task event times', async () => {
|
|
401
|
-
const graph = await createGraph(trace);
|
|
402
|
-
const simulator = new Simulator({serverResponseTimeByOrigin});
|
|
403
|
-
const result = simulator.simulate(graph);
|
|
404
|
-
const nodeTimings = Array.from(result.nodeTimings.entries());
|
|
405
|
-
|
|
406
|
-
for (let i = 1; i < nodeTimings.length; i++) {
|
|
407
|
-
const startTime = nodeTimings[i][1].startTime;
|
|
408
|
-
const previousStartTime = nodeTimings[i - 1][1].startTime;
|
|
409
|
-
expect(startTime).toBeGreaterThanOrEqual(previousStartTime);
|
|
410
|
-
}
|
|
411
|
-
});
|
|
412
|
-
});
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
describe('.simulateTimespan', () => {
|
|
416
|
-
it('calculates savings using throughput', () => {
|
|
417
|
-
const simulator = new Simulator({throughput: 1000, observedThroughput: 2000});
|
|
418
|
-
const wastedMs = simulator.computeWastedMsFromWastedBytes(500);
|
|
419
|
-
expect(wastedMs).toBeCloseTo(4000);
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
it('falls back to observed throughput if throughput is 0', () => {
|
|
423
|
-
const simulator = new Simulator({throughput: 0, observedThroughput: 2000});
|
|
424
|
-
const wastedMs = simulator.computeWastedMsFromWastedBytes(500);
|
|
425
|
-
expect(wastedMs).toBeCloseTo(2000);
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
it('returns 0 if throughput and observed throughput are 0', () => {
|
|
429
|
-
const simulator = new Simulator({throughput: 0, observedThroughput: 0});
|
|
430
|
-
const wastedMs = simulator.computeWastedMsFromWastedBytes(500);
|
|
431
|
-
expect(wastedMs).toEqual(0);
|
|
432
|
-
});
|
|
433
|
-
});
|
|
434
|
-
});
|