Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/app/speedtest-rpc/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import { SITE } from "@/data/site";

export const metadata: Metadata = pageMetadata({
path: "/speedtest-rpc",
title: "RPC Speed Test benchmark your endpoints from your browser",
title: "RPC Speed Test: benchmark your endpoints from your browser",
description:
"Paste any RPC URLs and measure their real latency from your own connection. Same anti-cache methodology as our public benchmarks. No install, no signup your URLs and API keys never leave your browser.",
"Paste any RPC URLs and measure their real latency from your own connection. Same anti-cache methodology as our public benchmarks. No install, no signup, and your URLs and API keys never leave your browser.",
});

export const revalidate = 3600;
Expand Down Expand Up @@ -51,8 +51,8 @@ export default function SpeedtestRpcPage() {
Benchmark your RPC endpoints, from your connection
</h1>
<p className="mt-4 max-w-2xl text-base sm:text-lg text-ink-soft leading-snug">
Paste any JSON-RPC URLspublic gateways or your own keyed endpoints
pick a duration, and watch them race. Every probe fires directly from
Paste any JSON-RPC URLs, public gateways or your own keyed endpoints,
then pick a duration, and watch them race. Every probe fires directly from
your browser with the same anti-cache payload as our{" "}
<Link href="/rpc" className="lnk">
public RPC benchmarks
Expand All @@ -61,7 +61,7 @@ export default function SpeedtestRpcPage() {
</p>
<p className="mt-2 text-sm text-ink-faint">
No install, no signup. Your URLs and API keys never leave this browser
tab — requests go straight from you to the provider.
tab. Requests go straight from you to the provider.
</p>

<SpeedtestRpcClient />
Expand All @@ -78,7 +78,7 @@ export default function SpeedtestRpcPage() {
POST with a rotating request id, so no edge cache can answer without
touching a real node. One warmup request absorbs the TCP + TLS
handshake, then all endpoints are probed once per second in
staggered, randomized rounds until the clock runs out request
staggered, randomized rounds until the clock runs out, so request
bursts never align and network wake-ups hit every endpoint evenly.
Responses are classified ok / http_err / jsonrpc_err /
timeout, and an endpoint reporting a block more than 20 behind the
Expand All @@ -87,7 +87,7 @@ export default function SpeedtestRpcPage() {
<Link href="/methodology" className="lnk">
public benchmark methodology
</Link>
. Results reflect your device, network and location — that is the
. Results reflect your device, network and location. That is the
point: it is the latency your application would actually see.
</p>
</section>
Expand Down
12 changes: 6 additions & 6 deletions src/components/speedtest/speedtest-rpc-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ export function SpeedtestRpcClient() {
patch(ep.id, {
status: "cors_blocked",
error:
"This endpoint does not answer browser requests (no CORS headers on preflight) — dapps cannot call it from a browser either. It may still be fast server-side: measure it from a terminal with the curl below.",
"This endpoint does not answer browser requests (no CORS headers on preflight). Dapps cannot call it from a browser either. It may still be fast server-side: measure it from a terminal with the curl below.",
});
}
}
Expand Down Expand Up @@ -651,7 +651,7 @@ export function SpeedtestRpcClient() {
continuously (90 EVM chains, 291 endpoints). */}
<div className="mb-5 rounded-lg border border-rule px-4 py-3">
<p className="text-[12px] text-ink-soft mb-2">
Prefill with the endpoints we already benchmark — pick a chain:
Prefill with the endpoints we already benchmark. Pick a chain:
</p>
<div className="flex flex-wrap gap-1.5 mb-2">
{FEATURED_CHAINS.map((slug) => {
Expand Down Expand Up @@ -708,13 +708,13 @@ export function SpeedtestRpcClient() {
{pickedChain && (
<p className="mt-2 label-mono text-[10px]" style={{ color: "var(--color-good)" }}>
{prefillState === "validating"
? `⏳ ${RPC_DIRECTORY.find((c) => c.slug === pickedChain)?.name} checking ${inputs.length} benchmarked endpoints from your browser…`
: `✓ ${RPC_DIRECTORY.find((c) => c.slug === pickedChain)?.name} ${inputs.filter(Boolean).length} endpoints ready. Add your own keyed URLs below to race them.`}
? `⏳ ${RPC_DIRECTORY.find((c) => c.slug === pickedChain)?.name}: checking ${inputs.length} benchmarked endpoints from your browser…`
: `✓ ${RPC_DIRECTORY.find((c) => c.slug === pickedChain)?.name}: ${inputs.filter(Boolean).length} endpoints ready. Add your own keyed URLs below to race them.`}
</p>
)}
{skippedProviders.length > 0 && (
<p className="mt-1 label-mono text-[10px] text-ink-faint">
Skipped {skippedProviders.join(", ")}no browser (CORS) support; the public bench probes it server-side.
Skipped {skippedProviders.join(", ")}: no browser (CORS) support. The public bench probes it server-side.
</p>
)}
</div>
Expand Down Expand Up @@ -959,7 +959,7 @@ export function SpeedtestRpcClient() {
if (blockedDir.length === 0) return null;
return (
<p className="st-row label-mono text-[10px] text-ink-faint text-center pt-1" style={{ animationDelay: `${0.2 + ranked.length * 0.12}s` }}>
Not testable from a browser (skipped): {blockedDir.map((e) => epLabel(e)).join(", ")} — the public bench covers {blockedDir.length > 1 ? "them" : "it"} server-side.
Not testable from a browser (skipped): {blockedDir.map((e) => epLabel(e)).join(", ")}. The public bench covers {blockedDir.length > 1 ? "them" : "it"} server-side.
</p>
);
})()}
Expand Down
Loading