> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# مكتبة Node.js وTypeScript للتحقق من الهوية وAML

> دليل البدء السريع لحزمة Didit الرسمية لـ Node.js وTypeScript: استدعاءات مكتوبة لواجهات الخادم، والتحقق من webhook، وفحص رموز المصادقة.

المكتبة الرسمية لـ Didit الخاصة بـ Node.js وTypeScript. تعمل على Node.js 18 أو أحدث وعلى Bun وDeno وبيئات Edge التي تدعم `fetch`، وتتوفر بإصدارين: ES module وCommonJS، ولا تعتمد على أي حزم إضافية في وقت التشغيل. اطلع على [نظرة عامة على حزم SDK للخادم](https://docs.didit.me/ar/integration/server-sdks/overview.md) لمعرفة ما تشترك فيه جميع الحزم.

## التثبيت

```bash theme={null}
npm install @didit-protocol/sdk-node
```

الحزمة هي [`@didit-protocol/sdk-node` على npm](https://www.npmjs.com/package/@didit-protocol/sdk-node). يوجد مصدرها وسجل تغييراتها في [didit-protocol/sdk-node](https://github.com/didit-protocol/sdk-node) على GitHub.

## إعداد العميل

يقرأ `new Didit()` القيمة `DIDIT_API_KEY` من متغيرات البيئة على Node.js وBun وDeno (مع `--allow-env`). لا تملك بيئات Edge متغيرات بيئة للعملية، لذا مرّر المفتاح كخيار في هذه البيئات: `new Didit({ apiKey: env.DIDIT_API_KEY })`. مرّر الخيارات لتجاوز مفتاح API المحدد في البيئة، أو لتعيين معرّفات المؤسسة والتطبيق التي تحتاجها الاستدعاءات المرتبطة بالتطبيق (الحالات والشبكات والتقارير التنظيمية). تُقاس مهلة الانتظار بالمللي ثانية.

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit({
  apiKey: process.env.DIDIT_API_KEY,
  organizationId: process.env.DIDIT_ORGANIZATION_ID,
  applicationId: process.env.DIDIT_APPLICATION_ID,
  timeout: 30_000,
  maxRetries: 2,
});

// Options for a single call.
const fast = didit.withOptions({ timeout: 5_000, maxRetries: 0 });
console.log(await fast.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555"));
```

مع CommonJS، استخدم `const { Didit } = require("@didit-protocol/sdk-node");`.

## إنشاء جلسة

أنشئ [جلسة تحقق](https://docs.didit.me/ar/sessions-api/create-session.md) لسير عمل، ثم أرسل المستخدم إلى عنوان URL الخاص بها. تحتفظ حقول الطلب بأسمائها كما في واجهة API.

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const session = await didit.sessions.create({
  workflow_id: "11111111-2222-3333-4444-555555555555",
  vendor_data: "user-123",
  callback: "https://example.com/verification/done",
});
console.log(session.url);
```

## قراءة القرار

عندما ينتهي المستخدم (أو عند وصول webhook)، [اقرأ القرار](https://docs.didit.me/ar/sessions-api/retrieve-session.md). كل نتيجة ميزة هي قائمة تحتوي على عنصر واحد لكل عقدة في سير العمل، والتواريخ والأوقات كائنات `Date`.

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const decision = await didit.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555");
console.log(decision.status);
for (const verification of decision.id_verifications ?? []) {
  console.log(verification.first_name, verification.last_name);
}
```

## التحقق من webhook

مرّر النص الخام للطلب (وليس JSON محلّلاً) وترويسات الطلب: كائن `req.headers` في Node.js أو Express، أو كائن `Headers` في Fetch، أو أزواج `[name, value]` (النوع `WebhookHeaders`). تعيد الدالة `verify` وعداً، وترفض بـ `WebhookVerificationError` أي تسليم غير صالح أو قديم.

```typescript theme={null}
import { webhooks, WebhookVerificationError, type WebhookHeaders } from "@didit-protocol/sdk-node";

const secret = process.env.DIDIT_WEBHOOK_SECRET ?? "";

export async function handleWebhook(rawBody: Buffer, headers: WebhookHeaders): Promise<number> {
  try {
    const event = await webhooks.verify(rawBody, headers, secret);
    if (event.webhook_type === "status.updated") {
      console.log(event.session_id, event.status);
    }
    return 200;
  } catch (error) {
    if (error instanceof WebhookVerificationError) return 400;
    throw error;
  }
}
```

مع Express، اقرأ النص باستخدام `express.raw({ type: "application/json" })` واستدعِ `handleWebhook(req.body, req.headers)`. أثناء تدوير السر المشترك، مرّر السرين معاً: `[newSecret, oldSecret]`. انظر [Webhooks](https://docs.didit.me/ar/integration/webhooks.md) للاطلاع على الأحداث وآلية التوقيع.

## فحص معاملة

أرسل دفعة أو سحباً أو تحويلاً بالعملات الرقمية إلى [مراقبة المعاملات](https://docs.didit.me/ar/transaction-monitoring/overview.md)؛ تتضمن الاستجابة حالة المعاملة ودرجة المخاطر.

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const transaction = await didit.transactions.create({
  transaction_id: "txn-1001",
  transaction_category: "finance",
  transaction_details: { direction: "outbound", amount: 1500, currency: "EUR" },
  subject: { entity_type: "individual", vendor_data: "user-123", full_name: "Maria Garcia" },
});
console.log(transaction.status, transaction.score);
```

## التحقق من رموز Authentication

تتحقق `Authentication` من رموز الوصول التي يوقّعها مُصدر [Authentication](https://docs.didit.me/ar/authentication/overview.md) الخاص بك، داخل الخادم الخلفي، دون استدعاء Didit في كل طلب. كما تستبدل رموز التفويض، وتحدّث الرموز، وتتحقق من الجلسات وتُبطلها، وتُنفّذ عمليات رفع مستوى التحقق.

> [!NOTE]
>
> يُجري التحقق من الرمز الفحوصات الواردة في [التحقق من رمز على الخادم](https://docs.didit.me/ar/authentication/tokens-and-jwks.md#التحقق-من-رمز-على-الخادم-لديك)، وذلك مقابل مُصدر تطبيقك ومفاتيح التوقيع الخاصة به.

```typescript theme={null}
import { Authentication, TokenVerificationError } from "@didit-protocol/sdk-node";

// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
const auth = Authentication.fromPublishableKey("pk_live_...", { clientId: "your-application-id" });

export async function currentUser(accessToken: string): Promise<string | null> {
  try {
    const claims = await auth.verifyAccessToken(accessToken);
    return claims.sub;
  } catch (error) {
    if (error instanceof TokenVerificationError) return null;
    throw error;
  }
}
```

## الأخطاء

```typescript theme={null}
import Didit, { APIStatusError, NotFoundError, RateLimitError } from "@didit-protocol/sdk-node";

const didit = new Didit();

try {
  await didit.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555");
} catch (error) {
  if (error instanceof NotFoundError) console.log("no such session");
  else if (error instanceof RateLimitError) console.log("slow down, request", error.requestId);
  else if (error instanceof APIStatusError) console.log(error.status, error.body);
  else throw error;
}
```

## القوائم والملفات

```typescript theme={null}
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

const didit = new Didit();

// Lists page through every result.
for await (const session of didit.sessions.list({ status: "Approved" })) {
  console.log(session.session_id);
}

// Uploads take a Blob, a Buffer, a stream or fileFromPath.
const result = await didit.idVerification.verify({
  front_image: await fileFromPath("id-front.jpg"),
  back_image: await fileFromPath("id-back.jpg"),
});
console.log(result.id_verification);
```

تحتوي صفحات endpoint الخادم في [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) على مثال Node.js لكل عملية، باستثناء endpoint والحقول التي لم يصدر لها أي إصدار 1.0.1 بعد، وهي مذكورة في [النظرة العامة](https://docs.didit.me/ar/integration/server-sdks/overview.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.