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 கோரிக்கையை அனுப்பும். பிழைகளைத் தவிர்க்க இந்த மூன்று விதிகளைப் பின்பற்றவும்:
- உடனடியாக உறுதிப்படுத்தவும் (Acknowledge). உங்கள் கடினமான லாஜிக்கை (heavy logic) இயக்குவதற்கு முன்பே 200 status-ஐத் திருப்பி அனுப்பவும். உங்கள் LLM அதிக நேரம் எடுத்தால், webhook timeout ஆகிவிடும்.
- கையொப்பங்களைச் சரிபார்க்கவும் (Verify signatures).
X-Nylas-Signatureheader மற்றும் உங்கள் webhook secret-ஐப் பயன்படுத்தவும். இது அங்கீகரிக்கப்படாத பயனர்கள் உங்கள் ஏஜென்ட்டைத் தூண்டுவதைத் தடுக்கும். - raw body-யைப் பயன்படுத்தவும். HMAC கையொப்பத்தைச் சரிபார்க்க, உங்களுக்கு 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 });
}
தயாரிப்பு குறிப்புகள் (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