@paulirish/trace_engine 0.0.32 → 0.0.33

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 (282) hide show
  1. package/README.md +6 -10
  2. package/analyze-trace.mjs +9 -10
  3. package/core/platform/ArrayUtilities.js +1 -0
  4. package/core/platform/ArrayUtilities.js.map +1 -1
  5. package/core/platform/DevToolsPath.d.ts +1 -1
  6. package/core/platform/DevToolsPath.js.map +1 -1
  7. package/core/platform/MimeType.js +4 -2
  8. package/core/platform/MimeType.js.map +1 -1
  9. package/core/platform/NumberUtilities.js +8 -0
  10. package/core/platform/NumberUtilities.js.map +1 -1
  11. package/core/platform/ServerTiming.d.ts +31 -0
  12. package/core/platform/ServerTiming.js +212 -0
  13. package/core/platform/ServerTiming.js.map +1 -0
  14. package/core/platform/Timing.d.ts +1 -1
  15. package/core/platform/Timing.js.map +1 -1
  16. package/core/platform/TypescriptUtilities.d.ts +3 -0
  17. package/core/platform/TypescriptUtilities.js.map +1 -1
  18. package/core/platform/UIString.d.ts +1 -1
  19. package/core/platform/UIString.js.map +1 -1
  20. package/core/platform/UserVisibleError.d.ts +1 -1
  21. package/core/platform/UserVisibleError.js.map +1 -1
  22. package/core/platform/platform-tsconfig.json +1 -1
  23. package/core/platform/platform.d.ts +2 -2
  24. package/core/platform/platform.js +2 -2
  25. package/core/platform/platform.js.map +1 -1
  26. package/generated/protocol.d.ts +258 -14
  27. package/models/trace/LanternComputationData.d.ts +4 -4
  28. package/models/trace/LanternComputationData.js +22 -23
  29. package/models/trace/LanternComputationData.js.map +1 -1
  30. package/models/trace/ModelImpl.d.ts +11 -12
  31. package/models/trace/ModelImpl.js +22 -33
  32. package/models/trace/ModelImpl.js.map +1 -1
  33. package/models/trace/Processor.d.ts +21 -12
  34. package/models/trace/Processor.js +148 -67
  35. package/models/trace/Processor.js.map +1 -1
  36. package/models/trace/TracingManager.js.map +1 -1
  37. package/models/trace/extras/FetchNodes.d.ts +8 -8
  38. package/models/trace/extras/FetchNodes.js +16 -11
  39. package/models/trace/extras/FetchNodes.js.map +1 -1
  40. package/models/trace/extras/FilmStrip.d.ts +2 -2
  41. package/models/trace/extras/FilmStrip.js +8 -8
  42. package/models/trace/extras/FilmStrip.js.map +1 -1
  43. package/models/trace/extras/MainThreadActivity.d.ts +1 -1
  44. package/models/trace/extras/MainThreadActivity.js +1 -1
  45. package/models/trace/extras/MainThreadActivity.js.map +1 -1
  46. package/models/trace/extras/Metadata.js +2 -2
  47. package/models/trace/extras/Metadata.js.map +1 -1
  48. package/models/trace/extras/URLForEntry.d.ts +9 -1
  49. package/models/trace/extras/URLForEntry.js +18 -10
  50. package/models/trace/extras/URLForEntry.js.map +1 -1
  51. package/models/trace/extras/extras.js +1 -1
  52. package/models/trace/handlers/AnimationHandler.d.ts +2 -2
  53. package/models/trace/handlers/AnimationHandler.js +1 -1
  54. package/models/trace/handlers/AnimationHandler.js.map +1 -1
  55. package/models/trace/handlers/AuctionWorkletsHandler.d.ts +2 -2
  56. package/models/trace/handlers/AuctionWorkletsHandler.js +11 -11
  57. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
  58. package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +6 -6
  59. package/models/trace/handlers/ExtensionTraceDataHandler.js +12 -8
  60. package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
  61. package/models/trace/handlers/FramesHandler.d.ts +24 -19
  62. package/models/trace/handlers/FramesHandler.js +46 -25
  63. package/models/trace/handlers/FramesHandler.js.map +1 -1
  64. package/models/trace/handlers/GPUHandler.d.ts +4 -4
  65. package/models/trace/handlers/GPUHandler.js +3 -3
  66. package/models/trace/handlers/GPUHandler.js.map +1 -1
  67. package/models/trace/handlers/ImagePaintingHandler.d.ts +3 -3
  68. package/models/trace/handlers/ImagePaintingHandler.js +6 -8
  69. package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
  70. package/models/trace/handlers/InitiatorsHandler.d.ts +3 -3
  71. package/models/trace/handlers/InitiatorsHandler.js +14 -14
  72. package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
  73. package/models/trace/handlers/InvalidationsHandler.d.ts +4 -2
  74. package/models/trace/handlers/InvalidationsHandler.js +29 -11
  75. package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
  76. package/models/trace/handlers/LargestImagePaintHandler.d.ts +2 -2
  77. package/models/trace/handlers/LargestImagePaintHandler.js +1 -1
  78. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
  79. package/models/trace/handlers/LargestTextPaintHandler.d.ts +2 -2
  80. package/models/trace/handlers/LargestTextPaintHandler.js +1 -1
  81. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -1
  82. package/models/trace/handlers/LayerTreeHandler.d.ts +6 -6
  83. package/models/trace/handlers/LayerTreeHandler.js +6 -6
  84. package/models/trace/handlers/LayerTreeHandler.js.map +1 -1
  85. package/models/trace/handlers/LayoutShiftsHandler.d.ts +12 -20
  86. package/models/trace/handlers/LayoutShiftsHandler.js +73 -12
  87. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
  88. package/models/trace/handlers/MemoryHandler.d.ts +2 -2
  89. package/models/trace/handlers/MemoryHandler.js +1 -1
  90. package/models/trace/handlers/MemoryHandler.js.map +1 -1
  91. package/models/trace/handlers/MetaHandler.d.ts +15 -14
  92. package/models/trace/handlers/MetaHandler.js +32 -30
  93. package/models/trace/handlers/MetaHandler.js.map +1 -1
  94. package/models/trace/handlers/ModelHandlers.d.ts +1 -1
  95. package/models/trace/handlers/ModelHandlers.js +1 -1
  96. package/models/trace/handlers/ModelHandlers.js.map +1 -1
  97. package/models/trace/handlers/NetworkRequestsHandler.d.ts +13 -12
  98. package/models/trace/handlers/NetworkRequestsHandler.js +68 -66
  99. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
  100. package/models/trace/handlers/PageFramesHandler.d.ts +2 -2
  101. package/models/trace/handlers/PageFramesHandler.js +2 -2
  102. package/models/trace/handlers/PageFramesHandler.js.map +1 -1
  103. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +7 -7
  104. package/models/trace/handlers/PageLoadMetricsHandler.js +21 -24
  105. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
  106. package/models/trace/handlers/RendererHandler.d.ts +19 -19
  107. package/models/trace/handlers/RendererHandler.js +5 -5
  108. package/models/trace/handlers/RendererHandler.js.map +1 -1
  109. package/models/trace/handlers/SamplesHandler.d.ts +6 -6
  110. package/models/trace/handlers/SamplesHandler.js +3 -3
  111. package/models/trace/handlers/SamplesHandler.js.map +1 -1
  112. package/models/trace/handlers/ScreenshotsHandler.d.ts +6 -4
  113. package/models/trace/handlers/ScreenshotsHandler.js +11 -9
  114. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
  115. package/models/trace/handlers/SelectorStatsHandler.d.ts +3 -3
  116. package/models/trace/handlers/SelectorStatsHandler.js +2 -2
  117. package/models/trace/handlers/SelectorStatsHandler.js.map +1 -1
  118. package/models/trace/handlers/ServerTimingsHandler.d.ts +10 -0
  119. package/models/trace/handlers/ServerTimingsHandler.js +118 -0
  120. package/models/trace/handlers/ServerTimingsHandler.js.map +1 -0
  121. package/models/trace/handlers/Threads.d.ts +7 -7
  122. package/models/trace/handlers/Threads.js +5 -5
  123. package/models/trace/handlers/Threads.js.map +1 -1
  124. package/models/trace/handlers/UserInteractionsHandler.d.ts +13 -11
  125. package/models/trace/handlers/UserInteractionsHandler.js +13 -7
  126. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
  127. package/models/trace/handlers/UserTimingsHandler.d.ts +5 -5
  128. package/models/trace/handlers/UserTimingsHandler.js +52 -9
  129. package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
  130. package/models/trace/handlers/WarningsHandler.d.ts +5 -5
  131. package/models/trace/handlers/WarningsHandler.js +4 -5
  132. package/models/trace/handlers/WarningsHandler.js.map +1 -1
  133. package/models/trace/handlers/WorkersHandler.d.ts +4 -4
  134. package/models/trace/handlers/WorkersHandler.js +1 -1
  135. package/models/trace/handlers/WorkersHandler.js.map +1 -1
  136. package/models/trace/handlers/handlers-tsconfig.json +1 -1
  137. package/models/trace/handlers/types.d.ts +7 -7
  138. package/models/trace/handlers/types.js.map +1 -1
  139. package/models/trace/helpers/Extensions.d.ts +2 -2
  140. package/models/trace/helpers/Extensions.js.map +1 -1
  141. package/models/trace/helpers/Network.d.ts +2 -2
  142. package/models/trace/helpers/Network.js +19 -2
  143. package/models/trace/helpers/Network.js.map +1 -1
  144. package/models/trace/helpers/SamplesIntegrator.d.ts +5 -5
  145. package/models/trace/helpers/SamplesIntegrator.js +10 -11
  146. package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
  147. package/models/trace/helpers/SyntheticEvents.d.ts +8 -14
  148. package/models/trace/helpers/SyntheticEvents.js +20 -31
  149. package/models/trace/helpers/SyntheticEvents.js.map +1 -1
  150. package/models/trace/helpers/Timing.d.ts +16 -4
  151. package/models/trace/helpers/Timing.js +33 -1
  152. package/models/trace/helpers/Timing.js.map +1 -1
  153. package/models/trace/helpers/Trace.d.ts +46 -32
  154. package/models/trace/helpers/Trace.js +53 -24
  155. package/models/trace/helpers/Trace.js.map +1 -1
  156. package/models/trace/helpers/TreeHelpers.d.ts +29 -8
  157. package/models/trace/helpers/TreeHelpers.js +87 -19
  158. package/models/trace/helpers/TreeHelpers.js.map +1 -1
  159. package/models/trace/insights/Common.d.ts +4 -3
  160. package/models/trace/insights/Common.js +22 -7
  161. package/models/trace/insights/Common.js.map +1 -1
  162. package/models/trace/insights/CumulativeLayoutShift.d.ts +34 -13
  163. package/models/trace/insights/CumulativeLayoutShift.js +151 -59
  164. package/models/trace/insights/CumulativeLayoutShift.js.map +1 -1
  165. package/models/trace/insights/DocumentLatency.d.ts +9 -4
  166. package/models/trace/insights/DocumentLatency.js +82 -7
  167. package/models/trace/insights/DocumentLatency.js.map +1 -1
  168. package/models/trace/insights/FontDisplay.d.ts +11 -0
  169. package/models/trace/insights/FontDisplay.js +44 -0
  170. package/models/trace/insights/FontDisplay.js.map +1 -0
  171. package/models/trace/insights/InsightRunners.d.ts +3 -0
  172. package/models/trace/insights/InsightRunners.js +3 -0
  173. package/models/trace/insights/InsightRunners.js.map +1 -1
  174. package/models/trace/insights/InteractionToNextPaint.d.ts +4 -5
  175. package/models/trace/insights/InteractionToNextPaint.js +5 -3
  176. package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
  177. package/models/trace/insights/LargestContentfulPaint.d.ts +20 -7
  178. package/models/trace/insights/LargestContentfulPaint.js +57 -37
  179. package/models/trace/insights/LargestContentfulPaint.js.map +1 -1
  180. package/models/trace/insights/RenderBlocking.d.ts +3 -3
  181. package/models/trace/insights/RenderBlocking.js +29 -24
  182. package/models/trace/insights/RenderBlocking.js.map +1 -1
  183. package/models/trace/insights/SlowCSSSelector.d.ts +11 -0
  184. package/models/trace/insights/SlowCSSSelector.js +67 -0
  185. package/models/trace/insights/SlowCSSSelector.js.map +1 -0
  186. package/models/trace/insights/ThirdPartyWeb.d.ts +18 -0
  187. package/models/trace/insights/ThirdPartyWeb.js +174 -0
  188. package/models/trace/insights/ThirdPartyWeb.js.map +1 -0
  189. package/models/trace/insights/Viewport.d.ts +5 -2
  190. package/models/trace/insights/Viewport.js +14 -9
  191. package/models/trace/insights/Viewport.js.map +1 -1
  192. package/models/trace/insights/insights-tsconfig.json +9 -0
  193. package/models/trace/insights/insights.d.ts +1 -0
  194. package/models/trace/insights/insights.js +1 -0
  195. package/models/trace/insights/insights.js.map +1 -1
  196. package/models/trace/insights/types.d.ts +43 -25
  197. package/models/trace/insights/types.js.map +1 -1
  198. package/models/trace/lantern/core/NetworkAnalyzer.d.ts +6 -6
  199. package/models/trace/lantern/core/NetworkAnalyzer.js +12 -12
  200. package/models/trace/lantern/core/NetworkAnalyzer.js.map +1 -1
  201. package/models/trace/lantern/graph/BaseNode.d.ts +4 -4
  202. package/models/trace/lantern/graph/BaseNode.js +21 -21
  203. package/models/trace/lantern/graph/BaseNode.js.map +1 -1
  204. package/models/trace/lantern/graph/CPUNode.d.ts +1 -1
  205. package/models/trace/lantern/graph/CPUNode.js +5 -5
  206. package/models/trace/lantern/graph/CPUNode.js.map +1 -1
  207. package/models/trace/lantern/graph/PageDependencyGraph.d.ts +4 -4
  208. package/models/trace/lantern/graph/PageDependencyGraph.js +5 -5
  209. package/models/trace/lantern/graph/PageDependencyGraph.js.map +1 -1
  210. package/models/trace/lantern/simulation/ConnectionPool.d.ts +7 -7
  211. package/models/trace/lantern/simulation/ConnectionPool.js +26 -26
  212. package/models/trace/lantern/simulation/ConnectionPool.js.map +1 -1
  213. package/models/trace/lantern/simulation/DNSCache.d.ts +3 -3
  214. package/models/trace/lantern/simulation/DNSCache.js +11 -11
  215. package/models/trace/lantern/simulation/DNSCache.js.map +1 -1
  216. package/models/trace/lantern/simulation/SimulationTimingMap.d.ts +1 -1
  217. package/models/trace/lantern/simulation/SimulationTimingMap.js +15 -15
  218. package/models/trace/lantern/simulation/SimulationTimingMap.js.map +1 -1
  219. package/models/trace/lantern/simulation/Simulator.d.ts +28 -28
  220. package/models/trace/lantern/simulation/Simulator.js +113 -113
  221. package/models/trace/lantern/simulation/Simulator.js.map +1 -1
  222. package/models/trace/lantern/simulation/TCPConnection.d.ts +9 -9
  223. package/models/trace/lantern/simulation/TCPConnection.js +36 -36
  224. package/models/trace/lantern/simulation/TCPConnection.js.map +1 -1
  225. package/models/trace/root-causes/LayoutShift.d.ts +13 -13
  226. package/models/trace/root-causes/LayoutShift.js +7 -25
  227. package/models/trace/root-causes/LayoutShift.js.map +1 -1
  228. package/models/trace/types/Configuration.d.ts +16 -0
  229. package/models/trace/types/Configuration.js +1 -0
  230. package/models/trace/types/Configuration.js.map +1 -1
  231. package/models/trace/types/Extensions.d.ts +9 -12
  232. package/models/trace/types/Extensions.js +2 -1
  233. package/models/trace/types/Extensions.js.map +1 -1
  234. package/models/trace/types/File.d.ts +55 -23
  235. package/models/trace/types/File.js +15 -3
  236. package/models/trace/types/File.js.map +1 -1
  237. package/models/trace/types/TraceEvents.d.ts +818 -713
  238. package/models/trace/types/TraceEvents.js +270 -277
  239. package/models/trace/types/TraceEvents.js.map +1 -1
  240. package/models/trace/types/types.d.ts +1 -1
  241. package/models/trace/types/types.js +1 -1
  242. package/models/trace/types/types.js.map +1 -1
  243. package/package.json +4 -2
  244. package/test/test-trace-engine.mjs +47 -2
  245. package/third_party/third-party-web/third-party-web.js +1 -0
  246. package/core/platform/PromiseUtilities.d.ts +0 -10
  247. package/core/platform/PromiseUtilities.js +0 -18
  248. package/core/platform/PromiseUtilities.js.map +0 -1
  249. package/core/platform/SetUtilities.d.ts +0 -2
  250. package/core/platform/SetUtilities.js +0 -23
  251. package/core/platform/SetUtilities.js.map +0 -1
  252. package/models/trace/EntriesFilter.d.ts +0 -72
  253. package/models/trace/EntriesFilter.js +0 -296
  254. package/models/trace/EntriesFilter.js.map +0 -1
  255. package/models/trace/LegacyTracingModel.js.map +0 -1
  256. package/models/trace/handlers/EnhancedTracesHandler.d.ts +0 -48
  257. package/models/trace/handlers/EnhancedTracesHandler.js +0 -165
  258. package/models/trace/handlers/EnhancedTracesHandler.js.map +0 -1
  259. package/models/trace/lantern/BaseNode.d.ts +0 -91
  260. package/models/trace/lantern/BaseNode.js +0 -268
  261. package/models/trace/lantern/BaseNode.js.map +0 -1
  262. package/models/trace/lantern/CPUNode.d.ts +0 -24
  263. package/models/trace/lantern/CPUNode.js +0 -64
  264. package/models/trace/lantern/CPUNode.js.map +0 -1
  265. package/models/trace/lantern/LanternError.d.ts +0 -3
  266. package/models/trace/lantern/LanternError.js +0 -7
  267. package/models/trace/lantern/LanternError.js.map +0 -1
  268. package/models/trace/lantern/MetricsModule.d.ts +0 -11
  269. package/models/trace/lantern/MetricsModule.js +0 -14
  270. package/models/trace/lantern/MetricsModule.js.map +0 -1
  271. package/models/trace/lantern/NetworkNode.d.ts +0 -22
  272. package/models/trace/lantern/NetworkNode.js +0 -83
  273. package/models/trace/lantern/NetworkNode.js.map +0 -1
  274. package/models/trace/lantern/PageDependencyGraph.d.ts +0 -43
  275. package/models/trace/lantern/PageDependencyGraph.js +0 -509
  276. package/models/trace/lantern/PageDependencyGraph.js.map +0 -1
  277. package/models/trace/lantern/SimulationModule.d.ts +0 -17
  278. package/models/trace/lantern/SimulationModule.js +0 -13
  279. package/models/trace/lantern/SimulationModule.js.map +0 -1
  280. package/models/trace/lantern/simulation/NetworkAnalyzer.d.ts +0 -112
  281. package/models/trace/lantern/simulation/NetworkAnalyzer.js +0 -486
  282. package/models/trace/lantern/simulation/NetworkAnalyzer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SimulationTimingMap.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/SimulationTimingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/**\n * @fileoverview\n *\n * This class encapsulates the type-related validation logic for moving timing information for nodes\n * through the different simulation phases. Methods here ensure that the invariants of simulation hold\n * as nodes are queued, partially simulated, and completed.\n */\n\nimport * as Core from '../core/core.js';\nimport * as Graph from '../graph/graph.js';\n\ninterface NodeTimingComplete {\n startTime: number;\n endTime: number;\n queuedTime: number;\n estimatedTimeElapsed: number;\n timeElapsed: number;\n timeElapsedOvershoot: number;\n bytesDownloaded: number;\n}\n\ntype NodeTimingQueued = Pick<NodeTimingComplete, 'queuedTime'>;\n\ntype CpuNodeTimingStarted = NodeTimingQueued&Pick<NodeTimingComplete, 'startTime'|'timeElapsed'>;\ntype NetworkNodeTimingStarted = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'timeElapsedOvershoot'|'bytesDownloaded'>;\n\ntype CpuNodeTimingInProgress = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\ntype NetworkNodeTimingInProgress = NetworkNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\n\nexport type CpuNodeTimingComplete = CpuNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>;\nexport type NetworkNodeTimingComplete =\n NetworkNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>&{connectionTiming: ConnectionTiming};\nexport type CompleteNodeTiming = CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\ntype NodeTimingData = NodeTimingQueued|CpuNodeTimingStarted|NetworkNodeTimingStarted|CpuNodeTimingInProgress|\n NetworkNodeTimingInProgress|CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\nexport interface ConnectionTiming {\n dnsResolutionTime?: number;\n connectionTime?: number;\n sslTime?: number;\n timeToFirstByte: number;\n}\n\nclass SimulatorTimingMap {\n _nodeTimings: Map<Graph.Node, NodeTimingData>;\n\n constructor() {\n this._nodeTimings = new Map<Graph.Node, NodeTimingData>();\n }\n\n getNodes(): Graph.Node[] {\n return Array.from(this._nodeTimings.keys());\n }\n\n setReadyToStart(node: Graph.Node, values: {queuedTime: number}): void {\n this._nodeTimings.set(node, values);\n }\n\n setInProgress(node: Graph.Node, values: {startTime: number}): void {\n const nodeTiming = {\n ...this.getQueued(node),\n startTime: values.startTime,\n timeElapsed: 0,\n };\n\n this._nodeTimings.set(\n node,\n node.type === Graph.BaseNode.types.NETWORK ? {...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0} :\n nodeTiming,\n );\n }\n\n setCompleted(node: Graph.Node, values: {endTime: number, connectionTiming?: ConnectionTiming}): void {\n const nodeTiming = {\n ...this.getInProgress(node),\n endTime: values.endTime,\n connectionTiming: values.connectionTiming,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setCpu(node: Graph.CPUNode, values: {timeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n timeElapsed: values.timeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setCpuEstimated(node: Graph.CPUNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setNetwork(\n node: Graph.NetworkNode,\n values: {timeElapsed: number, timeElapsedOvershoot: number, bytesDownloaded: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n timeElapsed: values.timeElapsed,\n timeElapsedOvershoot: values.timeElapsedOvershoot,\n bytesDownloaded: values.bytesDownloaded,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setNetworkEstimated(node: Graph.NetworkNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n getQueued(node: Graph.Node): NodeTimingData {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n return timing;\n }\n\n getCpuStarted(node: Graph.CPUNode): CpuNodeTimingStarted {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if ('bytesDownloaded' in timing) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getNetworkStarted(node: Graph.NetworkNode): NetworkNodeTimingStarted {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('bytesDownloaded' in timing)) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getInProgress(node: Graph.Node): CpuNodeTimingInProgress|NetworkNodeTimingInProgress {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n return timing;\n }\n\n getCompleted(node: Graph.Node): CpuNodeTimingComplete|NetworkNodeTimingComplete {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n if (!('endTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet completed`);\n }\n return timing;\n }\n}\n\nexport {SimulatorTimingMap};\n"]}
1
+ {"version":3,"file":"SimulationTimingMap.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/SimulationTimingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/**\n * @fileoverview\n *\n * This class encapsulates the type-related validation logic for moving timing information for nodes\n * through the different simulation phases. Methods here ensure that the invariants of simulation hold\n * as nodes are queued, partially simulated, and completed.\n */\n\nimport * as Core from '../core/core.js';\nimport * as Graph from '../graph/graph.js';\n\ninterface NodeTimingComplete {\n startTime: number;\n endTime: number;\n queuedTime: number;\n estimatedTimeElapsed: number;\n timeElapsed: number;\n timeElapsedOvershoot: number;\n bytesDownloaded: number;\n}\n\ntype NodeTimingQueued = Pick<NodeTimingComplete, 'queuedTime'>;\n\ntype CpuNodeTimingStarted = NodeTimingQueued&Pick<NodeTimingComplete, 'startTime'|'timeElapsed'>;\ntype NetworkNodeTimingStarted = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'timeElapsedOvershoot'|'bytesDownloaded'>;\n\ntype CpuNodeTimingInProgress = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\ntype NetworkNodeTimingInProgress = NetworkNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\n\nexport type CpuNodeTimingComplete = CpuNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>;\nexport type NetworkNodeTimingComplete =\n NetworkNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>&{connectionTiming: ConnectionTiming};\nexport type CompleteNodeTiming = CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\ntype NodeTimingData = NodeTimingQueued|CpuNodeTimingStarted|NetworkNodeTimingStarted|CpuNodeTimingInProgress|\n NetworkNodeTimingInProgress|CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\nexport interface ConnectionTiming {\n dnsResolutionTime?: number;\n connectionTime?: number;\n sslTime?: number;\n timeToFirstByte: number;\n}\n\nclass SimulatorTimingMap {\n nodeTimings: Map<Graph.Node, NodeTimingData>;\n\n constructor() {\n this.nodeTimings = new Map<Graph.Node, NodeTimingData>();\n }\n\n getNodes(): Graph.Node[] {\n return Array.from(this.nodeTimings.keys());\n }\n\n setReadyToStart(node: Graph.Node, values: {queuedTime: number}): void {\n this.nodeTimings.set(node, values);\n }\n\n setInProgress(node: Graph.Node, values: {startTime: number}): void {\n const nodeTiming = {\n ...this.getQueued(node),\n startTime: values.startTime,\n timeElapsed: 0,\n };\n\n this.nodeTimings.set(\n node,\n node.type === Graph.BaseNode.types.NETWORK ? {...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0} :\n nodeTiming,\n );\n }\n\n setCompleted(node: Graph.Node, values: {endTime: number, connectionTiming?: ConnectionTiming}): void {\n const nodeTiming = {\n ...this.getInProgress(node),\n endTime: values.endTime,\n connectionTiming: values.connectionTiming,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setCpu(node: Graph.CPUNode, values: {timeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n timeElapsed: values.timeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setCpuEstimated(node: Graph.CPUNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setNetwork(\n node: Graph.NetworkNode,\n values: {timeElapsed: number, timeElapsedOvershoot: number, bytesDownloaded: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n timeElapsed: values.timeElapsed,\n timeElapsedOvershoot: values.timeElapsedOvershoot,\n bytesDownloaded: values.bytesDownloaded,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setNetworkEstimated(node: Graph.NetworkNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n getQueued(node: Graph.Node): NodeTimingData {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n return timing;\n }\n\n getCpuStarted(node: Graph.CPUNode): CpuNodeTimingStarted {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if ('bytesDownloaded' in timing) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getNetworkStarted(node: Graph.NetworkNode): NetworkNodeTimingStarted {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('bytesDownloaded' in timing)) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getInProgress(node: Graph.Node): CpuNodeTimingInProgress|NetworkNodeTimingInProgress {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n return timing;\n }\n\n getCompleted(node: Graph.Node): CpuNodeTimingComplete|NetworkNodeTimingComplete {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n if (!('endTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet completed`);\n }\n return timing;\n }\n}\n\nexport {SimulatorTimingMap};\n"]}
@@ -10,52 +10,52 @@ export interface Result<T = Lantern.AnyNetworkObject> {
10
10
  }
11
11
  declare class Simulator<T = Lantern.AnyNetworkObject> {
12
12
  static createSimulator(settings: Lantern.Simulation.Settings): Simulator;
13
- _options: Required<Lantern.Simulation.Options>;
13
+ options: Required<Lantern.Simulation.Options>;
14
14
  _rtt: number;
15
- _throughput: number;
16
- _maximumConcurrentRequests: number;
17
- _cpuSlowdownMultiplier: number;
18
- _layoutTaskMultiplier: number;
19
- _cachedNodeListByStartPosition: Graph.Node[];
20
- _nodeTimings: SimulatorTimingMap;
21
- _numberInProgressByType: Map<string, number>;
22
- _nodes: Record<number, Set<Graph.Node>>;
23
- _dns: DNSCache;
24
- _connectionPool: ConnectionPool;
15
+ throughput: number;
16
+ maximumConcurrentRequests: number;
17
+ cpuSlowdownMultiplier: number;
18
+ layoutTaskMultiplier: number;
19
+ cachedNodeListByStartPosition: Graph.Node[];
20
+ nodeTimings: SimulatorTimingMap;
21
+ numberInProgressByType: Map<string, number>;
22
+ nodes: Record<number, Set<Graph.Node>>;
23
+ dns: DNSCache;
24
+ connectionPool: ConnectionPool;
25
25
  constructor(options?: Lantern.Simulation.Options);
26
26
  get rtt(): number;
27
- _initializeConnectionPool(graph: Graph.Node): void;
27
+ initializeConnectionPool(graph: Graph.Node): void;
28
28
  /**
29
29
  * Initializes the various state data structures such _nodeTimings and the _node Sets by state.
30
30
  */
31
- _initializeAuxiliaryData(): void;
32
- _numberInProgress(type: string): number;
33
- _markNodeAsReadyToStart(node: Graph.Node, queuedTime: number): void;
34
- _markNodeAsInProgress(node: Graph.Node, startTime: number): void;
35
- _markNodeAsComplete(node: Graph.Node, endTime: number, connectionTiming?: ConnectionTiming): void;
36
- _acquireConnection(request: Lantern.NetworkRequest): TCPConnection | null;
37
- _getNodesSortedByStartPosition(): Graph.Node[];
38
- _startNodeIfPossible(node: Graph.Node, totalElapsedTime: number): void;
31
+ initializeAuxiliaryData(): void;
32
+ numberInProgress(type: string): number;
33
+ markNodeAsReadyToStart(node: Graph.Node, queuedTime: number): void;
34
+ markNodeAsInProgress(node: Graph.Node, startTime: number): void;
35
+ markNodeAsComplete(node: Graph.Node, endTime: number, connectionTiming?: ConnectionTiming): void;
36
+ acquireConnection(request: Lantern.NetworkRequest): TCPConnection | null;
37
+ getNodesSortedByStartPosition(): Graph.Node[];
38
+ startNodeIfPossible(node: Graph.Node, totalElapsedTime: number): void;
39
39
  /**
40
40
  * Updates each connection in use with the available throughput based on the number of network requests
41
41
  * currently in flight.
42
42
  */
43
- _updateNetworkCapacity(): void;
43
+ updateNetworkCapacity(): void;
44
44
  /**
45
45
  * Estimates the number of milliseconds remaining given current condidtions before the node is complete.
46
46
  */
47
- _estimateTimeRemaining(node: Graph.Node): number;
48
- _estimateCPUTimeRemaining(cpuNode: Graph.CPUNode): number;
49
- _estimateNetworkTimeRemaining(networkNode: Graph.NetworkNode): number;
47
+ estimateTimeRemaining(node: Graph.Node): number;
48
+ estimateCPUTimeRemaining(cpuNode: Graph.CPUNode): number;
49
+ estimateNetworkTimeRemaining(networkNode: Graph.NetworkNode): number;
50
50
  /**
51
51
  * Computes and returns the minimum estimated completion time of the nodes currently in progress.
52
52
  */
53
- _findNextNodeCompletionTime(): number;
53
+ findNextNodeCompletionTime(): number;
54
54
  /**
55
55
  * Given a time period, computes the progress toward completion that the node made durin that time.
56
56
  */
57
- _updateProgressMadeInTimePeriod(node: Graph.Node, timePeriodLength: number, totalElapsedTime: number): void;
58
- _computeFinalNodeTimings(): {
57
+ updateProgressMadeInTimePeriod(node: Graph.Node, timePeriodLength: number, totalElapsedTime: number): void;
58
+ computeFinalNodeTimings(): {
59
59
  nodeTimings: Map<Graph.Node, Lantern.Simulation.NodeTiming>;
60
60
  completeNodeTimings: Map<Graph.Node, CompleteNodeTiming>;
61
61
  };
@@ -79,6 +79,6 @@ declare class Simulator<T = Lantern.AnyNetworkObject> {
79
79
  * When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
80
80
  * it would have happened like that when the network was slower.
81
81
  */
82
- static _computeNodeStartPosition(node: Graph.Node): number;
82
+ static computeNodeStartPosition(node: Graph.Node): number;
83
83
  }
84
84
  export { Simulator };
@@ -72,20 +72,20 @@ class Simulator {
72
72
  }
73
73
  return new Simulator(options);
74
74
  }
75
- _options;
75
+ options;
76
76
  _rtt;
77
- _throughput;
78
- _maximumConcurrentRequests;
79
- _cpuSlowdownMultiplier;
80
- _layoutTaskMultiplier;
81
- _cachedNodeListByStartPosition;
82
- _nodeTimings;
83
- _numberInProgressByType;
84
- _nodes;
85
- _dns;
86
- _connectionPool;
77
+ throughput;
78
+ maximumConcurrentRequests;
79
+ cpuSlowdownMultiplier;
80
+ layoutTaskMultiplier;
81
+ cachedNodeListByStartPosition;
82
+ nodeTimings;
83
+ numberInProgressByType;
84
+ nodes;
85
+ dns;
86
+ connectionPool;
87
87
  constructor(options) {
88
- this._options = Object.assign({
88
+ this.options = Object.assign({
89
89
  rtt: defaultThrottling.rttMs,
90
90
  throughput: defaultThrottling.throughputKbps * 1024,
91
91
  maximumConcurrentRequests: DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
@@ -94,101 +94,101 @@ class Simulator {
94
94
  additionalRttByOrigin: new Map(),
95
95
  serverResponseTimeByOrigin: new Map(),
96
96
  }, options);
97
- this._rtt = this._options.rtt;
98
- this._throughput = this._options.throughput;
99
- this._maximumConcurrentRequests = Math.max(Math.min(TCPConnection.maximumSaturatedConnections(this._rtt, this._throughput), this._options.maximumConcurrentRequests), 1);
100
- this._cpuSlowdownMultiplier = this._options.cpuSlowdownMultiplier;
101
- this._layoutTaskMultiplier = this._cpuSlowdownMultiplier * this._options.layoutTaskMultiplier;
102
- this._cachedNodeListByStartPosition = [];
97
+ this._rtt = this.options.rtt;
98
+ this.throughput = this.options.throughput;
99
+ this.maximumConcurrentRequests = Math.max(Math.min(TCPConnection.maximumSaturatedConnections(this._rtt, this.throughput), this.options.maximumConcurrentRequests), 1);
100
+ this.cpuSlowdownMultiplier = this.options.cpuSlowdownMultiplier;
101
+ this.layoutTaskMultiplier = this.cpuSlowdownMultiplier * this.options.layoutTaskMultiplier;
102
+ this.cachedNodeListByStartPosition = [];
103
103
  // Properties reset on every `.simulate` call but duplicated here for type checking
104
- this._nodeTimings = new SimulatorTimingMap();
105
- this._numberInProgressByType = new Map();
106
- this._nodes = {};
107
- this._dns = new DNSCache({ rtt: this._rtt });
104
+ this.nodeTimings = new SimulatorTimingMap();
105
+ this.numberInProgressByType = new Map();
106
+ this.nodes = {};
107
+ this.dns = new DNSCache({ rtt: this._rtt });
108
108
  // @ts-expect-error
109
- this._connectionPool = null;
109
+ this.connectionPool = null;
110
110
  if (!Number.isFinite(this._rtt)) {
111
111
  throw new Core.LanternError(`Invalid rtt ${this._rtt}`);
112
112
  }
113
- if (!Number.isFinite(this._throughput)) {
114
- throw new Core.LanternError(`Invalid rtt ${this._throughput}`);
113
+ if (!Number.isFinite(this.throughput)) {
114
+ throw new Core.LanternError(`Invalid rtt ${this.throughput}`);
115
115
  }
116
116
  }
117
117
  get rtt() {
118
118
  return this._rtt;
119
119
  }
120
- _initializeConnectionPool(graph) {
120
+ initializeConnectionPool(graph) {
121
121
  const records = [];
122
122
  graph.getRootNode().traverse(node => {
123
123
  if (node.type === Graph.BaseNode.types.NETWORK) {
124
124
  records.push(node.request);
125
125
  }
126
126
  });
127
- this._connectionPool = new ConnectionPool(records, this._options);
127
+ this.connectionPool = new ConnectionPool(records, this.options);
128
128
  }
129
129
  /**
130
130
  * Initializes the various state data structures such _nodeTimings and the _node Sets by state.
131
131
  */
132
- _initializeAuxiliaryData() {
133
- this._nodeTimings = new SimulatorTimingMap();
134
- this._numberInProgressByType = new Map();
135
- this._nodes = {};
136
- this._cachedNodeListByStartPosition = [];
132
+ initializeAuxiliaryData() {
133
+ this.nodeTimings = new SimulatorTimingMap();
134
+ this.numberInProgressByType = new Map();
135
+ this.nodes = {};
136
+ this.cachedNodeListByStartPosition = [];
137
137
  // NOTE: We don't actually need *all* of these sets, but the clarity that each node progresses
138
138
  // through the system is quite nice.
139
139
  for (const state of Object.values(NodeState)) {
140
- this._nodes[state] = new Set();
140
+ this.nodes[state] = new Set();
141
141
  }
142
142
  }
143
- _numberInProgress(type) {
144
- return this._numberInProgressByType.get(type) || 0;
143
+ numberInProgress(type) {
144
+ return this.numberInProgressByType.get(type) || 0;
145
145
  }
146
- _markNodeAsReadyToStart(node, queuedTime) {
147
- const nodeStartPosition = Simulator._computeNodeStartPosition(node);
148
- const firstNodeIndexWithGreaterStartPosition = this._cachedNodeListByStartPosition.findIndex(candidate => Simulator._computeNodeStartPosition(candidate) > nodeStartPosition);
149
- const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ? this._cachedNodeListByStartPosition.length :
146
+ markNodeAsReadyToStart(node, queuedTime) {
147
+ const nodeStartPosition = Simulator.computeNodeStartPosition(node);
148
+ const firstNodeIndexWithGreaterStartPosition = this.cachedNodeListByStartPosition.findIndex(candidate => Simulator.computeNodeStartPosition(candidate) > nodeStartPosition);
149
+ const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ? this.cachedNodeListByStartPosition.length :
150
150
  firstNodeIndexWithGreaterStartPosition;
151
- this._cachedNodeListByStartPosition.splice(insertionIndex, 0, node);
152
- this._nodes[NodeState.ReadyToStart].add(node);
153
- this._nodes[NodeState.NotReadyToStart].delete(node);
154
- this._nodeTimings.setReadyToStart(node, { queuedTime });
151
+ this.cachedNodeListByStartPosition.splice(insertionIndex, 0, node);
152
+ this.nodes[NodeState.ReadyToStart].add(node);
153
+ this.nodes[NodeState.NotReadyToStart].delete(node);
154
+ this.nodeTimings.setReadyToStart(node, { queuedTime });
155
155
  }
156
- _markNodeAsInProgress(node, startTime) {
157
- const indexOfNodeToStart = this._cachedNodeListByStartPosition.indexOf(node);
158
- this._cachedNodeListByStartPosition.splice(indexOfNodeToStart, 1);
159
- this._nodes[NodeState.InProgress].add(node);
160
- this._nodes[NodeState.ReadyToStart].delete(node);
161
- this._numberInProgressByType.set(node.type, this._numberInProgress(node.type) + 1);
162
- this._nodeTimings.setInProgress(node, { startTime });
156
+ markNodeAsInProgress(node, startTime) {
157
+ const indexOfNodeToStart = this.cachedNodeListByStartPosition.indexOf(node);
158
+ this.cachedNodeListByStartPosition.splice(indexOfNodeToStart, 1);
159
+ this.nodes[NodeState.InProgress].add(node);
160
+ this.nodes[NodeState.ReadyToStart].delete(node);
161
+ this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) + 1);
162
+ this.nodeTimings.setInProgress(node, { startTime });
163
163
  }
164
- _markNodeAsComplete(node, endTime, connectionTiming) {
165
- this._nodes[NodeState.Complete].add(node);
166
- this._nodes[NodeState.InProgress].delete(node);
167
- this._numberInProgressByType.set(node.type, this._numberInProgress(node.type) - 1);
168
- this._nodeTimings.setCompleted(node, { endTime, connectionTiming });
164
+ markNodeAsComplete(node, endTime, connectionTiming) {
165
+ this.nodes[NodeState.Complete].add(node);
166
+ this.nodes[NodeState.InProgress].delete(node);
167
+ this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) - 1);
168
+ this.nodeTimings.setCompleted(node, { endTime, connectionTiming });
169
169
  // Try to add all its dependents to the queue
170
170
  for (const dependent of node.getDependents()) {
171
171
  // Skip dependent node if one of its dependencies hasn't finished yet
172
172
  const dependencies = dependent.getDependencies();
173
- if (dependencies.some(dep => !this._nodes[NodeState.Complete].has(dep))) {
173
+ if (dependencies.some(dep => !this.nodes[NodeState.Complete].has(dep))) {
174
174
  continue;
175
175
  }
176
176
  // Otherwise add it to the queue
177
- this._markNodeAsReadyToStart(dependent, endTime);
177
+ this.markNodeAsReadyToStart(dependent, endTime);
178
178
  }
179
179
  }
180
- _acquireConnection(request) {
181
- return this._connectionPool.acquire(request);
180
+ acquireConnection(request) {
181
+ return this.connectionPool.acquire(request);
182
182
  }
183
- _getNodesSortedByStartPosition() {
183
+ getNodesSortedByStartPosition() {
184
184
  // Make a copy so we don't skip nodes due to concurrent modification
185
- return Array.from(this._cachedNodeListByStartPosition);
185
+ return Array.from(this.cachedNodeListByStartPosition);
186
186
  }
187
- _startNodeIfPossible(node, totalElapsedTime) {
187
+ startNodeIfPossible(node, totalElapsedTime) {
188
188
  if (node.type === Graph.BaseNode.types.CPU) {
189
189
  // Start a CPU task if there's no other CPU task in process
190
- if (this._numberInProgress(node.type) === 0) {
191
- this._markNodeAsInProgress(node, totalElapsedTime);
190
+ if (this.numberInProgress(node.type) === 0) {
191
+ this.markNodeAsInProgress(node, totalElapsedTime);
192
192
  }
193
193
  return;
194
194
  }
@@ -198,53 +198,53 @@ class Simulator {
198
198
  // If a network request is connectionless, we can always start it, so skip the connection checks
199
199
  if (!node.isConnectionless) {
200
200
  // Start a network request if we're not at max requests and a connection is available
201
- const numberOfActiveRequests = this._numberInProgress(node.type);
202
- if (numberOfActiveRequests >= this._maximumConcurrentRequests) {
201
+ const numberOfActiveRequests = this.numberInProgress(node.type);
202
+ if (numberOfActiveRequests >= this.maximumConcurrentRequests) {
203
203
  return;
204
204
  }
205
- const connection = this._acquireConnection(node.request);
205
+ const connection = this.acquireConnection(node.request);
206
206
  if (!connection) {
207
207
  return;
208
208
  }
209
209
  }
210
- this._markNodeAsInProgress(node, totalElapsedTime);
210
+ this.markNodeAsInProgress(node, totalElapsedTime);
211
211
  }
212
212
  /**
213
213
  * Updates each connection in use with the available throughput based on the number of network requests
214
214
  * currently in flight.
215
215
  */
216
- _updateNetworkCapacity() {
217
- const inFlight = this._numberInProgress(Graph.BaseNode.types.NETWORK);
216
+ updateNetworkCapacity() {
217
+ const inFlight = this.numberInProgress(Graph.BaseNode.types.NETWORK);
218
218
  if (inFlight === 0) {
219
219
  return;
220
220
  }
221
- for (const connection of this._connectionPool.connectionsInUse()) {
222
- connection.setThroughput(this._throughput / inFlight);
221
+ for (const connection of this.connectionPool.connectionsInUse()) {
222
+ connection.setThroughput(this.throughput / inFlight);
223
223
  }
224
224
  }
225
225
  /**
226
226
  * Estimates the number of milliseconds remaining given current condidtions before the node is complete.
227
227
  */
228
- _estimateTimeRemaining(node) {
228
+ estimateTimeRemaining(node) {
229
229
  if (node.type === Graph.BaseNode.types.CPU) {
230
- return this._estimateCPUTimeRemaining(node);
230
+ return this.estimateCPUTimeRemaining(node);
231
231
  }
232
232
  if (node.type === Graph.BaseNode.types.NETWORK) {
233
- return this._estimateNetworkTimeRemaining(node);
233
+ return this.estimateNetworkTimeRemaining(node);
234
234
  }
235
235
  throw new Core.LanternError('Unsupported');
236
236
  }
237
- _estimateCPUTimeRemaining(cpuNode) {
238
- const timingData = this._nodeTimings.getCpuStarted(cpuNode);
239
- const multiplier = cpuNode.didPerformLayout() ? this._layoutTaskMultiplier : this._cpuSlowdownMultiplier;
237
+ estimateCPUTimeRemaining(cpuNode) {
238
+ const timingData = this.nodeTimings.getCpuStarted(cpuNode);
239
+ const multiplier = cpuNode.didPerformLayout() ? this.layoutTaskMultiplier : this.cpuSlowdownMultiplier;
240
240
  const totalDuration = Math.min(Math.round(cpuNode.duration / 1000 * multiplier), DEFAULT_MAXIMUM_CPU_TASK_DURATION);
241
241
  const estimatedTimeElapsed = totalDuration - timingData.timeElapsed;
242
- this._nodeTimings.setCpuEstimated(cpuNode, { estimatedTimeElapsed });
242
+ this.nodeTimings.setCpuEstimated(cpuNode, { estimatedTimeElapsed });
243
243
  return estimatedTimeElapsed;
244
244
  }
245
- _estimateNetworkTimeRemaining(networkNode) {
245
+ estimateNetworkTimeRemaining(networkNode) {
246
246
  const request = networkNode.request;
247
- const timingData = this._nodeTimings.getNetworkStarted(networkNode);
247
+ const timingData = this.nodeTimings.getNetworkStarted(networkNode);
248
248
  let timeElapsed = 0;
249
249
  if (networkNode.fromDiskCache) {
250
250
  // Rough access time for seeking to location on disk and reading sequentially.
@@ -261,8 +261,8 @@ class Simulator {
261
261
  timeElapsed = 2 + 10 * sizeInMb - timingData.timeElapsed;
262
262
  }
263
263
  else {
264
- const connection = this._connectionPool.acquireActiveConnectionFromRequest(request);
265
- const dnsResolutionTime = this._dns.getTimeUntilResolution(request, {
264
+ const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
265
+ const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
266
266
  requestedAt: timingData.startTime,
267
267
  shouldUpdateCache: true,
268
268
  });
@@ -271,28 +271,28 @@ class Simulator {
271
271
  timeElapsed = calculation.timeElapsed;
272
272
  }
273
273
  const estimatedTimeElapsed = timeElapsed + timingData.timeElapsedOvershoot;
274
- this._nodeTimings.setNetworkEstimated(networkNode, { estimatedTimeElapsed });
274
+ this.nodeTimings.setNetworkEstimated(networkNode, { estimatedTimeElapsed });
275
275
  return estimatedTimeElapsed;
276
276
  }
277
277
  /**
278
278
  * Computes and returns the minimum estimated completion time of the nodes currently in progress.
279
279
  */
280
- _findNextNodeCompletionTime() {
280
+ findNextNodeCompletionTime() {
281
281
  let minimumTime = Infinity;
282
- for (const node of this._nodes[NodeState.InProgress]) {
283
- minimumTime = Math.min(minimumTime, this._estimateTimeRemaining(node));
282
+ for (const node of this.nodes[NodeState.InProgress]) {
283
+ minimumTime = Math.min(minimumTime, this.estimateTimeRemaining(node));
284
284
  }
285
285
  return minimumTime;
286
286
  }
287
287
  /**
288
288
  * Given a time period, computes the progress toward completion that the node made durin that time.
289
289
  */
290
- _updateProgressMadeInTimePeriod(node, timePeriodLength, totalElapsedTime) {
291
- const timingData = this._nodeTimings.getInProgress(node);
290
+ updateProgressMadeInTimePeriod(node, timePeriodLength, totalElapsedTime) {
291
+ const timingData = this.nodeTimings.getInProgress(node);
292
292
  const isFinished = timingData.estimatedTimeElapsed === timePeriodLength;
293
293
  if (node.type === Graph.BaseNode.types.CPU || node.isConnectionless) {
294
294
  if (isFinished) {
295
- this._markNodeAsComplete(node, totalElapsedTime);
295
+ this.markNodeAsComplete(node, totalElapsedTime);
296
296
  }
297
297
  else {
298
298
  timingData.timeElapsed += timePeriodLength;
@@ -306,8 +306,8 @@ class Simulator {
306
306
  throw new Core.LanternError('Invalid timing data');
307
307
  }
308
308
  const request = node.request;
309
- const connection = this._connectionPool.acquireActiveConnectionFromRequest(request);
310
- const dnsResolutionTime = this._dns.getTimeUntilResolution(request, {
309
+ const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
310
+ const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
311
311
  requestedAt: timingData.startTime,
312
312
  shouldUpdateCache: true,
313
313
  });
@@ -320,8 +320,8 @@ class Simulator {
320
320
  connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
321
321
  if (isFinished) {
322
322
  connection.setWarmed(true);
323
- this._connectionPool.release(request);
324
- this._markNodeAsComplete(node, totalElapsedTime, calculation.connectionTiming);
323
+ this.connectionPool.release(request);
324
+ this.markNodeAsComplete(node, totalElapsedTime, calculation.connectionTiming);
325
325
  }
326
326
  else {
327
327
  timingData.timeElapsed += calculation.timeElapsed;
@@ -329,9 +329,9 @@ class Simulator {
329
329
  timingData.bytesDownloaded += calculation.bytesDownloaded;
330
330
  }
331
331
  }
332
- _computeFinalNodeTimings() {
333
- const completeNodeTimingEntries = this._nodeTimings.getNodes().map(node => {
334
- return [node, this._nodeTimings.getCompleted(node)];
332
+ computeFinalNodeTimings() {
333
+ const completeNodeTimingEntries = this.nodeTimings.getNodes().map(node => {
334
+ return [node, this.nodeTimings.getCompleted(node)];
335
335
  });
336
336
  // Most consumers will want the entries sorted by startTime, so insert them in that order
337
337
  completeNodeTimingEntries.sort((a, b) => a[1].startTime - b[1].startTime);
@@ -352,7 +352,7 @@ class Simulator {
352
352
  };
353
353
  }
354
354
  getOptions() {
355
- return this._options;
355
+ return this.options;
356
356
  }
357
357
  /**
358
358
  * Estimates the time taken to process all of the graph's nodes, returns the overall time along with
@@ -371,23 +371,23 @@ class Simulator {
371
371
  label: undefined,
372
372
  }, options);
373
373
  // initialize the necessary data containers
374
- this._dns = new DNSCache({ rtt: this._rtt });
375
- this._initializeConnectionPool(graph);
376
- this._initializeAuxiliaryData();
377
- const nodesNotReadyToStart = this._nodes[NodeState.NotReadyToStart];
378
- const nodesReadyToStart = this._nodes[NodeState.ReadyToStart];
379
- const nodesInProgress = this._nodes[NodeState.InProgress];
374
+ this.dns = new DNSCache({ rtt: this._rtt });
375
+ this.initializeConnectionPool(graph);
376
+ this.initializeAuxiliaryData();
377
+ const nodesNotReadyToStart = this.nodes[NodeState.NotReadyToStart];
378
+ const nodesReadyToStart = this.nodes[NodeState.ReadyToStart];
379
+ const nodesInProgress = this.nodes[NodeState.InProgress];
380
380
  const rootNode = graph.getRootNode();
381
381
  rootNode.traverse(node => nodesNotReadyToStart.add(node));
382
382
  let totalElapsedTime = 0;
383
383
  let iteration = 0;
384
384
  // root node is always ready to start
385
- this._markNodeAsReadyToStart(rootNode, totalElapsedTime);
385
+ this.markNodeAsReadyToStart(rootNode, totalElapsedTime);
386
386
  // loop as long as we have nodes in the queue or currently in progress
387
387
  while (nodesReadyToStart.size || nodesInProgress.size) {
388
388
  // move all possible queued nodes to in progress
389
- for (const node of this._getNodesSortedByStartPosition()) {
390
- this._startNodeIfPossible(node, totalElapsedTime);
389
+ for (const node of this.getNodesSortedByStartPosition()) {
390
+ this.startNodeIfPossible(node, totalElapsedTime);
391
391
  }
392
392
  if (!nodesInProgress.size) {
393
393
  // Interplay between fromDiskCache and connectionReused can be incorrect,
@@ -395,9 +395,9 @@ class Simulator {
395
395
  throw new Core.LanternError('Failed to start a node');
396
396
  }
397
397
  // set the available throughput for all connections based on # inflight
398
- this._updateNetworkCapacity();
398
+ this.updateNetworkCapacity();
399
399
  // find the time that the next node will finish
400
- const minimumTime = this._findNextNodeCompletionTime();
400
+ const minimumTime = this.findNextNodeCompletionTime();
401
401
  totalElapsedTime += minimumTime;
402
402
  // While this is no longer strictly necessary, it's always better than hanging
403
403
  if (!Number.isFinite(minimumTime) || iteration > 100000) {
@@ -406,11 +406,11 @@ class Simulator {
406
406
  iteration++;
407
407
  // update how far each node will progress until that point
408
408
  for (const node of nodesInProgress) {
409
- this._updateProgressMadeInTimePeriod(node, minimumTime, totalElapsedTime);
409
+ this.updateProgressMadeInTimePeriod(node, minimumTime, totalElapsedTime);
410
410
  }
411
411
  }
412
412
  // `nodeTimings` are used for simulator consumers, `completeNodeTimings` kept for debugging.
413
- const { nodeTimings, completeNodeTimings } = this._computeFinalNodeTimings();
413
+ const { nodeTimings, completeNodeTimings } = this.computeFinalNodeTimings();
414
414
  ALL_SIMULATION_NODE_TIMINGS.set(options.label || 'unlabeled', completeNodeTimings);
415
415
  return {
416
416
  timeInMs: totalElapsedTime,
@@ -418,7 +418,7 @@ class Simulator {
418
418
  };
419
419
  }
420
420
  computeWastedMsFromWastedBytes(wastedBytes) {
421
- const { throughput, observedThroughput } = this._options;
421
+ const { throughput, observedThroughput } = this.options;
422
422
  // https://github.com/GoogleChrome/lighthouse/pull/13323#issuecomment-962031709
423
423
  // 0 throughput means the no (additional) throttling is expected.
424
424
  // This is common for desktop + devtools throttling where throttling is additive and we don't want any additional.
@@ -439,7 +439,7 @@ class Simulator {
439
439
  * When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
440
440
  * it would have happened like that when the network was slower.
441
441
  */
442
- static _computeNodeStartPosition(node) {
442
+ static computeNodeStartPosition(node) {
443
443
  if (node.type === 'cpu') {
444
444
  return node.startTime;
445
445
  }