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.
Files changed (436) hide show
  1. package/cli/cli-flags.d.ts +2 -2
  2. package/cli/cli-flags.js +1 -1
  3. package/cli/sentry-prompt.js +2 -2
  4. package/cli/test/smokehouse/frontends/lib.d.ts +1 -1
  5. package/cli/test/smokehouse/lib/concurrent-mapper.d.ts +6 -6
  6. package/cli/test/smokehouse/lighthouse-runners/bundle.d.ts +1 -1
  7. package/cli/test/smokehouse/lighthouse-runners/cli.d.ts +1 -2
  8. package/cli/test/smokehouse/lighthouse-runners/devtools.d.ts +1 -1
  9. package/cli/test/smokehouse/report-assert.d.ts +0 -1
  10. package/cli/test/smokehouse/version-check.d.ts +3 -3
  11. package/core/audits/accessibility/accesskeys.d.ts +3 -3
  12. package/core/audits/accessibility/aria-allowed-attr.d.ts +3 -3
  13. package/core/audits/accessibility/aria-allowed-role.d.ts +3 -3
  14. package/core/audits/accessibility/aria-command-name.d.ts +3 -3
  15. package/core/audits/accessibility/aria-conditional-attr.d.ts +3 -3
  16. package/core/audits/accessibility/aria-deprecated-role.d.ts +3 -3
  17. package/core/audits/accessibility/aria-dialog-name.d.ts +3 -3
  18. package/core/audits/accessibility/aria-hidden-body.d.ts +3 -3
  19. package/core/audits/accessibility/aria-hidden-focus.d.ts +3 -3
  20. package/core/audits/accessibility/aria-input-field-name.d.ts +3 -3
  21. package/core/audits/accessibility/aria-meter-name.d.ts +3 -3
  22. package/core/audits/accessibility/aria-progressbar-name.d.ts +3 -3
  23. package/core/audits/accessibility/aria-prohibited-attr.d.ts +3 -3
  24. package/core/audits/accessibility/aria-required-attr.d.ts +3 -3
  25. package/core/audits/accessibility/aria-required-children.d.ts +3 -3
  26. package/core/audits/accessibility/aria-required-parent.d.ts +3 -3
  27. package/core/audits/accessibility/aria-roles.d.ts +3 -3
  28. package/core/audits/accessibility/aria-text.d.ts +3 -3
  29. package/core/audits/accessibility/aria-toggle-field-name.d.ts +3 -3
  30. package/core/audits/accessibility/aria-tooltip-name.d.ts +3 -3
  31. package/core/audits/accessibility/aria-treeitem-name.d.ts +3 -3
  32. package/core/audits/accessibility/aria-valid-attr-value.d.ts +3 -3
  33. package/core/audits/accessibility/aria-valid-attr.d.ts +3 -3
  34. package/core/audits/accessibility/axe-audit.d.ts +1 -1
  35. package/core/audits/accessibility/button-name.d.ts +3 -3
  36. package/core/audits/accessibility/bypass.d.ts +3 -3
  37. package/core/audits/accessibility/color-contrast.d.ts +3 -3
  38. package/core/audits/accessibility/definition-list.d.ts +3 -3
  39. package/core/audits/accessibility/dlitem.d.ts +3 -3
  40. package/core/audits/accessibility/document-title.d.ts +3 -3
  41. package/core/audits/accessibility/duplicate-id-aria.d.ts +3 -3
  42. package/core/audits/accessibility/empty-heading.d.ts +3 -3
  43. package/core/audits/accessibility/form-field-multiple-labels.d.ts +3 -3
  44. package/core/audits/accessibility/frame-title.d.ts +3 -3
  45. package/core/audits/accessibility/heading-order.d.ts +3 -3
  46. package/core/audits/accessibility/html-has-lang.d.ts +3 -3
  47. package/core/audits/accessibility/html-lang-valid.d.ts +3 -3
  48. package/core/audits/accessibility/html-xml-lang-mismatch.d.ts +3 -3
  49. package/core/audits/accessibility/identical-links-same-purpose.d.ts +3 -3
  50. package/core/audits/accessibility/image-alt.d.ts +3 -3
  51. package/core/audits/accessibility/image-redundant-alt.d.ts +3 -3
  52. package/core/audits/accessibility/input-button-name.d.ts +3 -3
  53. package/core/audits/accessibility/input-image-alt.d.ts +3 -3
  54. package/core/audits/accessibility/label-content-name-mismatch.d.ts +3 -3
  55. package/core/audits/accessibility/label.d.ts +3 -3
  56. package/core/audits/accessibility/landmark-one-main.d.ts +3 -3
  57. package/core/audits/accessibility/link-in-text-block.d.ts +3 -3
  58. package/core/audits/accessibility/link-name.d.ts +3 -3
  59. package/core/audits/accessibility/list.d.ts +3 -3
  60. package/core/audits/accessibility/listitem.d.ts +3 -3
  61. package/core/audits/accessibility/meta-refresh.d.ts +3 -3
  62. package/core/audits/accessibility/meta-viewport.d.ts +3 -3
  63. package/core/audits/accessibility/object-alt.d.ts +3 -3
  64. package/core/audits/accessibility/select-name.d.ts +3 -3
  65. package/core/audits/accessibility/skip-link.d.ts +3 -3
  66. package/core/audits/accessibility/tabindex.d.ts +3 -3
  67. package/core/audits/accessibility/table-duplicate-name.d.ts +3 -3
  68. package/core/audits/accessibility/table-fake-caption.d.ts +3 -3
  69. package/core/audits/accessibility/target-size.d.ts +3 -3
  70. package/core/audits/accessibility/td-has-header.d.ts +3 -3
  71. package/core/audits/accessibility/td-headers-attr.d.ts +3 -3
  72. package/core/audits/accessibility/th-has-data-cells.d.ts +3 -3
  73. package/core/audits/accessibility/valid-lang.d.ts +3 -3
  74. package/core/audits/accessibility/video-caption.d.ts +3 -3
  75. package/core/audits/audit.d.ts +17 -17
  76. package/core/audits/autocomplete.d.ts +9 -9
  77. package/core/audits/bf-cache.d.ts +10 -10
  78. package/core/audits/bootup-time.d.ts +7 -7
  79. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +6 -8
  80. package/core/audits/byte-efficiency/byte-efficiency-audit.js +3 -6
  81. package/core/audits/byte-efficiency/duplicated-javascript.d.ts +4 -4
  82. package/core/audits/byte-efficiency/efficient-animated-content.d.ts +3 -4
  83. package/core/audits/byte-efficiency/legacy-javascript.d.ts +7 -8
  84. package/core/audits/byte-efficiency/modern-image-formats.d.ts +3 -3
  85. package/core/audits/byte-efficiency/offscreen-images.d.ts +3 -4
  86. package/core/audits/byte-efficiency/render-blocking-resources.d.ts +5 -9
  87. package/core/audits/byte-efficiency/render-blocking-resources.js +10 -16
  88. package/core/audits/byte-efficiency/total-byte-weight.d.ts +4 -4
  89. package/core/audits/byte-efficiency/unminified-css.d.ts +3 -3
  90. package/core/audits/byte-efficiency/unminified-javascript.d.ts +3 -3
  91. package/core/audits/byte-efficiency/unused-css-rules.d.ts +3 -3
  92. package/core/audits/byte-efficiency/unused-javascript.d.ts +3 -3
  93. package/core/audits/byte-efficiency/uses-long-cache-ttl.d.ts +4 -6
  94. package/core/audits/byte-efficiency/uses-optimized-images.d.ts +3 -3
  95. package/core/audits/byte-efficiency/uses-responsive-images-snapshot.d.ts +4 -4
  96. package/core/audits/byte-efficiency/uses-responsive-images.d.ts +4 -5
  97. package/core/audits/byte-efficiency/uses-text-compression.d.ts +3 -3
  98. package/core/audits/critical-request-chains.d.ts +3 -3
  99. package/core/audits/csp-xss.d.ts +8 -8
  100. package/core/audits/deprecations.d.ts +6 -6
  101. package/core/audits/dobetterweb/charset.d.ts +3 -3
  102. package/core/audits/dobetterweb/doctype.d.ts +9 -9
  103. package/core/audits/dobetterweb/dom-size.d.ts +9 -9
  104. package/core/audits/dobetterweb/geolocation-on-start.d.ts +3 -3
  105. package/core/audits/dobetterweb/inspector-issues.d.ts +6 -6
  106. package/core/audits/dobetterweb/js-libraries.d.ts +3 -3
  107. package/core/audits/dobetterweb/no-document-write.d.ts +3 -3
  108. package/core/audits/dobetterweb/notification-on-start.d.ts +3 -3
  109. package/core/audits/dobetterweb/paste-preventing-inputs.d.ts +3 -3
  110. package/core/audits/dobetterweb/uses-http2.d.ts +7 -11
  111. package/core/audits/dobetterweb/uses-http2.js +2 -5
  112. package/core/audits/dobetterweb/uses-passive-event-listeners.d.ts +3 -3
  113. package/core/audits/errors-in-console.d.ts +4 -4
  114. package/core/audits/font-display.d.ts +4 -4
  115. package/core/audits/image-aspect-ratio.d.ts +5 -5
  116. package/core/audits/image-size-responsive.d.ts +7 -7
  117. package/core/audits/is-on-https.d.ts +10 -10
  118. package/core/audits/largest-contentful-paint-element.d.ts +9 -9
  119. package/core/audits/layout-shifts.d.ts +9 -9
  120. package/core/audits/lcp-lazy-loaded.d.ts +3 -3
  121. package/core/audits/long-tasks.d.ts +11 -11
  122. package/core/audits/long-tasks.js +5 -5
  123. package/core/audits/mainthread-work-breakdown.d.ts +5 -5
  124. package/core/audits/metrics/cumulative-layout-shift.d.ts +1 -1
  125. package/core/audits/metrics/first-contentful-paint.d.ts +1 -1
  126. package/core/audits/metrics/first-meaningful-paint.d.ts +1 -1
  127. package/core/audits/metrics/interaction-to-next-paint.d.ts +1 -1
  128. package/core/audits/metrics/interactive.d.ts +1 -1
  129. package/core/audits/metrics/largest-contentful-paint.d.ts +1 -1
  130. package/core/audits/metrics/max-potential-fid.d.ts +2 -4
  131. package/core/audits/metrics/speed-index.d.ts +1 -1
  132. package/core/audits/metrics/total-blocking-time.d.ts +1 -1
  133. package/core/audits/network-rtt.d.ts +2 -2
  134. package/core/audits/network-server-latency.d.ts +2 -2
  135. package/core/audits/non-composited-animations.d.ts +9 -9
  136. package/core/audits/oopif-iframe-test-audit.d.ts +5 -5
  137. package/core/audits/preload-fonts.d.ts +3 -3
  138. package/core/audits/prioritize-lcp-image.d.ts +7 -7
  139. package/core/audits/redirects-http.d.ts +3 -3
  140. package/core/audits/redirects.d.ts +2 -3
  141. package/core/audits/resource-summary.d.ts +1 -1
  142. package/core/audits/screenshot-thumbnails.d.ts +2 -3
  143. package/core/audits/script-treemap-data.d.ts +1 -1
  144. package/core/audits/seo/canonical.d.ts +8 -8
  145. package/core/audits/seo/crawlable-anchors.d.ts +4 -4
  146. package/core/audits/seo/font-size.d.ts +11 -11
  147. package/core/audits/seo/hreflang.d.ts +6 -6
  148. package/core/audits/seo/http-status-code.d.ts +3 -3
  149. package/core/audits/seo/is-crawlable.d.ts +9 -10
  150. package/core/audits/seo/link-text.d.ts +4 -4
  151. package/core/audits/seo/manual/structured-data.d.ts +2 -2
  152. package/core/audits/seo/meta-description.d.ts +4 -4
  153. package/core/audits/seo/robots-txt.d.ts +6 -6
  154. package/core/audits/server-response-time.d.ts +4 -4
  155. package/core/audits/third-party-cookies.d.ts +4 -4
  156. package/core/audits/third-party-facades.d.ts +11 -12
  157. package/core/audits/third-party-summary.d.ts +5 -6
  158. package/core/audits/third-party-summary.js +7 -4
  159. package/core/audits/unsized-images.d.ts +3 -3
  160. package/core/audits/user-timings.d.ts +6 -6
  161. package/core/audits/uses-rel-preconnect.d.ts +5 -5
  162. package/core/audits/uses-rel-preload.d.ts +7 -7
  163. package/core/audits/uses-rel-preload.js +8 -6
  164. package/core/audits/valid-source-maps.d.ts +6 -7
  165. package/core/audits/viewport.d.ts +4 -4
  166. package/core/audits/work-during-interaction.d.ts +11 -12
  167. package/core/computed/computed-artifact.d.ts +2 -2
  168. package/core/computed/critical-request-chains.d.ts +9 -11
  169. package/core/computed/critical-request-chains.js +6 -6
  170. package/core/computed/document-urls.d.ts +3 -8
  171. package/core/computed/document-urls.js +1 -1
  172. package/core/computed/entity-classification.d.ts +6 -8
  173. package/core/computed/image-records.d.ts +3 -5
  174. package/core/computed/js-bundles.d.ts +2 -4
  175. package/core/computed/lcp-image-record.d.ts +3 -5
  176. package/core/computed/load-simulator.d.ts +7 -11
  177. package/core/computed/load-simulator.js +1 -1
  178. package/core/computed/main-resource.d.ts +5 -7
  179. package/core/computed/main-resource.js +1 -1
  180. package/core/computed/main-thread-tasks.d.ts +1 -3
  181. package/core/computed/metrics/cumulative-layout-shift.d.ts +2 -14
  182. package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -3
  183. package/core/computed/metrics/first-contentful-paint.d.ts +1 -3
  184. package/core/computed/metrics/interactive.d.ts +1 -3
  185. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +3 -7
  186. package/core/computed/metrics/lantern-first-contentful-paint.js +3 -5
  187. package/core/computed/metrics/lantern-interactive.d.ts +3 -7
  188. package/core/computed/metrics/lantern-interactive.js +3 -5
  189. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +3 -7
  190. package/core/computed/metrics/lantern-largest-contentful-paint.js +3 -5
  191. package/core/computed/metrics/lantern-max-potential-fid.d.ts +3 -7
  192. package/core/computed/metrics/lantern-max-potential-fid.js +3 -5
  193. package/core/computed/metrics/lantern-metric.d.ts +8 -8
  194. package/core/computed/metrics/lantern-metric.js +1 -1
  195. package/core/computed/metrics/lantern-speed-index.d.ts +3 -7
  196. package/core/computed/metrics/lantern-speed-index.js +3 -5
  197. package/core/computed/metrics/lantern-total-blocking-time.d.ts +3 -7
  198. package/core/computed/metrics/lantern-total-blocking-time.js +1 -3
  199. package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -3
  200. package/core/computed/metrics/largest-contentful-paint.d.ts +1 -3
  201. package/core/computed/metrics/lcp-breakdown.d.ts +3 -9
  202. package/core/computed/metrics/max-potential-fid.d.ts +1 -3
  203. package/core/computed/metrics/responsiveness.d.ts +7 -10
  204. package/core/computed/metrics/speed-index.d.ts +1 -3
  205. package/core/computed/metrics/time-to-first-byte.d.ts +1 -3
  206. package/core/computed/metrics/timing-summary.d.ts +8 -13
  207. package/core/computed/metrics/total-blocking-time.d.ts +1 -3
  208. package/core/computed/metrics/total-blocking-time.js +1 -1
  209. package/core/computed/module-duplication.d.ts +2 -8
  210. package/core/computed/navigation-insights.d.ts +2 -4
  211. package/core/computed/network-analysis.d.ts +2 -4
  212. package/core/computed/network-analysis.js +1 -1
  213. package/core/computed/network-records.d.ts +1 -3
  214. package/core/computed/page-dependency-graph.d.ts +9 -14
  215. package/core/computed/page-dependency-graph.js +3 -4
  216. package/core/computed/processed-navigation.d.ts +2 -5
  217. package/core/computed/processed-trace.d.ts +1 -3
  218. package/core/computed/resource-summary.d.ts +6 -10
  219. package/core/computed/screenshots.d.ts +1 -6
  220. package/core/computed/speedline.d.ts +1 -3
  221. package/core/computed/tbt-impact-tasks.d.ts +4 -5
  222. package/core/computed/tbt-impact-tasks.js +31 -8
  223. package/core/computed/trace-engine-result.d.ts +1 -3
  224. package/core/computed/trace-engine-result.js +10 -1
  225. package/core/computed/unused-css.d.ts +7 -9
  226. package/core/computed/unused-javascript-summary.d.ts +3 -5
  227. package/core/computed/user-timings.d.ts +3 -5
  228. package/core/computed/viewport-meta.d.ts +7 -9
  229. package/core/config/config-helpers.d.ts +5 -5
  230. package/core/config/config.d.ts +3 -3
  231. package/core/config/constants.d.ts +6 -6
  232. package/core/config/filters.d.ts +8 -8
  233. package/core/config/validation.d.ts +1 -1
  234. package/core/gather/driver/environment.d.ts +5 -5
  235. package/core/gather/driver/environment.js +1 -1
  236. package/core/gather/driver/execution-context.d.ts +6 -6
  237. package/core/gather/driver/navigation.d.ts +3 -3
  238. package/core/gather/driver/network-monitor.d.ts +6 -6
  239. package/core/gather/driver/storage.d.ts +4 -4
  240. package/core/gather/driver/target-manager.d.ts +4 -5
  241. package/core/gather/driver/target-manager.js +1 -1
  242. package/core/gather/driver/wait-for-condition.d.ts +3 -3
  243. package/core/gather/driver/wait-for-condition.js +4 -4
  244. package/core/gather/driver.d.ts +1 -1
  245. package/core/gather/gatherers/accessibility.d.ts +1 -1
  246. package/core/gather/gatherers/anchor-elements.d.ts +1 -1
  247. package/core/gather/gatherers/bf-cache-failures.d.ts +3 -3
  248. package/core/gather/gatherers/cache-contents.d.ts +1 -1
  249. package/core/gather/gatherers/console-messages.d.ts +1 -1
  250. package/core/gather/gatherers/css-usage.d.ts +1 -1
  251. package/core/gather/gatherers/devtools-log-compat.d.ts +3 -3
  252. package/core/gather/gatherers/devtools-log.d.ts +3 -3
  253. package/core/gather/gatherers/dobetterweb/doctype.d.ts +1 -1
  254. package/core/gather/gatherers/dobetterweb/domstats.d.ts +1 -1
  255. package/core/gather/gatherers/dobetterweb/optimized-images.d.ts +6 -7
  256. package/core/gather/gatherers/dobetterweb/response-compression.d.ts +4 -5
  257. package/core/gather/gatherers/full-page-screenshot.d.ts +3 -3
  258. package/core/gather/gatherers/iframe-elements.d.ts +1 -1
  259. package/core/gather/gatherers/image-elements.d.ts +1 -1
  260. package/core/gather/gatherers/inputs.d.ts +1 -1
  261. package/core/gather/gatherers/inspector-issues.d.ts +2 -2
  262. package/core/gather/gatherers/js-usage.d.ts +1 -1
  263. package/core/gather/gatherers/link-elements.d.ts +6 -10
  264. package/core/gather/gatherers/link-elements.js +5 -12
  265. package/core/gather/gatherers/main-document-content.d.ts +2 -2
  266. package/core/gather/gatherers/meta-elements.d.ts +1 -1
  267. package/core/gather/gatherers/network-user-agent.d.ts +4 -4
  268. package/core/gather/gatherers/root-causes.d.ts +3 -4
  269. package/core/gather/gatherers/seo/font-size.d.ts +19 -19
  270. package/core/gather/gatherers/seo/robots-txt.d.ts +1 -1
  271. package/core/gather/gatherers/source-maps.d.ts +2 -2
  272. package/core/gather/gatherers/stacks.d.ts +2 -2
  273. package/core/gather/gatherers/stylesheets.d.ts +1 -9
  274. package/core/gather/gatherers/stylesheets.js +8 -39
  275. package/core/gather/gatherers/trace-compat.d.ts +3 -3
  276. package/core/gather/gatherers/trace-elements.d.ts +4 -6
  277. package/core/gather/navigation-runner.d.ts +3 -4
  278. package/core/gather/runner-helpers.d.ts +3 -3
  279. package/core/gather/session.d.ts +4 -4
  280. package/core/gather/session.js +1 -1
  281. package/core/gather/snapshot-runner.d.ts +2 -2
  282. package/core/gather/timespan-runner.d.ts +3 -3
  283. package/core/index.d.cts +1 -7
  284. package/core/index.d.ts +6 -6
  285. package/core/lib/arbitrary-equality-map.d.ts +2 -2
  286. package/core/lib/asset-saver.d.ts +3 -3
  287. package/core/lib/asset-saver.js +1 -1
  288. package/core/lib/bf-cache-strings.d.ts +117 -117
  289. package/core/lib/cdt/Platform.d.ts +1 -1
  290. package/core/lib/cdt/SDK.d.ts +1 -1
  291. package/core/lib/cdt/generated/ParsedURL.js +2 -2
  292. package/core/lib/cdt/generated/SourceMap.d.ts +11 -11
  293. package/core/lib/cdt/generated/SourceMap.js +3 -3
  294. package/core/lib/csp-evaluator.d.ts +20 -20
  295. package/core/lib/deprecation-description.d.ts +3 -3
  296. package/core/lib/deprecations-strings.d.ts +112 -112
  297. package/core/lib/i18n/i18n.d.ts +48 -48
  298. package/core/lib/icons.d.ts +3 -3
  299. package/core/lib/lantern/lantern.d.ts +2 -19
  300. package/core/lib/lantern/lantern.js +2 -45
  301. package/core/lib/lantern-trace-saver.d.ts +5 -7
  302. package/core/lib/lantern-trace-saver.js +2 -3
  303. package/core/lib/lh-error.d.ts +87 -87
  304. package/core/lib/lighthouse-compatibility.d.ts +1 -1
  305. package/core/lib/manifest-parser.d.ts +1 -1
  306. package/core/lib/minify-devtoolslog.d.ts +1 -1
  307. package/core/lib/navigation-error.d.ts +4 -6
  308. package/core/lib/navigation-error.js +2 -2
  309. package/core/lib/network-recorder.js +1 -1
  310. package/core/lib/network-request.d.ts +5 -5
  311. package/core/lib/network-request.js +2 -2
  312. package/core/lib/page-functions.d.ts +2 -2
  313. package/core/lib/script-helpers.d.ts +0 -1
  314. package/core/lib/sentry.d.ts +8 -8
  315. package/core/lib/stack-packs.d.ts +1 -1
  316. package/core/lib/trace-engine.d.ts +2 -2
  317. package/core/lib/tracehouse/cpu-profile-model.d.ts +8 -8
  318. package/core/lib/tracehouse/cpu-profile-model.js +2 -2
  319. package/core/lib/tracehouse/main-thread-tasks.d.ts +5 -5
  320. package/core/lib/tracehouse/task-groups.d.ts +6 -38
  321. package/core/lib/tracehouse/task-summary.d.ts +0 -1
  322. package/core/lib/tracehouse/trace-processor.d.ts +9 -9
  323. package/core/lib/traces/metric-trace-events.d.ts +1 -1
  324. package/core/lib/url-utils.d.ts +4 -4
  325. package/core/runner.d.ts +3 -4
  326. package/core/runner.js +0 -1
  327. package/core/scoring.d.ts +0 -1
  328. package/core/user-flow.d.ts +5 -5
  329. package/dist/report/bundle.esm.js +1 -1
  330. package/dist/report/flow.js +1 -1
  331. package/dist/report/standalone.js +1 -1
  332. package/eslint-local-rules.d.cts +4 -1
  333. package/flow-report/src/i18n/localized-strings.d.ts +1 -1
  334. package/flow-report/src/i18n/ui-strings.d.ts +43 -43
  335. package/package.json +7 -7
  336. package/readme.md +0 -2
  337. package/report/generator/file-namer.d.ts +2 -2
  338. package/report/generator/flow-report-assets.d.ts +1 -1
  339. package/report/generator/report-generator.d.ts +4 -4
  340. package/report/renderer/api.d.ts +2 -5
  341. package/report/renderer/category-renderer.d.ts +8 -8
  342. package/report/renderer/components.d.ts +2 -2
  343. package/report/renderer/crc-details-renderer.d.ts +2 -2
  344. package/report/renderer/details-renderer.d.ts +7 -7
  345. package/report/renderer/dom.d.ts +7 -7
  346. package/report/renderer/drop-down-menu.d.ts +1 -1
  347. package/report/renderer/drop-down-menu.js +15 -17
  348. package/report/renderer/element-screenshot-renderer.d.ts +3 -3
  349. package/report/renderer/explodey-gauge.d.ts +2 -2
  350. package/report/renderer/features-util.d.ts +1 -1
  351. package/report/renderer/performance-category-renderer.d.ts +1 -1
  352. package/report/renderer/report-globals.d.ts +1 -1
  353. package/report/renderer/report-renderer.d.ts +1 -1
  354. package/report/renderer/report-ui-features.d.ts +1 -1
  355. package/report/renderer/report-utils.d.ts +62 -62
  356. package/report/renderer/snippet-renderer.d.ts +9 -9
  357. package/report/renderer/swap-locale-feature.d.ts +2 -2
  358. package/report/renderer/topbar-features.d.ts +2 -2
  359. package/report/types/augment-dom.d.ts +0 -11
  360. package/shared/localization/format.d.ts +3 -3
  361. package/shared/localization/locales/en-US.json +1 -1
  362. package/shared/localization/locales/en-XL.json +1 -1
  363. package/shared/localization/locales.d.ts +1 -1
  364. package/shared/type-verifiers.d.ts +1 -1
  365. package/shared/util.d.ts +6 -6
  366. package/tsconfig.json +1 -11
  367. package/types/artifacts.d.ts +4 -4
  368. package/types/gatherer.d.ts +4 -5
  369. package/types/internal/node.d.ts +0 -6
  370. package/types/internal/query-selector.d.ts +2 -2
  371. package/core/lib/lantern/BaseNode.d.ts +0 -163
  372. package/core/lib/lantern/BaseNode.js +0 -369
  373. package/core/lib/lantern/BaseNode.test.js +0 -385
  374. package/core/lib/lantern/CpuNode.d.ts +0 -43
  375. package/core/lib/lantern/CpuNode.js +0 -99
  376. package/core/lib/lantern/LanternError.d.ts +0 -8
  377. package/core/lib/lantern/LanternError.js +0 -9
  378. package/core/lib/lantern/Metric.d.ts +0 -69
  379. package/core/lib/lantern/Metric.js +0 -137
  380. package/core/lib/lantern/NetworkNode.d.ts +0 -49
  381. package/core/lib/lantern/NetworkNode.js +0 -136
  382. package/core/lib/lantern/PageDependencyGraph.d.ts +0 -82
  383. package/core/lib/lantern/PageDependencyGraph.js +0 -610
  384. package/core/lib/lantern/PageDependencyGraph.test.js +0 -654
  385. package/core/lib/lantern/TBTUtils.d.ts +0 -44
  386. package/core/lib/lantern/TBTUtils.js +0 -76
  387. package/core/lib/lantern/TBTUtils.test.d.ts +0 -2
  388. package/core/lib/lantern/TBTUtils.test.js +0 -130
  389. package/core/lib/lantern/TraceEngineComputationData.d.ts +0 -25
  390. package/core/lib/lantern/TraceEngineComputationData.js +0 -466
  391. package/core/lib/lantern/metrics/FirstContentfulPaint.d.ts +0 -79
  392. package/core/lib/lantern/metrics/FirstContentfulPaint.js +0 -198
  393. package/core/lib/lantern/metrics/FirstContentfulPaint.test.js +0 -54
  394. package/core/lib/lantern/metrics/Interactive.d.ts +0 -20
  395. package/core/lib/lantern/metrics/Interactive.js +0 -109
  396. package/core/lib/lantern/metrics/Interactive.test.js +0 -56
  397. package/core/lib/lantern/metrics/LargestContentfulPaint.d.ts +0 -19
  398. package/core/lib/lantern/metrics/LargestContentfulPaint.js +0 -105
  399. package/core/lib/lantern/metrics/LargestContentfulPaint.test.js +0 -42
  400. package/core/lib/lantern/metrics/MaxPotentialFID.d.ts +0 -24
  401. package/core/lib/lantern/metrics/MaxPotentialFID.js +0 -91
  402. package/core/lib/lantern/metrics/MetricTestUtils.d.ts +0 -19
  403. package/core/lib/lantern/metrics/MetricTestUtils.js +0 -48
  404. package/core/lib/lantern/metrics/SpeedIndex.d.ts +0 -32
  405. package/core/lib/lantern/metrics/SpeedIndex.js +0 -142
  406. package/core/lib/lantern/metrics/SpeedIndex.test.js +0 -83
  407. package/core/lib/lantern/metrics/TotalBlockingTime.d.ts +0 -25
  408. package/core/lib/lantern/metrics/TotalBlockingTime.js +0 -125
  409. package/core/lib/lantern/metrics/__snapshots__/FirstContentfulPaint.test.js.snap +0 -11
  410. package/core/lib/lantern/metrics/__snapshots__/Interactive.test.js.snap +0 -17
  411. package/core/lib/lantern/metrics/metrics.d.ts +0 -9
  412. package/core/lib/lantern/metrics/metrics.js +0 -16
  413. package/core/lib/lantern/simulation/ConnectionPool.d.ts +0 -48
  414. package/core/lib/lantern/simulation/ConnectionPool.js +0 -152
  415. package/core/lib/lantern/simulation/ConnectionPool.test.js +0 -195
  416. package/core/lib/lantern/simulation/Constants.d.ts +0 -52
  417. package/core/lib/lantern/simulation/Constants.js +0 -48
  418. package/core/lib/lantern/simulation/DNSCache.d.ts +0 -42
  419. package/core/lib/lantern/simulation/DNSCache.js +0 -74
  420. package/core/lib/lantern/simulation/DNSCache.test.js +0 -72
  421. package/core/lib/lantern/simulation/NetworkAnalyzer.d.ts +0 -209
  422. package/core/lib/lantern/simulation/NetworkAnalyzer.js +0 -597
  423. package/core/lib/lantern/simulation/NetworkAnalyzer.test.js +0 -475
  424. package/core/lib/lantern/simulation/SimulationTimingMap.d.ts +0 -153
  425. package/core/lib/lantern/simulation/SimulationTimingMap.js +0 -219
  426. package/core/lib/lantern/simulation/Simulator.d.ts +0 -157
  427. package/core/lib/lantern/simulation/Simulator.js +0 -593
  428. package/core/lib/lantern/simulation/Simulator.test.js +0 -434
  429. package/core/lib/lantern/simulation/TCPConnection.test.d.ts +0 -2
  430. package/core/lib/lantern/simulation/TCPConnection.test.js +0 -374
  431. package/core/lib/lantern/simulation/TcpConnection.d.ts +0 -89
  432. package/core/lib/lantern/simulation/TcpConnection.js +0 -230
  433. package/core/lib/lantern/simulation/simulation.d.ts +0 -21
  434. package/core/lib/lantern/simulation/simulation.js +0 -28
  435. package/core/lib/lantern/types/lantern.d.ts +0 -256
  436. package/core/lib/lantern/types/lantern.js +0 -7
