1
import { TriggerClient } from "@trigger.dev/sdk";
2
import { createHmac } from "crypto";
3
import { XMLParser } from "fast-xml-parser";
15
export const youtube = client.defineHttpEndpoint({
18
source: "youtube.com",
22
skipTriggeringRuns: true,
25
"hub.mode": [{ $endsWith: "subscribe" }],
28
handler: async (request, verify) => {
29
const searchParams = new URL(request.url).searchParams;
32
searchParams.get("hub.verify_token") !==
33
process.env.YOUTUBE_SIGNING_SECRET
35
return new Response("Unauthorized", { status: 401 });
37
return new Response(searchParams.get("hub.challenge") ?? "OK", {
42
verify: async (request) => {
43
const signature = request.headers.get("x-hub-signature");
46
return { success: false, reason: "Missing header" };
49
const secret = process.env.YOUTUBE_SIGNING_SECRET;
52
return { success: false, reason: "Missing secret" };
55
const [algorithm, hash] = signature.split("=");
56
const body = await request.text();
57
const digest = createHmac(algorithm, secret).update(body).digest("hex");
59
if (hash !== digest) {
60
return { success: false, reason: "Failed sha1 verification" };
63
return { success: true };
73
trigger: youtube.onRequest(),
74
run: async (request, io, ctx) => {
75
const body = await request.text();
76
const parser = new XMLParser();
77
const jObj = parser.parse(body);
78
await io.logger.info(`Body`, jObj);