import { retryFetch } from './toolkit.ts' const STATUS_URL = 'http://localhost:8383/api/runs/' const RESULT_URL = 'http://localhost:8383/api/results/' const METRIC_DEFAULTS = { device: 'desktop', waitForResponse: false, screenshot: true, } // requests metrics and returns runId export async function requestMetricsRun (url:string): Promise { const body = JSON.stringify({ url, ...METRIC_DEFAULTS, }) const response = await fetch(STATUS_URL, { method: "POST", headers: [ ["Content-Type", "application/json"], ["User-Agent", "250kb-club"] ], body, }) if (response.ok) { const json: { runId: string } = await response.json() return json.runId } else { const err = await response.text() console.error(`Failed to request metrics run for ${url}: ${err}`) return null } } export async function checkStatus (runId: string, retries = 3): Promise { const json = await retryFetch(`${STATUS_URL}${runId}`) if (!json) return { url: '', status: 'failed' } const url = json.params.url const status = json.status.statusCode return { url, status } } export async function retrieveMetrics (runId: string): Promise { const json = await retryFetch(`${RESULT_URL}${runId}`) if (!json) return null return { scores: { pageWeight: json.scoreProfiles.generic.categories.pageWeight.categoryScore, requests: json.scoreProfiles.generic.categories.requests.categoryScore, domComplexity: json.scoreProfiles.generic.categories.domComplexity.categoryScore, javascriptComplexity: json.scoreProfiles.generic.categories.javascriptComplexity.categoryScore, badJavascript: json.scoreProfiles.generic.categories.badJavascript.categoryScore, jQuery: json.scoreProfiles.generic.categories.jQuery.categoryScore, cssComplexity: json.scoreProfiles.generic.categories.cssComplexity.categoryScore, badCSS: json.scoreProfiles.generic.categories.badCSS.categoryScore, fonts: json.scoreProfiles.generic.categories.fonts.categoryScore, serverConfig: json.scoreProfiles.generic.categories.serverConfig.categoryScore, globalScore: json.scoreProfiles.generic.globalScore, }, metrics: { requests: json.toolsResults.phantomas.metrics.requests, bodySize: json.toolsResults.phantomas.metrics.bodySize, contentLength: json.toolsResults.phantomas.metrics.contentLength, htmlSize: json.toolsResults.phantomas.metrics.htmlSize, cssSize: json.toolsResults.phantomas.metrics.cssSize, jsSize: json.toolsResults.phantomas.metrics.jsSize, jsonSize: json.toolsResults.phantomas.metrics.jsonSize, imageSize: json.toolsResults.phantomas.metrics.imageSize, videoSize: json.toolsResults.phantomas.metrics.videoSize, webfontSize: json.toolsResults.phantomas.metrics.webfontSize, base64Size: json.toolsResults.phantomas.metrics.base64Size, otherSize: json.toolsResults.phantomas.metrics.otherSize, } } }