Next.js में Nylas Webhooks को हैंडल करें
आपके AI agent को एक ईमेल प्राप्त होता है। आपके पास जवाब देने के लिए केवल 10 सेकंड हैं।
यदि आप Nylas Agent Accounts का उपयोग करते हैं, तो message.created webhook तुरंत आपके सर्वर पर आता है। Next.js में, आप इसे एक route file के साथ हैंडल कर सकते हैं।
इसे सही तरीके से बनाने का तरीका यहाँ दिया गया है।
चैलेंज हैंडशेक (The Challenge Handshake)
जब आप एक webhook बनाते हैं, तो Nylas एक challenge पैरामीटर के साथ 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 नोटिफिकेशन
जब कोई मैसेज आता है, तो Nylas एक POST request भेजता है। एरर्स से बचने के लिए इन तीन नियमों का पालन करें:
- तुरंत acknowledge करें। अपना भारी लॉजिक चलाने से पहले 200 status वापस करें। यदि आपका LLM बहुत अधिक समय लेता है, तो webhook का समय समाप्त (time out) हो जाएगा।
- सिग्नेचर को सत्यापित (Verify) करें।
X-Nylas-Signatureheader और अपने webhook secret का उपयोग करें। यह अनधिकृत उपयोगकर्ताओं को आपके agent को ट्रिगर करने से रोकता है। - raw body का उपयोग करें। HMAC signature को सत्यापित करने के लिए, आपको raw text की आवश्यकता होती है। पहले टेक्स्ट पढ़ें, उसे सत्यापित करें, और फिर JSON को parse करें।
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 });
}
प्रोडक्शन टिप्स
• संदेशों को डी-डुप्लिकेट करें। Webhooks कम से कम एक बार (at-least-once) संदेश भेजते हैं। यह सुनिश्चित करने के लिए कि आप एक ही संदेश को दो बार प्रोसेस न करें, डेटाबेस कंस्ट्रेंट (database constraint) या Redis का उपयोग करें।
• कटे हुए (truncated) पेलोड को संभालें। यदि कोई संदेश 1 MB से अधिक है, तो उसका बॉडी (body) हटा दिया जाता है। पूरा कंटेंट प्राप्त करने के लिए हमेशा API के माध्यम से संदेश को फिर से फेच (re-fetch) करें।
• क्लीन (cleaned) कंटेंट का उपयोग करें। अव्यवस्थित HTML के बजाय markdown प्राप्त करने के लिए message.created.cleaned का उपयोग करें। यह आपके LLM के लिए बेहतर काम करता है।
आप अपने webhook handlers में डुप्लीकेशन को कैसे संभालते हैं? क्या आप Redis या डेटाबेस कंस्ट्रेंट का उपयोग करते हैं?
स्रोत: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80