@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.
- package/dist/Defaults/index.d.ts +2 -3
- package/dist/Messaging/index.d.ts +10 -5
- package/dist/Messaging/index.js +105 -42
- package/dist/Socket/index.d.ts +9 -4
- package/dist/Socket/index.js +344 -330
- package/dist/Types/index.d.ts +2 -2
- package/dist/Utils/index.d.ts +1 -2
- package/dist/whatsapp/index.js +9 -2
- package/package.json +38 -16
- package/readme.md +73 -563
package/dist/Socket/index.js
CHANGED
|
@@ -1,426 +1,440 @@
|
|
|
1
|
-
|
|
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.
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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 =
|
|
58
|
-
https_1.get(url, { timeout: 5000 }, (res) => {
|
|
59
|
-
let data =
|
|
60
|
-
res.on(
|
|
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(
|
|
80
|
+
res.on('end', () => {
|
|
64
81
|
try {
|
|
65
|
-
const
|
|
82
|
+
const packageInfo = JSON.parse(data);
|
|
83
|
+
const latestVersion = packageInfo.version;
|
|
66
84
|
if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
|
|
67
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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(
|
|
95
|
-
|
|
107
|
+
}).on('error', () => {
|
|
108
|
+
resolve(null);
|
|
109
|
+
}).on('timeout', () => {
|
|
110
|
+
resolve(null);
|
|
111
|
+
});
|
|
96
112
|
});
|
|
97
113
|
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
270
|
-
if (
|
|
271
|
-
throw new Error_1.WhatsappError("
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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 (
|
|
306
|
-
|
|
282
|
+
if (events["creds.update"]) {
|
|
283
|
+
await saveCreds();
|
|
307
284
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
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
|
-
|
|
354
|
-
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
-
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
377
|
-
|
|
378
|
-
}
|
|
379
|
-
|
|
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
|
-
|
|
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
|
};
|