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 };
37 case "tcp":
38 return {
39 workspaceId: String(monitor.workspaceId),
40 monitorId: String(monitor.id),
41 uri: monitor.url,
42 status: status,
43 assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null,
44 cronTimestamp: timestamp,
45 degradedAfter: monitor.degradedAfter,
46 timeout: monitor.timeout,
47 trigger: "api",
48 otelConfig: monitor.otelEndpoint
49 ? {
50 endpoint: monitor.otelEndpoint,
51 headers: transformHeaders(monitor.otelHeaders),
52 }
53 : undefined,
54 };
55 default:
56 throw new OpenStatusApiError({
57 code: "BAD_REQUEST",
58 message:
59 "Invalid jobType, currently only 'http' and 'tcp' are supported",
60 });
61 }
62}
63
64export function getCheckerUrl(
65 monitor: z.infer<typeof selectMonitorSchema>,
66 opts: { trigger?: "api" | "cron"; data?: boolean } = {
67 trigger: "api",
68 data: false,
69 },
70): string {
71 switch (monitor.jobType) {
72 case "http":
73 return `https://openstatus-checker.fly.dev/checker/http?monitor_id=${monitor.id}&trigger=${opts.trigger}&data=${opts.data}`;
74 case "tcp":
75 return `https://openstatus-checker.fly.dev/checker/tcp?monitor_id=${monitor.id}&trigger=${opts.trigger}&data=${opts.data}`;
76 default:
77 throw new OpenStatusApiError({
78 code: "BAD_REQUEST",
79 message:
80 "Invalid jobType, currently only 'http' and 'tcp' are supported",
81 });
82 }
83}