@neelegirl/wa-api 1.6.2 → 1.6.3

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.
@@ -1,49 +1,28 @@
1
-
1
+ /**
2
+ * Send a message to a chat JID or phone number.
3
+ */
4
+ export declare function sendMessage(
5
+ sessionId: string,
6
+ jid: string,
7
+ content: import("@neelegirl/baileys/lib").AnyMessageContent,
8
+ options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
9
+ ): Promise<import("@neelegirl/baileys/lib").proto.WebMessageInfo>;
2
10
 
3
11
  /**
4
- * Send a message to target
5
- *
6
- * @param sessionId - Session ID
7
- * @param jid - Target
8
- * @param content - Message content
9
- * @param options - Message options
12
+ * Send status mentions using the current session socket.
10
13
  */
11
- export declare function sendMessage(
12
- sessionId: string,
13
- jid: string,
14
- content: import("@neelegirl/baileys").AnyMessageContent,
15
- options?: import("@neelegirl/baileys").MiscMessageGenerationOptions
16
- ): Promise<import("@neelegirl/baileys").proto.WebMessageInfo>;
17
14
  export declare function sendStatusMentions(
18
- sessionId: string,
19
- content: import("@neelegirl/baileys").AnyMessageContent,
20
- options?: import("@neelegirl/baileys").MiscMessageGenerationOptions
21
- ): Promise<import("@neelegirl/baileys").proto.WebMessageInfo>;
22
- /**
23
- * Sendet einen rohen WAMessage-Stanza an WhatsApp.
24
- *
25
- * @param sessionId Deine Session-ID
26
- * @param jid Ziel-JID oder Telefonnummer (z. B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
27
- * @param content Raw-Message-Node (z. B. protocolMessage, videoMessage, etc.)
28
- * @param options Optional: Relay-Parameter wie messageId, participant, additionalNodes, statusJidList
29
- * @returns Promise mit der gesendeten Nachricht-ID (msgId)
30
- */
15
+ sessionId: string,
16
+ content: any,
17
+ options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
18
+ ): Promise<any>;
19
+
31
20
  /**
32
- * Low-level relayMessage-Wrapper für direkten Baileys-Stanza Dispatch.
33
- *
34
- * Sendet ein rohes WAMessage-Stanza (z.B. protocolMessage, disappearingMessagesInChat,
35
- * videoMessage, etc.) direkt an WhatsApp über die interne `relayMessage`-Methode.
36
- *
37
- * @param sessionId Deine Multi-Session-ID
38
- * @param jid Ziel-JID oder Telefonnummer (z.B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
39
- * @param content Raw-Message-Node (proto.WebMessageInfo oder AnyMessageContent-ähnlich)
40
- * @param options Optional: Relay-Parameter wie `messageId`, `participant`, `additionalNodes`,
41
- * `statusJidList`, `useCachedGroupMetadata`, usw.
42
- * @returns Promise mit der gesendeten Nachricht-ID (`msgId`)
21
+ * Low-level relayMessage wrapper.
43
22
  */
44
23
  export declare function relayMessage(
45
24
  sessionId: string,
46
25
  jid: string,
47
26
  content: any,
48
- options?: import('@neelegirl/baileys').MiscMessageGenerationOptions
49
- ): Promise<string>;
27
+ options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
28
+ ): Promise<string>;
@@ -1,119 +1,61 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __rest = (this && this.__rest) || function (s, e) {
12
- var t = {};
13
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
- t[p] = s[p];
15
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
- t[p[i]] = s[p[i]];
19
- }
20
- return t;
21
- };
22
- var __importDefault = (this && this.__importDefault) || function (mod) {
23
- return (mod && mod.__esModule) ? mod : { "default": mod };
24
- };
1
+ "use strict";
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.relayMessage = exports.sendMessage = void 0;
3
+ exports.relayMessage = exports.sendStatusMentions = exports.sendMessage = void 0;
4
+
27
5
  const Defaults_1 = require("../Defaults");
28
6
  const Socket_1 = require("../Socket");
29
7
  const Utils_1 = require("../Utils");
30
- const create_delay_1 = require("../Utils/create-delay");
31
- const is_exist_1 = require("../Utils/is-exist");
32
8
  const Error_1 = require("../Error");
33
9
 
34
10
  const sessionCache = new Map();
35
11
 
36
12
  function getCachedSession(sessionId) {
37
- let session = sessionCache.get(sessionId);
38
- if (!session) {
39
- session = Socket_1.getSession(sessionId);
40
- if (!session) throw new Error_1.WhatsappError(Defaults_1.Messages.sessionNotFound(sessionId));
41
- sessionCache.set(sessionId, session);
42
- }
43
- return session;
13
+ let session = sessionCache.get(sessionId);
14
+ if (!session) {
15
+ session = (0, Socket_1.getSession)(sessionId);
16
+ if (!session) {
17
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionNotFound(sessionId));
18
+ }
19
+ sessionCache.set(sessionId, session);
20
+ }
21
+ return session;
44
22
  }
45
23
 
