Next.js ਵਿੱਚ Nylas Webhooks ਨੂੰ ਹੈਂਡਲ ਕਰੋ

ਤੁਹਾਡੇ AI agent ਕੋਲ ਇੱਕ ਈਮੇਲ ਆਉਂਦੀ ਹੈ। ਤੁਹਾਡੇ ਕੋਲ ਜਵਾਬ ਦੇਣ ਲਈ 10 ਸਕਿੰਟ ਹਨ।

ਜੇਕਰ ਤੁਸੀਂ Nylas Agent Accounts ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਇੱਕ message.created webhook ਤੁਰੰਤ ਤੁਹਾਡੇ ਸਰਵਰ 'ਤੇ ਆਉਂਦਾ ਹੈ। Next.js ਵਿੱਚ, ਤੁਸੀਂ ਇਸਨੂੰ ਇੱਕ ਰੂਟ ਫਾਈਲ (route file) ਨਾਲ ਹੈਂਡਲ ਕਰ ਸਕਦੇ ਹੋ।

ਇਸਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਬਣਾਉਣ ਦਾ ਤਰੀਕਾ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ।

ਚੈਲੇਂਜ ਹੈਂਡਸ਼ੇਕ (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 ਨੋਟੀਫਿਕੇਸ਼ਨ

ਜਦੋਂ ਕੋਈ ਮੈਸੇਜ ਆਉਂਦਾ ਹੈ, ਤਾਂ 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 ਘੱਟੋ-ਘੱਟ ਇੱਕ ਵਾਰ ਡਿਲੀਵਰ ਕਰਦੇ ਹਨ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਕਿ ਤੁਸੀਂ ਇੱਕੋ ਮੈਸੇਜ ਨੂੰ ਦੋ ਵਾਰ ਪ੍ਰੋਸੈਸ ਨਾ ਕਰੋ, ਡਾਟਾਬੇਸ ਕੰਸਟ੍ਰੇਂਟ ਜਾਂ Redis ਦੀ ਵਰਤੋਂ ਕਰੋ। • ਟ੍ਰੰਕੇਟ ਕੀਤੇ (truncated) payloads ਨੂੰ ਸੰਭਾਲੋ। ਜੇਕਰ ਕੋਈ ਮੈਸੇਜ 1 MB ਤੋਂ ਵੱਧ ਹੈ, ਤਾਂ ਉਸਦੀ body ਹਟਾ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। ਪੂਰਾ ਕੰਟੈਂਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਹਮੇਸ਼ਾ API ਰਾਹੀਂ ਮੈਸੇਜ ਨੂੰ ਦੁਬਾਰਾ fetch ਕਰੋ। • ਸਾਫ਼ (cleaned) ਕੰਟੈਂਟ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਗੰਦਮੇ HTML ਦੀ ਬਜਾਏ markdown ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ message.created.cleaned ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਡੇ LLM ਲਈ ਬਿਹਤਰ ਕੰਮ ਕਰਦਾ ਹੈ।

ਤੁਸੀਂ ਆਪਣੇ webhook handlers ਵਿੱਚ deduplication ਨੂੰ ਕਿਵੇਂ ਸੰਭਾਲਦੇ ਹੋ? ਕੀ ਤੁਸੀਂ Redis ਜਾਂ ਡਾਟਾਬੇਸ ਕੰਸਟ੍ਰੇਂਟ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ?

ਸਰੋਤ: https://dev.to/qasim157/handle-messagecreated-webhooks-in-nextjs-4e80