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,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2018 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as Lantern from '../lantern.js';
|
|
8
|
-
import {NetworkAnalyzer} from './NetworkAnalyzer.js';
|
|
9
|
-
import {TcpConnection} from './TcpConnection.js';
|
|
10
|
-
|
|
11
|
-
const DEFAULT_SERVER_RESPONSE_TIME = 30;
|
|
12
|
-
const TLS_SCHEMES = ['https', 'wss'];
|
|
13
|
-
|
|
14
|
-
// Each origin can have 6 simulatenous connections open
|
|
15
|
-
// https://cs.chromium.org/chromium/src/net/socket/client_socket_pool_manager.cc?type=cs&q="int+g_max_sockets_per_group"
|
|
16
|
-
const CONNECTIONS_PER_ORIGIN = 6;
|
|
17
|
-
|
|
18
|
-
export class ConnectionPool {
|
|
19
|
-
/**
|
|
20
|
-
* @param {Lantern.NetworkRequest[]} records
|
|
21
|
-
* @param {Required<Lantern.Simulation.Options>} options
|
|
22
|
-
*/
|
|
23
|
-
constructor(records, options) {
|
|
24
|
-
this._options = options;
|
|
25
|
-
|
|
26
|
-
this._records = records;
|
|
27
|
-
/** @type {Map<string, TcpConnection[]>} */
|
|
28
|
-
this._connectionsByOrigin = new Map();
|
|
29
|
-
/** @type {Map<Lantern.NetworkRequest, TcpConnection>} */
|
|
30
|
-
this._connectionsByRequest = new Map();
|
|
31
|
-
this._connectionsInUse = new Set();
|
|
32
|
-
this._connectionReusedByRequestId = NetworkAnalyzer.estimateIfConnectionWasReused(records, {
|
|
33
|
-
forceCoarseEstimates: true,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
this._initializeConnections();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @return {TcpConnection[]}
|
|
41
|
-
*/
|
|
42
|
-
connectionsInUse() {
|
|
43
|
-
return Array.from(this._connectionsInUse);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
_initializeConnections() {
|
|
47
|
-
const connectionReused = this._connectionReusedByRequestId;
|
|
48
|
-
const additionalRttByOrigin = this._options.additionalRttByOrigin;
|
|
49
|
-
const serverResponseTimeByOrigin = this._options.serverResponseTimeByOrigin;
|
|
50
|
-
|
|
51
|
-
const recordsByOrigin = NetworkAnalyzer.groupByOrigin(this._records);
|
|
52
|
-
for (const [origin, requests] of recordsByOrigin.entries()) {
|
|
53
|
-
const connections = [];
|
|
54
|
-
const additionalRtt = additionalRttByOrigin.get(origin) || 0;
|
|
55
|
-
const responseTime = serverResponseTimeByOrigin.get(origin) || DEFAULT_SERVER_RESPONSE_TIME;
|
|
56
|
-
|
|
57
|
-
for (const request of requests) {
|
|
58
|
-
if (connectionReused.get(request.requestId)) continue;
|
|
59
|
-
|
|
60
|
-
const isTLS = TLS_SCHEMES.includes(request.parsedURL.scheme);
|
|
61
|
-
const isH2 = request.protocol === 'h2';
|
|
62
|
-
const connection = new TcpConnection(
|
|
63
|
-
this._options.rtt + additionalRtt,
|
|
64
|
-
this._options.throughput,
|
|
65
|
-
responseTime,
|
|
66
|
-
isTLS,
|
|
67
|
-
isH2
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
connections.push(connection);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (!connections.length) {
|
|
74
|
-
throw new Error(`Could not find a connection for origin: ${origin}`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Make sure each origin has minimum number of connections available for max throughput.
|
|
78
|
-
// But only if it's not over H2 which maximizes throughput already.
|
|
79
|
-
const minConnections = connections[0].isH2() ? 1 : CONNECTIONS_PER_ORIGIN;
|
|
80
|
-
while (connections.length < minConnections) connections.push(connections[0].clone());
|
|
81
|
-
|
|
82
|
-
this._connectionsByOrigin.set(origin, connections);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* @param {Array<TcpConnection>} connections
|
|
88
|
-
*/
|
|
89
|
-
_findAvailableConnectionWithLargestCongestionWindow(connections) {
|
|
90
|
-
/** @type {TcpConnection|null} */
|
|
91
|
-
let maxConnection = null;
|
|
92
|
-
for (let i = 0; i < connections.length; i++) {
|
|
93
|
-
const connection = connections[i];
|
|
94
|
-
|
|
95
|
-
// Connections that are in use are never available.
|
|
96
|
-
if (this._connectionsInUse.has(connection)) {
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// This connection is a match and is available! Update our max if it has a larger congestionWindow
|
|
101
|
-
const currentMax = (maxConnection?.congestionWindow) || -Infinity;
|
|
102
|
-
if (connection.congestionWindow > currentMax) maxConnection = connection;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return maxConnection;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* This method finds an available connection to the origin specified by the network request or null
|
|
110
|
-
* if no connection was available. If returned, connection will not be available for other network
|
|
111
|
-
* records until release is called.
|
|
112
|
-
*
|
|
113
|
-
* @param {Lantern.NetworkRequest} request
|
|
114
|
-
* @return {?TcpConnection}
|
|
115
|
-
*/
|
|
116
|
-
acquire(request) {
|
|
117
|
-
if (this._connectionsByRequest.has(request)) throw new Error('Record already has a connection');
|
|
118
|
-
|
|
119
|
-
const origin = request.parsedURL.securityOrigin;
|
|
120
|
-
const connections = this._connectionsByOrigin.get(origin) || [];
|
|
121
|
-
const connectionToUse = this._findAvailableConnectionWithLargestCongestionWindow(connections);
|
|
122
|
-
|
|
123
|
-
if (!connectionToUse) return null;
|
|
124
|
-
|
|
125
|
-
this._connectionsInUse.add(connectionToUse);
|
|
126
|
-
this._connectionsByRequest.set(request, connectionToUse);
|
|
127
|
-
return connectionToUse;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Return the connection currently being used to fetch a request. If no connection
|
|
132
|
-
* currently being used for this request, an error will be thrown.
|
|
133
|
-
*
|
|
134
|
-
* @param {Lantern.NetworkRequest} request
|
|
135
|
-
* @return {TcpConnection}
|
|
136
|
-
*/
|
|
137
|
-
acquireActiveConnectionFromRequest(request) {
|
|
138
|
-
const activeConnection = this._connectionsByRequest.get(request);
|
|
139
|
-
if (!activeConnection) throw new Error('Could not find an active connection for request');
|
|
140
|
-
|
|
141
|
-
return activeConnection;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* @param {Lantern.NetworkRequest} request
|
|
146
|
-
*/
|
|
147
|
-
release(request) {
|
|
148
|
-
const connection = this._connectionsByRequest.get(request);
|
|
149
|
-
this._connectionsByRequest.delete(request);
|
|
150
|
-
this._connectionsInUse.delete(connection);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2018 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import assert from 'assert/strict';
|
|
8
|
-
import {URL} from 'url';
|
|
9
|
-
|
|
10
|
-
import * as Lantern from '../lantern.js';
|
|
11
|
-
|
|
12
|
-
const {ConnectionPool} = Lantern.Simulation;
|
|
13
|
-
|
|
14
|
-
describe('ConnectionPool', () => {
|
|
15
|
-
const rtt = 100;
|
|
16
|
-
const throughput = 10000 * 1024;
|
|
17
|
-
let requestId;
|
|
18
|
-
|
|
19
|
-
function request(data = {}) {
|
|
20
|
-
const url = data.url || 'http://example.com';
|
|
21
|
-
const origin = new URL(url).origin;
|
|
22
|
-
const scheme = url.split(':')[0];
|
|
23
|
-
|
|
24
|
-
return Object.assign({
|
|
25
|
-
requestId: requestId++,
|
|
26
|
-
url,
|
|
27
|
-
protocol: 'http/1.1',
|
|
28
|
-
parsedURL: {scheme, securityOrigin: origin},
|
|
29
|
-
}, data);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function simulationOptions(options) {
|
|
33
|
-
return Object.assign(
|
|
34
|
-
{
|
|
35
|
-
rtt: 150,
|
|
36
|
-
throughput: 1024,
|
|
37
|
-
additionalRttByOrigin: new Map(),
|
|
38
|
-
serverResponseTimeByOrigin: new Map(),
|
|
39
|
-
},
|
|
40
|
-
options
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
requestId = 1;
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
describe('#constructor', () => {
|
|
49
|
-
it('should create the pool', () => {
|
|
50
|
-
const pool = new ConnectionPool([request()], simulationOptions({rtt, throughput}));
|
|
51
|
-
// Make sure 6 connections are created for each origin
|
|
52
|
-
assert.equal(pool._connectionsByOrigin.get('http://example.com').length, 6);
|
|
53
|
-
// Make sure it populates connectionWasReused
|
|
54
|
-
assert.equal(pool._connectionReusedByRequestId.get(1), false);
|
|
55
|
-
|
|
56
|
-
const connection = pool._connectionsByOrigin.get('http://example.com')[0];
|
|
57
|
-
assert.equal(connection._rtt, rtt);
|
|
58
|
-
assert.equal(connection._throughput, throughput);
|
|
59
|
-
assert.equal(connection._serverLatency, 30); // sets to default value
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('should set TLS properly', () => {
|
|
63
|
-
const recordA = request({url: 'https://example.com'});
|
|
64
|
-
const pool = new ConnectionPool([recordA], simulationOptions({rtt, throughput}));
|
|
65
|
-
const connection = pool._connectionsByOrigin.get('https://example.com')[0];
|
|
66
|
-
assert.ok(connection._ssl, 'should have set connection TLS');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should set H2 properly', () => {
|
|
70
|
-
const recordA = request({protocol: 'h2'});
|
|
71
|
-
const pool = new ConnectionPool([recordA], simulationOptions({rtt, throughput}));
|
|
72
|
-
const connection = pool._connectionsByOrigin.get('http://example.com')[0];
|
|
73
|
-
assert.ok(connection.isH2(), 'should have set HTTP/2');
|
|
74
|
-
assert.equal(pool._connectionsByOrigin.get('http://example.com').length, 1);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should set origin-specific RTT properly', () => {
|
|
78
|
-
const additionalRttByOrigin = new Map([['http://example.com', 63]]);
|
|
79
|
-
const pool = new ConnectionPool([request()],
|
|
80
|
-
simulationOptions({rtt, throughput, additionalRttByOrigin}));
|
|
81
|
-
const connection = pool._connectionsByOrigin.get('http://example.com')[0];
|
|
82
|
-
assert.ok(connection._rtt, rtt + 63);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('should set origin-specific server latency properly', () => {
|
|
86
|
-
const serverResponseTimeByOrigin = new Map([['http://example.com', 63]]);
|
|
87
|
-
const pool = new ConnectionPool([request()],
|
|
88
|
-
simulationOptions({rtt, throughput, serverResponseTimeByOrigin}));
|
|
89
|
-
const connection = pool._connectionsByOrigin.get('http://example.com')[0];
|
|
90
|
-
assert.ok(connection._serverLatency, 63);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
describe('.acquire', () => {
|
|
95
|
-
it('should remember the connection associated with each request', () => {
|
|
96
|
-
const requestA = request();
|
|
97
|
-
const requestB = request();
|
|
98
|
-
const pool = new ConnectionPool([requestA, requestB], simulationOptions({rtt, throughput}));
|
|
99
|
-
|
|
100
|
-
const connectionForA = pool.acquire(requestA);
|
|
101
|
-
const connectionForB = pool.acquire(requestB);
|
|
102
|
-
for (let i = 0; i < 10; i++) {
|
|
103
|
-
assert.equal(pool.acquireActiveConnectionFromRequest(requestA), connectionForA);
|
|
104
|
-
assert.equal(pool.acquireActiveConnectionFromRequest(requestB), connectionForB);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
assert.deepStrictEqual(pool.connectionsInUse(), [connectionForA, connectionForB]);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('should allocate at least 6 connections', () => {
|
|
111
|
-
const pool = new ConnectionPool([request()], simulationOptions({rtt, throughput}));
|
|
112
|
-
for (let i = 0; i < 6; i++) {
|
|
113
|
-
assert.ok(pool.acquire(request()), `did not find connection for ${i}th request`);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should allocate all connections', () => {
|
|
118
|
-
const records = new Array(7).fill(undefined, 0, 7).map(() => request());
|
|
119
|
-
const pool = new ConnectionPool(records, simulationOptions({rtt, throughput}));
|
|
120
|
-
const connections = records.map(request => pool.acquire(request));
|
|
121
|
-
assert.ok(connections[0], 'did not find connection for 1st request');
|
|
122
|
-
assert.ok(connections[5], 'did not find connection for 6th request');
|
|
123
|
-
assert.ok(connections[6], 'did not find connection for 7th request');
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should be oblivious to connection reuse', () => {
|
|
127
|
-
const coldRecord = request();
|
|
128
|
-
const warmRecord = request();
|
|
129
|
-
const pool = new ConnectionPool([coldRecord, warmRecord],
|
|
130
|
-
simulationOptions({rtt, throughput}));
|
|
131
|
-
pool._connectionReusedByRequestId.set(warmRecord.requestId, true);
|
|
132
|
-
|
|
133
|
-
assert.ok(pool.acquire(coldRecord), 'should have acquired connection');
|
|
134
|
-
assert.ok(pool.acquire(warmRecord), 'should have acquired connection');
|
|
135
|
-
pool.release(coldRecord);
|
|
136
|
-
|
|
137
|
-
for (const connection of pool._connectionsByOrigin.get('http://example.com')) {
|
|
138
|
-
connection.setWarmed(true);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
assert.ok(pool.acquire(coldRecord), 'should have acquired connection');
|
|
142
|
-
assert.ok(pool.acquireActiveConnectionFromRequest(warmRecord),
|
|
143
|
-
'should have acquired connection');
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('should acquire in order of warmness', () => {
|
|
147
|
-
const recordA = request();
|
|
148
|
-
const recordB = request();
|
|
149
|
-
const recordC = request();
|
|
150
|
-
const pool = new ConnectionPool([recordA, recordB, recordC],
|
|
151
|
-
simulationOptions({rtt, throughput}));
|
|
152
|
-
pool._connectionReusedByRequestId.set(recordA.requestId, true);
|
|
153
|
-
pool._connectionReusedByRequestId.set(recordB.requestId, true);
|
|
154
|
-
pool._connectionReusedByRequestId.set(recordC.requestId, true);
|
|
155
|
-
|
|
156
|
-
const [connectionWarm, connectionWarmer, connectionWarmest] =
|
|
157
|
-
pool._connectionsByOrigin.get('http://example.com');
|
|
158
|
-
connectionWarm.setWarmed(true);
|
|
159
|
-
connectionWarm.setCongestionWindow(10);
|
|
160
|
-
connectionWarmer.setWarmed(true);
|
|
161
|
-
connectionWarmer.setCongestionWindow(100);
|
|
162
|
-
connectionWarmest.setWarmed(true);
|
|
163
|
-
connectionWarmest.setCongestionWindow(1000);
|
|
164
|
-
|
|
165
|
-
assert.equal(pool.acquire(recordA), connectionWarmest);
|
|
166
|
-
assert.equal(pool.acquire(recordB), connectionWarmer);
|
|
167
|
-
assert.equal(pool.acquire(recordC), connectionWarm);
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
describe('.release', () => {
|
|
172
|
-
it('noop for request without connection', () => {
|
|
173
|
-
const requestA = request();
|
|
174
|
-
const pool = new ConnectionPool([requestA], simulationOptions({rtt, throughput}));
|
|
175
|
-
assert.equal(pool.release(requestA), undefined);
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it('frees the connection for reissue', () => {
|
|
179
|
-
const requests = new Array(6).fill(undefined, 0, 7).map(() => request());
|
|
180
|
-
const pool = new ConnectionPool(requests, simulationOptions({rtt, throughput}));
|
|
181
|
-
requests.push(request());
|
|
182
|
-
|
|
183
|
-
requests.forEach(request => pool.acquire(request));
|
|
184
|
-
|
|
185
|
-
assert.equal(pool.connectionsInUse().length, 6);
|
|
186
|
-
assert.ok(!pool.acquire(requests[6]), 'had connection that is in use');
|
|
187
|
-
|
|
188
|
-
pool.release(requests[0]);
|
|
189
|
-
assert.equal(pool.connectionsInUse().length, 5);
|
|
190
|
-
|
|
191
|
-
assert.ok(pool.acquire(requests[6]), 'could not reissue released connection');
|
|
192
|
-
assert.ok(!pool.acquire(requests[0]), 'had connection that is in use');
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
});
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export namespace Constants {
|
|
2
|
-
export { throttling };
|
|
3
|
-
}
|
|
4
|
-
declare namespace throttling {
|
|
5
|
-
export { DEVTOOLS_RTT_ADJUSTMENT_FACTOR };
|
|
6
|
-
export { DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR };
|
|
7
|
-
export namespace mobileSlow4G {
|
|
8
|
-
const rttMs: number;
|
|
9
|
-
const throughputKbps: number;
|
|
10
|
-
const requestLatencyMs: number;
|
|
11
|
-
const downloadThroughputKbps: number;
|
|
12
|
-
const uploadThroughputKbps: number;
|
|
13
|
-
const cpuSlowdownMultiplier: number;
|
|
14
|
-
}
|
|
15
|
-
export namespace mobileRegular3G {
|
|
16
|
-
const rttMs_1: number;
|
|
17
|
-
export { rttMs_1 as rttMs };
|
|
18
|
-
const throughputKbps_1: number;
|
|
19
|
-
export { throughputKbps_1 as throughputKbps };
|
|
20
|
-
const requestLatencyMs_1: number;
|
|
21
|
-
export { requestLatencyMs_1 as requestLatencyMs };
|
|
22
|
-
const downloadThroughputKbps_1: number;
|
|
23
|
-
export { downloadThroughputKbps_1 as downloadThroughputKbps };
|
|
24
|
-
const uploadThroughputKbps_1: number;
|
|
25
|
-
export { uploadThroughputKbps_1 as uploadThroughputKbps };
|
|
26
|
-
const cpuSlowdownMultiplier_1: number;
|
|
27
|
-
export { cpuSlowdownMultiplier_1 as cpuSlowdownMultiplier };
|
|
28
|
-
}
|
|
29
|
-
export namespace desktopDense4G {
|
|
30
|
-
const rttMs_2: number;
|
|
31
|
-
export { rttMs_2 as rttMs };
|
|
32
|
-
const throughputKbps_2: number;
|
|
33
|
-
export { throughputKbps_2 as throughputKbps };
|
|
34
|
-
const cpuSlowdownMultiplier_2: number;
|
|
35
|
-
export { cpuSlowdownMultiplier_2 as cpuSlowdownMultiplier };
|
|
36
|
-
const requestLatencyMs_2: number;
|
|
37
|
-
export { requestLatencyMs_2 as requestLatencyMs };
|
|
38
|
-
const downloadThroughputKbps_2: number;
|
|
39
|
-
export { downloadThroughputKbps_2 as downloadThroughputKbps };
|
|
40
|
-
const uploadThroughputKbps_2: number;
|
|
41
|
-
export { uploadThroughputKbps_2 as uploadThroughputKbps };
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* @license
|
|
46
|
-
* Copyright 2024 Google LLC
|
|
47
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
48
|
-
*/
|
|
49
|
-
declare const DEVTOOLS_RTT_ADJUSTMENT_FACTOR: 3.75;
|
|
50
|
-
declare const DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR: 0.9;
|
|
51
|
-
export {};
|
|
52
|
-
//# sourceMappingURL=Constants.d.ts.map
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2024 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const DEVTOOLS_RTT_ADJUSTMENT_FACTOR = 3.75;
|
|
8
|
-
const DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR = 0.9;
|
|
9
|
-
|
|
10
|
-
const throttling = {
|
|
11
|
-
DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
|
|
12
|
-
DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
|
|
13
|
-
// These values align with WebPageTest's definition of "Fast 3G"
|
|
14
|
-
// But offer similar characteristics to roughly the 75th percentile of 4G connections.
|
|
15
|
-
mobileSlow4G: {
|
|
16
|
-
rttMs: 150,
|
|
17
|
-
throughputKbps: 1.6 * 1024,
|
|
18
|
-
requestLatencyMs: 150 * DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
|
|
19
|
-
downloadThroughputKbps: 1.6 * 1024 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
|
|
20
|
-
uploadThroughputKbps: 750 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
|
|
21
|
-
cpuSlowdownMultiplier: 4,
|
|
22
|
-
},
|
|
23
|
-
// These values partially align with WebPageTest's definition of "Regular 3G".
|
|
24
|
-
// These values are meant to roughly align with Chrome UX report's 3G definition which are based
|
|
25
|
-
// on HTTP RTT of 300-1400ms and downlink throughput of <700kbps.
|
|
26
|
-
mobileRegular3G: {
|
|
27
|
-
rttMs: 300,
|
|
28
|
-
throughputKbps: 700,
|
|
29
|
-
requestLatencyMs: 300 * DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
|
|
30
|
-
downloadThroughputKbps: 700 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
|
|
31
|
-
uploadThroughputKbps: 700 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
|
|
32
|
-
cpuSlowdownMultiplier: 4,
|
|
33
|
-
},
|
|
34
|
-
// Using a "broadband" connection type
|
|
35
|
-
// Corresponds to "Dense 4G 25th percentile" in https://docs.google.com/document/d/1Ft1Bnq9-t4jK5egLSOc28IL4TvR-Tt0se_1faTA4KTY/edit#heading=h.bb7nfy2x9e5v
|
|
36
|
-
desktopDense4G: {
|
|
37
|
-
rttMs: 40,
|
|
38
|
-
throughputKbps: 10 * 1024,
|
|
39
|
-
cpuSlowdownMultiplier: 1,
|
|
40
|
-
requestLatencyMs: 0, // 0 means unset
|
|
41
|
-
downloadThroughputKbps: 0,
|
|
42
|
-
uploadThroughputKbps: 0,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const Constants = {throttling};
|
|
47
|
-
|
|
48
|
-
export {Constants};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export class DNSCache {
|
|
2
|
-
/**
|
|
3
|
-
* @param {{rtt: number}} options
|
|
4
|
-
*/
|
|
5
|
-
constructor({ rtt }: {
|
|
6
|
-
rtt: number;
|
|
7
|
-
});
|
|
8
|
-
_rtt: number;
|
|
9
|
-
/** @type {Map<string, {resolvedAt: number}>} */
|
|
10
|
-
_resolvedDomainNames: Map<string, {
|
|
11
|
-
resolvedAt: number;
|
|
12
|
-
}>;
|
|
13
|
-
/**
|
|
14
|
-
* @param {Lantern.NetworkRequest} request
|
|
15
|
-
* @param {{requestedAt: number, shouldUpdateCache: boolean}=} options
|
|
16
|
-
* @return {number}
|
|
17
|
-
*/
|
|
18
|
-
getTimeUntilResolution(request: Lantern.NetworkRequest, options?: {
|
|
19
|
-
requestedAt: number;
|
|
20
|
-
shouldUpdateCache: boolean;
|
|
21
|
-
} | undefined): number;
|
|
22
|
-
/**
|
|
23
|
-
* @param {Lantern.NetworkRequest} request
|
|
24
|
-
* @param {number} resolvedAt
|
|
25
|
-
*/
|
|
26
|
-
_updateCacheResolvedAtIfNeeded(request: Lantern.NetworkRequest, resolvedAt: number): void;
|
|
27
|
-
/**
|
|
28
|
-
* Forcefully sets the DNS resolution time for a request.
|
|
29
|
-
* Useful for testing and alternate execution simulations.
|
|
30
|
-
*
|
|
31
|
-
* @param {string} domain
|
|
32
|
-
* @param {number} resolvedAt
|
|
33
|
-
*/
|
|
34
|
-
setResolvedAt(domain: string, resolvedAt: number): void;
|
|
35
|
-
}
|
|
36
|
-
export namespace DNSCache {
|
|
37
|
-
export { DNS_RESOLUTION_RTT_MULTIPLIER as RTT_MULTIPLIER };
|
|
38
|
-
}
|
|
39
|
-
import * as Lantern from '../lantern.js';
|
|
40
|
-
declare const DNS_RESOLUTION_RTT_MULTIPLIER: 2;
|
|
41
|
-
export {};
|
|
42
|
-
//# sourceMappingURL=DNSCache.d.ts.map
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2018 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as Lantern from '../lantern.js';
|
|
8
|
-
|
|
9
|
-
// A DNS lookup will usually take ~1-2 roundtrips of connection latency plus the extra DNS routing time.
|
|
10
|
-
// Example: https://www.webpagetest.org/result/180703_3A_e33ec79747c002ed4d7bcbfc81462203/1/details/#waterfall_view_step1
|
|
11
|
-
// Example: https://www.webpagetest.org/result/180707_1M_89673eb633b5d98386de95dfcf9b33d5/1/details/#waterfall_view_step1
|
|
12
|
-
// DNS is highly variable though, many times it's a little more than 1, but can easily be 4-5x RTT.
|
|
13
|
-
// We'll use 2 since it seems to give the most accurate results on average, but this can be tweaked.
|
|
14
|
-
const DNS_RESOLUTION_RTT_MULTIPLIER = 2;
|
|
15
|
-
|
|
16
|
-
class DNSCache {
|
|
17
|
-
/**
|
|
18
|
-
* @param {{rtt: number}} options
|
|
19
|
-
*/
|
|
20
|
-
constructor({rtt}) {
|
|
21
|
-
this._rtt = rtt;
|
|
22
|
-
|
|
23
|
-
/** @type {Map<string, {resolvedAt: number}>} */
|
|
24
|
-
this._resolvedDomainNames = new Map();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @param {Lantern.NetworkRequest} request
|
|
29
|
-
* @param {{requestedAt: number, shouldUpdateCache: boolean}=} options
|
|
30
|
-
* @return {number}
|
|
31
|
-
*/
|
|
32
|
-
getTimeUntilResolution(request, options) {
|
|
33
|
-
const {requestedAt = 0, shouldUpdateCache = false} = options || {};
|
|
34
|
-
|
|
35
|
-
const domain = request.parsedURL.host;
|
|
36
|
-
const cacheEntry = this._resolvedDomainNames.get(domain);
|
|
37
|
-
let timeUntilResolved = this._rtt * DNSCache.RTT_MULTIPLIER;
|
|
38
|
-
if (cacheEntry) {
|
|
39
|
-
const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);
|
|
40
|
-
timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const resolvedAt = requestedAt + timeUntilResolved;
|
|
44
|
-
if (shouldUpdateCache) this._updateCacheResolvedAtIfNeeded(request, resolvedAt);
|
|
45
|
-
|
|
46
|
-
return timeUntilResolved;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* @param {Lantern.NetworkRequest} request
|
|
51
|
-
* @param {number} resolvedAt
|
|
52
|
-
*/
|
|
53
|
-
_updateCacheResolvedAtIfNeeded(request, resolvedAt) {
|
|
54
|
-
const domain = request.parsedURL.host;
|
|
55
|
-
const cacheEntry = this._resolvedDomainNames.get(domain) || {resolvedAt};
|
|
56
|
-
cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);
|
|
57
|
-
this._resolvedDomainNames.set(domain, cacheEntry);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Forcefully sets the DNS resolution time for a request.
|
|
62
|
-
* Useful for testing and alternate execution simulations.
|
|
63
|
-
*
|
|
64
|
-
* @param {string} domain
|
|
65
|
-
* @param {number} resolvedAt
|
|
66
|
-
*/
|
|
67
|
-
setResolvedAt(domain, resolvedAt) {
|
|
68
|
-
this._resolvedDomainNames.set(domain, {resolvedAt});
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
DNSCache.RTT_MULTIPLIER = DNS_RESOLUTION_RTT_MULTIPLIER;
|
|
73
|
-
|
|
74
|
-
export {DNSCache};
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2018 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as Lantern from '../lantern.js';
|
|
8
|
-
|
|
9
|
-
const {DNSCache} = Lantern.Simulation;
|
|
10
|
-
|
|
11
|
-
const MULTIPLIER = DNSCache.RTT_MULTIPLIER;
|
|
12
|
-
|
|
13
|
-
describe('DNSCache', () => {
|
|
14
|
-
let dns;
|
|
15
|
-
let request;
|
|
16
|
-
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
dns = new DNSCache({rtt: 100});
|
|
19
|
-
request = {parsedURL: {host: 'example.com'}};
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
describe('.getTimeUntilResolution', () => {
|
|
23
|
-
it('should return the RTT multiplied', () => {
|
|
24
|
-
const resolutionTime = dns.getTimeUntilResolution(request);
|
|
25
|
-
expect(resolutionTime).toBe(100 * MULTIPLIER);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should return time with requestedAt', () => {
|
|
29
|
-
const resolutionTime = dns.getTimeUntilResolution(request, {requestedAt: 1500});
|
|
30
|
-
expect(resolutionTime).toBe(100 * MULTIPLIER);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should not cache by default', () => {
|
|
34
|
-
dns.getTimeUntilResolution(request, {requestedAt: 0});
|
|
35
|
-
const resolutionTime = dns.getTimeUntilResolution(request, {requestedAt: 1000});
|
|
36
|
-
expect(resolutionTime).toBe(100 * MULTIPLIER);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should cache when told', () => {
|
|
40
|
-
dns.getTimeUntilResolution(request, {requestedAt: 0, shouldUpdateCache: true});
|
|
41
|
-
const resolutionTime = dns.getTimeUntilResolution(request, {requestedAt: 1000});
|
|
42
|
-
expect(resolutionTime).toBe(0);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should cache by domain', () => {
|
|
46
|
-
dns.getTimeUntilResolution(request, {requestedAt: 0, shouldUpdateCache: true});
|
|
47
|
-
const otherRequest = {parsedURL: {host: 'other-example.com'}};
|
|
48
|
-
const resolutionTime = dns.getTimeUntilResolution(otherRequest, {requestedAt: 1000});
|
|
49
|
-
expect(resolutionTime).toBe(100 * MULTIPLIER);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should not update cache with later times', () => {
|
|
53
|
-
dns.getTimeUntilResolution(request, {requestedAt: 1000, shouldUpdateCache: true});
|
|
54
|
-
dns.getTimeUntilResolution(request, {requestedAt: 1500, shouldUpdateCache: true});
|
|
55
|
-
dns.getTimeUntilResolution(request, {requestedAt: 500, shouldUpdateCache: true});
|
|
56
|
-
dns.getTimeUntilResolution(request, {requestedAt: 5000, shouldUpdateCache: true});
|
|
57
|
-
|
|
58
|
-
expect(dns.getTimeUntilResolution(request, {requestedAt: 0})).toBe(100 * MULTIPLIER);
|
|
59
|
-
expect(dns.getTimeUntilResolution(request, {requestedAt: 550})).toBe(100 * MULTIPLIER - 50);
|
|
60
|
-
expect(dns.getTimeUntilResolution(request, {requestedAt: 1000})).toBe(0);
|
|
61
|
-
expect(dns.getTimeUntilResolution(request, {requestedAt: 2000})).toBe(0);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
describe('.setResolvedAt', () => {
|
|
66
|
-
it('should set the DNS resolution time for a request', () => {
|
|
67
|
-
dns.setResolvedAt(request.parsedURL.host, 123);
|
|
68
|
-
const resolutionTime = dns.getTimeUntilResolution(request);
|
|
69
|
-
expect(resolutionTime).toEqual(123);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
});
|