@neelegirl/wa-api 1.6.8 → 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 +38 -17
- package/dist/Messaging/index.js +105 -42
- package/dist/Socket/index.d.ts +13 -31
- package/dist/Socket/index.js +345 -283
- 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 +35 -25
- package/readme.md +73 -541
package/dist/Socket/index.js
CHANGED
|
@@ -1,379 +1,441 @@
|
|
|
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
|
-
|
|
51
|
+
let stock;
|
|
52
|
+
const CURRENT_WA_API_VERSION = "1.3.3";
|
|
20
53
|
let waApiUpdateCheckDone = false;
|
|
21
54
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
}
|
|
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;
|
|
46
63
|
}
|
|
47
64
|
return false;
|
|
48
|
-
}
|
|
65
|
+
}
|
|
49
66
|
|
|
67
|
+
// Liest von der offiziellen npm-Registry (registry.npmjs.org), ob ein Update existiert – nur 1x pro Prozess
|
|
50
68
|
const checkWaApiUpdate = () => {
|
|
51
69
|
if (waApiUpdateCheckDone) {
|
|
52
70
|
return Promise.resolve(null);
|
|
53
71
|
}
|
|
54
72
|
waApiUpdateCheckDone = true;
|
|
55
73
|
return new Promise((resolve) => {
|
|
56
|
-
const url =
|
|
57
|
-
https_1.get(url, { timeout: 5000 }, (res) => {
|
|
58
|
-
let data =
|
|
59
|
-
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) => {
|
|
60
78
|
data += chunk;
|
|
61
79
|
});
|
|
62
|
-
res.on(
|
|
80
|
+
res.on('end', () => {
|
|
63
81
|
try {
|
|
64
|
-
const
|
|
82
|
+
const packageInfo = JSON.parse(data);
|
|
83
|
+
const latestVersion = packageInfo.version;
|
|
65
84
|
if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
|
|
66
|
-
|
|
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
|
-
);
|
|
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);
|
|
76
87
|
resolve({
|
|
77
88
|
current: CURRENT_WA_API_VERSION,
|
|
78
89
|
latest: latestVersion,
|
|
79
90
|
hasUpdate: true
|
|
80
91
|
});
|
|
81
|
-
return;
|
|
82
92
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
+
}
|
|
88
102
|
}
|
|
89
|
-
catch (
|
|
103
|
+
catch (error) {
|
|
90
104
|
resolve(null);
|
|
91
105
|
}
|
|
92
106
|
});
|
|
93
|
-
}).on(
|
|
94
|
-
|
|
107
|
+
}).on('error', () => {
|
|
108
|
+
resolve(null);
|
|
109
|
+
}).on('timeout', () => {
|
|
110
|
+
resolve(null);
|
|
111
|
+
});
|
|
95
112
|
});
|
|
96
113
|
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
+
}
|
|
128
174
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
await (0, exports.deleteSession)(sessionId);
|
|
132
|
-
callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId);
|
|
175
|
+
if (events["creds.update"]) {
|
|
176
|
+
yield saveCreds();
|
|
133
177
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
};
|
|
151
|
-
callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data);
|
|
152
|
-
}
|
|
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;
|
|
153
194
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
emitMessageUpsert(sessionId, msg);
|
|
158
|
-
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
// console.log("SOCKET ERROR", error);
|
|
197
|
+
return sock;
|
|
159
198
|
}
|
|
160
199
|
});
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
}
|
|
187
|
-
}, 5000);
|
|
188
|
-
}
|
|
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
|
-
};
|
|
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;
|
|
220
218
|
exports.startSession = startSession;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (
|
|
224
|
-
throw new Error_1.WhatsappError("
|
|
225
|
-
}
|
|
226
|
-
if (isSessionExistAndRunning(sessionId)) {
|
|
227
|
-
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
|
|
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"));
|
|
228
223
|
}
|
|
229
|
-
const logger = (0, pino_1)({ level: "silent" });
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
) => {
|
|
255
|
-
|
|
256
|
-
|
|
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
|
+
}
|
|
257
281
|
}
|
|
258
|
-
if (
|
|
259
|
-
|
|
282
|
+
if (events["creds.update"]) {
|
|
283
|
+
await saveCreds();
|
|
260
284
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
|
270
313
|
exports.startWhatsapp = exports.startSession;
|
|
271
|
-
|
|
272
|
-
const deleteSession = async (sessionId) => {
|
|
314
|
+
const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
273
315
|
const session = (0, exports.getSession)(sessionId);
|
|
274
316
|
try {
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
catch (_) {
|
|
317
|
+
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
278
318
|
}
|
|
279
|
-
|
|
319
|
+
catch (error) { }
|
|
320
|
+
session === null || session === void 0 ? void 0 : session.end(undefined);
|
|
280
321
|
sessions.delete(sessionId);
|
|
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 });
|
|
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 });
|
|
284
325
|
}
|
|
285
|
-
};
|
|
326
|
+
});
|
|
286
327
|
exports.deleteSession = deleteSession;
|
|
287
|
-
|
|
288
328
|
const getAllSession = () => Array.from(sessions.keys());
|
|
289
329
|
exports.getAllSession = getAllSession;
|
|
290
|
-
|
|
291
330
|
const getSession = (key) => sessions.get(key);
|
|
292
331
|
exports.getSession = getSession;
|
|
293
|
-
|
|
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
|
+
};
|
|
294
350
|
const getAllSessionData = () => {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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);
|
|
298
358
|
}
|
|
359
|
+
|
|
299
360
|
return allSessionData;
|
|
300
|
-
}
|
|
361
|
+
}
|
|
301
362
|
exports.getAllSessionData = getAllSessionData;
|
|
302
363
|
|
|
303
|
-
|
|
304
|
-
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);
|
|
305
366
|
const loadedSessions = [];
|
|
306
|
-
|
|
307
|
-
|
|
367
|
+
|
|
368
|
+
// Ordner anlegen, falls nicht existiert
|
|
369
|
+
if (!fs_1.default.existsSync(dirPath)) {
|
|
370
|
+
fs_1.default.mkdirSync(dirPath, { recursive: true });
|
|
308
371
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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);
|
|
312
378
|
let stat;
|
|
313
379
|
try {
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
|
|
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;
|
|
380
|
+
stat = await fs_1.default.promises.stat(fullPath);
|
|
381
|
+
} catch {
|
|
382
|
+
// Wenn sich die Datei zwischenzeitlich entfernt hat o.Ä., überspringen
|
|
383
|
+
continue;
|
|
326
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
|
+
|
|
327
393
|
try {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
|
|
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
|
|
332
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.Ä.
|
|
333
406
|
}
|
|
334
|
-
|
|
335
|
-
};
|
|
407
|
+
}
|
|
336
408
|
exports.loadSessionsFromStorage = loadSessionsFromStorage;
|
|
337
|
-
|
|
338
|
-
const sock = (conn) => {
|
|
339
|
-
(0, exports.onMessageReceived)((msg) => {
|
|
340
|
-
conn = (0, exports.getSession)(msg.sessionId);
|
|
341
|
-
});
|
|
342
|
-
return conn;
|
|
343
|
-
};
|
|
344
|
-
exports.sock = sock;
|
|
345
|
-
|
|
346
409
|
const onMessageReceived = (listener) => {
|
|
347
410
|
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
348
411
|
};
|
|
349
|
-
exports.onMessageReceived = onMessageReceived;
|
|
350
412
|
|
|
413
|
+
const sock = (sessionId) => {
|
|
414
|
+
return (0, exports.getSession)(sessionId);
|
|
415
|
+
};
|
|
416
|
+
exports.sock = sock;
|
|
417
|
+
exports.onMessageReceived = onMessageReceived;
|
|
351
418
|
const onQRUpdated = (listener) => {
|
|
352
419
|
callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
|
|
353
420
|
};
|
|
354
421
|
exports.onQRUpdated = onQRUpdated;
|
|
355
|
-
|
|
356
422
|
const onConnected = (listener) => {
|
|
357
423
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
|
|
358
424
|
};
|
|
359
425
|
exports.onConnected = onConnected;
|
|
360
|
-
|
|
361
426
|
const onDisconnected = (listener) => {
|
|
362
427
|
callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
363
428
|
};
|
|
364
429
|
exports.onDisconnected = onDisconnected;
|
|
365
|
-
|
|
366
430
|
const onConnecting = (listener) => {
|
|
367
431
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
|
|
368
432
|
};
|
|
369
433
|
exports.onConnecting = onConnecting;
|
|
370
|
-
|
|
371
434
|
const onMessageUpdate = (listener) => {
|
|
372
435
|
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
373
436
|
};
|
|
374
437
|
exports.onMessageUpdate = onMessageUpdate;
|
|
375
|
-
|
|
376
438
|
const onPairingCode = (listener) => {
|
|
377
439
|
callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
378
440
|
};
|
|
379
|
-
exports.onPairingCode = onPairingCode;
|
|
441
|
+
exports.onPairingCode = onPairingCode;
|