1
import { TriggerClient } from "@trigger.dev/sdk";
2
import { createHmac } from "crypto";
3
import { XMLParser } from "fast-xml-parser";
16
export const youtube = client.defineHttpEndpoint({
19
source: "youtube.com",
23
skipTriggeringRuns: true,
26
"hub.mode": [{ $endsWith: "subscribe" }],
29
handler: async (request, verify) => {
30
const searchParams = new URL(request.url).searchParams;
33
searchParams.get("hub.verify_token") !==
34
process.env.YOUTUBE_SIGNING_SECRET
36
return new Response("Unauthorized", { status: 401 });
38
return new Response(searchParams.get("hub.challenge") ?? "OK", {
43
verify: async (request) => {
44
const signature = request.headers.get("x-hub-signature");
47
return { success: false, reason: "Missing header" };
50
const secret = process.env.YOUTUBE_SIGNING_SECRET;
53
return { success: false, reason: "Missing secret" };
56
const [algorithm, hash] = signature.split("=");
57
const body = await request.text();
58
const digest = createHmac(algorithm, secret).update(body).digest("hex");
60
if (hash !== digest) {
61
return { success: false, reason: "Failed sha1 verification" };
64
return { success: true };
74
trigger: youtube.onRequest(),
75
run: async (request, io, ctx) => {
76
const body = await request.text();
77
const parser = new XMLParser();
78
const jObj = parser.parse(body);
79
await io.logger.info(`Body`, jObj);