Il modulo network è disponibile solo sulle applicazioni website. Restringi prima il tipo con app.isWebsite():
const app = await api.applications.fetch("abc123def456abc123def456");
if (!app.isWebsite()) {
throw new Error("This application is not a website");
}
app.network; // NetworkModule
Dominio personalizzato
app.network.setCustomDomain(domain) imposta o rimuove il dominio personalizzato associato al website.
await app.network.setCustomDomain("yoursite.com");
// Pass "@" to remove the configured custom domain
await app.network.setCustomDomain("@");
I domini personalizzati richiedono un piano Senior o superiore.
Record DNS
Dopo aver associato un dominio personalizzato devi configurare il DNS presso il tuo registrar. app.network.dns() restituisce il record di proprietà e lo stato SSL.
const dns = await app.network.dns();
console.log(`${dns.ownership.type} ${dns.ownership.name} → ${dns.ownership.value}`);
console.log(`SSL: ${dns.ssl.status}`); // "pending" | "pending_validation" | "active"
La struttura è cambiata nella v4. app.network.dns() restituiva in precedenza un array di record — ora restituisce un singolo oggetto: { ownership, ssl }.
Analytics
app.network.analytics({ start, end }) restituisce le analytics edge aggregate. start ed end accettano stringhe ISO 8601 oppure oggetti Date. La finestra massima di conservazione è di 7 giorni.
const since = new Date(Date.now() - 24 * 60 * 60 * 1000);
const analytics = await app.network.analytics({
start: since,
end: new Date(),
});
if ("visits" in analytics) {
console.log(analytics.visits.length, "time buckets");
console.log("Top countries:", analytics.countries.slice(0, 5));
console.log("Top paths:", analytics.paths.slice(0, 5));
}
Per le finestre vuote (ad esempio prima della creazione dell’app) l’API restituisce {}. Proteggiti con "visits" in analytics prima di leggere.
La v3 chiamava questo endpoint senza argomenti. La v4 richiede { start, end }.
Tracciamento degli errori
app.network.errors({ start, end, include4xx? }) restituisce la ripartizione degli errori edge. Per impostazione predefinita vengono inclusi solo gli errori 5xx.
const errors = await app.network.errors({
start: since,
end: new Date(),
include4xx: true, // include 4xx alongside 5xx
});
if ("summary" in errors) {
console.log(`Total: ${errors.summary.total}`);
console.log("By class:", errors.summary.by_class);
console.log("Top failing paths:", errors.top_paths.slice(0, 3));
}
Log per richiesta
app.network.logs({ start, end }) restituisce i log edge per singola richiesta.
const logs = await app.network.logs({ start: since, end: new Date() });
for (const log of logs.slice(0, 5)) {
console.log(
log.timestamp,
log.request.method, log.request.path,
"→",
log.response.status,
`(${log.client.country ?? "??"})`,
);
}
I log per richiesta richiedono un piano Pro o superiore.
Percentili di latenza
app.network.performance({ start, end }) restituisce le latenze p50 / p95 / p99 per i layer edge e origin.
const perf = await app.network.performance({ start: since, end: new Date() });
if ("summary" in perf) {
const { p50, p95, p99 } = perf.summary.edge;
console.log(`Edge p50/p95/p99: ${p50}/${p95}/${p99}ms`);
console.log("Slowest paths:", perf.slowest_paths.slice(0, 3));
}
Le metriche di performance richiedono un piano Pro o superiore.
Svuotamento della cache edge
app.network.purgeCache() invalida l’intera cache edge per i domini dell’applicazione.
await app.network.purgeCache();
Nella v3 (e nella breve v4.0.0) purgeCache(paths?) accettava un elenco di path da svuotare selettivamente. A partire dalla v4.0.1 l’argomento è stato rimosso — chiamare purgeCache() svuota sempre l’intera cache.