@neelegirl/wa-api 1.6.0 → 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.
- package/dist/Messaging/index.d.ts +19 -35
- package/dist/Messaging/index.js +42 -102
- package/dist/Socket/index.d.ts +33 -10
- package/dist/Socket/index.js +277 -352
- package/dist/whatsapp/index.js +2 -8
- package/package.json +22 -33
- package/readme.md +55 -643
package/dist/Socket/index.js
CHANGED
|
@@ -1,454 +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
|
-
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
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
|
-
|
|
18
|
+
|
|
52
19
|
let CURRENT_WA_API_VERSION = "1.5.1";
|
|
20
|
+
let waApiUpdateCheckDone = false;
|
|
21
|
+
|
|
53
22
|
try {
|
|
54
|
-
// Prefer package.json version when available
|
|
55
|
-
// dist/Socket/index.js -> ../../package.json
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
57
23
|
const pkg = require("../../package.json");
|
|
58
24
|
if (pkg && typeof pkg.version === "string") {
|
|
59
25
|
CURRENT_WA_API_VERSION = pkg.version;
|
|
60
26
|
}
|
|
61
27
|
}
|
|
62
|
-
catch (
|
|
63
|
-
// fallback keeps bundled version
|
|
28
|
+
catch (_) {
|
|
64
29
|
}
|
|
65
|
-
let waApiUpdateCheckDone = false;
|
|
66
30
|
|
|
67
|
-
|
|
68
|
-
if (!latest || !current)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
+
}
|
|
75
46
|
}
|
|
76
47
|
return false;
|
|
77
|
-
}
|
|
48
|
+
};
|
|
78
49
|
|
|
79
|
-
// Liest von der offiziellen npm-Registry (registry.npmjs.org), ob ein Update existiert – nur 1x pro Prozess
|
|
80
50
|
const checkWaApiUpdate = () => {
|
|
81
51
|
if (waApiUpdateCheckDone) {
|
|
82
52
|
return Promise.resolve(null);
|
|
83
53
|
}
|
|
84
54
|
waApiUpdateCheckDone = true;
|
|
85
55
|
return new Promise((resolve) => {
|
|
86
|
-
const url =
|
|
87
|
-
https_1.
|
|
88
|
-
let data =
|
|
89
|
-
res.on(
|
|
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) => {
|
|
90
60
|
data += chunk;
|
|
91
61
|
});
|
|
92
|
-
res.on(
|
|
62
|
+
res.on("end", () => {
|
|
93
63
|
try {
|
|
94
|
-
const
|
|
95
|
-
const latestVersion = packageInfo.version;
|
|
64
|
+
const latestVersion = JSON.parse(data)?.version;
|
|
96
65
|
if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
|
|
97
|
-
|
|
98
|
-
|
|
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
|
+
);
|
|
99
76
|
resolve({
|
|
100
77
|
current: CURRENT_WA_API_VERSION,
|
|
101
78
|
latest: latestVersion,
|
|
102
79
|
hasUpdate: true
|
|
103
80
|
});
|
|
81
|
+
return;
|
|
104
82
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
latest: latestVersion || CURRENT_WA_API_VERSION,
|
|
111
|
-
hasUpdate: false
|
|
112
|
-
});
|
|
113
|
-
}
|
|
83
|
+
resolve({
|
|
84
|
+
current: CURRENT_WA_API_VERSION,
|
|
85
|
+
latest: latestVersion || CURRENT_WA_API_VERSION,
|
|
86
|
+
hasUpdate: false
|
|
87
|
+
});
|
|
114
88
|
}
|
|
115
|
-
catch (
|
|
89
|
+
catch (_) {
|
|
116
90
|
resolve(null);
|
|
117
91
|
}
|
|
118
92
|
});
|
|
119
|
-
}).on(
|
|
120
|
-
resolve(null);
|
|
121
|
-
}).on('timeout', () => {
|
|
122
|
-
resolve(null);
|
|
123
|
-
});
|
|
93
|
+
}).on("error", () => resolve(null))
|
|
94
|
+
.on("timeout", () => resolve(null));
|
|
124
95
|
});
|
|
125
96
|
};
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
if (connection == "connecting") {
|
|
160
|
-
(_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
161
|
-
}
|
|
162
|
-
if (connection === "close") {
|
|
163
|
-
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;
|
|
164
|
-
let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
|
|
165
|
-
let shouldRetry;
|
|
166
|
-
if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
167
|
-
shouldRetry = true;
|
|
168
|
-
}
|
|
169
|
-
if (shouldRetry) {
|
|
170
|
-
retryAttempt++;
|
|
171
|
-
}
|
|
172
|
-
if (shouldRetry) {
|
|
173
|
-
retryCount.set(sessionId, retryAttempt);
|
|
174
|
-
startSocket();
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
//retryCount.delete(sessionId);
|
|
178
|
-
(0, exports.deleteSession)(sessionId);
|
|
179
|
-
(_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (connection == "open") {
|
|
183
|
-
retryCount.delete(sessionId);
|
|
184
|
-
(_g = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (events["creds.update"]) {
|
|
188
|
-
yield saveCreds();
|
|
189
|
-
}
|
|
190
|
-
if (events["messages.update"]) {
|
|
191
|
-
const msg = events["messages.update"][0];
|
|
192
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
|
|
193
|
-
(_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();
|
|
194
128
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
|
|
200
|
-
msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
|
|
201
|
-
msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
|
|
202
|
-
(_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);
|
|
203
133
|
}
|
|
204
|
-
}
|
|
205
|
-
|
|
134
|
+
}
|
|
135
|
+
if (connection === "open") {
|
|
136
|
+
retryCount.delete(sessionId);
|
|
137
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
|
|
138
|
+
}
|
|
206
139
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
+
}
|
|
210
159
|
}
|
|
211
160
|
});
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const sock = (0, baileys_1.default)({
|
|
240
|
-
version,
|
|
241
|
-
printQRInTerminal: false,
|
|
242
|
-
auth: state,
|
|
243
|
-
logger,
|
|
244
|
-
markOnlineOnConnect: false,
|
|
245
|
-
browser: baileys_1.Browsers.ubuntu("Chrome"),
|
|
246
|
-
});
|
|
247
|
-
sessions.set(sessionId, { ...sock });
|
|
248
|
-
try {
|
|
249
|
-
if (!sock.authState.creds.registered) {
|
|
250
|
-
console.log("first time pairing");
|
|
251
|
-
setTimeout(async () => {
|
|
252
|
-
const code = await sock.requestPairingCode(options.phoneNumber,key);
|
|
253
|
-
console.log(code);
|
|
254
|
-
|
|
255
|
-
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
|
+
}
|
|
256
187
|
}, 5000);
|
|
257
|
-
}
|
|
258
|
-
sock.ev.process(async (events) => {
|
|
259
|
-
if (events["connection.update"]) {
|
|
260
|
-
const update = events["connection.update"];
|
|
261
|
-
const { connection, lastDisconnect } = update;
|
|
262
|
-
|
|
263
|
-
if (connection == "connecting") {
|
|
264
|
-
(_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
265
|
-
}
|
|
266
|
-
if (connection === "close") {
|
|
267
|
-
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;
|
|
268
|
-
let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
|
|
269
|
-
let shouldRetry;
|
|
270
|
-
if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
271
|
-
shouldRetry = true;
|
|
272
|
-
}
|
|
273
|
-
if (shouldRetry) {
|
|
274
|
-
retryAttempt++;
|
|
275
|
-
}
|
|
276
|
-
if (shouldRetry) {
|
|
277
|
-
retryCount.set(sessionId, retryAttempt);
|
|
278
|
-
startSocket();
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
retryCount.delete(sessionId);
|
|
282
|
-
(0, exports.deleteSession)(sessionId);
|
|
283
|
-
(_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (connection == "open") {
|
|
287
|
-
retryCount.delete(sessionId);
|
|
288
|
-
callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
|
|
289
|
-
}
|
|
290
188
|
}
|
|
291
|
-
|
|
292
|
-
|
|
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));
|
|
293
216
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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");
|
|
225
|
+
}
|
|
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")
|
|
315
241
|
});
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
+
|
|
322
270
|
exports.startWhatsapp = exports.startSession;
|
|
323
|
-
|
|
271
|
+
|
|
272
|
+
const deleteSession = async (sessionId) => {
|
|
324
273
|
const session = (0, exports.getSession)(sessionId);
|
|
325
274
|
try {
|
|
326
|
-
|
|
275
|
+
await session?.logout?.();
|
|
327
276
|
}
|
|
328
|
-
catch (
|
|
329
|
-
|
|
277
|
+
catch (_) {
|
|
278
|
+
}
|
|
279
|
+
session?.end?.(undefined);
|
|
330
280
|
sessions.delete(sessionId);
|
|
331
|
-
const dir = path_1.
|
|
332
|
-
if (fs_1.
|
|
333
|
-
fs_1.
|
|
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 });
|
|
334
284
|
}
|
|
335
|
-
}
|
|
285
|
+
};
|
|
336
286
|
exports.deleteSession = deleteSession;
|
|
287
|
+
|
|
337
288
|
const getAllSession = () => Array.from(sessions.keys());
|
|
338
289
|
exports.getAllSession = getAllSession;
|
|
290
|
+
|
|
339
291
|
const getSession = (key) => sessions.get(key);
|
|
340
292
|
exports.getSession = getSession;
|
|
341
|
-
const isSessionExistAndRunning = (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
|
-
};
|
|
350
|
-
const shouldLoadSession = (sessionId) => {
|
|
351
|
-
if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
352
|
-
fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
|
|
353
|
-
fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
|
|
354
|
-
!(0, exports.getSession)(sessionId)) {
|
|
355
|
-
return true;
|
|
356
|
-
}
|
|
357
|
-
return false;
|
|
358
|
-
};
|
|
359
|
-
const getAllSessionData = () => {
|
|
360
|
-
// Angenommen, getAllSession gibt eine Liste aller aktiven Sessions zurück
|
|
361
|
-
let allSessions = getAllSession();
|
|
362
|
-
let allSessionData = {};
|
|
363
293
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
294
|
+
const getAllSessionData = () => {
|
|
295
|
+
const allSessionData = {};
|
|
296
|
+
for (const sessionName of (0, exports.getAllSession)()) {
|
|
297
|
+
allSessionData[sessionName] = (0, exports.getSession)(sessionName);
|
|
367
298
|
}
|
|
368
|
-
|
|
369
299
|
return allSessionData;
|
|
370
|
-
}
|
|
300
|
+
};
|
|
371
301
|
exports.getAllSessionData = getAllSessionData;
|
|
372
302
|
|
|
373
|
-
async
|
|
374
|
-
const dirPath =
|
|
303
|
+
const loadSessionsFromStorage = async () => {
|
|
304
|
+
const dirPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
|
|
375
305
|
const loadedSessions = [];
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
if (!fs.existsSync(dirPath)) {
|
|
379
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
306
|
+
if (!fs_1.existsSync(dirPath)) {
|
|
307
|
+
fs_1.mkdirSync(dirPath, { recursive: true });
|
|
380
308
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
for (const entry of entries) {
|
|
386
|
-
const fullPath = path.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);
|
|
387
312
|
let stat;
|
|
388
313
|
try {
|
|
389
|
-
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
|
|
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;
|
|
393
326
|
}
|
|
394
|
-
if (!stat.isDirectory()) continue;
|
|
395
|
-
|
|
396
|
-
// sessionId bis zum ersten Unterstrich extrahieren
|
|
397
|
-
const underscoreIndex = entry.indexOf('_');
|
|
398
|
-
const sessionId = underscoreIndex > 0
|
|
399
|
-
? entry.slice(0, underscoreIndex)
|
|
400
|
-
: entry; // oder continue, wenn du ohne _ nicht laden willst
|
|
401
|
-
|
|
402
327
|
try {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// weitere Sessions trotzdem laden
|
|
328
|
+
await (0, exports.startSession)(sessionId);
|
|
329
|
+
loadedSessions.push(sessionId);
|
|
330
|
+
}
|
|
331
|
+
catch (_) {
|
|
408
332
|
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
return loadedSessions;
|
|
412
|
-
} catch (err) {
|
|
413
|
-
console.error('Fehler beim Lesen des Session-Verzeichnisses:', err);
|
|
414
|
-
throw err; // oder wirf einen eigenen WhatsappError o.Ä.
|
|
415
333
|
}
|
|
416
|
-
|
|
417
|
-
exports.loadSessionsFromStorage = loadSessionsFromStorage;
|
|
418
|
-
const onMessageReceived = (listener) => {
|
|
419
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
334
|
+
return loadedSessions;
|
|
420
335
|
};
|
|
336
|
+
exports.loadSessionsFromStorage = loadSessionsFromStorage;
|
|
421
337
|
|
|
422
338
|
const sock = (conn) => {
|
|
423
|
-
onMessageReceived(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
conn
|
|
427
|
-
|
|
428
|
-
};
|
|
339
|
+
(0, exports.onMessageReceived)((msg) => {
|
|
340
|
+
conn = (0, exports.getSession)(msg.sessionId);
|
|
341
|
+
});
|
|
342
|
+
return conn;
|
|
343
|
+
};
|
|
429
344
|
exports.sock = sock;
|
|
345
|
+
|
|
346
|
+
const onMessageReceived = (listener) => {
|
|
347
|
+
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
348
|
+
};
|
|
430
349
|
exports.onMessageReceived = onMessageReceived;
|
|
350
|
+
|
|
431
351
|
const onQRUpdated = (listener) => {
|
|
432
352
|
callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
|
|
433
353
|
};
|
|
434
354
|
exports.onQRUpdated = onQRUpdated;
|
|
355
|
+
|
|
435
356
|
const onConnected = (listener) => {
|
|
436
357
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
|
|
437
358
|
};
|
|
438
359
|
exports.onConnected = onConnected;
|
|
360
|
+
|
|
439
361
|
const onDisconnected = (listener) => {
|
|
440
362
|
callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
441
363
|
};
|
|
442
364
|
exports.onDisconnected = onDisconnected;
|
|
365
|
+
|
|
443
366
|
const onConnecting = (listener) => {
|
|
444
367
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
|
|
445
368
|
};
|
|
446
369
|
exports.onConnecting = onConnecting;
|
|
370
|
+
|
|
447
371
|
const onMessageUpdate = (listener) => {
|
|
448
372
|
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
449
373
|
};
|
|
450
374
|
exports.onMessageUpdate = onMessageUpdate;
|
|
375
|
+
|
|
451
376
|
const onPairingCode = (listener) => {
|
|
452
|
-
callback.set(Defaults_1.CALLBACK_KEY.
|
|
377
|
+
callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
453
378
|
};
|
|
454
|
-
exports.onPairingCode = onPairingCode;
|
|
379
|
+
exports.onPairingCode = onPairingCode;
|