@rennzsync/baileys 10.2.4 → 10.4.0

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- # renz/baileys
3
+ # renzsync/baileys
4
4
 
5
5
  **Lightweight WhatsApp Bot library — fully rebased onto `@whiskeysockets/baileys` 7.0.0-rc14**
6
6
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  A WhatsApp Multi-Device library rebased onto Baileys v7 rc14, using the original Signal Protocol engine (`libsignal`, GPL-3.0) — the same one stock `@whiskeysockets/baileys` rc14 ships with.
17
17
 
18
- > **License note:** `renz/baileys`'s own code is MIT, but it depends on `libsignal` (GPL-3.0) at runtime for the Signal Protocol crypto. If you're publishing or redistributing this package, check what GPL-3.0 compliance means for your use case — this isn't legal advice.
18
+ > **License note:** `renzsync/baileys`'s own code is MIT, but it depends on `libsignal` (GPL-3.0) at runtime for the Signal Protocol crypto. If you're publishing or redistributing this package, check what GPL-3.0 compliance means for your use case — this isn't legal advice.
19
19
 
20
20
  Project focus: **multimedia WhatsApp bots** — audio, video, image and sticker pipelines, plus **Rich WebUI** (inline HTML interfaces rendered inside chat bubbles), with RAM-friendly defaults.
21
21
 
@@ -44,7 +44,7 @@ Platform support follows whatever `libsignal` (^6.0.0) supports on your system
44
44
  ## Installation
45
45
 
46
46
  ```bash
47
- npm install @renz/baileys
47
+ npm install @renzsync/baileys
48
48
  ```
49
49
 
50
50
  ### Optional dependencies (install per feature)
@@ -62,7 +62,7 @@ npm install @renz/baileys
62
62
  ## Quick Start
63
63
 
64
64
  ```js
65
- import makeWASocket, { useMultiFileAuthState } from '@renz/baileys';
65
+ import makeWASocket, { useMultiFileAuthState } from '@renzsync/baileys';
66
66
 
67
67
  const { state, saveCreds } = await useMultiFileAuthState('auth_info');
68
68
 
@@ -113,7 +113,7 @@ await sock.sendMessage(jid, {
113
113
  ### Convert video/audio before sending (media-processor)
114
114
 
115
115
  ```js
116
- import { convertToWhatsAppVideo, convertToOpusAudio, getVideoThumbnail, resizeImage } from '@renz/baileys';
116
+ import { convertToWhatsAppVideo, convertToOpusAudio, getVideoThumbnail, resizeImage } from '@renzsync/baileys';
117
117
 
118
118
  // Any video -> WhatsApp-compatible MP4/H.264 (requires fluent-ffmpeg)
119
119
  const mp4 = await convertToWhatsAppVideo(rawBuffer);
@@ -130,7 +130,7 @@ const small = await resizeImage(imageBuffer, { width: 300, height: 300 });
130
130
  ### Probe media metadata
131
131
 
132
132
  ```js
133
- import { probeMedia, getMp4Duration } from '@renz/baileys';
133
+ import { probeMedia, getMp4Duration } from '@renzsync/baileys';
134
134
 
135
135
  const meta = await probeMedia(buffer, 'audio/mpeg'); // { duration, bitrate, container, codec }
136
136
  const dur = getMp4Duration(mp4Buffer); // no ffmpeg needed — parses atoms directly
@@ -143,7 +143,7 @@ const dur = getMp4Duration(mp4Buffer); // no ffmpeg needed — parses atoms dire
143
143
  Send an HTML/CSS/JS interface that **renders directly inside the message bubble** — great for interactive menus, mini-apps and dashboards:
144
144
 
145
145
  ```js
146
- import { sendInlineWebUI } from '@renz/baileys';
146
+ import { sendInlineWebUI } from '@renzsync/baileys';
147
147
 
148
148
  const html = `<!DOCTYPE html>
149
149
  <html><head><style>body{background:#111b21;color:#fff;font-family:sans-serif;padding:16px}</style></head>
@@ -166,32 +166,32 @@ await sendInlineWebUI(sock, jid, html, 'Bot Menu', {
166
166
 
167
167
  `interactiveMessage` + `nativeFlowMessage` cards are **no longer rendered** on many WhatsApp clients — `relayMessage` succeeds without error but the message silently doesn't appear. The classic `buttonsMessage` and `listMessage` templates render reliably on **every** client (Android/iOS/Web/Desktop).
168
168
 
169
- `@renz/baileys@10.0.2` ships ready-made builders in `lib/Utils/rich-classic.js`:
169
+ `@renzsync/baileys@10.0.2` ships ready-made builders in `lib/Utils/rich-classic.js`:
170
170
 
171
171
  ```js
172
- import { buildButtonsMessage, buildListMessage, sendClassicMessage } from '@renz/baileys';
172
+ import { buildButtonsMessage, buildListMessage, sendClassicMessage } from '@renzsync/baileys';
173
173
 
