You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

32 KiB

📚 Plugnmeet Server API Documentation

مستندات کامل API سرور کنفرانس ویدیویی Plugnmeet

این مستند راهنمای کامل API های Plugnmeet Server را شامل می‌شود که بر پایه LiveKit ساخته شده است.


📖 فهرست مطالب

🚀 شروع سریع

🔐 احراز هویت و امنیت

🎯 API Reference

🔧 سایر سرویس‌ها


🚀 Quick Check: Room Status

ساده‌ترین روش برای بررسی فعال بودن یک روم:

Endpoint

POST /auth/room/isRoomActive

Request

{
  "roomId": "your-room-id"
}

Response

{
  "status": true,
  "msg": "room is active",
  "isActive": true
}

cURL Example

#!/bin/bash
API_KEY="your-api-key"
SECRET="your-secret-key"
BODY='{"roomId":"algebra-1402"}'

# محاسبه HMAC-SHA256
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')

# ارسال درخواست
curl -X POST 'https://your-domain.com/auth/room/isRoomActive' \
  -H "API-KEY: $API_KEY" \
  -H "HASH-SIGNATURE: $SIG" \
  -H 'Content-Type: application/json' \
  -d "$BODY"

Core Features

Plugnmeet Server مجموعه کاملی از قابلیت‌های حرفه‌ای برای برگزاری کنفرانس‌های آنلاین را فراهم می‌کند:

🎥 Video Conferencing

  • HD Audio/Video با کیفیت بالا
  • Screen Sharing - اشتراک‌گذاری صفحه
  • Virtual Backgrounds - پس‌زمینه مجازی
  • Adaptive Streaming (Simulcast & Dynacast)

📊 Collaboration Tools

  • Interactive Whiteboard با پشتیبانی از فایل‌های PDF/Office
  • Shared Notepad - یادداشت مشترک
  • Live Polls - نظرسنجی زنده
  • Breakout Rooms - اتاق‌های گروهی

🎬 Recording & Streaming

  • Cloud Recording - ضبط ابری با فرمت MP4
  • RTMP Streaming - پخش زنده
  • Ingress Support (RTMP/WHIP)

🛡️ Security & Control

  • Waiting Room - اتاق انتظار
  • Lock Settings - قفل کردن قابلیت‌ها
  • User Management - مدیریت کاربران
  • End-to-End Encryption

📈 Analytics & Monitoring

  • Session Analytics - آنالیتیکس جلسات
  • Participant Reports - گزارش شرکت‌کنندگان
  • Real-time Monitoring

Accessibility

  • Speech-to-Text - گفتار به متن
  • Real-time Translation (Azure)

🔐 Authentication

Plugnmeet از سه روش احراز هویت مختلف استفاده می‌کند:

1. /auth Endpoints (HMAC + JSON)

برای عملیات مدیریتی و ساخت توکن‌ها استفاده می‌شود.

Headers

API-KEY: your_api_key
HASH-SIGNATURE: hmac_sha256_hex_signature
Content-Type: application/json

محاسبه HMAC Signature

Bash/Shell:

SECRET="your-secret-key"
BODY='{"roomId":"test-room"}'
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')

Python:

import hmac
import hashlib
import json

secret = "your-secret-key"
body = {"roomId": "test-room"}
body_json = json.dumps(body)

signature = hmac.new(
    secret.encode('utf-8'),
    body_json.encode('utf-8'),
    hashlib.sha256
).hexdigest()

Node.js:

const crypto = require('crypto');

const secret = 'your-secret-key';
const body = JSON.stringify({ roomId: 'test-room' });

const signature = crypto
  .createHmac('sha256', secret)
  .update(body)
  .digest('hex');

2. /api Endpoints (Bearer Token + Protobuf)

برای کنترل‌های داخل جلسه استفاده می‌شود.

Headers

Authorization: <PNM_ACCESS_TOKEN>
Content-Type: application/octet-stream