@@ -1,597 +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 UrlUtils from '../../url-utils.js';
9
-
10
- const INITIAL_CWD = 14 * 1024;
11
-
12
- // Assume that 40% of TTFB was server response time by default for static assets
13
- const DEFAULT_SERVER_RESPONSE_PERCENTAGE = 0.4;
14
-
15
- /**
16
- * For certain resource types, server response time takes up a greater percentage of TTFB (dynamic
17
- * assets like HTML documents, XHR/API calls, etc)
18
- * @type {Partial<Record<Lantern.ResourceType, number>>}
19
- */
20
- const SERVER_RESPONSE_PERCENTAGE_OF_TTFB = {
21
- Document: 0.9,
22
- XHR: 0.9,
23
- Fetch: 0.9,
24
- };
25
-
26
- class NetworkAnalyzer {
27
- /**
28
- * @return {string}
29
- */
30
- static get SUMMARY() {
31
- return '__SUMMARY__';
32
- }
33
-
34
- /**
35
- * @param {Lantern.NetworkRequest[]} records
36
- * @return {Map<string, Lantern.NetworkRequest[]>}
37
- */
38
- static groupByOrigin(records) {
39
- const grouped = new Map();
40
- records.forEach(item => {
41
- const key = item.parsedURL.securityOrigin;
42
- const group = grouped.get(key) || [];
43
- group.push(item);
44
- grouped.set(key, group);
45
- });
46
- return grouped;
47
- }
48
-
49
- /**
50
- * @param {number[]} values
51
- * @return {Summary}
52
- */
53
- static getSummary(values) {
54
- values.sort((a, b) => a - b);
55
-
56
- let median;
57
- if (values.length === 0) {
58
- median = values[0];
59
- } else if (values.length % 2 === 0) {
60
- const a = values[Math.floor((values.length - 1) / 2)];
61
- const b = values[Math.floor((values.length - 1) / 2) + 1];
62
- median = (a + b) / 2;
63
- } else {
64
- median = values[Math.floor((values.length - 1) / 2)];
65
- }
66
-
67
- return {
68
- min: values[0],
69
- max: values[values.length - 1],
70
- avg: values.reduce((a, b) => a + b, 0) / values.length,
71
- median,
72
- };
73
- }
74
-
75
- /**
76
- * @param {Map<string,number[]>} values
77
- * @return {Map<string, Summary>}
78
- */
79
- static summarize(values) {
80
- const summaryByKey = new Map();
81
- const allEstimates = [];
82
- for (const [key, estimates] of values) {
83
- summaryByKey.set(key, NetworkAnalyzer.getSummary(estimates));
84
- allEstimates.push(...estimates);
85
- }
86
-
87
- summaryByKey.set(NetworkAnalyzer.SUMMARY, NetworkAnalyzer.getSummary(allEstimates));
88
- return summaryByKey;
89
- }
90
-
91
- /** @typedef {{request: Lantern.NetworkRequest, timing: Lantern.ResourceTiming, connectionReused?: boolean}} RequestInfo */
92
-
93
- /**
94
- * @param {Lantern.NetworkRequest[]} requests
95
- * @param {(e: RequestInfo) => number | number[] | undefined} iteratee
96
- * @return {Map<string, number[]>}
97
- */
98
- static _estimateValueByOrigin(requests, iteratee) {
99
- const connectionWasReused = NetworkAnalyzer.estimateIfConnectionWasReused(requests);
100
- const groupedByOrigin = NetworkAnalyzer.groupByOrigin(requests);
101
-
102
- const estimates = new Map();
103
- for (const [origin, originRequests] of groupedByOrigin.entries()) {
104
- /** @type {number[]} */
105
- let originEstimates = [];
106
-
107
- for (const request of originRequests) {
108
- const timing = request.timing;
109
- if (!timing) continue;
110
-
111
- const value = iteratee({
112
- request,
113
- timing,
114
- connectionReused: connectionWasReused.get(request.requestId),
115
- });
116
- if (typeof value !== 'undefined') {
117
- originEstimates = originEstimates.concat(value);
118
- }
119
- }
120
-
121
- if (!originEstimates.length) continue;
122
- estimates.set(origin, originEstimates);
123
- }
124
-
125
- return estimates;
126
- }
127
-
128
- /**
129
- * Estimates the observed RTT to each origin based on how long the connection setup.
130
- * For h1 and h2, this could includes two estimates - one for the TCP handshake, another for
131
- * SSL negotiation.
132
- * For h3, we get only one estimate since QUIC establishes a secure connection in a
133
- * single handshake.
134
- * This is the most accurate and preferred method of measurement when the data is available.
135
- *
136
- * @param {RequestInfo} info
137
- * @return {number[]|number|undefined}
138
- */
139
- static _estimateRTTViaConnectionTiming(info) {
140
- const {timing, connectionReused, request} = info;
141
- if (connectionReused) return;
142
-
143
- const {connectStart, sslStart, sslEnd, connectEnd} = timing;
144
- if (connectEnd >= 0 && connectStart >= 0 && request.protocol.startsWith('h3')) {
145
- // These values are equal to sslStart and sslEnd for h3.
146
- return connectEnd - connectStart;
147
- } else if (sslStart >= 0 && sslEnd >= 0 && sslStart !== connectStart) {
148
- // SSL can also be more than 1 RT but assume False Start was used.
149
- return [connectEnd - sslStart, sslStart - connectStart];
150
- } else if (connectStart >= 0 && connectEnd >= 0) {
151
- return connectEnd - connectStart;
152
- }
153
- }
154
-
155
- /**
156
- * Estimates the observed RTT to each origin based on how long a download took on a fresh connection.
157
- * NOTE: this will tend to overestimate the actual RTT quite significantly as the download can be
158
- * slow for other reasons as well such as bandwidth constraints.
159
- *
160
- * @param {RequestInfo} info
161
- * @return {number|undefined}
162
- */
163
- static _estimateRTTViaDownloadTiming(info) {
164
- const {timing, connectionReused, request} = info;
165
- if (connectionReused) return;
166
-
167
- // Only look at downloads that went past the initial congestion window
168
- if (request.transferSize <= INITIAL_CWD) return;
169
- if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return;
170
-
171
- // Compute the amount of time downloading everything after the first congestion window took
172
- const totalTime = request.networkEndTime - request.networkRequestTime;
173
- const downloadTimeAfterFirstByte = totalTime - timing.receiveHeadersEnd;
174
- const numberOfRoundTrips = Math.log2(request.transferSize / INITIAL_CWD);
175
-
176
- // Ignore requests that required a high number of round trips since bandwidth starts to play
177
- // a larger role than latency
178
- if (numberOfRoundTrips > 5) return;
179
-
180
- return downloadTimeAfterFirstByte / numberOfRoundTrips;
181
- }
182
-
183
- /**
184
- * Estimates the observed RTT to each origin based on how long it took until Chrome could
185
- * start sending the actual request when a new connection was required.
186
- * NOTE: this will tend to overestimate the actual RTT as the request can be delayed for other
187
- * reasons as well such as more SSL handshakes if TLS False Start is not enabled.
188
- *
189
- * @param {RequestInfo} info
190
- * @return {number|undefined}
191
- */
192
- static _estimateRTTViaSendStartTiming(info) {
193
- const {timing, connectionReused, request} = info;
194
- if (connectionReused) return;
195
-
196
- if (!Number.isFinite(timing.sendStart) || timing.sendStart < 0) return;
197
-
198
- // Assume everything before sendStart was just DNS + (SSL)? + TCP handshake
199
- // 1 RT for DNS, 1 RT (maybe) for SSL, 1 RT for TCP
200
- let roundTrips = 1;
201
- if (!request.protocol.startsWith('h3')) roundTrips += 1; // TCP
202
- if (request.parsedURL.scheme === 'https') roundTrips += 1;
203
- return timing.sendStart / roundTrips;
204
- }
205
-
206
- /**
207
- * Estimates the observed RTT to each origin based on how long it took until Chrome received the
208
- * headers of the response (~TTFB).
209
- * NOTE: this is the most inaccurate way to estimate the RTT, but in some environments it's all
210
- * we have access to :(
211
- *
212
- * @param {RequestInfo} info
213
- * @return {number|undefined}
214
- */
215
- static _estimateRTTViaHeadersEndTiming(info) {
216
- const {timing, connectionReused, request} = info;
217
- if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return;
218
- if (!request.resourceType) return;
219
-
220
- const serverResponseTimePercentage =
221
- SERVER_RESPONSE_PERCENTAGE_OF_TTFB[request.resourceType] ||
222
- DEFAULT_SERVER_RESPONSE_PERCENTAGE;
223
- const estimatedServerResponseTime = timing.receiveHeadersEnd * serverResponseTimePercentage;
224
-
225
- // When connection was reused...
226
- // TTFB = 1 RT for request + server response time
227
- let roundTrips = 1;
228
-
229
- // When connection was fresh...
230
- // TTFB = DNS + (SSL)? + TCP handshake + 1 RT for request + server response time
231
- if (!connectionReused) {
232
- roundTrips += 1; // DNS
233
- if (!request.protocol.startsWith('h3')) roundTrips += 1; // TCP
234
- if (request.parsedURL.scheme === 'https') roundTrips += 1; // SSL
235
- }
236
-
237
- // subtract out our estimated server response time
238
- return Math.max((timing.receiveHeadersEnd - estimatedServerResponseTime) / roundTrips, 3);
239
- }
240
-
241
- /**
242
- * Given the RTT to each origin, estimates the observed server response times.
243
- *
244
- * @param {Lantern.NetworkRequest[]} records
245
- * @param {Map<string, number>} rttByOrigin
246
- * @return {Map<string, number[]>}
247
- */
248
- static _estimateResponseTimeByOrigin(records, rttByOrigin) {
249
- return NetworkAnalyzer._estimateValueByOrigin(records, ({request, timing}) => {
250
- if (request.serverResponseTime !== undefined) return request.serverResponseTime;
251
-
252
- if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return;
253
- if (!Number.isFinite(timing.sendEnd) || timing.sendEnd < 0) return;
254
-
255
- const ttfb = timing.receiveHeadersEnd - timing.sendEnd;
256
- const origin = request.parsedURL.securityOrigin;
257
- const rtt = rttByOrigin.get(origin) || rttByOrigin.get(NetworkAnalyzer.SUMMARY) || 0;
258
- return Math.max(ttfb - rtt, 0);
259
- });
260
- }
261
-
262
- /**
263
- * @param {Lantern.NetworkRequest[]} requests
264
- * @return {boolean}
265
- */
266
- static canTrustConnectionInformation(requests) {
267
- const connectionIdWasStarted = new Map();
268
- for (const request of requests) {
269
- const started = connectionIdWasStarted.get(request.connectionId) || !request.connectionReused;
270
- connectionIdWasStarted.set(request.connectionId, started);
271
- }
272
-
273
- // We probably can't trust the network information if all the connection IDs were the same
274
- if (connectionIdWasStarted.size <= 1) return false;
275
- // Or if there were connections that were always reused (a connection had to have started at some point)
276
- return Array.from(connectionIdWasStarted.values()).every(started => started);
277
- }
278
-
279
- /**
280
- * Returns a map of requestId -> connectionReused, estimating the information if the information
281
- * available in the records themselves appears untrustworthy.
282
- *
283
- * @param {Lantern.NetworkRequest[]} records
284
- * @param {{forceCoarseEstimates: boolean}} [options]
285
- * @return {Map<string, boolean>}
286
- */
287
- static estimateIfConnectionWasReused(records, options) {
288
- const {forceCoarseEstimates = false} = options || {};
289
-
290
- // Check if we can trust the connection information coming from the protocol
291
- if (!forceCoarseEstimates && NetworkAnalyzer.canTrustConnectionInformation(records)) {
292
- return new Map(records.map(request => [request.requestId, !!request.connectionReused]));
293
- }
294
-
295
- // Otherwise we're on our own, a request may not have needed a fresh connection if...
296
- // - It was not the first request to the domain
297
- // - It was H2
298
- // - It was after the first request to the domain ended
299
- const connectionWasReused = new Map();
300
- const groupedByOrigin = NetworkAnalyzer.groupByOrigin(records);
301
- for (const [_, originRecords] of groupedByOrigin.entries()) {
302
- const earliestReusePossible = originRecords
303
- .map(request => request.networkEndTime)
304
- .reduce((a, b) => Math.min(a, b), Infinity);
305
-
306
- for (const request of originRecords) {
307
- connectionWasReused.set(
308
- request.requestId,
309
- request.networkRequestTime >= earliestReusePossible || request.protocol === 'h2'
310
- );
311
- }
312
-
313
- const firstRecord = originRecords.reduce((a, b) => {
314
- return a.networkRequestTime > b.networkRequestTime ? b : a;
315
- });
316
- connectionWasReused.set(firstRecord.requestId, false);
317
- }
318
-
319
- return connectionWasReused;
320
- }
321
-
322
- /**
323
- * Estimates the RTT to each origin by examining observed network timing information.
324
- * Attempts to use the most accurate information first and falls back to coarser estimates when it
325
- * is unavailable.
326
- *
327
- * @param {Lantern.NetworkRequest[]} records
328
- * @param {RTTEstimateOptions} [options]
329
- * @return {Map<string, Summary>}
330
- */
331
- static estimateRTTByOrigin(records, options) {
332
- const {
333
- forceCoarseEstimates = false,
334
- // coarse estimates include lots of extra time and noise
335
- // multiply by some factor to deflate the estimates a bit.
336
- coarseEstimateMultiplier = 0.3,
337
- useDownloadEstimates = true,
338
- useSendStartEstimates = true,
339
- useHeadersEndEstimates = true,
340
- } = options || {};
341
-
342
- const connectionWasReused = NetworkAnalyzer.estimateIfConnectionWasReused(records);
343
- const groupedByOrigin = NetworkAnalyzer.groupByOrigin(records);
344
-
345
- const estimatesByOrigin = new Map();
346
- for (const [origin, originRequests] of groupedByOrigin.entries()) {
347
- /** @type {number[]} */
348
- const originEstimates = [];
349
-
350
- /**
351
- * @param {(e: RequestInfo) => number[]|number|undefined} estimator
352
- */
353
- // eslint-disable-next-line no-inner-declarations
354
- function collectEstimates(estimator, multiplier = 1) {
355
- for (const request of originRequests) {
356
- const timing = request.timing;
357
- if (!timing) continue;
358
-
359
- const estimates = estimator({
360
- request,
361
- timing,
362
- connectionReused: connectionWasReused.get(request.requestId),
363
- });
364
- if (estimates === undefined) continue;
365
-
366
- if (!Array.isArray(estimates)) {
367
- originEstimates.push(estimates * multiplier);
368
- } else {
369
- originEstimates.push(...estimates.map(e => e * multiplier));
370
- }
371
- }
372
- }
373
-
374
- if (!forceCoarseEstimates) {
375
- collectEstimates(this._estimateRTTViaConnectionTiming);
376
- }
377
-
378
- // Connection timing can be missing for a few reasons:
379
- // - Origin was preconnected, which we don't have instrumentation for.
380
- // - Trace began recording after a connection has already been established (for example, in timespan mode)
381
- // - Perhaps Chrome established a connection already in the background (service worker? Just guessing here)
382
- // - Not provided in LR netstack.
383
- if (!originEstimates.length) {
384
- if (useDownloadEstimates) {
385
- collectEstimates(this._estimateRTTViaDownloadTiming, coarseEstimateMultiplier);
386
- }
387
- if (useSendStartEstimates) {
388
- collectEstimates(this._estimateRTTViaSendStartTiming, coarseEstimateMultiplier);
389
- }
390
- if (useHeadersEndEstimates) {
391
- collectEstimates(this._estimateRTTViaHeadersEndTiming, coarseEstimateMultiplier);
392
- }
393
- }
394
-
395
- if (originEstimates.length) {
396
- estimatesByOrigin.set(origin, originEstimates);
397
- }
398
- }
399
-
400
- if (!estimatesByOrigin.size) throw new Error('No timing information available');
401
- return NetworkAnalyzer.summarize(estimatesByOrigin);
402
- }
403
-
404
- /**
405
- * Estimates the server response time of each origin. RTT times can be passed in or will be
406
- * estimated automatically if not provided.
407
- *
408
- * @param {Lantern.NetworkRequest[]} records
409
- * @param {RTTEstimateOptions & {rttByOrigin?: Map<string, number>}} [options]
410
- * @return {Map<string, Summary>}
411
- */
412
- static estimateServerResponseTimeByOrigin(records, options) {
413
- let rttByOrigin = (options || {}).rttByOrigin;
414
- if (!rttByOrigin) {
415
- /** @type {Map<string, number>} */
416
- rttByOrigin = new Map();
417
-
418
- const rttSummaryByOrigin = NetworkAnalyzer.estimateRTTByOrigin(records, options);
419
- for (const [origin, summary] of rttSummaryByOrigin.entries()) {
420
- rttByOrigin.set(origin, summary.min);
421
- }
422
- }
423
-
424
- const estimatesByOrigin = NetworkAnalyzer._estimateResponseTimeByOrigin(records, rttByOrigin);
425
- return NetworkAnalyzer.summarize(estimatesByOrigin);
426
- }
427
-
428
-
429
- /**
430
- * Computes the average throughput for the given requests in bits/second.
431
- * Excludes data URI, failed or otherwise incomplete, and cached requests.
432
- * Returns Infinity if there were no analyzable network requests.
433
- *
434
- * @param {Lantern.NetworkRequest[]} records
435
- * @return {number}
436
- */
437
- static estimateThroughput(records) {
438
- let totalBytes = 0;
439
-
440
- // We will measure throughput by summing the total bytes downloaded by the total time spent
441
- // downloading those bytes. We slice up all the network requests into start/end boundaries, so
442
- // it's easier to deal with the gaps in downloading.
443
- const timeBoundaries = records.reduce((boundaries, request) => {
444
- const scheme = request.parsedURL?.scheme;
445
- // Requests whose bodies didn't come over the network or didn't completely finish will mess
446
- // with the computation, just skip over them.
447
- if (scheme === 'data' || request.failed || !request.finished ||
448
- request.statusCode > 300 || !request.transferSize) {
449
- return boundaries;
450
- }
451
-
452
- // If we've made it this far, all the times we need should be valid (i.e. not undefined/-1).
453
- totalBytes += request.transferSize;
454
- boundaries.push({time: request.responseHeadersEndTime / 1000, isStart: true});
455
- boundaries.push({time: request.networkEndTime / 1000, isStart: false});
456
- return boundaries;
457
- }, /** @type {Array<{time: number, isStart: boolean}>} */([])).sort((a, b) => a.time - b.time);
458
-
459
- if (!timeBoundaries.length) {
460
- return Infinity;
461
- }
462
-
463
- let inflight = 0;
464
- let currentStart = 0;
465
- let totalDuration = 0;
466
-
467
- timeBoundaries.forEach(boundary => {
468
- if (boundary.isStart) {
469
- if (inflight === 0) {
470
- // We just ended a quiet period, keep track of when the download period started
471
- currentStart = boundary.time;
472
- }
473
- inflight++;
474
- } else {
475
- inflight--;
476
- if (inflight === 0) {
477
- // We just entered a quiet period, update our duration with the time we spent downloading
478
- totalDuration += boundary.time - currentStart;
479
- }
480
- }
481
- });
482
-
483
- return totalBytes * 8 / totalDuration;
484
- }
485
-
486
- /**
487
- * @param {Lantern.NetworkRequest[]} records
488
- */
489
- static computeRTTAndServerResponseTime(records) {
490
- // First pass compute the estimated observed RTT to each origin's servers.
491
- /** @type {Map<string, number>} */
492
- const rttByOrigin = new Map();
493
- for (const [origin, summary] of NetworkAnalyzer.estimateRTTByOrigin(records).entries()) {
494
- rttByOrigin.set(origin, summary.min);
495
- }
496
-
497
- // We'll use the minimum RTT as the assumed connection latency since we care about how much addt'l
498
- // latency each origin introduces as Lantern will be simulating with its own connection latency.
499
- const minimumRtt = Math.min(...Array.from(rttByOrigin.values()));
500
- // We'll use the observed RTT information to help estimate the server response time
501
- const responseTimeSummaries = NetworkAnalyzer.estimateServerResponseTimeByOrigin(records, {
502
- rttByOrigin,
503
- });
504
-
505
- /** @type {Map<string, number>} */
506
- const additionalRttByOrigin = new Map();
507
- /** @type {Map<string, number>} */
508
- const serverResponseTimeByOrigin = new Map();
509
- for (const [origin, summary] of responseTimeSummaries.entries()) {
510
- // Not all origins have usable timing data, we'll default to using no additional latency.
511
- const rttForOrigin = rttByOrigin.get(origin) || minimumRtt;
512
- additionalRttByOrigin.set(origin, rttForOrigin - minimumRtt);
513
- serverResponseTimeByOrigin.set(origin, summary.median);
514
- }
515
-
516
- return {
517
- rtt: minimumRtt,
518
- additionalRttByOrigin,
519
- serverResponseTimeByOrigin,
520
- };
521
- }
522
-
523
- /**
524
- * @param {Lantern.NetworkRequest[]} records
525
- * @return {Lantern.Simulation.Settings['networkAnalysis']}
526
- */
527
- static analyze(records) {
528
- const throughput = NetworkAnalyzer.estimateThroughput(records);
529
- return {
530
- throughput,
531
- ...NetworkAnalyzer.computeRTTAndServerResponseTime(records),
532
- };
533
- }
534
-
535
- /**
536
- * @template {Lantern.NetworkRequest} T
537
- * @param {Array<T>} records
538
- * @param {string} resourceUrl
539
- * @return {T|undefined}
540
- */
541
- static findResourceForUrl(records, resourceUrl) {
542
- // equalWithExcludedFragments is expensive, so check that the resourceUrl starts with the request url first
543
- return records.find(request =>
544
- resourceUrl.startsWith(request.url) &&
545
- UrlUtils.equalWithExcludedFragments(request.url, resourceUrl)
546
- );
547
- }
548
-
549
- /**
550
- * @template {Lantern.NetworkRequest} T
551
- * @param {Array<T>} records
552
- * @param {string} resourceUrl
553
- * @return {T|undefined}
554
- */
555
- static findLastDocumentForUrl(records, resourceUrl) {
556
- // equalWithExcludedFragments is expensive, so check that the resourceUrl starts with the request url first
557
- const matchingRequests = records.filter(request =>
558
- request.resourceType === 'Document' &&
559
- // Note: `request.url` should never have a fragment, else this optimization gives wrong results.
560
- resourceUrl.startsWith(request.url) &&
561
- UrlUtils.equalWithExcludedFragments(request.url, resourceUrl)
562
- );
563
- return matchingRequests[matchingRequests.length - 1];
564
- }
565
-
566
- /**
567
- * Resolves redirect chain given a main document.
568
- * See: {@link NetworkAnalyzer.findLastDocumentForUrl}) for how to retrieve main document.
569
- *
570
- * @template {Lantern.NetworkRequest} T
571
- * @param {T} request
572
- * @return {T}
573
- */
574
- static resolveRedirects(request) {
575
- while (request.redirectDestination) request = /** @type {T} */(request.redirectDestination);
576
- return request;
577
- }
578
- }
579
-
580
- export {NetworkAnalyzer};
581
-
582
- /**
583
- * @typedef Summary
584
- * @property {number} min
585
- * @property {number} max
586
- * @property {number} avg
587
- * @property {number} median
588
- */
589
-
590
- /**
591
- * @typedef RTTEstimateOptions
592
- * @property {boolean} [forceCoarseEstimates] TCP connection handshake information will be used when available, but in some circumstances this data can be unreliable. This flag exposes an option to ignore the handshake data and use the coarse download/TTFB timing data.
593
- * @property {number} [coarseEstimateMultiplier] Coarse estimates include lots of extra time and noise multiply by some factor to deflate the estimates a bit.
594
- * @property {boolean} [useDownloadEstimates] Useful for testing to isolate the different methods of estimation.
595
- * @property {boolean} [useSendStartEstimates] Useful for testing to isolate the different methods of estimation.
596
- * @property {boolean} [useHeadersEndEstimates] Useful for testing to isolate the different methods of estimation.
597
- */