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>
48 lines
No EOL
2.3 KiB
Text
48 lines
No EOL
2.3 KiB
Text
// Copyright 2024 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
// A DNS lookup will usually take ~1-2 roundtrips of connection latency plus the extra DNS routing time.
|
|
// Example: https://www.webpagetest.org/result/180703_3A_e33ec79747c002ed4d7bcbfc81462203/1/details/#waterfall_view_step1
|
|
// Example: https://www.webpagetest.org/result/180707_1M_89673eb633b5d98386de95dfcf9b33d5/1/details/#waterfall_view_step1
|
|
// DNS is highly variable though, many times it's a little more than 1, but can easily be 4-5x RTT.
|
|
// We'll use 2 since it seems to give the most accurate results on average, but this can be tweaked.
|
|
const DNS_RESOLUTION_RTT_MULTIPLIER = 2;
|
|
class DNSCache {
|
|
static rttMultiplier = DNS_RESOLUTION_RTT_MULTIPLIER;
|
|
rtt;
|
|
resolvedDomainNames;
|
|
constructor({ rtt }) {
|
|
this.rtt = rtt;
|
|
this.resolvedDomainNames = new Map();
|
|
}
|
|
getTimeUntilResolution(request, options) {
|
|
const { requestedAt = 0, shouldUpdateCache = false } = options || {};
|
|
const domain = request.parsedURL.host;
|
|
const cacheEntry = this.resolvedDomainNames.get(domain);
|
|
let timeUntilResolved = this.rtt * DNSCache.rttMultiplier;
|
|
if (cacheEntry) {
|
|
const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);
|
|
timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);
|
|
}
|
|
const resolvedAt = requestedAt + timeUntilResolved;
|
|
if (shouldUpdateCache) {
|
|
this.updateCacheResolvedAtIfNeeded(request, resolvedAt);
|
|
}
|
|
return timeUntilResolved;
|
|
}
|
|
updateCacheResolvedAtIfNeeded(request, resolvedAt) {
|
|
const domain = request.parsedURL.host;
|
|
const cacheEntry = this.resolvedDomainNames.get(domain) || { resolvedAt };
|
|
cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);
|
|
this.resolvedDomainNames.set(domain, cacheEntry);
|
|
}
|
|
/**
|
|
* Forcefully sets the DNS resolution time for a request.
|
|
* Useful for testing and alternate execution simulations.
|
|
*/
|
|
setResolvedAt(domain, resolvedAt) {
|
|
this.resolvedDomainNames.set(domain, { resolvedAt });
|
|
}
|
|
}
|
|
export { DNSCache };
|
|
//# sourceMappingURL=DNSCache.js.map |