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,593 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2017 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import * as Lantern from '../lantern.js';
8
- import {TcpConnection} from './TcpConnection.js';
9
- import {ConnectionPool} from './ConnectionPool.js';
10
- import {DNSCache} from './DNSCache.js';
11
- import {SimulatorTimingMap} from './SimulationTimingMap.js';
12
-
13
- const Constants = Lantern.Simulation.Constants;
14
- const defaultThrottling = Constants.throttling.mobileSlow4G;
15
-
16
- /** @typedef {import('../BaseNode.js').Node} Node */
17
- /** @typedef {import('../NetworkNode.js').NetworkNode} NetworkNode */
18
- /** @typedef {import('../CpuNode.js').CPUNode} CpuNode */
19
- /** @typedef {import('./SimulationTimingMap.js').CpuNodeTimingComplete | import('./SimulationTimingMap.js').NetworkNodeTimingComplete} CompleteNodeTiming */
20
- /** @typedef {import('./SimulationTimingMap.js').ConnectionTiming} ConnectionTiming */
21
-
22
- // see https://cs.chromium.org/search/?q=kDefaultMaxNumDelayableRequestsPerClient&sq=package:chromium&type=cs
23
- const DEFAULT_MAXIMUM_CONCURRENT_REQUESTS = 10;
24
- // layout tasks tend to be less CPU-bound and do not experience the same increase in duration
25
- const DEFAULT_LAYOUT_TASK_MULTIPLIER = 0.5;
26
- // if a task takes more than 10 seconds it's usually a sign it isn't actually CPU bound and we're overestimating
27
- const DEFAULT_MAXIMUM_CPU_TASK_DURATION = 10000;
28
-
29
- const NodeState = {
30
- NotReadyToStart: 0,
31
- ReadyToStart: 1,
32
- InProgress: 2,
33
- Complete: 3,
34
- };
35
-
36
- /** @type {Record<NetworkNode['request']['priority'], number>} */
37
- const PriorityStartTimePenalty = {
38
- VeryHigh: 0,
39
- High: 0.25,
40
- Medium: 0.5,
41
- Low: 1,
42
- VeryLow: 2,
43
- };
44
-
45
- /** @type {Map<string, Map<Node, CompleteNodeTiming>>} */
46
- const ALL_SIMULATION_NODE_TIMINGS = new Map();
47
-
48
- /**
49
- * @template [T=any]
50
- */
51
- class Simulator {
52
- /**
53
- * @param {Lantern.Simulation.Settings} settings
54
- */
55
- static createSimulator(settings) {
56
- const {throttlingMethod, throttling, precomputedLanternData, networkAnalysis} = settings;
57
-
58
- /** @type {Lantern.Simulation.Options} */
59
- const options = {
60
- additionalRttByOrigin: networkAnalysis.additionalRttByOrigin,
61
- serverResponseTimeByOrigin: networkAnalysis.serverResponseTimeByOrigin,
62
- observedThroughput: networkAnalysis.throughput,
63
- };
64
-
65
- // If we have precomputed lantern data, overwrite our observed estimates and use precomputed instead
66
- // for increased stability.
67
- if (precomputedLanternData) {
68
- options.additionalRttByOrigin = new Map(Object.entries(
69
- precomputedLanternData.additionalRttByOrigin));
70
- options.serverResponseTimeByOrigin = new Map(Object.entries(
71
- precomputedLanternData.serverResponseTimeByOrigin));
72
- }
73
-
74
- switch (throttlingMethod) {
75
- case 'provided':
76
- options.rtt = networkAnalysis.rtt;
77
- options.throughput = networkAnalysis.throughput;
78
- options.cpuSlowdownMultiplier = 1;
79
- options.layoutTaskMultiplier = 1;
80
- break;
81
- case 'devtools':
82
- if (throttling) {
83
- options.rtt =
84
- throttling.requestLatencyMs / Constants.throttling.DEVTOOLS_RTT_ADJUSTMENT_FACTOR;
85
- options.throughput =
86
- throttling.downloadThroughputKbps * 1024 /
87
- Constants.throttling.DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR;
88
- }
89
-
90
- options.cpuSlowdownMultiplier = 1;
91
- options.layoutTaskMultiplier = 1;
92
- break;
93
- case 'simulate':
94
- if (throttling) {
95
- options.rtt = throttling.rttMs;
96
- options.throughput = throttling.throughputKbps * 1024;
97
- options.cpuSlowdownMultiplier = throttling.cpuSlowdownMultiplier;
98
- }
99
- break;
100
- default:
101
- // intentionally fallback to simulator defaults
102
- break;
103
- }
104
-
105
- return new Simulator(options);
106
- }
107
-
108
- /**
109
- * @param {Lantern.Simulation.Options} [options]
110
- */
111
- constructor(options) {
112
- /** @type {Required<Lantern.Simulation.Options>} */
113
- this._options = Object.assign(
114
- {
115
- rtt: defaultThrottling.rttMs,
116
- throughput: defaultThrottling.throughputKbps * 1024,
117
- maximumConcurrentRequests: DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
118
- cpuSlowdownMultiplier: defaultThrottling.cpuSlowdownMultiplier,
119
- layoutTaskMultiplier: DEFAULT_LAYOUT_TASK_MULTIPLIER,
120
- additionalRttByOrigin: new Map(),
121
- serverResponseTimeByOrigin: new Map(),
122
- },
123
- options
124
- );
125
-
126
- this._rtt = this._options.rtt;
127
- this._throughput = this._options.throughput;
128
- this._maximumConcurrentRequests = Math.max(Math.min(
129
- TcpConnection.maximumSaturatedConnections(this._rtt, this._throughput),
130
- this._options.maximumConcurrentRequests
131
- ), 1);
132
- this._cpuSlowdownMultiplier = this._options.cpuSlowdownMultiplier;
133
- this._layoutTaskMultiplier = this._cpuSlowdownMultiplier * this._options.layoutTaskMultiplier;
134
- /** @type {Array<Node>} */
135
- this._cachedNodeListByStartPosition = [];
136
-
137
- // Properties reset on every `.simulate` call but duplicated here for type checking
138
- this._nodeTimings = new SimulatorTimingMap();
139
- /** @type {Map<string, number>} */
140
- this._numberInProgressByType = new Map();
141
- /** @type {Record<number, Set<Node>>} */
142
- this._nodes = {};
143
- this._dns = new DNSCache({rtt: this._rtt});
144
- /** @type {ConnectionPool} */
145
- // @ts-expect-error
146
- this._connectionPool = null;
147
-
148
- if (!Number.isFinite(this._rtt)) throw new Error(`Invalid rtt ${this._rtt}`);
149
- if (!Number.isFinite(this._throughput)) throw new Error(`Invalid rtt ${this._throughput}`);
150
- }
151
-
152
- /** @return {number} */
153
- get rtt() {
154
- return this._rtt;
155
- }
156
-
157
- /**
158
- * @param {Node} graph
159
- */
160
- _initializeConnectionPool(graph) {
161
- /** @type {Lantern.NetworkRequest[]} */
162
- const records = [];
163
- graph.getRootNode().traverse(node => {
164
- if (node.type === Lantern.BaseNode.TYPES.NETWORK) {
165
- records.push(node.request);
166
- }
167
- });
168
-
169
- this._connectionPool = new ConnectionPool(records, this._options);
170
- }
171
-
172
- /**
173
- * Initializes the various state data structures such _nodeTimings and the _node Sets by state.
174
- */
175
- _initializeAuxiliaryData() {
176
- this._nodeTimings = new SimulatorTimingMap();
177
- this._numberInProgressByType = new Map();
178
-
179
- this._nodes = {};
180
- this._cachedNodeListByStartPosition = [];
181
- // NOTE: We don't actually need *all* of these sets, but the clarity that each node progresses
182
- // through the system is quite nice.
183
- for (const state of Object.values(NodeState)) {
184
- this._nodes[state] = new Set();
185
- }
186
- }
187
-
188
- /**
189
- * @param {string} type
190
- * @return {number}
191
- */
192
- _numberInProgress(type) {
193
- return this._numberInProgressByType.get(type) || 0;
194
- }
195
-
196
- /**
197
- * @param {Node} node
198
- * @param {number} queuedTime
199
- */
200
- _markNodeAsReadyToStart(node, queuedTime) {
201
- const nodeStartPosition = Simulator._computeNodeStartPosition(node);
202
- const firstNodeIndexWithGreaterStartPosition = this._cachedNodeListByStartPosition
203
- .findIndex(candidate => Simulator._computeNodeStartPosition(candidate) > nodeStartPosition);
204
- const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ?
205
- this._cachedNodeListByStartPosition.length : firstNodeIndexWithGreaterStartPosition;
206
- this._cachedNodeListByStartPosition.splice(insertionIndex, 0, node);
207
-
208
- this._nodes[NodeState.ReadyToStart].add(node);
209
- this._nodes[NodeState.NotReadyToStart].delete(node);
210
- this._nodeTimings.setReadyToStart(node, {queuedTime});
211
- }
212
-
213
- /**
214
- * @param {Node} node
215
- * @param {number} startTime
216
- */
217
- _markNodeAsInProgress(node, startTime) {
218
- const indexOfNodeToStart = this._cachedNodeListByStartPosition.indexOf(node);
219
- this._cachedNodeListByStartPosition.splice(indexOfNodeToStart, 1);
220
-
221
- this._nodes[NodeState.InProgress].add(node);
222
- this._nodes[NodeState.ReadyToStart].delete(node);
223
- this._numberInProgressByType.set(node.type, this._numberInProgress(node.type) + 1);
224
- this._nodeTimings.setInProgress(node, {startTime});
225
- }
226
-
227
- /**
228
- * @param {Node} node
229
- * @param {number} endTime
230
- * @param {ConnectionTiming} [connectionTiming] Optional network connection information.
231
- */
232
- _markNodeAsComplete(node, endTime, connectionTiming) {
233
- this._nodes[NodeState.Complete].add(node);
234
- this._nodes[NodeState.InProgress].delete(node);
235
- this._numberInProgressByType.set(node.type, this._numberInProgress(node.type) - 1);
236
- this._nodeTimings.setCompleted(node, {endTime, connectionTiming});
237
-
238
- // Try to add all its dependents to the queue
239
- for (const dependent of node.getDependents()) {
240
- // Skip dependent node if one of its dependencies hasn't finished yet
241
- const dependencies = dependent.getDependencies();
242
- if (dependencies.some(dep => !this._nodes[NodeState.Complete].has(dep))) continue;
243
-
244
- // Otherwise add it to the queue
245
- this._markNodeAsReadyToStart(dependent, endTime);
246
- }
247
- }
248
-
249
- /**
250
- * @param {Lantern.NetworkRequest} request
251
- * @return {?TcpConnection}
252
- */
253
- _acquireConnection(request) {
254
- return this._connectionPool.acquire(request);
255
- }
256
-
257
- /**
258
- * @return {Node[]}
259
- */
260
- _getNodesSortedByStartPosition() {
261
- // Make a copy so we don't skip nodes due to concurrent modification
262
- return Array.from(this._cachedNodeListByStartPosition);
263
- }
264
-
265
- /**
266
- * @param {Node} node
267
- * @param {number} totalElapsedTime
268
- */
269
- _startNodeIfPossible(node, totalElapsedTime) {
270
- if (node.type === Lantern.BaseNode.TYPES.CPU) {
271
- // Start a CPU task if there's no other CPU task in process
272
- if (this._numberInProgress(node.type) === 0) {
273
- this._markNodeAsInProgress(node, totalElapsedTime);
274
- }
275
-
276
- return;
277
- }
278
-
279
- if (node.type !== Lantern.BaseNode.TYPES.NETWORK) throw new Error('Unsupported');
280
-
281
- // If a network request is connectionless, we can always start it, so skip the connection checks
282
- if (!node.isConnectionless) {
283
- // Start a network request if we're not at max requests and a connection is available
284
- const numberOfActiveRequests = this._numberInProgress(node.type);
285
- if (numberOfActiveRequests >= this._maximumConcurrentRequests) return;
286
- const connection = this._acquireConnection(node.request);
287
- if (!connection) return;
288
- }
289
-
290
- this._markNodeAsInProgress(node, totalElapsedTime);
291
- }
292
-
293
- /**
294
- * Updates each connection in use with the available throughput based on the number of network requests
295
- * currently in flight.
296
- */
297
- _updateNetworkCapacity() {
298
- const inFlight = this._numberInProgress(Lantern.BaseNode.TYPES.NETWORK);
299
- if (inFlight === 0) return;
300
-
301
- for (const connection of this._connectionPool.connectionsInUse()) {
302
- connection.setThroughput(this._throughput / inFlight);
303
- }
304
- }
305
-
306
- /**
307
- * Estimates the number of milliseconds remaining given current condidtions before the node is complete.
308
- * @param {Node} node
309
- * @return {number}
310
- */
311
- _estimateTimeRemaining(node) {
312
- if (node.type === Lantern.BaseNode.TYPES.CPU) {
313
- return this._estimateCPUTimeRemaining(node);
314
- } else if (node.type === Lantern.BaseNode.TYPES.NETWORK) {
315
- return this._estimateNetworkTimeRemaining(node);
316
- } else {
317
- throw new Error('Unsupported');
318
- }
319
- }
320
-
321
- /**
322
- * @param {CpuNode} cpuNode
323
- * @return {number}
324
- */
325
- _estimateCPUTimeRemaining(cpuNode) {
326
- const timingData = this._nodeTimings.getCpuStarted(cpuNode);
327
- const multiplier = cpuNode.didPerformLayout()
328
- ? this._layoutTaskMultiplier
329
- : this._cpuSlowdownMultiplier;
330
- const totalDuration = Math.min(
331
- Math.round(cpuNode.duration / 1000 * multiplier),
332
- DEFAULT_MAXIMUM_CPU_TASK_DURATION
333
- );
334
- const estimatedTimeElapsed = totalDuration - timingData.timeElapsed;
335
- this._nodeTimings.setCpuEstimated(cpuNode, {estimatedTimeElapsed});
336
- return estimatedTimeElapsed;
337
- }
338
-
339
- /**
340
- * @param {NetworkNode} networkNode
341
- * @return {number}
342
- */
343
- _estimateNetworkTimeRemaining(networkNode) {
344
- const request = networkNode.request;
345
- const timingData = this._nodeTimings.getNetworkStarted(networkNode);
346
-
347
- let timeElapsed = 0;
348
- if (networkNode.fromDiskCache) {
349
- // Rough access time for seeking to location on disk and reading sequentially.
350
- // 8ms per seek + 20ms/MB
351
- // @see http://norvig.com/21-days.html#answers
352
- const sizeInMb = (request.resourceSize || 0) / 1024 / 1024;
353
- timeElapsed = 8 + 20 * sizeInMb - timingData.timeElapsed;
354
- } else if (networkNode.isNonNetworkProtocol) {
355
- // Estimates for the overhead of a data URL in Chromium and the decoding time for base64-encoded data.
356
- // 2ms per request + 10ms/MB
357
- // @see traces on https://dopiaza.org/tools/datauri/examples/index.php
358
- const sizeInMb = (request.resourceSize || 0) / 1024 / 1024;
359
- timeElapsed = 2 + 10 * sizeInMb - timingData.timeElapsed;
360
- } else {
361
- const connection = this._connectionPool.acquireActiveConnectionFromRequest(request);
362
- const dnsResolutionTime = this._dns.getTimeUntilResolution(request, {
363
- requestedAt: timingData.startTime,
364
- shouldUpdateCache: true,
365
- });
366
- const timeAlreadyElapsed = timingData.timeElapsed;
367
- const calculation = connection.simulateDownloadUntil(
368
- request.transferSize - timingData.bytesDownloaded,
369
- {timeAlreadyElapsed, dnsResolutionTime, maximumTimeToElapse: Infinity}
370
- );
371
-
372
- timeElapsed = calculation.timeElapsed;
373
- }
374
-
375
- const estimatedTimeElapsed = timeElapsed + timingData.timeElapsedOvershoot;
376
- this._nodeTimings.setNetworkEstimated(networkNode, {estimatedTimeElapsed});
377
- return estimatedTimeElapsed;
378
- }
379
-
380
- /**
381
- * Computes and returns the minimum estimated completion time of the nodes currently in progress.
382
- * @return {number}
383
- */
384
- _findNextNodeCompletionTime() {
385
- let minimumTime = Infinity;
386
- for (const node of this._nodes[NodeState.InProgress]) {
387
- minimumTime = Math.min(minimumTime, this._estimateTimeRemaining(node));
388
- }
389
-
390
- return minimumTime;
391
- }
392
-
393
- /**
394
- * Given a time period, computes the progress toward completion that the node made durin that time.
395
- * @param {Node} node
396
- * @param {number} timePeriodLength
397
- * @param {number} totalElapsedTime
398
- */
399
- _updateProgressMadeInTimePeriod(node, timePeriodLength, totalElapsedTime) {
400
- const timingData = this._nodeTimings.getInProgress(node);
401
- const isFinished = timingData.estimatedTimeElapsed === timePeriodLength;
402
-
403
- if (node.type === Lantern.BaseNode.TYPES.CPU || node.isConnectionless) {
404
- return isFinished
405
- ? this._markNodeAsComplete(node, totalElapsedTime)
406
- : (timingData.timeElapsed += timePeriodLength);
407
- }
408
-
409
- if (node.type !== Lantern.BaseNode.TYPES.NETWORK) throw new Error('Unsupported');
410
- if (!('bytesDownloaded' in timingData)) throw new Error('Invalid timing data');
411
-
412
- const request = node.request;
413
- const connection = this._connectionPool.acquireActiveConnectionFromRequest(request);
414
- const dnsResolutionTime = this._dns.getTimeUntilResolution(request, {
415
- requestedAt: timingData.startTime,
416
- shouldUpdateCache: true,
417
- });
418
- const calculation = connection.simulateDownloadUntil(
419
- request.transferSize - timingData.bytesDownloaded,
420
- {
421
- dnsResolutionTime,
422
- timeAlreadyElapsed: timingData.timeElapsed,
423
- maximumTimeToElapse: timePeriodLength - timingData.timeElapsedOvershoot,
424
- }
425
- );
426
-
427
- connection.setCongestionWindow(calculation.congestionWindow);
428
- connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
429
-
430
- if (isFinished) {
431
- connection.setWarmed(true);
432
- this._connectionPool.release(request);
433
- this._markNodeAsComplete(node, totalElapsedTime, calculation.connectionTiming);
434
- } else {
435
- timingData.timeElapsed += calculation.timeElapsed;
436
- timingData.timeElapsedOvershoot += calculation.timeElapsed - timePeriodLength;
437
- timingData.bytesDownloaded += calculation.bytesDownloaded;
438
- }
439
- }
440
-
441
- /**
442
- * @return {{nodeTimings: Map<Node, Lantern.Simulation.NodeTiming>, completeNodeTimings: Map<Node, CompleteNodeTiming>}}
443
- */
444
- _computeFinalNodeTimings() {
445
- /** @type {Array<[Node, CompleteNodeTiming]>} */
446
- const completeNodeTimingEntries = this._nodeTimings.getNodes().map(node => {
447
- return [node, this._nodeTimings.getCompleted(node)];
448
- });
449
-
450
- // Most consumers will want the entries sorted by startTime, so insert them in that order
451
- completeNodeTimingEntries.sort((a, b) => a[1].startTime - b[1].startTime);
452
-
453
- // Trimmed version of type `Lantern.Simulation.NodeTiming`.
454
- /** @type {Array<[Node, Lantern.Simulation.NodeTiming]>} */
455
- const nodeTimingEntries = completeNodeTimingEntries.map(([node, timing]) => {
456
- return [node, {
457
- startTime: timing.startTime,
458
- endTime: timing.endTime,
459
- duration: timing.endTime - timing.startTime,
460
- }];
461
- });
462
-
463
- return {
464
- nodeTimings: new Map(nodeTimingEntries),
465
- completeNodeTimings: new Map(completeNodeTimingEntries),
466
- };
467
- }
468
-
469
- /**
470
- * @return {Required<Lantern.Simulation.Options>}
471
- */
472
- getOptions() {
473
- return this._options;
474
- }
475
-
476
- /**
477
- * Estimates the time taken to process all of the graph's nodes, returns the overall time along with
478
- * each node annotated by start/end times.
479
- *
480
- * Simulator/connection pool are allowed to deviate from what was
481
- * observed in the trace/devtoolsLog and start requests as soon as they are queued (i.e. do not
482
- * wait around for a warm connection to be available if the original request was fetched on a warm
483
- * connection).
484
- *
485
- * @param {Node} graph
486
- * @param {{label?: string}=} options
487
- * @return {Lantern.Simulation.Result<T>}
488
- */
489
- simulate(graph, options) {
490
- if (Lantern.BaseNode.hasCycle(graph)) {
491
- throw new Error('Cannot simulate graph with cycle');
492
- }
493
-
494
- options = Object.assign({
495
- label: undefined,
496
- }, options);
497
-
498
- // initialize the necessary data containers
499
- this._dns = new DNSCache({rtt: this._rtt});
500
- this._initializeConnectionPool(graph);
501
- this._initializeAuxiliaryData();
502
-
503
- const nodesNotReadyToStart = this._nodes[NodeState.NotReadyToStart];
504
- const nodesReadyToStart = this._nodes[NodeState.ReadyToStart];
505
- const nodesInProgress = this._nodes[NodeState.InProgress];
506
-
507
- const rootNode = graph.getRootNode();
508
- rootNode.traverse(node => nodesNotReadyToStart.add(node));
509
- let totalElapsedTime = 0;
510
- let iteration = 0;
511
-
512
- // root node is always ready to start
513
- this._markNodeAsReadyToStart(rootNode, totalElapsedTime);
514
-
515
- // loop as long as we have nodes in the queue or currently in progress
516
- while (nodesReadyToStart.size || nodesInProgress.size) {
517
- // move all possible queued nodes to in progress
518
- for (const node of this._getNodesSortedByStartPosition()) {
519
- this._startNodeIfPossible(node, totalElapsedTime);
520
- }
521
-
522
- if (!nodesInProgress.size) {
523
- // Interplay between fromDiskCache and connectionReused can be incorrect,
524
- // have to give up.
525
- throw new Error('Failed to start a node');
526
- }
527
-
528
- // set the available throughput for all connections based on # inflight
529
- this._updateNetworkCapacity();
530
-
531
- // find the time that the next node will finish
532
- const minimumTime = this._findNextNodeCompletionTime();
533
- totalElapsedTime += minimumTime;
534
-
535
- // While this is no longer strictly necessary, it's always better than hanging
536
- if (!Number.isFinite(minimumTime) || iteration > 100000) {
537
- throw new Error('Simulation failed, depth exceeded');
538
- }
539
-
540
- iteration++;
541
- // update how far each node will progress until that point
542
- for (const node of nodesInProgress) {
543
- this._updateProgressMadeInTimePeriod(node, minimumTime, totalElapsedTime);
544
- }
545
- }
546
-
547
- // `nodeTimings` are used for simulator consumers, `completeNodeTimings` kept for debugging.
548
- const {nodeTimings, completeNodeTimings} = this._computeFinalNodeTimings();
549
- ALL_SIMULATION_NODE_TIMINGS.set(options.label || 'unlabeled', completeNodeTimings);
550
-
551
- return {
552
- timeInMs: totalElapsedTime,
553
- nodeTimings,
554
- };
555
- }
556
-
557
- /**
558
- * @param {number} wastedBytes
559
- */
560
- computeWastedMsFromWastedBytes(wastedBytes) {
561
- const {throughput, observedThroughput} = this._options;
562
-
563
- // https://github.com/GoogleChrome/lighthouse/pull/13323#issuecomment-962031709
564
- // 0 throughput means the no (additional) throttling is expected.
565
- // This is common for desktop + devtools throttling where throttling is additive and we don't want any additional.
566
- const bitsPerSecond = throughput === 0 ? observedThroughput : throughput;
567
- if (bitsPerSecond === 0) return 0;
568
-
569
- const wastedBits = wastedBytes * 8;
570
- const wastedMs = wastedBits / bitsPerSecond * 1000;
571
-
572
- // This is an estimate of wasted time, so we won't be more precise than 10ms.
573
- return Math.round(wastedMs / 10) * 10;
574
- }
575
-
576
- /** @return {Map<string, Map<Node, CompleteNodeTiming>>} */
577
- static get ALL_NODE_TIMINGS() {
578
- return ALL_SIMULATION_NODE_TIMINGS;
579
- }
580
-
581
- /**
582
- * We attempt to start nodes by their observed start time using the request priority as a tie breaker.
583
- * When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
584
- * it would have happened like that when the network was slower.
585
- * @param {Node} node
586
- */
587
- static _computeNodeStartPosition(node) {
588
- if (node.type === 'cpu') return node.startTime;
589
- return node.startTime + (PriorityStartTimePenalty[node.request.priority] * 1000 * 1000 || 0);
590
- }
591
- }
592
-
593
- export {Simulator};