توکن دسترسی از طریق /auth/room/getJoinToken دریافت می‌شود.

Request/Response Format

  • بدنه درخواست: Binary Protobuf (استفاده از SDK توصیه می‌شود)
  • پاسخ: Binary Protobuf

cURL Example با Protobuf

# ساخت فایل باینری با SDK
# سپس ارسال با curl
curl -X POST 'https://your-domain.com/api/recording' \
  -H "Authorization: $TOKEN" \
  -H 'Content-Type: application/octet-stream' \
  --data-binary @recording_req.bin \
  -o response.bin

نکته: برخی endpoint های /api مانند convertWhiteboardFile و fileUpload از JSON استفاده می‌کنند.


3. Special Authentication Methods

LTI (Learning Tools Interoperability)

Authorization: <LTI_TOKEN>

مسیرها: /lti/v1/...

BigBlueButton Compatibility

نیازمند checksum محاسبه شده مطابق استاندارد BBB مسیرها: /:apiKey/bigbluebutton/api/...


📋 Room Management API

🏗️ Create Room

اتاق جلسه جدید ایجاد می‌کند.

Endpoint

POST /auth/room/create

Request Body

{
  "roomId": "algebra-class-1402",
  "maxParticipants": 50,
  "emptyTimeout": 300,
  "metadata": {
    "roomTitle": "کلاس جبر خطی",
    "welcomeMessage": "به کلاس جبر خوش آمدید",
    "defaultLockSettings": {
      "lockMicrophone": false,
      "lockWebcam": false,
      "lockScreenSharing": true,
      "lockChat": false,
      "lockChatSendMessage": false,
      "lockChatFileShare": false,
      "lockPrivateChat": false,
      "lockWhiteboard": true,
      "lockSharedNotepad": false
    },
    "roomFeatures": {
      "allowWebcams": true,
      "muteOnStart": false,
      "allowScreenSharing": true,
      "allowRecording": true,
      "allowRtmp": true,
      "allowViewOtherWebcams": true,
      "allowViewOtherParticipantsList": true,
      "adminOnlyWebcams": false,
      "allowPolls": true,
      "roomDuration": 0,
      "recordingFeatures": {
        "isAllow": true,
        "isAllowCloud": true,
        "enableAutoCloudRecording": false
      },
      "chatFeatures": {
        "allowChat": true,
        "allowFileUpload": true
      },
      "sharedNotePadFeatures": {
        "allowedSharedNotePad": true
      },
      "whiteboardFeatures": {
        "allowedWhiteboard": true,
        "preloadFile": ""
      },
      "breakoutRoomFeatures": {
        "isAllow": true,
        "allowedNumberRooms": 6
      },
      "displayExternalLinkFeatures": {
        "isAllow": true
      },
      "ingressFeatures": {
        "isAllow": false
      },
      "speechToTextTranslationFeatures": {
        "isAllow": true,
        "isAllowTranslation": true
      }
    },
    "webhookUrl": "https://your-domain.com/webhook",
    "isBreakoutRoom": false,
    "parentRoomId": ""
  }
}

Response

{
  "status": true,
  "msg": "room created successfully",
  "roomId": "algebra-class-1402"
}

🎫 Generate Join Token

توکن ورود کاربر به جلسه را ایجاد می‌کند.

Endpoint

POST /auth/room/getJoinToken

Request Body

{
  "roomId": "algebra-class-1402",
  "userInfo": {
    "userId": "student-123",
    "name": "علی احمدی",
    "isAdmin": false,
    "isHidden": false,
    "userMetadata": {
      "profilePic": "https://example.com/avatar.jpg",
      "lockSettings": {
        "lockMicrophone": false,
        "lockWebcam": false,
        "lockScreenSharing": true,
        "lockChat": false
      }
    }
  }
}

Response

