الأحداث وSDK
SDK لـ JavaScript
عميل صغير محدد الأنواع لـ Node.js 18 وما بعده وDeno وBun. بلا اعتماديات: يستخدم fetch المدمج وWeb Crypto.
@scanverra/sdk في مرحلة المعاينة وقد تتغير واجهته. كل استدعاء طلب HTTP عادي، لذلك تشرح صفحات الواجهة طريقة العمل دونه.التثبيت
أنشئ عميلًا واحدًا وأعد استخدامه.
shell
npm install @scanverra/sdk
javascript
import { Scanverra } from "@scanverra/sdk";
const scanverra = new Scanverra({
apiKey: process.env.SCANVERRA_API_KEY,
// baseUrl: "https://www.scanverra.com", // optional
// timeoutMs: 300_000, // optional, per request
});تشغيل الفحوصات
ترد scans.audit() وscans.repo() بالتقرير المكتمل. وترد البقية فورًا بمعرّف؛ ويستعلم wait() حتى يجهز التقرير ويطلق خطأ إن فشل الفحص.
javascript
// Answers with the finished report
const audit = await scanverra.scans.audit({ url: "https://example.com" });
// Answer with an id; wait() polls until the report is ready
const { scanId } = await scanverra.scans.security({ url: "https://example.com" });
const security = await scanverra.wait("security", scanId);
const { testId } = await scanverra.scans.browser({ url: "https://example.com" });
const browser = await scanverra.wait("browser", testId, { intervalMs: 5000 });
// Repo scans: owner and repo of a connected account
const repo = await scanverra.scans.repo({ owner: "acme", repo: "storefront", async: true });
const repoReport = await scanverra.wait("repo", repo.scanId);قراءة الخصائص
الدرجات والمشكلات الموحّدة والخطوات التالية لكل منتج.
javascript
const { properties } = await scanverra.properties.list();
for (const p of properties) console.log(p.name, p.score, p.openTasks);
const detail = await scanverra.properties.get(properties[0].id);
const critical = detail.issues.filter((i) => i.severity === "critical");الاشتراك في الأحداث
أنشئ خطاف REST لأي حدث، ثم تحقق من توقيع كل تسليم باستخدام verifyWebhook. يرفض التسليمات الأقدم من خمس دقائق.
javascript
const hook = await scanverra.hooks.create({
event: "remediation.task_created",
url: "https://hooks.example.com/scanverra",
});
// Store hook.secret: it is shown only once.
// In your receiver, with the raw request body:
import { verifyWebhook } from "@scanverra/sdk";
const ok = await verifyWebhook({
secret: process.env.SCANVERRA_HOOK_SECRET,
body: rawBody,
timestamp: req.headers["x-scanverra-timestamp"],
signature: req.headers["x-scanverra-signature"],
});
if (!ok) return res.status(401).end();الأخطاء
كل فشل يطلق ScanverraError مع status وcode وmessage مقروءة وbody الرد. إذا لم يصل أي رد تكون قيمة status هي 0 وقيمة code هي network_error أو timeout.
javascript
import { ScanverraError } from "@scanverra/sdk";
try {
await scanverra.scans.audit({ url: "https://example.com" });
} catch (err) {
if (!(err instanceof ScanverraError)) throw err;
if (err.code === "SCAN_COOLDOWN") console.log("Try again later:", err.message);
else if (err.status === 0 || err.status >= 500) console.log("Retry with backoff:", err.code ?? err.status);
else throw err; // 4xx: fix the request (see /docs/errors)
}المرجع
| الحقل | الوصف |
|---|---|
scans.audit(body)Promise<report>اختياري | يشغّل تدقيق موقع ويعيد التقرير. مرّر async: true لتحصل على reportId فورًا. |
scans.security(body)Promise<{ scanId }>اختياري | يبدأ فحص أمان. |
scans.browser(body)Promise<{ testId }>اختياري | يبدأ تدقيق متصفح. مرّر credentialId لاختبار صفحات تتطلب تسجيل الدخول. |
scans.seo(body)Promise<{ scanId }>اختياري | يبدأ تحليل تحسين محركات البحث. |
scans.repo(body)Promise<{ scanId }>اختياري | يفحص مستودعًا مرتبطًا. |
results.<tool>(id)Promise<ScanResult>اختياري | يقرأ فحصًا بمعرّفه: audit أو security أو browser أو seo أو repo. |
wait(tool, id, options?)Promise<ScanResult>اختياري | يستعلم عن دالة results الخاصة بالأداة حتى ينتهي الفحص. الخيارات: intervalMs (4000) وtimeoutMs (600000). |
properties.list() / get(id)Promise<...>اختياري | يعرض الخصائص أو يقرأ واحدة بمشكلاتها وخطواتها التالية. |
hooks.list() / create() / delete(id) / sample(event)Promise<...>اختياري | يدير خطافات REST. يعيد create() سر التوقيع مرة واحدة فقط. |
verifyWebhook(input)Promise<boolean>اختياري | يتحقق من X-Scanverra-Signature مقابل الجسم الخام والطابع الزمني. |