Next.jsలో Nylas Webhooksని హ్యాండిల్ చేయడం

మీ AI ఏజెంట్‌కు ఒక ఈమెయిల్ వస్తుంది. మీరు స్పందించడానికి మీ దగ్గర 10 సెకన్లు మాత్రమే ఉన్నాయి.

మీరు Nylas Agent Accounts ఉపయోగిస్తుంటే, message.created webhook వెంటనే మీ సర్వర్‌కు చేరుతుంది. Next.jsలో, మీరు దీనిని ఒకే రూట్ ఫైల్‌తో హ్యాండిల్ చేయవచ్చు.

దీనిని సరిగ్గా ఎలా నిర్మించాలో ఇక్కడ చూడండి.

ఛాలెంజ్ హ్యాండ్‌షేక్ (The Challenge Handshake)

మీరు ఒక webhookని క్రియేట్ చేసినప్పుడు, Nylas ఒక challenge పారామీటర్‌తో GET రిక్వెస్ట్‌ను పంపుతుంది. మీరు రెస్పాన్స్ బాడీలో ఖచ్చితమైన విలువను తిరిగి పంపాలి.

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 కనీసం ఒక్కసారైనా (at-least-once) సందేశాలను పంపిస్తాయి. ఒకే సందేశాన్ని రెండుసార్లు ప్రాసెస్ చేయకుండా ఉండటానికి డేటాబేస్ కన్స్ట్రైంట్ లేదా Redisని ఉపయోగించండి. • తక్కువగా ఉన్న (truncated) పేలోడ్‌లను హ్యాండిల్ చేయండి. ఒక సందేశం 1 MB కంటే ఎక్కువగా ఉంటే, దాని బాడీ తొలగించబడుతుంది. పూర్తి కంటెంట్‌ను పొందడానికి ఎల్లప్పుడూ API ద్వారా సందేశాన్ని మళ్ళీ పొందండి (re-fetch). • క్లీన్ చేసిన కంటెంట్‌ను ఉపయోగించండి. గందరగోళంగా ఉండే HTML కి బదులుగా మార్క్‌డౌన్ పొందడానికి message.created.cleanedని ఉపయోగించండి. ఇది మీ LLM కోసం మెరుగ్గా పనిచేస్తుంది.

మీ webhook హ్యాండ్లర్లలో డూప్లికేషన్‌ను మీరు ఎలా హ్యాండిల్ చేస్తారు? మీరు Redisని ఉపయోగిస్తారా లేదా డేటాబేస్ కన్స్ట్రైంట్‌ను ఉపయోగిస్తారా?

మూలం: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80