174
174
  // 1-3 quick-reply buttons (optionally with a location+thumbnail header)
175
175
  const buttons = buildButtonsMessage({
176
176
  text: 'Hello Brother — pick an option',
177
177
  footer: '© My Bot',
178
178
  buttons: [
179
- { buttonId: '.owner', buttonText: '🧀 Owner' },
180
- { buttonId: '.allmenu', buttonText: '💐 Allmenu' },
179
+ { buttonId: '.owner', buttonText: 'Owner' },
180
+ { buttonId: '.allmenu', buttonText: 'Allmenu' },
181
181
  ],
182
182
  locationMessage: { jpegThumbnail, name: 'My Bot', address: 'v10.0.1' },
183
183
  });
184
184
 
185
185
  // Scrollable list with sections and rows
186
186
  const list = buildListMessage({
187
- title: '🍃 Menu — 1271 commands',
187
+ title: 'Menu — 1271 commands',
188
188
  description: 'Pick a category',
189
- buttonText: '🍃 Pilih Kategori',
189
+ buttonText: 'Pilih Kategori',
190
190
  sections: [{
191
191
  title: 'Categories',
192
192
  rows: [
193
- { title: '🏠 main', description: '19 commands', rowId: '.menucat main' },
194
- { title: '🎨 sticker', description: '42 commands', rowId: '.menucat sticker' },
193
+ { title: 'main', description: '19 commands', rowId: '.menucat main' },
194
+ { title: 'sticker', description: '42 commands', rowId: '.menucat sticker' },
195
195
  ],
196
196
  }],
197
197
  });
@@ -211,15 +211,15 @@ Also exports `normalizeUserJid(sockOrUserOrJid)` — `sock.user.jid` never exist
211
211
  `lib/Utils/rich-carousel.js` adds `interactiveMessage`/`carouselMessage` builders (the horizontal-scroll card format), for cases where you specifically need carousel or richer CTA button types (`cta_url`, `cta_call`, `cta_copy`, `cta_reminder`, `single_select`) that the classic templates above don't cover. Same rendering caveat as always: prefer `rich-classic.js` unless you specifically need these.
212
212
 
