diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..b644e66 --- /dev/null +++ b/biome.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "formatter": { + "enabled": true, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "semicolons": "asNeeded", + "quoteStyle": "single" + } + } +} diff --git a/package.json b/package.json index e119c71..0d84fe7 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,23 @@ { - "name": "healthcheck", - "version": "noversion", - "main": "index.js", - "repository": "git@github.com:mcataford/healthcheck.git", - "author": "Marc Cataford ", - "private": true, - "packageManager": "yarn@4.1.1", - "devDependencies": { - "@types/node": "^20.11.27", - "typescript": "^5.4.2" - }, - "dependencies": { - "@netlify/blobs": "^7.0.1", - "@netlify/functions": "^2.6.0", - "axios": "^1.6.7" - } + "name": "healthcheck", + "version": "noversion", + "main": "index.js", + "repository": "git@github.com:mcataford/healthcheck.git", + "author": "Marc Cataford ", + "private": true, + "packageManager": "yarn@4.1.1", + "scripts": { + "lint": "biome lint .; biome format .", + "lint:fix": "biome lint . --apply; biome format . --write" + }, + "devDependencies": { + "@biomejs/biome": "^1.6.1", + "@types/node": "^20.11.27", + "typescript": "^5.4.2" + }, + "dependencies": { + "@netlify/blobs": "^7.0.1", + "@netlify/functions": "^2.6.0", + "axios": "^1.6.7" + } } diff --git a/src/scheduledHealthcheck.mts b/src/scheduledHealthcheck.mts index 0c0a78c..a784989 100644 --- a/src/scheduledHealthcheck.mts +++ b/src/scheduledHealthcheck.mts @@ -1,22 +1,20 @@ -import { readFile } from 'node:fs/promises' - import axios from 'axios' import { getStore } from '@netlify/blobs' import type { Context } from '@netlify/functions' interface Endpoint { - name: string - url: string + name: string + url: string } interface Configuration { - endpoints: Endpoint[] - webhook_url: string + endpoints: Endpoint[] + webhook_url: string } interface EndpointReport extends Endpoint { - status: number - healthy: boolean + status: number + healthy: boolean } /* @@ -30,21 +28,21 @@ interface EndpointReport extends Endpoint { * extra status information. */ async function pingEndpoint(endpoint: Endpoint): Promise { - try { - const response = await axios.get(endpoint.url) - - return { - ...endpoint, - status: response.status, - healthy: true - } - } catch(e) { - return { - ...endpoint, - healthy: false, - status: e.response.status - } - } + try { + const response = await axios.get(endpoint.url) + + return { + ...endpoint, + status: response.status, + healthy: true, + } + } catch (e) { + return { + ...endpoint, + healthy: false, + status: e.response.status, + } + } } /* @@ -53,14 +51,13 @@ async function pingEndpoint(endpoint: Endpoint): Promise { * The report is assembled line-by-line and joined together as one. */ function formatReport(endpointReports: EndpointReport[]): string { - const endpointStatuses = endpointReports.map((report: EndpointReport): string => { - if (report.healthy) - return `✅ ${report.name} is healthy (${report.status})` - else - return `🔥 ${report.name} did not respond normally (${report.status})` - }) + const endpointStatuses = endpointReports.map((report: EndpointReport): string => { + if (report.healthy) return `✅ ${report.name} is healthy (${report.status})` - return endpointStatuses.join('\n') + return `🔥 ${report.name} did not respond normally (${report.status})` + }) + + return endpointStatuses.join('\n') } /* @@ -71,15 +68,19 @@ function formatReport(endpointReports: EndpointReport[]): string { * the available environment variables separately. */ export default async (request: Request, context: Context) => { - //const conf: Configuration = require("../config.json") - const configurationStore = getStore('functions') - const conf: Configuration = await configurationStore.get('config', { type: 'json' }) + //const conf: Configuration = require("../config.json") + const configurationStore = getStore('functions') + const conf: Configuration = await configurationStore.get('config', { + type: 'json', + }) - const pings = await Promise.all(conf.endpoints.map(pingEndpoint)) + const pings = await Promise.all(conf.endpoints.map(pingEndpoint)) - const report = formatReport(pings) - const webhook_url = conf.webhook_url.replace('$DISCORD_WEBHOOK_ID', process.env.DISCORD_WEBHOOK_ID).replace('$DISCORD_WEBHOOK_TOKEN', process.env.DISCORD_WEBHOOK_TOKEN) - await axios.post(webhook_url, { content: report }) + const report = formatReport(pings) + const webhook_url = conf.webhook_url + .replace('$DISCORD_WEBHOOK_ID', process.env.DISCORD_WEBHOOK_ID) + .replace('$DISCORD_WEBHOOK_TOKEN', process.env.DISCORD_WEBHOOK_TOKEN) + await axios.post(webhook_url, { content: report }) - return new Response() + return new Response() } diff --git a/yarn.lock b/yarn.lock index 476bf0d..0bb8555 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,97 @@ __metadata: version: 8 cacheKey: 10c0 +"@biomejs/biome@npm:^1.6.1": + version: 1.6.1 + resolution: "@biomejs/biome@npm:1.6.1" + dependencies: + "@biomejs/cli-darwin-arm64": "npm:1.6.1" + "@biomejs/cli-darwin-x64": "npm:1.6.1" + "@biomejs/cli-linux-arm64": "npm:1.6.1" + "@biomejs/cli-linux-arm64-musl": "npm:1.6.1" + "@biomejs/cli-linux-x64": "npm:1.6.1" + "@biomejs/cli-linux-x64-musl": "npm:1.6.1" + "@biomejs/cli-win32-arm64": "npm:1.6.1" + "@biomejs/cli-win32-x64": "npm:1.6.1" + dependenciesMeta: + "@biomejs/cli-darwin-arm64": + optional: true + "@biomejs/cli-darwin-x64": + optional: true + "@biomejs/cli-linux-arm64": + optional: true + "@biomejs/cli-linux-arm64-musl": + optional: true + "@biomejs/cli-linux-x64": + optional: true + "@biomejs/cli-linux-x64-musl": + optional: true + "@biomejs/cli-win32-arm64": + optional: true + "@biomejs/cli-win32-x64": + optional: true + bin: + biome: bin/biome + checksum: 10c0/789580c9aa7e0661a643e82de85f15bcc4ef0c79a099204f234b3769cface5c604b137260a4a60767ab3a692bd7ac19e2de1fc75537ec14e7698f0b6a133cfef + languageName: node + linkType: hard + +"@biomejs/cli-darwin-arm64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-darwin-arm64@npm:1.6.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-darwin-x64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-darwin-x64@npm:1.6.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64-musl@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-linux-arm64-musl@npm:1.6.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-linux-arm64@npm:1.6.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64-musl@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-linux-x64-musl@npm:1.6.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-linux-x64@npm:1.6.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-win32-arm64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-win32-arm64@npm:1.6.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-win32-x64@npm:1.6.1": + version: 1.6.1 + resolution: "@biomejs/cli-win32-x64@npm:1.6.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@netlify/blobs@npm:^7.0.1": version: 7.0.1 resolution: "@netlify/blobs@npm:7.0.1" @@ -106,6 +197,7 @@ __metadata: version: 0.0.0-use.local resolution: "healthcheck@workspace:." dependencies: + "@biomejs/biome": "npm:^1.6.1" "@netlify/blobs": "npm:^7.0.1" "@netlify/functions": "npm:^2.6.0" "@types/node": "npm:^20.11.27"