@paulirish/trace_engine 0.0.32 → 0.0.34

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 (309) hide show
  1. package/.tmp/tsbuildinfo/analyze-trace.d.mts +18 -0
  2. package/.tmp/tsbuildinfo/analyze-trace.d.mts.map +1 -0
  3. package/.tmp/tsbuildinfo/models/trace/LanternComputationData.d.ts +46 -0
  4. package/.tmp/tsbuildinfo/models/trace/LanternComputationData.d.ts.map +1 -0
  5. package/.tmp/tsbuildinfo/models/trace/LegacyTracingModel.d.ts +2 -0
  6. package/.tmp/tsbuildinfo/models/trace/LegacyTracingModel.d.ts.map +1 -0
  7. package/.tmp/tsbuildinfo/models/trace/ModelImpl.d.ts +72 -0
  8. package/.tmp/tsbuildinfo/models/trace/ModelImpl.d.ts.map +1 -0
  9. package/.tmp/tsbuildinfo/models/trace/Processor.d.ts +25 -0
  10. package/.tmp/tsbuildinfo/models/trace/Processor.d.ts.map +1 -0
  11. package/.tmp/tsbuildinfo/models/trace/TracingManager.d.ts +2 -0
  12. package/.tmp/tsbuildinfo/models/trace/TracingManager.d.ts.map +1 -0
  13. package/.tmp/tsbuildinfo/models/trace/trace.d.ts +13 -0
  14. package/.tmp/tsbuildinfo/models/trace/trace.d.ts.map +1 -0
  15. package/.tmp/tsbuildinfo/test/test-trace-engine.d.mts +2 -0
  16. package/.tmp/tsbuildinfo/test/test-trace-engine.d.mts.map +1 -0
  17. package/.tmp/tsbuildinfo/third_party/third-party-web/third-party-web.d.ts +3 -0
  18. package/.tmp/tsbuildinfo/third_party/third-party-web/third-party-web.d.ts.map +1 -0
  19. package/.tmp/tsbuildinfo/tsconfig.tsbuildinfo +1 -0
  20. package/README.md +6 -10
  21. package/analyze-trace.mjs +51 -16
  22. package/core/platform/ArrayUtilities.js +1 -0
  23. package/core/platform/ArrayUtilities.js.map +1 -1
  24. package/core/platform/DevToolsPath.d.ts +1 -1
  25. package/core/platform/DevToolsPath.js.map +1 -1
  26. package/core/platform/MimeType.js +4 -2
  27. package/core/platform/MimeType.js.map +1 -1
  28. package/core/platform/NumberUtilities.js +8 -0
  29. package/core/platform/NumberUtilities.js.map +1 -1
  30. package/core/platform/ServerTiming.d.ts +31 -0
  31. package/core/platform/ServerTiming.js +212 -0
  32. package/core/platform/ServerTiming.js.map +1 -0
  33. package/core/platform/Timing.d.ts +1 -1
  34. package/core/platform/Timing.js.map +1 -1
  35. package/core/platform/TypescriptUtilities.d.ts +3 -0
  36. package/core/platform/TypescriptUtilities.js.map +1 -1
  37. package/core/platform/UIString.d.ts +1 -1
  38. package/core/platform/UIString.js.map +1 -1
  39. package/core/platform/UserVisibleError.d.ts +1 -1
  40. package/core/platform/UserVisibleError.js.map +1 -1
  41. package/core/platform/platform-tsconfig.json +1 -1
  42. package/core/platform/platform.d.ts +2 -2
  43. package/core/platform/platform.js +2 -2
  44. package/core/platform/platform.js.map +1 -1
  45. package/generated/protocol.d.ts +289 -16
  46. package/models/trace/LanternComputationData.d.ts +4 -4
  47. package/models/trace/LanternComputationData.js +22 -23
  48. package/models/trace/LanternComputationData.js.map +1 -1
  49. package/models/trace/ModelImpl.d.ts +11 -12
  50. package/models/trace/ModelImpl.js +22 -33
  51. package/models/trace/ModelImpl.js.map +1 -1
  52. package/models/trace/Processor.d.ts +21 -12
  53. package/models/trace/Processor.js +151 -67
  54. package/models/trace/Processor.js.map +1 -1
  55. package/models/trace/TracingManager.js.map +1 -1
  56. package/models/trace/extras/FetchNodes.d.ts +8 -8
  57. package/models/trace/extras/FetchNodes.js +16 -11
  58. package/models/trace/extras/FetchNodes.js.map +1 -1
  59. package/models/trace/extras/FilmStrip.d.ts +2 -2
  60. package/models/trace/extras/FilmStrip.js +8 -8
  61. package/models/trace/extras/FilmStrip.js.map +1 -1
  62. package/models/trace/extras/MainThreadActivity.d.ts +1 -1
  63. package/models/trace/extras/MainThreadActivity.js +1 -1
  64. package/models/trace/extras/MainThreadActivity.js.map +1 -1
  65. package/models/trace/extras/Metadata.js +2 -2
  66. package/models/trace/extras/Metadata.js.map +1 -1
  67. package/models/trace/extras/ThirdParties.d.ts +23 -0
  68. package/models/trace/extras/ThirdParties.js +152 -0
  69. package/models/trace/extras/ThirdParties.js.map +1 -0
  70. package/models/trace/extras/URLForEntry.d.ts +9 -1
  71. package/models/trace/extras/URLForEntry.js +18 -10
  72. package/models/trace/extras/URLForEntry.js.map +1 -1
  73. package/models/trace/extras/extras-tsconfig.json +1 -0
  74. package/models/trace/extras/extras.d.ts +4 -1
  75. package/models/trace/extras/extras.js +4 -1
  76. package/models/trace/extras/extras.js.map +1 -1
  77. package/models/trace/handlers/AnimationHandler.d.ts +2 -2
  78. package/models/trace/handlers/AnimationHandler.js +1 -1
  79. package/models/trace/handlers/AnimationHandler.js.map +1 -1
  80. package/models/trace/handlers/AuctionWorkletsHandler.d.ts +2 -2
  81. package/models/trace/handlers/AuctionWorkletsHandler.js +11 -11
  82. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
  83. package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +6 -6
  84. package/models/trace/handlers/ExtensionTraceDataHandler.js +12 -8
  85. package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
  86. package/models/trace/handlers/FramesHandler.d.ts +34 -22
  87. package/models/trace/handlers/FramesHandler.js +54 -26
  88. package/models/trace/handlers/FramesHandler.js.map +1 -1
  89. package/models/trace/handlers/GPUHandler.d.ts +4 -4
  90. package/models/trace/handlers/GPUHandler.js +3 -3
  91. package/models/trace/handlers/GPUHandler.js.map +1 -1
  92. package/models/trace/handlers/ImagePaintingHandler.d.ts +3 -3
  93. package/models/trace/handlers/ImagePaintingHandler.js +6 -8
  94. package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
  95. package/models/trace/handlers/InitiatorsHandler.d.ts +3 -3
  96. package/models/trace/handlers/InitiatorsHandler.js +25 -14
  97. package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
  98. package/models/trace/handlers/InvalidationsHandler.d.ts +4 -2
  99. package/models/trace/handlers/InvalidationsHandler.js +29 -11
  100. package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
  101. package/models/trace/handlers/LargestImagePaintHandler.d.ts +2 -2
  102. package/models/trace/handlers/LargestImagePaintHandler.js +1 -1
  103. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
  104. package/models/trace/handlers/LargestTextPaintHandler.d.ts +2 -2
  105. package/models/trace/handlers/LargestTextPaintHandler.js +1 -1
  106. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -1
  107. package/models/trace/handlers/LayerTreeHandler.d.ts +6 -6
  108. package/models/trace/handlers/LayerTreeHandler.js +6 -6
  109. package/models/trace/handlers/LayerTreeHandler.js.map +1 -1
  110. package/models/trace/handlers/LayoutShiftsHandler.d.ts +14 -20
  111. package/models/trace/handlers/LayoutShiftsHandler.js +87 -12
  112. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
  113. package/models/trace/handlers/MemoryHandler.d.ts +2 -2
  114. package/models/trace/handlers/MemoryHandler.js +1 -1
  115. package/models/trace/handlers/MemoryHandler.js.map +1 -1
  116. package/models/trace/handlers/MetaHandler.d.ts +15 -14
  117. package/models/trace/handlers/MetaHandler.js +32 -30
  118. package/models/trace/handlers/MetaHandler.js.map +1 -1
  119. package/models/trace/handlers/ModelHandlers.d.ts +1 -1
  120. package/models/trace/handlers/ModelHandlers.js +1 -1
  121. package/models/trace/handlers/ModelHandlers.js.map +1 -1
  122. package/models/trace/handlers/NetworkRequestsHandler.d.ts +13 -12
  123. package/models/trace/handlers/NetworkRequestsHandler.js +68 -66
  124. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
  125. package/models/trace/handlers/PageFramesHandler.d.ts +2 -2
  126. package/models/trace/handlers/PageFramesHandler.js +2 -2
  127. package/models/trace/handlers/PageFramesHandler.js.map +1 -1
  128. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +7 -7
  129. package/models/trace/handlers/PageLoadMetricsHandler.js +21 -24
  130. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
  131. package/models/trace/handlers/RendererHandler.d.ts +19 -19
  132. package/models/trace/handlers/RendererHandler.js +5 -5
  133. package/models/trace/handlers/RendererHandler.js.map +1 -1
  134. package/models/trace/handlers/SamplesHandler.d.ts +6 -6
  135. package/models/trace/handlers/SamplesHandler.js +3 -3
  136. package/models/trace/handlers/SamplesHandler.js.map +1 -1
  137. package/models/trace/handlers/ScreenshotsHandler.d.ts +6 -4
  138. package/models/trace/handlers/ScreenshotsHandler.js +11 -9
  139. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
  140. package/models/trace/handlers/SelectorStatsHandler.d.ts +3 -3
  141. package/models/trace/handlers/SelectorStatsHandler.js +2 -2
  142. package/models/trace/handlers/SelectorStatsHandler.js.map +1 -1
  143. package/models/trace/handlers/ServerTimingsHandler.d.ts +10 -0
  144. package/models/trace/handlers/ServerTimingsHandler.js +118 -0
  145. package/models/trace/handlers/ServerTimingsHandler.js.map +1 -0
  146. package/models/trace/handlers/Threads.d.ts +7 -7
  147. package/models/trace/handlers/Threads.js +5 -5
  148. package/models/trace/handlers/Threads.js.map +1 -1
  149. package/models/trace/handlers/UserInteractionsHandler.d.ts +13 -11
  150. package/models/trace/handlers/UserInteractionsHandler.js +13 -7
  151. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
  152. package/models/trace/handlers/UserTimingsHandler.d.ts +5 -5
  153. package/models/trace/handlers/UserTimingsHandler.js +52 -9
  154. package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
  155. package/models/trace/handlers/WarningsHandler.d.ts +5 -5
  156. package/models/trace/handlers/WarningsHandler.js +4 -5
  157. package/models/trace/handlers/WarningsHandler.js.map +1 -1
  158. package/models/trace/handlers/WorkersHandler.d.ts +4 -4
  159. package/models/trace/handlers/WorkersHandler.js +1 -1
  160. package/models/trace/handlers/WorkersHandler.js.map +1 -1
  161. package/models/trace/handlers/handlers-tsconfig.json +1 -1
  162. package/models/trace/handlers/types.d.ts +7 -7
  163. package/models/trace/handlers/types.js.map +1 -1
  164. package/models/trace/helpers/Extensions.d.ts +2 -2
  165. package/models/trace/helpers/Extensions.js.map +1 -1
  166. package/models/trace/helpers/Network.d.ts +2 -2
  167. package/models/trace/helpers/Network.js +19 -2
  168. package/models/trace/helpers/Network.js.map +1 -1
  169. package/models/trace/helpers/SamplesIntegrator.d.ts +5 -5
  170. package/models/trace/helpers/SamplesIntegrator.js +10 -11
  171. package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
  172. package/models/trace/helpers/SyntheticEvents.d.ts +8 -14
  173. package/models/trace/helpers/SyntheticEvents.js +20 -31
  174. package/models/trace/helpers/SyntheticEvents.js.map +1 -1
  175. package/models/trace/helpers/Timing.d.ts +18 -4
  176. package/models/trace/helpers/Timing.js +43 -1
  177. package/models/trace/helpers/Timing.js.map +1 -1
  178. package/models/trace/helpers/Trace.d.ts +46 -32
  179. package/models/trace/helpers/Trace.js +53 -24
  180. package/models/trace/helpers/Trace.js.map +1 -1
  181. package/models/trace/helpers/TreeHelpers.d.ts +40 -8
  182. package/models/trace/helpers/TreeHelpers.js +147 -19
  183. package/models/trace/helpers/TreeHelpers.js.map +1 -1
  184. package/models/trace/helpers/helpers-tsconfig.json +3 -0
  185. package/models/trace/insights/Common.d.ts +4 -3
  186. package/models/trace/insights/Common.js +22 -7
  187. package/models/trace/insights/Common.js.map +1 -1
  188. package/models/trace/insights/CumulativeLayoutShift.d.ts +36 -13
  189. package/models/trace/insights/CumulativeLayoutShift.js +199 -73
  190. package/models/trace/insights/CumulativeLayoutShift.js.map +1 -1
  191. package/models/trace/insights/DocumentLatency.d.ts +9 -4
  192. package/models/trace/insights/DocumentLatency.js +82 -7
  193. package/models/trace/insights/DocumentLatency.js.map +1 -1
  194. package/models/trace/insights/FontDisplay.d.ts +11 -0
  195. package/models/trace/insights/FontDisplay.js +44 -0
  196. package/models/trace/insights/FontDisplay.js.map +1 -0
  197. package/models/trace/insights/InsightRunners.d.ts +3 -0
  198. package/models/trace/insights/InsightRunners.js +3 -0
  199. package/models/trace/insights/InsightRunners.js.map +1 -1
  200. package/models/trace/insights/InteractionToNextPaint.d.ts +4 -5
  201. package/models/trace/insights/InteractionToNextPaint.js +5 -3
  202. package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
  203. package/models/trace/insights/LargestContentfulPaint.d.ts +20 -7
  204. package/models/trace/insights/LargestContentfulPaint.js +57 -37
  205. package/models/trace/insights/LargestContentfulPaint.js.map +1 -1
  206. package/models/trace/insights/RenderBlocking.d.ts +3 -3
  207. package/models/trace/insights/RenderBlocking.js +29 -24
  208. package/models/trace/insights/RenderBlocking.js.map +1 -1
  209. package/models/trace/insights/SlowCSSSelector.d.ts +11 -0
  210. package/models/trace/insights/SlowCSSSelector.js +67 -0
  211. package/models/trace/insights/SlowCSSSelector.js.map +1 -0
  212. package/models/trace/insights/ThirdPartyWeb.d.ts +13 -0
  213. package/models/trace/insights/ThirdPartyWeb.js +42 -0
  214. package/models/trace/insights/ThirdPartyWeb.js.map +1 -0
  215. package/models/trace/insights/Viewport.d.ts +5 -2
  216. package/models/trace/insights/Viewport.js +14 -9
  217. package/models/trace/insights/Viewport.js.map +1 -1
  218. package/models/trace/insights/insights-tsconfig.json +9 -0
  219. package/models/trace/insights/insights.d.ts +1 -0
  220. package/models/trace/insights/insights.js +1 -0
  221. package/models/trace/insights/insights.js.map +1 -1
  222. package/models/trace/insights/types.d.ts +43 -25
  223. package/models/trace/insights/types.js.map +1 -1
  224. package/models/trace/lantern/core/NetworkAnalyzer.d.ts +9 -9
  225. package/models/trace/lantern/core/NetworkAnalyzer.js +18 -15
  226. package/models/trace/lantern/core/NetworkAnalyzer.js.map +1 -1
  227. package/models/trace/lantern/graph/BaseNode.d.ts +4 -4
  228. package/models/trace/lantern/graph/BaseNode.js +21 -21
  229. package/models/trace/lantern/graph/BaseNode.js.map +1 -1
  230. package/models/trace/lantern/graph/CPUNode.d.ts +1 -1
  231. package/models/trace/lantern/graph/CPUNode.js +5 -5
  232. package/models/trace/lantern/graph/CPUNode.js.map +1 -1
  233. package/models/trace/lantern/graph/PageDependencyGraph.d.ts +4 -4
  234. package/models/trace/lantern/graph/PageDependencyGraph.js +5 -5
  235. package/models/trace/lantern/graph/PageDependencyGraph.js.map +1 -1
  236. package/models/trace/lantern/simulation/ConnectionPool.d.ts +7 -7
  237. package/models/trace/lantern/simulation/ConnectionPool.js +26 -26
  238. package/models/trace/lantern/simulation/ConnectionPool.js.map +1 -1
  239. package/models/trace/lantern/simulation/DNSCache.d.ts +3 -3
  240. package/models/trace/lantern/simulation/DNSCache.js +11 -11
  241. package/models/trace/lantern/simulation/DNSCache.js.map +1 -1
  242. package/models/trace/lantern/simulation/SimulationTimingMap.d.ts +1 -1
  243. package/models/trace/lantern/simulation/SimulationTimingMap.js +15 -15
  244. package/models/trace/lantern/simulation/SimulationTimingMap.js.map +1 -1
  245. package/models/trace/lantern/simulation/Simulator.d.ts +28 -28
  246. package/models/trace/lantern/simulation/Simulator.js +113 -113
  247. package/models/trace/lantern/simulation/Simulator.js.map +1 -1
  248. package/models/trace/lantern/simulation/TCPConnection.d.ts +9 -9
  249. package/models/trace/lantern/simulation/TCPConnection.js +36 -36
  250. package/models/trace/lantern/simulation/TCPConnection.js.map +1 -1
  251. package/models/trace/root-causes/LayoutShift.d.ts +13 -13
  252. package/models/trace/root-causes/LayoutShift.js +7 -25
  253. package/models/trace/root-causes/LayoutShift.js.map +1 -1
  254. package/models/trace/types/Configuration.d.ts +16 -0
  255. package/models/trace/types/Configuration.js +1 -0
  256. package/models/trace/types/Configuration.js.map +1 -1
  257. package/models/trace/types/Extensions.d.ts +9 -12
  258. package/models/trace/types/Extensions.js +2 -1
  259. package/models/trace/types/Extensions.js.map +1 -1
  260. package/models/trace/types/File.d.ts +55 -23
  261. package/models/trace/types/File.js +15 -3
  262. package/models/trace/types/File.js.map +1 -1
  263. package/models/trace/types/TraceEvents.d.ts +868 -713
  264. package/models/trace/types/TraceEvents.js +281 -276
  265. package/models/trace/types/TraceEvents.js.map +1 -1
  266. package/models/trace/types/types.d.ts +1 -1
  267. package/models/trace/types/types.js +1 -1
  268. package/models/trace/types/types.js.map +1 -1
  269. package/package.json +10 -4
  270. package/test/test-trace-engine.mjs +56 -3
  271. package/third_party/third-party-web/third-party-web.js +1 -0
  272. package/tsconfig.json +29 -0
  273. package/core/platform/PromiseUtilities.d.ts +0 -10
  274. package/core/platform/PromiseUtilities.js +0 -18
  275. package/core/platform/PromiseUtilities.js.map +0 -1
  276. package/core/platform/SetUtilities.d.ts +0 -2
  277. package/core/platform/SetUtilities.js +0 -23
  278. package/core/platform/SetUtilities.js.map +0 -1
  279. package/models/trace/EntriesFilter.d.ts +0 -72
  280. package/models/trace/EntriesFilter.js +0 -296
  281. package/models/trace/EntriesFilter.js.map +0 -1
  282. package/models/trace/LegacyTracingModel.js.map +0 -1
  283. package/models/trace/handlers/EnhancedTracesHandler.d.ts +0 -48
  284. package/models/trace/handlers/EnhancedTracesHandler.js +0 -165
  285. package/models/trace/handlers/EnhancedTracesHandler.js.map +0 -1
  286. package/models/trace/lantern/BaseNode.d.ts +0 -91
  287. package/models/trace/lantern/BaseNode.js +0 -268
  288. package/models/trace/lantern/BaseNode.js.map +0 -1
  289. package/models/trace/lantern/CPUNode.d.ts +0 -24
  290. package/models/trace/lantern/CPUNode.js +0 -64
  291. package/models/trace/lantern/CPUNode.js.map +0 -1
  292. package/models/trace/lantern/LanternError.d.ts +0 -3
  293. package/models/trace/lantern/LanternError.js +0 -7
  294. package/models/trace/lantern/LanternError.js.map +0 -1
  295. package/models/trace/lantern/MetricsModule.d.ts +0 -11
  296. package/models/trace/lantern/MetricsModule.js +0 -14
  297. package/models/trace/lantern/MetricsModule.js.map +0 -1
  298. package/models/trace/lantern/NetworkNode.d.ts +0 -22
  299. package/models/trace/lantern/NetworkNode.js +0 -83
  300. package/models/trace/lantern/NetworkNode.js.map +0 -1
  301. package/models/trace/lantern/PageDependencyGraph.d.ts +0 -43
  302. package/models/trace/lantern/PageDependencyGraph.js +0 -509
  303. package/models/trace/lantern/PageDependencyGraph.js.map +0 -1
  304. package/models/trace/lantern/SimulationModule.d.ts +0 -17
  305. package/models/trace/lantern/SimulationModule.js +0 -13
  306. package/models/trace/lantern/SimulationModule.js.map +0 -1
  307. package/models/trace/lantern/simulation/NetworkAnalyzer.d.ts +0 -112
  308. package/models/trace/lantern/simulation/NetworkAnalyzer.js +0 -486
  309. package/models/trace/lantern/simulation/NetworkAnalyzer.js.map +0 -1