46
- /**
47
- * Universal sendMessage wrapper for all Baileys message types in JavaScript.
48
- *
49
- * @param {string} sessionId Your multi-session identifier
50
- * @param {string} jid Destination JID (user or group) or phone number
51
- * @param {object} content AnyMessageContent payload
52
- * @param {object} [options] MiscMessageGenerationOptions (quoted, mentions, etc.)
53
- * @returns {Promise<any>}
54
- */
55
- async function sendMessage(sessionId, jid, content, options) {
56
- const session = getCachedSession(sessionId);
57
-
58
- // Convert phone number to JID if needed
59
- const destJid = jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
60
-
61
- try {
62
- return await session.sendMessage(destJid, content, options || {});
63
- } catch (err) {
64
- // Wrap Baileys errors into WhatsappError for consistency
65
- throw new Error_1.WhatsappError(
66
- `Failed to send message to ${destJid}: ${err.message}`,
67
- { cause: err }
68
- );
69
- }
24
+ function resolveJid(jid) {
25
+ return jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
70
26
  }
71
27
 
28
+ async function sendMessage(sessionId, jid, content, options) {
29
+ const session = getCachedSession(sessionId);
30
+ const destJid = resolveJid(jid);
31
+ try {
32
+ return await session.sendMessage(destJid, content, options || {});
33
+ }
34
+ catch (err) {
35
+ throw new Error_1.WhatsappError(`Failed to send message to ${destJid}: ${err.message}`, { cause: err });
36
+ }
37
+ }
72
38
  exports.sendMessage = sendMessage;
73
- /**
74
- * Universal sendMessage wrapper for all Baileys message types in JavaScript.
75
- *
76
- * @param {string} sessionId Your multi-session identifier
77
- * @param {string} jid Destination JID (user or group) or phone number
78
- * @param {object} content AnyMessageContent payload
79
- * @param {object} [options] MiscMessageGenerationOptions (quoted, mentions, etc.)
80
- * @returns {Promise<any>}
81
- */
82
- async function sendStatusMentions(sessionId, content, options) {
83
- const session = getCachedSession(sessionId);
84
39
 
85
- try {
86
- return await session.sendStatusMentions( content, options || {});
87
- } catch (err) {
88
- // Wrap Baileys errors into WhatsappError for consistency
89
- throw new Error_1.WhatsappError(
90
- `Failed to send message: ${err.message}`,
91
- { cause: err }
92
- );
93
- }
40
+ async function sendStatusMentions(sessionId, content, options) {
41
+ const session = getCachedSession(sessionId);
42
+ try {
43
+ return await session.sendStatusMentions(content, options || {});
44
+ }
45
+ catch (err) {
46
+ throw new Error_1.WhatsappError(`Failed to send status mention: ${err.message}`, { cause: err });
47
+ }
94
48
  }
95
-
96
49
  exports.sendStatusMentions = sendStatusMentions;
97
- /**
98
- * Low-level relayMessage-Wrapper für Baileys.
99
- *
100
- * @param {string} sessionId - Deine Session-ID
101
- * @param {string} jid - Ziel-JID oder Telefonnummer
102
- * @param {object} content - das rohe Message-Node-Objekt
103
- * @param {object} options - zusätzliche Relay-Optionen wie messageId, participant, additionalNodes, etc.
104
- *
105
- * @returns {Promise<string>} die gesendete Nachricht-ID
106
- */
107
- async function relayMessage(sessionId, jid, content, options = {}) {
108
- const session = getCachedSession(sessionId);
109
- if (!session) throw new Error_1.WhatsappError(`Session ${sessionId} nicht gefunden`);
110
50
 
111
- const destJid = jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
112
- try {
113
- // Baileys-intern sendet hier direkt das XML-Stanza
114
- return await session.relayMessage(destJid, content, options);
115
- } catch (err) {
116
- throw new Error_1.WhatsappError(`Relay an ${destJid} fehlgeschlagen: ${err.message}`, { cause: err });
117
- }
51
+ async function relayMessage(sessionId, jid, content, options = {}) {
52
+ const session = getCachedSession(sessionId);
53
+ const destJid = resolveJid(jid);
54
+ try {
55
+ return await session.relayMessage(destJid, content, options);
56
+ }
57
+ catch (err) {
58
+ throw new Error_1.WhatsappError(`Relay to ${destJid} failed: ${err.message}`, { cause: err });
59
+ }
118
60
  }
119
- exports.relayMessage = relayMessage;
61
+ exports.relayMessage = relayMessage;
@@ -1,24 +1,45 @@
1
- import { WASocket } from "@neelegirl/baileys";
1
+ import { WASocket } from "@neelegirl/baileys/lib";
2
2
  import type { MessageReceived, MessageUpdated, StartSessionParams } from "../Types";
3
+
3
4
  export declare const startSession: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
5
+
6
+ export declare const onimaii: (sessionId: string, connect: (config: any) => WASocket) => Promise<WASocket>;
7
+
8
+ export declare const startSessionWithPairingCode: (
9
+ sessionId?: string,
10
+ options?: {
11
+ phoneNumber: string;
12
+ },
13
+ pairingCode?: string
14
+ ) => Promise<WASocket>;
15
+
4
16
  /**
5
- * @deprecated Use startSession method instead
17
+ * @deprecated Use startSession method instead.
6
18
  */
7
19
  export declare const startWhatsapp: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
8
- export declare const startSessionWithPairingCode: (sessionId?: string, options?: {
9
- phoneNumber: string;
10
- }, key?: string) => Promise<WASocket>;
20
+
11
21
  export declare const deleteSession: (sessionId: string) => Promise<void>;
22
+
12
23
  export declare const getAllSession: () => string[];
24
+
13
25
  export declare const getSession: (key: string) => WASocket | undefined;
26
+
27
+ export declare const getAllSessionData: () => Record<string, WASocket | undefined>;
28
+
14
29
  export declare const loadSessionsFromStorage: () => Promise<string[]>;
30
+
31
+ export declare const sock: (conn: any) => any;
32
+
15
33
  export declare const onMessageReceived: (listener: (msg: MessageReceived) => any) => void;
16
- export declare const onQRUpdated: (listener: ({ sessionId, qr }: {
17
- sessionId: string;
18
- qr: string;
19
- }) => any) => void;
34
+
35
+ export declare const onQRUpdated: (listener: ({ sessionId, qr }: { sessionId: string; qr: string }) => any) => void;
36
+
20
37
  export declare const onConnected: (listener: (sessionId: string) => any) => void;
38
+
21
39
  export declare const onDisconnected: (listener: (sessionId: string) => any) => void;
40
+
22
41
  export declare const onConnecting: (listener: (sessionId: string) => any) => void;
23
- export declare const onMessageUpdate: (listener: (data: MessageUpdated) => any) => void;
24
- export declare const onPairingCode: (listener: (sessionId: string, code: string) => any) => void;
42
+
43
+ export declare const onMessageUpdate: (listener: (sessionId: string, data: MessageUpdated) => any) => void;
44
+
45
+ export declare const onPairingCode: (listener: (sessionId: string, code: string) => any) => void;
@@ -1,427 +1,379 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
1
+ "use strict";
37
2
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.onPairingCode = exports.onMessageUpdate = exports.onConnecting = exports.onDisconnected = exports.onConnected = exports.onQRUpdated = exports.onMessageReceived = exports.loadSessionsFromStorage = exports.getSession = exports.getAllSession = exports.deleteSession = exports.startWhatsapp = exports.startSession = void 0;
39
- const baileys_1 = __importStar(require("@neelegirl/baileys"));
40
- const pino_1 = __importDefault(require("pino"));
41
- const path_1 = __importDefault(require("path"));
42
- const fs_1 = __importDefault(require("fs"));
43
- const https_1 = __importDefault(require("https"));
3
+ exports.onPairingCode = exports.onMessageUpdate = exports.onConnecting = exports.onDisconnected = exports.onConnected = exports.onQRUpdated = exports.onMessageReceived = exports.sock = exports.loadSessionsFromStorage = exports.getAllSessionData = exports.getSession = exports.getAllSession = exports.deleteSession = exports.startWhatsapp = exports.startSessionWithPairingCode = exports.onimaii = exports.startSession = void 0;
4
+
5
+ const baileys_1 = require("@neelegirl/baileys");
6
+ const pino_1 = require("pino");
7
+ const path_1 = require("path");
8
+ const fs_1 = require("fs");
9
+ const https_1 = require("https");
44
10
  const Defaults_1 = require("../Defaults");
45
11
  const save_media_1 = require("../Utils/save-media");
46
12
  const Error_1 = require("../Error");
47
13
  const message_status_1 = require("../Utils/message-status");
14
+
48
15
  const sessions = new Map();
49
16
  const callback = new Map();
50
17
  const retryCount = new Map();
51
- let stock;
52
- const CURRENT_WA_API_VERSION = require("../../package.json").version || "1.6.2";
53
- // Update-Check-Funktion für WA-API
18
+
19
+ let CURRENT_WA_API_VERSION = "1.5.1";
20
+ let waApiUpdateCheckDone = false;
21
+
22
+ try {
23
+ const pkg = require("../../package.json");
24
+ if (pkg && typeof pkg.version === "string") {
25
+ CURRENT_WA_API_VERSION = pkg.version;
26
+ }
27
+ }
28
+ catch (_) {
29
+ }
30
+
31
+ const isNewerVersion = (latest, current) => {
32
+ if (!latest || !current) {
33
+ return false;
34
+ }
35
+ const a = current.split(".").map((n) => parseInt(n, 10) || 0);
36
+ const b = latest.split(".").map((n) => parseInt(n, 10) || 0);
37
+ for (let i = 0; i < Math.max(a.length, b.length); i += 1) {
38
+ const x = a[i] || 0;
39
+ const y = b[i] || 0;
40
+ if (y > x) {
41
+ return true;
42
+ }
43
+ if (y < x) {
44
+ return false;
45
+ }
46
+ }
47
+ return false;
48
+ };
49
+
54
50
  const checkWaApiUpdate = () => {
51
+ if (waApiUpdateCheckDone) {
52
+ return Promise.resolve(null);
53
+ }
54
+ waApiUpdateCheckDone = true;
55
55
  return new Promise((resolve) => {
56
- const url = `https://registry.npmjs.org/@neelegirl/wa-api/latest`;
57
- https_1.default.get(url, { timeout: 5000 }, (res) => {
58
- let data = '';
59
- res.on('data', (chunk) => {
56
+ const url = "https://registry.npmjs.org/@neelegirl/wa-api/latest";
57
+ https_1.get(url, { timeout: 5000 }, (res) => {
58
+ let data = "";
59
+ res.on("data", (chunk) => {
60
60
  data += chunk;
61
61
  });
62
- res.on('end', () => {
62
+ res.on("end", () => {
63
63
  try {
64
- const packageInfo = JSON.parse(data);
65
- const latestVersion = packageInfo.version;
66
- if (latestVersion && latestVersion !== CURRENT_WA_API_VERSION) {
67
- const updateMessage = `\n╔════════════════════════════════════════╗\n║ 🔔 NEUES UPDATE VERFÜGBAR! 🔔 ║\n╠════════════════════════════════════════╣\n║ @neelegirl/wa-api ║\n║ Aktuelle Version: ${CURRENT_WA_API_VERSION.padEnd(20)} ║\n║ Neue Version: ${latestVersion.padEnd(20)} ║\n║ ║\n║ Bitte aktualisiere: ║\n║ npm install @neelegirl/wa-api@latest ║\n╚════════════════════════════════════════╝\n`;
68
- console.log(updateMessage);
64
+ const latestVersion = JSON.parse(data)?.version;
65
+ if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
66
+ console.log(
67
+ [
68
+ "",
69
+ "[wa-api] Update available",
70
+ `Current: ${CURRENT_WA_API_VERSION}`,
71
+ `Latest: ${latestVersion}`,
72
+ "Run: npm install @neelegirl/wa-api@latest",
73
+ ""
74
+ ].join("\n")
75
+ );
69
76
  resolve({
70
77
  current: CURRENT_WA_API_VERSION,
71
78
  latest: latestVersion,
72
79
  hasUpdate: true
73
80
  });
81
+ return;
74
82
  }
75
- else {
76
- const currentVersionMessage = `\n╔════════════════════════════════════════╗\n║ ✅ Du nutzt gerade die aktuelle ║\n║ Version von @neelegirl/wa-api ║\n║ ║\n║ Wir informieren dich, wenn es ein ║\n║ Update gibt. ║\n╚════════════════════════════════════════╝\n`;
77
- console.log(currentVersionMessage);
78
- resolve({
79
- current: CURRENT_WA_API_VERSION,
80
- latest: latestVersion,
81
- hasUpdate: false
82
- });
83
- }
83
+ resolve({
84
+ current: CURRENT_WA_API_VERSION,
85
+ latest: latestVersion || CURRENT_WA_API_VERSION,
86
+ hasUpdate: false
87
+ });
84
88
  }
85
- catch (error) {
89
+ catch (_) {
86
90
  resolve(null);
87
91
  }
88
92
  });
89
- }).on('error', () => {
90
- resolve(null);
91
- }).on('timeout', () => {
92
- resolve(null);
93
- });
93
+ }).on("error", () => resolve(null))
94
+ .on("timeout", () => resolve(null));
94
95
  });
95
96
  };
96
- const startSession = (sessionId = "mysession", options = { printQR: true }) => __awaiter(void 0, void 0, void 0, function* () {
97
- // Prüfe auf Updates beim Start
98
- checkWaApiUpdate().catch(() => {
99
- // Silently fail if update check fails
100
- });
101
- if (isSessionExistAndRunning(sessionId))
102
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
103
- const logger = (0, pino_1.default)({ level: "silent" });
104
- const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
105
- const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
106
- const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
107
- const sock = (0, baileys_1.default)({
108
- version,
109
- printQRInTerminal: options.printQR,
110
- auth: state,
111
- logger,
112
- markOnlineOnConnect: false,
113
- browser: baileys_1.Browsers.ubuntu("Chrome"),
114
- });
115
- sessions.set(sessionId, sock);
116
- try {
117
-
118
- sock.ev.process((events) => __awaiter(void 0, void 0, void 0, function* () {
119
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
120
- if (events["connection.update"]) {
121
- const update = events["connection.update"];
122
- const { connection, lastDisconnect } = update;
123
- if (update.qr) {
124
- (_a = callback.get(Defaults_1.CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
125
- sessionId,
126
- qr: update.qr,
127
- });
128
- }
129
- if (connection == "connecting") {
130
- (_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
131
- }
132
- if (connection === "close") {
133
- const code = (_d = (_c = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _c === void 0 ? void 0 : _c.output) === null || _d === void 0 ? void 0 : _d.statusCode;
134
- let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
135
- let shouldRetry;
136
- if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
137
- shouldRetry = true;
138
- }
139
- if (shouldRetry) {
140
- retryAttempt++;
141
- }
142
- if (shouldRetry) {
143
- retryCount.set(sessionId, retryAttempt);
144
- startSocket();
145
- }
146
- else {
147
- //retryCount.delete(sessionId);
148
- (0, exports.deleteSession)(sessionId);
149
- (_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
150
- }
151
- }
152
- if (connection == "open") {
153
- retryCount.delete(sessionId);
154
- (_g = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
155
- }
156
- }
157
- if (events["creds.update"]) {
158
- yield saveCreds();
159
- }
160
- if (events["messages.update"]) {
161
- const msg = events["messages.update"][0];
162
- const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
163
- (_h = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _h === void 0 ? void 0 : _h(sessionId, data);
97
+
98
+ const emitMessageUpsert = (sessionId, msg) => {
99
+ msg.sessionId = sessionId;
100
+ msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
101
+ msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
102
+ msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
103
+ callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ ...msg });
104
+ };
105
+
106
+ const attachSocketEvents = (sessionId, sock, saveCreds, restartSocket) => {
107
+ sock.ev.process(async (events) => {
108
+ if (events["connection.update"]) {
109
+ const update = events["connection.update"];
110
+ const { connection, lastDisconnect } = update;
111
+ if (update.qr) {
112
+ callback.get(Defaults_1.CALLBACK_KEY.ON_QR)?.({
113
+ sessionId,
114
+ qr: update.qr
115
+ });
116
+ }
117
+ if (connection === "connecting") {
118
+ callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)?.(sessionId);
119
+ }
120
+ if (connection === "close") {
121
+ const code = lastDisconnect?.error?.output?.statusCode;
122
+ let retryAttempt = retryCount.get(sessionId) ?? 0;
123
+ const shouldRetry = code !== baileys_1.DisconnectReason.loggedOut && retryAttempt < 10;
124
+ if (shouldRetry) {
125
+ retryAttempt += 1;
126
+ retryCount.set(sessionId, retryAttempt);
127
+ restartSocket();
164
128
  }
165
- if (events["messages.upsert"]) {
166
- const msg = (_j = events["messages.upsert"]
167
- .messages) === null || _j === void 0 ? void 0 : _j[0];
168
- msg.sessionId = sessionId;
169
- msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
170
- msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
171
- msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
172
- (_k = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _k === void 0 ? void 0 : _k(Object.assign({}, msg));
129
+ else {
130
+ retryCount.delete(sessionId);
131
+ await (0, exports.deleteSession)(sessionId);
132
+ callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId);
173
133
  }
174
- }));
175
- return sock;
134
+ }
135
+ if (connection === "open") {
136
+ retryCount.delete(sessionId);
137
+ callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
138
+ }
176
139
  }
177
- catch (error) {
178
- // console.log("SOCKET ERROR", error);
179
- return sock;
140
+ if (events["creds.update"]) {
141
+ await saveCreds();
142
+ }
143
+ if (events["messages.update"]) {
144
+ const msg = events["messages.update"][0];
145
+ if (msg) {
146
+ const data = {
147
+ ...msg,
148
+ sessionId,
149
+ messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update?.status)
150
+ };
151
+ callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data);
152
+ }
153
+ }
154
+ if (events["messages.upsert"]) {
155
+ const msg = events["messages.upsert"]?.messages?.[0];
156
+ if (msg) {
157
+ emitMessageUpsert(sessionId, msg);
158
+ }
180
159
  }
181
160
  });
182
- return startSocket();
183
- });
184
- const onimaii = (sessionId = "mysession", connect) => __awaiter(void 0, void 0, void 0, function* () {
185
- if (isSessionExistAndRunning(sessionId))
186
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
187
- const logger = (0, pino_1.default)({ level: "silent" });
188
- const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
189
- const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
190
- const sock = (0, connect)({
191
- version,
192
- printQRInTerminal: true,
193
- auth: state,
194
- logger,
195
- markOnlineOnConnect: false,
196
- browser: baileys_1.Browsers.ubuntu("Chrome"),
197
- });
198
- })
199
- exports.onimaii = onimaii;
200
- exports.startSession = startSession;
201
- const startSessionWithPairingCode = (sessionId = "mysession", options = {}, key) => __awaiter(void 0, void 0, void 0, function* () {
202
- if (!options.phoneNumber)
203
- throw new Error_1.WhatsappError(Defaults_1.Messages.paremetersRequired("phoneNumber"));
204
- if (isSessionExistAndRunning(sessionId))
205
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
206
- const logger = (0, pino_1.default)({ level: "silent" });
207
- const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
208
- const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
209
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
210
- const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
211
-
212
- const sock = (0, baileys_1.default)({
213
- version,
214
- printQRInTerminal: false,
215
- auth: state,
216
- logger,
217
- markOnlineOnConnect: false,
218
- browser: baileys_1.Browsers.ubuntu("Chrome"),
219
- });
220
- sessions.set(sessionId, sock);
221
- try {
222
- if (!sock.authState.creds.registered) {
223
- console.log("first time pairing");
224
- setTimeout(async () => {
225
- const code = await sock.requestPairingCode(options.phoneNumber,key);
226
- console.log(code);
227
-
228
- callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
161
+ };
162
+
163
+ const createSessionSocket = async (sessionId, options = {}, retryStarter) => {
164
+ const logger = (0, pino_1)({ level: "silent" });
165
+ const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
166
+ const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
167
+ path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)
168
+ );
169
+ const sock = (0, baileys_1.default)({
170
+ version,
171
+ printQRInTerminal: !!options.printQR,
172
+ auth: state,
173
+ logger,
174
+ markOnlineOnConnect: false,
175
+ browser: baileys_1.Browsers.ubuntu("Chrome")
176
+ });
177
+ sessions.set(sessionId, { ...sock });
178
+ attachSocketEvents(sessionId, sock, saveCreds, retryStarter);
179
+ if (options.phoneNumber && !sock.authState?.creds?.registered) {
180
+ setTimeout(async () => {
181
+ try {
182
+ const code = await sock.requestPairingCode(options.phoneNumber, options.pairingCode);
183
+ callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
184
+ }
185
+ catch (_) {
186
+ }
229
187
  }, 5000);
230
- }
231
- sock.ev.process(async (events) => {
232
- if (events["connection.update"]) {
233
- const update = events["connection.update"];
234
- const { connection, lastDisconnect } = update;
235
-
236
- if (connection == "connecting") {
237
- (_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
238
- }
239
- if (connection === "close") {
240
- const code = (_d = (_c = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _c === void 0 ? void 0 : _c.output) === null || _d === void 0 ? void 0 : _d.statusCode;
241
- let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
242
- let shouldRetry;
243
- if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
244
- shouldRetry = true;
245
- }
246
- if (shouldRetry) {
247
- retryAttempt++;
248
- }
249
- if (shouldRetry) {
250
- retryCount.set(sessionId, retryAttempt);
251
- startSocket();
252
- }
253
- else {
254
- retryCount.delete(sessionId);
255
- (0, exports.deleteSession)(sessionId);
256
- (_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
257
- }
258
- }
259
- if (connection == "open") {
260
- retryCount.delete(sessionId);
261
- callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
262
- }
263
188
  }
264
- if (events["creds.update"]) {
265
- await saveCreds();
189
+ return sock;
190
+ };
191
+
192
+ const isSessionExistAndRunning = (sessionId) => {
193
+ const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
194
+ return (
195
+ fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
196
+ fs_1.existsSync(credsPath) &&
197
+ fs_1.readdirSync(credsPath).length > 0 &&
198
+ (0, exports.getSession)(sessionId)
199
+ );
200
+ };
201
+
202
+ const shouldLoadSession = (sessionId) => {
203
+ const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
204
+ return (
205
+ fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
206
+ fs_1.existsSync(credsPath) &&
207
+ fs_1.readdirSync(credsPath).length > 0 &&
208
+ !(0, exports.getSession)(sessionId)
209
+ );
210
+ };
211
+
212
+ const startSession = async (sessionId = "mysession", options = { printQR: true }) => {
213
+ checkWaApiUpdate().catch(() => { });
214
+ if (isSessionExistAndRunning(sessionId)) {
215
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
216
+ }
217
+ const starter = () => createSessionSocket(sessionId, { printQR: options?.printQR !== false }, starter);
218
+ return starter();
219
+ };
220
+ exports.startSession = startSession;
221
+
222
+ const onimaii = async (sessionId = "mysession", connect) => {
223
+ if (typeof connect !== "function") {
224
+ throw new Error_1.WhatsappError("connect must be a function");
266
225
  }
267
- if (events["messages.update"]) {
268
- const msg = events["messages.update"][0];
269
- const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
270
- (_h = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _h === void 0 ? void 0 : _h(sessionId, data);
271
- }
272
- if (events["messages.upsert"]) {
273
- const msg = (_j = events["messages.upsert"]
274
- .messages) === null || _j === void 0 ? void 0 : _j[0];
275
- msg.sessionId = sessionId;
276
- msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
277
- msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
278
- msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
279
- (_k = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _k === void 0 ? void 0 : _k(Object.assign({}, msg));
280
- }
281
- });
282
- return sock;
283
- }
284
- catch (error) {
285
- // console.log("SOCKET ERROR", error);
286
- return sock;
287
- }
226
+ if (isSessionExistAndRunning(sessionId)) {
227
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
228
+ }
229
+ const logger = (0, pino_1)({ level: "silent" });
230
+ const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
231
+ const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
232
+ path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)
233
+ );
234
+ const sock = connect({
235
+ version,
236
+ printQRInTerminal: true,
237
+ auth: state,
238
+ logger,
239
+ markOnlineOnConnect: false,
240
+ browser: baileys_1.Browsers.ubuntu("Chrome")
288
241
  });
289
- return startSocket();
290
- });
291
- /**
292
- * @deprecated Use startSession method instead
293
- */
294
- exports.startSessionWithPairingCode = startSessionWithPairingCode
242
+ sessions.set(sessionId, { ...sock });
243
+ if (sock?.ev?.on) {
244
+ sock.ev.on("creds.update", saveCreds);
245
+ }
246
+ return sock;
247
+ };
248
+ exports.onimaii = onimaii;
249
+
250
+ const startSessionWithPairingCode = async (
251
+ sessionId = "mysession",
252
+ options = { phoneNumber: "" },
253
+ pairingCode
254
+ ) => {
255
+ if (isSessionExistAndRunning(sessionId)) {
256
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
257
+ }
258
+ if (!options?.phoneNumber) {
259
+ throw new Error_1.WhatsappError("phoneNumber is required for pairing mode");
260
+ }
261
+ const starter = () => createSessionSocket(
262
+ sessionId,
263
+ { printQR: false, phoneNumber: options.phoneNumber, pairingCode },
264
+ starter
265
+ );
266
+ return starter();
267
+ };
268
+ exports.startSessionWithPairingCode = startSessionWithPairingCode;
269
+
295
270
  exports.startWhatsapp = exports.startSession;
296
- const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
271
+
272
+ const deleteSession = async (sessionId) => {
297
273
  const session = (0, exports.getSession)(sessionId);
298
274
  try {
299
- yield (session === null || session === void 0 ? void 0 : session.logout());
275
+ await session?.logout?.();
276
+ }
277
+ catch (_) {
300
278
  }
301
- catch (error) { }
302
- session === null || session === void 0 ? void 0 : session.end(undefined);
279
+ session?.end?.(undefined);
303
280
  sessions.delete(sessionId);
304
- const dir = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
305
- if (fs_1.default.existsSync(dir)) {
306
- fs_1.default.rmSync(dir, { force: true, recursive: true });
281
+ const dir = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
282
+ if (fs_1.existsSync(dir)) {
283
+ fs_1.rmSync(dir, { force: true, recursive: true });
307
284
  }
308
- });
285
+ };
309
286
  exports.deleteSession = deleteSession;
287
+
310
288
  const getAllSession = () => Array.from(sessions.keys());
311
289
  exports.getAllSession = getAllSession;
290
+
312
291
  const getSession = (key) => sessions.get(key);
313
292
  exports.getSession = getSession;
314
- const isSessionExistAndRunning = (sessionId) => {
315
- if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
316
- fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
317
- fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
318
- (0, exports.getSession)(sessionId)) {
319
- return true;
320
- }
321
- return false;
322
- };
323
- const shouldLoadSession = (sessionId) => {
324
- if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
325
- fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
326
- fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
327
- !(0, exports.getSession)(sessionId)) {
328
- return true;
329
- }
330
- return false;
331
- };
332
- const getAllSessionData = () => {
333
- // Angenommen, getAllSession gibt eine Liste aller aktiven Sessions zurück
334
- let allSessions = getAllSession();
335
- let allSessionData = {};
336
293
 
337
- for(let i = 0; i < allSessions.length; i++) {
338
- let sessionName = allSessions[i];
339
- allSessionData[sessionName] = getSession(sessionName);
294
+ const getAllSessionData = () => {
295
+ const allSessionData = {};
296
+ for (const sessionName of (0, exports.getAllSession)()) {
297
+ allSessionData[sessionName] = (0, exports.getSession)(sessionName);
340
298
  }
341
-
342
299
  return allSessionData;
343
- }
300
+ };
344
301
  exports.getAllSessionData = getAllSessionData;
345
302
 
346
- async function loadSessionsFromStorage() {
347
- const dirPath = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
303
+ const loadSessionsFromStorage = async () => {
304
+ const dirPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
348
305
  const loadedSessions = [];
349
-
350
- // Ordner anlegen, falls nicht existiert
351
- if (!fs_1.default.existsSync(dirPath)) {
352
- fs_1.default.mkdirSync(dirPath, { recursive: true });
306
+ if (!fs_1.existsSync(dirPath)) {
307
+ fs_1.mkdirSync(dirPath, { recursive: true });
353
308
  }
354
-
355
- try {
356
- const entries = await fs_1.default.promises.readdir(dirPath);
357
-
358
- for (const entry of entries) {
359
- const fullPath = path_1.default.join(dirPath, entry);
309
+ const entries = await fs_1.promises.readdir(dirPath);
310
+ for (const entry of entries) {
311
+ const fullPath = path_1.join(dirPath, entry);
360
312
  let stat;
361
313
  try {
362
- stat = await fs_1.default.promises.stat(fullPath);
363
- } catch {
364
- // Wenn sich die Datei zwischenzeitlich entfernt hat o.Ä., überspringen
365
- continue;
314
+ stat = await fs_1.promises.stat(fullPath);
315
+ }
316
+ catch (_) {
317
+ continue;
318
+ }
319
+ if (!stat.isDirectory()) {
320
+ continue;
321
+ }
322
+ const underscoreIndex = entry.indexOf("_");
323
+ const sessionId = underscoreIndex > 0 ? entry.slice(0, underscoreIndex) : entry;
324
+ if (!shouldLoadSession(sessionId)) {
325
+ continue;
366
326
  }
367
- if (!stat.isDirectory()) continue;
368
-
369
- // sessionId bis zum ersten Unterstrich extrahieren
370
- const underscoreIndex = entry.indexOf('_');
371
- const sessionId = underscoreIndex > 0
372
- ? entry.slice(0, underscoreIndex)
373
- : entry; // oder continue, wenn du ohne _ nicht laden willst
374
-
375
327
  try {
376
- await (0, exports.startSession)(sessionId);
377
- loadedSessions.push(sessionId);
378
- } catch (err) {
379
- console.error(`Fehler beim Starten der Session "${sessionId}":`, err);
380
- // weitere Sessions trotzdem laden
328
+ await (0, exports.startSession)(sessionId);
329
+ loadedSessions.push(sessionId);
330
+ }
331
+ catch (_) {
381
332
  }
382
- }
383
-
384
- return loadedSessions;
385
- } catch (err) {
386
- console.error('Fehler beim Lesen des Session-Verzeichnisses:', err);
387
- throw err; // oder wirf einen eigenen WhatsappError o.Ä.
388
333
  }
389
- }
390
- exports.loadSessionsFromStorage = loadSessionsFromStorage;
391
- const onMessageReceived = (listener) => {
392
- callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
334
+ return loadedSessions;
393
335
  };
336
+ exports.loadSessionsFromStorage = loadSessionsFromStorage;
394
337
 
395
338
  const sock = (conn) => {
396
- onMessageReceived(async(msg) =>{
397
- let {sessionId} = msg;
398
- let sock1 = (0, exports.getSession)(sessionId)
399
- conn = sock1
400
- })
401
- };
339
+ (0, exports.onMessageReceived)((msg) => {
340
+ conn = (0, exports.getSession)(msg.sessionId);
341
+ });
342
+ return conn;
343
+ };
402
344
  exports.sock = sock;
345
+
346
+ const onMessageReceived = (listener) => {
347
+ callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
348
+ };
403
349
  exports.onMessageReceived = onMessageReceived;
350
+
404
351
  const onQRUpdated = (listener) => {
405
352
  callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
406
353
  };
407
354
  exports.onQRUpdated = onQRUpdated;
355
+
408
356
  const onConnected = (listener) => {
409
357
  callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
410
358
  };
411
359
  exports.onConnected = onConnected;
360
+
412
361
  const onDisconnected = (listener) => {
413
362
  callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
414
363
  };
415
364
  exports.onDisconnected = onDisconnected;
365
+
416
366
  const onConnecting = (listener) => {
417
367
  callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
418
368
  };
419
369
  exports.onConnecting = onConnecting;
370
+
420
371
  const onMessageUpdate = (listener) => {
421
372
  callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
422
373
  };
423
374
  exports.onMessageUpdate = onMessageUpdate;
375
+
424
376
  const onPairingCode = (listener) => {
425
377
  callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
426
378
  };
427
- exports.onPairingCode = onPairingCode;
379
+ exports.onPairingCode = onPairingCode;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { WAMessageUpdate, proto } from "@neelegirl/baileys";
2
+ import { WAMessageUpdate, proto } from "@neelegirl/baileys/lib";
3
3
  export interface SendMessageTypes {
4
4
  to: string | number;
5
5
  text?: string;
@@ -195,5 +195,6 @@ class Whatsapp {
195
195
  }));
196
196
  });
197
197
  }
198
- }
198
+ }
199
199
  exports.Whatsapp = Whatsapp;
200
+ // Intentionally no side effects on import.
package/package.json CHANGED
@@ -1,39 +1,45 @@
1
1
  {
2
2
  "name": "@neelegirl/wa-api",
3
- "version": "1.6.2",
4
- "description": "Multi-session WhatsApp wrapper built on @neelegirl/baileys for QR, pairing and message automation.",
5
- "keywords": [
6
- "whatsapp",
7
- "wa-api",
8
- "multi-session",
9
- "pairing",
10
- "qr",
11
- "automation",
12
- "neelegirl"
13
- ],
14
- "homepage": "https://github.com/neelegirly/neelegirl-wa-api#readme",
3
+ "version": "1.6.3",
4
+ "description": "Multi-session WhatsApp API wrapper built on @neelegirl/baileys",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
15
7
  "repository": {
16
8
  "type": "git",
17
- "url": "git+https://github.com/neelegirly/neelegirl-wa-api.git"
9
+ "url": "git+https://github.com/neelegirl/wa-api.git"
18
10
  },
11
+ "homepage": "https://github.com/neelegirl/wa-api#readme",
19
12
  "bugs": {
20
- "url": "https://github.com/neelegirly/neelegirl-wa-api/issues"
13
+ "url": "https://github.com/neelegirl/wa-api/issues"
21
14
  },
22
- "license": "ISC",
23
- "author": "Neele",
24
- "main": "dist/index.js",
25
- "types": "dist/index.d.ts",
26
15
  "files": [
27
16
  "dist/**/*",
28
- "readme.md",
29
- "LICENSE"
17
+ "readme.md"
30
18
  ],
31
19
  "scripts": {
32
- "test": "node -e \"require('./dist')\""
20
+ "build": "tsc",
21
+ "start": "node ./dist/index.js",
22
+ "start:dev": "tsc && node ./dist/index.js",
23
+ "test": "node -e \"console.log('No tests configured')\""
33
24
  },
25
+ "author": "Neele",
26
+ "license": "MIT",
34
27
  "dependencies": {
35
- "@neelegirl/baileys": "^2.1.2",
36
- "pino": "^9.6.0"
28
+ "@neelegirl/baileys": "^2.1.0",
29
+ "pino": "^8.11.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/mime": "^3.0.1",
33
+ "jest": "^29.0.0"
34
+ },
35
+ "keywords": [
36
+ "whatsapp",
37
+ "baileys",
38
+ "multi-session",
39
+ "wa-api"
40
+ ],
41
+ "peerDependencies": {
42
+ "@neelegirl/baileys": "^2.1.0"
37
43
  },
38
44
  "engines": {
39
45
  "node": ">=20.0.0"
package/readme.md CHANGED
@@ -1,140 +1,88 @@
1
- <p align="center">
2
- <img src="https://files.catbox.moe/6np1ii.JPG" alt="@neelegirl/wa-api" width="900" />
3
- </p>
1
+ # @neelegirl/wa-api
4
2
 
5
- # @neelegirl/wa-api
3
+ ![Neelegirl wa-api](https://files.catbox.moe/6np1ii.JPG)
6
4
 
7
- Mehrfach-Session-Wrapper fuer WhatsApp auf Basis von `@neelegirl/baileys`.
8
- Das Paket kapselt Session-Start, Pairing, Listener und einfache Message-Helper,
9
- ohne selbst ein eigenes REST- oder Queue-System mitzubringen.
5
+ High-level multi-session API wrapper for WhatsApp automation, built on `@neelegirl/baileys`.
10
6
 
11
- **Version 1.6.2** · **Node.js 20+** · **basiert auf `@neelegirl/baileys` 2.1.2**
7
+ ## Status
12
8
 
13
- ## Stand
9
+ - Package version: `1.6.0`
10
+ - Runtime: Node.js `>=20`
11
+ - Core dependency: `@neelegirl/baileys` `^2.1.0`
14
12
 
15
- - basiert auf `@neelegirl/baileys` `2.1.2`
16
- - Multi-Session-Management ueber Dateispeicher
17
- - QR-Login und Pairing-Code-Login
18
- - Helper fuer `sendMessage`, `sendStatusMentions` und `relayMessage`
19
- - Listener fuer Verbindung, QR, Pairing-Code und Nachrichten
13
+ ## Features
20
14
 
21
- ## Voraussetzungen
15
+ - Multi-session start/stop with filesystem credentials
16
+ - QR flow via callback
17
+ - Pairing-code flow via callback
18
+ - Auto reconnect retries (up to 10 attempts)
19
+ - Message upsert/update callbacks with helper media savers
20
+ - `sendMessage`, `sendStatusMentions`, and low-level `relayMessage`
22
21
 
23
- - Node.js `>= 20`
24
- - installierte `@neelegirl/baileys`-Abhaengigkeit
25
- - optional `qrcode-terminal`, wenn `printQR: true` fuer Terminal-QR genutzt wird
26
-
27
- ## Installation
22
+ ## Install
28
23
 
29
24
  ```bash
30
25
  npm install @neelegirl/wa-api
31
26
  ```
32
27
 
33
- Optional fuer Terminal-QR:
34
-
35
- ```bash
36
- npm install qrcode-terminal
37
- ```
38
-
39
- ## Schnellstart
28
+ ## Quick Start
40
29
 
41
30
  ```js
42
31
  const wa = require('@neelegirl/wa-api')
43
32
 
44
33
  wa.onQRUpdated(({ sessionId, qr }) => {
45
- console.log('QR aktualisiert:', sessionId, qr)
34
+ console.log('QR for session:', sessionId)
35
+ console.log(qr)
46
36
  })
47
37
 
48
38
  wa.onConnected((sessionId) => {
49
- console.log('Verbunden:', sessionId)
50
- })
51
-
52
- wa.onMessageReceived((msg) => {
53
- console.log('Nachricht in Session', msg.sessionId)
39
+ console.log('connected:', sessionId)
54
40
  })
55
41
 
56
- async function main() {
57
- await wa.startSession('session1', { printQR: true })
58
- }
42
+ wa.onMessageReceived(async (msg) => {
43
+ const sessionId = msg.sessionId
44
+ const jid = msg.key?.remoteJid
45
+ const text = msg.message?.conversation || msg.message?.extendedTextMessage?.text || ''
59
46
 
60
- main().catch(console.error)
61
- ```
62
-
63
- ## Pairing-Code-Login
64
-
65
- ```js
66
- const wa = require('@neelegirl/wa-api')
67
-
68
- async function main() {
69
- await wa.startSessionWithPairingCode(
70
- 'session2',
71
- { phoneNumber: '491234567890' },
72
- 'ONIMAIII'
73
- )
74
- }
75
-
76
- wa.onPairingCode((sessionId, code) => {
77
- console.log('Pairing-Code fuer', sessionId, code)
47
+ if (jid && text.toLowerCase() === 'ping') {
48
+ await wa.sendMessage(sessionId, jid, { text: 'pong' })
49
+ }
78
50
  })
79
51
 
80
- main().catch(console.error)
52
+ wa.startSession('main', { printQR: true }).catch(console.error)
81
53
  ```
82
54
 
83
- Der dritte Parameter ist optional. Wenn ein eigener Code gesetzt wird, muss er
84
- 8 Zeichen lang sein.
85
-
86
- ## Nachrichten senden
87
-
88
- ```js
89
- const wa = require('@neelegirl/wa-api')
90
-
91
- await wa.sendMessage('session1', '491234567890', { text: 'Hallo' })
92
-
93
- await wa.sendStatusMentions('session1', {
94
- text: 'Status mit Mentions'
95
- })
96
-
97
- await wa.relayMessage(
98
- 'session1',
99
- 'status@broadcast',
100
- {
101
- protocolMessage: {
102
- type: 14
103
- }
104
- },
105
- {}
106
- )
107
- ```
108
-
109
- ## Sessions aus dem Speicher laden
110
-
111
- ```js
112
- const wa = require('@neelegirl/wa-api')
113
-
114
- const loaded = await wa.loadSessionsFromStorage()
115
- console.log('Geladene Sessions:', loaded)
116
- ```
55
+ ## API Surface
117
56
 
118
- `loadSessionsFromStorage()` liefert die erfolgreich geladenen Session-IDs zurueck.
57
+ - Session lifecycle
58
+ - `startSession(sessionId, options)`
59
+ - `startSessionWithPairingCode(sessionId, { phoneNumber }, pairingCode?)`
60
+ - `deleteSession(sessionId)`
61
+ - `getSession(sessionId)`
62
+ - `getAllSession()`
63
+ - `loadSessionsFromStorage()`
119
64
 
120
- ## Verfuegbare Listener
65
+ - Messaging
66
+ - `sendMessage(sessionId, jidOrPhone, content, options?)`
67
+ - `sendStatusMentions(sessionId, content, options?)`
68
+ - `relayMessage(sessionId, jidOrPhone, content, options?)`
121
69
 
122
- - `onQRUpdated`
123
- - `onConnected`
124
- - `onDisconnected`
125
- - `onConnecting`
126
- - `onMessageReceived`
127
- - `onMessageUpdate`
128
- - `onPairingCode`
70
+ - Events
71
+ - `onMessageReceived(listener)`
72
+ - `onMessageUpdate(listener)`
73
+ - `onQRUpdated(listener)`
74
+ - `onConnected(listener)`
75
+ - `onConnecting(listener)`
76
+ - `onDisconnected(listener)`
77
+ - `onPairingCode(listener)`
129
78
 
130
- ## Grenzen
79
+ ## Operational Notes
131
80
 
132
- - kein eingebauter HTTP-Server
133
- - kein Queue-System
134
- - keine Word2Web-spezifischen Features im Paket
135
- - veroeffentlicht als vorgebaute `dist/`-Distribution
136
- - das Low-Level-Verhalten kommt direkt aus `@neelegirl/baileys`
81
+ - Credentials are stored under `wa_credentials/<session>_credentials`.
82
+ - The package performs a lightweight npm update check once per process start.
83
+ - No dedicated Word2Web module is shipped in this package.
137
84
 
138
- ## Lizenz
85
+ ## Legal
139
86
 
140
- ISC
87
+ This project is not affiliated with WhatsApp.
88
+ Use responsibly and comply with applicable laws and platform terms.