@neelegirly/baileys 2.2.25 → 2.2.27
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.
- package/README.md +80 -158
- package/lib/Defaults/baileys-version.json +1 -1
- package/lib/Socket/messages-recv.js +24 -1
- package/lib/Utils/generics.js +5 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,146 +1,105 @@
|
|
|
1
|
-
<pre align="center">
|
|
2
|
-
💖 Neelegirly Ecosystem Clean Stability Update 💖
|
|
3
|
-
4 Packages · 1 App · PM2 only runs the app
|
|
4
|
-
</pre>
|
|
5
|
-
|
|
6
|
-
# 🌸 @neelegirly/baileys
|
|
7
|
-
|
|
8
|
-
WhatsApp Web API core connection layer.
|
|
9
|
-
|
|
10
|
-
## Clean Architecture
|
|
11
|
-
|
|
12
|
-
```text
|
|
13
|
-
@neelegirly/libsignal
|
|
14
|
-
↓
|
|
15
|
-
@neelegirly/baileys
|
|
16
|
-
↓
|
|
17
|
-
@neelegirly/wa-api
|
|
18
|
-
↓
|
|
19
|
-
App (PM2 managed)
|
|
20
|
-
↓
|
|
21
|
-
@neelegirly/downloader (optional utility)
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Official Package Role
|
|
25
|
-
|
|
26
|
-
- Depends on @neelegirly/libsignal
|
|
27
|
-
- Core connection layer
|
|
28
|
-
- Used by @neelegirly/wa-api
|
|
29
|
-
|
|
30
|
-
## PM2 Rule
|
|
31
|
-
|
|
32
|
-
> WA-API handles sessions internally. PM2 only runs the app.
|
|
33
|
-
|
|
34
|
-
Start your app with PM2 like this:
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
pm2 start index.js --name bot
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Do not start one PM2 process per session. Sessions belong inside the app through `@neelegirly/wa-api`.
|
|
41
|
-
|
|
42
|
-
## Install
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
npm install @neelegirly/baileys
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Clean Stability Release
|
|
49
|
-
|
|
50
|
-
This release clarifies the ecosystem structure and removes workspace/core confusion from the documentation.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
1
|
<div align="center">
|
|
56
2
|
|
|
57
3
|
# 🌸 @neelegirly/baileys 🌸
|
|
58
4
|
|
|
59
|
-
### *Die WhatsApp
|
|
60
|
-
### *QR Branding · Wrapper-Aware Update Notify · LID · Smart Queue*
|
|
5
|
+
### *Die WhatsApp-Web-API mit sauberem Neelegirly-Glow-up*
|
|
6
|
+
### *QR Branding · Self-Healing WA-Web-Version · Wrapper-Aware Update Notify · LID · Smart Queue*
|
|
61
7
|
|
|
62
|
-
[](https://www.npmjs.com/package/@neelegirly/baileys)
|
|
63
|
-
[](https://www.npmjs.com/package/@neelegirly/wa-api)
|
|
64
|
-
[](https://www.npmjs.com/package/@neelegirly/libsignal)
|
|
65
|
-
[](https://nodejs.org)
|
|
66
8
|
[](https://www.npmjs.com/package/@neelegirly/baileys)
|
|
9
|
+
[](https://www.npmjs.com/package/@neelegirly/wa-api)
|
|
10
|
+
[](https://www.npmjs.com/package/@neelegirly/libsignal)
|
|
11
|
+
[](https://web.whatsapp.com)
|
|
12
|
+
[](https://nodejs.org)
|
|
67
13
|
|
|
68
14
|
<p align="center">
|
|
69
15
|
<img src="https://files.catbox.moe/5bqumy.jpeg" width="780" alt="@neelegirly/baileys Hero" />
|
|
70
16
|
</p>
|
|
71
17
|
|
|
72
|
-
<p align="center"><sub>2026 Glow-Up Edition ·
|
|
18
|
+
<p align="center"><sub>2026 Glow-Up Edition · self-healing QR/Pairing · Companion-Stack auf <strong>2.2.26 / 1.8.10 / 1.0.32</strong></sub></p>
|
|
73
19
|
|
|
74
|
-
[**Installation**](#-installation) · [**Quickstart**](#-quickstart) · [**
|
|
20
|
+
[**Installation**](#-installation) · [**Quickstart**](#-quickstart) · [**Was ist dieser Fork?**](#-was-ist-dieser-fork) · [**Versionsschema**](#-versionsschema) · [**Message-ID**](#-message-id-anpassung-neele) · [**Release Notes**](#-release-notes-2226)
|
|
75
21
|
|
|
76
22
|
</div>
|
|
77
23
|
|
|
78
24
|
---
|
|
79
25
|
|
|
80
|
-
|
|
26
|
+
## 🌷 Was ist dieser Fork?
|
|
27
|
+
|
|
28
|
+
`@neelegirly/baileys` ist ein gepflegter **Fork von [Baileys](https://github.com/WhiskeySockets/Baileys)** (multi-device WhatsApp-Web-API für Node.js). Er bleibt nah am Upstream, ergänzt aber ein paar fokussierte Neelegirly-Eigenheiten:
|
|
29
|
+
|
|
30
|
+
- 💖 **Eigene Message-ID-Generierung** (iOS-Style mit `NEELE`-Signatur) – siehe [unten](#-message-id-anpassung-neele).
|
|
31
|
+
- 🌐 **Self-Healing WA-Web-Version** – die Verbindung zieht sich die aktuelle WhatsApp-Web-Version automatisch, damit der QR-/Pairing-Login nicht durch veraltete Versionsangaben mit `statusCode 405` abbricht.
|
|
32
|
+
- 📷 **QR Branding** – Header/Footer + Versionskontext direkt im QR-Flow.
|
|
33
|
+
- 🔔 **Wrapper-Aware Update Notify** – Statuszeilen für Baileys **und** den optionalen `@neelegirly/wa-api`-Wrapper.
|
|
34
|
+
- 🎀 **Sauberer `@neelegirly/*`-Scope** mit gepinntem Begleit-Ökosystem.
|
|
81
35
|
|
|
82
|
-
> Hinweis: Dieses Projekt ist nicht offiziell mit WhatsApp, Meta oder Baileys-Upstream verbunden.
|
|
36
|
+
> Hinweis: Dieses Projekt ist nicht offiziell mit WhatsApp, Meta oder dem Baileys-Upstream verbunden.
|
|
83
37
|
|
|
84
38
|
---
|
|
85
39
|
|
|
86
|
-
##
|
|
40
|
+
## 🧱 Architektur
|
|
87
41
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
42
|
+
```text
|
|
43
|
+
@neelegirly/libsignal ← Signal-Protokoll-Krypto
|
|
44
|
+
↓
|
|
45
|
+
@neelegirly/baileys ← dieser Fork · Socket, Events, Messaging
|
|
46
|
+
↓
|
|
47
|
+
@neelegirly/wa-api ← Multi-Session-Wrapper (Lifecycle, QR, Update Notify)
|
|
48
|
+
↓
|
|
49
|
+
App (PM2 managed)
|
|
50
|
+
↓
|
|
51
|
+
@neelegirly/downloader ← optionale Media-Utility
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> **PM2-Regel:** `@neelegirly/wa-api` verwaltet Sessions intern. PM2 startet nur **die App**, nicht einen Prozess pro Session.
|
|
96
55
|
|
|
97
56
|
---
|
|
98
57
|
|
|
99
|
-
##
|
|
58
|
+
## 🔢 Versionsschema
|
|
100
59
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
- ✅ Link-Preview-Redirect-Retry und serverseitige MEX-Notifications fuer Reachout/Message-Capping geprueft
|
|
60
|
+
Wichtig zu verstehen — hier laufen **zwei voneinander unabhängige** Versionsnummern:
|
|
61
|
+
|
|
62
|
+
| Nummer | Beispiel | Bedeutung |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| **Fork-Version** | `2.2.26` | Die npm-Version *dieses Pakets*. Eigenes semver-Schema von Neelegirly – **nicht** identisch mit der Upstream-Baileys-Versionsnummer. |
|
|
65
|
+
| **WhatsApp-Web-Baseline** | `2.3000.1035194821` | Die Client-Version, die im Handshake an WhatsApp gemeldet wird. Wird zur Laufzeit aktuell gehalten (self-healing). |
|
|
66
|
+
|
|
67
|
+
Die Fork-Version `2.2.x` ist also reines Paket-Versioning. Welche WhatsApp-Web-Version tatsächlich verbunden wird, zeigt der Boot-Banner und `fetchLatestBaileysVersion()`.
|
|
110
68
|
|
|
111
69
|
---
|
|
112
70
|
|
|
113
|
-
##
|
|
71
|
+
## 💖 Message-ID-Anpassung (NEELE)
|
|
114
72
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
73
|
+
Dieser Fork erzeugt Message-IDs in einem **iOS-Style-Format mit eingebetteter `NEELE`-Signatur** (z. B. `3A…NEELE…`, 20 Zeichen). Das ist eine bewusste, dauerhafte Anpassung – `generateMessageID` und `generateMessageIDV2` werden **niemals** durch die Upstream-Variante überschrieben.
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
const { generateMessageID } = require('@neelegirly/baileys')
|
|
77
|
+
generateMessageID() // → z. B. "3AC18D8ANEELE3B14420"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> Beim Abgleich mit dem Upstream bleibt diese Logik 1:1 erhalten.
|
|
120
81
|
|
|
121
82
|
---
|
|
122
83
|
|
|
123
84
|
## 🚀 Installation
|
|
124
85
|
|
|
125
|
-
### npm
|
|
126
|
-
|
|
127
86
|
```bash
|
|
128
|
-
npm install @neelegirly/baileys@2.2.
|
|
87
|
+
npm install @neelegirly/baileys@2.2.26 @neelegirly/libsignal@1.0.32 --save-exact
|
|
129
88
|
```
|
|
130
89
|
|
|
131
|
-
### yarn
|
|
132
|
-
|
|
133
90
|
```bash
|
|
134
|
-
yarn add @neelegirly/baileys@2.2.
|
|
91
|
+
yarn add @neelegirly/baileys@2.2.26 @neelegirly/libsignal@1.0.32 --exact
|
|
135
92
|
```
|
|
136
93
|
|
|
137
|
-
|
|
94
|
+
> Für den kompletten Stack passt dazu `@neelegirly/wa-api@1.8.10`.
|
|
95
|
+
|
|
96
|
+
### Update eines bestehenden Setups
|
|
138
97
|
|
|
139
98
|
```bash
|
|
140
|
-
|
|
99
|
+
npm install @neelegirly/baileys@latest @neelegirly/wa-api@latest --save-exact
|
|
141
100
|
```
|
|
142
101
|
|
|
143
|
-
|
|
102
|
+
Nach dem Update genügt ein App-Neustart. Der QR-/Pairing-Login zieht sich die aktuelle WhatsApp-Web-Version automatisch.
|
|
144
103
|
|
|
145
104
|
---
|
|
146
105
|
|
|
@@ -156,7 +115,7 @@ import makeWASocket, {
|
|
|
156
115
|
|
|
157
116
|
async function start() {
|
|
158
117
|
const { state, saveCreds } = await useMultiFileAuthState('./auth')
|
|
159
|
-
const { version } = await fetchLatestBaileysVersion()
|
|
118
|
+
const { version } = await fetchLatestBaileysVersion() // self-healing WA-Web-Version
|
|
160
119
|
|
|
161
120
|
const sock = makeWASocket({
|
|
162
121
|
auth: state,
|
|
@@ -168,16 +127,10 @@ async function start() {
|
|
|
168
127
|
sock.ev.on('creds.update', saveCreds)
|
|
169
128
|
|
|
170
129
|
sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {
|
|
171
|
-
if (connection === 'open')
|
|
172
|
-
console.log('Verbunden 💖')
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
|
|
130
|
+
if (connection === 'open') return console.log('Verbunden 💖')
|
|
176
131
|
if (connection === 'close') {
|
|
177
132
|
const statusCode = lastDisconnect?.error?.output?.statusCode
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if (!isLoggedOut) start().catch(console.error)
|
|
133
|
+
if (statusCode !== DisconnectReason.loggedOut) start().catch(console.error)
|
|
181
134
|
}
|
|
182
135
|
})
|
|
183
136
|
}
|
|
@@ -185,60 +138,28 @@ async function start() {
|
|
|
185
138
|
start().catch(console.error)
|
|
186
139
|
```
|
|
187
140
|
|
|
188
|
-
>
|
|
141
|
+
> `fetchLatestBaileysVersion()` ist die empfohlene Quelle für `version`: Sie liefert die aktuell gültige WhatsApp-Web-Version und fällt bei Netzwerkfehlern auf die gebündelte Baseline zurück.
|
|
189
142
|
|
|
190
143
|
---
|
|
191
144
|
|
|
192
145
|
## 🧩 Companion Stack
|
|
193
146
|
|
|
194
|
-
| Paket | Rolle |
|
|
195
|
-
|
|
196
|
-
| `@neelegirly/baileys 2.2.
|
|
197
|
-
| `@neelegirly/libsignal 1.0.
|
|
198
|
-
| `@neelegirly/wa-api 1.8.
|
|
147
|
+
| Paket | Version | Rolle |
|
|
148
|
+
|------|---------|-------|
|
|
149
|
+
| `@neelegirly/baileys` | `2.2.26` | Socket, Events, Messaging |
|
|
150
|
+
| `@neelegirly/libsignal` | `1.0.32` | Signal-Protokoll-Komponente |
|
|
151
|
+
| `@neelegirly/wa-api` | `1.8.10` | Lifecycle-, Session- und Update-Wrapper |
|
|
199
152
|
|
|
200
153
|
---
|
|
201
154
|
|
|
202
155
|
## 🩷 QR Branding & Update Status
|
|
203
156
|
|
|
204
|
-
Beim QR-Scan werden
|
|
205
|
-
|
|
206
|
-
Typische Anzeige:
|
|
207
|
-
|
|
208
|
-
- `Baileys Update-Status: up to date (2.2.22)`
|
|
209
|
-
- `Wrapper Update-Status: up to date (1.8.6)`
|
|
210
|
-
- Bei echten Updates werden kompakte Hinweise auf `latest` eingeblendet
|
|
211
|
-
|
|
212
|
-
Wenn kein Wrapper-Kontext vorhanden ist, bleibt die Anzeige sauber bei Baileys. Kein unnötiges Drama, nur QR. ✨
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## 🔄 Update-Check
|
|
217
|
-
|
|
218
|
-
- Quelle 1: npm Registry (`registry.npmjs.org`)
|
|
219
|
-
- Quelle 2: GitHub Releases (`neelegirly/baileys`) als Fallback
|
|
220
|
-
- Fehler und Timeouts werden abgefangen, ohne den Prozess zu stoppen
|
|
221
|
-
- Semver-Vergleich wird numerisch ausgewertet
|
|
222
|
-
- Wrapper-Status kann über die von `@neelegirly/wa-api` gesetzten Umgebungsvariablen übernommen werden
|
|
223
|
-
|
|
224
|
-
Wenn du direkt prüfen willst:
|
|
225
|
-
|
|
226
|
-
```ts
|
|
227
|
-
import { checkNpmVersion } from '@neelegirly/baileys'
|
|
228
|
-
|
|
229
|
-
const info = await checkNpmVersion('@neelegirly/baileys', '2.2.22', {
|
|
230
|
-
githubRepo: 'neelegirly/baileys'
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
console.log(info)
|
|
234
|
-
```
|
|
157
|
+
Beim QR-Scan werden Markenzeilen ober- und unterhalb des QR-Codes ausgegeben. Versionen werden dynamisch aus `package.json` gelesen, Update-Status robust verarbeitet und optionaler Wrapper-Kontext aus `@neelegirly/wa-api` dargestellt. Der Boot-Banner zeigt zusätzlich die aktive **WhatsApp-Web-Baseline**.
|
|
235
158
|
|
|
236
159
|
---
|
|
237
160
|
|
|
238
161
|
## 🌐 Namespace-Migration
|
|
239
162
|
|
|
240
|
-
Wenn du vom Upstream kommst, nutze den Neelegirly-Scope:
|
|
241
|
-
|
|
242
163
|
```diff
|
|
243
164
|
- import makeWASocket from '@whiskeysockets/baileys'
|
|
244
165
|
+ import makeWASocket from '@neelegirly/baileys'
|
|
@@ -246,15 +167,16 @@ Wenn du vom Upstream kommst, nutze den Neelegirly-Scope:
|
|
|
246
167
|
|
|
247
168
|
---
|
|
248
169
|
|
|
249
|
-
## 📝 Release Notes `2.2.
|
|
250
|
-
|
|
251
|
-
-
|
|
252
|
-
-
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
170
|
+
## 📝 Release Notes `2.2.26`
|
|
171
|
+
|
|
172
|
+
- 🛠️ **QR-/Pairing-Login repariert.** Die veraltete, hartcodierte WhatsApp-Web-Version führte zu `statusCode 405` ("Multi-device mismatch") und verhinderte jeden QR-Scan. Baseline auf `2.3000.1035194821` aktualisiert.
|
|
173
|
+
- 🌐 **Self-Healing WA-Web-Version.** `fetchLatestBaileysVersion()` bezieht die Versionsangabe jetzt aus einer **gepflegten, immer aktuellen Quelle** statt aus einer toten URL (die zuvor mit `404` ins Leere lief und still eine veraltete Version pinnte). Künftige WhatsApp-Versions-Bumps heilen sich damit selbst.
|
|
174
|
+
- 🧷 **Message-ID-Logik unverändert.** Die `NEELE`-Signatur in `generateMessageID` / `generateMessageIDV2` bleibt exakt erhalten.
|
|
175
|
+
- 🪧 **Modernisierter Boot-Banner.** Zusätzliche, ehrliche Zeile mit der aktiven WhatsApp-Web-Baseline.
|
|
176
|
+
- 🔗 Companion-Stack auf `2.2.26 / 1.8.10 / 1.0.32` aktualisiert.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
<div align="center">
|
|
181
|
+
<sub>Made with 🎀 by Neelegirly · Fork von WhiskeySockets/Baileys</sub>
|
|
182
|
+
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":[2,3000,
|
|
1
|
+
{"version":[2,3000,1035194821]}
|
|
@@ -56,6 +56,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
56
56
|
createParticipantNodes,
|
|
57
57
|
sendPeerDataOperationMessage,
|
|
58
58
|
fetchAccountReachoutTimelock,
|
|
59
|
+
// OniSelf fork fix: needed by sendMessagesAgain() as fallback message
|
|
60
|
+
// source for incoming retry receipts (see comment there).
|
|
61
|
+
messageRetryManager,
|
|
59
62
|
} = Neele;
|
|
60
63
|
|
|
61
64
|
/** this mutex ensures that each retryRequest will wait for the previous one to finish */
|
|
@@ -1133,7 +1136,27 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
1133
1136
|
};
|
|
1134
1137
|
|
|
1135
1138
|
const sendMessagesAgain = async (key, ids, retryNode) => {
|
|
1136
|
-
|
|
1139
|
+
// ╭─ OniSelf fork fix (bug ≤2.2.26, shipped in 2.2.27) ───────────────────╮
|
|
1140
|
+
// │ BUG: this fork populates messageRetryManager's recent-message cache │
|
|
1141
|
+
// │ on every outgoing send (enableRecentMessageCache defaults to true, │
|
|
1142
|
+
// │ see messages-send.js "addRecentMessage") but never read it back │
|
|
1143
|
+
// │ here. With the default `getMessage: async () => undefined` every │
|
|
1144
|
+
// │ incoming retry receipt from a peer died with "recv retry request, │
|
|
1145
|
+
// │ but message not available" — the recipient stayed stuck on │
|
|
1146
|
+
// │ WhatsApp's "Waiting for this message" placeholder forever. │
|
|
1147
|
+
// │ Upstream Baileys consults the recent-message cache as fallback; │
|
|
1148
|
+
// │ this restores exactly that behaviour. No security check is touched: │
|
|
1149
|
+
// │ we only re-encrypt a message WE sent moments ago for the SAME │
|
|
1150
|
+
// │ recipient, via the normal relayMessage path below. │
|
|
1151
|
+
// ╰───────────────────────────────────────────────────────────────────────╯
|
|
1152
|
+
const msgs = await Promise.all(
|
|
1153
|
+
ids.map(async (id) => {
|
|
1154
|
+
const msg = await getMessage({ ...key, id });
|
|
1155
|
+
if (msg) return msg;
|
|
1156
|
+
const recent = messageRetryManager?.getRecentMessage(key.remoteJid, id);
|
|
1157
|
+
return recent?.message;
|
|
1158
|
+
})
|
|
1159
|
+
);
|
|
1137
1160
|
const remoteJid = key.remoteJid;
|
|
1138
1161
|
const participant = key.participant || remoteJid;
|
|
1139
1162
|
|
package/lib/Utils/generics.js
CHANGED
|
@@ -389,7 +389,11 @@ const printQRIfNecessaryListener = (ev, logger) => {
|
|
|
389
389
|
* Use to ensure your WA connection is always on the latest version
|
|
390
390
|
*/
|
|
391
391
|
const fetchLatestBaileysVersion = async (options = {}) => {
|
|
392
|
-
|
|
392
|
+
// Self-healing WA-Web version: track the upstream-maintained version pin so the
|
|
393
|
+
// fork stays connectable when WhatsApp bumps its required client revision.
|
|
394
|
+
// (The previous neelegirly /src/ URL 404'd — no src/ in the fork — and silently
|
|
395
|
+
// pinned a stale version, which WhatsApp rejected with statusCode 405.)
|
|
396
|
+
const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json'
|
|
393
397
|
try {
|
|
394
398
|
const result = await axios_1.default.get(URL, {
|
|
395
399
|
...options,
|