@fazzcode/baileys 0.1.7 → 2.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/LICENSE +21 -0
  2. package/README.MD +1420 -103
  3. package/WAProto/WAProto.proto +5311 -0
  4. package/WAProto/index.js +83385 -119575
  5. package/lib/Defaults/index.js +117 -124
  6. package/lib/KeyDB/BinarySearch.js +20 -0
  7. package/lib/KeyDB/KeyedDB.js +167 -0
  8. package/lib/KeyDB/index.js +4 -0
  9. package/lib/Signal/Group/ciphertext-message.js +12 -14
  10. package/lib/Signal/Group/group-session-builder.js +10 -42
  11. package/lib/Signal/Group/group_cipher.js +75 -87
  12. package/lib/Signal/Group/index.js +13 -57
  13. package/lib/Signal/Group/keyhelper.js +17 -52
  14. package/lib/Signal/Group/sender-chain-key.js +27 -33
  15. package/lib/Signal/Group/sender-key-distribution-message.js +62 -63
  16. package/lib/Signal/Group/sender-key-message.js +65 -66
  17. package/lib/Signal/Group/sender-key-name.js +45 -44
  18. package/lib/Signal/Group/sender-key-record.js +39 -49
  19. package/lib/Signal/Group/sender-key-state.js +80 -93
  20. package/lib/Signal/Group/sender-message-key.js +27 -28
  21. package/lib/Signal/libsignal.js +313 -163
  22. package/lib/Signal/lid-mapping.js +155 -0
  23. package/lib/Socket/Client/index.js +4 -19
  24. package/lib/Socket/Client/types.js +13 -0
  25. package/lib/Socket/Client/websocket.js +52 -0
  26. package/lib/Socket/business.js +359 -242
  27. package/lib/Socket/chats.js +851 -830
  28. package/lib/Socket/communities.js +413 -0
  29. package/lib/Socket/groups.js +304 -309
  30. package/lib/Socket/index.js +15 -9
  31. package/lib/Socket/messages-recv.js +1107 -1054
  32. package/lib/Socket/messages-send.js +709 -414
  33. package/lib/Socket/mex.js +45 -0
  34. package/lib/Socket/newsletter.js +232 -318
  35. package/lib/Socket/socket.js +789 -599
  36. package/lib/Store/index.js +6 -10
  37. package/lib/Store/make-cache-manager-store.js +73 -81
  38. package/lib/Store/make-in-memory-store.js +286 -423
  39. package/lib/Store/make-ordered-dictionary.js +77 -79
  40. package/lib/Store/object-repository.js +24 -26
  41. package/lib/Types/Auth.js +3 -2
  42. package/lib/Types/Bussines.js +3 -0
  43. package/lib/Types/Call.js +3 -2
  44. package/lib/Types/Chat.js +9 -4
  45. package/lib/Types/Contact.js +3 -2
  46. package/lib/Types/Events.js +3 -2
  47. package/lib/Types/GroupMetadata.js +3 -2
  48. package/lib/Types/Label.js +24 -26
  49. package/lib/Types/LabelAssociation.js +6 -8
  50. package/lib/Types/Message.js +12 -9
  51. package/lib/Types/Newsletter.js +31 -30
  52. package/lib/Types/Newsletter.js.bak +33 -0
  53. package/lib/Types/Product.js +3 -2
  54. package/lib/Types/Signal.js +3 -2
  55. package/lib/Types/Socket.js +4 -2
  56. package/lib/Types/State.js +11 -2
  57. package/lib/Types/USync.js +3 -2
  58. package/lib/Types/index.js +27 -41
  59. package/lib/Utils/auth-utils.js +211 -198
  60. package/lib/Utils/baileys-event-stream.js +42 -61
  61. package/lib/Utils/browser-utils.js +25 -0
  62. package/lib/Utils/business.js +213 -214
  63. package/lib/Utils/chat-utils.js +710 -687
  64. package/lib/Utils/crypto.js +112 -133
  65. package/lib/Utils/decode-wa-message.js +252 -183
  66. package/lib/Utils/event-buffer.js +510 -496
  67. package/lib/Utils/generics.js +328 -356
  68. package/lib/Utils/history.js +83 -92
  69. package/lib/Utils/index.js +21 -33
  70. package/lib/Utils/link-preview.js +71 -83
  71. package/lib/Utils/logger.js +5 -7
  72. package/lib/Utils/lt-hash.js +40 -46
  73. package/lib/Utils/make-mutex.js +34 -41
  74. package/lib/Utils/message-retry-manager.js +113 -0
  75. package/lib/Utils/messages-media.js +548 -678
  76. package/lib/Utils/messages.js +352 -249
  77. package/lib/Utils/noise-handler.js +138 -149
  78. package/lib/Utils/pre-key-manager.js +85 -0
  79. package/lib/Utils/process-message.js +323 -303
  80. package/lib/Utils/signal.js +148 -138
  81. package/lib/Utils/use-multi-file-auth-state.js +98 -67
  82. package/lib/Utils/validate-connection.js +183 -188
  83. package/lib/WABinary/constants.js +1298 -35
  84. package/lib/WABinary/decode.js +237 -249
  85. package/lib/WABinary/encode.js +208 -218
  86. package/lib/WABinary/generic-utils.js +53 -57
  87. package/lib/WABinary/index.js +7 -21
  88. package/lib/WABinary/jid-utils.js +89 -58
  89. package/lib/WABinary/types.js +3 -2
  90. package/lib/WAM/BinaryInfo.js +10 -12
  91. package/lib/WAM/constants.js +22851 -15348
  92. package/lib/WAM/encode.js +135 -136
  93. package/lib/WAM/index.js +5 -19
  94. package/lib/WAUSync/Protocols/USyncContactProtocol.js +28 -30
  95. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +49 -53
  96. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -28
  97. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +36 -39
  98. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
  99. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +26 -20
  100. package/lib/WAUSync/Protocols/index.js +6 -20
  101. package/lib/WAUSync/USyncQuery.js +86 -85
  102. package/lib/WAUSync/USyncUser.js +23 -25
  103. package/lib/WAUSync/index.js +5 -19
  104. package/lib/index.js +32 -34
  105. package/package.json +99 -105
  106. package/engine-requirements.js +0 -10
  107. package/lib/Defaults/baileys-version.json +0 -3
  108. package/lib/Defaults/index.d.ts +0 -53
  109. package/lib/Defaults/phonenumber-mcc.json +0 -223
  110. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  111. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  112. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  113. package/lib/Signal/Group/index.d.ts +0 -11
  114. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  115. package/lib/Signal/Group/queue-job.d.ts +0 -1
  116. package/lib/Signal/Group/queue-job.js +0 -57
  117. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  118. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  119. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  120. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  121. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  122. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  123. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  124. package/lib/Signal/libsignal.d.ts +0 -3
  125. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  126. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  127. package/lib/Socket/Client/index.d.ts +0 -3
  128. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  129. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  130. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  131. package/lib/Socket/Client/web-socket-client.js +0 -62
  132. package/lib/Socket/business.d.ts +0 -171
  133. package/lib/Socket/chats.d.ts +0 -80
  134. package/lib/Socket/dugong.d.ts +0 -219
  135. package/lib/Socket/dugong.js +0 -441
  136. package/lib/Socket/groups.d.ts +0 -115
  137. package/lib/Socket/index.d.ts +0 -173
  138. package/lib/Socket/messages-recv.d.ts +0 -161
  139. package/lib/Socket/messages-send.d.ts +0 -149
  140. package/lib/Socket/newsletter.d.ts +0 -134
  141. package/lib/Socket/registration.d.ts +0 -267
  142. package/lib/Socket/registration.js +0 -166
  143. package/lib/Socket/socket.d.ts +0 -43
  144. package/lib/Socket/usync.d.ts +0 -36
  145. package/lib/Socket/usync.js +0 -70
  146. package/lib/Store/index.d.ts +0 -3
  147. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  148. package/lib/Store/make-in-memory-store.d.ts +0 -118
  149. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  150. package/lib/Store/object-repository.d.ts +0 -10
  151. package/lib/Types/Auth.d.ts +0 -110
  152. package/lib/Types/Call.d.ts +0 -13
  153. package/lib/Types/Chat.d.ts +0 -102
  154. package/lib/Types/Contact.d.ts +0 -19
  155. package/lib/Types/Events.d.ts +0 -157
  156. package/lib/Types/GroupMetadata.d.ts +0 -55
  157. package/lib/Types/Label.d.ts +0 -35
  158. package/lib/Types/LabelAssociation.d.ts +0 -29
  159. package/lib/Types/Message.d.ts +0 -273
  160. package/lib/Types/Newsletter.d.ts +0 -92
  161. package/lib/Types/Product.d.ts +0 -78
  162. package/lib/Types/Signal.d.ts +0 -57
  163. package/lib/Types/Socket.d.ts +0 -111
  164. package/lib/Types/State.d.ts +0 -27
  165. package/lib/Types/USync.d.ts +0 -25
  166. package/lib/Types/index.d.ts +0 -57
  167. package/lib/Utils/auth-utils.d.ts +0 -18
  168. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  169. package/lib/Utils/business.d.ts +0 -22
  170. package/lib/Utils/chat-utils.d.ts +0 -71
  171. package/lib/Utils/crypto.d.ts +0 -41
  172. package/lib/Utils/decode-wa-message.d.ts +0 -19
  173. package/lib/Utils/event-buffer.d.ts +0 -35
  174. package/lib/Utils/generics.d.ts +0 -92
  175. package/lib/Utils/history.d.ts +0 -15
  176. package/lib/Utils/index.d.ts +0 -17
  177. package/lib/Utils/link-preview.d.ts +0 -21
  178. package/lib/Utils/logger.d.ts +0 -4
  179. package/lib/Utils/lt-hash.d.ts +0 -12
  180. package/lib/Utils/make-mutex.d.ts +0 -7
  181. package/lib/Utils/messages-media.d.ts +0 -116
  182. package/lib/Utils/messages.d.ts +0 -77
  183. package/lib/Utils/noise-handler.d.ts +0 -21
  184. package/lib/Utils/process-message.d.ts +0 -41
  185. package/lib/Utils/signal.d.ts +0 -32
  186. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  187. package/lib/Utils/validate-connection.d.ts +0 -11
  188. package/lib/WABinary/constants.d.ts +0 -27
  189. package/lib/WABinary/decode.d.ts +0 -7
  190. package/lib/WABinary/encode.d.ts +0 -3
  191. package/lib/WABinary/generic-utils.d.ts +0 -16
  192. package/lib/WABinary/index.d.ts +0 -5
  193. package/lib/WABinary/jid-utils.d.ts +0 -31
  194. package/lib/WABinary/types.d.ts +0 -18
  195. package/lib/WAM/BinaryInfo.d.ts +0 -17
  196. package/lib/WAM/constants.d.ts +0 -38
  197. package/lib/WAM/encode.d.ts +0 -3
  198. package/lib/WAM/index.d.ts +0 -3
  199. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  200. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  201. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  202. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  203. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  204. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  205. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  206. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  207. package/lib/WAUSync/USyncUser.d.ts +0 -12
  208. package/lib/WAUSync/index.d.ts +0 -3
  209. package/lib/index.d.ts +0 -12