{
  "status": true,
  "msg": "token generated",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Integration Example

<!DOCTYPE html>
<html>
<head>
  <title>Join Meeting</title>
</head>
<body>
  <script>
    // توکن از سرور دریافت شده
    const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
    const meetingUrl = `https://your-domain.com/login?access_token=${token}`;
    
    // هدایت کاربر به جلسه
    window.location.href = meetingUrl;
  </script>
</body>
</html>

Check Room Status

Endpoint

POST /auth/room/isRoomActive

Request

{
  "roomId": "algebra-class-1402"
}

Response

{
  "status": true,
  "msg": "room is active",
  "isActive": true
}

📊 Get Active Room Info

اطلاعات کامل یک روم فعال و لیست شرکت‌کنندگان آن را برمی‌گرداند.

Endpoint

POST /auth/room/getActiveRoomInfo

Request

{
  "roomId": "algebra-class-1402"
}

Response

{
  "status": true,
  "msg": "success",
  "room": {
    "roomInfo": {
      "sid": "RM_xxxxxxxxxxxx",
      "roomId": "algebra-class-1402",
      "name": "algebra-class-1402",
      "emptyTimeout": 300,
      "maxParticipants": 50,
      "creationTime": "1699123456",
      "metadata": "{...}"
    },
    "participantsInfo": [
      {
        "sid": "PA_xxxxxxxxxxxx",
        "identity": "student-123",
        "name": "علی احمدی",
        "state": 0,
        "joinedAt": "1699123500"
      }
    ]
  }
}

📋 List All Active Rooms

لیست تمام روم‌های فعال را برمی‌گرداند.

Endpoint

POST /auth/room/getActiveRoomsInfo

Request

{}

Response

{
  "status": true,
  "msg": "success",
  "rooms": [
    {
      "roomId": "algebra-class-1402",
      "sid": "RM_xxxxxxxxxxxx",
      "numParticipants": 15,
      "creationTime": "1699123456"
    },
    {
      "roomId": "physics-class-1402",
      "sid": "RM_yyyyyyyyyyyy",
      "numParticipants": 8,
      "creationTime": "1699123789"
    }
  ]
}

🛑 End Room

جلسه را به پایان می‌رساند و تمام شرکت‌کنندگان را خارج می‌کند.

Endpoint

POST /auth/room/endRoom

Request

{
  "roomId": "algebra-class-1402"
}

Response

{
  "status": true,
  "msg": "room ended successfully"
}

📜 Fetch Past Rooms

لیست روم‌های گذشته را با امکان فیلتر و صفحه‌بندی برمی‌گرداند.

Endpoint

POST /auth/room/fetchPastRooms

Request

{
  "roomIds": ["algebra-class-1402", "physics-class-1402"],
  "from": 0,
  "limit": 20,
  "orderBy": "DESC"
}

Request Parameters

Parameter Type Description
roomIds string[] لیست شناسه‌های روم (اختیاری)
from number شروع صفحه‌بندی
limit number تعداد نتایج (حداکثر 100)
orderBy string ترتیب: ASC یا DESC

Response

{
  "status": true,
  "msg": "success",
  "result": {
    "totalRooms": 45,
    "from": 0,
    "limit": 20,
    "orderBy": "DESC",
    "roomsList": [
      {
        "roomId": "algebra-class-1402",
        "sid": "RM_xxxxxxxxxxxx",
        "roomTitle": "کلاس جبر خطی",
        "creationTime": "1699123456",
        "ended": "1699127056",
        "roomDuration": 3600
      }
    ]
  }
}

🎬 Recording Management API

📋 Fetch Recordings

لیست ضبط‌های انجام شده را دریافت می‌کند.

Endpoint

POST /auth/recording/fetch

Request

{
  "roomIds": ["algebra-class-1402"],
  "from": 0,
  "limit": 20,
  "orderBy": "DESC"
}

Response

{
  "status": true,
  "msg": "success",
  "result": {
    "totalRecordings": 5,
    "from": 0,
    "limit": 20,
    "orderBy": "DESC",
    "recordings": [
      {
        "recordId": "rec_xxxxxxxxxxxx",
        "roomId": "algebra-class-1402",
        "roomSid": "RM_xxxxxxxxxxxx",
        "filePath": "/recordings/algebra-class-1402_20231105.mp4",
        "fileSize": 524288000,
        "creationTime": "1699123456",
        "roomCreationTime": "1699120000",
        "recordingDuration": 3600
      }
    ]
  }
}

📄 Get Recording Info

اطلاعات کامل یک ضبط را برمی‌گرداند.

Endpoint

POST /auth/recording/recordingInfo

Request

{
  "recordId": "rec_xxxxxxxxxxxx"
}

Response

{
  "status": true,
  "msg": "success",
  "recordingInfo": {
    "recordId": "rec_xxxxxxxxxxxx",
    "roomId": "algebra-class-1402",
    "filePath": "/recordings/algebra-class-1402_20231105.mp4",
    "fileSize": 524288000,
    "creationTime": "1699123456"
  }
}

🗑️ Delete Recording

یک ضبط را حذف می‌کند.

Endpoint

POST /auth/recording/delete

Request

{
  "recordId": "rec_xxxxxxxxxxxx"
}

Response

{
  "status": true,
  "msg": "recording deleted successfully"
}

🔗 Get Download Token

توکن موقت برای دانلود فایل ضبط شده ایجاد می‌کند.

Endpoint

POST /auth/recording/getDownloadToken

Request

{
  "recordId": "rec_xxxxxxxxxxxx"
}

Response

{
  "status": true,
  "msg": "token generated",
  "token": "download_token_xxxxxxxxxxxx"
}

Download File

# دانلود فایل با توکن
curl -o recording.mp4 \
  "https://your-domain.com/download/recording/download_token_xxxxxxxxxxxx"

📈 Analytics API

📋 Fetch Analytics

لیست آنالیتیکس جلسات را دریافت می‌کند.

Endpoint

POST /auth/analytics/fetch

Request

{
  "roomIds": ["algebra-class-1402"],
  "from": 0,
  "limit": 20
}

Response

{
  "status": true,
  "msg": "success",
  "result": {
    "totalAnalytics": 10,
    "analyticsList": [
      {
        "analyticsId": "ana_xxxxxxxxxxxx",
        "roomId": "algebra-class-1402",
        "roomSid": "RM_xxxxxxxxxxxx",
        "fileId": "file_xxxxxxxxxxxx",
        "fileName": "analytics_algebra-class-1402_20231105.json",
        "filePath": "/analytics/algebra-class-1402_20231105.json",
        "fileSize": 102400,
        "creationTime": "1699127056"
      }
    ]
  }
}

🗑️ Delete Analytics

Endpoint

POST /auth/analytics/delete

Request

{
  "analyticsId": "ana_xxxxxxxxxxxx"
}

🔗 Get Download Token

Endpoint

POST /auth/analytics/getDownloadToken

Request

{
  "analyticsId": "ana_xxxxxxxxxxxx"
}

Response

{
  "status": true,
  "msg": "token generated",
  "token": "analytics_token_xxxxxxxxxxxx"
}

Download Analytics File

curl -o analytics.json \
  "https://your-domain.com/download/analytics/analytics_token_xxxxxxxxxxxx"

🎮 In-Meeting Controls API

نکته مهم: تمام endpoint های این بخش نیازمند Bearer Token در هدر Authorization هستند و از Binary Protobuf استفاده می‌کنند (مگر در موارد خاص که JSON ذکر شده باشد).

🔐 Verify Token

توکن کاربر را تایید کرده و اطلاعات اتصال را برمی‌گرداند.

Endpoint

POST /api/verifyToken

Request (Protobuf)

message VerifyTokenReq {}

Response (Protobuf)

message VerifyTokenRes {
  bool status = 1;
  string msg = 2;
  string roomId = 3;
  string userId = 4;
  string roomSid = 5;
  repeated string natsWsUrls = 6;
  string natsSubject = 7;
  string serverVersion = 8;
}

🎬 Recording & RTMP Control

Start/Stop Recording

Endpoint:

POST /api/recording

Request (Protobuf):

message RecordingReq {
  string sid = 1;          // Room SID
  RecordingTasks task = 2;  // START_RECORDING | STOP_RECORDING
  string rtmpUrl = 3;      // برای RTMP
}

enum RecordingTasks {
  START_RECORDING = 0;
  STOP_RECORDING = 1;
  START_RTMP = 2;
  STOP_RTMP = 3;
}

Response (Protobuf):

message RecordingRes {
  bool status = 1;
  string msg = 2;
}

🛑 End Room

اتاق را از داخل جلسه به پایان می‌رساند (فقط ادمین).

Endpoint

POST /api/endRoom

Request (Protobuf)

message RoomEndReq {
  string roomId = 1;
}

🔒 Update Lock Settings

تنظیمات قفل کاربران را تغییر می‌دهد (فقط ادمین).

Endpoint

POST /api/updateLockSettings

Request (Protobuf)

message UpdateUserLockSettingsReq {
  string roomSid = 1;
  string roomId = 2;
  string userId = 3;     // "all" برای همه | شناسه کاربر خاص
  string service = 4;     // mic | webcam | screenShare | chat | etc.
  string direction = 5;   // "lock" | "unlock"
}

Available Services

  • mic - میکروفون
  • webcam - وب‌کم
  • screenShare - اشتراک‌گذاری صفحه
  • chat - چت
  • sendChatMsg - ارسال پیام در چت
  • chatFile - ارسال فایل در چت
  • privateChat - چت خصوصی
  • whiteboard - وایت‌برد
  • sharedNotepad - یادداشت مشترک

🔇 Mute/Unmute Track

میکروفون یک یا تمام کاربران را قطع یا وصل می‌کند (فقط ادمین).

Endpoint

POST /api/muteUnmuteTrack

Request (Protobuf)

message MuteUnMuteTrackReq {
  string sid = 1;        // Room SID
  string roomId = 2;
  string userId = 3;     // "all" برای همه | شناسه کاربر
  string trackSid = 4;   // اختیاری
  bool muted = 5;        // true = mute | false = unmute
}

👤 Remove Participant

کاربر را از جلسه حذف می‌کند (فقط ادمین).

Endpoint

POST /api/removeParticipant

Request (Protobuf)

message RemoveParticipantReq {
  string sid = 1;
  string roomId = 2;
  string userId = 3;
  string msg = 4;        // پیام برای کاربر
  bool blockUser = 5;    // مسدود کردن دائمی
}

🎤 Switch Presenter

نقش ارائه‌دهنده را به کاربر می‌دهد یا می‌گیرد (فقط ادمین).

Endpoint

POST /api/switchPresenter

Request (Protobuf)

message SwitchPresenterReq {
  string userId = 1;
  SwitchPresenterTask task = 2;  // PROMOTE | DEMOTE
}

enum SwitchPresenterTask {
  PROMOTE = 0;
  DEMOTE = 1;
}

🎨 Advanced Features

لینک خارجی را برای تمام شرکت‌کنندگان نمایش می‌دهد (فقط ادمین).

Endpoint

POST /api/externalDisplayLink

Request (Protobuf)

message ExternalDisplayLinkReq {
  ExternalDisplayLinkTask task = 1;  // START_EXTERNAL_LINK | STOP_EXTERNAL_LINK
  string url = 2;
}

🎵 External Media Player

ویدیو یا صدای خارجی را پخش می‌کند (فقط ادمین).

Endpoint

POST /api/externalMediaPlayer

Request (Protobuf)

message ExternalMediaPlayerReq {
  ExternalMediaPlayerTask task = 1;  // START_PLAYBACK | STOP_PLAYBACK
  string url = 2;
  bool isPresentation = 3;
}

نکته: می‌توانید فایل را با /api/fileUpload آپلود کرده و لینک /download/uploadedFile/... را استفاده کنید.


🚪 Waiting Room

Approve Users

کاربران در اتاق انتظار را تایید می‌کند (فقط ادمین).

Endpoint:

POST /api/waitingRoom/approveUsers

Request (Protobuf):

message ApproveWaitingUsersReq {
  repeated string userIds = 1;
}

Update Waiting Room Message

Endpoint:

POST /api/waitingRoom/updateMsg

Request (Protobuf):

message UpdateWaitingRoomMessageReq {
  string message = 1;
}

📊 Polls (نظرسنجی)

Create Poll

نظرسنجی جدید ایجاد می‌کند (فقط ادمین).

Endpoint:

POST /api/polls/create

Request (Protobuf):

message CreatePollReq {
  string question = 1;
  repeated PollOption options = 2;
  bool isAnonymous = 3;
  bool allowMultipleVotes = 4;
}

message PollOption {
  uint64 id = 1;
  string text = 2;
}

List Polls

Endpoint:

GET /api/polls/listPolls

Response: Binary Protobuf


Submit Poll Response

Endpoint:

POST /api/polls/submitResponse

Request (Protobuf):

message SubmitPollResponseReq {
  string pollId = 1;
  repeated uint64 selectedOptionIds = 2;
}

Get Poll Results

Endpoint:

GET /api/polls/pollResponsesResult/:pollId

Response: Binary Protobuf با نتایج نظرسنجی


🏢 Breakout Rooms (اتاق‌های گروهی)

Create Breakout Rooms

Endpoint:

POST /api/breakoutRoom/create

Request (Protobuf):

message CreateBreakoutRoomsReq {
  uint64 duration = 1;
  repeated BreakoutRoom rooms = 2;
}

message BreakoutRoom {
  string id = 1;
  string title = 2;
  repeated string userIds = 3;
}

Join Breakout Room

Endpoint:

POST /api/breakoutRoom/join

Request (Protobuf):

message JoinBreakoutRoomReq {
  string breakoutRoomId = 1;
}

List Breakout Rooms

Endpoint:

GET /api/breakoutRoom/listRooms

End Breakout Room

Endpoint:

POST /api/breakoutRoom/endRoom

Request (Protobuf):

message EndBreakoutRoomReq {
  string breakoutRoomId = 1;
}

End All Breakout Rooms

Endpoint:

POST /api/breakoutRoom/endAllRooms

📡 Ingress (RTMP/WHIP Input)

ورودی استریم خارجی ایجاد می‌کند.

Endpoint

POST /api/ingress/create

Request (Protobuf)

message CreateIngressReq {
  IngressInput inputType = 1;  // RTMP_INPUT | WHIP_INPUT
  string participantName = 2;
  string roomId = 3;
}

enum IngressInput {
  RTMP_INPUT = 0;
  WHIP_INPUT = 1;
}

Response (Protobuf)

message CreateIngressRes {
  bool status = 1;
  string msg = 2;
  string ingressId = 3;
  string url = 4;
  string streamKey = 5;
}

Usage Example

پس از دریافت url و streamKey:

# استریم با FFmpeg
ffmpeg -re -i input.mp4 \
  -c:v libx264 -c:a aac \
  -f flv "rtmp://url/stream_key"

🗣️ Speech Services (Azure)

Enable/Disable Speech Service

Endpoint:

POST /api/speechServices/serviceStatus

Request (Protobuf):

message SpeechToTextTranslationReq {
  bool enabled = 1;
}

Get Azure Token

Endpoint:

POST /api/speechServices/azureToken

Request (Protobuf):

message GenerateAzureTokenReq {
  string userSid = 1;
}

📁 File Upload & Whiteboard

Upload File (Resumable)

برای آپلود فایل‌های بزرگ به صورت chunk به chunk.

Endpoint:

POST /api/fileUpload?resumable=true&roomSid=xxx&roomId=xxx&userId=xxx

Headers:

Authorization: <TOKEN>
Content-Type: multipart/form-data

Response: part_uploaded or error


Merge Uploaded Chunks

Endpoint:

POST /api/uploadedFileMerge

Request (JSON):

{
  "roomSid": "RM_xxxxxxxxxxxx",
  "roomId": "algebra-class-1402",
  "resumableIdentifier": "unique-file-id",
  "resumableFilename": "document.pdf",
  "resumableTotalChunks": 10
}

Response (JSON):

{
  "status": true,
  "msg": "file merged successfully",
  "filePath": "/uploads/document.pdf",
  "fileName": "document.pdf",
  "fileExtension": "pdf"
}

Convert Whiteboard File

فایل‌های PDF/Office را به تصاویر برای وایت‌برد تبدیل می‌کند.

پیش‌نیاز: libreoffice و mupdf-tools (mutool) باید روی سرور نصب باشند.

Endpoint:

POST /api/convertWhiteboardFile

Request (JSON):

{
  "roomSid": "RM_xxxxxxxxxxxx",
  "roomId": "algebra-class-1402",
  "filePath": "/uploads/document.pdf",
  "userId": "teacher-123"
}

Response (JSON):

{
  "status": true,
  "msg": "file converted successfully",
  "fileName": "document",
  "fileId": "file_xxxxxxxxxxxx",
  "filePath": "/whiteboard/document/",
  "totalPages": 15
}

🔧 Other Services

🔔 Webhook

برای دریافت رویدادهای LiveKit.

Endpoint:

POST /webhook

Headers:

Authorization: <LIVEKIT_WEBHOOK_TOKEN>

Webhook Events:

  • room_started - شروع روم
  • room_finished - پایان روم
  • participant_joined - ورود کاربر
  • participant_left - خروج کاربر
  • track_published - انتشار track
  • track_unpublished - حذف track
  • recording_started - شروع ضبط
  • recording_finished - پایان ضبط
  • و بیشتر...

❤️ Health Check

وضعیت سلامت سرور را بررسی می‌کند.

Endpoint:

GET /healthCheck

Response:

Healthy

سرویس‌های بررسی شده:

  • Database (MySQL/MariaDB)
  • Redis
  • NATS

📥 Download Services

Download Uploaded File

GET /download/uploadedFile/:sid/*

Download Recording

GET /download/recording/:token

Download Analytics

GET /download/analytics/:token

🔄 Compatibility APIs

🟦 BigBlueButton (BBB) Compatibility

Plugnmeet از API های BigBlueButton پشتیبانی می‌کند.

Base Path:

/:apiKey/bigbluebutton/api

Available Endpoints:

  • GET/POST /create - ایجاد جلسه
  • GET/POST /join - ورود به جلسه
  • GET/POST /isMeetingRunning - بررسی فعال بودن
  • GET/POST /getMeetingInfo - اطلاعات جلسه
  • GET/POST /getMeetings - لیست جلسات
  • GET/POST /end - پایان جلسه
  • GET/POST /getRecordings - لیست ضبط‌ها
  • GET/POST /deleteRecordings - حذف ضبط
  • GET/POST /publishRecordings - انتشار ضبط
  • GET/POST /updateRecordings - به‌روزرسانی ضبط

Authentication: نیازمند checksum مطابق استاندارد BBB

Example (BBB Join)

API_KEY="your-api-key"
SECRET="your-secret"
MEETING_ID="test-meeting"
USER_NAME="Ali"

# ساخت query string
QUERY="meetingID=${MEETING_ID}&fullName=${USER_NAME}"

# محاسبه checksum
CHECKSUM=$(echo -n "join${QUERY}${SECRET}" | sha1sum | awk '{print $1}')

# URL نهایی
URL="https://your-domain.com/${API_KEY}/bigbluebutton/api/join?${QUERY}&checksum=${CHECKSUM}"

echo "Join URL: $URL"

🎓 LTI (Learning Tools Interoperability)

برای یکپارچگی با سیستم‌های LMS.

Base Path:

/lti/v1

LTI Landing

POST /lti/v1

LTI API Endpoints

نیازمند هدر Authorization خاص LTI:

  • POST /lti/v1/api/room/join - ورود به روم
  • POST /lti/v1/api/room/isActive - بررسی فعال بودن
  • POST /lti/v1/api/room/end - پایان روم
  • POST /lti/v1/api/recording/fetch - لیست ضبط‌ها
  • POST /lti/v1/api/recording/download - دانلود ضبط
  • POST /lti/v1/api/recording/delete - حذف ضبط

🛠️ SDKs & Tools

Official SDKs

PHP SDK

composer require mynaparrot/plugnmeet-sdk-php
<?php
require 'vendor/autoload.php';

use Mynaparrot\Plugnmeet\Parameters\CreateRoomParameters;
use Mynaparrot\Plugnmeet\PlugNmeet;

$plugnmeet = new PlugNmeet(
    'https://your-domain.com',
    'your-api-key',
    'your-secret'
);

// ایجاد روم
$params = new CreateRoomParameters();
$params->roomId = 'test-room';
$params->metadata->roomTitle = 'کلاس آزمایشی';

$result = $plugnmeet->room->create($params);

JavaScript/Node.js SDK

npm install plugnmeet-sdk-js
const { PlugNmeet } = require('plugnmeet-sdk-js');

const plugnmeet = new PlugNmeet({
  host: 'https://your-domain.com',
  apiKey: 'your-api-key',
  apiSecret: 'your-secret'
});

// ایجاد روم
const result = await plugnmeet.room.create({
  roomId: 'test-room',
  metadata: {
    roomTitle: 'کلاس آزمایشی'
  }
});

// تولید توکن ورود
const token = await plugnmeet.room.getJoinToken({
  roomId: 'test-room',
  userInfo: {
    userId: 'user-123',
    name: 'علی احمدی',
    isAdmin: false
  }
});

Docker Deployment

docker run -d \
  --name plugnmeet-server \
  -p 8080:8080 \
  -v $PWD/config.yaml:/config.yaml \
  mynaparrot/plugnmeet-server \
  --config /config.yaml

📚 Additional Resources

Documentation

Community & Support

Source Code


📝 Notes & Best Practices

Performance Tips

  1. از Redis برای caching استفاده کنید
  2. برای مقیاس‌پذیری از Load Balancer استفاده کنید
  3. ضبط‌ها را در storage خارجی (S3, MinIO) ذخیره کنید
  4. از CDN برای سرویس‌دهی فایل‌های استاتیک استفاده کنید

Security Best Practices

  1. 🔒 HTTPS را فعال کنید (الزامی)
  2. 🔒 apiKey و secret را محرمانه نگه دارید
  3. 🔒 از CORS Policy مناسب استفاده کنید
  4. 🔒 توکن‌ها را با expiration time محدود تولید کنید
  5. 🔒 Webhook signature را همیشه تایید کنید

Rate Limiting

  • /auth endpoints: 100 req/min per IP
  • /api endpoints: 1000 req/min per token
  • File uploads: 10 MB/s per user

🎯 Quick Start Checklist

  • LiveKit Server راه‌اندازی شده
  • Redis نصب و پیکربندی شده
  • MySQL/MariaDB آماده است
  • فایل config.yaml تنظیم شده
  • Plugnmeet Server در حال اجراست
  • Client UI در دسترس است
  • Test meeting ایجاد و تست شده
  • Webhook تنظیم شده (اختیاری)
  • Recording تست شده (اختیاری)

🎉 نسخه و تاریخچه تغییرات

نسخه فعلی مستند: 2.0.0
آخرین به‌روزرسانی: نوامبر 2024

برای مشاهده تاریخچه کامل تغییرات به فایل CHANGELOG.md مراجعه کنید.


ساخته شده با ❤️ توسط MynaParrot

WebsiteGitHubDiscord