Rocky_Mountain_Vending/.pnpm-store/v10/files/3a/103bcb4bbcf1431fd76379d1022bfdf6b24386bedf837831b58a31383d5b11b00a13e523330b5b9ab1aba31ca0a1d5509900f39e4c1f9ef42a77c059bab327
DMleadgen 46d973904b
Initial commit: Rocky Mountain Vending website
Next.js website for Rocky Mountain Vending company featuring:
- Product catalog with Stripe integration
- Service areas and parts pages
- Admin dashboard with Clerk authentication
- SEO optimized pages with JSON-LD structured data

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 16:22:15 -07:00

1 line
No EOL
78 KiB
Text

{"version":3,"file":"NetworkDependencyTree.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/insights/NetworkDependencyTree.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 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 i18n from '../../../core/i18n/i18n.js';\nimport * as Platform from '../../../core/platform/platform.js';\nimport * as Protocol from '../../../generated/protocol.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport type * as Lantern from '../lantern/lantern.js';\nimport * as Types from '../types/types.js';\n\nimport {\n InsightCategory,\n InsightKeys,\n type InsightModel,\n type InsightSetContext,\n type InsightSetContextWithNavigation,\n type PartialInsightModel,\n type RelatedEventsMap,\n} from './types.js';\n\nexport const UIStrings = {\n /**\n * @description Title of an insight that recommends avoiding chaining critical requests.\n */\n title: 'Network dependency tree',\n /**\n * @description Description of an insight that recommends avoiding chaining critical requests.\n */\n description:\n '[Avoid chaining critical requests](https://developer.chrome.com/docs/lighthouse/performance/critical-request-chains) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.',\n /**\n * @description Description of the warning that recommends avoiding chaining critical requests.\n */\n warningDescription:\n 'Avoid chaining critical requests by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.',\n /**\n * @description Text status indicating that there isn't long chaining critical network requests.\n */\n noNetworkDependencyTree: 'No rendering tasks impacted by network dependencies',\n /**\n * @description Text for the maximum critical path latency. This refers to the longest chain of network requests that\n * the browser must download before it can render the page.\n */\n maxCriticalPathLatency: 'Max critical path latency:',\n /** Label for a column in a data table; entries will be the network request */\n columnRequest: 'Request',\n /** Label for a column in a data table; entries will be the time from main document till current network request. */\n columnTime: 'Time',\n /**\n * @description Title of the table of the detected preconnect origins.\n */\n preconnectOriginsTableTitle: 'Preconnected origins',\n /**\n * @description Description of the table of the detected preconnect origins.\n */\n preconnectOriginsTableDescription:\n '[preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints help the browser establish a connection earlier in the page load, saving time when the first request for that origin is made. The following are the origins that the page preconnected to.',\n /**\n * @description Text status indicating that there isn't any preconnected origins.\n */\n noPreconnectOrigins: 'no origins were preconnected',\n /**\n * @description A warning message that is shown when found more than 4 preconnected links. \"preconnect\" should not be translated.\n */\n tooManyPreconnectLinksWarning:\n 'More than 4 `preconnect` connections were found. These should be used sparingly and only to the most important origins.',\n /**\n * @description A warning message that is shown when the user added preconnect for some unnecessary origins. \"preconnect\" should not be translated.\n */\n unusedWarning: 'Unused preconnect. Only use `preconnect` for origins that the page is likely to request.',\n /**\n * @description A warning message that is shown when the user forget to set the `crossorigin` HTML attribute, or setting it to an incorrect value, on the link is a common mistake when adding preconnect links. \"preconnect\" should not be translated.\n * */\n crossoriginWarning: 'Unused preconnect. Check that the `crossorigin` attribute is used properly.',\n /**\n * @description Label for a column in a data table; entries will be the source of the origin.\n */\n columnSource: 'Source',\n /**\n * @description Text status indicating that there isn't preconnect candidates.\n */\n noPreconnectCandidates: 'No additional origins are good candidates for preconnecting',\n /**\n * @description Title of the table that shows the origins that the page should have preconnected to.\n */\n estSavingTableTitle: 'Preconnect candidates',\n /**\n * @description Description of the table that recommends preconnecting to the origins to save time. \"preconnect\" should not be translated.\n */\n estSavingTableDescription:\n 'Add [preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints to your most important origins, but try to use no more than 4.',\n /**\n * @description Label for a column in a data table; entries will be the origin of a web resource\n */\n columnOrigin: 'Origin',\n /**\n * @description Label for a column in a data table; entries will be the number of milliseconds the user could reduce page load by if they implemented the suggestions.\n */\n columnWastedMs: 'Est LCP savings',\n} as const;\n\nconst str_ = i18n.i18n.registerUIStrings('models/trace/insights/NetworkDependencyTree.ts', UIStrings);\nexport const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);\n\n// XHRs are fetched at High priority, but we exclude them, as they are unlikely to be critical\n// Images are also non-critical.\nconst nonCriticalResourceTypes = new Set<Protocol.Network.ResourceType>([\n Protocol.Network.ResourceType.Image,\n Protocol.Network.ResourceType.XHR,\n Protocol.Network.ResourceType.Fetch,\n Protocol.Network.ResourceType.EventSource,\n]);\n\n// Preconnect establishes a \"clean\" socket. Chrome's socket manager will keep an unused socket\n// around for 10s. Meaning, the time delta between processing preconnect a request should be <10s,\n// otherwise it's wasted. We add a 5s margin so we are sure to capture all key requests.\n// @see https://github.com/GoogleChrome/lighthouse/issues/3106#issuecomment-333653747\nconst PRECONNECT_SOCKET_MAX_IDLE_IN_MS = Types.Timing.Milli(15_000);\n\nconst IGNORE_THRESHOLD_IN_MILLISECONDS = Types.Timing.Milli(50);\n\nexport const TOO_MANY_PRECONNECTS_THRESHOLD = 4;\n\nexport interface CriticalRequestNode {\n request: Types.Events.SyntheticNetworkRequest;\n timeFromInitialRequest: Types.Timing.Micro;\n children: CriticalRequestNode[];\n isLongest?: boolean;\n // Store all the requests that appear in any chains this request appears in.\n // Use set to avoid duplication.\n relatedRequests: Set<Types.Events.SyntheticNetworkRequest>;\n}\n\nexport type PreconnectedOrigin = PreconnectedOriginFromDom|PreconnectedOriginFromResponseHeader;\n\nexport interface PreconnectedOriginFromDom {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n node_id: Protocol.DOM.BackendNodeId;\n frame?: string;\n url: string;\n unused: boolean;\n crossorigin: boolean;\n source: 'DOM';\n}\n\nexport interface PreconnectedOriginFromResponseHeader {\n url: string;\n headerText: string;\n request: Types.Events.SyntheticNetworkRequest;\n unused: boolean;\n crossorigin: boolean;\n source: 'ResponseHeader';\n}\n\nexport interface PreconnectCandidate {\n origin: Platform.DevToolsPath.UrlString;\n wastedMs: Types.Timing.Milli;\n}\n\nexport type NetworkDependencyTreeInsightModel = InsightModel<typeof UIStrings, {\n rootNodes: CriticalRequestNode[],\n maxTime: Types.Timing.Micro,\n fail: boolean,\n preconnectedOrigins: PreconnectedOrigin[],\n preconnectCandidates: PreconnectCandidate[],\n}>;\n\nfunction finalize(partialModel: PartialInsightModel<NetworkDependencyTreeInsightModel>):\n NetworkDependencyTreeInsightModel {\n return {\n insightKey: InsightKeys.NETWORK_DEPENDENCY_TREE,\n strings: UIStrings,\n title: i18nString(UIStrings.title),\n description: i18nString(UIStrings.description),\n category: InsightCategory.LCP,\n state: partialModel.fail ? 'fail' : 'pass',\n ...partialModel,\n };\n}\n\nfunction isCritical(request: Types.Events.SyntheticNetworkRequest, context: InsightSetContextWithNavigation): boolean {\n // The main resource is always critical.\n if (request.args.data.requestId === context.navigationId) {\n return true;\n }\n\n // Treat any preloaded resource as non-critical\n if (request.args.data.isLinkPreload) {\n return false;\n }\n\n // Iframes are considered High Priority but they are not render blocking\n const isIframe = request.args.data.resourceType === Protocol.Network.ResourceType.Document &&\n request.args.data.frame !== context.frameId;\n\n if (nonCriticalResourceTypes.has(request.args.data.resourceType) || isIframe ||\n // Treat any missed images, primarily favicons, as non-critical resources\n request.args.data.mimeType.startsWith('image/')) {\n return false;\n }\n\n // Requests that have no initiatorRequest are typically ambiguous late-load assets.\n // Even on the off chance they were important, we don't have any parent to display for them.\n const initiatorUrl =\n request.args.data.initiator?.url || Helpers.Trace.getZeroIndexedStackTraceInEventPayload(request)?.at(0)?.url;\n if (!initiatorUrl) {\n return false;\n }\n\n const isBlocking = Helpers.Network.isSyntheticNetworkRequestEventRenderBlocking(request);\n const isHighPriority = Helpers.Network.isSyntheticNetworkRequestHighPriority(request);\n return isHighPriority || isBlocking;\n}\n\nfunction findMaxLeafNode(node: CriticalRequestNode): CriticalRequestNode {\n if (node.children.length === 0) {\n return node;\n }\n let maxLeaf = node.children[0];\n for (const child of node.children) {\n const leaf = findMaxLeafNode(child);\n if (leaf.timeFromInitialRequest > maxLeaf.timeFromInitialRequest) {\n maxLeaf = leaf;\n }\n }\n return maxLeaf;\n}\n\nfunction sortRecursively(nodes: CriticalRequestNode[]): void {\n for (const node of nodes) {\n if (node.children.length > 0) {\n node.children.sort((nodeA, nodeB) => {\n const leafA = findMaxLeafNode(nodeA);\n const leafB = findMaxLeafNode(nodeB);\n return leafB.timeFromInitialRequest - leafA.timeFromInitialRequest;\n });\n sortRecursively(node.children);\n }\n }\n}\n\nfunction generateNetworkDependencyTree(context: InsightSetContextWithNavigation): {\n rootNodes: CriticalRequestNode[],\n maxTime: Types.Timing.Micro,\n fail: boolean,\n relatedEvents?: RelatedEventsMap,\n} {\n const rootNodes: CriticalRequestNode[] = [];\n const relatedEvents: RelatedEventsMap = new Map();\n let maxTime = Types.Timing.Micro(0);\n let fail = false;\n\n let longestChain: Types.Events.SyntheticNetworkRequest[] = [];\n\n function addChain(path: Types.Events.SyntheticNetworkRequest[]): void {\n if (path.length === 0) {\n return;\n }\n if (path.length >= 2) {\n fail = true;\n }\n const initialRequest = path[0];\n const lastRequest = path[path.length - 1];\n const totalChainTime = Types.Timing.Micro(lastRequest.ts + lastRequest.dur - initialRequest.ts);\n if (totalChainTime > maxTime) {\n maxTime = totalChainTime;\n longestChain = path;\n }\n\n let currentNodes = rootNodes;\n\n for (let depth = 0; depth < path.length; ++depth) {\n const request = path[depth];\n // find the request\n let found = currentNodes.find(node => node.request === request);\n\n if (!found) {\n const timeFromInitialRequest = Types.Timing.Micro(request.ts + request.dur - initialRequest.ts);\n found = {\n request,\n timeFromInitialRequest,\n children: [],\n relatedRequests: new Set(),\n };\n currentNodes.push(found);\n }\n\n path.forEach(request => found?.relatedRequests.add(request));\n\n // TODO(b/372897712): When RelatedInsight supports markdown, remove\n // UIStrings.warningDescription and use UIStrings.description.\n relatedEvents.set(request, depth < 2 ? [] : [i18nString(UIStrings.warningDescription)]);\n\n currentNodes = found.children;\n }\n }\n // By default `traverse` will discover nodes in BFS-order regardless of dependencies, but\n // here we need traversal in a topological sort order. We'll visit a node only when its\n // dependencies have been met.\n const seenNodes = new Set<Lantern.Graph.Node<Types.Events.SyntheticNetworkRequest>>();\n function getNextNodes(node: Lantern.Graph.Node<Types.Events.SyntheticNetworkRequest>):\n Array<Lantern.Graph.Node<Types.Events.SyntheticNetworkRequest>> {\n return node.getDependents().filter(n => n.getDependencies().every(d => seenNodes.has(d)));\n }\n\n context.lantern?.graph.traverse((node, traversalPath) => {\n seenNodes.add(node);\n if (node.type !== 'network') {\n return;\n }\n const networkNode = node;\n if (!isCritical(networkNode.rawRequest, context)) {\n return;\n }\n\n const networkPath = traversalPath.filter(node => node.type === 'network').reverse().map(node => node.rawRequest);\n\n // Ignore if some ancestor is not a critical request.\n if (networkPath.some(request => (!isCritical(request, context)))) {\n return;\n }\n\n // Ignore non-network things (like data urls).\n if (node.isNonNetworkProtocol) {\n return;\n }\n\n addChain(networkPath);\n }, getNextNodes);\n\n // Mark the longest chain\n if (longestChain.length > 0) {\n let currentNodes = rootNodes;\n for (const request of longestChain) {\n const found = currentNodes.find(node => node.request === request);\n if (found) {\n found.isLongest = true;\n currentNodes = found.children;\n } else {\n console.error('Some request in the longest chain is not found');\n }\n }\n }\n\n sortRecursively(rootNodes);\n\n return {\n rootNodes,\n maxTime,\n fail,\n relatedEvents,\n };\n}\n\nfunction getSecurityOrigin(url: string): Platform.DevToolsPath.UrlString {\n const parsedURL = new ParsedURL(url);\n return parsedURL.securityOrigin();\n}\n\nfunction handleLinkResponseHeaderPart(trimmedPart: string): {url: string, headerText: string}|null {\n if (!trimmedPart) {\n // Skip empty string\n return null;\n }\n\n // Extract URL\n const urlStart = trimmedPart.indexOf('<');\n const urlEnd = trimmedPart.indexOf('>');\n\n if (urlStart !== 0 || urlEnd === -1 || urlEnd <= urlStart) {\n // Skip parts without a valid URI (must start with '<' and have a closing '>')\n return null;\n }\n\n const url = trimmedPart.substring(urlStart + 1, urlEnd).trim();\n if (!url) {\n // Skip empty url\n return null;\n }\n\n // Extract parameters string (everything after '>')\n const paramsString = trimmedPart.substring(urlEnd + 1).trim();\n\n if (paramsString) {\n const params = paramsString.split(';');\n\n for (const param of params) {\n const trimmedParam = param.trim();\n if (!trimmedParam) {\n continue;\n }\n\n const eqIndex = trimmedParam.indexOf('=');\n if (eqIndex === -1) {\n // Skip malformed parameters without an '='\n continue;\n }\n\n const paramName = trimmedParam.substring(0, eqIndex).trim().toLowerCase();\n let paramValue = trimmedParam.substring(eqIndex + 1).trim();\n\n // Remove quotes from value if present\n if (paramValue.startsWith('\"') && paramValue.endsWith('\"')) {\n paramValue = paramValue.substring(1, paramValue.length - 1);\n }\n\n if (paramName === 'rel' && paramValue === 'preconnect') {\n // Found 'rel=preconnect', no need to process other parameters for this link\n return {url, headerText: trimmedPart};\n }\n }\n }\n return null;\n}\n\n/**\n * Parses an HTTP Link header string into an array of url and related header text.\n *\n * Export the function for test purpose.\n * @param linkHeaderValue The value of the HTTP Link header (e.g., '</style.css>; rel=preload; as=style, <https://example.com>; rel=\"preconnect\"').\n * @returns An array of url and header text objects if it contains `rel=preconnect`.\n */\nexport function handleLinkResponseHeader(linkHeaderValue: string): Array<{url: string, headerText: string}> {\n if (!linkHeaderValue) {\n return [];\n }\n const preconnectedOrigins: Array<{url: string, headerText: string}> = [];\n\n for (let i = 0; i < linkHeaderValue.length;) {\n const firstUrlEnd = linkHeaderValue.indexOf('>', i);\n if (firstUrlEnd === -1) {\n break;\n }\n\n const commaIndex = linkHeaderValue.indexOf(',', firstUrlEnd);\n const partEnd = commaIndex !== -1 ? commaIndex : linkHeaderValue.length;\n const part = linkHeaderValue.substring(i, partEnd);\n\n // This shouldn't be necessary, but we had a bug that created an infinite loop so\n // let's guard against that.\n // See crbug.com/431239629\n if (partEnd + 1 <= i) {\n console.warn('unexpected infinite loop, bailing');\n break;\n }\n\n i = partEnd + 1;\n\n const preconnectedOrigin = handleLinkResponseHeaderPart(part.trim());\n if (preconnectedOrigin) {\n preconnectedOrigins.push(preconnectedOrigin);\n }\n }\n\n return preconnectedOrigins;\n}\n\n// Export the function for test purpose.\nexport function generatePreconnectedOrigins(\n parsedTrace: Handlers.Types.ParsedTrace, context: InsightSetContextWithNavigation,\n contextRequests: Types.Events.SyntheticNetworkRequest[],\n preconnectCandidates: PreconnectCandidate[]): PreconnectedOrigin[] {\n const preconnectedOrigins: PreconnectedOrigin[] = [];\n for (const event of parsedTrace.NetworkRequests.linkPreconnectEvents) {\n preconnectedOrigins.push({\n node_id: event.args.data.node_id,\n frame: event.args.data.frame,\n url: event.args.data.url,\n // For each origin the page wanted to preconnect to:\n // - if we found no network requests to that origin at all then we issue a unused warning\n unused: !contextRequests.some(\n request => getSecurityOrigin(event.args.data.url) === getSecurityOrigin(request.args.data.url)),\n // - else (we found network requests to the same origin) and if some of those network requests is too slow (if\n // they are preconnect candidates), then we issue a unused warning with crossorigin hint\n crossorigin: preconnectCandidates.some(candidate => candidate.origin === getSecurityOrigin(event.args.data.url)),\n source: 'DOM',\n });\n }\n\n const documentRequest = parsedTrace.NetworkRequests.byId.get(context.navigationId);\n documentRequest?.args.data.responseHeaders?.forEach(header => {\n if (header.name.toLowerCase() === 'link') {\n const preconnectedOriginsFromResponseHeader = handleLinkResponseHeader(header.value); // , documentRequest);\n preconnectedOriginsFromResponseHeader?.forEach(origin => preconnectedOrigins.push({\n url: origin.url,\n headerText: origin.headerText,\n request: documentRequest,\n // For each origin the page wanted to preconnect to:\n // - if we found no network requests to that origin at all then we issue a unused warning\n unused: !contextRequests.some(\n request => getSecurityOrigin(origin.url) === getSecurityOrigin(request.args.data.url)),\n // - else (we found network requests to the same origin) and if some of those network requests is too slow (if\n // they are preconnect candidates), then we issue a unused warning with crossorigin hint\n crossorigin: preconnectCandidates.some(candidate => candidate.origin === getSecurityOrigin(origin.url)),\n source: 'ResponseHeader',\n }));\n }\n });\n\n return preconnectedOrigins;\n}\n\nfunction hasValidTiming(request: Types.Events.SyntheticNetworkRequest): boolean {\n return !!request.args.data.timing && request.args.data.timing.connectEnd >= 0 &&\n request.args.data.timing.connectStart >= 0;\n}\n\nfunction hasAlreadyConnectedToOrigin(request: Types.Events.SyntheticNetworkRequest): boolean {\n const {timing} = request.args.data;\n if (!timing) {\n return false;\n }\n\n // When these values are given as -1, that means the page has\n // a connection for this origin and paid these costs already.\n if (timing.dnsStart === -1 && timing.dnsEnd === -1 && timing.connectStart === -1 && timing.connectEnd === -1) {\n return true;\n }\n\n // Less understood: if the connection setup took no time at all, consider\n // it the same as the above. It is unclear if this is correct, or is even possible.\n if (timing.dnsEnd - timing.dnsStart === 0 && timing.connectEnd - timing.connectStart === 0) {\n return true;\n }\n\n return false;\n}\n\nfunction socketStartTimeIsBelowThreshold(\n request: Types.Events.SyntheticNetworkRequest, mainResource: Types.Events.SyntheticNetworkRequest): boolean {\n const timeSinceMainEnd =\n Math.max(0, request.args.data.syntheticData.sendStartTime - mainResource.args.data.syntheticData.finishTime) as\n Types.Timing.Micro;\n return Helpers.Timing.microToMilli(timeSinceMainEnd) < PRECONNECT_SOCKET_MAX_IDLE_IN_MS;\n}\n\nfunction candidateRequestsByOrigin(\n parsedTrace: Handlers.Types.ParsedTrace, mainResource: Types.Events.SyntheticNetworkRequest,\n contextRequests: Types.Events.SyntheticNetworkRequest[],\n lcpGraphURLs: Set<string>): Map<string, Types.Events.SyntheticNetworkRequest[]> {\n const origins = new Map<string, Types.Events.SyntheticNetworkRequest[]>();\n\n contextRequests.forEach(request => {\n if (!hasValidTiming(request)) {\n return;\n }\n\n // Filter out all resources that are loaded by the document. Connections are already early.\n if (parsedTrace.NetworkRequests.eventToInitiator.get(request) === mainResource) {\n return;\n }\n\n const url = new URL(request.args.data.url);\n // Filter out urls that do not have an origin (data, file, etc).\n if (url.origin === 'null') {\n return;\n }\n const mainOrigin = new URL(mainResource.args.data.url).origin;\n // Filter out all resources that have the same origin. We're already connected.\n if (url.origin === mainOrigin) {\n return;\n }\n\n // Filter out anything that wasn't part of LCP. Only recommend important origins.\n if (!lcpGraphURLs.has(request.args.data.url)) {\n return;\n }\n // Filter out all resources where origins are already resolved.\n if (hasAlreadyConnectedToOrigin(request)) {\n return;\n }\n // Make sure the requests are below the PRECONNECT_SOCKET_MAX_IDLE_IN_MS (15s) mark.\n if (!socketStartTimeIsBelowThreshold(request, mainResource)) {\n return;\n }\n\n const originRequests = Platform.MapUtilities.getWithDefault(origins, url.origin, () => []);\n originRequests.push(request);\n });\n\n return origins;\n}\n\n// Export the function for test purpose.\nexport function generatePreconnectCandidates(\n parsedTrace: Handlers.Types.ParsedTrace, context: InsightSetContextWithNavigation,\n contextRequests: Types.Events.SyntheticNetworkRequest[]): PreconnectCandidate[] {\n if (!context.lantern) {\n return [];\n }\n\n const documentRequest = parsedTrace.NetworkRequests.byId.get(context.navigationId);\n if (!documentRequest) {\n return [];\n }\n\n const {rtt, additionalRttByOrigin} = context.lantern.simulator.getOptions();\n const lcpGraph = context.lantern.metrics.largestContentfulPaint.pessimisticGraph;\n const fcpGraph = context.lantern.metrics.firstContentfulPaint.pessimisticGraph;\n const lcpGraphURLs = new Set<string>();\n lcpGraph.traverse(node => {\n if (node.type === 'network') {\n lcpGraphURLs.add(node.request.url);\n }\n });\n const fcpGraphURLs = new Set<string>();\n fcpGraph.traverse(node => {\n if (node.type === 'network') {\n fcpGraphURLs.add(node.request.url);\n }\n });\n\n const groupedOrigins = candidateRequestsByOrigin(parsedTrace, documentRequest, contextRequests, lcpGraphURLs);\n\n let maxWastedLcp = Types.Timing.Milli(0);\n let maxWastedFcp = Types.Timing.Milli(0);\n let preconnectCandidates: PreconnectCandidate[] = [];\n\n groupedOrigins.forEach(requests => {\n const firstRequestOfOrigin = requests[0];\n\n // Skip the origin if we don't have timing information\n if (!firstRequestOfOrigin.args.data.timing) {\n return;\n }\n\n const firstRequestOfOriginParsedURL = new ParsedURL(firstRequestOfOrigin.args.data.url);\n const origin = firstRequestOfOriginParsedURL.securityOrigin();\n\n // Approximate the connection time with the duration of TCP (+potentially SSL) handshake\n // DNS time can be large but can also be 0 if a commonly used origin that's cached, so make\n // no assumption about DNS.\n const additionalRtt = additionalRttByOrigin.get(origin) ?? 0;\n let connectionTime = Types.Timing.Milli(rtt + additionalRtt);\n // TCP Handshake will be at least 2 RTTs for TLS connections\n if (firstRequestOfOriginParsedURL.scheme === 'https') {\n connectionTime = Types.Timing.Milli(connectionTime * 2);\n }\n\n const timeBetweenMainResourceAndDnsStart = Types.Timing.Micro(\n firstRequestOfOrigin.args.data.syntheticData.sendStartTime -\n documentRequest.args.data.syntheticData.finishTime +\n Helpers.Timing.milliToMicro(firstRequestOfOrigin.args.data.timing.dnsStart));\n const wastedMs =\n Math.min(connectionTime, Helpers.Timing.microToMilli(timeBetweenMainResourceAndDnsStart)) as Types.Timing.Milli;\n if (wastedMs < IGNORE_THRESHOLD_IN_MILLISECONDS) {\n return;\n }\n\n maxWastedLcp = Math.max(wastedMs, maxWastedLcp) as Types.Timing.Milli;\n\n if (fcpGraphURLs.has(firstRequestOfOrigin.args.data.url)) {\n maxWastedFcp = Math.max(wastedMs, maxWastedFcp) as Types.Timing.Milli;\n }\n preconnectCandidates.push({\n origin,\n wastedMs,\n });\n });\n\n preconnectCandidates = preconnectCandidates.sort((a, b) => b.wastedMs - a.wastedMs);\n\n return preconnectCandidates.slice(0, TOO_MANY_PRECONNECTS_THRESHOLD);\n}\n\nexport function generateInsight(\n parsedTrace: Handlers.Types.ParsedTrace, context: InsightSetContext): NetworkDependencyTreeInsightModel {\n if (!context.navigation) {\n return finalize({\n rootNodes: [],\n maxTime: 0 as Types.Timing.Micro,\n fail: false,\n preconnectedOrigins: [],\n preconnectCandidates: [],\n });\n }\n\n const {\n rootNodes,\n maxTime,\n fail,\n relatedEvents,\n } = generateNetworkDependencyTree(context);\n\n const isWithinContext = (event: Types.Events.Event): boolean => Helpers.Timing.eventIsInBounds(event, context.bounds);\n const contextRequests = parsedTrace.NetworkRequests.byTime.filter(isWithinContext);\n\n const preconnectCandidates = generatePreconnectCandidates(parsedTrace, context, contextRequests);\n\n const preconnectedOrigins = generatePreconnectedOrigins(parsedTrace, context, contextRequests, preconnectCandidates);\n\n return finalize({\n rootNodes,\n maxTime,\n fail,\n relatedEvents,\n preconnectedOrigins,\n preconnectCandidates,\n });\n}\n\nexport function createOverlays(model: NetworkDependencyTreeInsightModel): Types.Overlays.Overlay[] {\n function walk(nodes: CriticalRequestNode[], overlays: Types.Overlays.Overlay[]): void {\n nodes.forEach(node => {\n overlays.push({\n type: 'ENTRY_OUTLINE',\n entry: node.request,\n outlineReason: 'ERROR',\n });\n walk(node.children, overlays);\n });\n }\n\n const overlays: Types.Overlays.Overlay[] = [];\n walk(model.rootNodes, overlays);\n\n return overlays;\n}\n\n// the rest of this file is copied from core/common/common.js, which can't be bundled right now.\n\n/**\n * http://tools.ietf.org/html/rfc3986#section-5.2.4\n */\nexport function normalizePath(path: string): string {\n if (path.indexOf('..') === -1 && path.indexOf('.') === -1) {\n return path;\n }\n\n // Remove leading slash (will be added back below) so we\n // can handle all (including empty) segments consistently.\n const segments = (path[0] === '/' ? path.substring(1) : path).split('/');\n const normalizedSegments = [];\n for (const segment of segments) {\n if (segment === '.') {\n continue;\n } else if (segment === '..') {\n normalizedSegments.pop();\n } else {\n normalizedSegments.push(segment);\n }\n }\n let normalizedPath = normalizedSegments.join('/');\n if (path[0] === '/' && normalizedPath) {\n normalizedPath = '/' + normalizedPath;\n }\n if (normalizedPath[normalizedPath.length - 1] !== '/' &&\n ((path[path.length - 1] === '/') || (segments[segments.length - 1] === '.') ||\n (segments[segments.length - 1] === '..'))) {\n normalizedPath = normalizedPath + '/';\n }\n\n return normalizedPath;\n}\n\nexport function schemeIs(url: Platform.DevToolsPath.UrlString, scheme: string): boolean {\n try {\n return (new URL(url)).protocol === scheme;\n } catch {\n return false;\n }\n}\n\n/**\n * File paths in DevTools that are represented either as unencoded absolute or relative paths, or encoded paths, or URLs.\n * @example\n * RawPathString: “/Hello World/file.js”\n * EncodedPathString: “/Hello%20World/file.js”\n * UrlString: “file:///Hello%20World/file/js”\n */\ntype BrandedPathString =\n Platform.DevToolsPath.UrlString|Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.EncodedPathString;\n\nexport class ParsedURL {\n isValid: boolean;\n url: string;\n scheme: string;\n user: string;\n host: string;\n port: string;\n path: string;\n queryParams: string;\n fragment: string;\n folderPathComponents: string;\n lastPathComponent: string;\n readonly blobInnerScheme: string|undefined;\n\n constructor(url: string) {\n this.isValid = false;\n this.url = url;\n this.scheme = '';\n this.user = '';\n this.host = '';\n this.port = '';\n this.path = '';\n this.queryParams = '';\n this.fragment = '';\n this.folderPathComponents = '';\n this.lastPathComponent = '';\n\n const isBlobUrl = this.url.startsWith('blob:');\n const urlToMatch = isBlobUrl ? url.substring(5) : url;\n const match = urlToMatch.match(ParsedURL.urlRegex());\n if (match) {\n this.isValid = true;\n if (isBlobUrl) {\n this.blobInnerScheme = match[2].toLowerCase();\n this.scheme = 'blob';\n } else {\n this.scheme = match[2].toLowerCase();\n }\n this.user = match[3] ?? '';\n this.host = match[4] ?? '';\n this.port = match[5] ?? '';\n this.path = match[6] ?? '/';\n this.queryParams = match[7] ?? '';\n this.fragment = match[8] ?? '';\n } else {\n if (this.url.startsWith('data:')) {\n this.scheme = 'data';\n return;\n }\n if (this.url.startsWith('blob:')) {\n this.scheme = 'blob';\n return;\n }\n if (this.url === 'about:blank') {\n this.scheme = 'about';\n return;\n }\n this.path = this.url;\n }\n\n const lastSlashExceptTrailingIndex = this.path.lastIndexOf('/', this.path.length - 2);\n if (lastSlashExceptTrailingIndex !== -1) {\n this.lastPathComponent = this.path.substring(lastSlashExceptTrailingIndex + 1);\n } else {\n this.lastPathComponent = this.path;\n }\n const lastSlashIndex = this.path.lastIndexOf('/');\n if (lastSlashIndex !== -1) {\n this.folderPathComponents = this.path.substring(0, lastSlashIndex);\n }\n }\n\n static fromString(string: string): ParsedURL|null {\n const parsedURL = new ParsedURL(string.toString());\n if (parsedURL.isValid) {\n return parsedURL;\n }\n return null;\n }\n\n static preEncodeSpecialCharactersInPath(path: string): string {\n // Based on net::FilePathToFileURL. Ideally we would handle\n // '\\\\' as well on non-Windows file systems.\n for (const specialChar of ['%', ';', '#', '?', ' ']) {\n (path) = path.replaceAll(specialChar, encodeURIComponent(specialChar));\n }\n return path;\n }\n\n static rawPathToEncodedPathString(path: Platform.DevToolsPath.RawPathString):\n Platform.DevToolsPath.EncodedPathString {\n const partiallyEncoded = ParsedURL.preEncodeSpecialCharactersInPath(path);\n if (path.startsWith('/')) {\n return new URL(partiallyEncoded, 'file:///').pathname as Platform.DevToolsPath.EncodedPathString;\n }\n // URL prepends a '/'\n return new URL('/' + partiallyEncoded, 'file:///').pathname.substr(1) as Platform.DevToolsPath.EncodedPathString;\n }\n\n /**\n * @param name Must not be encoded\n */\n static encodedFromParentPathAndName(parentPath: Platform.DevToolsPath.EncodedPathString, name: string):\n Platform.DevToolsPath.EncodedPathString {\n return ParsedURL.concatenate(parentPath, '/', ParsedURL.preEncodeSpecialCharactersInPath(name));\n }\n\n /**\n * @param name Must not be encoded\n */\n static urlFromParentUrlAndName(parentUrl: Platform.DevToolsPath.UrlString, name: string):\n Platform.DevToolsPath.UrlString {\n return ParsedURL.concatenate(parentUrl, '/', ParsedURL.preEncodeSpecialCharactersInPath(name));\n }\n\n static encodedPathToRawPathString(encPath: Platform.DevToolsPath.EncodedPathString):\n Platform.DevToolsPath.RawPathString {\n return decodeURIComponent(encPath) as Platform.DevToolsPath.RawPathString;\n }\n\n static rawPathToUrlString(fileSystemPath: Platform.DevToolsPath.RawPathString): Platform.DevToolsPath.UrlString {\n let preEncodedPath: string = ParsedURL.preEncodeSpecialCharactersInPath(\n fileSystemPath.replace(/\\\\/g, '/') as Platform.DevToolsPath.RawPathString);\n preEncodedPath = preEncodedPath.replace(/\\\\/g, '/');\n if (!preEncodedPath.startsWith('file://')) {\n if (preEncodedPath.startsWith('/')) {\n preEncodedPath = 'file://' + preEncodedPath;\n } else {\n preEncodedPath = 'file:///' + preEncodedPath;\n }\n }\n return new URL(preEncodedPath).toString() as Platform.DevToolsPath.UrlString;\n }\n\n static relativePathToUrlString(\n relativePath: Platform.DevToolsPath.RawPathString,\n baseURL: Platform.DevToolsPath.UrlString): Platform.DevToolsPath.UrlString {\n const preEncodedPath: string = ParsedURL.preEncodeSpecialCharactersInPath(\n relativePath.replace(/\\\\/g, '/') as Platform.DevToolsPath.RawPathString);\n return new URL(preEncodedPath, baseURL).toString() as Platform.DevToolsPath.UrlString;\n }\n\n static urlToRawPathString(fileURL: Platform.DevToolsPath.UrlString, isWindows?: boolean):\n Platform.DevToolsPath.RawPathString {\n console.assert(fileURL.startsWith('file://'), 'This must be a file URL.');\n const decodedFileURL = decodeURIComponent(fileURL);\n if (isWindows) {\n return decodedFileURL.substr('file:///'.length).replace(/\\//g, '\\\\') as Platform.DevToolsPath.RawPathString;\n }\n return decodedFileURL.substr('file://'.length) as Platform.DevToolsPath.RawPathString;\n }\n\n static sliceUrlToEncodedPathString(url: Platform.DevToolsPath.UrlString, start: number):\n Platform.DevToolsPath.EncodedPathString {\n return url.substring(start) as Platform.DevToolsPath.EncodedPathString;\n }\n\n static substr<DevToolsPathType extends BrandedPathString>(\n devToolsPath: DevToolsPathType, from: number, length?: number): DevToolsPathType {\n return devToolsPath.substr(from, length) as DevToolsPathType;\n }\n\n static substring<DevToolsPathType extends BrandedPathString>(\n devToolsPath: DevToolsPathType, start: number, end?: number): DevToolsPathType {\n return devToolsPath.substring(start, end) as DevToolsPathType;\n }\n\n static prepend<DevToolsPathType extends BrandedPathString>(prefix: string, devToolsPath: DevToolsPathType):\n DevToolsPathType {\n return prefix + devToolsPath as DevToolsPathType;\n }\n\n static concatenate<DevToolsPathType extends BrandedPathString>(\n devToolsPath: DevToolsPathType, ...appendage: string[]): DevToolsPathType {\n return devToolsPath.concat(...appendage) as DevToolsPathType;\n }\n\n static trim<DevToolsPathType extends BrandedPathString>(devToolsPath: DevToolsPathType): DevToolsPathType {\n return devToolsPath.trim() as DevToolsPathType;\n }\n\n static slice<DevToolsPathType extends BrandedPathString>(\n devToolsPath: DevToolsPathType, start?: number, end?: number): DevToolsPathType {\n return devToolsPath.slice(start, end) as DevToolsPathType;\n }\n\n static join<DevToolsPathType extends BrandedPathString>(devToolsPaths: DevToolsPathType[], separator?: string):\n DevToolsPathType {\n return devToolsPaths.join(separator) as DevToolsPathType;\n }\n\n static split<DevToolsPathType extends BrandedPathString>(\n devToolsPath: DevToolsPathType, separator: string|RegExp, limit?: number): DevToolsPathType[] {\n return devToolsPath.split(separator, limit) as DevToolsPathType[];\n }\n\n static toLowerCase<DevToolsPathType extends BrandedPathString>(devToolsPath: DevToolsPathType): DevToolsPathType {\n return devToolsPath.toLowerCase() as DevToolsPathType;\n }\n\n static isValidUrlString(str: string): str is Platform.DevToolsPath.UrlString {\n return new ParsedURL(str).isValid;\n }\n\n static urlWithoutHash(url: string): string {\n const hashIndex = url.indexOf('#');\n if (hashIndex !== -1) {\n return url.substr(0, hashIndex);\n }\n return url;\n }\n\n static urlRegex(): RegExp {\n if (ParsedURL.urlRegexInstance) {\n return ParsedURL.urlRegexInstance;\n }\n // RegExp groups:\n // 1 - scheme, hostname, ?port\n // 2 - scheme (using the RFC3986 grammar)\n // 3 - ?user:password\n // 4 - hostname\n // 5 - ?port\n // 6 - ?path\n // 7 - ?query\n // 8 - ?fragment\n const schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\\/\\//;\n const userRegex = /(?:([A-Za-z0-9\\-._~%!$&'()*+,;=:]*)@)?/;\n const hostRegex = /((?:\\[::\\d?\\])|(?:[^\\s\\/:]*))/;\n const portRegex = /(?::([\\d]+))?/;\n const pathRegex = /(\\/[^#?]*)?/;\n const queryRegex = /(?:\\?([^#]*))?/;\n const fragmentRegex = /(?:#(.*))?/;\n\n ParsedURL.urlRegexInstance = new RegExp(\n '^(' + schemeRegex.source + userRegex.source + hostRegex.source + portRegex.source + ')' + pathRegex.source +\n queryRegex.source + fragmentRegex.source + '$');\n return ParsedURL.urlRegexInstance;\n }\n\n static extractPath(url: Platform.DevToolsPath.UrlString): Platform.DevToolsPath.EncodedPathString {\n const parsedURL = this.fromString(url);\n return (parsedURL ? parsedURL.path : '') as Platform.DevToolsPath.EncodedPathString;\n }\n\n static extractOrigin(url: Platform.DevToolsPath.UrlString): Platform.DevToolsPath.UrlString {\n const parsedURL = this.fromString(url);\n return parsedURL ? parsedURL.securityOrigin() : '' as Platform.DevToolsPath.UrlString;\n }\n\n static extractExtension(url: string): string {\n url = ParsedURL.urlWithoutHash(url);\n const indexOfQuestionMark = url.indexOf('?');\n if (indexOfQuestionMark !== -1) {\n url = url.substr(0, indexOfQuestionMark);\n }\n const lastIndexOfSlash = url.lastIndexOf('/');\n if (lastIndexOfSlash !== -1) {\n url = url.substr(lastIndexOfSlash + 1);\n }\n const lastIndexOfDot = url.lastIndexOf('.');\n if (lastIndexOfDot !== -1) {\n url = url.substr(lastIndexOfDot + 1);\n const lastIndexOfPercent = url.indexOf('%');\n if (lastIndexOfPercent !== -1) {\n return url.substr(0, lastIndexOfPercent);\n }\n return url;\n }\n return '';\n }\n\n static extractName(url: string): string {\n let index = url.lastIndexOf('/');\n const pathAndQuery = index !== -1 ? url.substr(index + 1) : url;\n index = pathAndQuery.indexOf('?');\n return index < 0 ? pathAndQuery : pathAndQuery.substr(0, index);\n }\n\n static completeURL(baseURL: Platform.DevToolsPath.UrlString, href: string): Platform.DevToolsPath.UrlString|null {\n // Return special URLs as-is.\n if (href.startsWith('data:') || href.startsWith('blob:') || href.startsWith('javascript:') ||\n href.startsWith('mailto:')) {\n return href as Platform.DevToolsPath.UrlString;\n }\n\n // Return absolute URLs with normalized path and other components as-is.\n const trimmedHref = href.trim();\n const parsedHref = this.fromString(trimmedHref);\n if (parsedHref?.scheme) {\n const securityOrigin = parsedHref.securityOrigin();\n const pathText = normalizePath(parsedHref.path);\n const queryText = parsedHref.queryParams && `?${parsedHref.queryParams}`;\n const fragmentText = parsedHref.fragment && `#${parsedHref.fragment}`;\n return securityOrigin + pathText + queryText + fragmentText as Platform.DevToolsPath.UrlString;\n }\n\n const parsedURL = this.fromString(baseURL);\n if (!parsedURL) {\n return null;\n }\n\n if (parsedURL.isDataURL()) {\n return href as Platform.DevToolsPath.UrlString;\n }\n\n if (href.length > 1 && href.charAt(0) === '/' && href.charAt(1) === '/') {\n // href starts with \"//\" which is a full URL with the protocol dropped (use the baseURL protocol).\n return parsedURL.scheme + ':' + href as Platform.DevToolsPath.UrlString;\n }\n\n const securityOrigin = parsedURL.securityOrigin();\n const pathText = parsedURL.path;\n const queryText = parsedURL.queryParams ? '?' + parsedURL.queryParams : '';\n\n // Empty href resolves to a URL without fragment.\n if (!href.length) {\n return securityOrigin + pathText + queryText as Platform.DevToolsPath.UrlString;\n }\n\n if (href.charAt(0) === '#') {\n return securityOrigin + pathText + queryText + href as Platform.DevToolsPath.UrlString;\n }\n\n if (href.charAt(0) === '?') {\n return securityOrigin + pathText + href as Platform.DevToolsPath.UrlString;\n }\n\n const hrefMatches = href.match(/^[^#?]*/);\n if (!hrefMatches || !href.length) {\n throw new Error('Invalid href');\n }\n let hrefPath: string = hrefMatches[0];\n const hrefSuffix = href.substring(hrefPath.length);\n if (hrefPath.charAt(0) !== '/') {\n hrefPath = parsedURL.folderPathComponents + '/' + hrefPath;\n }\n return securityOrigin + normalizePath(hrefPath) + hrefSuffix as Platform.DevToolsPath.UrlString;\n }\n\n static splitLineAndColumn(string: string): {\n url: Platform.DevToolsPath.UrlString,\n lineNumber: (number|undefined),\n columnNumber: (number|undefined),\n } {\n // Only look for line and column numbers in the path to avoid matching port numbers.\n const beforePathMatch = string.match(ParsedURL.urlRegex());\n let beforePath = '';\n let pathAndAfter: string = string;\n if (beforePathMatch) {\n beforePath = beforePathMatch[1];\n pathAndAfter = string.substring(beforePathMatch[1].length);\n }\n\n const lineColumnRegEx = /(?::(\\d+))?(?::(\\d+))?$/;\n const lineColumnMatch = lineColumnRegEx.exec(pathAndAfter);\n let lineNumber;\n let columnNumber;\n console.assert(Boolean(lineColumnMatch));\n if (!lineColumnMatch) {\n return {url: string as Platform.DevToolsPath.UrlString, lineNumber: 0, columnNumber: 0};\n }\n\n if (typeof (lineColumnMatch[1]) === 'string') {\n lineNumber = parseInt(lineColumnMatch[1], 10);\n // Immediately convert line and column to 0-based numbers.\n lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1;\n }\n if (typeof (lineColumnMatch[2]) === 'string') {\n columnNumber = parseInt(lineColumnMatch[2], 10);\n columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1;\n }\n\n let url: Platform.DevToolsPath.UrlString =\n beforePath + pathAndAfter.substring(0, pathAndAfter.length - lineColumnMatch[0].length) as\n Platform.DevToolsPath.UrlString;\n if (lineColumnMatch[1] === undefined && lineColumnMatch[2] === undefined) {\n const wasmCodeOffsetRegex = /wasm-function\\[\\d+\\]:0x([a-z0-9]+)$/g;\n const wasmCodeOffsetMatch = wasmCodeOffsetRegex.exec(pathAndAfter);\n if (wasmCodeOffsetMatch && typeof (wasmCodeOffsetMatch[1]) === 'string') {\n url = ParsedURL.removeWasmFunctionInfoFromURL(url);\n columnNumber = parseInt(wasmCodeOffsetMatch[1], 16);\n columnNumber = isNaN(columnNumber) ? undefined : columnNumber;\n }\n }\n\n return {url, lineNumber, columnNumber};\n }\n\n static removeWasmFunctionInfoFromURL(url: string): Platform.DevToolsPath.UrlString {\n const wasmFunctionRegEx = /:wasm-function\\[\\d+\\]/;\n const wasmFunctionIndex = url.search(wasmFunctionRegEx);\n if (wasmFunctionIndex === -1) {\n return url as Platform.DevToolsPath.UrlString;\n }\n return ParsedURL.substring(url as Platform.DevToolsPath.UrlString, 0, wasmFunctionIndex);\n }\n\n private static beginsWithWindowsDriveLetter(url: string): boolean {\n return /^[A-Za-z]:/.test(url);\n }\n\n private static beginsWithScheme(url: string): boolean {\n return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);\n }\n\n static isRelativeURL(url: string): boolean {\n return !this.beginsWithScheme(url) || this.beginsWithWindowsDriveLetter(url);\n }\n\n isAboutBlank(): boolean {\n return this.url === 'about:blank';\n }\n\n isDataURL(): boolean {\n return this.scheme === 'data';\n }\n\n extractDataUrlMimeType(): {type: string|undefined, subtype: string|undefined} {\n const regexp = /^data:((?<type>\\w+)\\/(?<subtype>\\w+))?(;base64)?,/;\n const match = this.url.match(regexp);\n return {\n type: match?.groups?.type,\n subtype: match?.groups?.subtype,\n };\n }\n\n isBlobURL(): boolean {\n return this.url.startsWith('blob:');\n }\n\n lastPathComponentWithFragment(): string {\n return this.lastPathComponent + (this.fragment ? '#' + this.fragment : '');\n }\n\n domain(): string {\n if (this.isDataURL()) {\n return 'data:';\n }\n return this.host + (this.port ? ':' + this.port : '');\n }\n\n securityOrigin(): Platform.DevToolsPath.UrlString {\n if (this.isDataURL()) {\n return 'data:' as Platform.DevToolsPath.UrlString;\n }\n const scheme = this.isBlobURL() ? this.blobInnerScheme : this.scheme;\n return scheme + '://' + this.domain() as Platform.DevToolsPath.UrlString;\n }\n\n urlWithoutScheme(): string {\n if (this.scheme && this.url.startsWith(this.scheme + '://')) {\n return this.url.substring(this.scheme.length + 3);\n }\n return this.url;\n }\n\n static urlRegexInstance: RegExp|null = null;\n}\n"]}