Openstatus
www.openstatus.dev
1import { OpenStatusApiError } from "@/libs/errors";
2import type { z } from "@hono/zod-openapi";
3import type { selectMonitorSchema } from "@openstatus/db/src/schema";
4import {
5 type httpPayloadSchema,
6 type tpcPayloadSchema,
7 transformHeaders,
8} from "@openstatus/utils";
9
10export function getCheckerPayload(
11 monitor: z.infer<typeof selectMonitorSchema>,
12 status: z.infer<typeof selectMonitorSchema>["status"],
13): z.infer<typeof httpPayloadSchema> | z.infer<typeof tpcPayloadSchema> {
14 const timestamp = new Date().getTime();
15 switch (monitor.jobType) {
16 case "http":
17 return {
18 workspaceId: String(monitor.workspaceId),
19 monitorId: String(monitor.id),
20 url: monitor.url,
21 method: monitor.method || "GET",
22 cronTimestamp: timestamp,
23 body: monitor.body,
24 headers: monitor.headers,
25 status: status,
26 assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null,
27 degradedAfter: monitor.degradedAfter,
28 timeout: monitor.timeout,
29 trigger: "api",
30 otelConfig: monitor.otelEndpoint
31 ? {
32 endpoint: monitor.otelEndpoint,
33 headers: transformHeaders(monitor.otelHeaders),
34 }
35 : undefined,
36 retry: monitor.retry ?? 0,
37 followRedirects: monitor.followRedirects ?? false,
38 };
39 case "tcp":
40 return {
41 workspaceId: String(monitor.workspaceId),
42 monitorId: String(monitor.id),
43 uri: monitor.url,
44 status: status,
45 assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null,
46 cronTimestamp: timestamp,
47 degradedAfter: monitor.degradedAfter,
48 timeout: monitor.timeout,
49 trigger: "api",
50 otelConfig: monitor.otelEndpoint
51 ? {
52 endpoint: monitor.otelEndpoint,
53 headers: transformHeaders(monitor.otelHeaders),
54 }
55 : undefined,
56 retry: monitor.retry ?? 0,
57 followRedirects: monitor.followRedirects ?? false,
58 };
59 default:
60 throw new OpenStatusApiError({
61 code: "BAD_REQUEST",
62 message:
63 "Invalid jobType, currently only 'http' and 'tcp' are supported",
64 });
65 }
66}
67
68export function getCheckerUrl(
69 monitor: z.infer<typeof selectMonitorSchema>,
70 opts: { trigger?: "api" | "cron"; data?: boolean } = {
71 trigger: "api",
72 data: false,
73 },
74): string {
75 switch (monitor.jobType) {
76 case "http":
77 return `https://openstatus-checker.fly.dev/checker/http?monitor_id=${monitor.id}&trigger=${opts.trigger}&data=${opts.data}`;
78 case "tcp":
79 return `https://openstatus-checker.fly.dev/checker/tcp?monitor_id=${monitor.id}&trigger=${opts.trigger}&data=${opts.data}`;
80 default:
81 throw new OpenStatusApiError({
82 code: "BAD_REQUEST",
83 message:
84 "Invalid jobType, currently only 'http' and 'tcp' are supported",
85 });
86 }
87}