package/README.MD CHANGED
@@ -1,121 +1,1438 @@
1
- # 🚀 WhatsApp Baileys
1
+ # 📱 Baileys - WhatsApp WebSocket API untuk Node.js
2
2
 
3
- <p align="center">
4
- <img src="https://raw.githubusercontent.com/FazzCode-Backend/database/refs/heads/main/img/logo/Gemini_Generated_Image_e1100ge1100ge110.jpg" alt="Thumbnail" width="600px" />
5
- </p>
6
-
7
- <p align="center">
8
- <strong>Build powerful WhatsApp automation with ease.</strong><br>
9
- Modded with ❤️ by <b>FazzCode</b>
10
- </p>
3
+ **Baileys** adalah library Node.js yang powerful untuk mengontrol WhatsApp melalui koneksi WebSocket. Library ini memungkinkan Anda membuat bot WhatsApp, mengotomatisasi pesan, dan mengintegrasikan WhatsApp ke aplikasi Anda tanpa perlu aplikasi official WhatsApp.
11
4
 
5
+ ![fazz](https://raw.githubusercontent.com/fazzcodex/database-forme/refs/heads/main/file_0000000057c8720bbacdf1f1a7d5c80b.png)
12
6
  ---
13
7
 
14
- ## 📖 Overview
8
+ ## 📋 Daftar Isi
9
+
10
+ - [Fitur Utama](#fitur-utama)
11
+ - [Requirement](#requirement)
12
+ - [Instalasi](#instalasi)
13
+ - [Quick Start](#quick-start)
14
+ - [Autentikasi](#autentikasi)
15
+ - [Konfigurasi Koneksi](#konfigurasi-koneksi)
16
+ - [Event & Listener](#event--listener)
17
+ - [Mengirim Pesan](#mengirim-pesan)
18
+ - [Manajemen Grup](#manajemen-grup)
19
+ - [Media & File](#media--file)
20
+ - [Error Handling](#error-handling)
21
+ - [Best Practices](#best-practices)
22
+ - [Contoh Implementasi Lengkap](#contoh-implementasi-lengkap)
15
23
 
16
- **WhatsApp Baileys** is an open-source library designed to help developers build automation solutions and integrations with WhatsApp efficiently and directly. Using websocket technology without the need for a browser, this library supports a wide range of features such as message management, chat handling, group administration, as well as interactive messages and action buttons for a more dynamic user experience.
24
+ ---
17
25
 
18
- Actively developed and maintained, baileys continuously receives updates to enhance stability and performance. One of the main focuses is to improve the pairing and authentication processes to be more stable and secure.
26
+ ## Fitur Utama
27
+
28
+ - ✅ **Multi-Device Support** - Support untuk multiple devices/session
29
+ - ✅ **Pesan Teks** - Kirim & terima pesan teks
30
+ - ✅ **Media Support** - Image, Video, Audio, Documents, Stickers
31
+ - ✅ **Group Management** - Create, edit, manage groups
32
+ - ✅ **Status & Stories** - Support untuk WhatsApp Status
33
+ - ✅ **Contact & Chat** - Kelola kontak dan chat
34
+ - ✅ **Message React & Quote** - Reply, quote, react to messages
35
+ - ✅ **Typing Indicator** - Show typing status
36
+ - ✅ **User Status** - Get user online/offline status
37
+ - ✅ **Link Preview** - Generate link preview untuk pesan
19
38
 
20
39
  ---
21
40
 
22
- ## Main Features & Advantages
41
+ ## 🔧 Requirement
23
42
 
24
- * **⚡ Lightweight & Fast:** Built on websocket technology without browser overhead.
25
- * **🔗 Advanced Pairing:** Supports automatic and custom pairing processes with fixed stability.
26
- * **🎨 Rich Media:** Supports interactive messages, action buttons, and dynamic menus.
27
- * **📂 Session Management:** Efficient automatic session management for reliable long-term operation.
28
- * **📱 Multi-Device:** Fully compatible with the latest WhatsApp Multi-Device features.
29
- * **🛠 Developer Friendly:** Comprehensive documentation and example codes for quick integration.
43
+ - **Node.js** >= 20.0.0 (direkomendasikan LTS terbaru)
44
+ - **npm** atau **yarn**
45
+ - **WhatsApp Account** (hanya 1 account per instance)
46
+ - **System Requirements**:
47
+ - Minimum 512MB RAM
48
+ - Koneksi internet yang stabil
49
+ - Port WebSocket terbuka (biasanya port 443)
30
50
 
31
51
  ---
32
52
 
33
- ## 🚀 Getting Started
53
+ ## 📦 Instalasi
34
54
 
35
- Begin by installing the library via your preferred package manager:
55
+ ### Via NPM
36
56
 
37
57
  ```bash
38
58
  npm install @fazzcode/baileys
39
- # or
59
+ ```
60
+
61
+ ### Via Yarn
62
+
63
+ ```bash
40
64
  yarn add @fazzcode/baileys
41
- Then, follow the configuration guide or utilize the ready-made example codes below to start building your stable, tailored WhatsApp solution.🛠 SendMessage Documentation📸 Album Message (Multiple Images)Send multiple images in a single grouped album:JavaScriptawait sock.sendMessage(jid, {
42
- albumMessage: [
43
- { image: cihuy, caption: "Foto pertama" },
44
- { image: { url: "URL IMAGE" }, caption: "Foto kedua" }
45
- ]
46
- }, { quoted: m });
47
- 📅 Event MessageCreate and send official WhatsApp event invitations:JavaScriptawait sock.sendMessage(jid, {
48
- eventMessage: {
49
- isCanceled: false,
50
- name: "Grand Launching",
51
- description: "Join our community event!",
52
- location: { degreesLatitude: 0, degreesLongitude: 0, name: "Jakarta" },
53
- joinLink: "[https://call.whatsapp.com/video/example](https://call.whatsapp.com/video/example)",
54
- startTime: "1763019000",
55
- endTime: "1763026200",
56
- extraGuestsAllowed: false
57
- }
58
- }, { quoted: m });
59
- 📊 Poll Result MessageDisplay live poll results with real-time vote counts:JavaScriptawait sock.sendMessage(jid, {
60
- pollResultMessage: {
61
- name: "Favorite Language",
62
- pollVotes: [
63
- { optionName: "JavaScript", optionVoteCount: "112233" },
64
- { optionName: "TypeScript", optionVoteCount: "1500" }
65
- ]
66
- }
67
- }, { quoted: m });
68
- 🔘 Interactive Message (CTA Copy)Basic interactive messages with a "Click to Copy" functionality:JavaScriptawait sock.sendMessage(jid, {
69
- interactiveMessage: {
70
- title: "Voucher Code",
71
- footer: "Powered by FazzCode",
72
- buttons: [
73
- {
74
- name: "cta_copy",
75
- buttonParamsJson: JSON.stringify({
76
- display_text: "Copy Promo Code",
77
- id: "promo-123",
78
- copy_code: "FAZZCODE2026"
79
- })
80
- }
81
- ]
82
- }
83
- }, { quoted: m });
84
- 🔗 Product & CatalogSend professional product previews with direct CTA buttons:JavaScriptawait sock.sendMessage(jid, {
85
- productMessage: {
86
- title: "Exclusive Bot Script",
87
- description: "Full feature automation script",
88
- thumbnail: { url: "[https://example.com/thumb.jpg](https://example.com/thumb.jpg)" },
89
- productId: "PROD001",
90
- priceAmount1000: 50000,
91
- currencyCode: "IDR",
92
- buttons: [
93
- {
94
- name: "cta_url",
95
- buttonParamsJson: JSON.stringify({
96
- display_text: "Buy Now",
97
- url: "[https://fazzcodex.web.id"
98
- })
99
- }
100
- ]
101
- }
102
- }, { quoted: m });
103
- 📄 Document Message (Buffer)Note: Documents only support buffer input.JavaScriptawait sock.sendMessage(jid, {
104
- interactiveMessage: {
105
- title: "Project Documentation",
106
- footer: "telegram: @fazzcode",
107
- document: fs.readFileSync("./manual.pdf"),
108
- mimetype: "application/pdf",
109
- fileName: "Manual_Book.pdf",
110
- buttons: [
111
- {
112
- name: "cta_url",
113
- buttonParamsJson: JSON.stringify({
114
- display_text: "Support Channel",
115
- url: "[https://t.me/fazzcode"
116
- })
117
- }
118
- ]
119
- }
120
- }, { quoted: m });
121
- 💡 Why Choose This Library?FeatureBenefitHigh StabilityMinimized disconnection issues.Custom PairingMore secure and reliable authentication.Modern APISupports Interactive Buttons, Native Flow, and Polls.Active SupportContinually updated for latest WA versions.📝 Technical NotesSupports custom pairing codes for headless environments.Efficient automatic session management for 24/7 uptime.Perfect for building Customer Service Bots, Notification Systems, and AI Integrations.<p align="center"><b>Thank you for choosing WhatsApp Baileys!</b>Maintenance and updates by <a href="https://www.google.com/search?q=https://github.com/fazzcodex">@FazzCode</a></p>
65
+ ```
66
+
67
+ ### Dependency Tambahan (Optional)
68
+
69
+ ```bash
70
+ # Untuk link preview
71
+ npm install link-preview-js
72
+
73
+ # Untuk image processing
74
+ npm install jimp@latest
75
+
76
+ # Untuk audio processing
77
+ npm install audio-decode
78
+
79
+ # Logging
80
+ npm install pino
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Quick Start
86
+
87
+ Berikut adalah contoh paling sederhana untuk memulai bot WhatsApp:
88
+
89
+ ```javascript
90
+ import makeWASocket, {
91
+ DisconnectReason,
92
+ useMultiFileAuthState
93
+ } from '@fazzcode/baileys';
94
+ import { Boom } from '@hapi/boom';
95
+
96
+ const startBot = async () => {
97
+ // Setup authentication state
98
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info');
99
+
100
+ const sock = makeWASocket({
101
+ auth: state,
102
+ printQRInTerminal: true
103
+ });
104
+
105
+ // Save credentials after every connection update
106
+ sock.ev.on('creds.update', saveCreds);
107
+
108
+ // Handle connection events
109
+ sock.ev.on('connection.update', async (update) => {
110
+ const { connection, lastDisconnect, qr } = update;
111
+
112
+ if (qr) {
113
+ console.log('📱 Scan QR code di atas dengan WhatsApp Anda');
114
+ }
115
+
116
+ if (connection === 'open') {
117
+ console.log('✅ Bot terhubung dengan WhatsApp');
118
+ }
119
+
120
+ if (connection === 'close') {
121
+ const shouldReconnect =
122
+ (lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut;
123
+ if (shouldReconnect) {
124
+ startBot();
125
+ }
126
+ }
127
+ });
128
+
129
+ // Handle incoming messages
130
+ sock.ev.on('messages.upsert', async (m) => {
131
+ for (const msg of m.messages) {
132
+ if (!msg.message) continue; // Skip empty messages
133
+
134
+ const text = msg.message.conversation ||
135
+ msg.message.extendedTextMessage?.text || '';
136
+
137
+ console.log(`📬 Pesan dari ${msg.key.remoteJid}: ${text}`);
138
+
139
+ // Auto reply
140
+ await sock.sendMessage(msg.key.remoteJid, {
141
+ text: 'Terima kasih pesan Anda! Bot sedang belajar.'
142
+ });
143
+ }
144
+ });
145
+ };
146
+
147
+ startBot().catch(console.error);
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 🔐 Autentikasi
153
+
154
+ ### 1. Multi-File Auth State (Recommended)
155
+
156
+ Menyimpan kredensial dalam multiple file untuk keamanan lebih baik:
157
+
158
+ ```javascript
159
+ import { useMultiFileAuthState } from '@fazzcode/baileys';
160
+
161
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info');
162
+
163
+ // Structure folder:
164
+ // auth_info/
165
+ // ├── creds.json (main credentials)
166
+ // ├── sessions.json
167
+ // ├── pre-keys.json
168
+ // └── app-state-sync-key-*.json
169
+ ```
170
+
171
+ **File yang Generated:**
172
+
173
+ ```
174
+ auth_info/
175
+ ├── creds.json # Main credentials & connection info
176
+ ├── sessions.json # Device sessions
177
+ ├── app-state-sync-key-{id}.json # Session keys untuk sync
178
+ └── pre-keys.json # Pre-encryption keys
179
+ ```
180
+
181
+ ### 2. Pairing Code
182
+
183
+ Untuk WhatsApp Business, gunakan pairing code instead of QR:
184
+
185
+ ```javascript
186
+ import makeWASocket from '@fazzcode/baileys';
187
+
188
+ const sock = makeWASocket({
189
+ auth: state,
190
+ method: 'phone-number' // Request pairing code
191
+ });
192
+
193
+ // **IMPORTANT**: Pairing code harus di-request IMMEDIATELY setelah makeWASocket
194
+ // dengan delay minimal 1.5 detik untuk WhatsApp Business compatibility
195
+ sock.ev.on('connection.update', async (update) => {
196
+ if (update.receivedPairingCode) {
197
+ console.log('🔐 Pairing Code:', update.pairingCode);
198
+ }
199
+ });
200
+ ```
201
+
202
+ ### 3. Save & Load Credentials
203
+
204
+ ```javascript
205
+ // Load existing credentials
206
+ const loadCreds = async () => {
207
+ try {
208
+ const creds = JSON.parse(
209
+ fs.readFileSync('auth_info/creds.json', 'utf-8')
210
+ );
211
+ return creds;
212
+ } catch (error) {
213
+ console.log('Credentials not found, starting fresh');
214
+ return null;
215
+ }
216
+ };
217
+
218
+ // Save credentials after update
219
+ sock.ev.on('creds.update', () => {
220
+ saveCreds();
221
+ console.log('✅ Credentials saved');
222
+ });
223
+ ```
224
+
225
+ ---
226
+
227
+ ## ⚙️ Konfigurasi Koneksi
228
+
229
+ ### Default Configuration
230
+
231
+ ```javascript
232
+ const sock = makeWASocket({
233
+ // ===== AUTHENTICATION =====
234
+ auth: state,
235
+ printQRInTerminal: true,
236
+
237
+ // ===== BROWSER SETTINGS =====
238
+ browser: ['Ubuntu', 'Chrome', '20.0.04'], // ⭐ Important untuk stability
239
+
240
+ // ===== CONNECTION SETTINGS =====
241
+ connectTimeoutMs: 20000, // Timeout untuk koneksi (ms)
242
+ keepAliveIntervalMs: 30000, // Keep-alive interval (ms)
243
+ waWebSocketUrl: 'wss://web.whatsapp.com/ws/chat',
244
+
245
+ // ===== MESSAGE SETTINGS =====
246
+ markOnlineOnConnect: true, // Mark as online when connected
247
+ emitOwnEvents: true, // Emit own messages as events
248
+ maxMsgRetryCount: 5, // Max retry untuk gagal kirim
249
+
250
+ // ===== SYNC SETTINGS =====
251
+ syncFullHistory: true, // Sync full chat history
252
+ shouldSyncHistoryMessage: () => true,
253
+
254
+ // ===== QUERY & TIMEOUT =====
255
+ defaultQueryTimeoutMs: 60000, // Default query timeout
256
+ fireInitQueries: true, // Fire initial queries
257
+
258
+ // ===== OTHER =====
259
+ countryCode: 'US', // Country code
260
+ linkPreviewImageThumbnailWidth: 192, // Link preview width
261
+ enableAutoSessionRecreation: true,
262
+ enableRecentMessageCache: true
263
+ });
264
+ ```
265
+
266
+ ### Custom Configuration Example
267
+
268
+ ```javascript
269
+ import { Browsers } from '@fazzcode/baileys';
270
+
271
+ const customConfig = {
272
+ auth: state,
273
+ printQRInTerminal: false, // Disable QR di terminal
274
+
275
+ // Use different browser profile untuk bypass detection
276
+ browser: Browsers.macOS('Safari'), // Safari on macOS
277
+ // atau
278
+ // browser: Browsers.windows('Chrome'), // Chrome on Windows
279
+ // browser: Browsers.iOS('Safari'), // iPhone Safari
280
+
281
+ // Custom logger
282
+ logger: customLogger.child({ module: 'whatsapp' }),
283
+
284
+ // Message patches
285
+ patchMessageBeforeSending: (msg) => {
286
+ // Modify message sebelum dikirim
287
+ msg.timestamp = Date.now();
288
+ return msg;
289
+ },
290
+
291
+ // Ignore certain JIDs
292
+ shouldIgnoreJid: (jid) => {
293
+ return jid.includes('status@broadcast');
294
+ },
295
+
296
+ // Custom message retrieval
297
+ getMessage: async (key) => {
298
+ // Fetch message dari database
299
+ return await db.getMessage(key);
300
+ },
301
+
302
+ // Custom group metadata
303
+ cachedGroupMetadata: async (jid) => {
304
+ return await db.getGroupInfo(jid);
305
+ }
306
+ };
307
+
308
+ const sock = makeWASocket(customConfig);
309
+ ```
310
+
311
+ ---
312
+
313
+ ## 📡 Event & Listener
314
+
315
+ ### Connection Events
316
+
317
+ ```javascript
318
+ sock.ev.on('connection.update', (update) => {
319
+ const {
320
+ connection, // Connection status
321
+ lastDisconnect, // Last disconnect info
322
+ isNewLogin, // Is new login?
323
+ qr, // QR code
324
+ receivedPairingCode // Received pairing code?
325
+ } = update;
326
+
327
+ console.log('Connection Update:', {
328
+ connection,
329
+ lastDisconnect,
330
+ isNewLogin
331
+ });
332
+
333
+ if (connection === 'open') {
334
+ console.log('✅ Connected');
335
+ } else if (connection === 'close') {
336
+ console.log('❌ Disconnected');
337
+
338
+ // Check disconnect reason
339
+ const reason = lastDisconnect?.error?.output?.statusCode;
340
+ if (reason === DisconnectReason.loggedOut) {
341
+ console.log('👤 Logout by user');
342
+ } else if (reason === DisconnectReason.connectionClosed) {
343
+ console.log('🔌 Connection closed');
344
+ }
345
+ }
346
+ });
347
+ ```
348
+
349
+ ### Message Events
350
+
351
+ ```javascript
352
+ // Incoming & Outgoing Messages
353
+ sock.ev.on('messages.upsert', async ({ messages, type }) => {
354
+ for (const msg of messages) {
355
+ const {
356
+ key, // Message key (remoteJid, fromMe, id, etc)
357
+ message, // Message content
358
+ messageTimestamp,
359
+ status, // Message status (pending, sent, delivered, read)
360
+ participant // For groups: who sent it
361
+ } = msg;
362
+
363
+ // Message type
364
+ if (type === 'notify') {
365
+ console.log('📬 New message received');
366
+ } else if (type === 'append') {
367
+ console.log('📝 Message appended');
368
+ }
369
+ }
370
+ });
371
+
372
+ // Message reactions
373
+ sock.ev.on('messages.reaction', async (reactions) => {
374
+ for (const reaction of reactions) {
375
+ console.log('👍 Reaction:', reaction);
376
+ }
377
+ });
378
+ ```
379
+
380
+ ### Chat Events
381
+
382
+ ```javascript
383
+ sock.ev.on('chats.set', (chats) => {
384
+ console.log(`📚 Loaded ${chats.length} chats`);
385
+ });
386
+
387
+ sock.ev.on('chats.update', (chats) => {
388
+ for (const chat of chats) {
389
+ console.log(`Chat updated: ${chat.name}`);
390
+ }
391
+ });
392
+
393
+ sock.ev.on('chats.delete', (keys) => {
394
+ console.log(`🗑️ ${keys.length} chats deleted`);
395
+ });
396
+ ```
397
+
398
+ ### Group Events
399
+
400
+ ```javascript
401
+ sock.ev.on('groups.update', (updates) => {
402
+ for (const update of updates) {
403
+ console.log('👥 Group updated:', update);
404
+ }
405
+ });
406
+
407
+ sock.ev.on('group-participants.update', (update) => {
408
+ const { id, participants, action } = update;
409
+ console.log(`Participant ${action} in ${id}:`, participants);
410
+ });
411
+ ```
412
+
413
+ ### Contact Events
414
+
415
+ ```javascript
416
+ sock.ev.on('contacts.set', (contacts) => {
417
+ console.log(`📇 Loaded ${contacts.length} contacts`);
418
+ });
419
+
420
+ sock.ev.on('contacts.upsert', (contacts) => {
421
+ console.log('Contacts updated:', contacts);
422
+ });
423
+ ```
424
+
425
+ ### Status & Presence
426
+
427
+ ```javascript
428
+ sock.ev.on('presence.update', (presences) => {
429
+ for (const [jid, presence] of Object.entries(presences)) {
430
+ // last_seen: timestamp kapan last online
431
+ // online: true/false
432
+ console.log(`${jid}: ${presence.lastSeen ? 'Online' : 'Offline'}`);
433
+ }
434
+ });
435
+ ```
436
+
437
+ ### Credentials Update
438
+
439
+ ```javascript
440
+ sock.ev.on('creds.update', () => {
441
+ saveCreds();
442
+ console.log('🔐 Credentials updated');
443
+ });
444
+ ```
445
+
446
+ ---
447
+
448
+ ## 💬 Mengirim Pesan
449
+
450
+ ### 1. Pesan Teks
451
+
452
+ ```javascript
453
+ // Simple text message
454
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
455
+ text: 'Halo, ini pesan dari bot!'
456
+ });
457
+
458
+ // Extended text message (dengan formatting)
459
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
460
+ text: 'Pesan dengan *bold* dan _italic_',
461
+ // WhatsApp support formatting terbatas
462
+ });
463
+ ```
464
+
465
+ ### 2. Format JID (Jabber ID)
466
+
467
+ ```javascript
468
+ // Personal chat
469
+ const jid1 = '6281234567890@s.whatsapp.net';
470
+
471
+ // Group chat
472
+ const jid2 = '120363023179xxxxxx-1234567890@g.us';
473
+
474
+ // Status/Broadcast
475
+ const jid3 = 'status@broadcast';
476
+
477
+ // Function untuk convert no telepon ke JID
478
+ const phoneToJid = (phone) => {
479
+ let cleaned = phone.replace(/\D/g, '');
480
+ if (!cleaned.startsWith('62')) {
481
+ cleaned = '62' + cleaned.substring(1);
482
+ }
483
+ return `${cleaned}@s.whatsapp.net`;
484
+ };
485
+ ```
486
+
487
+ ### 3. Pesan dengan Mention
488
+
489
+ ```javascript
490
+ await sock.sendMessage('120363023179xxxxxx-1234567890@g.us', {
491
+ text: 'Halo @6281234567890 dan @6289876543210',
492
+ mentions: ['6281234567890@s.whatsapp.net', '6289876543210@s.whatsapp.net']
493
+ });
494
+ ```
495
+
496
+ ### 4. Pesan dengan Quote/Reply
497
+
498
+ ```javascript
499
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
500
+ text: 'Ini adalah reply',
501
+ quoted: msg // msg dari messages.upsert event
502
+ });
503
+ ```
504
+
505
+ ### 5. Pesan dengan Reaction/Emoji
506
+
507
+ ```javascript
508
+ await sock.sendMessage(msg.key.remoteJid, {
509
+ react: {
510
+ text: '😂', // Emoji reaction
511
+ key: msg.key
512
+ }
513
+ });
514
+ ```
515
+
516
+ ### 6. Pesan Template/Button
517
+
518
+ ```javascript
519
+ // Template message dengan buttons
520
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
521
+ templateButtons: [
522
+ {
523
+ index: 1,
524
+ urlButton: {
525
+ displayText: 'Visit Website',
526
+ url: 'https://example.com'
527
+ }
528
+ },
529
+ {
530
+ index: 2,
531
+ callButton: {
532
+ displayText: 'Call Me',
533
+ phoneNumber: '+6281234567890'
534
+ }
535
+ },
536
+ {
537
+ index: 3,
538
+ quickReplyButton: {
539
+ displayText: 'Reply Quick',
540
+ id: 'quick_reply_1'
541
+ }
542
+ }
543
+ ],
544
+ body: 'Pilih salah satu opsi di bawah'
545
+ });
546
+ ```
547
+
548
+ ### 7. Pesan dengan Link Preview
549
+
550
+ ```javascript
551
+ // Kirim link dengan preview
552
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
553
+ text: 'Check this out: https://github.com/WhiskeySockets/Baileys',
554
+ linkPreview: true // Generate preview otomatis
555
+ });
556
+
557
+ // Atau custom link preview
558
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
559
+ text: 'https://example.com',
560
+ linkPreview: {
561
+ title: 'Example Website',
562
+ description: 'This is an example',
563
+ jpegThumbnail: Buffer.from('...') // Image buffer
564
+ }
565
+ });
566
+ ```
567
+
568
+ ### 8. Typing Indicator
569
+
570
+ ```javascript
571
+ // Show typing status
572
+ await sock.presenceSubscribe('6281234567890@s.whatsapp.net');
573
+ await sock.sendPresenceUpdate('typing', '6281234567890@s.whatsapp.net');
574
+
575
+ // After finishing, send 'available'
576
+ setTimeout(() => {
577
+ sock.sendPresenceUpdate('available', '6281234567890@s.whatsapp.net');
578
+ }, 3000);
579
+ ```
580
+
581
+ ---
582
+
583
+ ## 🖼️ Media & File
584
+
585
+ ### 1. Mengirim Gambar
586
+
587
+ ```javascript
588
+ import fs from 'fs';
589
+
590
+ // From local file
591
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
592
+ image: fs.readFileSync('path/to/image.jpg'),
593
+ caption: 'Ini adalah caption untuk gambar'
594
+ });
595
+
596
+ // From URL
597
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
598
+ image: { url: 'https://example.com/image.jpg' },
599
+ caption: 'Gambar dari URL'
600
+ });
601
+
602
+ // From Buffer
603
+ const imageBuffer = Buffer.from(imageData);
604
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
605
+ image: imageBuffer,
606
+ caption: 'Gambar dari buffer'
607
+ });
608
+ ```
609
+
610
+ ### 2. Mengirim Video
611
+
612
+ ```javascript
613
+ // Local video
614
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
615
+ video: fs.readFileSync('path/to/video.mp4'),
616
+ caption: 'Ini adalah video',
617
+ gifPlayback: false // Set true untuk video loop
618
+ });
619
+
620
+ // Video dari URL
621
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
622
+ video: { url: 'https://example.com/video.mp4' },
623
+ caption: 'Video dari URL'
624
+ });
625
+ ```
626
+
627
+ ### 3. Mengirim Audio
628
+
629
+ ```javascript
630
+ // Audio/Musik
631
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
632
+ audio: fs.readFileSync('path/to/audio.mp3'),
633
+ mimetype: 'audio/mpeg',
634
+ ptt: false // Set true untuk voice note
635
+ });
636
+
637
+ // Voice Note (PTT)
638
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
639
+ audio: fs.readFileSync('path/to/voice.ogg'),
640
+ mimetype: 'audio/ogg; codecs=opus',
641
+ ptt: true // Mark sebagai voice note
642
+ });
643
+ ```
644
+
645
+ ### 4. Mengirim Document/File
646
+
647
+ ```javascript
648
+ // Document
649
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
650
+ document: fs.readFileSync('path/to/document.pdf'),
651
+ mimetype: 'application/pdf',
652
+ fileName: 'My Document.pdf'
653
+ });
654
+
655
+ // Text file
656
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
657
+ document: Buffer.from('File content here'),
658
+ mimetype: 'text/plain',
659
+ fileName: 'text.txt'
660
+ });
661
+ ```
662
+
663
+ ### 5. Mengirim Sticker
664
+
665
+ ```javascript
666
+ // Sticker dari file
667
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
668
+ sticker: fs.readFileSync('path/to/sticker.webp'),
669
+ pack: 'My Bot', // Sticker pack name
670
+ author: 'FazzCode', // Sticker author
671
+ categories: ['😀', '👍'] // Sticker categories
672
+ });
673
+
674
+ // Sticker dari URL
675
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
676
+ sticker: { url: 'https://example.com/sticker.webp' },
677
+ pack: 'My Bot',
678
+ author: 'FazzCode'
679
+ });
680
+ ```
681
+
682
+ ### 6. Mengirim Kontak
683
+
684
+ ```javascript
685
+ // Send contact
686
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
687
+ contacts: {
688
+ displayName: 'My Contact',
689
+ contacts: [
690
+ {
691
+ vcard: `BEGIN:VCARD\nVERSION:3.0\nFN:John Doe\nTEL;type=CELL;type=VOICE;waid=6281234567890:+62 812 3456 7890\nEND:VCARD`
692
+ }
693
+ ]
694
+ }
695
+ });
696
+ ```
697
+
698
+ ### 7. Mengirim Location
699
+
700
+ ```javascript
701
+ // Send location
702
+ await sock.sendMessage('6281234567890@s.whatsapp.net', {
703
+ location: {
704
+ degreesLatitude: -6.2088,
705
+ degreesLongitude: 106.8456,
706
+ name: 'Jakarta, Indonesia',
707
+ address: 'Jalan Sudirman'
708
+ }
709
+ });
710
+ ```
711
+
712
+ ### 8. Mengunduh Media dari Pesan
713
+
714
+ ```javascript
715
+ import { downloadMediaMessage } from '@fazzcode/baileys';
716
+
717
+ sock.ev.on('messages.upsert', async ({ messages }) => {
718
+ for (const msg of messages) {
719
+ const messageType = Object.keys(msg.message || {})[0];
720
+
721
+ if (messageType === 'imageMessage' ||
722
+ messageType === 'videoMessage' ||
723
+ messageType === 'audioMessage' ||
724
+ messageType === 'documentMessage') {
725
+
726
+ try {
727
+ const buffer = await downloadMediaMessage(
728
+ msg,
729
+ 'buffer', // Download type: buffer, stream, filename
730
+ {},
731
+ {
732
+ logger,
733
+ reuploadRequest: sock.updateMediaMessage
734
+ }
735
+ );
736
+
737
+ // Save to file
738
+ fs.writeFileSync(`downloaded_media`, buffer);
739
+ console.log('✅ Media downloaded');
740
+ } catch (error) {
741
+ console.error('❌ Download failed:', error);
742
+ }
743
+ }
744
+ }
745
+ });
746
+ ```
747
+
748
+ ---
749
+
750
+ ## 👥 Manajemen Grup
751
+
752
+ ### 1. Create Group
753
+
754
+ ```javascript
755
+ // Create new group
756
+ const groupInfo = await sock.groupCreate(
757
+ 'Group Name', // Group name
758
+ [
759
+ '6281234567890@s.whatsapp.net',
760
+ '6289876543210@s.whatsapp.net'
761
+ ], // Participants
762
+ 'Group description' // Description (optional)
763
+ );
764
+
765
+ console.log('✅ Group created:', groupInfo.gid);
766
+ ```
767
+
768
+ ### 2. Join/Leave Group
769
+
770
+ ```javascript
771
+ // Leave group
772
+ await sock.groupLeave('120363023179xxxxxx-1234567890@g.us');
773
+
774
+ // Accept group invite (automatic on response)
775
+ // Note: Untuk join melalui link, gunakan invite code
776
+ await sock.groupAcceptInvite('invite-code');
777
+ ```
778
+
779
+ ### 3. Kelola Anggota
780
+
781
+ ```javascript
782
+ // Add members
783
+ await sock.groupParticipantsUpdate(
784
+ '120363023179xxxxxx-1234567890@g.us',
785
+ ['6281234567890@s.whatsapp.net'],
786
+ 'add'
787
+ );
788
+
789
+ // Remove members
790
+ await sock.groupParticipantsUpdate(
791
+ '120363023179xxxxxx-1234567890@g.us',
792
+ ['6281234567890@s.whatsapp.net'],
793
+ 'remove'
794
+ );
795
+
796
+ // Promote to admin
797
+ await sock.groupParticipantsUpdate(
798
+ '120363023179xxxxxx-1234567890@g.us',
799
+ ['6281234567890@s.whatsapp.net'],
800
+ 'promote'
801
+ );
802
+
803
+ // Demote admin
804
+ await sock.groupParticipantsUpdate(
805
+ '120363023179xxxxxx-1234567890@g.us',
806
+ ['6281234567890@s.whatsapp.net'],
807
+ 'demote'
808
+ );
809
+ ```
810
+
811
+ ### 4. Update Group Info
812
+
813
+ ```javascript
814
+ // Update group subject (name)
815
+ await sock.groupUpdateSubject(
816
+ '120363023179xxxxxx-1234567890@g.us',
817
+ 'New Group Name'
818
+ );
819
+
820
+ // Update group description
821
+ await sock.groupUpdateDescription(
822
+ '120363023179xxxxxx-1234567890@g.us',
823
+ 'New group description'
824
+ );
825
+
826
+ // Update group icon
827
+ await sock.updateGroupPicture(
828
+ '120363023179xxxxxx-1234567890@g.us',
829
+ fs.readFileSync('path/to/image.jpg')
830
+ );
831
+
832
+ // Update group settings
833
+ await sock.groupSettingUpdate(
834
+ '120363023179xxxxxx-1234567890@g.us',
835
+ 'announcement' // Only admins can send messages
836
+ );
837
+
838
+ // Reset invite link
839
+ await sock.groupInviteCode('120363023179xxxxxx-1234567890@g.us');
840
+ ```
841
+
842
+ ### 5. Get Group Info
843
+
844
+ ```javascript
845
+ // Get group metadata
846
+ const metadata = await sock.groupMetadata(
847
+ '120363023179xxxxxx-1234567890@g.us'
848
+ );
849
+
850
+ console.log({
851
+ name: metadata.subject,
852
+ description: metadata.desc,
853
+ participants: metadata.participants.length,
854
+ admins: metadata.participants.filter(p => p.admin).map(p => p.id),
855
+ owner: metadata.owner,
856
+ created: new Date(metadata.creation * 1000)
857
+ });
858
+ ```
859
+
860
+ ### 6. Kelola Group Admin
861
+
862
+ ```javascript
863
+ // Grant admin role
864
+ await sock.groupParticipantsUpdate(
865
+ '120363023179xxxxxx-1234567890@g.us',
866
+ ['6281234567890@s.whatsapp.net'],
867
+ 'promote'
868
+ );
869
+
870
+ // Remove admin role
871
+ await sock.groupParticipantsUpdate(
872
+ '120363023179xxxxxx-1234567890@g.us',
873
+ ['6281234567890@s.whatsapp.net'],
874
+ 'demote'
875
+ );
876
+ ```
877
+
878
+ ---
879
+
880
+ ## ⚠️ Error Handling
881
+
882
+ ### Basic Error Handling
883
+
884
+ ```javascript
885
+ import Boom from '@hapi/boom';
886
+
887
+ sock.ev.on('connection.update', (update) => {
888
+ const { connection, lastDisconnect } = update;
889
+
890
+ if (connection === 'close') {
891
+ const error = lastDisconnect?.error;
892
+
893
+ if (error instanceof Boom) {
894
+ const statusCode = error.output.statusCode;
895
+
896
+ switch (statusCode) {
897
+ case 401: // Unauthorized
898
+ console.log('❌ Login failed');
899
+ break;
900
+ case 408: // Connection lost
901
+ console.log('🔌 Connection lost, reconnecting...');
902
+ startBot();
903
+ break;
904
+ case 411: // Multi-device mismatch
905
+ console.log('⚠️ Multi-device mismatch');
906
+ break;
907
+ case 503: // Service unavailable
908
+ console.log('🔧 WhatsApp service unavailable');
909
+ break;
910
+ default:
911
+ console.log(`Unknown error: ${statusCode}`);
912
+ }
913
+ }
914
+ }
915
+ });
916
+ ```
917
+
918
+ ### Message Sending Error
919
+
920
+ ```javascript
921
+ const sendMessageSafe = async (jid, content) => {
922
+ try {
923
+ const result = await sock.sendMessage(jid, content);
924
+ console.log('✅ Message sent');
925
+ return result;
926
+ } catch (error) {
927
+ console.error('❌ Send failed:', error.message);
928
+
929
+ if (error.message.includes('401')) {
930
+ console.log('Re-login required');
931
+ } else if (error.message.includes('rate limited')) {
932
+ console.log('⏱️ Rate limited, retrying later...');
933
+ // Implement exponential backoff
934
+ }
935
+
936
+ return null;
937
+ }
938
+ };
939
+ ```
940
+
941
+ ### Retry Logic dengan Exponential Backoff
942
+
943
+ ```javascript
944
+ const sendMessageWithRetry = async (jid, content, maxRetries = 3) => {
945
+ for (let i = 0; i < maxRetries; i++) {
946
+ try {
947
+ return await sock.sendMessage(jid, content);
948
+ } catch (error) {
949
+ const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
950
+
951
+ if (i < maxRetries - 1) {
952
+ console.log(`Retry ${i + 1}/${maxRetries} after ${delay}ms`);
953
+ await new Promise(resolve => setTimeout(resolve, delay));
954
+ } else {
955
+ throw error;
956
+ }
957
+ }
958
+ }
959
+ };
960
+ ```
961
+
962
+ ---
963
+
964
+ ## 🎯 Best Practices
965
+
966
+ ### 1. Authentication & Pairing Code
967
+
968
+ ```javascript
969
+ // ⭐ IMPORTANT: Request pairing code immediately dengan delay 1.5s
970
+ setTimeout(async () => {
971
+ try {
972
+ const pairingCode = await sock.requestPairingCode('6281234567890');
973
+ console.log('Pairing Code:', pairingCode);
974
+ } catch (error) {
975
+ console.error('Failed to get pairing code:', error);
976
+ }
977
+ }, 1500);
978
+ ```
979
+
980
+ ### 2. Browser Configuration untuk Stability
981
+
982
+ ```javascript
983
+ // Use correct browser settings untuk avoid detection/blocking
984
+ const sock = makeWASocket({
985
+ // ✅ RECOMMENDED FOR STABILITY
986
+ browser: ['Ubuntu', 'Chrome', '20.0.04'],
987
+
988
+ // Alternative options
989
+ // browser: Browsers.macOS('Safari'),
990
+ // browser: Browsers.windows('Edge'),
991
+ // browser: Browsers.iOS('Safari'), // iPhone
992
+
993
+ // Other important settings
994
+ connectTimeoutMs: 20000,
995
+ keepAliveIntervalMs: 30000,
996
+ enableAutoSessionRecreation: true
997
+ });
998
+ ```
999
+
1000
+ ### 3. Prevent WhatsApp Error 428 (Connection Replaced)
1001
+
1002
+ ```javascript
1003
+ // Use exponential backoff untuk reconnect
1004
+ let reconnectAttempts = 0;
1005
+ const maxReconnectAttempts = 5;
1006
+
1007
+ const handleDisconnect = async () => {
1008
+ reconnectAttempts++;
1009
+
1010
+ if (reconnectAttempts > maxReconnectAttempts) {
1011
+ console.error('❌ Max reconnect attempts reached');
1012
+ process.exit(1);
1013
+ }
1014
+
1015
+ const delay = Math.pow(2, reconnectAttempts) * 1000;
1016
+ console.log(`Reconnecting after ${delay}ms (attempt ${reconnectAttempts})`);
1017
+
1018
+ await new Promise(resolve => setTimeout(resolve, delay));
1019
+ startBot();
1020
+ };
1021
+
1022
+ sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {
1023
+ if (connection === 'close') {
1024
+ const statusCode = lastDisconnect?.error?.output?.statusCode;
1025
+
1026
+ if (statusCode === 428) { // Connection replaced
1027
+ console.log('⚠️ Connection replaced, initiating reconnect...');
1028
+ handleDisconnect();
1029
+ }
1030
+ }
1031
+ });
1032
+ ```
1033
+
1034
+ ### 4. Graceful Shutdown
1035
+
1036
+ ```javascript
1037
+ const gracefulShutdown = async () => {
1038
+ console.log('\n📴 Shutting down...');
1039
+
1040
+ try {
1041
+ // Close connection gracefully
1042
+ await sock.end();
1043
+ console.log('✅ Connection closed');
1044
+ } catch (error) {
1045
+ console.error('Error during shutdown:', error);
1046
+ }
1047
+
1048
+ process.exit(0);
1049
+ };
1050
+
1051
+ process.on('SIGINT', gracefulShutdown);
1052
+ process.on('SIGTERM', gracefulShutdown);
1053
+ ```
1054
+
1055
+ ### 5. Message Processing
1056
+
1057
+ ```javascript
1058
+ // Filter empty/invalid messages
1059
+ const isValidMessage = (msg) => {
1060
+ return msg?.message && msg?.key?.remoteJid;
1061
+ };
1062
+
1063
+ // Extract message content safely
1064
+ const getMessageContent = (msg) => {
1065
+ const messageTypes = {
1066
+ conversation: msg.message?.conversation,
1067
+ extendedText: msg.message?.extendedTextMessage?.text,
1068
+ imageCaption: msg.message?.imageMessage?.caption,
1069
+ videoCaption: msg.message?.videoMessage?.caption
1070
+ };
1071
+
1072
+ return Object.values(messageTypes).find(content => content?.trim());
1073
+ };
1074
+
1075
+ // Check if message from self
1076
+ const isFromMe = (msg) => msg.key.fromMe;
1077
+
1078
+ // Check if group message
1079
+ const isGroupMessage = (msg) => msg.key.remoteJid.endsWith('@g.us');
1080
+ ```
1081
+
1082
+ ### 6. Rate Limiting
1083
+
1084
+ ```javascript
1085
+ import PQueue from 'p-queue';
1086
+
1087
+ const messageQueue = new PQueue({
1088
+ concurrency: 1, // Send 1 message at a time
1089
+ interval: 1000, // Per 1 second
1090
+ carryoverConcurrencyCount: false
1091
+ });
1092
+
1093
+ // Send message dengan queue
1094
+ const sendMessageQueued = async (jid, content) => {
1095
+ return messageQueue.add(() =>
1096
+ sock.sendMessage(jid, content)
1097
+ );
1098
+ };
1099
+ ```
1100
+
1101
+ ### 7. Database Integration (Contoh: SQLite)
1102
+
1103
+ ```javascript
1104
+ import Database from 'better-sqlite3';
1105
+
1106
+ const db = new Database('bot.db');
1107
+
1108
+ // Create tables
1109
+ db.exec(`
1110
+ CREATE TABLE IF NOT EXISTS messages (
1111
+ id TEXT PRIMARY KEY,
1112
+ jid TEXT,
1113
+ text TEXT,
1114
+ timestamp INTEGER,
1115
+ fromMe BOOLEAN
1116
+ );
1117
+
1118
+ CREATE TABLE IF NOT EXISTS groups (
1119
+ jid TEXT PRIMARY KEY,
1120
+ name TEXT,
1121
+ members INTEGER,
1122
+ lastUpdated INTEGER
1123
+ );
1124
+ `);
1125
+
1126
+ // Save message
1127
+ const saveMessage = (msg) => {
1128
+ const stmt = db.prepare(`
1129
+ INSERT INTO messages (id, jid, text, timestamp, fromMe)
1130
+ VALUES (?, ?, ?, ?, ?)
1131
+ `);
1132
+
1133
+ stmt.run(
1134
+ msg.key.id,
1135
+ msg.key.remoteJid,
1136
+ getMessageContent(msg),
1137
+ msg.messageTimestamp * 1000,
1138
+ msg.key.fromMe
1139
+ );
1140
+ };
1141
+
1142
+ // Save group info
1143
+ const saveGroupInfo = (jid, metadata) => {
1144
+ const stmt = db.prepare(`
1145
+ INSERT OR REPLACE INTO groups (jid, name, members, lastUpdated)
1146
+ VALUES (?, ?, ?, ?)
1147
+ `);
1148
+
1149
+ stmt.run(
1150
+ jid,
1151
+ metadata.subject,
1152
+ metadata.participants.length,
1153
+ Date.now()
1154
+ );
1155
+ };
1156
+ ```
1157
+
1158
+ ---
1159
+
1160
+ ## 📝 Contoh Implementasi Lengkap
1161
+
1162
+ ### Bot Echo Sederhana
1163
+
1164
+ ```javascript
1165
+ import makeWASocket, {
1166
+ DisconnectReason,
1167
+ useMultiFileAuthState,
1168
+ Browsers
1169
+ } from '@fazzcode/baileys';
1170
+ import { Boom } from '@hapi/boom';
1171
+ import fs from 'fs';
1172
+
1173
+ const startBot = async () => {
1174
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info');
1175
+
1176
+ const sock = makeWASocket({
1177
+ auth: state,
1178
+ browser: ['Ubuntu', 'Chrome', '20.0.04'],
1179
+ printQRInTerminal: true,
1180
+ connectTimeoutMs: 20000,
1181
+ keepAliveIntervalMs: 30000,
1182
+ enableAutoSessionRecreation: true
1183
+ });
1184
+
1185
+ // Save credentials
1186
+ sock.ev.on('creds.update', saveCreds);
1187
+
1188
+ // Handle connection
1189
+ sock.ev.on('connection.update', async (update) => {
1190
+ const { connection, qr } = update;
1191
+
1192
+ if (qr) {
1193
+ console.log('📱 Scan QR code untuk login');
1194
+ }
1195
+
1196
+ if (connection === 'open') {
1197
+ console.log('✅ Bot online');
1198
+ }
1199
+ });
1200
+
1201
+ // Handle messages
1202
+ sock.ev.on('messages.upsert', async ({ messages }) => {
1203
+ for (const msg of messages) {
1204
+ // Ignore own messages
1205
+ if (msg.key.fromMe) continue;
1206
+
1207
+ // Ignore empty messages
1208
+ if (!msg.message) continue;
1209
+
1210
+ const from = msg.key.remoteJid;
1211
+ const text = msg.message.conversation ||
1212
+ msg.message.extendedTextMessage?.text || '';
1213
+
1214
+ // Log
1215
+ console.log(`\n📬 [${new Date().toLocaleTimeString()}] ${from}:`);
1216
+ console.log(` ${text}`);
1217
+
1218
+ // Echo reply
1219
+ if (text) {
1220
+ await sock.sendMessage(from, {
1221
+ text: `Echo: ${text}`
1222
+ });
1223
+ }
1224
+ }
1225
+ });
1226
+
1227
+ // Handle errors
1228
+ sock.ev.on('connection.update', async (update) => {
1229
+ const { connection, lastDisconnect } = update;
1230
+
1231
+ if (connection === 'close') {
1232
+ const statusCode = lastDisconnect?.error?.output?.statusCode;
1233
+
1234
+ if (statusCode === DisconnectReason.loggedOut) {
1235
+ console.log('👤 Logged out');
1236
+ return;
1237
+ }
1238
+
1239
+ console.log(`❌ Disconnected (${statusCode}), reconnecting...`);
1240
+ setTimeout(startBot, 5000);
1241
+ }
1242
+ });
1243
+ };
1244
+
1245
+ // Start
1246
+ startBot().catch(console.error);
1247
+ ```
1248
+
1249
+ ### Bot dengan Command System
1250
+
1251
+ ```javascript
1252
+ import makeWASocket, { useMultiFileAuthState } from '@fazzcode/baileys';
1253
+
1254
+ const PREFIX = '!';
1255
+
1256
+ const commands = {
1257
+ hello: async (sock, msg) => {
1258
+ await sock.sendMessage(msg.key.remoteJid, {
1259
+ text: '👋 Halo, ada yang bisa dibantu?'
1260
+ });
1261
+ },
1262
+
1263
+ info: async (sock, msg) => {
1264
+ const text = `
1265
+ 📱 Bot Information:
1266
+ - Name: Echo Bot
1267
+ - Version: 1.0.0
1268
+ - Status: Online
1269
+ - Uptime: ${Math.floor(process.uptime())} seconds
1270
+ `;
1271
+ await sock.sendMessage(msg.key.remoteJid, { text });
1272
+ },
1273
+
1274
+ help: async (sock, msg) => {
1275
+ const text = `
1276
+ 📚 Available Commands:
1277
+ !hello - Greeting
1278
+ !info - Bot info
1279
+ !help - Show this help
1280
+ !ping - Check latency
1281
+ `;
1282
+ await sock.sendMessage(msg.key.remoteJid, { text });
1283
+ },
1284
+
1285
+ ping: async (sock, msg) => {
1286
+ const start = Date.now();
1287
+ await sock.sendMessage(msg.key.remoteJid, {
1288
+ text: `⏱️ Pong! (${Date.now() - start}ms)`
1289
+ });
1290
+ }
1291
+ };
1292
+
1293
+ const startBot = async () => {
1294
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info');
1295
+
1296
+ const sock = makeWASocket({
1297
+ auth: state,
1298
+ browser: ['Ubuntu', 'Chrome', '20.0.04'],
1299
+ printQRInTerminal: true
1300
+ });
1301
+
1302
+ sock.ev.on('creds.update', saveCreds);
1303
+
1304
+ sock.ev.on('messages.upsert', async ({ messages }) => {
1305
+ for (const msg of messages) {
1306
+ if (msg.key.fromMe || !msg.message) continue;
1307
+
1308
+ const text = msg.message.conversation?.trim() || '';
1309
+
1310
+ if (!text.startsWith(PREFIX)) continue;
1311
+
1312
+ const [command, ...args] = text.slice(PREFIX.length).split(' ');
1313
+
1314
+ if (command in commands) {
1315
+ try {
1316
+ await commands[command](sock, msg);
1317
+ } catch (error) {
1318
+ console.error(`Error executing ${command}:`, error);
1319
+ await sock.sendMessage(msg.key.remoteJid, {
1320
+ text: '❌ Error executing command'
1321
+ });
1322
+ }
1323
+ }
1324
+ }
1325
+ });
1326
+
1327
+ sock.ev.on('connection.update', async (update) => {
1328
+ if (update.connection === 'open') {
1329
+ console.log('✅ Bot online');
1330
+ }
1331
+ });
1332
+ };
1333
+
1334
+ startBot().catch(console.error);
1335
+ ```
1336
+
1337
+ ### Bot Group Manager
1338
+
1339
+ ```javascript
1340
+ const handleGroupMessage = async (sock, msg) => {
1341
+ const groupJid = msg.key.remoteJid;
1342
+ const sender = msg.key.participant || msg.key.remoteJid;
1343
+ const text = msg.message?.conversation || '';
1344
+
1345
+ // Get group metadata
1346
+ const metadata = await sock.groupMetadata(groupJid);
1347
+ const isAdmin = metadata.admins?.includes(sender);
1348
+
1349
+ if (!text.startsWith('!')) return;
1350
+
1351
+ const [command, ...args] = text.slice(1).split(' ');
1352
+
1353
+ switch (command) {
1354
+ case 'add':
1355
+ if (!isAdmin) {
1356
+ await sock.sendMessage(groupJid, {
1357
+ text: '❌ Hanya admin yang bisa menambah member'
1358
+ });
1359
+ return;
1360
+ }
1361
+
1362
+ const phoneToAdd = args[0];
1363
+ if (!phoneToAdd) {
1364
+ await sock.sendMessage(groupJid, {
1365
+ text: '❌ Format: !add 62812345678'
1366
+ });
1367
+ return;
1368
+ }
1369
+
1370
+ const jidToAdd = phoneToAdd + '@s.whatsapp.net';
1371
+ await sock.groupParticipantsUpdate(groupJid, [jidToAdd], 'add');
1372
+ await sock.sendMessage(groupJid, {
1373
+ text: `✅ ${phoneToAdd} telah ditambahkan`
1374
+ });
1375
+ break;
1376
+
1377
+ case 'info':
1378
+ const info = `
1379
+ 👥 Group Info:
1380
+ - Name: ${metadata.subject}
1381
+ - Members: ${metadata.participants.length}
1382
+ - Created: ${new Date(metadata.creation * 1000).toLocaleDateString()}
1383
+ - Description: ${metadata.desc || 'N/A'}
1384
+ `;
1385
+ await sock.sendMessage(groupJid, { text: info });
1386
+ break;
1387
+
1388
+ case 'members':
1389
+ const memberList = metadata.participants
1390
+ .slice(0, 10)
1391
+ .map((p, i) => `${i + 1}. ${p.id}`)
1392
+ .join('\n');
1393
+
1394
+ await sock.sendMessage(groupJid, {
1395
+ text: `📋 Group Members (${metadata.participants.length}):\n${memberList}`
1396
+ });
1397
+ break;
1398
+ }
1399
+ };
1400
+ ```
1401
+
1402
+ ---
1403
+
1404
+ ## 📚 Dokumentasi Lengkap
1405
+
1406
+ - **Event Types**: Connection, Message, Group, Chat, Contact, Presence
1407
+ - **Message Types**: Text, Image, Video, Audio, Document, Sticker, Location, Contact
1408
+ - **JID Format**: `number@s.whatsapp.net` (personal), `id@g.us` (group)
1409
+ - **Message Status**: pending, sent, delivered, read, played
1410
+ - **Error Codes**: 401 (Unauthorized), 408 (Lost), 411 (Device Mismatch), 503 (Service Down)
1411
+
1412
+ ---
1413
+
1414
+ ## 🔗 Contact
1415
+
1416
+ - **Baileys GitHub**: None
1417
+ - **FazzCode Channel**: https://whatsapp.com/channel/0029Vb66VpnA2pLGOYBeuq0S
1418
+
1419
+ ---
1420
+
1421
+ ## ⚖️ License
1422
+
1423
+ MIT License - FazzCode © 2026
1424
+
1425
+ ---
1426
+
1427
+ ## ⚠️ Disclaimer
1428
+
1429
+ - Penggunaan Baileys harus sesuai dengan Terms of Service WhatsApp
1430
+ - Jangan gunakan untuk spam atau aktivitas ilegal
1431
+ - Bot bisa di-ban jika melanggar WhatsApp policies
1432
+ - Use responsibly!
1433
+
1434
+ ---
1435
+
1436
+ **Made with ❤️ by FazzCode**
1437
+
1438
+ Untuk support dan update terbaru, join channel Whatsapp: [FazzCodeStudio](https://whatsapp.com/channel/0029Vb66VpnA2pLGOYBeuq0S)