@rdapify/pro
v0.4.0
Published
Premium Rust-native features for RDAPify — Bulk Monitoring, Change Detection, Analytics & more
Maintainers
Readme
@rdapify/pro
ميزات RDAP الاحترافية المكتوبة بلغة Rust — المراقبة الجماعية، كشف التغييرات، التحليلات وأكثر
امتداد تجاري لـ rdapify — يضيف مراقبة مستمرة، كشف التغييرات، التتبع التاريخي، التحليلات والتكاملات. محقق بالكامل بلغة Rust (عبر napi-rs) لمعالجة RDAP بدون نسخ والكشف عن التغييرات المتزامن.
@rdapify/pro هو مكون إضافي — يتم إرفاقه بمثيل RDAPClient موجود عبر واجهة .use() ولا يعدل أو يستبدل أي سلوك أساسي. تبقى جميع الميزات مفتوحة المصدر (حماية SSRF، التخزين المؤقت، تنقية PII، الوسيط) بالكامل قيد التشغيل.
المتطلبات
| المكون | المواصفات |
|--------|----------|
| اعتماد نظير | rdapify >= 0.2.0 |
| Node.js | >= 20.0.0 (يُنصح به LTS) |
| مفتاح الترخيص | مطلوب — rdapify.com/pricing |
| نظام التشغيل | Linux و macOS و Windows و FreeBSD |
التثبيت
npm install @rdapify/pro rdapifyالملفات الثنائية المعدة مسبقاً
يتم اختيار الملفات الثنائية الخاصة بالنظام الأساسي تلقائياً أثناء التثبيت:
- Linux (x64، arm64، arm، s390x، riscv64) — متغيرات glibc و musl
- macOS (x64، arm64، عام)
- Windows (x64، ia32، arm64) — MSVC
- FreeBSD (x64)
- Android (arm64، arm)
البداية السريعة
1. تهيئة المكون الإضافي
import { RDAPClient } from 'rdapify';
import { ProPlugin } from '@rdapify/pro';
const client = new RDAPClient();
// تفعيل ميزات Pro بمفتاح الترخيص الخاص بك
const plugin = await ProPlugin({
licenseKey: process.env.RDAPIFY_LICENSE_KEY!,
onlineValidation: true // التحقق من حالة المفتاح من خلال API (افتراضي)
});
// تثبيت المكون الإضافي
await client.use(plugin);2. استخدم ميزات Pro
// المراقبة الجماعية
const monitor = new BulkMonitor(['example.com', 'test.org'], { interval: '6h' });
monitor.onChange = (event) => console.log(event);
// كشف التغييرات
const changes = detector.diff(previousSnapshot, currentSnapshot);
// التتبع التاريخي
history.record('example.com', 'domain', rdapResponse);
const entries = history.query({ target: 'example.com', limit: 10 });
// التحليلات
const report = reporter.generate(snapshots, { format: 'detailed' });
// Webhooks
webhooks.register({ provider: 'slack', url: 'https://...' });
// التصدير
const csv = exporter.exportCsv(snapshots);الميزات
المراقبة الجماعية
راقب تلقائياً آلاف النطاقات أو عناوين IP في جدول زمني قابل للتخصيص.
import { BulkMonitor } from '@rdapify/pro';
const targets = ['example.com', 'example.org', '192.0.2.1'];
const monitor = new BulkMonitor(targets, {
interval: '6h', // التحقق كل 6 ساعات (أو '30m'، '1h'، '24h'، '7d')
concurrency: 10 // بحد أقصى 10 استعلامات RDAP متوازية لكل دورة
});
// إعداد رد الاتصال للتغيير
monitor.onChange = (event) => {
console.log(`${event.domain} تغير:`, event.changes);
};
// إضافة/إزالة الأهداف ديناميكياً
monitor.addTargets(['new.example.com']);
monitor.removeTargets(['old.example.com']);كشف التغييرات
يكتشف تلقائياً 5 أنواع من التغييرات في RDAP:
| نوع التغيير | الوصف | |------------|--------| | nameserver_changed | تم تحديث قائمة خوادم الأسماء | | status_changed | تم تعديل أعلام حالة النطاق/IP | | registrar_changed | تم تغيير مسجل الرعاية | | expiry_changed | تاريخ الانتهاء الصلاحية تحرك | | dnssec_changed | تم تحديث بيانات موقّع تفويض DNSSEC |
import { ChangeDetector } from '@rdapify/pro';
const detector = new ChangeDetector(['example.com']);
const changes = detector.diff(
JSON.stringify(oldRdapResponse),
JSON.stringify(newRdapResponse)
);
changes.forEach(change => {
console.log(`${change.changeType}: ${change.field}`);
console.log(` قبل: ${change.previousValue}`);
console.log(` بعد: ${change.currentValue}`);
});التتبع التاريخي
قم بتخزين الاستعلام عن لقطات RDAP بمرور الوقت لتحليل الاتجاهات.
import { HistoryTracker } from '@rdapify/pro';
const history = new HistoryTracker();
// تسجيل اللقطات (يتم استدعاؤها تلقائياً بواسطة BulkMonitor)
history.record('example.com', 'domain', JSON.stringify(rdapResponse));
// الاستعلام حسب نطاق التاريخ
const entries = history.query({
target: 'example.com',
from: '2026-01-01T00:00:00Z',
to: '2026-03-23T23:59:59Z',
limit: 100
});
// احصل على أحدث لقطة
const latest = history.latest('example.com');
// احصل على إجمالي الإدخالات المسجلة
const count = history.count();
// امسح السجل
history.clear();التحليلات المتقدمة
توليد تقارير ملخصة أو مفصلة أو اتجاهات من بيانات RDAP المجمعة.
import { Reporter } from '@rdapify/pro';
const reporter = new Reporter();
const report = reporter.generate(
snapshots.map(s => JSON.stringify(s)),
{
format: 'detailed', // 'summary' | 'detailed' | 'trends'
from: '2026-01-01T00:00:00Z',
to: '2026-03-23T23:59:59Z'
}
);
console.log(report);
// الإخراج:
// {
// generatedAt: '2026-03-23T12:00:00Z',
// format: 'detailed',
// totalQueries: 1543,
// registrars: {
// 'GoDaddy': 420,
// 'Namecheap': 380,
// 'Cloudflare': 215
// },
// statusCounts: {
// 'clientTransferProhibited': 890,
// 'autoRenewPeriod': 653
// },
// queryTypes: {
// 'domain': 900,
// 'ip': 643
// },
// topDomains: [
// { target: 'example.com', count: 12 },
// { target: 'example.org', count: 8 }
// ],
// errorRate: 0.02
// }تكاملات Webhook
أرسل إشعارات التغيير في الوقت الفعلي إلى Slack و Discord و Teams أو نقاط نهاية HTTP مخصصة.
import { WebhookManager } from '@rdapify/pro';
const webhooks = new WebhookManager();
// تكامل Slack
webhooks.register({
provider: 'slack',
url: 'https://hooks.slack.com/services/YOUR_WORKSPACE/YOUR_CHANNEL/YOUR_WEBHOOK_TOKEN',
events: ['expiry_changed', 'nameserver_changed'],
headers: { 'X-Custom-Auth': 'token' }
});
// تكامل Discord
webhooks.register({
provider: 'discord',
url: 'https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN'
});
// تكامل Microsoft Teams
webhooks.register({
provider: 'teams',
url: 'https://outlook.webhook.office.com/webhookb2/...'
});
// نقطة نهاية HTTP مخصصة
webhooks.register({
provider: 'custom',
url: 'https://my-api.example.com/webhooks',
headers: { 'X-API-Key': 'secret' }
});
// إرسال الإشعارات (يتم إطلاقها تلقائياً أو يدوياً)
const changeEvent = {
target: 'example.com',
changeType: 'nameserver_changed',
field: 'nameservers',
previousValue: JSON.stringify(['ns1.example.com']),
currentValue: JSON.stringify(['ns2.new-provider.com']),
detectedAt: new Date().toISOString()
};
await webhooks.notify(JSON.stringify(changeEvent));
// قائمة بـ webhooks المسجلة
const registered = webhooks.getWebhooks();
// إزالة webhook
webhooks.remove('https://hooks.slack.com/services/YOUR_WORKSPACE/YOUR_CHANNEL/YOUR_WEBHOOK_TOKEN');تصدير البيانات
تصدير بيانات RDAP بصيغة JSON (مطبوع بشكل جميل) أو CSV للتحليل والتقارير.
import { Exporter } from '@rdapify/pro';
const exporter = new Exporter();
// تصدير JSON (مطبوع بشكل جميل)
const jsonOutput = exporter.exportJson(
snapshots.map(s => JSON.stringify(s))
);
// تصدير CSV (متوافق مع RFC 4180)
const csvOutput = exporter.exportCsv(
snapshots.map(s => JSON.stringify(s)),
['target', 'registrar', 'status', 'expirationDate'] // اختياري: تصفية الأعمدة
);
// الحفظ في ملف
const fs = require('fs');
fs.writeFileSync('report.json', jsonOutput);
fs.writeFileSync('report.csv', csvOutput);التسعير والخطط
فتح ميزات Pro بمفتاح ترخيص. الخطط والتسعير اعتباراً من مارس 2026:
| الميزة | مجتمع | Pro | فريق | المؤسسة | |--------|---------|-----|------|-----------| | استعلامات RDAP (النطاق، IP، ASN، إلخ) | ✓ | ✓ | ✓ | ✓ | | ذاكرة التخزين المؤقت داخل الذاكرة | ✓ | ✓ | ✓ | ✓ | | حماية SSRF | ✓ | ✓ | ✓ | ✓ | | المراقبة الجماعية | — | ✓ | ✓ | ✓ | | كشف التغييرات | — | ✓ | ✓ | ✓ | | تتبع السجل | — | ✓ | ✓ | ✓ | | التحليلات | — | ✓ | ✓ | ✓ | | Webhooks (حتى 3) | — | ✓ | ✓ | ✓ | | Webhooks (غير محدود) | — | — | ✓ | ✓ | | تصدير (JSON/CSV) | — | ✓ | ✓ | ✓ | | دعم مخصص | — | — | ✓ | ✓ | | SLA (99.9% وقت التشغيل) | — | — | — | ✓ | | التكلفة الشهرية | 0 دولار | 19 دولار | 49 دولار | حسب الطلب |
احصل على مفتاحك: https://rdapify.com/pricing
التحقق من مفتاح الترخيص
تنسيق المفتاح
RDAP-{PLAN}-{base64url-payload}-{signature}
مثال:
RDAP-PRO-eyJvcmciOiJNeSBDb21wYW55IiwiZXhwIjoxNzEwODk1OTk5OTk5LCJtYXhEZXYiOjV9-HMAC256Signature...هيكل الحمل (مفكوك base64url):
{
"org": "My Company",
"exp": 1710895999999,
"maxDev": 5
}- org — اسم المنظمة
- exp — الطابع الزمني لانتهاء الصلاحية (بالميلي ثانية)
- maxDev — عدد المطورين الأقصى (تجربة: 1، احترافية: 5، فريق: 10، مؤسسة: غير محدود)
التحقق غير الإنترنت
import { LicenseValidator } from '@rdapify/pro';
const info = LicenseValidator.validate(licenseKey);
console.log(info);
// {
// valid: true,
// plan: 'pro',
// organization: 'My Company',
// expiresAt: 1710895999999,
// maxDevelopers: 5
// }التحقق عبر الإنترنت
يتحقق من API من حالة المفتاح والإلغاءات واستخدام المقاعد:
const onlineInfo = await LicenseValidator.validateOnline(licenseKey);تراخيص التجربة
تستخدم تراخيص التجربة لمدة 30 يوماً خطة TRIAL:
RDAP-TRIAL-{payload}-{signature}
الصادرة مع:
- maxDevelopers: 1
- ينتهي: بعد 30 يوماً من الإصدارمرجع API TypeScript
ProPlugin
// دالة المصنع
const plugin = await ProPlugin(options: ProPluginOptions): Promise<ProPluginDescriptorFull>
interface ProPluginOptions {
licenseKey: string; // مفتاح ترخيص مطلوب
onlineValidation?: boolean; // التحقق من API (افتراضي: صحيح)
}
interface ProPluginDescriptor {
name: string;
version: string;
license: LicenseInfo;
install(client: unknown): void;
}BulkMonitor
class BulkMonitor {
constructor(targets: string[], interval?: string, concurrency?: number)
processResults(results: Record<string, string>): MonitorEvent[]
getTargets(): string[]
getIntervalMs(): number
getConcurrency(): number
addTargets(targets: string[]): void
removeTargets(targets: string[]): void
clearSnapshots(): void
}
interface MonitorEvent {
domain: string;
eventType: 'created' | 'updated' | 'expired' | 'transferred' | 'deleted'
timestamp: string;
changes: string[];
}ChangeDetector
class ChangeDetector {
constructor(targets: string[])
diff(previous: string, current: string): ChangeEvent[]
getTargets(): string[]
}
interface ChangeEvent {
target: string;
changeType: 'nameserver_changed' | 'status_changed' | 'registrar_changed'
| 'expiry_changed' | 'dnssec_changed'
field: string;
previousValue: string; // JSON مسلسل
currentValue: string; // JSON مسلسل
detectedAt: string; // ISO-8601
}HistoryTracker
class HistoryTracker {
constructor()
record(target: string, queryType: string, data: string): void
query(options: HistoryQuery): HistoryEntry[]
latest(target: string): HistoryEntry | null
count(): number
clear(): void
}
interface HistoryEntry {
target: string;
queryType: string;
snapshot: string; // JSON مسلسل RDAP
capturedAt: string; // ISO-8601
}
interface HistoryQuery {
target: string;
from?: string; // ISO-8601
to?: string; // ISO-8601
limit?: number;
}Reporter
class Reporter {
constructor()
generate(data: string[], options?: ReportOptions): ReportOutput
}
interface ReportOptions {
format?: 'summary' | 'detailed' | 'trends'
from?: string; // ISO-8601
to?: string; // ISO-8601
}
interface ReportOutput {
generatedAt: string;
format: string;
totalQueries: number;
registrars: Record<string, number>;
statusCounts: Record<string, number>;
queryTypes: Record<string, number>;
topDomains: TopEntry[];
errorRate: number;
}
interface TopEntry {
target: string;
count: number;
}WebhookManager
class WebhookManager {
constructor()
register(config: WebhookConfig): void
remove(url: string): void
getWebhooks(): WebhookConfig[]
notify(event: string): Promise<number>
}
interface WebhookConfig {
provider: 'slack' | 'discord' | 'teams' | 'custom'
url: string;
events?: string[]; // تصفية نوع الحدث
headers?: Record<string, string>;
}Exporter
class Exporter {
constructor()
exportJson(data: string[]): string
exportCsv(data: string[], fields?: string[]): string
}LicenseValidator
class LicenseValidator {
static validate(key: string): LicenseInfo
static validateOnline(key: string): Promise<LicenseInfo>
}
interface LicenseInfo {
valid: boolean;
plan?: 'pro' | 'enterprise' | 'trial'
organization?: string;
expiresAt?: number; // بالميلي ثانية
maxDevelopers?: number;
reason?: string; // تفاصيل الخطأ إذا كانت غير صالحة
}الهندسة المعمارية
تنفيذ محقق بلغة Rust (عبر napi-rs) للأداء والأمان:
┌──────────────────────────────────────────────────┐
│ تطبيق JavaScript / TypeScript │
├──────────────────────────────────────────────────┤
│ index.js (اكتشاف النظام الأساسي، الربط الأصلي) │
├──────────────────────────────────────────────────┤
│ وحدة Rust الأصلية (.node binary) │
│ ├─ lib.rs (جذر napi، ProPlugin) │
│ ├─ license/mod.rs (LicenseValidator) │
│ ├─ monitoring/mod.rs (BulkMonitor، كاشف) │
│ ├─ history/mod.rs (HistoryTracker) │
│ ├─ analytics/mod.rs (Reporter) │
│ └─ integrations/ (WebhookManager، Exporter) │
├──────────────────────────────────────────────────┤
│ مكتبة rdapify │
└──────────────────────────────────────────────────┘يتم إجراء جميع الحسابات في Rust:
- بدون نسخ معالجة RDAP
- آمنة الخيوط مع السجل
Arc<Mutex<Vec<>>> - متزامنة webhooks عبر عميل
reqwestالغير متزامن - التحقق الآمن من الوقت (مقارنة HMAC ثابتة الوقت)
متغيرات البيئة
| المتغير | الغرض | الافتراضي |
|---------|--------|----------|
| RDAPIFY_PRO_LICENSE_KEY | حقن مفتاح الترخيص (اختياري) | لا شيء |
| RDAPIFY_PRO_ONLINE_VALIDATION | تفعيل التحقق من API | true |
استكشاف الأخطاء
| المشكلة | الحل |
|--------|------|
| "فشل تحميل الربط الأصلي" | إعادة التثبيت: npm install --force @rdapify/pro |
| "لم يتم العثور على مفتاح الترخيص" | قم بتعيين licenseKey في خيارات ProPlugin أو متغير env |
| "انتهت صلاحية الترخيص" | تجديد في https://rdapify.com/pricing |
| "تنسيق مفتاح ترخيص غير صالح" | يجب أن يطابق المفتاح RDAP-{PLAN}-{payload}-{signature} |
| "فشل Webhook صامت" | تحقق من السجلات؛ لا تحجب الأخطاء الـ webhooks الأخرى |
متطلبات النظام
- Node.js: 20.0.0 أو أحدث (يُنصح به LTS)
- الذاكرة: 64 ميجابايت بحد أدنى (يتجاوز حجم السجل)
- الشبكة: اختياري للتحقق عبر الإنترنت من الترخيص
السجل والهجرة
انظر CHANGELOG.md لسجل الإصدارات والتغييرات الكسيرة. انظر MIGRATION.md لأدلة الترقية.
الترخيص
خاص — ليس مفتوح المصدر. مفتاح ترخيص صالح مطلوب للاستخدام الإنتاجي.
حقوق الطبع والنشر © 2024-2026 RDAPify. جميع الحقوق محفوظة.
انظر LICENSE للحصول على الشروط الكاملة.
الدعم والروابط
| المورد | الرابط | |--------|--------| | التسعير | https://rdapify.com/pricing | | التوثيق | https://rdapify.com/docs | | GitHub (خاص) | https://github.com/rdapify/RDAPify-Pro | | المشاكل | https://github.com/rdapify/RDAPify-Pro/issues | | البريد الإلكتروني | [email protected] |
