npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rdapify/pro

v0.4.0

Published

Premium Rust-native features for RDAPify — Bulk Monitoring, Change Detection, Analytics & more

Readme

@rdapify/pro

ميزات RDAP الاحترافية المكتوبة بلغة Rust — المراقبة الجماعية، كشف التغييرات، التحليلات وأكثر

إصدار npm الترخيص: خاص Node.js 20+

امتداد تجاري لـ 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] |