Next.js-ൽ Nylas Webhooks കൈകാര്യം ചെയ്യാം
നിങ്ങളുടെ AI ഏജന്റിന് ഒരു ഇമെയിൽ ലഭിക്കുന്നു. മറുപടി നൽകാൻ നിങ്ങൾക്ക് 10 സെക്കൻഡ് മാത്രമേ സമയമുള്ളൂ.
നിങ്ങൾ Nylas Agent Accounts ഉപയോഗിക്കുന്നുണ്ടെങ്കിൽ, ഒരു message.created webhook ഉടൻ തന്നെ നിങ്ങളുടെ സെർവറിലേക്ക് എത്തും. Next.js-ൽ, ഒരു റൂട്ട് ഫയൽ ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഇത് കൈകാര്യം ചെയ്യാം.
ഇത് ശരിയായ രീതിയിൽ എങ്ങനെ നിർമ്മിക്കാം എന്ന് താഴെ നൽകുന്നു.
ചലഞ്ച് ഹാൻഡ്ഷേക്ക് (The Challenge Handshake)
നിങ്ങൾ ഒരു webhook നിർമ്മിക്കുമ്പോൾ, Nylas ഒരു challenge പാരാമീറ്റർ അടങ്ങിയ GET റിക്വസ്റ്റ് അയക്കുന്നു. റെസ്പോൺസ് ബോഡിയിൽ (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 സ്റ്റാറ്റസ് തിരികെ നൽകുക. നിങ്ങളുടെ LLM കൂടുതൽ സമയം എടുക്കുകയാണെങ്കിൽ, webhook ടൈം ഔട്ട് (time out) ആകാൻ സാധ്യതയുണ്ട്.
- സിഗ്നേച്ചറുകൾ പരിശോധിക്കുക (Verify signatures).
X-Nylas-Signatureഹെഡറും നിങ്ങളുടെ webhook സീക്രറ്റും ഉപയോഗിക്കുക. ഇത് അനധികൃത ഉപയോക്താക്കൾ നിങ്ങളുടെ ഏജന്റിനെ പ്രവർത്തിപ്പിക്കുന്നത് തടയുന്നു. - റോ ബോഡി (raw body) ഉപയോഗിക്കുക. HMAC സിഗ്നേച്ചർ പരിശോധിക്കാൻ നിങ്ങൾക്ക് റോ ടെക്സ്റ്റ് (raw text) ആവശ്യമാണ്. ആദ്യം ടെക്സ്റ്റ് വായിക്കുക, അത് പരിശോധിക്കുക, അതിനുശേഷം മാത്രം 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)
• സന്ദേശങ്ങളിലെ ഡ്യൂപ്ലിക്കേഷനുകൾ ഒഴിവാക്കുക. വെബ്ഹുക്കുകൾ (Webhooks) കുറഞ്ഞത് ഒരു തവണയെങ്കിലും ഡെലിവർ ചെയ്യും. ഒരേ സന്ദേശം തന്നെ രണ്ടുതവണ പ്രോസസ്സ് ചെയ്യുന്നില്ലെന്ന് ഉറപ്പാക്കാൻ ഒരു ഡാറ്റാബേസ് കൺസ്ട്രയിന്റോ (database constraint) അല്ലെങ്കിൽ Redis ഉപയോഗിക്കുക.
• മുറിച്ചുമാറ്റപ്പെട്ട (truncated) പേലോഡുകൾ കൈകാര്യം ചെയ്യുക. ഒരു സന്ദേശം 1 MB-യിൽ കൂടുതലാണെങ്കിൽ, അതിന്റെ ബോഡി ഒഴിവാക്കപ്പെടും. പൂർണ്ണമായ ഉള്ളടക്കം ലഭിക്കുന്നതിനായി എപ്പോഴും API വഴി സന്ദേശം വീണ്ടും ഫെച്ച് (re-fetch) ചെയ്യുക.
• ക്ലീൻ ചെയ്ത ഉള്ളടക്കം ഉപയോഗിക്കുക. കുഴഞ്ഞുമറിഞ്ഞ HTML-ന് പകരം മാർക്ക്ഡൗൺ (markdown) ലഭിക്കുന്നതിനായി message.created.cleaned ഉപയോഗിക്കുക. ഇത് നിങ്ങളുടെ LLM-ന് കൂടുതൽ അനുയോജ്യമാണ്.
നിങ്ങളുടെ വെബ്ഹുക്ക് ഹാൻഡ്ലറുകളിൽ (webhook handlers) ഡ്യൂപ്ലിക്കേഷൻ ഒഴിവാക്കുന്നത് എങ്ങനെയാണ്? നിങ്ങൾ Redis ആണോ അതോ ഒരു ഡാറ്റാബേസ് കൺസ്ട്രയിന്റ് ആണോ ഉപയോഗിക്കുന്നത്?
ഉറവിടം: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80