@@ -9,31 +9,31 @@ const TLS_SCHEMES = ['https', 'wss'];
9
9
  // https://cs.chromium.org/chromium/src/net/socket/client_socket_pool_manager.cc?type=cs&q="int+g_max_sockets_per_group"
10
10
  const CONNECTIONS_PER_ORIGIN = 6;
11
11
  export class ConnectionPool {
12
- _options;
13
- _records;
14
- _connectionsByOrigin;
15
- _connectionsByRequest;
12
+ options;
13
+ records;
14
+ connectionsByOrigin;
15
+ connectionsByRequest;
16
16
  _connectionsInUse;
17
- _connectionReusedByRequestId;
17
+ connectionReusedByRequestId;
18
18
  constructor(records, options) {
19
- this._options = options;
20
- this._records = records;
21
- this._connectionsByOrigin = new Map();
22
- this._connectionsByRequest = new Map();
19
+ this.options = options;
20
+ this.records = records;
21
+ this.connectionsByOrigin = new Map();
22
+ this.connectionsByRequest = new Map();
23
23
  this._connectionsInUse = new Set();
24
- this._connectionReusedByRequestId = Core.NetworkAnalyzer.estimateIfConnectionWasReused(records, {
24
+ this.connectionReusedByRequestId = Core.NetworkAnalyzer.estimateIfConnectionWasReused(records, {
25
25
  forceCoarseEstimates: true,
26
26
  });
27
- this._initializeConnections();
27
+ this.initializeConnections();
28
28
  }
29
29
  connectionsInUse() {
30
30
  return Array.from(this._connectionsInUse);
31
31
  }
32
- _initializeConnections() {
33
- const connectionReused = this._connectionReusedByRequestId;
34
- const additionalRttByOrigin = this._options.additionalRttByOrigin;
35
- const serverResponseTimeByOrigin = this._options.serverResponseTimeByOrigin;
36
- const recordsByOrigin = Core.NetworkAnalyzer.groupByOrigin(this._records);
32
+ initializeConnections() {
33
+ const connectionReused = this.connectionReusedByRequestId;
34
+ const additionalRttByOrigin = this.options.additionalRttByOrigin;
35
+ const serverResponseTimeByOrigin = this.options.serverResponseTimeByOrigin;
36
+ const recordsByOrigin = Core.NetworkAnalyzer.groupByOrigin(this.records);
37
37
  for (const [origin, requests] of recordsByOrigin.entries()) {
38
38
  const connections = [];
39
39
  const additionalRtt = additionalRttByOrigin.get(origin) || 0;
@@ -44,7 +44,7 @@ export class ConnectionPool {
44
44
  }
45
45
  const isTLS = TLS_SCHEMES.includes(request.parsedURL.scheme);
46
46
  const isH2 = request.protocol === 'h2';
47
- const connection = new TCPConnection(this._options.rtt + additionalRtt, this._options.throughput, responseTime, isTLS, isH2);
47
+ const connection = new TCPConnection(this.options.rtt + additionalRtt, this.options.throughput, responseTime, isTLS, isH2);
48
48
  connections.push(connection);
49
49
  }
50
50
  if (!connections.length) {
@@ -56,10 +56,10 @@ export class ConnectionPool {
56
56
  while (connections.length < minConnections) {
57
57
  connections.push(connections[0].clone());
58
58
  }
59
- this._connectionsByOrigin.set(origin, connections);
59
+ this.connectionsByOrigin.set(origin, connections);
60
60
  }
61
61
  }
62
- _findAvailableConnectionWithLargestCongestionWindow(connections) {
62
+ findAvailableConnectionWithLargestCongestionWindow(connections) {
63
63
  let maxConnection = null;
64
64
  for (let i = 0; i < connections.length; i++) {
65
65
  const connection = connections[i];
@@ -81,17 +81,17 @@ export class ConnectionPool {
81
81
  * records until release is called.
82
82
  */
83
83
  acquire(request) {
84
- if (this._connectionsByRequest.has(request)) {
84
+ if (this.connectionsByRequest.has(request)) {
85
85
  throw new Core.LanternError('Record already has a connection');
86
86
  }
87
87
  const origin = request.parsedURL.securityOrigin;
88
- const connections = this._connectionsByOrigin.get(origin) || [];
89
- const connectionToUse = this._findAvailableConnectionWithLargestCongestionWindow(connections);
88
+ const connections = this.connectionsByOrigin.get(origin) || [];
89
+ const connectionToUse = this.findAvailableConnectionWithLargestCongestionWindow(connections);
90
90
  if (!connectionToUse) {
91
91
  return null;
92
92
  }
93
93
  this._connectionsInUse.add(connectionToUse);
94
- this._connectionsByRequest.set(request, connectionToUse);
94
+ this.connectionsByRequest.set(request, connectionToUse);
95
95
  return connectionToUse;
96
96
  }
97
97
  /**
@@ -99,15 +99,15 @@ export class ConnectionPool {
99
99
  * currently being used for this request, an error will be thrown.
100
100
  */
101
101
  acquireActiveConnectionFromRequest(request) {
102
- const activeConnection = this._connectionsByRequest.get(request);
102
+ const activeConnection = this.connectionsByRequest.get(request);
103
103
  if (!activeConnection) {
104
104
  throw new Core.LanternError('Could not find an active connection for request');
105
105
  }
106
106
  return activeConnection;
107
107
  }
108
108
  release(request) {
109
- const connection = this._connectionsByRequest.get(request);
110
- this._connectionsByRequest.delete(request);
109
+ const connection = this.connectionsByRequest.get(request);
110
+ this.connectionsByRequest.delete(request);
111
111
  if (connection) {
112
112
  this._connectionsInUse.delete(connection);
113
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionPool.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/ConnectionPool.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\nimport * as Core from '../core/core.js';\nimport type * as Lantern from '../types/types.js';\n\nimport {TCPConnection} from './TCPConnection.js';\n\nconst DEFAULT_SERVER_RESPONSE_TIME = 30;\nconst TLS_SCHEMES = ['https', 'wss'];\n\n// Each origin can have 6 simulatenous connections open\n// https://cs.chromium.org/chromium/src/net/socket/client_socket_pool_manager.cc?type=cs&q=\"int+g_max_sockets_per_group\"\nconst CONNECTIONS_PER_ORIGIN = 6;\n\nexport class ConnectionPool {\n _options: Required<Lantern.Simulation.Options>;\n _records: Lantern.NetworkRequest[];\n _connectionsByOrigin: Map<string, TCPConnection[]>;\n _connectionsByRequest: Map<Lantern.NetworkRequest, TCPConnection>;\n _connectionsInUse: Set<TCPConnection>;\n _connectionReusedByRequestId: Map<string, boolean>;\n\n constructor(records: Lantern.NetworkRequest[], options: Required<Lantern.Simulation.Options>) {\n this._options = options;\n\n this._records = records;\n this._connectionsByOrigin = new Map();\n this._connectionsByRequest = new Map();\n this._connectionsInUse = new Set();\n this._connectionReusedByRequestId = Core.NetworkAnalyzer.estimateIfConnectionWasReused(records, {\n forceCoarseEstimates: true,\n });\n\n this._initializeConnections();\n }\n\n connectionsInUse(): TCPConnection[] {\n return Array.from(this._connectionsInUse);\n }\n\n _initializeConnections(): void {\n const connectionReused = this._connectionReusedByRequestId;\n const additionalRttByOrigin = this._options.additionalRttByOrigin;\n const serverResponseTimeByOrigin = this._options.serverResponseTimeByOrigin;\n\n const recordsByOrigin = Core.NetworkAnalyzer.groupByOrigin(this._records);\n for (const [origin, requests] of recordsByOrigin.entries()) {\n const connections = [];\n const additionalRtt = additionalRttByOrigin.get(origin) || 0;\n const responseTime = serverResponseTimeByOrigin.get(origin) || DEFAULT_SERVER_RESPONSE_TIME;\n\n for (const request of requests) {\n if (connectionReused.get(request.requestId)) {\n continue;\n }\n\n const isTLS = TLS_SCHEMES.includes(request.parsedURL.scheme);\n const isH2 = request.protocol === 'h2';\n const connection = new TCPConnection(\n this._options.rtt + additionalRtt,\n this._options.throughput,\n responseTime,\n isTLS,\n isH2,\n );\n\n connections.push(connection);\n }\n\n if (!connections.length) {\n throw new Core.LanternError(`Could not find a connection for origin: ${origin}`);\n }\n\n // Make sure each origin has minimum number of connections available for max throughput.\n // But only if it's not over H2 which maximizes throughput already.\n const minConnections = connections[0].isH2() ? 1 : CONNECTIONS_PER_ORIGIN;\n while (connections.length < minConnections) {\n connections.push(connections[0].clone());\n }\n\n this._connectionsByOrigin.set(origin, connections);\n }\n }\n\n _findAvailableConnectionWithLargestCongestionWindow(connections: TCPConnection[]): TCPConnection|null {\n let maxConnection: TCPConnection|null = null;\n for (let i = 0; i < connections.length; i++) {\n const connection = connections[i];\n\n // Connections that are in use are never available.\n if (this._connectionsInUse.has(connection)) {\n continue;\n }\n\n // This connection is a match and is available! Update our max if it has a larger congestionWindow\n const currentMax = (maxConnection?.congestionWindow) || -Infinity;\n if (connection.congestionWindow > currentMax) {\n maxConnection = connection;\n }\n }\n\n return maxConnection;\n }\n\n /**\n * This method finds an available connection to the origin specified by the network request or null\n * if no connection was available. If returned, connection will not be available for other network\n * records until release is called.\n */\n acquire(request: Lantern.NetworkRequest): TCPConnection|null {\n if (this._connectionsByRequest.has(request)) {\n throw new Core.LanternError('Record already has a connection');\n }\n\n const origin = request.parsedURL.securityOrigin;\n const connections = this._connectionsByOrigin.get(origin) || [];\n const connectionToUse = this._findAvailableConnectionWithLargestCongestionWindow(connections);\n\n if (!connectionToUse) {\n return null;\n }\n\n this._connectionsInUse.add(connectionToUse);\n this._connectionsByRequest.set(request, connectionToUse);\n return connectionToUse;\n }\n\n /**\n * Return the connection currently being used to fetch a request. If no connection\n * currently being used for this request, an error will be thrown.\n */\n acquireActiveConnectionFromRequest(request: Lantern.NetworkRequest): TCPConnection {\n const activeConnection = this._connectionsByRequest.get(request);\n if (!activeConnection) {\n throw new Core.LanternError('Could not find an active connection for request');\n }\n\n return activeConnection;\n }\n\n release(request: Lantern.NetworkRequest): void {\n const connection = this._connectionsByRequest.get(request);\n this._connectionsByRequest.delete(request);\n if (connection) {\n this._connectionsInUse.delete(connection);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ConnectionPool.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/ConnectionPool.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\nimport * as Core from '../core/core.js';\nimport type * as Lantern from '../types/types.js';\n\nimport {TCPConnection} from './TCPConnection.js';\n\nconst DEFAULT_SERVER_RESPONSE_TIME = 30;\nconst TLS_SCHEMES = ['https', 'wss'];\n\n// Each origin can have 6 simulatenous connections open\n// https://cs.chromium.org/chromium/src/net/socket/client_socket_pool_manager.cc?type=cs&q=\"int+g_max_sockets_per_group\"\nconst CONNECTIONS_PER_ORIGIN = 6;\n\nexport class ConnectionPool {\n options: Required<Lantern.Simulation.Options>;\n records: Lantern.NetworkRequest[];\n connectionsByOrigin: Map<string, TCPConnection[]>;\n connectionsByRequest: Map<Lantern.NetworkRequest, TCPConnection>;\n _connectionsInUse: Set<TCPConnection>;\n connectionReusedByRequestId: Map<string, boolean>;\n\n constructor(records: Lantern.NetworkRequest[], options: Required<Lantern.Simulation.Options>) {\n this.options = options;\n\n this.records = records;\n this.connectionsByOrigin = new Map();\n this.connectionsByRequest = new Map();\n this._connectionsInUse = new Set();\n this.connectionReusedByRequestId = Core.NetworkAnalyzer.estimateIfConnectionWasReused(records, {\n forceCoarseEstimates: true,\n });\n\n this.initializeConnections();\n }\n\n connectionsInUse(): TCPConnection[] {\n return Array.from(this._connectionsInUse);\n }\n\n initializeConnections(): void {\n const connectionReused = this.connectionReusedByRequestId;\n const additionalRttByOrigin = this.options.additionalRttByOrigin;\n const serverResponseTimeByOrigin = this.options.serverResponseTimeByOrigin;\n\n const recordsByOrigin = Core.NetworkAnalyzer.groupByOrigin(this.records);\n for (const [origin, requests] of recordsByOrigin.entries()) {\n const connections = [];\n const additionalRtt = additionalRttByOrigin.get(origin) || 0;\n const responseTime = serverResponseTimeByOrigin.get(origin) || DEFAULT_SERVER_RESPONSE_TIME;\n\n for (const request of requests) {\n if (connectionReused.get(request.requestId)) {\n continue;\n }\n\n const isTLS = TLS_SCHEMES.includes(request.parsedURL.scheme);\n const isH2 = request.protocol === 'h2';\n const connection = new TCPConnection(\n this.options.rtt + additionalRtt,\n this.options.throughput,\n responseTime,\n isTLS,\n isH2,\n );\n\n connections.push(connection);\n }\n\n if (!connections.length) {\n throw new Core.LanternError(`Could not find a connection for origin: ${origin}`);\n }\n\n // Make sure each origin has minimum number of connections available for max throughput.\n // But only if it's not over H2 which maximizes throughput already.\n const minConnections = connections[0].isH2() ? 1 : CONNECTIONS_PER_ORIGIN;\n while (connections.length < minConnections) {\n connections.push(connections[0].clone());\n }\n\n this.connectionsByOrigin.set(origin, connections);\n }\n }\n\n findAvailableConnectionWithLargestCongestionWindow(connections: TCPConnection[]): TCPConnection|null {\n let maxConnection: TCPConnection|null = null;\n for (let i = 0; i < connections.length; i++) {\n const connection = connections[i];\n\n // Connections that are in use are never available.\n if (this._connectionsInUse.has(connection)) {\n continue;\n }\n\n // This connection is a match and is available! Update our max if it has a larger congestionWindow\n const currentMax = (maxConnection?.congestionWindow) || -Infinity;\n if (connection.congestionWindow > currentMax) {\n maxConnection = connection;\n }\n }\n\n return maxConnection;\n }\n\n /**\n * This method finds an available connection to the origin specified by the network request or null\n * if no connection was available. If returned, connection will not be available for other network\n * records until release is called.\n */\n acquire(request: Lantern.NetworkRequest): TCPConnection|null {\n if (this.connectionsByRequest.has(request)) {\n throw new Core.LanternError('Record already has a connection');\n }\n\n const origin = request.parsedURL.securityOrigin;\n const connections = this.connectionsByOrigin.get(origin) || [];\n const connectionToUse = this.findAvailableConnectionWithLargestCongestionWindow(connections);\n\n if (!connectionToUse) {\n return null;\n }\n\n this._connectionsInUse.add(connectionToUse);\n this.connectionsByRequest.set(request, connectionToUse);\n return connectionToUse;\n }\n\n /**\n * Return the connection currently being used to fetch a request. If no connection\n * currently being used for this request, an error will be thrown.\n */\n acquireActiveConnectionFromRequest(request: Lantern.NetworkRequest): TCPConnection {\n const activeConnection = this.connectionsByRequest.get(request);\n if (!activeConnection) {\n throw new Core.LanternError('Could not find an active connection for request');\n }\n\n return activeConnection;\n }\n\n release(request: Lantern.NetworkRequest): void {\n const connection = this.connectionsByRequest.get(request);\n this.connectionsByRequest.delete(request);\n if (connection) {\n this._connectionsInUse.delete(connection);\n }\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import type * as Lantern from '../types/types.js';
2
2
  declare class DNSCache {
3
3
  static rttMultiplier: number;
4
- _rtt: number;
5
- _resolvedDomainNames: Map<string, {
4
+ rtt: number;
5
+ resolvedDomainNames: Map<string, {
6
6
  resolvedAt: number;
7
7
  }>;
8
8
  constructor({ rtt }: {
@@ -12,7 +12,7 @@ declare class DNSCache {
12
12
  requestedAt: number;
13
13
  shouldUpdateCache: boolean;
14
14
  }): number;
15
- _updateCacheResolvedAtIfNeeded(request: Lantern.NetworkRequest, resolvedAt: number): void;
15
+ updateCacheResolvedAtIfNeeded(request: Lantern.NetworkRequest, resolvedAt: number): void;
16
16
  /**
17
17
  * Forcefully sets the DNS resolution time for a request.
18
18
  * Useful for testing and alternate execution simulations.
@@ -9,39 +9,39 @@
9
9
  const DNS_RESOLUTION_RTT_MULTIPLIER = 2;
10
10
  class DNSCache {
11
11
  static rttMultiplier = DNS_RESOLUTION_RTT_MULTIPLIER;
12
- _rtt;
13
- _resolvedDomainNames;
12
+ rtt;
13
+ resolvedDomainNames;
14
14
  constructor({ rtt }) {
15
- this._rtt = rtt;
16
- this._resolvedDomainNames = new Map();
15
+ this.rtt = rtt;
16
+ this.resolvedDomainNames = new Map();
17
17
  }
18
18
  getTimeUntilResolution(request, options) {
19
19
  const { requestedAt = 0, shouldUpdateCache = false } = options || {};
20
20
  const domain = request.parsedURL.host;
21
- const cacheEntry = this._resolvedDomainNames.get(domain);
22
- let timeUntilResolved = this._rtt * DNSCache.rttMultiplier;
21
+ const cacheEntry = this.resolvedDomainNames.get(domain);
22
+ let timeUntilResolved = this.rtt * DNSCache.rttMultiplier;
23
23
  if (cacheEntry) {
24
24
  const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);
25
25
  timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);
26
26
  }
27
27
  const resolvedAt = requestedAt + timeUntilResolved;
28
28
  if (shouldUpdateCache) {
29
- this._updateCacheResolvedAtIfNeeded(request, resolvedAt);
29
+ this.updateCacheResolvedAtIfNeeded(request, resolvedAt);
30
30
  }
31
31
  return timeUntilResolved;
32
32
  }
33
- _updateCacheResolvedAtIfNeeded(request, resolvedAt) {
33
+ updateCacheResolvedAtIfNeeded(request, resolvedAt) {
34
34
  const domain = request.parsedURL.host;
35
- const cacheEntry = this._resolvedDomainNames.get(domain) || { resolvedAt };
35
+ const cacheEntry = this.resolvedDomainNames.get(domain) || { resolvedAt };
36
36
  cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);
37
- this._resolvedDomainNames.set(domain, cacheEntry);
37
+ this.resolvedDomainNames.set(domain, cacheEntry);
38
38
  }
39
39
  /**
40
40
  * Forcefully sets the DNS resolution time for a request.
41
41
  * Useful for testing and alternate execution simulations.
42
42
  */
43
43
  setResolvedAt(domain, resolvedAt) {
44
- this._resolvedDomainNames.set(domain, { resolvedAt });
44
+ this.resolvedDomainNames.set(domain, { resolvedAt });
45
45
  }
46
46
  }
47
47
  export { DNSCache };
@@ -1 +1 @@
1
- {"version":3,"file":"DNSCache.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/DNSCache.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAI7B,wGAAwG;AACxG,yHAAyH;AACzH,yHAAyH;AACzH,mGAAmG;AACnG,oGAAoG;AACpG,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,MAAM,QAAQ;IACZ,MAAM,CAAC,aAAa,GAAG,6BAA6B,CAAC;IAErD,IAAI,CAAS;IACb,oBAAoB,CAAoC;IAExD,YAAY,EAAC,GAAG,EAAgB;QAC9B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;IACxC,CAAC;IAED,sBAAsB,CAAC,OAA+B,EAAE,OAA2D;QAEjH,MAAM,EAAC,WAAW,GAAG,CAAC,EAAE,iBAAiB,GAAG,KAAK,EAAC,GAAG,OAAO,IAAI,EAAE,CAAC;QAEnE,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,iBAAiB,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC3D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,yBAAyB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;YACnF,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC;QACnD,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,8BAA8B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,8BAA8B,CAAC,OAA+B,EAAE,UAAkB;QAChF,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAC,UAAU,EAAC,CAAC;QACzE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,MAAc,EAAE,UAAkB;QAC9C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,UAAU,EAAC,CAAC,CAAC;IACtD,CAAC;;AAGH,OAAO,EAAC,QAAQ,EAAC,CAAC","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\nimport type * as Lantern from '../types/types.js';\n\n// A DNS lookup will usually take ~1-2 roundtrips of connection latency plus the extra DNS routing time.\n// Example: https://www.webpagetest.org/result/180703_3A_e33ec79747c002ed4d7bcbfc81462203/1/details/#waterfall_view_step1\n// Example: https://www.webpagetest.org/result/180707_1M_89673eb633b5d98386de95dfcf9b33d5/1/details/#waterfall_view_step1\n// DNS is highly variable though, many times it's a little more than 1, but can easily be 4-5x RTT.\n// We'll use 2 since it seems to give the most accurate results on average, but this can be tweaked.\nconst DNS_RESOLUTION_RTT_MULTIPLIER = 2;\n\nclass DNSCache {\n static rttMultiplier = DNS_RESOLUTION_RTT_MULTIPLIER;\n\n _rtt: number;\n _resolvedDomainNames: Map<string, {resolvedAt: number}>;\n\n constructor({rtt}: {rtt: number}) {\n this._rtt = rtt;\n this._resolvedDomainNames = new Map();\n }\n\n getTimeUntilResolution(request: Lantern.NetworkRequest, options?: {requestedAt: number, shouldUpdateCache: boolean}):\n number {\n const {requestedAt = 0, shouldUpdateCache = false} = options || {};\n\n const domain = request.parsedURL.host;\n const cacheEntry = this._resolvedDomainNames.get(domain);\n let timeUntilResolved = this._rtt * DNSCache.rttMultiplier;\n if (cacheEntry) {\n const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);\n timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);\n }\n\n const resolvedAt = requestedAt + timeUntilResolved;\n if (shouldUpdateCache) {\n this._updateCacheResolvedAtIfNeeded(request, resolvedAt);\n }\n\n return timeUntilResolved;\n }\n\n _updateCacheResolvedAtIfNeeded(request: Lantern.NetworkRequest, resolvedAt: number): void {\n const domain = request.parsedURL.host;\n const cacheEntry = this._resolvedDomainNames.get(domain) || {resolvedAt};\n cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);\n this._resolvedDomainNames.set(domain, cacheEntry);\n }\n\n /**\n * Forcefully sets the DNS resolution time for a request.\n * Useful for testing and alternate execution simulations.\n */\n setResolvedAt(domain: string, resolvedAt: number): void {\n this._resolvedDomainNames.set(domain, {resolvedAt});\n }\n}\n\nexport {DNSCache};\n"]}
1
+ {"version":3,"file":"DNSCache.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/DNSCache.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAI7B,wGAAwG;AACxG,yHAAyH;AACzH,yHAAyH;AACzH,mGAAmG;AACnG,oGAAoG;AACpG,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,MAAM,QAAQ;IACZ,MAAM,CAAC,aAAa,GAAG,6BAA6B,CAAC;IAErD,GAAG,CAAS;IACZ,mBAAmB,CAAoC;IAEvD,YAAY,EAAC,GAAG,EAAgB;QAC9B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;IACvC,CAAC;IAED,sBAAsB,CAAC,OAA+B,EAAE,OAA2D;QAEjH,MAAM,EAAC,WAAW,GAAG,CAAC,EAAE,iBAAiB,GAAG,KAAK,EAAC,GAAG,OAAO,IAAI,EAAE,CAAC;QAEnE,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,iBAAiB,GAAG,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,yBAAyB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;YACnF,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC;QACnD,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,6BAA6B,CAAC,OAA+B,EAAE,UAAkB;QAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAC,UAAU,EAAC,CAAC;QACxE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,MAAc,EAAE,UAAkB;QAC9C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,UAAU,EAAC,CAAC,CAAC;IACrD,CAAC;;AAGH,OAAO,EAAC,QAAQ,EAAC,CAAC","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\nimport type * as Lantern from '../types/types.js';\n\n// A DNS lookup will usually take ~1-2 roundtrips of connection latency plus the extra DNS routing time.\n// Example: https://www.webpagetest.org/result/180703_3A_e33ec79747c002ed4d7bcbfc81462203/1/details/#waterfall_view_step1\n// Example: https://www.webpagetest.org/result/180707_1M_89673eb633b5d98386de95dfcf9b33d5/1/details/#waterfall_view_step1\n// DNS is highly variable though, many times it's a little more than 1, but can easily be 4-5x RTT.\n// We'll use 2 since it seems to give the most accurate results on average, but this can be tweaked.\nconst DNS_RESOLUTION_RTT_MULTIPLIER = 2;\n\nclass DNSCache {\n static rttMultiplier = DNS_RESOLUTION_RTT_MULTIPLIER;\n\n rtt: number;\n resolvedDomainNames: Map<string, {resolvedAt: number}>;\n\n constructor({rtt}: {rtt: number}) {\n this.rtt = rtt;\n this.resolvedDomainNames = new Map();\n }\n\n getTimeUntilResolution(request: Lantern.NetworkRequest, options?: {requestedAt: number, shouldUpdateCache: boolean}):\n number {\n const {requestedAt = 0, shouldUpdateCache = false} = options || {};\n\n const domain = request.parsedURL.host;\n const cacheEntry = this.resolvedDomainNames.get(domain);\n let timeUntilResolved = this.rtt * DNSCache.rttMultiplier;\n if (cacheEntry) {\n const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);\n timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);\n }\n\n const resolvedAt = requestedAt + timeUntilResolved;\n if (shouldUpdateCache) {\n this.updateCacheResolvedAtIfNeeded(request, resolvedAt);\n }\n\n return timeUntilResolved;\n }\n\n updateCacheResolvedAtIfNeeded(request: Lantern.NetworkRequest, resolvedAt: number): void {\n const domain = request.parsedURL.host;\n const cacheEntry = this.resolvedDomainNames.get(domain) || {resolvedAt};\n cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);\n this.resolvedDomainNames.set(domain, cacheEntry);\n }\n\n /**\n * Forcefully sets the DNS resolution time for a request.\n * Useful for testing and alternate execution simulations.\n */\n setResolvedAt(domain: string, resolvedAt: number): void {\n this.resolvedDomainNames.set(domain, {resolvedAt});\n }\n}\n\nexport {DNSCache};\n"]}
@@ -26,7 +26,7 @@ export interface ConnectionTiming {
26
26
  timeToFirstByte: number;
27
27
  }
28
28
  declare class SimulatorTimingMap {
29
- _nodeTimings: Map<Graph.Node, NodeTimingData>;
29
+ nodeTimings: Map<Graph.Node, NodeTimingData>;
30
30
  constructor();
31
31
  getNodes(): Graph.Node[];
32
32
  setReadyToStart(node: Graph.Node, values: {
@@ -11,15 +11,15 @@
11
11
  import * as Core from '../core/core.js';
12
12
  import * as Graph from '../graph/graph.js';
13
13
  class SimulatorTimingMap {
14
- _nodeTimings;
14
+ nodeTimings;
15
15
  constructor() {
16
- this._nodeTimings = new Map();
16
+ this.nodeTimings = new Map();
17
17
  }
18
18
  getNodes() {
19
- return Array.from(this._nodeTimings.keys());
19
+ return Array.from(this.nodeTimings.keys());
20
20
  }
21
21
  setReadyToStart(node, values) {
22
- this._nodeTimings.set(node, values);
22
+ this.nodeTimings.set(node, values);
23
23
  }
24
24
  setInProgress(node, values) {
25
25
  const nodeTiming = {
@@ -27,7 +27,7 @@ class SimulatorTimingMap {
27
27
  startTime: values.startTime,
28
28
  timeElapsed: 0,
29
29
  };
30
- this._nodeTimings.set(node, node.type === Graph.BaseNode.types.NETWORK ? { ...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0 } :
30
+ this.nodeTimings.set(node, node.type === Graph.BaseNode.types.NETWORK ? { ...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0 } :
31
31
  nodeTiming);
32
32
  }
33
33
  setCompleted(node, values) {
@@ -36,21 +36,21 @@ class SimulatorTimingMap {
36
36
  endTime: values.endTime,
37
37
  connectionTiming: values.connectionTiming,
38
38
  };
39
- this._nodeTimings.set(node, nodeTiming);
39
+ this.nodeTimings.set(node, nodeTiming);
40
40
  }
41
41
  setCpu(node, values) {
42
42
  const nodeTiming = {
43
43
  ...this.getCpuStarted(node),
44
44
  timeElapsed: values.timeElapsed,
45
45
  };
46
- this._nodeTimings.set(node, nodeTiming);
46
+ this.nodeTimings.set(node, nodeTiming);
47
47
  }
48
48
  setCpuEstimated(node, values) {
49
49
  const nodeTiming = {
50
50
  ...this.getCpuStarted(node),
51
51
  estimatedTimeElapsed: values.estimatedTimeElapsed,
52
52
  };
53
- this._nodeTimings.set(node, nodeTiming);
53
+ this.nodeTimings.set(node, nodeTiming);
54
54
  }
55
55
  setNetwork(node, values) {
56
56
  const nodeTiming = {
@@ -59,24 +59,24 @@ class SimulatorTimingMap {
59
59
  timeElapsedOvershoot: values.timeElapsedOvershoot,
60
60
  bytesDownloaded: values.bytesDownloaded,
61
61
  };
62
- this._nodeTimings.set(node, nodeTiming);
62
+ this.nodeTimings.set(node, nodeTiming);
63
63
  }
64
64
  setNetworkEstimated(node, values) {
65
65
  const nodeTiming = {
66
66
  ...this.getNetworkStarted(node),
67
67
  estimatedTimeElapsed: values.estimatedTimeElapsed,
68
68
  };
69
- this._nodeTimings.set(node, nodeTiming);
69
+ this.nodeTimings.set(node, nodeTiming);
70
70
  }
71
71
  getQueued(node) {
72
- const timing = this._nodeTimings.get(node);
72
+ const timing = this.nodeTimings.get(node);
73
73
  if (!timing) {
74
74
  throw new Core.LanternError(`Node ${node.id} not yet queued`);
75
75
  }
76
76
  return timing;
77
77
  }
78
78
  getCpuStarted(node) {
79
- const timing = this._nodeTimings.get(node);
79
+ const timing = this.nodeTimings.get(node);
80
80
  if (!timing) {
81
81
  throw new Core.LanternError(`Node ${node.id} not yet queued`);
82
82
  }
@@ -89,7 +89,7 @@ class SimulatorTimingMap {
89
89
  return timing;
90
90
  }
91
91
  getNetworkStarted(node) {
92
- const timing = this._nodeTimings.get(node);
92
+ const timing = this.nodeTimings.get(node);
93
93
  if (!timing) {
94
94
  throw new Core.LanternError(`Node ${node.id} not yet queued`);
95
95
  }
@@ -102,7 +102,7 @@ class SimulatorTimingMap {
102
102
  return timing;
103
103
  }
104
104
  getInProgress(node) {
105
- const timing = this._nodeTimings.get(node);
105
+ const timing = this.nodeTimings.get(node);
106
106
  if (!timing) {
107
107
  throw new Core.LanternError(`Node ${node.id} not yet queued`);
108
108
  }
@@ -115,7 +115,7 @@ class SimulatorTimingMap {
115
115
  return timing;
116
116
  }
117
117
  getCompleted(node) {
118
- const timing = this._nodeTimings.get(node);
118
+ const timing = this.nodeTimings.get(node);
119
119
  if (!timing) {
120
120
  throw new Core.LanternError(`Node ${node.id} not yet queued`);
121
121
  }
@@ -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 };