@neelegirl/wa-api 1.6.9 → 1.7.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.
@@ -1,426 +1,440 @@
1
- "use strict";
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
+ };
2
37
  Object.defineProperty(exports, "__esModule", { value: true });
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");
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"));
10
44
  const Defaults_1 = require("../Defaults");
11
45
  const save_media_1 = require("../Utils/save-media");
12
46
  const Error_1 = require("../Error");
13
47
  const message_status_1 = require("../Utils/message-status");
14
-
15
48
  const sessions = new Map();
16
49
  const callback = new Map();
17
50
  const retryCount = new Map();
18
- const TERMINAL_QR_FORCE_ENV = String(process.env.ONIMAI_FORCE_TERMINAL_QR || "").trim();
19
-
20
- let CURRENT_WA_API_VERSION = "1.6.5";
51
+ let stock;
52
+ const CURRENT_WA_API_VERSION = "1.3.3";
21
53
  let waApiUpdateCheckDone = false;
22
54
 
23
- try {
24
- const pkg = require("../../package.json");
25
- if (pkg && typeof pkg.version === "string") {
26
- CURRENT_WA_API_VERSION = pkg.version;
27
- }
28
- }
29
- catch (_) {
30
- }
31
-
32
- const isNewerVersion = (latest, current) => {
33
- if (!latest || !current) {
34
- return false;
35
- }
36
- const a = current.split(".").map((n) => parseInt(n, 10) || 0);
37
- const b = latest.split(".").map((n) => parseInt(n, 10) || 0);
38
- for (let i = 0; i < Math.max(a.length, b.length); i += 1) {
39
- const x = a[i] || 0;
40
- const y = b[i] || 0;
41
- if (y > x) {
42
- return true;
43
- }
44
- if (y < x) {
45
- return false;
46
- }
55
+ function isNewerVersion(latest, current) {
56
+ if (!latest || !current) return false;
57
+ const a = current.split('.').map((n) => parseInt(n, 10) || 0);
58
+ const b = latest.split('.').map((n) => parseInt(n, 10) || 0);
59
+ for (let i = 0; i < Math.max(a.length, b.length); i++) {
60
+ const x = a[i] || 0, y = b[i] || 0;
61
+ if (y > x) return true;
62
+ if (y < x) return false;
47
63
  }
48
64
  return false;
49
- };
65
+ }
50
66
 
67
+ // Liest von der offiziellen npm-Registry (registry.npmjs.org), ob ein Update existiert – nur 1x pro Prozess
51
68
  const checkWaApiUpdate = () => {
52
69
  if (waApiUpdateCheckDone) {
53
70
  return Promise.resolve(null);
54
71
  }
55
72
  waApiUpdateCheckDone = true;
56
73
  return new Promise((resolve) => {
57
- const url = "https://registry.npmjs.org/@neelegirl/wa-api/latest";
58
- https_1.get(url, { timeout: 5000 }, (res) => {
59
- let data = "";
60
- res.on("data", (chunk) => {
74
+ const url = `https://registry.npmjs.org/@neelegirl/wa-api/latest`;
75
+ https_1.default.get(url, { timeout: 5000 }, (res) => {
76
+ let data = '';
77
+ res.on('data', (chunk) => {
61
78
  data += chunk;
62
79
  });
63
- res.on("end", () => {
80
+ res.on('end', () => {
64
81
  try {
65
- const latestVersion = JSON.parse(data)?.version;
82
+ const packageInfo = JSON.parse(data);
83
+ const latestVersion = packageInfo.version;
66
84
  if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
67
- console.log(
68
- [
69
- "",
70
- "[wa-api] Update available",
71
- `Current: ${CURRENT_WA_API_VERSION}`,
72
- `Latest: ${latestVersion}`,
73
- "Run: npm install @neelegirl/wa-api@latest",
74
- ""
75
- ].join("\n")
76
- );
85
+ 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`;
86
+ console.log(updateMessage);
77
87
  resolve({
78
88
  current: CURRENT_WA_API_VERSION,
79
89
  latest: latestVersion,
80
90
  hasUpdate: true
81
91
  });
82
- return;
83
92
  }
84
- resolve({
85
- current: CURRENT_WA_API_VERSION,
86
- latest: latestVersion || CURRENT_WA_API_VERSION,
87
- hasUpdate: false
88
- });
93
+ else {
94
+ const currentVersionMessage = `\n╔════════════════════════════════════════╗\n║ ✅ Du nutzt die aktuelle Version ║\n║ von @neelegirl/wa-api ║\n╚════════════════════════════════════════╝\n`;
95
+ console.log(currentVersionMessage);
96
+ resolve({
97
+ current: CURRENT_WA_API_VERSION,
98
+ latest: latestVersion || CURRENT_WA_API_VERSION,
99
+ hasUpdate: false
100
+ });
101
+ }
89
102
  }
90
- catch (_) {
103
+ catch (error) {
91
104
  resolve(null);
92
105
  }
93
106
  });
94
- }).on("error", () => resolve(null))
95
- .on("timeout", () => resolve(null));
107
+ }).on('error', () => {
108
+ resolve(null);
109
+ }).on('timeout', () => {
110
+ resolve(null);
111
+ });
96
112
  });
97
113
  };
98
-
99
- const getSessionCredsDir = (sessionId) =>
100
- path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
101
-
102
- const readStoredSessionCreds = (sessionId) => {
103
- try {
104
- const credsPath = path_1.join(getSessionCredsDir(sessionId), "creds.json");
105
- if (!fs_1.existsSync(credsPath)) {
106
- return null;
107
- }
108
- const raw = fs_1.readFileSync(credsPath, "utf8");
109
- return JSON.parse(raw || "{}");
110
- }
111
- catch (_) {
112
- return null;
113
- }
114
- };
115
-
116
- const hasStoredLinkedSessionCreds = (sessionId) => {
117
- try {
118
- const dir = getSessionCredsDir(sessionId);
119
- if (!fs_1.existsSync(dir) || !fs_1.lstatSync(dir).isDirectory()) {
120
- return false;
121
- }
122
- const creds = readStoredSessionCreds(sessionId);
123
- const me = creds?.me || {};
124
- if (creds?.registered === true || me?.id || me?.lid) {
125
- return true;
126
- }
127
- const files = fs_1.readdirSync(dir);
128
- return files.some((file) => /^(session-|sender-key-|app-state-sync-key-|pre-key-)/i.test(String(file || "").trim()));
129
- }
130
- catch (_) {
131
- return false;
132
- }
133
- };
134
-
135
- const shouldPrintQrInTerminal = (sessionId, options = {}) => {
136
- if (TERMINAL_QR_FORCE_ENV === "1") {
137
- return true;
138
- }
139
- if (TERMINAL_QR_FORCE_ENV === "0") {
140
- return false;
141
- }
142
- return true;
143
- };
144
-
145
- const emitMessageUpsert = (sessionId, msg) => {
146
- msg.sessionId = sessionId;
147
- msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
148
- msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
149
- msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
150
- callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ ...msg });
151
- };
152
-
153
- const attachSocketEvents = (sessionId, sock, saveCreds, restartSocket) => {
154
- sock.ev.process(async (events) => {
155
- if (events["connection.update"]) {
156
- const update = events["connection.update"];
157
- const { connection, lastDisconnect } = update;
158
- if (update.qr) {
159
- callback.get(Defaults_1.CALLBACK_KEY.ON_QR)?.({
160
- sessionId,
161
- qr: update.qr
162
- });
163
- }
164
- if (connection === "connecting") {
165
- callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)?.(sessionId);
166
- }
167
- if (connection === "close") {
168
- const code = lastDisconnect?.error?.output?.statusCode;
169
- let retryAttempt = retryCount.get(sessionId) ?? 0;
170
- const shouldRetry = code !== baileys_1.DisconnectReason.loggedOut && retryAttempt < 10;
171
- if (shouldRetry) {
172
- retryAttempt += 1;
173
- retryCount.set(sessionId, retryAttempt);
174
- restartSocket();
114
+ const startSession = (sessionId = "mysession", options = { printQR: true }) => __awaiter(void 0, void 0, void 0, function* () {
115
+ // Prüfe auf Updates beim Start
116
+ checkWaApiUpdate().catch(() => {
117
+ // Silently fail if update check fails
118
+ });
119
+ if (isSessionExistAndRunning(sessionId))
120
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
121
+ const logger = (0, pino_1.default)({ level: "silent" });
122
+ const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
123
+ const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
124
+ const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
125
+ const sock = (0, baileys_1.default)({
126
+ version,
127
+ printQRInTerminal: options.printQR,
128
+ auth: state,
129
+ logger,
130
+ markOnlineOnConnect: false,
131
+ browser: baileys_1.Browsers.ubuntu("Chrome"),
132
+ });
133
+ sessions.set(sessionId, sock);
134
+ try {
135
+
136
+ sock.ev.process((events) => __awaiter(void 0, void 0, void 0, function* () {
137
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
138
+ if (events["connection.update"]) {
139
+ const update = events["connection.update"];
140
+ const { connection, lastDisconnect } = update;
141
+ if (update.qr) {
142
+ (_a = callback.get(Defaults_1.CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
143
+ sessionId,
144
+ qr: update.qr,
145
+ });
146
+ }
147
+ if (connection == "connecting") {
148
+ (_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
149
+ }
150
+ if (connection === "close") {
151
+ 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;
152
+ let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
153
+ let shouldRetry;
154
+ if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
155
+ shouldRetry = true;
156
+ }
157
+ if (shouldRetry) {
158
+ retryAttempt++;
159
+ }
160
+ if (shouldRetry) {
161
+ retryCount.set(sessionId, retryAttempt);
162
+ startSocket();
163
+ }
164
+ else {
165
+ //retryCount.delete(sessionId);
166
+ (0, exports.deleteSession)(sessionId);
167
+ (_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
168
+ }
169
+ }
170
+ if (connection == "open") {
171
+ retryCount.delete(sessionId);
172
+ (_g = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
173
+ }
175
174
  }
176
- else {
177
- retryCount.delete(sessionId);
178
- await (0, exports.deleteSession)(sessionId);
179
- callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId);
175
+ if (events["creds.update"]) {
176
+ yield saveCreds();
180
177
  }
181
- }
182
- if (connection === "open") {
183
- retryCount.delete(sessionId);
184
- callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
185
- }
186
- }
187
- if (events["creds.update"]) {
188
- await saveCreds();
189
- }
190
- if (events["messages.update"]) {
191
- const msg = events["messages.update"][0];
192
- if (msg) {
193
- const data = {
194
- ...msg,
195
- sessionId,
196
- messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update?.status)
197
- };
198
- callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data);
199
- }
178
+ if (events["messages.update"]) {
179
+ const msg = events["messages.update"][0];
180
+ const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
181
+ (_h = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _h === void 0 ? void 0 : _h(sessionId, data);
182
+ }
183
+ if (events["messages.upsert"]) {
184
+ const msg = (_j = events["messages.upsert"]
185
+ .messages) === null || _j === void 0 ? void 0 : _j[0];
186
+ msg.sessionId = sessionId;
187
+ msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
188
+ msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
189
+ msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
190
+ (_k = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _k === void 0 ? void 0 : _k(Object.assign({}, msg));
191
+ }
192
+ }));
193
+ return sock;
200
194
  }
201
- if (events["messages.upsert"]) {
202
- const msg = events["messages.upsert"]?.messages?.[0];
203
- if (msg) {
204
- emitMessageUpsert(sessionId, msg);
205
- }
195
+ catch (error) {
196
+ // console.log("SOCKET ERROR", error);
197
+ return sock;
206
198
  }
207
199
  });
208
- };
209
-
210
- const createSessionSocket = async (sessionId, options = {}, retryStarter) => {
211
- const logger = (0, pino_1)({ level: "silent" });
212
- const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
213
- const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
214
- getSessionCredsDir(sessionId)
215
- );
216
- const sock = (0, baileys_1.default)({
217
- version,
218
- printQRInTerminal: shouldPrintQrInTerminal(sessionId, options),
219
- auth: state,
220
- logger,
221
- markOnlineOnConnect: false,
222
- browser: baileys_1.Browsers.ubuntu("Chrome")
223
- });
224
- sessions.set(sessionId, { ...sock });
225
- attachSocketEvents(sessionId, sock, saveCreds, retryStarter);
226
- if (options.phoneNumber && !sock.authState?.creds?.registered) {
227
- setTimeout(async () => {
228
- try {
229
- const code = await sock.requestPairingCode(options.phoneNumber, options.pairingCode);
230
- callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
231
- }
232
- catch (_) {
233
- }
234
- }, 5000);
235
- }
236
- return sock;
237
- };
238
-
239
- const isSessionExistAndRunning = (sessionId) => {
240
- const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
241
- return (
242
- fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
243
- fs_1.existsSync(credsPath) &&
244
- fs_1.readdirSync(credsPath).length > 0 &&
245
- (0, exports.getSession)(sessionId)
246
- );
247
- };
248
-
249
- const shouldLoadSession = (sessionId) => {
250
- const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
251
- return (
252
- fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
253
- fs_1.existsSync(credsPath) &&
254
- fs_1.readdirSync(credsPath).length > 0 &&
255
- !(0, exports.getSession)(sessionId)
256
- );
257
- };
258
-
259
- const startSession = async (sessionId = "mysession", options = { printQR: true }) => {
260
- checkWaApiUpdate().catch(() => { });
261
- if (isSessionExistAndRunning(sessionId)) {
262
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
263
- }
264
- const starter = () => createSessionSocket(sessionId, { ...options, printQR: options?.printQR !== false }, starter);
265
- return starter();
266
- };
200
+ return startSocket();
201
+ });
202
+ const onimaii = (sessionId = "mysession", connect) => __awaiter(void 0, void 0, void 0, function* () {
203
+ if (isSessionExistAndRunning(sessionId))
204
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
205
+ const logger = (0, pino_1.default)({ level: "silent" });
206
+ const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
207
+ const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
208
+ const sock = (0, connect)({
209
+ version,
210
+ printQRInTerminal: true,
211
+ auth: state,
212
+ logger,
213
+ markOnlineOnConnect: false,
214
+ browser: baileys_1.Browsers.ubuntu("Chrome"),
215
+ });
216
+ })
217
+ exports.onimaii = onimaii;
267
218
  exports.startSession = startSession;
268
-
269
- const onimaii = async (sessionId = "mysession", connect) => {
270
- if (typeof connect !== "function") {
271
- throw new Error_1.WhatsappError("connect must be a function");
219
+ const startSessionWithPairingCode = (sessionId = "mysession", options = { phoneNumber: "" }, key) => __awaiter(void 0, void 0, void 0, function* () {
220
+ if (isSessionExistAndRunning(sessionId)) throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
221
+ if (!(options === null || options === void 0 ? void 0 : options.phoneNumber)) {
222
+ throw new Error_1.WhatsappError(Defaults_1.Messages.paremetersRequired("phoneNumber"));
272
223
  }
273
- if (isSessionExistAndRunning(sessionId)) {
274
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
275
- }
276
- const logger = (0, pino_1)({ level: "silent" });
277
- const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
278
- const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
279
- getSessionCredsDir(sessionId)
280
- );
281
- const sock = connect({
282
- version,
283
- printQRInTerminal: shouldPrintQrInTerminal(sessionId, { printQR: true }),
284
- auth: state,
285
- logger,
286
- markOnlineOnConnect: false,
287
- browser: baileys_1.Browsers.ubuntu("Chrome")
288
- });
289
- sessions.set(sessionId, { ...sock });
290
- if (sock?.ev?.on) {
291
- sock.ev.on("creds.update", saveCreds);
292
- }
293
- return sock;
294
- };
295
- exports.onimaii = onimaii;
296
-
297
- const startSessionWithPairingCode = async (
298
- sessionId = "mysession",
299
- options = { phoneNumber: "" },
300
- pairingCode
301
- ) => {
302
- if (isSessionExistAndRunning(sessionId)) {
303
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
224
+ const logger = (0, pino_1.default)({ level: "silent" });
225
+ const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
226
+ const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
227
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
228
+ const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
229
+
230
+ const sock = (0, baileys_1.default)({
231
+ version,
232
+ printQRInTerminal: false,
233
+ auth: state,
234
+ logger,
235
+ markOnlineOnConnect: false,
236
+ browser: baileys_1.Browsers.ubuntu("Chrome"),
237
+ });
238
+ sessions.set(sessionId, sock);
239
+ try {
240
+ if (!sock.authState.creds.registered) {
241
+ console.log("first time pairing");
242
+ setTimeout(async () => {
243
+ const code = await sock.requestPairingCode(options.phoneNumber,key);
244
+ console.log(code);
245
+
246
+ callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
247
+ }, 5000);
248
+ }
249
+ sock.ev.process(async (events) => {
250
+ if (events["connection.update"]) {
251
+ const update = events["connection.update"];
252
+ const { connection, lastDisconnect } = update;
253
+
254
+ if (connection == "connecting") {
255
+ (_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
256
+ }
257
+ if (connection === "close") {
258
+ 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;
259
+ let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
260
+ let shouldRetry;
261
+ if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
262
+ shouldRetry = true;
263
+ }
264
+ if (shouldRetry) {
265
+ retryAttempt++;
266
+ }
267
+ if (shouldRetry) {
268
+ retryCount.set(sessionId, retryAttempt);
269
+ startSocket();
270
+ }
271
+ else {
272
+ retryCount.delete(sessionId);
273
+ (0, exports.deleteSession)(sessionId);
274
+ (_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
275
+ }
276
+ }
277
+ if (connection == "open") {
278
+ retryCount.delete(sessionId);
279
+ callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
280
+ }
304
281
  }
305
- if (!options?.phoneNumber) {
306
- throw new Error_1.WhatsappError("phoneNumber is required for pairing mode");
282
+ if (events["creds.update"]) {
283
+ await saveCreds();
307
284
  }
308
- const starter = () => createSessionSocket(
309
- sessionId,
310
- { printQR: false, phoneNumber: options.phoneNumber, pairingCode },
311
- starter
312
- );
313
- return starter();
314
- };
315
- exports.startSessionWithPairingCode = startSessionWithPairingCode;
316
-
285
+ if (events["messages.update"]) {
286
+ const msg = events["messages.update"][0];
287
+ const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
288
+ (_h = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _h === void 0 ? void 0 : _h(sessionId, data);
289
+ }
290
+ if (events["messages.upsert"]) {
291
+ const msg = (_j = events["messages.upsert"]
292
+ .messages) === null || _j === void 0 ? void 0 : _j[0];
293
+ msg.sessionId = sessionId;
294
+ msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
295
+ msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
296
+ msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
297
+ (_k = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _k === void 0 ? void 0 : _k(Object.assign({}, msg));
298
+ }
299
+ });
300
+ return sock;
301
+ }
302
+ catch (error) {
303
+ // console.log("SOCKET ERROR", error);
304
+ return sock;
305
+ }
306
+ });
307
+ return startSocket();
308
+ });
309
+ /**
310
+ * @deprecated Use startSession method instead
311
+ */
312
+ exports.startSessionWithPairingCode = startSessionWithPairingCode
317
313
  exports.startWhatsapp = exports.startSession;
318
-
319
- const deleteSession = async (sessionId) => {
314
+ const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
320
315
  const session = (0, exports.getSession)(sessionId);
321
316
  try {
322
- await session?.logout?.();
317
+ yield (session === null || session === void 0 ? void 0 : session.logout());
323
318
  }
324
- catch (_) {
325
- }
326
- session?.end?.(undefined);
319
+ catch (error) { }
320
+ session === null || session === void 0 ? void 0 : session.end(undefined);
327
321
  sessions.delete(sessionId);
328
- const dir = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
329
- if (fs_1.existsSync(dir)) {
330
- fs_1.rmSync(dir, { force: true, recursive: true });
322
+ const dir = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
323
+ if (fs_1.default.existsSync(dir)) {
324
+ fs_1.default.rmSync(dir, { force: true, recursive: true });
331
325
  }
332
- };
326
+ });
333
327
  exports.deleteSession = deleteSession;
334
-
335
328
  const getAllSession = () => Array.from(sessions.keys());
336
329
  exports.getAllSession = getAllSession;
337
-
338
330
  const getSession = (key) => sessions.get(key);
339
331
  exports.getSession = getSession;
340
-
332
+ const isSessionExistAndRunning = (sessionId) => {
333
+ if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
334
+ fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
335
+ fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
336
+ (0, exports.getSession)(sessionId)) {
337
+ return true;
338
+ }
339
+ return false;
340
+ };
341
+ const shouldLoadSession = (sessionId) => {
342
+ if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
343
+ fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
344
+ fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
345
+ !(0, exports.getSession)(sessionId)) {
346
+ return true;
347
+ }
348
+ return false;
349
+ };
341
350
  const getAllSessionData = () => {
342
- const allSessionData = {};
343
- for (const sessionName of (0, exports.getAllSession)()) {
344
- allSessionData[sessionName] = (0, exports.getSession)(sessionName);
351
+ // Angenommen, getAllSession gibt eine Liste aller aktiven Sessions zurück
352
+ let allSessions = getAllSession();
353
+ let allSessionData = {};
354
+
355
+ for(let i = 0; i < allSessions.length; i++) {
356
+ let sessionName = allSessions[i];
357
+ allSessionData[sessionName] = getSession(sessionName);
345
358
  }
359
+
346
360
  return allSessionData;
347
- };
361
+ }
348
362
  exports.getAllSessionData = getAllSessionData;
349
363
 
350
- const loadSessionsFromStorage = async () => {
351
- const dirPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
364
+ async function loadSessionsFromStorage() {
365
+ const dirPath = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
352
366
  const loadedSessions = [];
353
- if (!fs_1.existsSync(dirPath)) {
354
- fs_1.mkdirSync(dirPath, { recursive: true });
367
+
368
+ // Ordner anlegen, falls nicht existiert
369
+ if (!fs_1.default.existsSync(dirPath)) {
370
+ fs_1.default.mkdirSync(dirPath, { recursive: true });
355
371
  }
356
- const entries = await fs_1.promises.readdir(dirPath);
357
- for (const entry of entries) {
358
- const fullPath = path_1.join(dirPath, entry);
372
+
373
+ try {
374
+ const entries = await fs_1.default.promises.readdir(dirPath);
375
+
376
+ for (const entry of entries) {
377
+ const fullPath = path_1.default.join(dirPath, entry);
359
378
  let stat;
360
379
  try {
361
- stat = await fs_1.promises.stat(fullPath);
362
- }
363
- catch (_) {
364
- continue;
365
- }
366
- if (!stat.isDirectory()) {
367
- continue;
368
- }
369
- const sessionId = entry.endsWith(Defaults_1.CREDENTIALS.SUFFIX)
370
- ? entry.slice(0, -Defaults_1.CREDENTIALS.SUFFIX.length)
371
- : entry;
372
- if (!shouldLoadSession(sessionId)) {
373
- continue;
380
+ stat = await fs_1.default.promises.stat(fullPath);
381
+ } catch {
382
+ // Wenn sich die Datei zwischenzeitlich entfernt hat o.Ä., überspringen
383
+ continue;
374
384
  }
385
+ if (!stat.isDirectory()) continue;
386
+
387
+ // sessionId bis zum ersten Unterstrich extrahieren
388
+ const underscoreIndex = entry.indexOf('_');
389
+ const sessionId = underscoreIndex > 0
390
+ ? entry.slice(0, underscoreIndex)
391
+ : entry; // oder continue, wenn du ohne _ nicht laden willst
392
+
375
393
  try {
376
- await (0, exports.startSession)(sessionId, { printQR: false });
377
- loadedSessions.push(sessionId);
378
- }
379
- catch (_) {
394
+ await startSession(sessionId);
395
+ loadedSessions.push(sessionId);
396
+ } catch (err) {
397
+ console.error(`Fehler beim Starten der Session "${sessionId}":`, err);
398
+ // weitere Sessions trotzdem laden
380
399
  }
400
+ }
401
+
402
+ return loadedSessions;
403
+ } catch (err) {
404
+ console.error('Fehler beim Lesen des Session-Verzeichnisses:', err);
405
+ throw err; // oder wirf einen eigenen WhatsappError o.Ä.
381
406
  }
382
- return loadedSessions;
383
- };
407
+ }
384
408
  exports.loadSessionsFromStorage = loadSessionsFromStorage;
385
-
386
- const sock = (conn) => {
387
- (0, exports.onMessageReceived)((msg) => {
388
- conn = (0, exports.getSession)(msg.sessionId);
389
- });
390
- return conn;
391
- };
392
- exports.sock = sock;
393
-
394
409
  const onMessageReceived = (listener) => {
395
410
  callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
396
411
  };
397
- exports.onMessageReceived = onMessageReceived;
398
412
 
413
+ const sock = (sessionId) => {
414
+ return (0, exports.getSession)(sessionId);
415
+ };
416
+ exports.sock = sock;
417
+ exports.onMessageReceived = onMessageReceived;
399
418
  const onQRUpdated = (listener) => {
400
419
  callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
401
420
  };
402
421
  exports.onQRUpdated = onQRUpdated;
403
-
404
422
  const onConnected = (listener) => {
405
423
  callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
406
424
  };
407
425
  exports.onConnected = onConnected;
408
-
409
426
  const onDisconnected = (listener) => {
410
427
  callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
411
428
  };
412
429
  exports.onDisconnected = onDisconnected;
413
-
414
430
  const onConnecting = (listener) => {
415
431
  callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
416
432
  };
417
433
  exports.onConnecting = onConnecting;
418
-
419
434
  const onMessageUpdate = (listener) => {
420
435
  callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
421
436
  };
422
437
  exports.onMessageUpdate = onMessageUpdate;
423
-
424
438
  const onPairingCode = (listener) => {
425
439
  callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
426
440
  };