@neelegirl/wa-api 1.6.2 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Messaging/index.d.ts +18 -39
- package/dist/Messaging/index.js +42 -100
- package/dist/Socket/index.d.ts +32 -11
- package/dist/Socket/index.js +293 -341
- package/dist/Types/index.d.ts +1 -1
- package/dist/whatsapp/index.js +2 -1
- package/package.json +29 -23
- package/readme.md +54 -106
|
@@ -1,49 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Send a message to a chat JID or phone number.
|
|
3
|
+
*/
|
|
4
|
+
export declare function sendMessage(
|
|
5
|
+
sessionId: string,
|
|
6
|
+
jid: string,
|
|
7
|
+
content: import("@neelegirl/baileys/lib").AnyMessageContent,
|
|
8
|
+
options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
|
|
9
|
+
): Promise<import("@neelegirl/baileys/lib").proto.WebMessageInfo>;
|
|
2
10
|
|
|
3
11
|
/**
|
|
4
|
-
* Send
|
|
5
|
-
*
|
|
6
|
-
* @param sessionId - Session ID
|
|
7
|
-
* @param jid - Target
|
|
8
|
-
* @param content - Message content
|
|
9
|
-
* @param options - Message options
|
|
12
|
+
* Send status mentions using the current session socket.
|
|
10
13
|
*/
|
|
11
|
-
export declare function sendMessage(
|
|
12
|
-
sessionId: string,
|
|
13
|
-
jid: string,
|
|
14
|
-
content: import("@neelegirl/baileys").AnyMessageContent,
|
|
15
|
-
options?: import("@neelegirl/baileys").MiscMessageGenerationOptions
|
|
16
|
-
): Promise<import("@neelegirl/baileys").proto.WebMessageInfo>;
|
|
17
14
|
export declare function sendStatusMentions(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
): Promise<
|
|
22
|
-
|
|
23
|
-
* Sendet einen rohen WAMessage-Stanza an WhatsApp.
|
|
24
|
-
*
|
|
25
|
-
* @param sessionId Deine Session-ID
|
|
26
|
-
* @param jid Ziel-JID oder Telefonnummer (z. B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
|
|
27
|
-
* @param content Raw-Message-Node (z. B. protocolMessage, videoMessage, etc.)
|
|
28
|
-
* @param options Optional: Relay-Parameter wie messageId, participant, additionalNodes, statusJidList
|
|
29
|
-
* @returns Promise mit der gesendeten Nachricht-ID (msgId)
|
|
30
|
-
*/
|
|
15
|
+
sessionId: string,
|
|
16
|
+
content: any,
|
|
17
|
+
options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
|
|
18
|
+
): Promise<any>;
|
|
19
|
+
|
|
31
20
|
/**
|
|
32
|
-
* Low-level relayMessage
|
|
33
|
-
*
|
|
34
|
-
* Sendet ein rohes WAMessage-Stanza (z.B. protocolMessage, disappearingMessagesInChat,
|
|
35
|
-
* videoMessage, etc.) direkt an WhatsApp über die interne `relayMessage`-Methode.
|
|
36
|
-
*
|
|
37
|
-
* @param sessionId Deine Multi-Session-ID
|
|
38
|
-
* @param jid Ziel-JID oder Telefonnummer (z.B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
|
|
39
|
-
* @param content Raw-Message-Node (proto.WebMessageInfo oder AnyMessageContent-ähnlich)
|
|
40
|
-
* @param options Optional: Relay-Parameter wie `messageId`, `participant`, `additionalNodes`,
|
|
41
|
-
* `statusJidList`, `useCachedGroupMetadata`, usw.
|
|
42
|
-
* @returns Promise mit der gesendeten Nachricht-ID (`msgId`)
|
|
21
|
+
* Low-level relayMessage wrapper.
|
|
43
22
|
*/
|
|
44
23
|
export declare function relayMessage(
|
|
45
24
|
sessionId: string,
|
|
46
25
|
jid: string,
|
|
47
26
|
content: any,
|
|
48
|
-
options?: import(
|
|
49
|
-
): Promise<string>;
|
|
27
|
+
options?: import("@neelegirl/baileys/lib").MiscMessageGenerationOptions
|
|
28
|
+
): Promise<string>;
|
package/dist/Messaging/index.js
CHANGED
|
@@ -1,119 +1,61 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
-
var t = {};
|
|
13
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
-
t[p] = s[p];
|
|
15
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
-
t[p[i]] = s[p[i]];
|
|
19
|
-
}
|
|
20
|
-
return t;
|
|
21
|
-
};
|
|
22
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
-
};
|
|
1
|
+
"use strict";
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.relayMessage = exports.sendMessage = void 0;
|
|
3
|
+
exports.relayMessage = exports.sendStatusMentions = exports.sendMessage = void 0;
|
|
4
|
+
|
|
27
5
|
const Defaults_1 = require("../Defaults");
|
|
28
6
|
const Socket_1 = require("../Socket");
|
|
29
7
|
const Utils_1 = require("../Utils");
|
|
30
|
-
const create_delay_1 = require("../Utils/create-delay");
|
|
31
|
-
const is_exist_1 = require("../Utils/is-exist");
|
|
32
8
|
const Error_1 = require("../Error");
|
|
33
9
|
|
|
34
10
|
const sessionCache = new Map();
|
|
35
11
|
|
|
36
12
|
function getCachedSession(sessionId) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
13
|
+
let session = sessionCache.get(sessionId);
|
|
14
|
+
if (!session) {
|
|
15
|
+
session = (0, Socket_1.getSession)(sessionId);
|
|
16
|
+
if (!session) {
|
|
17
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionNotFound(sessionId));
|
|
18
|
+
}
|
|
19
|
+
sessionCache.set(sessionId, session);
|
|
20
|
+
}
|
|
21
|
+
return session;
|
|
44
22
|
}
|
|
45
23
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*
|
|
49
|
-
* @param {string} sessionId Your multi-session identifier
|
|
50
|
-
* @param {string} jid Destination JID (user or group) or phone number
|
|
51
|
-
* @param {object} content AnyMessageContent payload
|
|
52
|
-
* @param {object} [options] MiscMessageGenerationOptions (quoted, mentions, etc.)
|
|
53
|
-
* @returns {Promise<any>}
|
|
54
|
-
*/
|
|
55
|
-
async function sendMessage(sessionId, jid, content, options) {
|
|
56
|
-
const session = getCachedSession(sessionId);
|
|
57
|
-
|
|
58
|
-
// Convert phone number to JID if needed
|
|
59
|
-
const destJid = jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
|
|
60
|
-
|
|
61
|
-
try {
|
|
62
|
-
return await session.sendMessage(destJid, content, options || {});
|
|
63
|
-
} catch (err) {
|
|
64
|
-
// Wrap Baileys errors into WhatsappError for consistency
|
|
65
|
-
throw new Error_1.WhatsappError(
|
|
66
|
-
`Failed to send message to ${destJid}: ${err.message}`,
|
|
67
|
-
{ cause: err }
|
|
68
|
-
);
|
|
69
|
-
}
|
|
24
|
+
function resolveJid(jid) {
|
|
25
|
+
return jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
|
|
70
26
|
}
|
|
71
27
|
|
|
28
|
+
async function sendMessage(sessionId, jid, content, options) {
|
|
29
|
+
const session = getCachedSession(sessionId);
|
|
30
|
+
const destJid = resolveJid(jid);
|
|
31
|
+
try {
|
|
32
|
+
return await session.sendMessage(destJid, content, options || {});
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
throw new Error_1.WhatsappError(`Failed to send message to ${destJid}: ${err.message}`, { cause: err });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
72
38
|
exports.sendMessage = sendMessage;
|
|
73
|
-
/**
|
|
74
|
-
* Universal sendMessage wrapper for all Baileys message types in JavaScript.
|
|
75
|
-
*
|
|
76
|
-
* @param {string} sessionId Your multi-session identifier
|
|
77
|
-
* @param {string} jid Destination JID (user or group) or phone number
|
|
78
|
-
* @param {object} content AnyMessageContent payload
|
|
79
|
-
* @param {object} [options] MiscMessageGenerationOptions (quoted, mentions, etc.)
|
|
80
|
-
* @returns {Promise<any>}
|
|
81
|
-
*/
|
|
82
|
-
async function sendStatusMentions(sessionId, content, options) {
|
|
83
|
-
const session = getCachedSession(sessionId);
|
|
84
39
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
40
|
+
async function sendStatusMentions(sessionId, content, options) {
|
|
41
|
+
const session = getCachedSession(sessionId);
|
|
42
|
+
try {
|
|
43
|
+
return await session.sendStatusMentions(content, options || {});
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
throw new Error_1.WhatsappError(`Failed to send status mention: ${err.message}`, { cause: err });
|
|
47
|
+
}
|
|
94
48
|
}
|
|
95
|
-
|
|
96
49
|
exports.sendStatusMentions = sendStatusMentions;
|
|
97
|
-
/**
|
|
98
|
-
* Low-level relayMessage-Wrapper für Baileys.
|
|
99
|
-
*
|
|
100
|
-
* @param {string} sessionId - Deine Session-ID
|
|
101
|
-
* @param {string} jid - Ziel-JID oder Telefonnummer
|
|
102
|
-
* @param {object} content - das rohe Message-Node-Objekt
|
|
103
|
-
* @param {object} options - zusätzliche Relay-Optionen wie messageId, participant, additionalNodes, etc.
|
|
104
|
-
*
|
|
105
|
-
* @returns {Promise<string>} die gesendete Nachricht-ID
|
|
106
|
-
*/
|
|
107
|
-
async function relayMessage(sessionId, jid, content, options = {}) {
|
|
108
|
-
const session = getCachedSession(sessionId);
|
|
109
|
-
if (!session) throw new Error_1.WhatsappError(`Session ${sessionId} nicht gefunden`);
|
|
110
50
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
51
|
+
async function relayMessage(sessionId, jid, content, options = {}) {
|
|
52
|
+
const session = getCachedSession(sessionId);
|
|
53
|
+
const destJid = resolveJid(jid);
|
|
54
|
+
try {
|
|
55
|
+
return await session.relayMessage(destJid, content, options);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
throw new Error_1.WhatsappError(`Relay to ${destJid} failed: ${err.message}`, { cause: err });
|
|
59
|
+
}
|
|
118
60
|
}
|
|
119
|
-
exports.relayMessage = relayMessage;
|
|
61
|
+
exports.relayMessage = relayMessage;
|
package/dist/Socket/index.d.ts
CHANGED
|
@@ -1,24 +1,45 @@
|
|
|
1
|
-
import { WASocket } from "@neelegirl/baileys";
|
|
1
|
+
import { WASocket } from "@neelegirl/baileys/lib";
|
|
2
2
|
import type { MessageReceived, MessageUpdated, StartSessionParams } from "../Types";
|
|
3
|
+
|
|
3
4
|
export declare const startSession: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
|
|
5
|
+
|
|
6
|
+
export declare const onimaii: (sessionId: string, connect: (config: any) => WASocket) => Promise<WASocket>;
|
|
7
|
+
|
|
8
|
+
export declare const startSessionWithPairingCode: (
|
|
9
|
+
sessionId?: string,
|
|
10
|
+
options?: {
|
|
11
|
+
phoneNumber: string;
|
|
12
|
+
},
|
|
13
|
+
pairingCode?: string
|
|
14
|
+
) => Promise<WASocket>;
|
|
15
|
+
|
|
4
16
|
/**
|
|
5
|
-
* @deprecated Use startSession method instead
|
|
17
|
+
* @deprecated Use startSession method instead.
|
|
6
18
|
*/
|
|
7
19
|
export declare const startWhatsapp: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
|
|
8
|
-
|
|
9
|
-
phoneNumber: string;
|
|
10
|
-
}, key?: string) => Promise<WASocket>;
|
|
20
|
+
|
|
11
21
|
export declare const deleteSession: (sessionId: string) => Promise<void>;
|
|
22
|
+
|
|
12
23
|
export declare const getAllSession: () => string[];
|
|
24
|
+
|
|
13
25
|
export declare const getSession: (key: string) => WASocket | undefined;
|
|
26
|
+
|
|
27
|
+
export declare const getAllSessionData: () => Record<string, WASocket | undefined>;
|
|
28
|
+
|
|
14
29
|
export declare const loadSessionsFromStorage: () => Promise<string[]>;
|
|
30
|
+
|
|
31
|
+
export declare const sock: (conn: any) => any;
|
|
32
|
+
|
|
15
33
|
export declare const onMessageReceived: (listener: (msg: MessageReceived) => any) => void;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}) => any) => void;
|
|
34
|
+
|
|
35
|
+
export declare const onQRUpdated: (listener: ({ sessionId, qr }: { sessionId: string; qr: string }) => any) => void;
|
|
36
|
+
|
|
20
37
|
export declare const onConnected: (listener: (sessionId: string) => any) => void;
|
|
38
|
+
|
|
21
39
|
export declare const onDisconnected: (listener: (sessionId: string) => any) => void;
|
|
40
|
+
|
|
22
41
|
export declare const onConnecting: (listener: (sessionId: string) => any) => void;
|
|
23
|
-
|
|
24
|
-
export declare const
|
|
42
|
+
|
|
43
|
+
export declare const onMessageUpdate: (listener: (sessionId: string, data: MessageUpdated) => any) => void;
|
|
44
|
+
|
|
45
|
+
export declare const onPairingCode: (listener: (sessionId: string, code: string) => any) => void;
|
package/dist/Socket/index.js
CHANGED
|
@@ -1,427 +1,379 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
-
};
|
|
1
|
+
"use strict";
|
|
37
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.onPairingCode = exports.onMessageUpdate = exports.onConnecting = exports.onDisconnected = exports.onConnected = exports.onQRUpdated = exports.onMessageReceived = exports.loadSessionsFromStorage = exports.getSession = exports.getAllSession = exports.deleteSession = exports.startWhatsapp = exports.startSession = void 0;
|
|
39
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
18
|
+
|
|
19
|
+
let CURRENT_WA_API_VERSION = "1.5.1";
|
|
20
|
+
let waApiUpdateCheckDone = false;
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const pkg = require("../../package.json");
|
|
24
|
+
if (pkg && typeof pkg.version === "string") {
|
|
25
|
+
CURRENT_WA_API_VERSION = pkg.version;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (_) {
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const isNewerVersion = (latest, current) => {
|
|
32
|
+
if (!latest || !current) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const a = current.split(".").map((n) => parseInt(n, 10) || 0);
|
|
36
|
+
const b = latest.split(".").map((n) => parseInt(n, 10) || 0);
|
|
37
|
+
for (let i = 0; i < Math.max(a.length, b.length); i += 1) {
|
|
38
|
+
const x = a[i] || 0;
|
|
39
|
+
const y = b[i] || 0;
|
|
40
|
+
if (y > x) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
if (y < x) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
};
|
|
49
|
+
|
|
54
50
|
const checkWaApiUpdate = () => {
|
|
51
|
+
if (waApiUpdateCheckDone) {
|
|
52
|
+
return Promise.resolve(null);
|
|
53
|
+
}
|
|
54
|
+
waApiUpdateCheckDone = true;
|
|
55
55
|
return new Promise((resolve) => {
|
|
56
|
-
const url =
|
|
57
|
-
https_1.
|
|
58
|
-
let data =
|
|
59
|
-
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) => {
|
|
60
60
|
data += chunk;
|
|
61
61
|
});
|
|
62
|
-
res.on(
|
|
62
|
+
res.on("end", () => {
|
|
63
63
|
try {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
const latestVersion = JSON.parse(data)?.version;
|
|
65
|
+
if (latestVersion && isNewerVersion(latestVersion, CURRENT_WA_API_VERSION)) {
|
|
66
|
+
console.log(
|
|
67
|
+
[
|
|
68
|
+
"",
|
|
69
|
+
"[wa-api] Update available",
|
|
70
|
+
`Current: ${CURRENT_WA_API_VERSION}`,
|
|
71
|
+
`Latest: ${latestVersion}`,
|
|
72
|
+
"Run: npm install @neelegirl/wa-api@latest",
|
|
73
|
+
""
|
|
74
|
+
].join("\n")
|
|
75
|
+
);
|
|
69
76
|
resolve({
|
|
70
77
|
current: CURRENT_WA_API_VERSION,
|
|
71
78
|
latest: latestVersion,
|
|
72
79
|
hasUpdate: true
|
|
73
80
|
});
|
|
81
|
+
return;
|
|
74
82
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
latest: latestVersion,
|
|
81
|
-
hasUpdate: false
|
|
82
|
-
});
|
|
83
|
-
}
|
|
83
|
+
resolve({
|
|
84
|
+
current: CURRENT_WA_API_VERSION,
|
|
85
|
+
latest: latestVersion || CURRENT_WA_API_VERSION,
|
|
86
|
+
hasUpdate: false
|
|
87
|
+
});
|
|
84
88
|
}
|
|
85
|
-
catch (
|
|
89
|
+
catch (_) {
|
|
86
90
|
resolve(null);
|
|
87
91
|
}
|
|
88
92
|
});
|
|
89
|
-
}).on(
|
|
90
|
-
resolve(null);
|
|
91
|
-
}).on('timeout', () => {
|
|
92
|
-
resolve(null);
|
|
93
|
-
});
|
|
93
|
+
}).on("error", () => resolve(null))
|
|
94
|
+
.on("timeout", () => resolve(null));
|
|
94
95
|
});
|
|
95
96
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
if (connection == "connecting") {
|
|
130
|
-
(_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
131
|
-
}
|
|
132
|
-
if (connection === "close") {
|
|
133
|
-
const code = (_d = (_c = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _c === void 0 ? void 0 : _c.output) === null || _d === void 0 ? void 0 : _d.statusCode;
|
|
134
|
-
let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
|
|
135
|
-
let shouldRetry;
|
|
136
|
-
if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
137
|
-
shouldRetry = true;
|
|
138
|
-
}
|
|
139
|
-
if (shouldRetry) {
|
|
140
|
-
retryAttempt++;
|
|
141
|
-
}
|
|
142
|
-
if (shouldRetry) {
|
|
143
|
-
retryCount.set(sessionId, retryAttempt);
|
|
144
|
-
startSocket();
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
//retryCount.delete(sessionId);
|
|
148
|
-
(0, exports.deleteSession)(sessionId);
|
|
149
|
-
(_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
if (connection == "open") {
|
|
153
|
-
retryCount.delete(sessionId);
|
|
154
|
-
(_g = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
if (events["creds.update"]) {
|
|
158
|
-
yield saveCreds();
|
|
159
|
-
}
|
|
160
|
-
if (events["messages.update"]) {
|
|
161
|
-
const msg = events["messages.update"][0];
|
|
162
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
|
|
163
|
-
(_h = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _h === void 0 ? void 0 : _h(sessionId, data);
|
|
97
|
+
|
|
98
|
+
const emitMessageUpsert = (sessionId, msg) => {
|
|
99
|
+
msg.sessionId = sessionId;
|
|
100
|
+
msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
|
|
101
|
+
msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
|
|
102
|
+
msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
|
|
103
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ ...msg });
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const attachSocketEvents = (sessionId, sock, saveCreds, restartSocket) => {
|
|
107
|
+
sock.ev.process(async (events) => {
|
|
108
|
+
if (events["connection.update"]) {
|
|
109
|
+
const update = events["connection.update"];
|
|
110
|
+
const { connection, lastDisconnect } = update;
|
|
111
|
+
if (update.qr) {
|
|
112
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_QR)?.({
|
|
113
|
+
sessionId,
|
|
114
|
+
qr: update.qr
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (connection === "connecting") {
|
|
118
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)?.(sessionId);
|
|
119
|
+
}
|
|
120
|
+
if (connection === "close") {
|
|
121
|
+
const code = lastDisconnect?.error?.output?.statusCode;
|
|
122
|
+
let retryAttempt = retryCount.get(sessionId) ?? 0;
|
|
123
|
+
const shouldRetry = code !== baileys_1.DisconnectReason.loggedOut && retryAttempt < 10;
|
|
124
|
+
if (shouldRetry) {
|
|
125
|
+
retryAttempt += 1;
|
|
126
|
+
retryCount.set(sessionId, retryAttempt);
|
|
127
|
+
restartSocket();
|
|
164
128
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
|
|
170
|
-
msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
|
|
171
|
-
msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
|
|
172
|
-
(_k = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _k === void 0 ? void 0 : _k(Object.assign({}, msg));
|
|
129
|
+
else {
|
|
130
|
+
retryCount.delete(sessionId);
|
|
131
|
+
await (0, exports.deleteSession)(sessionId);
|
|
132
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId);
|
|
173
133
|
}
|
|
174
|
-
}
|
|
175
|
-
|
|
134
|
+
}
|
|
135
|
+
if (connection === "open") {
|
|
136
|
+
retryCount.delete(sessionId);
|
|
137
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
|
|
138
|
+
}
|
|
176
139
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
140
|
+
if (events["creds.update"]) {
|
|
141
|
+
await saveCreds();
|
|
142
|
+
}
|
|
143
|
+
if (events["messages.update"]) {
|
|
144
|
+
const msg = events["messages.update"][0];
|
|
145
|
+
if (msg) {
|
|
146
|
+
const data = {
|
|
147
|
+
...msg,
|
|
148
|
+
sessionId,
|
|
149
|
+
messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update?.status)
|
|
150
|
+
};
|
|
151
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (events["messages.upsert"]) {
|
|
155
|
+
const msg = events["messages.upsert"]?.messages?.[0];
|
|
156
|
+
if (msg) {
|
|
157
|
+
emitMessageUpsert(sessionId, msg);
|
|
158
|
+
}
|
|
180
159
|
}
|
|
181
160
|
});
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
209
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
210
|
-
const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX));
|
|
211
|
-
|
|
212
|
-
const sock = (0, baileys_1.default)({
|
|
213
|
-
version,
|
|
214
|
-
printQRInTerminal: false,
|
|
215
|
-
auth: state,
|
|
216
|
-
logger,
|
|
217
|
-
markOnlineOnConnect: false,
|
|
218
|
-
browser: baileys_1.Browsers.ubuntu("Chrome"),
|
|
219
|
-
});
|
|
220
|
-
sessions.set(sessionId, sock);
|
|
221
|
-
try {
|
|
222
|
-
if (!sock.authState.creds.registered) {
|
|
223
|
-
console.log("first time pairing");
|
|
224
|
-
setTimeout(async () => {
|
|
225
|
-
const code = await sock.requestPairingCode(options.phoneNumber,key);
|
|
226
|
-
console.log(code);
|
|
227
|
-
|
|
228
|
-
callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const createSessionSocket = async (sessionId, options = {}, retryStarter) => {
|
|
164
|
+
const logger = (0, pino_1)({ level: "silent" });
|
|
165
|
+
const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
|
|
166
|
+
const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
|
|
167
|
+
path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)
|
|
168
|
+
);
|
|
169
|
+
const sock = (0, baileys_1.default)({
|
|
170
|
+
version,
|
|
171
|
+
printQRInTerminal: !!options.printQR,
|
|
172
|
+
auth: state,
|
|
173
|
+
logger,
|
|
174
|
+
markOnlineOnConnect: false,
|
|
175
|
+
browser: baileys_1.Browsers.ubuntu("Chrome")
|
|
176
|
+
});
|
|
177
|
+
sessions.set(sessionId, { ...sock });
|
|
178
|
+
attachSocketEvents(sessionId, sock, saveCreds, retryStarter);
|
|
179
|
+
if (options.phoneNumber && !sock.authState?.creds?.registered) {
|
|
180
|
+
setTimeout(async () => {
|
|
181
|
+
try {
|
|
182
|
+
const code = await sock.requestPairingCode(options.phoneNumber, options.pairingCode);
|
|
183
|
+
callback.get(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
|
|
184
|
+
}
|
|
185
|
+
catch (_) {
|
|
186
|
+
}
|
|
229
187
|
}, 5000);
|
|
230
|
-
}
|
|
231
|
-
sock.ev.process(async (events) => {
|
|
232
|
-
if (events["connection.update"]) {
|
|
233
|
-
const update = events["connection.update"];
|
|
234
|
-
const { connection, lastDisconnect } = update;
|
|
235
|
-
|
|
236
|
-
if (connection == "connecting") {
|
|
237
|
-
(_b = callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
238
|
-
}
|
|
239
|
-
if (connection === "close") {
|
|
240
|
-
const code = (_d = (_c = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _c === void 0 ? void 0 : _c.output) === null || _d === void 0 ? void 0 : _d.statusCode;
|
|
241
|
-
let retryAttempt = (_e = retryCount.get(sessionId)) !== null && _e !== void 0 ? _e : 0;
|
|
242
|
-
let shouldRetry;
|
|
243
|
-
if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
244
|
-
shouldRetry = true;
|
|
245
|
-
}
|
|
246
|
-
if (shouldRetry) {
|
|
247
|
-
retryAttempt++;
|
|
248
|
-
}
|
|
249
|
-
if (shouldRetry) {
|
|
250
|
-
retryCount.set(sessionId, retryAttempt);
|
|
251
|
-
startSocket();
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
retryCount.delete(sessionId);
|
|
255
|
-
(0, exports.deleteSession)(sessionId);
|
|
256
|
-
(_f = callback.get(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _f === void 0 ? void 0 : _f(sessionId);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
if (connection == "open") {
|
|
260
|
-
retryCount.delete(sessionId);
|
|
261
|
-
callback.get(Defaults_1.CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
|
|
262
|
-
}
|
|
263
188
|
}
|
|
264
|
-
|
|
265
|
-
|
|
189
|
+
return sock;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const isSessionExistAndRunning = (sessionId) => {
|
|
193
|
+
const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
|
|
194
|
+
return (
|
|
195
|
+
fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
196
|
+
fs_1.existsSync(credsPath) &&
|
|
197
|
+
fs_1.readdirSync(credsPath).length > 0 &&
|
|
198
|
+
(0, exports.getSession)(sessionId)
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const shouldLoadSession = (sessionId) => {
|
|
203
|
+
const credsPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX);
|
|
204
|
+
return (
|
|
205
|
+
fs_1.existsSync(path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
206
|
+
fs_1.existsSync(credsPath) &&
|
|
207
|
+
fs_1.readdirSync(credsPath).length > 0 &&
|
|
208
|
+
!(0, exports.getSession)(sessionId)
|
|
209
|
+
);
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const startSession = async (sessionId = "mysession", options = { printQR: true }) => {
|
|
213
|
+
checkWaApiUpdate().catch(() => { });
|
|
214
|
+
if (isSessionExistAndRunning(sessionId)) {
|
|
215
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
|
|
216
|
+
}
|
|
217
|
+
const starter = () => createSessionSocket(sessionId, { printQR: options?.printQR !== false }, starter);
|
|
218
|
+
return starter();
|
|
219
|
+
};
|
|
220
|
+
exports.startSession = startSession;
|
|
221
|
+
|
|
222
|
+
const onimaii = async (sessionId = "mysession", connect) => {
|
|
223
|
+
if (typeof connect !== "function") {
|
|
224
|
+
throw new Error_1.WhatsappError("connect must be a function");
|
|
266
225
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return sock;
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
// console.log("SOCKET ERROR", error);
|
|
286
|
-
return sock;
|
|
287
|
-
}
|
|
226
|
+
if (isSessionExistAndRunning(sessionId)) {
|
|
227
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
|
|
228
|
+
}
|
|
229
|
+
const logger = (0, pino_1)({ level: "silent" });
|
|
230
|
+
const { version } = await (0, baileys_1.fetchLatestBaileysVersion)();
|
|
231
|
+
const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(
|
|
232
|
+
path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)
|
|
233
|
+
);
|
|
234
|
+
const sock = connect({
|
|
235
|
+
version,
|
|
236
|
+
printQRInTerminal: true,
|
|
237
|
+
auth: state,
|
|
238
|
+
logger,
|
|
239
|
+
markOnlineOnConnect: false,
|
|
240
|
+
browser: baileys_1.Browsers.ubuntu("Chrome")
|
|
288
241
|
});
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
242
|
+
sessions.set(sessionId, { ...sock });
|
|
243
|
+
if (sock?.ev?.on) {
|
|
244
|
+
sock.ev.on("creds.update", saveCreds);
|
|
245
|
+
}
|
|
246
|
+
return sock;
|
|
247
|
+
};
|
|
248
|
+
exports.onimaii = onimaii;
|
|
249
|
+
|
|
250
|
+
const startSessionWithPairingCode = async (
|
|
251
|
+
sessionId = "mysession",
|
|
252
|
+
options = { phoneNumber: "" },
|
|
253
|
+
pairingCode
|
|
254
|
+
) => {
|
|
255
|
+
if (isSessionExistAndRunning(sessionId)) {
|
|
256
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
|
|
257
|
+
}
|
|
258
|
+
if (!options?.phoneNumber) {
|
|
259
|
+
throw new Error_1.WhatsappError("phoneNumber is required for pairing mode");
|
|
260
|
+
}
|
|
261
|
+
const starter = () => createSessionSocket(
|
|
262
|
+
sessionId,
|
|
263
|
+
{ printQR: false, phoneNumber: options.phoneNumber, pairingCode },
|
|
264
|
+
starter
|
|
265
|
+
);
|
|
266
|
+
return starter();
|
|
267
|
+
};
|
|
268
|
+
exports.startSessionWithPairingCode = startSessionWithPairingCode;
|
|
269
|
+
|
|
295
270
|
exports.startWhatsapp = exports.startSession;
|
|
296
|
-
|
|
271
|
+
|
|
272
|
+
const deleteSession = async (sessionId) => {
|
|
297
273
|
const session = (0, exports.getSession)(sessionId);
|
|
298
274
|
try {
|
|
299
|
-
|
|
275
|
+
await session?.logout?.();
|
|
276
|
+
}
|
|
277
|
+
catch (_) {
|
|
300
278
|
}
|
|
301
|
-
|
|
302
|
-
session === null || session === void 0 ? void 0 : session.end(undefined);
|
|
279
|
+
session?.end?.(undefined);
|
|
303
280
|
sessions.delete(sessionId);
|
|
304
|
-
const dir = path_1.
|
|
305
|
-
if (fs_1.
|
|
306
|
-
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 });
|
|
307
284
|
}
|
|
308
|
-
}
|
|
285
|
+
};
|
|
309
286
|
exports.deleteSession = deleteSession;
|
|
287
|
+
|
|
310
288
|
const getAllSession = () => Array.from(sessions.keys());
|
|
311
289
|
exports.getAllSession = getAllSession;
|
|
290
|
+
|
|
312
291
|
const getSession = (key) => sessions.get(key);
|
|
313
292
|
exports.getSession = getSession;
|
|
314
|
-
const isSessionExistAndRunning = (sessionId) => {
|
|
315
|
-
if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
316
|
-
fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
|
|
317
|
-
fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
|
|
318
|
-
(0, exports.getSession)(sessionId)) {
|
|
319
|
-
return true;
|
|
320
|
-
}
|
|
321
|
-
return false;
|
|
322
|
-
};
|
|
323
|
-
const shouldLoadSession = (sessionId) => {
|
|
324
|
-
if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
325
|
-
fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)) &&
|
|
326
|
-
fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.SUFFIX)).length &&
|
|
327
|
-
!(0, exports.getSession)(sessionId)) {
|
|
328
|
-
return true;
|
|
329
|
-
}
|
|
330
|
-
return false;
|
|
331
|
-
};
|
|
332
|
-
const getAllSessionData = () => {
|
|
333
|
-
// Angenommen, getAllSession gibt eine Liste aller aktiven Sessions zurück
|
|
334
|
-
let allSessions = getAllSession();
|
|
335
|
-
let allSessionData = {};
|
|
336
293
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
294
|
+
const getAllSessionData = () => {
|
|
295
|
+
const allSessionData = {};
|
|
296
|
+
for (const sessionName of (0, exports.getAllSession)()) {
|
|
297
|
+
allSessionData[sessionName] = (0, exports.getSession)(sessionName);
|
|
340
298
|
}
|
|
341
|
-
|
|
342
299
|
return allSessionData;
|
|
343
|
-
}
|
|
300
|
+
};
|
|
344
301
|
exports.getAllSessionData = getAllSessionData;
|
|
345
302
|
|
|
346
|
-
async
|
|
347
|
-
const dirPath = path_1.
|
|
303
|
+
const loadSessionsFromStorage = async () => {
|
|
304
|
+
const dirPath = path_1.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
|
|
348
305
|
const loadedSessions = [];
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (!fs_1.default.existsSync(dirPath)) {
|
|
352
|
-
fs_1.default.mkdirSync(dirPath, { recursive: true });
|
|
306
|
+
if (!fs_1.existsSync(dirPath)) {
|
|
307
|
+
fs_1.mkdirSync(dirPath, { recursive: true });
|
|
353
308
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
for (const entry of entries) {
|
|
359
|
-
const fullPath = path_1.default.join(dirPath, entry);
|
|
309
|
+
const entries = await fs_1.promises.readdir(dirPath);
|
|
310
|
+
for (const entry of entries) {
|
|
311
|
+
const fullPath = path_1.join(dirPath, entry);
|
|
360
312
|
let stat;
|
|
361
313
|
try {
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
|
|
314
|
+
stat = await fs_1.promises.stat(fullPath);
|
|
315
|
+
}
|
|
316
|
+
catch (_) {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (!stat.isDirectory()) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const underscoreIndex = entry.indexOf("_");
|
|
323
|
+
const sessionId = underscoreIndex > 0 ? entry.slice(0, underscoreIndex) : entry;
|
|
324
|
+
if (!shouldLoadSession(sessionId)) {
|
|
325
|
+
continue;
|
|
366
326
|
}
|
|
367
|
-
if (!stat.isDirectory()) continue;
|
|
368
|
-
|
|
369
|
-
// sessionId bis zum ersten Unterstrich extrahieren
|
|
370
|
-
const underscoreIndex = entry.indexOf('_');
|
|
371
|
-
const sessionId = underscoreIndex > 0
|
|
372
|
-
? entry.slice(0, underscoreIndex)
|
|
373
|
-
: entry; // oder continue, wenn du ohne _ nicht laden willst
|
|
374
|
-
|
|
375
327
|
try {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// weitere Sessions trotzdem laden
|
|
328
|
+
await (0, exports.startSession)(sessionId);
|
|
329
|
+
loadedSessions.push(sessionId);
|
|
330
|
+
}
|
|
331
|
+
catch (_) {
|
|
381
332
|
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
return loadedSessions;
|
|
385
|
-
} catch (err) {
|
|
386
|
-
console.error('Fehler beim Lesen des Session-Verzeichnisses:', err);
|
|
387
|
-
throw err; // oder wirf einen eigenen WhatsappError o.Ä.
|
|
388
333
|
}
|
|
389
|
-
|
|
390
|
-
exports.loadSessionsFromStorage = loadSessionsFromStorage;
|
|
391
|
-
const onMessageReceived = (listener) => {
|
|
392
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
334
|
+
return loadedSessions;
|
|
393
335
|
};
|
|
336
|
+
exports.loadSessionsFromStorage = loadSessionsFromStorage;
|
|
394
337
|
|
|
395
338
|
const sock = (conn) => {
|
|
396
|
-
onMessageReceived(
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
conn
|
|
400
|
-
|
|
401
|
-
};
|
|
339
|
+
(0, exports.onMessageReceived)((msg) => {
|
|
340
|
+
conn = (0, exports.getSession)(msg.sessionId);
|
|
341
|
+
});
|
|
342
|
+
return conn;
|
|
343
|
+
};
|
|
402
344
|
exports.sock = sock;
|
|
345
|
+
|
|
346
|
+
const onMessageReceived = (listener) => {
|
|
347
|
+
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
348
|
+
};
|
|
403
349
|
exports.onMessageReceived = onMessageReceived;
|
|
350
|
+
|
|
404
351
|
const onQRUpdated = (listener) => {
|
|
405
352
|
callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
|
|
406
353
|
};
|
|
407
354
|
exports.onQRUpdated = onQRUpdated;
|
|
355
|
+
|
|
408
356
|
const onConnected = (listener) => {
|
|
409
357
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
|
|
410
358
|
};
|
|
411
359
|
exports.onConnected = onConnected;
|
|
360
|
+
|
|
412
361
|
const onDisconnected = (listener) => {
|
|
413
362
|
callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
414
363
|
};
|
|
415
364
|
exports.onDisconnected = onDisconnected;
|
|
365
|
+
|
|
416
366
|
const onConnecting = (listener) => {
|
|
417
367
|
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
|
|
418
368
|
};
|
|
419
369
|
exports.onConnecting = onConnecting;
|
|
370
|
+
|
|
420
371
|
const onMessageUpdate = (listener) => {
|
|
421
372
|
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
422
373
|
};
|
|
423
374
|
exports.onMessageUpdate = onMessageUpdate;
|
|
375
|
+
|
|
424
376
|
const onPairingCode = (listener) => {
|
|
425
377
|
callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
426
378
|
};
|
|
427
|
-
exports.onPairingCode = onPairingCode;
|
|
379
|
+
exports.onPairingCode = onPairingCode;
|
package/dist/Types/index.d.ts
CHANGED
package/dist/whatsapp/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,39 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neelegirl/wa-api",
|
|
3
|
-
"version": "1.6.
|
|
4
|
-
"description": "Multi-session WhatsApp wrapper built on @neelegirl/baileys
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
"wa-api",
|
|
8
|
-
"multi-session",
|
|
9
|
-
"pairing",
|
|
10
|
-
"qr",
|
|
11
|
-
"automation",
|
|
12
|
-
"neelegirl"
|
|
13
|
-
],
|
|
14
|
-
"homepage": "https://github.com/neelegirly/neelegirl-wa-api#readme",
|
|
3
|
+
"version": "1.6.3",
|
|
4
|
+
"description": "Multi-session WhatsApp API wrapper built on @neelegirl/baileys",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
15
7
|
"repository": {
|
|
16
8
|
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/
|
|
9
|
+
"url": "git+https://github.com/neelegirl/wa-api.git"
|
|
18
10
|
},
|
|
11
|
+
"homepage": "https://github.com/neelegirl/wa-api#readme",
|
|
19
12
|
"bugs": {
|
|
20
|
-
"url": "https://github.com/
|
|
13
|
+
"url": "https://github.com/neelegirl/wa-api/issues"
|
|
21
14
|
},
|
|
22
|
-
"license": "ISC",
|
|
23
|
-
"author": "Neele",
|
|
24
|
-
"main": "dist/index.js",
|
|
25
|
-
"types": "dist/index.d.ts",
|
|
26
15
|
"files": [
|
|
27
16
|
"dist/**/*",
|
|
28
|
-
"readme.md"
|
|
29
|
-
"LICENSE"
|
|
17
|
+
"readme.md"
|
|
30
18
|
],
|
|
31
19
|
"scripts": {
|
|
32
|
-
"
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"start": "node ./dist/index.js",
|
|
22
|
+
"start:dev": "tsc && node ./dist/index.js",
|
|
23
|
+
"test": "node -e \"console.log('No tests configured')\""
|
|
33
24
|
},
|
|
25
|
+
"author": "Neele",
|
|
26
|
+
"license": "MIT",
|
|
34
27
|
"dependencies": {
|
|
35
|
-
"@neelegirl/baileys": "^2.1.
|
|
36
|
-
"pino": "^
|
|
28
|
+
"@neelegirl/baileys": "^2.1.0",
|
|
29
|
+
"pino": "^8.11.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/mime": "^3.0.1",
|
|
33
|
+
"jest": "^29.0.0"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"whatsapp",
|
|
37
|
+
"baileys",
|
|
38
|
+
"multi-session",
|
|
39
|
+
"wa-api"
|
|
40
|
+
],
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@neelegirl/baileys": "^2.1.0"
|
|
37
43
|
},
|
|
38
44
|
"engines": {
|
|
39
45
|
"node": ">=20.0.0"
|
package/readme.md
CHANGED
|
@@ -1,140 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
<img src="https://files.catbox.moe/6np1ii.JPG" alt="@neelegirl/wa-api" width="900" />
|
|
3
|
-
</p>
|
|
1
|
+
# @neelegirl/wa-api
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+

|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
Das Paket kapselt Session-Start, Pairing, Listener und einfache Message-Helper,
|
|
9
|
-
ohne selbst ein eigenes REST- oder Queue-System mitzubringen.
|
|
5
|
+
High-level multi-session API wrapper for WhatsApp automation, built on `@neelegirl/baileys`.
|
|
10
6
|
|
|
11
|
-
|
|
7
|
+
## Status
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
- Package version: `1.6.0`
|
|
10
|
+
- Runtime: Node.js `>=20`
|
|
11
|
+
- Core dependency: `@neelegirl/baileys` `^2.1.0`
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
- Multi-Session-Management ueber Dateispeicher
|
|
17
|
-
- QR-Login und Pairing-Code-Login
|
|
18
|
-
- Helper fuer `sendMessage`, `sendStatusMentions` und `relayMessage`
|
|
19
|
-
- Listener fuer Verbindung, QR, Pairing-Code und Nachrichten
|
|
13
|
+
## Features
|
|
20
14
|
|
|
21
|
-
|
|
15
|
+
- Multi-session start/stop with filesystem credentials
|
|
16
|
+
- QR flow via callback
|
|
17
|
+
- Pairing-code flow via callback
|
|
18
|
+
- Auto reconnect retries (up to 10 attempts)
|
|
19
|
+
- Message upsert/update callbacks with helper media savers
|
|
20
|
+
- `sendMessage`, `sendStatusMentions`, and low-level `relayMessage`
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
- installierte `@neelegirl/baileys`-Abhaengigkeit
|
|
25
|
-
- optional `qrcode-terminal`, wenn `printQR: true` fuer Terminal-QR genutzt wird
|
|
26
|
-
|
|
27
|
-
## Installation
|
|
22
|
+
## Install
|
|
28
23
|
|
|
29
24
|
```bash
|
|
30
25
|
npm install @neelegirl/wa-api
|
|
31
26
|
```
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npm install qrcode-terminal
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Schnellstart
|
|
28
|
+
## Quick Start
|
|
40
29
|
|
|
41
30
|
```js
|
|
42
31
|
const wa = require('@neelegirl/wa-api')
|
|
43
32
|
|
|
44
33
|
wa.onQRUpdated(({ sessionId, qr }) => {
|
|
45
|
-
console.log('QR
|
|
34
|
+
console.log('QR for session:', sessionId)
|
|
35
|
+
console.log(qr)
|
|
46
36
|
})
|
|
47
37
|
|
|
48
38
|
wa.onConnected((sessionId) => {
|
|
49
|
-
console.log('
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
wa.onMessageReceived((msg) => {
|
|
53
|
-
console.log('Nachricht in Session', msg.sessionId)
|
|
39
|
+
console.log('connected:', sessionId)
|
|
54
40
|
})
|
|
55
41
|
|
|
56
|
-
async
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
wa.onMessageReceived(async (msg) => {
|
|
43
|
+
const sessionId = msg.sessionId
|
|
44
|
+
const jid = msg.key?.remoteJid
|
|
45
|
+
const text = msg.message?.conversation || msg.message?.extendedTextMessage?.text || ''
|
|
59
46
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
## Pairing-Code-Login
|
|
64
|
-
|
|
65
|
-
```js
|
|
66
|
-
const wa = require('@neelegirl/wa-api')
|
|
67
|
-
|
|
68
|
-
async function main() {
|
|
69
|
-
await wa.startSessionWithPairingCode(
|
|
70
|
-
'session2',
|
|
71
|
-
{ phoneNumber: '491234567890' },
|
|
72
|
-
'ONIMAIII'
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
wa.onPairingCode((sessionId, code) => {
|
|
77
|
-
console.log('Pairing-Code fuer', sessionId, code)
|
|
47
|
+
if (jid && text.toLowerCase() === 'ping') {
|
|
48
|
+
await wa.sendMessage(sessionId, jid, { text: 'pong' })
|
|
49
|
+
}
|
|
78
50
|
})
|
|
79
51
|
|
|
80
|
-
main
|
|
52
|
+
wa.startSession('main', { printQR: true }).catch(console.error)
|
|
81
53
|
```
|
|
82
54
|
|
|
83
|
-
|
|
84
|
-
8 Zeichen lang sein.
|
|
85
|
-
|
|
86
|
-
## Nachrichten senden
|
|
87
|
-
|
|
88
|
-
```js
|
|
89
|
-
const wa = require('@neelegirl/wa-api')
|
|
90
|
-
|
|
91
|
-
await wa.sendMessage('session1', '491234567890', { text: 'Hallo' })
|
|
92
|
-
|
|
93
|
-
await wa.sendStatusMentions('session1', {
|
|
94
|
-
text: 'Status mit Mentions'
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
await wa.relayMessage(
|
|
98
|
-
'session1',
|
|
99
|
-
'status@broadcast',
|
|
100
|
-
{
|
|
101
|
-
protocolMessage: {
|
|
102
|
-
type: 14
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
{}
|
|
106
|
-
)
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Sessions aus dem Speicher laden
|
|
110
|
-
|
|
111
|
-
```js
|
|
112
|
-
const wa = require('@neelegirl/wa-api')
|
|
113
|
-
|
|
114
|
-
const loaded = await wa.loadSessionsFromStorage()
|
|
115
|
-
console.log('Geladene Sessions:', loaded)
|
|
116
|
-
```
|
|
55
|
+
## API Surface
|
|
117
56
|
|
|
118
|
-
|
|
57
|
+
- Session lifecycle
|
|
58
|
+
- `startSession(sessionId, options)`
|
|
59
|
+
- `startSessionWithPairingCode(sessionId, { phoneNumber }, pairingCode?)`
|
|
60
|
+
- `deleteSession(sessionId)`
|
|
61
|
+
- `getSession(sessionId)`
|
|
62
|
+
- `getAllSession()`
|
|
63
|
+
- `loadSessionsFromStorage()`
|
|
119
64
|
|
|
120
|
-
|
|
65
|
+
- Messaging
|
|
66
|
+
- `sendMessage(sessionId, jidOrPhone, content, options?)`
|
|
67
|
+
- `sendStatusMentions(sessionId, content, options?)`
|
|
68
|
+
- `relayMessage(sessionId, jidOrPhone, content, options?)`
|
|
121
69
|
|
|
122
|
-
-
|
|
123
|
-
- `
|
|
124
|
-
- `
|
|
125
|
-
- `
|
|
126
|
-
- `
|
|
127
|
-
- `
|
|
128
|
-
- `
|
|
70
|
+
- Events
|
|
71
|
+
- `onMessageReceived(listener)`
|
|
72
|
+
- `onMessageUpdate(listener)`
|
|
73
|
+
- `onQRUpdated(listener)`
|
|
74
|
+
- `onConnected(listener)`
|
|
75
|
+
- `onConnecting(listener)`
|
|
76
|
+
- `onDisconnected(listener)`
|
|
77
|
+
- `onPairingCode(listener)`
|
|
129
78
|
|
|
130
|
-
##
|
|
79
|
+
## Operational Notes
|
|
131
80
|
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
135
|
-
- veroeffentlicht als vorgebaute `dist/`-Distribution
|
|
136
|
-
- das Low-Level-Verhalten kommt direkt aus `@neelegirl/baileys`
|
|
81
|
+
- Credentials are stored under `wa_credentials/<session>_credentials`.
|
|
82
|
+
- The package performs a lightweight npm update check once per process start.
|
|
83
|
+
- No dedicated Word2Web module is shipped in this package.
|
|
137
84
|
|
|
138
|
-
##
|
|
85
|
+
## Legal
|
|
139
86
|
|
|
140
|
-
|
|
87
|
+
This project is not affiliated with WhatsApp.
|
|
88
|
+
Use responsibly and comply with applicable laws and platform terms.
|