Next.js-இல் Nylas Webhooks-களைக் கையாளுதல்

உங்கள் AI ஏஜென்ட்டிற்கு ஒரு மின்னஞ்சல் வருகிறது. அதற்குப் பதிலளிக்க உங்களிடம் 10 வினாடிகள் மட்டுமே உள்ளன.

நீங்கள் Nylas Agent Accounts-ஐப் பயன்படுத்தினால், message.created என்ற webhook உடனடியாக உங்கள் சர்வருக்கு வரும். Next.js-இல், இதை ஒரே ஒரு route கோப்பு மூலம் கையாளலாம்.

இதைச் சரியாக உருவாக்குவது எப்படி என்பதை இங்கே காணலாம்.

சவால் கைக்குலுக்கல் (The Challenge Handshake)

நீங்கள் ஒரு webhook-ஐ உருவாக்கும்போது, Nylas ஒரு challenge அளவுருவுடன் (parameter) GET கோரிக்கையை (request) அனுப்பும். நீங்கள் அந்தப் பதிலின் (response body) உள்ளே அதே மதிப்பினைத் துல்லியமாகத் திருப்பி அனுப்ப வேண்டும்.

JSON-ஐப் பயன்படுத்த வேண்டாம். மேற்கோள்களை (quotes) சேர்க்க வேண்டாம். வெறும் பதிலை (bare response) மட்டும் வழங்கவும். இதில் தோல்வியடைந்தால், webhook வேலை செய்யாது.

Example GET handler:

export async function GET(req: NextRequest) {
  const challenge = req.nextUrl.searchParams.get("challenge");
  return new Response(challenge ?? "", { status: 200 });
}

POST அறிவிப்பு (The POST Notification)

ஒரு செய்தி வரும்போது, Nylas ஒரு POST கோரிக்கையை அனுப்பும். பிழைகளைத் தவிர்க்க இந்த மூன்று விதிகளைப் பின்பற்றவும்:

Example POST handler:

export async function POST(req: NextRequest) {
  const raw = await req.text();
  const signature = req.headers.get("x-nylas-signature") ?? "";

  const expected = crypto
    .createHmac("sha256", process.env.NYLAS_WEBHOOK_SECRET!)
    .update(raw, "utf8")
    .digest("hex");

  const valid =
    signature.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));

  if (!valid) {
    return new Response("invalid signature", { status: 401 });
  }

  const payload = JSON.parse(raw);
  const { object } = payload.data;

  processMessage(object.grant_id, object.id).catch(console.error);

  return NextResponse.json({ ok: true }, { status: 200 });
}

தயாரிப்பு குறிப்புகள் (Production Tips)

• செய்திகளின் நகல்களைத் தவிர்க்கவும். Webhooks குறைந்தபட்சம் ஒரு முறையாவது செய்திகளை வழங்கும். ஒரே செய்தியைத் திரும்பத் திரும்பச் செயலாக்காமல் இருப்பதை உறுதி செய்ய ஒரு database constraint அல்லது Redis-ஐப் பயன்படுத்தவும். • குறைக்கப்பட்ட (truncated) payloads-களைக் கையாளவும். ஒரு செய்தி 1 MB-க்கும் அதிகமாக இருந்தால், அதன் body நீக்கப்படும். முழுமையான உள்ளடக்கத்தைப் பெற எப்போதும் API மூலம் செய்தியை மீண்டும் பெறவும். • சுத்திகரிக்கப்பட்ட உள்ளடக்கத்தைப் பயன்படுத்தவும். குழப்பமான HTML-க்கு பதிலாக markdown-ஐப் பெற message.created.cleaned-ஐப் பயன்படுத்தவும். இது உங்கள் LLM-க்கு சிறப்பாகச் செயல்படும்.

உங்கள் webhook handlers-களில் நகல்களைத் தவிர்க்க (deduplication) நீங்கள் எவ்வாறு கையாளுகிறீர்கள்? நீங்கள் Redis அல்லது database constraint-ஐப் பயன்படுத்துகிறீர்களா?

ஆதாரம்: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80