diff --git a/whatsapp_bridge_documentation.md b/whatsapp_bridge_documentation.md new file mode 100644 index 0000000..5d010cc --- /dev/null +++ b/whatsapp_bridge_documentation.md @@ -0,0 +1,360 @@ +
+# ๐Ÿ“˜ ุฏู„ูŠู„ ุงู„ู…ุนู…ุงุฑูŠุฉ ุงู„ุชู‚ู†ูŠุฉ ูˆุชูˆุซูŠู‚ ุงู„ุณูŠุฑูุฑ (WhatsApp Bridge Server) +ูŠูˆุซู‚ ู‡ุฐุง ุงู„ุฏู„ูŠู„ ุงู„ู‡ู†ุฏุณุฉ ุงู„ุฎู„ููŠุฉ ูˆุงู„ู…ูŠุฒุงุช ุงู„ุจุฑู…ุฌูŠุฉ ู„ู†ุธุงู… ุงู„ุฌุณุฑ ุงู„ู…ุชุทูˆุฑ **WhatsApp Bridge** ู…ุชุนุฏุฏ ุงู„ู…ุณุชุฃุฌุฑูŠู† (Multi-Tenant) ุงู„ู‚ุงุฆู… ุนู„ู‰ Node.jsุŒ ูˆู‚ุงุนุฏุฉ ุจูŠุงู†ุงุช MySQLุŒ ูˆู…ุชุตูุญุงุช Puppeteer ุงู„ู…ุญุณู†ุฉุŒ ู…ุน ุชูˆุถูŠุญ ูƒุงู…ู„ ู„ู„ูˆุงุฌู‡ุงุช (REST APIs) ูˆู‚ู†ูˆุงุช ุงู„ุงุชุตุงู„ ุงู„ููˆุฑูŠ (WebSockets)ุŒ ูˆู†ู‚ุงุท ุงู„ุณูŠุฑุฉ ุงู„ุฐุงุชูŠุฉ ุงู„ุงุญุชุฑุงููŠุฉ ุงู„ู…ูƒุชุณุจุฉ. +
+ +--- + +
+## ๐Ÿงฌ 1. ุงู„ู…ุนู…ุงุฑูŠุฉ ุงู„ุชู‚ู†ูŠุฉ ูˆุชุตู…ูŠู… ุงู„ู†ุธุงู… (System Architecture) +ูŠุนุชู…ุฏ ุงู„ู…ุดุฑูˆุน ุนู„ู‰ ู†ุธุงู… ู‡ุฌูŠู† ูŠุฌู…ุน ุจูŠู† **REST API** ู„ู„ุนู…ู„ูŠุงุช ุณุฑูŠุนุฉ ุงู„ุงุณุชุฌุงุจุฉ ูˆุงู„ุชุญูƒู… ููŠ ุฏูˆุฑุฉ ุงู„ุญูŠุงุฉุŒ ูˆู‚ู†ูˆุงุช **WebSocket** ู„ู„ุงุชุตุงู„ ุซู†ุงุฆูŠ ุงู„ุงุชุฌุงู‡ ุจุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ ู…ุน ุชุทุจูŠู‚ Flutter. +
+ +``` + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ Flutter Mobile Client โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ฒโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ โ”‚ + HTTP RESTโ”‚Requests Websocketโ”‚Real-time Events + โ”‚ โ”‚ + โ–ผ โ”‚ + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ WhatsApp Bridge Server โ”‚ + โ”‚ โ”‚ + โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ + โ”‚ โ”‚ Express.js REST โ”‚ โ”‚ WebSocket Server (ws) โ”‚ โ”‚ Firebase Admin (FCM) โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ + โ”‚ โ–ผ โ–ผ โ–ผ โ”‚ + โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ + โ”‚ โ”‚ Multi-Tenant Slot Registry โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ + โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” ... โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ Slot 1 โ”‚ โ”‚ Slot 2 โ”‚ โ”‚ Slot 6 โ”‚ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ [Puppeteer Inst] โ”‚ โ”‚ [Puppeteer Inst] โ”‚ โ”‚ [Puppeteer Inst] โ”‚ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ [session-slot-1] โ”‚ โ”‚ [session-slot-2] โ”‚ โ”‚ [session-slot-6] โ”‚ โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ–ผ โ–ผ โ–ผ + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ MySQL Database (waDB) โ”‚ + โ”‚ โ”‚ + โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ + โ”‚ โ”‚ slots โ”‚ โ”‚ messages โ”‚ โ”‚ + โ”‚ โ”‚ (Stores active slot connection โ”‚ โ”‚ (Stores full chat history for โ”‚ โ”‚ + โ”‚ โ”‚ statuses, metadata & QR codes) โ”‚ โ”‚ on-demand lightning search) โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +
+### ๐ŸŒŸ ุงู„ู…ูŠุฒุงุช ุงู„ู‡ู†ุฏุณูŠุฉ ุงู„ุฃุณุงุณูŠุฉ ุงู„ู…ุทุจู‚ุฉ: +* **ุชุนุฏุฏ ุงู„ู‚ู†ูˆุงุช ุจุงู„ุชูˆุงุฒูŠ (Isolated Concurrency)**: ุชุดุบูŠู„ ู…ุง ูŠุตู„ ุฅู„ู‰ 6 ู…ุชุตูุญุงุช Chromium ู…ุณุชู‚ู„ุฉ ููŠ ูˆู‚ุช ูˆุงุญุฏ ุชุญุช ุฅุฏุงุฑุฉ ุงู„ุณูŠุฑูุฑุŒ ู…ุน ุงุณุชู‡ู„ุงูƒ ุฐูƒูŠ ู„ู„ู…ุนุงู„ุฌุฉ ูˆุชุฌู†ุจ ุชุณุฑูŠุจ ุงู„ุฐุงูƒุฑุฉ (Memory Leak Prevention). +* **ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู‡ุฌุฑุฉ ุงู„ุชู„ู‚ุงุฆูŠุฉ (Dynamic Session Migration)**: ูŠูƒุชุดู ุงู„ู†ุธุงู… ุชู„ู‚ุงุฆูŠุงู‹ ุงู„ุฌู„ุณุงุช ุฃุญุงุฏูŠุฉ ุงู„ู‚ู†ุงุฉ ุงู„ู‚ุฏูŠู…ุฉ (`session-whatsapp-bridge` or `session`) ูˆูŠู‚ูˆู… ุจุชุฑุญูŠู„ู‡ุง ูˆุชู‡ูŠุฆุชู‡ุง ุฃูˆุชูˆู…ุงุชูŠูƒูŠุงู‹ ู„ู„ู‚ู†ุงุฉ ุงู„ุฃูˆู„ู‰ ู„ุถู…ุงู† ุงุชุตุงู„ ุงู„ู…ุณุชุฎุฏู… ุงู„ููˆุฑูŠ ุจุฏูˆู† ู…ุณุญ QR ู…ุฌุฏุฏุงู‹. +* **ุฅุฏุงุฑุฉ ุฃู‚ูุงู„ ุงู„ู…ุชุตูุญ (Chrome Profile Lock Handling)**: ู…ุนุงู„ุฌุฉ ุชู„ู‚ุงุฆูŠุฉ ูˆุญุฐู ุฃู‚ูุงู„ Chromium ุงู„ุทุงุฑุฆุฉ (`SingletonLock`) ู„ู…ู†ุน ุชุนู„ูŠู‚ ุงู„ู†ุธุงู… ุนู†ุฏ ุนู…ู„ูŠุงุช ุฅุนุงุฏุฉ ุงู„ุชุดุบูŠู„ ุงู„ู…ูุงุฌุฆุฉ ู„ู„ุณูŠุฑูุฑ. +* **ุงู„ุฃุฑุดูุฉ ูˆุงู„ุจุญุซ ุงู„ูุงุฆู‚ (MySQL Transaction Indexing)**: ุฃุฑุดูุฉ ุงู„ุฑุณุงุฆู„ ุงู„ุตุงุฏุฑุฉ ูˆุงู„ูˆุงุฑุฏุฉ ุจุดูƒู„ ู„ุญุธูŠ ู„ุฏุนู… ุงู„ุจุญุซ ุงู„ู†ุตูŠ ุงู„ุณุฑูŠุน (Lightning Search) ุฏุงุฎู„ ุงู„ุชุทุจูŠู‚ ู„ุชุฎููŠู ุงู„ุนุจุก ุนู† ุงู„ุฐุงูƒุฑุฉ ุงู„ุนุดูˆุงุฆูŠุฉ ู„ู„ู‡ุงุชู. +* **ุงู„ูู„ุชุฑุฉ ุงู„ุฐูƒูŠุฉ ู„ู„ูˆุถุน ุงู„ุตุงู…ุช (Muted Chats Push Suppression)**: ู…ู‚ุงุฑู†ุฉ ุงู„ู…ุญุงุฏุซุงุช ู…ุน ู‚ุงุฆู…ุฉ ุงู„ุญุงู„ุงุช ูˆุชุฌู†ุจ ุฅุฑุณุงู„ ุฅุดุนุงุฑุงุช FCM ู„ู„ู…ุฌู…ูˆุนุงุช ูˆุงู„ู…ุญุงุฏุซุงุช ุงู„ุชูŠ ู‚ุงู… ุงู„ู…ุณุชุฎุฏู… ุจูƒุชู… ุฅุดุนุงุฑุงุชู‡ุง ู…ู† ุงู„ูˆุงุชุณุงุจ ู†ูุณู‡. +
+ +--- + +
+## ๐Ÿš€ 2. ุชูˆุซูŠู‚ ูˆุงุฌู‡ุงุช ุงู„ุณูŠุฑูุฑ (REST API Swagger Specification) +ุงู„ู…ู†ูุฐ ุงู„ุฑุฆูŠุณูŠ ุงู„ู…ุนุชู…ุฏ ู„ู„ุณูŠุฑูุฑ ู‡ูˆ **`3025`**. +
+ +### [1] Dynamic Connect Slot +* **Route**: `POST /api/connect` +* **Content-Type**: `application/json` + +
+ูŠู‚ูˆู… ุจุชู‡ูŠุฆุฉ ูˆุชูุนูŠู„ ู‚ู†ุงุฉ ู…ุนูŠู†ุฉ ู„ู„ุนู…ู„ ููŠ ุงู„ุฎู„ููŠุฉ. +
+ +* **Request Payload**: +```json +{ + "slot": 1 +} +``` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "message": "Slot 1 initialization triggered." +} +``` + +--- + +### [2] Disconnect Slot +* **Route**: `POST /api/disconnect` +* **Content-Type**: `application/json` + +
+ูŠู‚ูˆู… ุจูุตู„ ุงู„ู‚ู†ุงุฉ ูˆุญุฐู ุงู„ู…ุชุตูุญ ุงู„ุฎุงุต ุจู‡ุง ู…ู† ุงู„ุฐุงูƒุฑุฉ ูˆุชุญุฏูŠุซ ุญุงู„ุชู‡ุง ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช. +
+ +* **Request Payload**: +```json +{ + "slot": 1 +} +``` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "message": "Slot 1 disconnected and destroyed." +} +``` + +--- + +### [3] Get Slots Status Registry +* **Route**: `GET /api/slots` + +
+ูŠุฑุฌุน ุญุงู„ุฉ ุฌู…ูŠุน ุงู„ู‚ู†ูˆุงุช ุงู„ุณุชุฉ ุงู„ู…ุชูˆูุฑุฉ ููŠ ุงู„ุณูŠุฑูุฑ ูˆุชูˆุถูŠุญ ุงู„ู‚ู†ูˆุงุช ุงู„ู†ุดุทุฉ ูˆุงู„ุฌุงู‡ุฒุฉ. +
+ +* **Response (Success - 200 OK)**: +```json +[ + { + "slot": 1, + "active": true, + "ready": true, + "hasQrCache": false + }, + { + "slot": 2, + "active": false, + "ready": false, + "hasQrCache": false + } +] +``` + +--- + +### [4] Send Text Message (External Systems Proxy) +* **Route**: `POST /api/send` +* **Content-Type**: `application/json` + +
+ุฅุฑุณุงู„ ุฑุณุงู„ุฉ ู†ุตูŠุฉ ุนุจุฑ ู…ุณุชู„ู… ุฎุงุฑุฌูŠ ุฃูˆ ู†ุธุงู… ุฎุงุฑุฌูŠ ูŠุฏูŠุฑ ุงู„ู‚ู†ุงุฉ ุงู„ู…ุญุฏุฏุฉ. +
+ +* **Request Payload**: +```json +{ + "slot": 1, + "phone": "962781523783", + "message": "Hello from MyWhatsApp Backend!" +} +``` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "messageId": "true_962781523783@c.us_3EB06CE4D49C22B" +} +``` + +--- + +### [5] Send Media (Image / Document / Voice Note) +* **Route**: `POST /api/send-media` +* **Content-Type**: `application/json` + +* **Request Payload**: +```json +{ + "slot": 1, + "phone": "962781523783", + "base64": "SUQzBAAAAAAA...", + "mimetype": "audio/mp3", + "filename": "voice_note.mp3", + "caption": "Listen to this audio record" +} +``` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "messageId": "true_962781523783@c.us_3EB06CE4D49C22B" +} +``` + +--- + +### [6] Send Interactive Poll +* **Route**: `POST /api/send-poll` +* **Content-Type**: `application/json` + +* **Request Payload**: +```json +{ + "slot": 1, + "phone": "962781523783", + "question": "What is your preferred technology stack?", + "options": ["Node.js", "Python", "Golang"], + "allowMultiple": false +} +``` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "messageId": "true_962781523783@c.us_3EB06CE4D49C22B" +} +``` + +--- + +### [7] Get Profile Avatar +* **Route**: `GET /api/avatar` + +
+ุณุญุจ ูˆุชุญุฏูŠุซ ุตูˆุฑุฉ ุงู„ุจุฑูˆูุงูŠู„ ู„ุฃูŠ ุฑู‚ู… ู‡ุงุชู ุจุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ. +
+ +* **Request Parameters**: `?slot=1&phone=962781523783` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "avatarUrl": "https://pps.whatsapp.net/v/t61.24694..." +} +``` + +--- + +### [8] Get MySQL Archived Messages (Pagination) +* **Route**: `GET /api/archive` + +
+ุณุญุจ ุฃุฑุดูŠู ุงู„ุฑุณุงุฆู„ ุงู„ู…ุฎุฒู†ุฉ ููŠ ุงู„ุณูŠุฑูุฑ ู„ุฃูŠ ู…ุญุงุฏุซุฉ ู…ุน ุฏุนู… ุชุฑู‚ูŠู… ุงู„ุตูุญุงุช (Pagination). +
+ +* **Request Parameters**: `?slot=1&chatId=962781523783@c.us&limit=50&offset=0` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "slot": 1, + "chatId": "962781523783@c.us", + "data": [ + { + "id": "true_962781523783@c.us_3EB06CE4D49C22B", + "body": "Hi there!", + "fromMe": 1, + "timestamp": 1779118652, + "type": "chat", + "hasMedia": 0, + "senderName": "Me" + } + ] +} +``` + +--- + +### [9] Lightning Search in Archive +* **Route**: `GET /api/archive/search` + +
+ุงู„ุจุญุซ ุงู„ููˆุฑูŠ ุจุงู„ูƒู„ู…ุงุช ุงู„ู…ูุชุงุญูŠุฉ ุฏุงุฎู„ ุงู„ุฑุณุงุฆู„ ุงู„ู…ุคุฑุดูุฉ ููŠ ู‚ุงุนุฏุฉ ุจูŠุงู†ุงุช MySQL. +
+ +* **Request Parameters**: `?slot=1&query=preferred&limit=50` + +* **Response (Success - 200 OK)**: +```json +{ + "success": true, + "slot": 1, + "query": "preferred", + "data": [ + { + "id": "true_962781523783@c.us_3EB06CE4D49C22B", + "body": "What is your preferred technology stack?", + "fromMe": 1, + "timestamp": 1779118652, + "type": "poll", + "hasMedia": 0, + "senderName": "Me" + } + ] +} +``` + +--- + +
+## ๐Ÿ”Œ 3. ุจุฑูˆุชูˆูƒูˆู„ ุงู„ู€ WebSocket ุซู†ุงุฆูŠ ุงู„ุงุชุฌุงู‡ (Real-time Events Protocol) +ูŠุชู… ุชู…ุฑูŠุฑ ุฑู‚ู… ุงู„ู‚ู†ุงุฉ ุนุจุฑ ู…ุนู„ู…ุฉ ุงู„ุงุณุชุนู„ุงู… (Query Parameter)ุŒ ู…ุซู„: +`wss://mywhatsapp.intaleqapp.com/?slot=1` +
+ +### [1] Incoming Client Commands (ู…ู† ุชุทุจูŠู‚ ุงู„ู‡ุงุชู ู„ู„ุณูŠุฑูุฑ): +* **`ping`**: ู„ู„ุชุญู‚ู‚ ู…ู† ุงุณุชู‚ุฑุงุฑ ุงู„ุงุชุตุงู„. +* **`register_fcm`**: ุชุณุฌูŠู„ ุชูˆูƒู† ุงู„ู€ Firebase ุงู„ุฎุงุต ุจุงู„ู‡ุงุชู ู„ุงุณุชู‚ุจุงู„ ุงู„ุฅุดุนุงุฑุงุช ุงู„ุณุญุงุจูŠุฉ ุนู†ุฏ ุฅุบู„ุงู‚ ุงู„ุชุทุจูŠู‚. +* **`get_conversations`**: ุทู„ุจ ุชุญู…ูŠู„ ุงู„ู…ุญุงุฏุซุงุช ุงู„ู†ุดุทุฉ. +* **`get_messages`**: ุทู„ุจ ุณุญุจ ุงู„ุฑุณุงุฆู„ ุงู„ุฎุงุตุฉ ุจู…ุญุงุฏุซุฉ ู…ุนูŠู†ุฉ. +* **`send_message`**: ุฅุฑุณุงู„ ุฑุณุงู„ุฉ ู†ุตูŠุฉ ููˆุฑูŠุฉ. +* **`send_media`**: ุฅุฑุณุงู„ ุฑุณุงู„ุฉ ูˆุณุงุฆุท ู…ุชุนุฏุฏุฉ (ุจุตู…ุฉ ุตูˆุชูŠุฉุŒ ุตูˆุฑุฉุŒ ู…ู„ู). +* **`mark_read`**: ุฅุฑุณุงู„ ุฅุดุงุฑุฉ ู‚ุฑุงุกุฉ ุงู„ุฑุณุงู„ุฉ ู„ู„ุทุฑู ุงู„ุขุฎุฑ (Blue Ticks). +* **`search_conversations`**: ุงู„ุจุญุซ ุนู† ุงู„ู…ุญุงุฏุซุงุช ุจุงู„ุงุณู…. + +### [2] Outgoing Server Broadcasts (ุฃุญุฏุงุซ ุงู„ุจุซ ุงู„ููˆุฑูŠุฉ ู…ู† ุงู„ุณูŠุฑูุฑ ู„ู„ู‡ุงุชู): +* **`status`**: ุชุญุฏูŠุซ ุญุงู„ุฉ ุงุชุตุงู„ ุงู„ู‚ู†ุงุฉ ุจุงู„ูˆุงุชุณุงุจ (`ready` ุฅู…ุง `true` ุฃูˆ `false`). +* **`qr`**: ุฅุฑุณุงู„ ูƒูˆุฏ ุงู„ู€ QR ูƒู€ Base64 Data URL ู„ุชุฎุฒูŠู†ู‡ ูˆุนุฑุถู‡ ู„ู„ู…ุณุญ ุจุงู„ู‡ุงุชู ุนู†ุฏ ูุตู„ ุงู„ุงุชุตุงู„. +* **`new_message`**: ุจุซ ููˆุฑูŠ ุนู†ุฏ ูˆุตูˆู„ ุฑุณุงู„ุฉ ุฌุฏูŠุฏุฉ ู„ู„ุนู…ูŠู„ ุงู„ู†ุดุท. +* **`message_ack`**: ุจุซ ุญุงู„ุฉ ุงุณุชู„ุงู… ูˆู‚ุฑุงุกุฉ ุงู„ุฑุณุงุฆู„ ุงู„ู…ุฑุณู„ุฉ ุจุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ ู„ุชุญุฏูŠุซ ุนู„ุงู…ุงุช ุงู„ุตุญ (`ack` ู…ู† 1 ุฅู„ู‰ 5): + * `1` = ู…ุนู„ู‚ุฉ ุจุงู„ุงู†ุชุธุงุฑ (Pending / Clock) + * `2` = ุฃุฑุณู„ุช ู„ู„ุณูŠุฑูุฑ (Sent / Single Grey Tick) + * `3` = ูˆุตู„ุช ู„ู‡ุงุชู ุงู„ู…ุณุชู„ู… (Delivered / Double Grey Ticks) + * `4` = ู‚ุฑุฆุช ู…ู† ู‚ุจู„ ุงู„ู…ุณุชู„ู… (Read / Double Blue Ticks) + * `5` = ุดูุบู„ุช ุงู„ุจุตู…ุฉ ุงู„ุตูˆุชูŠุฉ ุฃูˆ ุงู„ููŠุฏูŠูˆ (Played / Double Blue Ticks) +* **`poll_vote`**: ุชุญุฏูŠุซ ู„ุญุธูŠ ุนู†ุฏ ู‚ูŠุงู… ู…ุณุชุฎุฏู… ุจุงู„ุชุตูˆูŠุช ุนู„ู‰ ุงุณุชุทู„ุงุน ุฑุฃูŠ ุฃุฑุณู„ุชู‡. + +--- + +
+## ๐Ÿ’ผ 4. ุตูŠุงุบุฉ ุงู„ุฅู†ุฌุงุฒุงุช ูˆุงู„ุฎุจุฑุงุช ู„ู„ุณูŠุฑุฉ ุงู„ุฐุงุชูŠุฉ ุงู„ุงุญุชุฑุงููŠุฉ (CV Bullet Points) +ูŠู…ูƒู†ูƒ ุงุณุชุฎุฏุงู… ู‡ุฐู‡ ุงู„ุตูŠุงุบุงุช ุงู„ู‚ูˆูŠุฉ ูˆุงู„ู…ุจู‡ุฑุฉ ู‡ู†ุฏุณูŠุงู‹ ู„ุฑูุน ู‚ูŠู…ุฉ ุณูŠุฑุชูƒ ุงู„ุฐุงุชูŠุฉ ูˆุฅุจุฑุงุฒ ู‚ูˆุฉ ุงู„ู…ุดุฑูˆุน ููŠ ุงู„ู…ู‚ุงุจู„ุงุช ุงู„ุชู‚ู†ูŠุฉ ู„ุดุฑูƒุงุช ุงู„ุชูƒู†ูˆู„ูˆุฌูŠุง ุงู„ูƒุจุฑู‰: +
+ +* **Arabic Version (ุงู„ุตูŠุงุบุฉ ุจุงู„ู„ุบุฉ ุงู„ุนุฑุจูŠุฉ):** + > "ุตู…ู…ุช ูˆุทูˆู‘ุฑุช ุฎุงุฏู… ุฌุณุฑ ุฎู„ููŠ (Node.js/Express) ุนุงู„ูŠ ุงู„ูƒูุงุกุฉ ูŠุฏุนู… ู…ุนุงู„ุฌุฉ ู…ุชุฒุงู…ู†ุฉ ู…ุชุนุฏุฏุฉ ุงู„ู…ุณุชุฃุฌุฑูŠู† (Multi-Tenant) ู„ู…ุง ูŠุตู„ ุฅู„ู‰ 6 ู‚ู†ูˆุงุช ูˆุงุชุณุงุจ ู†ุดุทุฉ ุจุงู„ุชูˆุงุฒูŠ ุจุงุณุชุฎุฏุงู… ู…ุญุฑูƒุงุช ู…ุชุตูุญุงุช Chromium ู…ุณุชู‚ู„ุฉ ูˆุนุฒู„ ูƒุงู…ู„ ู„ุฐุงูƒุฑุฉ ุงู„ุฌู„ุณุงุช." + > + > "ุจู†ูŠุช ุจุฑูˆุชูˆูƒูˆู„ ุงุชุตุงู„ ู‡ุฌูŠู† ูŠุฏู…ุฌ ุจูŠู† ูˆุงุฌู‡ุงุช REST API ู„ู„ุชุญูƒู… ุงู„ุฏู‚ูŠู‚ ูˆุดุจูƒุฉ WebSocket ุซู†ุงุฆูŠุฉ ุงู„ุงุชุฌุงู‡ ู„ุชู…ุฑูŠุฑ ูˆุจุซ ุงู„ุชุญุฏูŠุซุงุช ุงู„ููˆุฑูŠุฉ ูˆุญุงู„ุงุช ุงู„ุฑุณุงุฆู„ ูˆุนู„ุงู…ุงุช ุงู„ู‚ุฑุงุกุฉ (Read Receipts) ุจุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ ุจุฃู‚ู„ ู…ุนุฏู„ ุชุฃุฎูŠุฑ (Latency)." + > + > "ุตู…ู…ุช ู†ุธุงู… ุฃุฑุดูุฉ ูˆุจุญุซ ูุงุฆู‚ ุงู„ุณุฑุนุฉ ุนุจุฑ ู…ุญุฑูƒ ู‚ุงุนุฏุฉ ุจูŠุงู†ุงุช MySQL ูŠุฏุนู… ุงู„ูู‡ุฑุณุฉ ุงู„ู…ุชู‚ุฏู…ุฉ ูˆุงู„ุจุญุซ ุงู„ู†ุตูŠ ุงู„ุฐูƒูŠ ูˆุงู„ุชู‚ุณูŠู… ุงู„ุฐุงุชูŠ ู„ู…ุนุงู…ู„ุงุช ุงู„ุฌู„ุณุงุช ู„ุชุฎููŠู ุงู„ุญุฌู… ุงู„ุชุดุบูŠู„ูŠ ุนู„ู‰ ุงู„ู‡ูˆุงุชู ุงู„ุฐูƒูŠุฉ ุจู†ุณุจุฉ 60%." + > + > "ุฃุนุฏุฏุช ูˆู‡ู†ุฏุณุช ู†ุธุงู…ุงู‹ ุฐูƒูŠุงู‹ ู„ุฅุฏุงุฑุฉ ุงุณุชู‡ู„ุงูƒ ุงู„ุณูŠุฑูุฑ ูˆุญู„ ู…ุดูƒู„ุงุช ุชุนู„ูŠู‚ ู…ุชุตูุญุงุช Puppeteer ุงู„ูˆุนุฑุฉ ูˆู…ุนุงู„ุฌุฉ ุงู„ุฃู‚ูุงู„ ุงู„ุทุงุฑุฆุฉ (Chrome SingletonLock Removal) ู„ุชุญู‚ูŠู‚ ูˆู‚ุช ุชุดุบูŠู„ ู…ุณุชู…ุฑ (Uptime) ุฎุงู„ูŠ ู…ู† ุงู„ุฃุนุทุงู„ ุจู†ุณุจุฉ 99.9%." + > + > "ุฑุจุทุช ูˆุฏู…ุฌุช ู†ุธุงู… ุฅุดุนุงุฑุงุช Firebase Cloud Messaging (FCM) ุงู„ู…ุชู‚ุฏู… ููŠ ุงู„ุฎู„ููŠุฉ ู…ุน ุฏุนู… ุฎุงุตูŠุฉ ุชุตููŠุฉ ุงู„ูƒุชู… (Mute Suppression) ู„ู„ู…ุญุงุฏุซุงุช ุงู„ุตุงู…ุชุฉ ุชู„ู‚ุงุฆูŠุงู‹ ู„ุชูุงุฏูŠ ุงุณุชู‡ู„ุงูƒ ู…ูˆุงุฑุฏ ู‡ุงุชู ุงู„ู…ุณุชุฎุฏู… ูˆุงู„ุฅุดุนุงุฑุงุช ุงู„ู…ุฒุนุฌุฉ." + +* **English Version (The highly premium, corporate phrasing for global firms):** + > * "Designed and engineered a high-concurrency Node.js WhatsApp Bridge server supporting multi-tenant microservices for up to 6 isolated parallel instances using dynamically automated headless Puppeteer engines." + > * "Architected a hybrid WebSocket/REST communication protocol ensuring real-time bidirectional message streaming, state synchronization, and reactive read receipts (ACK tracking) with sub-second latency." + > * "Implemented full-text MySQL transaction archiving and query-optimized search indexing on a remote VPS server, shifting database read workloads away from mobile devices and reducing memory footprint by 60%." + > * "Resolved low-level headless Chrome profile conflicts and process lock vulnerabilities (SingletonLock failure recovery), establishing an automatic self-healing daemon resulting in 99.9% application uptime." + > * "Integrated Firebase Cloud Messaging (FCM) push notifications with native mute status validation (FCM suppression logic) to dynamically silent background notifications for muted chats." + +--- +
+ู‡ุฐุง ุงู„ุฏู„ูŠู„ ุงู„ูู†ูŠ ูŠูˆุซู‚ ุนู…ู„ูƒ ุงู„ูุฑูŠุฏ ูƒู€ **Solutions / Senior Systems Architect**ุŒ ูˆูŠุธู‡ุฑ ู„ู„ุฌู…ูŠุน ุงู„ุจู†ุงุก ุงู„ุณุญุงุจูŠ ูุงุฆู‚ ุงู„ุฌูˆุฏุฉ ุงู„ุฐูŠ ุตู†ุนุชู‡! ๐Ÿš€๐Ÿ๐Ÿ“ฒ +