feat(relays): healthcheck

This commit is contained in:
x032205
2025-10-07 21:17:25 -04:00
parent c1833b5cbd
commit 12b59fc2c0
9 changed files with 191 additions and 6 deletions
+71
View File
@@ -146,4 +146,75 @@ export const registerRelayRouter = async (server: FastifyZodProvider) => {
});
}
});
server.route({
method: "POST",
url: "/heartbeat-instance-relay",
config: {
rateLimit: writeLimit
},
schema: {
body: z.object({
name: slugSchema({ min: 1, max: 32, field: "name" })
}),
response: {
200: z.object({
message: z.string()
})
}
},
onRequest: (req, _, next) => {
const authHeader = req.headers.authorization;
if (appCfg.RELAY_AUTH_SECRET && authHeader) {
const expectedHeader = `Bearer ${appCfg.RELAY_AUTH_SECRET}`;
if (
authHeader.length === expectedHeader.length &&
crypto.nativeCrypto.timingSafeEqual(Buffer.from(authHeader), Buffer.from(expectedHeader))
) {
return next();
}
}
throw new UnauthorizedError({
message: "Invalid relay auth secret"
});
},
handler: async (req) => {
await server.services.relay.heartbeat({
name: req.body.name
});
return { message: "Successfully triggered heartbeat" };
}
});
server.route({
method: "POST",
url: "/heartbeat-org-relay",
config: {
rateLimit: writeLimit
},
schema: {
body: z.object({
name: slugSchema({ min: 1, max: 32, field: "name" })
}),
response: {
200: z.object({
message: z.string()
})
}
},
onRequest: verifyAuth([AuthMode.IDENTITY_ACCESS_TOKEN]),
handler: async (req) => {
await server.services.relay.heartbeat({
name: req.body.name,
identityId: req.permission.id,
orgId: req.permission.orgId,
actorAuthMethod: req.permission.authMethod
});
return { message: "Successfully triggered heartbeat" };
}
});
};