sermon-js 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +239 -2
- package/dist/api/index.cjs +174 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +77 -0
- package/dist/api/index.d.ts +77 -0
- package/dist/api/index.js +171 -0
- package/dist/api/index.js.map +1 -0
- package/dist/chunk-2M4UBCDM.js +178 -0
- package/dist/chunk-2M4UBCDM.js.map +1 -0
- package/dist/chunk-AH372HLN.js +98 -0
- package/dist/chunk-AH372HLN.js.map +1 -0
- package/dist/chunk-APC2HVSI.js +154 -0
- package/dist/chunk-APC2HVSI.js.map +1 -0
- package/dist/chunk-D7BBJTYU.cjs +335 -0
- package/dist/chunk-D7BBJTYU.cjs.map +1 -0
- package/dist/chunk-ELV4ZU6G.cjs +51 -0
- package/dist/chunk-ELV4ZU6G.cjs.map +1 -0
- package/dist/chunk-EMP7XVKC.js +334 -0
- package/dist/chunk-EMP7XVKC.js.map +1 -0
- package/dist/chunk-I3346MUL.js +49 -0
- package/dist/chunk-I3346MUL.js.map +1 -0
- package/dist/chunk-NP3YYVRZ.cjs +163 -0
- package/dist/chunk-NP3YYVRZ.cjs.map +1 -0
- package/dist/chunk-PARE6EUZ.cjs +184 -0
- package/dist/chunk-PARE6EUZ.cjs.map +1 -0
- package/dist/chunk-XHXEKB3Q.cjs +241 -0
- package/dist/chunk-XHXEKB3Q.cjs.map +1 -0
- package/dist/chunk-XPXIDJUU.js +229 -0
- package/dist/chunk-XPXIDJUU.js.map +1 -0
- package/dist/chunk-ZI442ZA5.cjs +100 -0
- package/dist/chunk-ZI442ZA5.cjs.map +1 -0
- package/dist/config-BEbP-uLf.d.cts +125 -0
- package/dist/config-w1tm1bdu.d.ts +125 -0
- package/dist/generic-BJmlgtUM.d.ts +31 -0
- package/dist/generic-lmrGxMDC.d.cts +31 -0
- package/dist/index.cjs +407 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +93 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/index.cjs +1012 -0
- package/dist/presets/index.cjs.map +1 -0
- package/dist/presets/index.d.cts +516 -0
- package/dist/presets/index.d.ts +516 -0
- package/dist/presets/index.js +971 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/react/heroui/index.cjs +822 -0
- package/dist/react/heroui/index.cjs.map +1 -0
- package/dist/react/heroui/index.d.cts +122 -0
- package/dist/react/heroui/index.d.ts +122 -0
- package/dist/react/heroui/index.js +821 -0
- package/dist/react/heroui/index.js.map +1 -0
- package/dist/react/heroui/styles.css +11 -0
- package/dist/react/index.cjs +71 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +53 -0
- package/dist/react/index.d.ts +53 -0
- package/dist/react/index.js +70 -0
- package/dist/react/index.js.map +1 -0
- package/dist/status-DsWzgb9Q.d.cts +146 -0
- package/dist/status-zd04ZQ98.d.ts +146 -0
- package/dist/store-DybhDphS.d.cts +77 -0
- package/dist/store-_GuzSP0z.d.ts +77 -0
- package/dist/stores/mongodb.cjs +99 -0
- package/dist/stores/mongodb.cjs.map +1 -0
- package/dist/stores/mongodb.d.cts +40 -0
- package/dist/stores/mongodb.d.ts +40 -0
- package/dist/stores/mongodb.js +97 -0
- package/dist/stores/mongodb.js.map +1 -0
- package/dist/stores/redis.cjs +23 -0
- package/dist/stores/redis.cjs.map +1 -0
- package/dist/stores/redis.d.cts +31 -0
- package/dist/stores/redis.d.ts +31 -0
- package/dist/stores/redis.js +21 -0
- package/dist/stores/redis.js.map +1 -0
- package/dist/stores/sql.cjs +164 -0
- package/dist/stores/sql.cjs.map +1 -0
- package/dist/stores/sql.d.cts +39 -0
- package/dist/stores/sql.d.ts +39 -0
- package/dist/stores/sql.js +162 -0
- package/dist/stores/sql.js.map +1 -0
- package/dist/stores/upstash.cjs +27 -0
- package/dist/stores/upstash.cjs.map +1 -0
- package/dist/stores/upstash.d.cts +19 -0
- package/dist/stores/upstash.d.ts +19 -0
- package/dist/stores/upstash.js +25 -0
- package/dist/stores/upstash.js.map +1 -0
- package/dist/testing/index.cjs +209 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +66 -0
- package/dist/testing/index.d.ts +66 -0
- package/dist/testing/index.js +205 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tree-BXbXfjF1.d.cts +236 -0
- package/dist/tree-BXbXfjF1.d.ts +236 -0
- package/dist/types-CctvUAs2.d.cts +192 -0
- package/dist/types-CctvUAs2.d.ts +192 -0
- package/package.json +233 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/presets/fly.ts","../../src/google-auth.ts","../../src/presets/gcp.ts","../../src/presets/aws.ts","../../src/presets/databases.ts","../../src/presets/providers/shared.ts","../../src/presets/providers/ai.ts","../../src/presets/providers/translation.ts","../../src/presets/providers/media.ts","../../src/presets/providers/services.ts","../../src/presets/providers/pusher.ts","../../src/presets/providers/vercel.ts"],"names":["definePreset","status","error","instance","AwsClient","normalizeReturn","res"],"mappings":"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","file":"index.cjs","sourcesContent":["import { definePreset, type PresetOptions } from \"../config\";\nimport type { CheckOutcome, Instance, OutcomeStatus } from \"../types\";\n\nexport type FlyAppOptions = PresetOptions & {\n /** The Fly app name, e.g. \"my-api\" */\n app: string;\n secrets: {\n /** A Fly API token. A read-only one is enough: `fly tokens create readonly` */\n token: string | undefined;\n };\n track?: {\n /**\n * Health path probed on each machine that is already running (default \"/\").\n * Pass `false` to only read machine states. `anyStatus` accepts any HTTP answer,\n * e.g. for servers that answer 404 on their root.\n */\n health?: string | false | { path?: string; anyStatus?: boolean };\n /** Report every machine individually (default true) */\n machines?: boolean;\n };\n};\n\ntype FlyMachineEvent = {\n type?: string;\n timestamp?: number;\n request?: { exit_event?: { exit_code?: number; oom_killed?: boolean; requested_stop?: boolean } };\n};\n\ntype FlyMachine = {\n id: string;\n state: string;\n region?: string;\n checks?: Array<{ name: string; status: string }>;\n events?: FlyMachineEvent[];\n};\n\nconst MACHINES_API = \"https://api.machines.dev/v1\";\nconst GONE_STATES = new Set([\"destroyed\", \"destroying\"]);\n/** Asleep on purpose (scale to zero), or getting there, or waking up: never probed */\nconst RESTING_STATES = new Set([\"stopped\", \"suspended\", \"stopping\", \"suspending\", \"starting\", \"created\"]);\n\n/** Last exit of a stopped machine, if it was a crash rather than a scale-to-zero stop */\nexport function crashReason(machine: { events?: FlyMachineEvent[] }): string | undefined {\n const exit = [...(machine.events ?? [])]\n .filter((event) => event.type === \"exit\")\n .sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0))[0]?.request?.exit_event;\n if (!exit || exit.requested_stop) return undefined;\n if (exit.oom_killed) return \"Out of memory\";\n if (exit.exit_code !== undefined && exit.exit_code !== 0) return `Crashed (exit code ${exit.exit_code})`;\n return undefined;\n}\n\n/** Region code as key, suffixed (#2, #3…) when a region runs several machines */\nfunction withKeys(machines: FlyMachine[]) {\n const seen = new Map<string, number>();\n return [...machines]\n .sort((a, b) => (a.region ?? \"\").localeCompare(b.region ?? \"\") || a.id.localeCompare(b.id))\n .map((machine) => {\n const region = machine.region ?? \"unknown\";\n const count = (seen.get(region) ?? 0) + 1;\n seen.set(region, count);\n return { machine, region, key: count === 1 ? region : `${region}#${count}` };\n });\n}\n\nfunction median(values: number[]) {\n if (!values.length) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.floor((sorted.length - 1) / 2)];\n}\n\n/**\n * A Fly.io app, checked without ever waking it:\n * 1. Machine states come from the Machines API (control plane: it never starts anything).\n * 2. Each machine that is already `started` gets its health path probed, pinned to that\n * machine with `fly-force-instance-id`, so the Fly proxy never starts another one.\n * 3. A stopped machine whose last exit was a crash or an out-of-memory kill is down, not asleep.\n *\n * | Status | When |\n * |---|---|\n * | up | every running machine is healthy |\n * | sleeping | all machines are stopped or suspended, without a crash |\n * | degraded | some machines are down, a Fly health check fails, one is slow, or the Machines API can't be read |\n * | down | no machines, the app doesn't exist, or every machine is down |\n *\n * Reports `metrics.machines` (\"2/5 running\") and one `instances` row per machine.\n */\nconst app = definePreset<FlyAppOptions>()({\n kind: \"fly.app\",\n requiredFields: [\"app\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.app,\n identity: `fly.app:${options.app}`,\n description: `Fly app \"${options.app}\": machine states, then health on running machines only`,\n }),\n check: async ({ options, secrets, http, slowMs }): Promise<CheckOutcome> => {\n const health = options.track?.health ?? \"/\";\n const healthPath = health === false ? undefined : typeof health === \"string\" ? health : (health.path ?? \"/\");\n const anyStatus = typeof health === \"object\" && !!health.anyStatus;\n\n const list = await http(`${MACHINES_API}/apps/${encodeURIComponent(options.app)}/machines`, {\n headers: { Authorization: `Bearer ${secrets.token}` },\n });\n if (list.status === 404) {\n return { status: \"down\", probed: false, httpStatus: 404, error: `App \"${options.app}\" not found on Fly` };\n }\n if (!list.ok || !Array.isArray(list.json)) {\n // Our view of Fly is broken, not necessarily the app\n return {\n status: \"degraded\",\n probed: false,\n httpStatus: list.status,\n error: list.status\n ? `Fly Machines API HTTP ${list.status}`\n : `Fly Machines API unreachable: ${list.outcome.error ?? \"no response\"}`,\n };\n }\n\n const machines = (list.json as FlyMachine[]).filter((machine) => !GONE_STATES.has(machine.state));\n if (machines.length === 0) {\n return { status: \"down\", probed: false, error: \"No machines: the app has no capacity at all\" };\n }\n\n const instances: Instance[] = await Promise.all(\n withKeys(machines).map(async ({ machine, region, key }): Promise<Instance> => {\n const base = { key, region, id: machine.id, state: machine.state };\n\n if (machine.state === \"failed\") return { ...base, status: \"down\", error: \"Machine failed\" };\n if (machine.state !== \"started\") {\n const crash = machine.state === \"stopped\" ? crashReason(machine) : undefined;\n if (crash) return { ...base, status: \"down\", error: crash };\n return { ...base, status: RESTING_STATES.has(machine.state) ? \"sleeping\" : \"degraded\" };\n }\n\n const failingChecks = (machine.checks ?? []).filter((c) => c.status !== \"passing\").map((c) => c.name);\n const checksError = failingChecks.length ? `Fly health checks failing: ${failingChecks.join(\", \")}` : undefined;\n if (!healthPath) {\n return { ...base, status: checksError ? \"degraded\" : \"up\", error: checksError };\n }\n\n const probe = await http(`https://${options.app}.fly.dev${healthPath}`, {\n headers: { \"fly-force-instance-id\": machine.id },\n okStatuses: anyStatus ? [400, 401, 403, 404, 405, 421] : undefined,\n });\n let status: OutcomeStatus = probe.outcome.status;\n let error = probe.outcome.error;\n if (status === \"up\" && checksError) {\n status = \"degraded\";\n error = checksError;\n } else if (status === \"up\" && probe.latencyMs > slowMs) {\n status = \"degraded\";\n error = `Slow response: ${probe.latencyMs} ms`;\n }\n return {\n ...base,\n status,\n latencyMs: probe.status === undefined ? undefined : probe.latencyMs,\n httpStatus: probe.status,\n error,\n };\n })\n );\n\n const down = instances.filter((instance) => instance.status === \"down\");\n const degraded = instances.filter((instance) => instance.status === \"degraded\");\n const awake = instances.filter((instance) => instance.status === \"up\" || instance.status === \"degraded\");\n const keysOf = (items: Instance[]) => items.map((instance) => instance.key).join(\", \");\n\n let status: OutcomeStatus;\n let error: string | undefined;\n if (down.length === instances.length) {\n status = \"down\";\n error = `All ${instances.length} machine(s) down`;\n } else if (down.length > 0) {\n status = \"degraded\";\n error = `${down.length}/${instances.length} machine(s) down: ${keysOf(down)}`;\n } else if (degraded.length > 0) {\n status = \"degraded\";\n error = `Degraded in ${keysOf(degraded)}`;\n } else {\n status = awake.length ? \"up\" : \"sleeping\";\n }\n\n const probed = instances.some((instance) => instance.httpStatus !== undefined || instance.latencyMs !== undefined);\n return {\n status,\n probed,\n // Median of the machines we probed; each machine keeps its own latency\n latencyMs: median(instances.map((i) => i.latencyMs).filter((l): l is number => l !== undefined)),\n error,\n metrics: { machines: `${awake.length}/${instances.length} running` },\n instances: options.track?.machines === false ? undefined : instances,\n };\n },\n});\n\n/** Presets for Fly.io */\nexport const fly = { app };\n","import type { ProbeHelpers } from \"./types\";\n\nexport type GoogleServiceAccount = { client_email: string; private_key: string; project_id?: string };\n\n/** Parse a service-account JSON key; undefined when it isn't one */\nexport function parseServiceAccount(json: string | undefined): GoogleServiceAccount | undefined {\n if (!json) return undefined;\n try {\n const parsed = JSON.parse(json) as Partial<GoogleServiceAccount>;\n return parsed.client_email && parsed.private_key ? (parsed as GoogleServiceAccount) : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst base64url = (bytes: Uint8Array) => {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n};\nconst encodeJson = (value: unknown) => base64url(new TextEncoder().encode(JSON.stringify(value)));\n\nfunction pemToPkcs8(pem: string) {\n const body = pem\n // Keys pasted into environment variables often carry escaped newlines\n .replace(/\\\\n/g, \"\\n\")\n .replace(/-----BEGIN [^-]+-----|-----END [^-]+-----|\\s+/g, \"\");\n const binary = atob(body);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** A signed JWT assertion for Google's OAuth token endpoint (RS256, Web Crypto) */\nexport async function signGoogleAssertion({\n account,\n scope,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n now?: number;\n}) {\n const issuedAt = Math.floor(now / 1000);\n const unsigned = `${encodeJson({ alg: \"RS256\", typ: \"JWT\" })}.${encodeJson({\n iss: account.client_email,\n scope,\n aud: \"https://oauth2.googleapis.com/token\",\n iat: issuedAt,\n exp: issuedAt + 3600,\n })}`;\n const key = await crypto.subtle.importKey(\n \"pkcs8\",\n pemToPkcs8(account.private_key),\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"RSASSA-PKCS1-v1_5\", key, new TextEncoder().encode(unsigned));\n return `${unsigned}.${base64url(new Uint8Array(signature))}`;\n}\n\n// Tokens live in memory only: they are credentials, so they are never written to the store.\n// Each process (or serverless instance) signs in once and reuses its token until it expires.\nconst tokens = new Map<string, { token: string; expiresAt: number }>();\n\n/** Forget cached tokens (for tests) */\nexport function clearGoogleTokens() {\n tokens.clear();\n}\n\n/**\n * An OAuth access token for a Google service account, without any Google library: it only\n * needs `fetch` and Web Crypto, so it works on edge runtimes. Tokens are kept in memory until\n * shortly before they expire.\n */\nexport async function googleServiceAccountToken({\n account,\n scope,\n http,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n http: ProbeHelpers[\"http\"];\n now?: number;\n}): Promise<string> {\n // The tail of the key tells apart two keys of the same account (after a rotation)\n const cacheKey = `${account.client_email}:${scope}:${account.private_key.length}:${account.private_key.slice(-48)}`;\n const cached = tokens.get(cacheKey);\n if (cached && cached.expiresAt > now) return cached.token;\n\n const assertion = await signGoogleAssertion({ account, scope, now });\n const response = await http(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion,\n }).toString(),\n });\n const body = response.json as { access_token?: string; expires_in?: number; error_description?: string; error?: string };\n if (!response.ok || !body?.access_token) {\n throw new Error(\n `Google auth failed: ${body?.error_description ?? body?.error ?? response.outcome.error ?? \"no access token\"}`\n );\n }\n // Keep a margin so a token never expires mid-check\n const ttlMs = Math.max(60_000, ((body.expires_in ?? 3600) - 300) * 1000);\n tokens.set(cacheKey, { token: body.access_token, expiresAt: now + ttlMs });\n return body.access_token;\n}\n","import { definePreset, type PresetOptions } from \"../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../google-auth\";\nimport type { CheckOutcome } from \"../types\";\n\nexport { clearGoogleTokens, googleServiceAccountToken, parseServiceAccount, signGoogleAssertion } from \"../google-auth\";\nexport type { GoogleServiceAccount } from \"../google-auth\";\n\nexport type GcpInstanceOptions = PresetOptions & {\n /** The Compute Engine instance name */\n instance: string | undefined;\n /** Its zone, e.g. \"europe-west1-b\" */\n zone: string | undefined;\n /** The project ID (default: the one in the service-account key) */\n project?: string;\n secrets: {\n /** Service-account JSON key allowed to read instances (e.g. Compute Viewer) */\n serviceAccount: string | undefined;\n };\n track?: {\n /** URL probed only while the VM is RUNNING. Any HTTP answer counts as healthy. */\n health?: string | false;\n };\n};\n\nconst SLEEP_STATES = new Set([\"TERMINATED\", \"STOPPED\", \"SUSPENDED\", \"STOPPING\", \"SUSPENDING\"]);\nconst BOOTING_STATES = new Set([\"PROVISIONING\", \"STAGING\"]);\n\n/**\n * A Compute Engine VM, checked without ever starting it: the instance status comes from the\n * Compute API, and the optional health URL is only called while the VM is RUNNING.\n * - up: RUNNING (and the health URL answers)\n * - sleeping: TERMINATED, STOPPED or SUSPENDED\n * - degraded: PROVISIONING / STAGING, or slow\n * - down: the Compute API fails, the health URL fails, or the state is unexpected\n *\n * Reports `metrics.vm` and `metrics.zone`.\n */\nconst instance = definePreset<GcpInstanceOptions>()({\n kind: \"gcp.instance\",\n requiredFields: [\"instance\", \"zone\"],\n requiredSecrets: [\"serviceAccount\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.instance ?? \"\",\n identity: `gcp.instance:${options.project ?? \"\"}/${options.zone ?? \"\"}/${options.instance ?? \"\"}`,\n description: `Google Cloud VM \"${options.instance}\": status, then health only when running`,\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n const project = options.project ?? account?.project_id;\n if (!account || !project) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n\n let token: string;\n try {\n token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/compute.readonly\",\n http,\n now,\n });\n } catch (error) {\n return { status: \"down\", probed: false, error: error instanceof Error ? error.message : String(error) };\n }\n\n const info = await http(\n `https://compute.googleapis.com/compute/v1/projects/${project}/zones/${options.zone}/instances/${options.instance}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const state = (info.json as { status?: string })?.status;\n if (!info.ok || !state) {\n return {\n status: \"down\",\n probed: false,\n httpStatus: info.status,\n error: `Compute API: ${info.outcome.error ?? \"no instance status\"}`,\n };\n }\n\n const metrics = { vm: state, zone: options.zone as string };\n if (SLEEP_STATES.has(state)) return { status: \"sleeping\", probed: false, metrics };\n if (BOOTING_STATES.has(state)) return { status: \"degraded\", probed: false, metrics, error: `VM is ${state}` };\n if (state !== \"RUNNING\") return { status: \"down\", probed: false, metrics, error: `VM is ${state}` };\n\n const health = options.track?.health;\n if (!health) return { status: \"up\", probed: false, metrics };\n // Any HTTP answer means the host is serving\n const probe = await http(health, { okStatuses: [400, 401, 403, 404, 405] });\n return { ...probe.outcome, metrics };\n },\n});\n\n/** Presets for Google Cloud */\nexport const gcp = { instance };\n","import { AwsClient } from \"aws4fetch\";\nimport { definePreset, type PresetOptions } from \"../config\";\nimport type { ProbeHelpers } from \"../types\";\n\ntype AwsSecrets = { accessKeyId: string | undefined; secretAccessKey: string | undefined };\n\n/** Sign with SigV4, then send through the check's timed `http` helper */\nasync function signedCall({\n http,\n secrets,\n service,\n region,\n url,\n init,\n}: {\n http: ProbeHelpers[\"http\"];\n secrets: { accessKeyId: string; secretAccessKey: string };\n service: string;\n region: string;\n url: string;\n init: { method: string; headers?: Record<string, string>; body?: string };\n}) {\n const client = new AwsClient({ ...secrets, service, region });\n const request = await client.sign(url, init);\n return http(request.url, {\n method: init.method,\n headers: Object.fromEntries(request.headers.entries()),\n body: init.body,\n });\n}\n\nexport type AwsCredentialsOptions = PresetOptions & {\n /** How to call it: these credentials usually belong to one AWS service you use */\n name: string;\n secrets: AwsSecrets;\n};\n\n/**\n * AWS credentials, validated with STS `GetCallerIdentity` (free, needs no permission).\n * It only proves the credentials work, not that a particular AWS service is healthy:\n * use it for services with no cheap probe of their own (e.g. Transcribe streaming).\n */\nconst credentials = definePreset<AwsCredentialsOptions>()({\n kind: \"aws.credentials\",\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n derive: (options) => ({\n name: options.name,\n description: \"Validates the credentials only (STS GetCallerIdentity)\",\n }),\n check: async ({ secrets, http }) => {\n const body = \"Action=GetCallerIdentity&Version=2011-06-15\";\n const response = await signedCall({\n http,\n secrets,\n service: \"sts\",\n region: \"us-east-1\",\n url: \"https://sts.amazonaws.com/\",\n init: { method: \"POST\", headers: { \"content-type\": \"application/x-www-form-urlencoded\" }, body },\n });\n return response.outcome;\n },\n});\n\nexport type S3BucketOptions = PresetOptions & {\n bucket: string | undefined;\n /** S3-compatible endpoint (Tigris, R2, MinIO…). Default: AWS S3 in `region`. */\n endpoint?: string;\n /** Region (default \"us-east-1\"; S3-compatible services often use \"auto\") */\n region?: string;\n secrets: AwsSecrets;\n};\n\n/**\n * An S3 bucket, on AWS or any S3-compatible storage (Tigris, Cloudflare R2, MinIO…).\n * Sends `HeadBucket`: up when the bucket is reachable with these credentials, down when it is\n * missing or access is denied.\n */\nconst s3Bucket = definePreset<S3BucketOptions>()({\n kind: \"aws.s3-bucket\",\n requiredFields: [\"bucket\"],\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.bucket ?? \"\",\n description: \"S3 HeadBucket on the storage endpoint\",\n }),\n check: async ({ options, secrets, http }) => {\n const region = options.region ?? \"us-east-1\";\n const endpoint = (options.endpoint ?? `https://s3.${region}.amazonaws.com`).replace(/\\/+$/, \"\");\n const response = await signedCall({\n http,\n secrets,\n service: \"s3\",\n region,\n url: `${endpoint}/${options.bucket}`,\n init: { method: \"HEAD\" },\n });\n return response.outcome;\n },\n});\n\n/** Presets for AWS and S3-compatible storage */\nexport const aws = { credentials, s3Bucket };\n","import { definePreset, type PresetOptions } from \"../config\";\n\n// These presets take a client you created, so the library never imports a database driver:\n// nothing extra to install, and the presets entry stays usable on edge runtimes.\n\ntype MongoDatabase = { command(command: Record<string, unknown>): Promise<unknown> };\ntype MongoLike = MongoDatabase | { db(name?: string): MongoDatabase };\n\nexport type MongoPingOptions = PresetOptions & {\n /**\n * Your `MongoClient` (or a `Db`). The driver connects on first use, so there is nothing to\n * await. When undefined the service is \"not configured\".\n */\n client: MongoLike | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * MongoDB, through your own client. Sends the `ping` command.\n * - up: the server replies\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * mongodb.ping({ client: new MongoClient(url, { serverSelectionTimeoutMS: 8000 }) })\n * ```\n */\nconst mongoPing = definePreset<MongoPingOptions>()({\n kind: \"mongodb.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"MongoDB\", description: \"`ping` command on the database\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as MongoLike;\n const database = \"command\" in client ? client : client.db();\n await database.command({ ping: 1 });\n }),\n});\n\n/** Presets for MongoDB */\nexport const mongodb = { ping: mongoPing };\n\ntype RedisLike =\n | { ping: () => Promise<unknown> }\n | { call: (command: string, ...args: string[]) => Promise<unknown> }\n | { sendCommand: (args: string[]) => Promise<unknown> };\n\nexport type RedisPingOptions = PresetOptions & {\n /** A connected ioredis or node-redis client. When undefined the service is \"not configured\". */\n client: RedisLike | undefined;\n};\n\n/**\n * Any Redis server, through your own client. Sends `PING`; up on PONG.\n * (For Upstash or Vercel KV over REST, use `upstashRedis`, which needs no client.)\n */\nconst redisPing = definePreset<RedisPingOptions>()({\n kind: \"redis.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 300 },\n derive: () => ({ name: \"Redis\", description: \"PING\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as RedisLike;\n const reply =\n \"ping\" in client\n ? await client.ping()\n : \"call\" in client\n ? await client.call(\"PING\")\n : await client.sendCommand([\"PING\"]);\n return String(reply).toUpperCase() === \"PONG\" ? true : { status: \"down\", error: `Unexpected reply: ${String(reply)}` };\n }),\n});\n\n/** Presets for Redis servers reached with a client library */\nexport const redis = { ping: redisPing };\n\nexport type PostgresPingOptions = PresetOptions & {\n /**\n * Runs one statement with the driver you already use (pg, postgres.js, Neon…). When\n * undefined the service is \"not configured\".\n */\n query: ((sql: string) => Promise<unknown>) | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * PostgreSQL, through your own driver. Runs `select 1`.\n * - up: the server answers\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * postgres.ping({ query: (sql) => pool.query(sql) })\n * ```\n */\nconst postgresPing = definePreset<PostgresPingOptions>()({\n kind: \"postgres.ping\",\n requiredFields: [\"query\"],\n defaults: { slowMs: 1000 },\n derive: () => ({ name: \"PostgreSQL\", description: \"Runs `select 1`\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n await (options.query as (sql: string) => Promise<unknown>)(\"select 1\");\n }),\n});\n\n/** Presets for PostgreSQL servers reached with a client library */\nexport const postgres = { ping: postgresPing };\n","import { normalizeReturn } from \"../../probe\";\nimport type { CheckOutcome, CheckReturn, HttpInit, HttpResult, ProbeHelpers } from \"../../types\";\n\nexport const bearer = (token: string) => ({ Authorization: `Bearer ${token}` });\n\nexport const round = (value: number, digits = 1) => Math.round(value * 10 ** digits) / 10 ** digits;\n\n/** Base64 of a UTF-8 string, without Node's Buffer */\nexport function base64(text: string) {\n const bytes = new TextEncoder().encode(text);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\n/**\n * One API call: its outcome when it fails, otherwise the outcome refined by `refine`\n * (metrics, usage, a warning…). Most provider presets are exactly this.\n */\nexport async function call(\n http: ProbeHelpers[\"http\"],\n url: string,\n init?: HttpInit,\n refine?: (response: HttpResult) => CheckReturn\n): Promise<CheckOutcome> {\n const response = await http(url, init);\n if (!response.ok || !refine) return response.outcome;\n return { ...response.outcome, ...normalizeReturn(refine(response)) };\n}\n\n/** A used/limit pair with the threshold from which it becomes a warning */\nexport function quota({\n label,\n used,\n limit,\n unit,\n resetsAt,\n warnAbovePct,\n warning,\n}: {\n label: string;\n used: number;\n limit: number;\n unit?: string;\n resetsAt?: number;\n warnAbovePct: number;\n warning: string;\n}): CheckOutcome {\n const pct = limit > 0 ? (used / limit) * 100 : 0;\n const over = pct >= warnAbovePct;\n return {\n status: over ? \"degraded\" : \"up\",\n error: over ? warning : undefined,\n usage: [{ label, used, limit, unit, resetsAt }],\n };\n}\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota, round } from \"./shared\";\n\ntype ApiKey = { secrets: { apiKey: string | undefined } };\n\nexport type DeepgramOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when the prepaid balance drops below this amount (default 20). `false` skips the balance. */\n balance?: { warnBelow?: number } | false;\n };\n };\n\n/**\n * Deepgram. Lists projects, then reads the balance of the first one.\n * - up: the key works\n * - degraded: balance below `track.balance.warnBelow`, or the key sees no project\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.balance`. Keys without billing scope still count as up.\n */\nexport const deepgram = definePreset<DeepgramOptions>()({\n kind: \"deepgram\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Deepgram\", identity: \"deepgram\", description: \"Lists projects, then reads the account balance\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const headers = { Authorization: `Token ${secrets.apiKey}` };\n const projects = await http(\"https://api.deepgram.com/v1/projects\", { headers });\n if (!projects.ok) return projects.outcome;\n const projectId = (projects.json as { projects?: Array<{ project_id: string }> })?.projects?.[0]?.project_id;\n if (!projectId) return { ...projects.outcome, status: \"degraded\", error: \"No project visible to this key\" };\n if (options.track?.balance === false) return projects.outcome;\n\n const warnBelow = options.track?.balance?.warnBelow ?? 20;\n const balances = await http(`https://api.deepgram.com/v1/projects/${projectId}/balances`, { headers });\n const balance = (balances.json as { balances?: Array<{ amount: number; units: string }> })?.balances?.[0];\n // The balance is informative: a key that can't read it is still a working key\n if (!balances.ok || !balance) return projects.outcome;\n const low = balance.amount < warnBelow;\n return {\n ...projects.outcome,\n latencyMs: Math.max(projects.latencyMs, balances.latencyMs),\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low balance\" : undefined,\n metrics: { balance: `${round(balance.amount, 2)} ${balance.units}` },\n };\n },\n});\n\n/** Gladia. Lists live sessions (limit 1). up when the key works; down when rejected. */\nexport const gladia = definePreset<PresetOptions & ApiKey>()({\n kind: \"gladia\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Gladia\", identity: \"gladia\", description: \"Lists live sessions (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.gladia.io/v2/live?limit=1\", { headers: { \"x-gladia-key\": secrets.apiKey } }),\n});\n\nexport type SpeechmaticsOptions = PresetOptions &\n ApiKey & {\n /** API base URL, e.g. the EU endpoint (default \"https://asr.api.speechmatics.com\") */\n baseUrl?: string;\n };\n\n/** Speechmatics. Lists batch jobs (limit 1), which validates the API key. */\nexport const speechmatics = definePreset<SpeechmaticsOptions>()({\n kind: \"speechmatics\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({\n name: \"Speechmatics\",\n identity: \"speechmatics\",\n description: \"Lists batch jobs (limit 1), validating the API key\",\n }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl ?? \"https://asr.api.speechmatics.com\").replace(/\\/+$/, \"\")}/v2/jobs?limit=1`, {\n headers: bearer(secrets.apiKey),\n }),\n});\n\nexport type OpenAIOptions = PresetOptions &\n ApiKey & {\n /** Sent as the `OpenAI-Organization` header */\n organization?: string;\n track?: {\n /** Also check that the key can use this model (`GET /v1/models/{model}`) */\n model?: string;\n };\n };\n\n/**\n * OpenAI. Lists models, or reads one model when `track.model` is set (both free).\n * It proves the key works; it can't see billing problems, which only show on real requests.\n */\nexport const openai = definePreset<OpenAIOptions>()({\n kind: \"openai\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"OpenAI\",\n identity: \"openai\",\n description: options.track?.model ? `Checks access to ${options.track.model}` : \"Lists models\",\n }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.track?.model\n ? `https://api.openai.com/v1/models/${encodeURIComponent(options.track.model)}`\n : \"https://api.openai.com/v1/models\",\n {\n headers: {\n ...bearer(secrets.apiKey),\n ...(options.organization ? { \"OpenAI-Organization\": options.organization } : {}),\n },\n }\n ),\n});\n\n/** Anthropic. Lists models (limit 1). up when the key works; down when rejected. */\nexport const anthropic = definePreset<PresetOptions & ApiKey>()({\n kind: \"anthropic\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Anthropic\", identity: \"anthropic\", description: \"Lists models\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.anthropic.com/v1/models?limit=1\", {\n headers: { \"x-api-key\": secrets.apiKey, \"anthropic-version\": \"2023-06-01\" },\n }),\n});\n\n/** Google Gemini. Lists models (page size 1). */\nexport const gemini = definePreset<PresetOptions & ApiKey>()({\n kind: \"gemini\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Google Gemini\", identity: \"gemini\", description: \"Lists models\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://generativelanguage.googleapis.com/v1beta/models?pageSize=1\", {\n headers: { \"x-goog-api-key\": secrets.apiKey },\n }),\n});\n\n/** CAMB.AI. Lists source languages. */\nexport const cambai = definePreset<PresetOptions & ApiKey>()({\n kind: \"cambai\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"CAMB.AI\", identity: \"cambai\", description: \"Lists source languages\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://client.camb.ai/apis/source-languages\", { headers: { \"x-api-key\": secrets.apiKey } }),\n});\n\nexport type ElevenLabsOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when less than this share of the period's credits is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n };\n\n/**\n * ElevenLabs. Reads the subscription, which validates the API key.\n * - up: the key works. A key without the user scope is refused with `missing_permissions`,\n * which still proves it is valid.\n * - degraded: less than `track.quota.warnBelowPct` of the credits left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar (credits used this period, with the reset time) and `metrics.tier`.\n */\nexport const elevenlabs = definePreset<ElevenLabsOptions>()({\n kind: \"elevenlabs\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"ElevenLabs\", identity: \"elevenlabs\", description: \"Reads the subscription\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.elevenlabs.io/v1/user/subscription\", {\n headers: { \"xi-api-key\": secrets.apiKey },\n });\n const body =\n (res.json as {\n detail?: { status?: string };\n tier?: string;\n character_count?: number;\n character_limit?: number;\n next_character_count_reset_unix?: number;\n }) ?? {};\n if (res.status === 401 && body.detail?.status === \"missing_permissions\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"restricted\" } };\n }\n if (!res.ok) return res.outcome;\n const metrics = body.tier ? { tier: body.tier } : undefined;\n const { character_count: used, character_limit: limit } = body;\n if (typeof used !== \"number\" || !limit) return { ...res.outcome, metrics };\n return {\n ...res.outcome,\n ...quota({\n label: \"Credits\",\n used,\n limit,\n unit: \"credits\",\n // ElevenLabs gives the reset as epoch seconds\n resetsAt: body.next_character_count_reset_unix ? body.next_character_count_reset_unix * 1000 : undefined,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"Credits almost exhausted\",\n }),\n metrics,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../../google-auth\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type DeepLOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when this share of the character quota is used (default 90) */\n quota?: { warnAbovePct?: number };\n };\n};\n\n/**\n * DeepL. Reads `/v2/usage` (free and paid keys are detected from the key).\n * - up: quota available\n * - degraded: usage at or above `track.quota.warnAbovePct`\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: characters used of the limit.\n */\nexport const deepl = definePreset<DeepLOptions>()({\n kind: \"deepl\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"DeepL\", identity: \"deepl\", description: \"Reads character usage for the billing period\" }),\n check: ({ options, secrets, http }) => {\n const host = secrets.apiKey.endsWith(\":fx\") ? \"api-free.deepl.com\" : \"api.deepl.com\";\n return call(http, `https://${host}/v2/usage`, { headers: { Authorization: `DeepL-Auth-Key ${secrets.apiKey}` } }, (res) => {\n const { character_count: used, character_limit: limit } =\n (res.json as { character_count?: number; character_limit?: number }) ?? {};\n if (typeof used !== \"number\" || !limit) return undefined;\n return quota({\n label: \"Characters\",\n used,\n limit,\n unit: \"characters\",\n warnAbovePct: options.track?.quota?.warnAbovePct ?? 90,\n warning: \"Character quota almost exhausted\",\n });\n });\n },\n});\n\nexport type AzureTranslatorOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Region of the Translator resource (default \"westeurope\") */\n region?: string;\n};\n\n/** Azure Translator. Translates a single character, which proves the key and region work. */\nexport const azureTranslator = definePreset<AzureTranslatorOptions>()({\n kind: \"azure.translator\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Azure Translator\", identity: \"azure.translator\", description: \"Translates a single character\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=fr\", {\n method: \"POST\",\n headers: {\n \"Ocp-Apim-Subscription-Key\": secrets.apiKey,\n \"Ocp-Apim-Subscription-Region\": options.region ?? \"westeurope\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify([{ Text: \"a\" }]),\n }),\n});\n\nexport type GoogleTranslateOptions = PresetOptions & {\n secrets: {\n /** The service-account JSON key (the whole file content), not an API key */\n serviceAccount: string | undefined;\n };\n /** Translation location (default \"global\") */\n location?: string;\n};\n\n/**\n * Google Cloud Translation v3, with a service account. Gets a token, then lists supported\n * languages (free: Google bills by characters translated).\n * - up: languages returned\n * - down: the key isn't valid JSON, or auth or the API fails\n *\n * Reports `metrics.languages`.\n */\nexport const googleTranslate = definePreset<GoogleTranslateOptions>()({\n kind: \"google.translate\",\n requiredSecrets: [\"serviceAccount\"],\n derive: () => ({\n name: \"Google Translate\",\n identity: \"google.translate\",\n description: \"Lists supported languages with Cloud Translation v3\",\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n if (!account?.project_id) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n const token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/cloud-translation\",\n http,\n now,\n });\n return call(\n http,\n `https://translation.googleapis.com/v3/projects/${account.project_id}/locations/${options.location ?? \"global\"}/supportedLanguages`,\n { headers: bearer(token) },\n (res) => {\n const languages = (res.json as { languages?: unknown[] })?.languages;\n return languages ? { status: \"up\", metrics: { languages: languages.length } } : undefined;\n }\n );\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { base64, bearer, call, quota } from \"./shared\";\n\nexport type MuxOptions = PresetOptions & {\n secrets: { tokenId: string | undefined; tokenSecret: string | undefined };\n};\n\n/** Mux Video. Lists live streams (limit 1). up when the token works; down when rejected. */\nexport const mux = definePreset<MuxOptions>()({\n kind: \"mux\",\n requiredSecrets: [\"tokenId\", \"tokenSecret\"],\n derive: () => ({ name: \"Mux\", identity: \"mux\", description: \"Lists live streams (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.mux.com/video/v1/live-streams?limit=1\", {\n headers: { Authorization: `Basic ${base64(`${secrets.tokenId}:${secrets.tokenSecret}`)}` },\n }),\n});\n\nexport type CloudflareStreamOptions = PresetOptions & {\n /** The Cloudflare account ID */\n accountId: string | undefined;\n secrets: { token: string | undefined };\n track?: {\n /** Warn when this share of the storage plan is used (default 90). `false` skips storage. */\n storage?: { warnAbovePct?: number } | false;\n };\n};\n\n/**\n * Cloudflare Stream. Lists videos (limit 1) and reads storage usage, in parallel.\n * - up: both calls work\n * - degraded: storage at or above `track.storage.warnAbovePct`\n * - down: either call fails\n *\n * Reports a `usage` bar (storage minutes) and `metrics.videos`.\n */\nexport const cloudflareStream = definePreset<CloudflareStreamOptions>()({\n kind: \"cloudflare.stream\",\n requiredFields: [\"accountId\"],\n requiredSecrets: [\"token\"],\n derive: () => ({\n name: \"Cloudflare Stream\",\n identity: \"cloudflare.stream\",\n description: \"Lists videos (limit 1) and reads storage usage against the plan limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const base = `https://api.cloudflare.com/client/v4/accounts/${options.accountId}/stream`;\n const init = { headers: bearer(secrets.token) };\n const rejected = (json: unknown): CheckOutcome | undefined =>\n (json as { success?: boolean })?.success === false\n ? { status: \"down\", error: \"Cloudflare API reported success=false\" }\n : undefined;\n\n const videos = call(http, `${base}?limit=1`, init, (res) => rejected(res.json));\n if (options.track?.storage === false) return videos;\n\n const warnAbovePct = options.track?.storage?.warnAbovePct ?? 90;\n const storage = call(http, `${base}/storage-usage`, init, (res) => {\n const failed = rejected(res.json);\n if (failed) return failed;\n const usage = (\n res.json as {\n result?: { videoCount?: number; totalStorageMinutes?: number; totalStorageMinutesLimit?: number };\n }\n )?.result;\n if (!usage?.totalStorageMinutesLimit) return undefined;\n return {\n ...quota({\n label: \"Video storage\",\n used: Math.round(usage.totalStorageMinutes ?? 0),\n limit: usage.totalStorageMinutesLimit,\n unit: \"min\",\n warnAbovePct,\n warning: \"Stream storage almost full\",\n }),\n metrics: { videos: usage.videoCount ?? 0 },\n };\n });\n return combine(await Promise.all([videos, storage]));\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type MailerSendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when less than this share of the API quota is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n};\n\n/**\n * MailerSend. Reads `/v1/api-quota`.\n * - up: quota available\n * - degraded: less than `track.quota.warnBelowPct` of the requests left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: API requests used, with the reset time.\n */\nexport const mailersend = definePreset<MailerSendOptions>()({\n kind: \"mailersend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"MailerSend\", identity: \"mailersend\", description: \"Reads the API quota\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.mailersend.com/v1/api-quota\", { headers: bearer(secrets.apiKey) }, (res) => {\n const { quota: limit, remaining, reset } =\n (res.json as { quota?: number; remaining?: number; reset?: string }) ?? {};\n if (!limit || typeof remaining !== \"number\") return undefined;\n const resetsAt = reset ? Date.parse(reset) : NaN;\n return quota({\n label: \"API requests\",\n used: limit - remaining,\n limit,\n unit: \"requests\",\n resetsAt: Number.isNaN(resetsAt) ? undefined : resetsAt,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"API quota almost exhausted\",\n });\n }),\n});\n\nexport type GitHubOptions = PresetOptions & {\n secrets: { token: string | undefined };\n track?: {\n /** Also check that the token can read this repository's releases, e.g. \"owner/name\" */\n repo?: string;\n /** Warn when less than this share of the hourly rate limit is left (default 10) */\n rateLimit?: { warnBelowPct?: number };\n };\n};\n\n/**\n * GitHub. Reads `/rate_limit` (free: it doesn't count against the limit), and optionally\n * checks access to a repository's releases.\n * - up: the token works (and can read the repository)\n * - degraded: less than `track.rateLimit.warnBelowPct` of the hourly requests left\n * - down: bad credentials, or the repository can't be read\n *\n * Reports a `usage` bar: requests this hour, with the reset time.\n */\nexport const github = definePreset<GitHubOptions>()({\n kind: \"github\",\n requiredSecrets: [\"token\"],\n derive: (options) => ({\n name: \"GitHub\",\n identity: options.track?.repo ? `github:${options.track.repo}` : \"github\",\n description: options.track?.repo\n ? `Reads the API rate limit and the releases of ${options.track.repo}`\n : \"Reads the API rate limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const headers = { ...bearer(secrets.token), \"user-agent\": \"sermon-js\", accept: \"application/vnd.github+json\" };\n const limit = call(http, \"https://api.github.com/rate_limit\", { headers }, (res) => {\n const core = (res.json as { resources?: { core?: { limit: number; remaining: number; reset: number } } })\n ?.resources?.core;\n if (!core) return undefined;\n return quota({\n label: \"API requests this hour\",\n used: core.limit - core.remaining,\n limit: core.limit,\n unit: \"requests\",\n // GitHub gives the reset as epoch seconds\n resetsAt: core.reset * 1000,\n warnAbovePct: 100 - (options.track?.rateLimit?.warnBelowPct ?? 10),\n warning: \"Rate limit almost exhausted\",\n });\n });\n if (!options.track?.repo) return limit;\n const repo = call(http, `https://api.github.com/repos/${options.track.repo}/releases?per_page=1`, { headers });\n return combine(await Promise.all([limit, repo]));\n },\n});\n\nexport type RevolutOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Which Merchant API to call (default \"production\") */\n environment?: \"production\" | \"sandbox\";\n};\n\n/** Revolut Merchant. Lists orders (limit 1). up when the secret key works; down when rejected. */\nexport const revolut = definePreset<RevolutOptions>()({\n kind: \"revolut\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Revolut Merchant\", identity: \"revolut\", description: \"Lists orders (limit 1)\" }),\n check: ({ options, secrets, http }) => {\n const host = options.environment === \"sandbox\" ? \"sandbox-merchant.revolut.com\" : \"merchant.revolut.com\";\n // Order listing only exists on the legacy 1.0 path\n return call(http, `https://${host}/api/1.0/orders?limit=1`, {\n headers: { ...bearer(secrets.apiKey), \"Revolut-Api-Version\": \"2023-09-01\" },\n });\n },\n});\n\nexport type AttendeeOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** API base URL (default \"https://app.attendee.dev\") */\n baseUrl?: string;\n};\n\n/** Attendee (meeting bots). Lists bots (page size 1). */\nexport const attendee = definePreset<AttendeeOptions>()({\n kind: \"attendee\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Attendee\", identity: \"attendee\", description: \"Lists bots\" }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl || \"https://app.attendee.dev\").replace(/\\/+$/, \"\")}/api/v1/bots?page_size=1`, {\n headers: { Authorization: `Token ${secrets.apiKey}` },\n }),\n});\n\nexport type AxiomOptions = PresetOptions & {\n /** The dataset logs are sent to */\n dataset: string | undefined;\n /** Regional edge domain for ingestion, e.g. \"eu-central-1.aws.edge.axiom.co\" */\n edge?: string;\n secrets: { token: string | undefined };\n};\n\n/** Axiom. Ingests an empty batch into the dataset: it writes nothing and proves token and dataset. */\nexport const axiom = definePreset<AxiomOptions>()({\n kind: \"axiom\",\n requiredFields: [\"dataset\"],\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Axiom\", identity: \"axiom\", description: \"Ingests an empty batch into the logs dataset\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.edge\n ? `https://${options.edge}/v1/ingest/${options.dataset}`\n : `https://api.axiom.co/v1/datasets/${options.dataset}/ingest`,\n { method: \"POST\", headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" }, body: \"[]\" }\n ),\n});\n\nexport type UpstashRedisOptions = PresetOptions & {\n /** REST URL of the database */\n url: string | undefined;\n secrets: { token: string | undefined };\n};\n\n/**\n * Upstash Redis / Vercel KV, over REST. Sends `PING` as a regular command (which compatible\n * servers such as serverless-redis-http also accept). up on PONG.\n */\nexport const upstashRedis = definePreset<UpstashRedisOptions>()({\n kind: \"upstash.redis\",\n requiredFields: [\"url\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"Redis\", description: \"PING through the REST API\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n (options.url as string).replace(/\\/+$/, \"\"),\n {\n method: \"POST\",\n headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" },\n body: '[\"PING\"]',\n },\n (res) =>\n (res.json as { result?: string })?.result === \"PONG\"\n ? undefined\n : { status: \"down\", error: \"Unexpected reply to PING\" }\n ),\n});\n\nexport type StatuspageOptions = PresetOptions & {\n /** The status page, e.g. \"https://status.flyio.net\" */\n url: string;\n};\n\n/**\n * Any provider that publishes an Atlassian Statuspage (Fly.io, Vercel, Cloudflare, GitHub…).\n * Reads `/api/v2/status.json`.\n * - up: the provider reports no incident\n * - degraded: a minor incident\n * - down: a major or critical incident\n *\n * The provider's own description becomes the error text.\n */\nexport const statuspage = definePreset<StatuspageOptions>()({\n kind: \"statuspage\",\n requiredFields: [\"url\"],\n derive: (options) => {\n let host = options.url;\n try {\n host = new URL(options.url).host;\n } catch {\n // Keep the raw value: the check will report the bad URL\n }\n return {\n name: host,\n identity: `statuspage:${host}`,\n description: \"Status reported by the provider's public status page\",\n };\n },\n check: ({ options, http }) =>\n call(http, `${options.url.replace(/\\/+$/, \"\")}/api/v2/status.json`, undefined, (res) => {\n const { indicator, description } =\n (res.json as { status?: { indicator?: string; description?: string } })?.status ?? {};\n if (!indicator) return { status: \"degraded\", error: \"Not a Statuspage answer\" };\n const status = indicator === \"none\" ? \"up\" : indicator === \"minor\" ? \"degraded\" : \"down\";\n return { status, error: status === \"up\" ? undefined : description };\n }),\n});\n\nexport type ResendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Resend. Lists domains, which validates the API key.\n * - up: the key works. A sending-only key is refused with `restricted_api_key`, which still\n * proves it is valid.\n * - degraded: domains exist, but none is verified\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.domains` and `metrics.verified` for full-access keys.\n */\nexport const resend = definePreset<ResendOptions>()({\n kind: \"resend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Resend\", identity: \"resend\", description: \"Lists domains\" }),\n check: async ({ secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.resend.com/domains\", { headers: bearer(secrets.apiKey) });\n const body = (res.json as { name?: string; data?: Array<{ status?: string }> }) ?? {};\n if (res.status === 401 && body.name === \"restricted_api_key\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"sending only\" } };\n }\n if (!res.ok || !Array.isArray(body.data)) return res.outcome;\n const verified = body.data.filter((domain) => domain.status === \"verified\").length;\n const unverified = body.data.length > 0 && verified === 0;\n return {\n ...res.outcome,\n status: unverified ? \"degraded\" : \"up\",\n error: unverified ? \"No verified domain\" : undefined,\n metrics: { domains: body.data.length, verified },\n };\n },\n});\n\nexport type MeilisearchOptions = PresetOptions & {\n /** The server, e.g. \"https://search.example.com\" */\n host: string | undefined;\n /** Also require this index, and report its document count */\n index?: string;\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Meilisearch. Reads `/health`, then the index (or the list of indexes), which validates the key.\n * - up: the server is available and the key works\n * - degraded: the index does not exist\n * - down: the server is unavailable, or rejects the key\n *\n * Reports `metrics.documents`, and `metrics.indexing` while a batch is running, when the key\n * may read statistics; scoped keys often may not, and that is not held against them.\n */\nexport const meilisearch = definePreset<MeilisearchOptions>()({\n kind: \"meilisearch\",\n requiredFields: [\"host\"],\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Meilisearch\",\n identity: options.index ? `meilisearch:${options.index}` : \"meilisearch\",\n description: options.index\n ? `Reads the health and the ${options.index} index`\n : \"Reads the health and lists indexes\",\n }),\n check: async ({ options, secrets, http, combine }) => {\n const host = (options.host as string).replace(/\\/+$/, \"\");\n const headers = bearer(secrets.apiKey);\n const index = options.index ? `/indexes/${encodeURIComponent(options.index)}` : undefined;\n\n const health = call(http, `${host}/health`, undefined, (res) =>\n (res.json as { status?: string })?.status === \"available\" ? undefined : { status: \"down\", error: \"Not available\" }\n );\n const access = http(`${host}${index ?? \"/indexes?limit=1\"}`, { headers }).then((res): CheckOutcome => {\n if (res.status !== 404 || !options.index) return res.outcome;\n return {\n status: \"degraded\",\n latencyMs: res.latencyMs,\n httpStatus: 404,\n error: `Index ${options.index} not found`,\n };\n });\n const stats = http(`${host}${index ?? \"\"}/stats`, { headers });\n\n const outcome = combine(await Promise.all([health, access]));\n const res = await stats;\n // Statistics are informative: a key that can't read them is still a working key\n if (!res.ok) return outcome;\n const body =\n (res.json as {\n numberOfDocuments?: number;\n isIndexing?: boolean;\n indexes?: Record<string, { numberOfDocuments?: number }>;\n }) ?? {};\n const documents =\n body.numberOfDocuments ??\n Object.values(body.indexes ?? {}).reduce((sum, entry) => sum + (entry.numberOfDocuments ?? 0), 0);\n return { ...outcome, metrics: { ...outcome.metrics, documents, ...(body.isIndexing ? { indexing: \"yes\" } : {}) } };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome, Metrics, Usage } from \"../../types\";\n\nexport type PusherOptions = PresetOptions & {\n appId: string | undefined;\n /** Pusher cluster, e.g. \"eu\" (default \"mt1\"). Ignored when `host` is set. */\n cluster?: string;\n /** Custom host, for Pusher-compatible servers such as Soketi */\n host?: string;\n port?: string | number;\n /** Use HTTPS (default: true unless a non-443 port is given) */\n tls?: boolean;\n secrets: { key: string | undefined; secret: string | undefined };\n track?: {\n connections?: {\n /** Your plan's maximum concurrent connections: turns the counts into usage bars */\n max?: number;\n /** Warn when today's peak reaches this share of `max` (default 90) */\n warnAbovePct?: number;\n };\n };\n};\n\n/** Max channels queried one by one for their subscription count, per check */\nconst MAX_CHANNELS = 500;\nconst CONCURRENCY = 10;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nasync function hmacSha256Hex(secret: string, message: string) {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"sign\",\n ]);\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message));\n return [...new Uint8Array(signature)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Path and signed query of a GET to the Pusher HTTP API */\nexport async function signPusherRequest({\n appId,\n key,\n secret,\n path,\n params = {},\n timestamp = Math.floor(Date.now() / 1000),\n}: {\n appId: string;\n key: string;\n secret: string;\n path: string;\n params?: Record<string, string>;\n timestamp?: number;\n}) {\n const fullPath = `/apps/${appId}${path}`;\n const search = new URLSearchParams({\n ...params,\n auth_key: key,\n auth_timestamp: String(timestamp),\n auth_version: \"1.0\",\n });\n search.sort();\n const query = decodeURIComponent(search.toString());\n const signature = await hmacSha256Hex(secret, [\"GET\", fullPath, query].join(\"\\n\"));\n return `${fullPath}?${query}&auth_signature=${signature}`;\n}\n\nfunction baseUrl(options: PusherOptions) {\n const host = options.host || `api-${options.cluster || \"mt1\"}.pusher.com`;\n const port = options.port === undefined || options.port === \"\" ? undefined : String(options.port);\n const tls = options.tls ?? (!port || port === \"443\");\n const defaultPort = tls ? \"443\" : \"80\";\n return `${tls ? \"https\" : \"http\"}://${host}${port && port !== defaultPort ? `:${port}` : \"\"}`;\n}\n\nasync function mapLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>) {\n const results: R[] = new Array(items.length);\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const index = next++;\n results[index] = await fn(items[index] as T);\n }\n })\n );\n return results;\n}\n\nconst utcDay = (now: number) => new Date(now).toISOString().slice(0, 10);\n\n/**\n * Pusher Channels (and compatible servers). Lists occupied channels, then reads each one's\n * `subscription_count` to estimate concurrent connections. Pusher has no usage API, so this is\n * an estimate: clients subscribed to several channels make it run slightly high.\n * Requires \"subscription counting\" enabled in the app settings.\n * - up: the API answers\n * - degraded: today's peak at or above `warnAbovePct` of `track.connections.max`, or subscription counting is off\n * - down: the API rejects the credentials or errors\n *\n * Reports `metrics.channels` and `metrics.signedInUsers`; with `max`, two `usage` bars\n * (connections now, peak today), otherwise the counts as metrics. The daily peak (UTC) is kept\n * in the store's cache.\n */\nexport const pusher = definePreset<PusherOptions>()({\n kind: \"pusher\",\n requiredFields: [\"appId\"],\n requiredSecrets: [\"key\", \"secret\"],\n defaults: { slowMs: 1000 },\n derive: (options) => ({\n name: \"Pusher\",\n identity: `pusher:${options.appId ?? \"\"}`,\n description: \"Lists occupied channels and estimates connections from their subscription counts\",\n }),\n check: async ({ options, secrets, http, cache, now }): Promise<CheckOutcome> => {\n const get = async (path: string, params?: Record<string, string>) =>\n http(\n `${baseUrl(options)}${await signPusherRequest({\n appId: options.appId as string,\n key: secrets.key,\n secret: secrets.secret,\n path,\n params,\n timestamp: Math.floor(now / 1000),\n })}`\n );\n\n const list = await get(\"/channels\");\n if (!list.ok) return list.outcome;\n const names = Object.keys((list.json as { channels?: Record<string, unknown> })?.channels ?? {});\n const queried = names.slice(0, MAX_CHANNELS);\n\n let failed = 0;\n let countingDisabled = false;\n const counts = await mapLimit(queried, CONCURRENCY, async (name) => {\n // Names can contain \"#\" (`#server-to-user-…`), which would otherwise start a URL fragment\n const res = await get(`/channels/${encodeURIComponent(name)}`, { info: \"subscription_count\" });\n const count = (res.json as { subscription_count?: number })?.subscription_count;\n if (!res.ok) failed += 1;\n else if (typeof count !== \"number\") countingDisabled = true;\n return typeof count === \"number\" ? count : 0;\n });\n const connections = counts.reduce((sum, count) => sum + count, 0);\n // One per signed-in connection (pusher.signin()); those usually also subscribe to other\n // channels, so the total errs on the high side: safer for quota alerts\n const signedInUsers = queried.reduce(\n (sum, name, index) => (name.startsWith(\"#server-to-user-\") ? sum + (counts[index] ?? 0) : sum),\n 0\n );\n\n const peakKey = `peak:${utcDay(now)}`;\n const peak = Math.max(connections, Number(await cache.get(peakKey)) || 0);\n await cache.set(peakKey, String(peak), 8 * DAY_MS);\n\n const metrics: Metrics = { channels: names.length, signedInUsers };\n if (names.length > MAX_CHANNELS) metrics.channelsCounted = MAX_CHANNELS;\n\n const max = options.track?.connections?.max;\n const warnAbovePct = options.track?.connections?.warnAbovePct ?? 90;\n const usage: Usage[] = [];\n if (max) {\n usage.push(\n { label: \"Connections now (estimate)\", used: connections, limit: max, unit: \"connections\" },\n {\n label: \"Peak connections today (UTC)\",\n used: peak,\n limit: max,\n unit: \"connections\",\n resetsAt: Date.parse(`${utcDay(now)}T00:00:00Z`) + DAY_MS,\n }\n );\n } else {\n metrics.connections = connections;\n metrics.peakToday = peak;\n }\n\n const warnings: string[] = [];\n if (max && (peak / max) * 100 >= warnAbovePct) warnings.push(\"Connections close to the plan limit\");\n if (countingDisabled) warnings.push(\"Subscription counting is disabled in the Pusher app settings\");\n const notes = failed > 0 ? [`${failed} channel(s) could not be counted`] : [];\n\n return {\n status: warnings.length ? \"degraded\" : \"up\",\n latencyMs: list.latencyMs,\n httpStatus: list.status,\n error: [...warnings, ...notes].join(\"; \") || undefined,\n metrics,\n usage: usage.length ? usage : undefined,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, round } from \"./shared\";\n\nexport type VercelAiGatewayOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when the credit balance drops below this amount in USD (default 5). `false` skips the balance. */\n credits?: { warnBelow?: number } | false;\n };\n};\n\n/**\n * Vercel AI Gateway. Reads the credit balance, which validates the key.\n * - up: the key works\n * - degraded: balance below `track.credits.warnBelow`\n * - down: the gateway rejects the key or errors\n *\n * Reports `metrics.balance` and `metrics.used`. With `track.credits: false` it lists models\n * instead, which only proves the gateway is reachable: that route needs no key.\n */\nconst aiGateway = definePreset<VercelAiGatewayOptions>()({\n kind: \"vercel.aiGateway\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Vercel AI Gateway\",\n identity: \"vercel.aiGateway\",\n description: options.track?.credits === false ? \"Lists models\" : \"Reads the credit balance\",\n }),\n check: ({ options, secrets, http }) => {\n const headers = bearer(secrets.apiKey);\n if (options.track?.credits === false) return call(http, \"https://ai-gateway.vercel.sh/v1/models\", { headers });\n const warnBelow = options.track?.credits?.warnBelow ?? 5;\n return call(http, \"https://ai-gateway.vercel.sh/v1/credits\", { headers }, (res): CheckOutcome | undefined => {\n const body = (res.json as { balance?: string | number; total_used?: string | number }) ?? {};\n // The gateway gives amounts as strings\n const balance = Number(body.balance);\n if (body.balance === undefined || !Number.isFinite(balance)) return undefined;\n const used = Number(body.total_used);\n const low = balance < warnBelow;\n return {\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low credit balance\" : undefined,\n metrics: {\n balance: `${round(balance, 2)} USD`,\n ...(body.total_used !== undefined && Number.isFinite(used) ? { used: `${round(used, 2)} USD` } : {}),\n },\n };\n });\n },\n});\n\nexport type VercelBlobOptions = PresetOptions & {\n secrets: { token: string | undefined };\n};\n\n/** Vercel Blob. Lists one blob of the store, which validates the read-write token. */\nconst blob = definePreset<VercelBlobOptions>()({\n kind: \"vercel.blob\",\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Vercel Blob\", identity: \"vercel.blob\", description: \"Lists one blob of the store\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://vercel.com/api/blob?limit=1\", {\n headers: { ...bearer(secrets.token), \"x-api-version\": \"12\" },\n }),\n});\n\n/** Presets for Vercel products */\nexport const vercel = { aiGateway, blob };\n"]}
|