Next.js-এ Nylas Webhooks হ্যান্ডেল করুন
আপনার AI এজেন্টে একটি ইমেল এসেছে। উত্তর দেওয়ার জন্য আপনার কাছে মাত্র ১০ সেকেন্ড সময় আছে।
আপনি যদি Nylas Agent Accounts ব্যবহার করেন, তবে একটি message.created webhook সাথে সাথে আপনার সার্ভারে হিট করবে। Next.js-এ, আপনি একটি রুট ফাইল দিয়েই এটি হ্যান্ডেল করতে পারেন।
এটি সঠিকভাবে তৈরি করার নিয়ম নিচে দেওয়া হলো।
চ্যালেঞ্জ হ্যান্ডশেক (The Challenge Handshake)
যখন আপনি একটি webhook তৈরি করেন, Nylas একটি challenge প্যারামিটারসহ একটি GET রিকোয়েস্ট পাঠায়। আপনাকে রেসপন্স বডিতে ঠিক সেই মানটিই (exact value) রিটার্ন করতে হবে।
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 রিকোয়েস্ট পাঠায়। ত্রুটি এড়াতে এই তিনটি নিয়ম অনুসরণ করুন:
- অবিলম্বে স্বীকৃতি দিন (Acknowledge immediately)। আপনার ভারী লজিক (heavy logic) চালানোর আগেই একটি 200 স্ট্যাটাস রিটার্ন করুন। আপনার LLM যদি অনেক বেশি সময় নেয়, তবে webhook টাইম-আউট হয়ে যাবে।
- সিগনেচার যাচাই করুন।
X-Nylas-Signatureহেডার এবং আপনার webhook secret ব্যবহার করুন। এটি অননুমোদিত ব্যবহারকারীদের আপনার এজেন্ট ট্রিগার করা থেকে বিরত রাখে। - র (raw) বডি ব্যবহার করুন। HMAC সিগনেচার যাচাই করার জন্য আপনার র (raw) টেক্সট প্রয়োজন। প্রথমে টেক্সটটি পড়ুন, সেটি যাচাই করুন, তারপর JSON পার্স করুন।
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)
• মেসেজ ডিডুপ্লিকেট করুন। Webhook অন্তত একবার (at-least-once) মেসেজ প্রদান করে। একই মেসেজ যেন দুবার প্রসেস না হয় তা নিশ্চিত করতে একটি database constraint বা Redis ব্যবহার করুন।
• ট্রাঙ্কেটেড (truncated) পেলোড হ্যান্ডেল করুন। যদি কোনো মেসেজ ১ MB-এর বেশি হয়, তবে এর বডি (body) বাদ দেওয়া হয়। সম্পূর্ণ কন্টেন্ট পেতে সবসময় API-এর মাধ্যমে মেসেজটি পুনরায় ফেচ (re-fetch) করুন।
• ক্লিনড (cleaned) কন্টেন্ট ব্যবহার করুন। অগোছালো HTML-এর পরিবর্তে markdown পেতে message.created.cleaned ব্যবহার করুন। এটি আপনার LLM-এর জন্য আরও ভালো কাজ করে।
আপনি আপনার webhook হ্যান্ডলারগুলোতে কীভাবে ডিডুপ্লিকেশন হ্যান্ডেল করেন? আপনি কি Redis নাকি database constraint ব্যবহার করেন?
উৎস: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80