You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
3.0 KiB
TypeScript

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<string|null> {
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<Status> {
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<Metric|null> {
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,
}
}
}