213
213
  ```js
214
- import { buildCarouselMessage, sendCarouselMessage, sendInteractiveMessage } from '@renz/baileys';
214
+ import { buildCarouselMessage, sendCarouselMessage, sendInteractiveMessage } from '@renzsync/baileys';
215
215
 
216
216
  // single native-flow bubble (no carousel)
217
217
  await sendInteractiveMessage(sock, jid, {
218
218
  text: 'Choose an action:',
219
219
  footer: '© My Bot',
220
220
  buttons: [
221
- { type: 'quick_reply', displayText: '🧀 Owner', id: '.owner' },
222
- { type: 'cta_url', displayText: '📖 Docs', url: 'https://github.com/RennZSync/baileys' },
221
+ { type: 'quick_reply', displayText: 'Owner', id: '.owner' },
222
+ { type: 'cta_url', displayText: 'Docs', url: 'https://github.com/RennZSync/baileys' },
223
223
  ],
224
224
  });
225
225
 
@@ -262,7 +262,7 @@ await sock.updateProfilePicture(sock.user.id, imageBuffer); // unchanged default
262
262
  `lib/Store/*` ships a chat/contact/message store you can wire into `sock.ev`, plus two auth-state backends:
263
263
 
264
264
  ```js
265
- import makeWASocket, { makeInMemoryStore, useSqliteAuthState, useMultiFileAuthState } from '@renz/baileys';
265
+ import makeWASocket, { makeInMemoryStore, useSqliteAuthState, useMultiFileAuthState } from '@renzsync/baileys';
266
266
 
267
267
  const store = makeInMemoryStore({});
268
268
  store.readFromFile('./store.json');
@@ -289,7 +289,7 @@ sock.ev.on('creds.update', saveCreds);
289
289
  Send a poll where each option is an image instead of plain text (`pollCreationMessageV3` with `pollContentType: IMAGE`, one `pollCreationOptionImageMessage` per option, associated back to the parent poll via `MEDIA_POLL`):
290
290
 
291
291
  ```js
292
- import { generateWAMessageFromImagePoll } from '@renz/baileys';
292
+ import { generateWAMessageFromImagePoll } from '@renzsync/baileys';
293
293
 
294
294
  await generateWAMessageFromImagePoll(jid, {
295
295
  name: 'Pilih gambar favorit',
@@ -318,9 +318,9 @@ const sock = makeWASocket({
318
318
 
319
319
  ---
320
320
 
321
- ## Breaking Changes from 9.x (legacy oktz-baileys)
321
+ ## Breaking Changes from 9.x (legacy renzsync-baileys)
322
322
 
323
- - Base rebased to Baileys **7.0.0-rc14** (no longer ourin-baileys 9.0.21).
323
+ - Base rebased to Baileys **7.0.0-rc14**
324
324
  - Removed modules: `lib/VoIP/*` (WebRTC call client), `Modded/message_builder.js`, `Utils/rich-messages.js`, `Socket/dugong.js`, `Utils/sticker-pack.js`.
325
325
  - `rejectCall` remains available (core `messages-recv`).
326
326
  - Replacement for the old rich messages: `rich-webui.js` (`sendInlineWebUI`, `buildWebuiMessage`).
@@ -339,7 +339,7 @@ const sock = makeWASocket({
339
339
  ## Testing
340
340
 
341
341
  ```bash
342
- npm test
342
+ npm test
343
343
  ```
344
344
 
345
345
  Includes unit tests for: JID utils (PN/LID/hosted), Rich WebUI (build + proto encode/decode roundtrip).
@@ -348,12 +348,11 @@ Includes unit tests for: JID utils (PN/LID/hosted), Rich WebUI (build + proto en
348
348
 
349
349
  ## Credits
350
350
 
351
- - **[RennZz-Dev](https://github.com/RennZSync)** — `renz/baileys` maintainer: rebrand, ongoing upkeep & bot-focused tweaks
352
- - **[KzorArsuy](https://github.com/rozzak2009)** — audit, rc14 rebase, optimization, multimedia & WebUI
351
+ - **[RennZz-Dev](https://github.com/RennZSync)** — `renzsync/baileys` maintainer: rebrand, ongoing upkeep & bot-focused tweaks
353
352
  - **[WhiskeySockets/Baileys](https://github.com/WhiskeySockets/Baileys)** — upstream library & original Signal Protocol wrapper (`libsignal`-based)
354
353
 
355
354
  ---
356
355
 
357
356
  ## License
358
357
 
359
- **MIT** for `renz/baileys`'s own code — but it depends on `libsignal` (GPL-3.0) at runtime for Signal Protocol crypto. Check what that means for your use case before redistributing.
358
+ **MIT** for `renzsync/baileys`'s own code — but it depends on `libsignal` (GPL-3.0) at runtime for Signal Protocol crypto. Check what that means for your use case before redistributing.
@@ -1,8 +1,34 @@
1
1
  import { proto } from '../../WAProto/index.js';
2
2
  import { makeLibSignalRepository } from '../Signal/libsignal.js';
3
3
  import { Browsers } from '../Utils/browser-utils.js';
4
+ import { fetchLatestWaWebVersion } from '../Utils/generics.js';
4
5
  import logger from '../Utils/logger.js';
5
- const version = [2, 3000, 1043857760];
6
+ // Last-known-good fallback. This goes stale over time (WhatsApp bumps its
7
+ // web client revision constantly), which is what causes "Couldn't link
8
+ // device" / pairing-code rejections once it's old enough — so it is only
9
+ // ever used when the live lookup below fails (offline host, blocked
10
+ // outbound network, etc). On every normal startup we replace it with the
11
+ // real current revision fetched from WhatsApp Web itself.
12
+ const FALLBACK_VERSION = [2, 3000, 1043857760];
13
+ const resolveStartupVersion = async () => {
14
+ try {
15
+ const controller = new AbortController();
16
+ const timeout = setTimeout(() => controller.abort(), 4000);
17
+ const { version: liveVersion, isLatest } = await fetchLatestWaWebVersion({ signal: controller.signal });
18
+ clearTimeout(timeout);
19
+ if (isLatest && Array.isArray(liveVersion)) {
20
+ return liveVersion;
21
+ }
22
+ }
23
+ catch {
24
+ // network unavailable at boot (offline / firewalled host) — fall back below
25
+ }
26
+ return FALLBACK_VERSION;
27
+ };
28
+ // Node ESM supports top-level await: this resolves once, at import time,
29
+ // so makeWASocket() keeps its existing synchronous API and every bot using
30
+ // this library gets a fresh version with zero code changes on their end.
31
+ const version = await resolveStartupVersion();
6
32
  export const UNAUTHORIZED_CODES = [401, 403, 419];
7
33
  export const DEFAULT_ORIGIN = 'https://web.whatsapp.com';
8
34
  export const CALL_VIDEO_PREFIX = 'https://call.whatsapp.com/video/';
@@ -125,5 +151,4 @@ export const TimeMs = {
125
151
  Hour: 60 * 60 * 1000,
126
152
  Day: 24 * 60 * 60 * 1000,
127
153
  Week: 7 * 24 * 60 * 60 * 1000
128
- };
129
- //# sourceMappingURL=index.js.map
154
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rennzsync/baileys",
3
3
  "type": "module",
4
- "version": "10.2.4",
4
+ "version": "10.4.0",
5
5
  "description": "renz/baileys — WhatsApp Multi-Device library rebased @whiskeysockets/baileys 7.0.0-rc14, using the original libsignal (GPL-3.0) Signal Protocol engine. Maintained by RennZz-Dev. Focus: multimedia WhatsApp bots, low RAM footprint.",
6
6
  "license": "MIT",
7
7
  "author": "RennZz-Dev (https://github.com/renzxhub)",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Defaults/index.ts"],"names":[],"mappings":"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"}