@deathnaitsa/wa-api 1.0.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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Defaults/index.d.ts +18 -0
  3. package/dist/Defaults/index.d.ts.map +1 -0
  4. package/dist/Defaults/index.js +28 -0
  5. package/dist/Error/index.d.ts +5 -0
  6. package/dist/Error/index.d.ts.map +1 -0
  7. package/dist/Error/index.js +14 -0
  8. package/dist/Messaging/index.d.ts +43 -0
  9. package/dist/Messaging/index.d.ts.map +1 -0
  10. package/dist/Messaging/index.js +410 -0
  11. package/dist/Socket/Socket.d.ts +21 -0
  12. package/dist/Socket/Socket.d.ts.map +1 -0
  13. package/dist/Socket/Socket.interface.d.ts +4 -0
  14. package/dist/Socket/Socket.interface.d.ts.map +1 -0
  15. package/dist/Socket/Socket.interface.js +2 -0
  16. package/dist/Socket/Socket.js +31 -0
  17. package/dist/Socket/index.d.ts +22 -0
  18. package/dist/Socket/index.d.ts.map +1 -0
  19. package/dist/Socket/index.js +375 -0
  20. package/dist/Types/WhatsappOptions.d.ts +3 -0
  21. package/dist/Types/WhatsappOptions.d.ts.map +1 -0
  22. package/dist/Types/WhatsappOptions.js +2 -0
  23. package/dist/Types/index.d.ts +51 -0
  24. package/dist/Types/index.d.ts.map +1 -0
  25. package/dist/Types/index.js +2 -0
  26. package/dist/Utils/create-delay.d.ts +2 -0
  27. package/dist/Utils/create-delay.d.ts.map +1 -0
  28. package/dist/Utils/create-delay.js +18 -0
  29. package/dist/Utils/error.d.ts +4 -0
  30. package/dist/Utils/error.d.ts.map +1 -0
  31. package/dist/Utils/error.js +8 -0
  32. package/dist/Utils/index.d.ts +5 -0
  33. package/dist/Utils/index.d.ts.map +1 -0
  34. package/dist/Utils/index.js +21 -0
  35. package/dist/Utils/is-exist.d.ts +3 -0
  36. package/dist/Utils/is-exist.d.ts.map +1 -0
  37. package/dist/Utils/is-exist.js +38 -0
  38. package/dist/Utils/message-status.d.ts +4 -0
  39. package/dist/Utils/message-status.d.ts.map +1 -0
  40. package/dist/Utils/message-status.js +18 -0
  41. package/dist/Utils/phone-to-jid.d.ts +5 -0
  42. package/dist/Utils/phone-to-jid.d.ts.map +1 -0
  43. package/dist/Utils/phone-to-jid.js +30 -0
  44. package/dist/Utils/save-media.d.ts +5 -0
  45. package/dist/Utils/save-media.d.ts.map +1 -0
  46. package/dist/Utils/save-media.js +47 -0
  47. package/dist/Utils/set-credentials-dir.d.ts +2 -0
  48. package/dist/Utils/set-credentials-dir.d.ts.map +1 -0
  49. package/dist/Utils/set-credentials-dir.js +8 -0
  50. package/dist/Utils/set-credentials.d.ts +2 -0
  51. package/dist/Utils/set-credentials.d.ts.map +1 -0
  52. package/dist/Utils/set-credentials.js +8 -0
  53. package/dist/index.d.ts +6 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +21 -0
  56. package/dist/whatsapp/index.d.ts +15 -0
  57. package/dist/whatsapp/index.d.ts.map +1 -0
  58. package/dist/whatsapp/index.js +206 -0
  59. package/package.json +37 -0
  60. package/readme.md +108 -0
@@ -0,0 +1,47 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.saveDocumentHandler = exports.saveVideoHandler = exports.saveImageHandler = void 0;
16
+ const baileys_1 = require("@whiskeysockets/baileys");
17
+ const error_1 = __importDefault(require("./error"));
18
+ const promises_1 = __importDefault(require("fs/promises"));
19
+ const saveMedia = (path, data) => __awaiter(void 0, void 0, void 0, function* () {
20
+ yield promises_1.default.writeFile(path, data.toString("base64"), "base64");
21
+ });
22
+ const saveImageHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
23
+ var _a;
24
+ if (!((_a = msg.message) === null || _a === void 0 ? void 0 : _a.imageMessage))
25
+ throw new error_1.default("Message is not contain Image");
26
+ const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
27
+ return saveMedia(path, buf);
28
+ });
29
+ exports.saveImageHandler = saveImageHandler;
30
+ const saveVideoHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
31
+ var _b;
32
+ if (!((_b = msg.message) === null || _b === void 0 ? void 0 : _b.videoMessage))
33
+ throw new error_1.default("Message is not contain Video");
34
+ const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
35
+ return saveMedia(path, buf);
36
+ });
37
+ exports.saveVideoHandler = saveVideoHandler;
38
+ const saveDocumentHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
39
+ var _c, _d;
40
+ if (!((_c = msg.message) === null || _c === void 0 ? void 0 : _c.documentMessage))
41
+ throw new error_1.default("Message is not contain Document");
42
+ const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
43
+ const ext = (_d = msg.message.documentMessage.fileName) === null || _d === void 0 ? void 0 : _d.split(".").pop();
44
+ path += "." + ext;
45
+ return saveMedia(path, buf);
46
+ });
47
+ exports.saveDocumentHandler = saveDocumentHandler;
@@ -0,0 +1,2 @@
1
+ export declare const setCredentialsDir: (dirname?: string) => void;
2
+ //# sourceMappingURL=set-credentials-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-credentials-dir.d.ts","sourceRoot":"","sources":["../../src/Utils/set-credentials-dir.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,aAAa,MAAM,SAEhD,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setCredentialsDir = void 0;
4
+ const Defaults_1 = require("../Defaults");
5
+ const setCredentialsDir = (dirname = "wa_credentials") => {
6
+ Defaults_1.CREDENTIALS.DIR_NAME = dirname;
7
+ };
8
+ exports.setCredentialsDir = setCredentialsDir;
@@ -0,0 +1,2 @@
1
+ export declare const setCredentials: (dirname?: string) => void;
2
+ //# sourceMappingURL=set-credentials-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-credentials-dir.d.ts","sourceRoot":"","sources":["../../src/Utils/set-credentials.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,aAAa,MAAM,SAEhD,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setCredentials = void 0;
4
+ const Defaults_1 = require("../Defaults");
5
+ const setCredentials = (dirname = "_credentials") => {
6
+ Defaults_1.CREDENTIALS.SUFFIX = dirname;
7
+ };
8
+ exports.setCredentials = setCredentials;
@@ -0,0 +1,6 @@
1
+ export * from "./Socket";
2
+ export * from "./Messaging";
3
+ export * from "./Utils";
4
+ export * from "./Types";
5
+ export * from "./Error";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Socket"), exports);
18
+ __exportStar(require("./Messaging"), exports);
19
+ __exportStar(require("./Utils"), exports);
20
+ __exportStar(require("./Types"), exports);
21
+ __exportStar(require("./Error"), exports);
@@ -0,0 +1,15 @@
1
+ import { Socket } from "../Socket/Socket";
2
+ import { WhatsappOptions } from "../Types/WhatsappOptions";
3
+ export declare class Whatsapp {
4
+ constructor(options?: WhatsappOptions);
5
+ sockets: Map<string, Socket>;
6
+ callback: Map<string, Function>;
7
+ retryCount: Map<string, number>;
8
+ load(each?: (socket: Socket) => Socket): Promise<void>;
9
+ private shouldLoadSession;
10
+ private getSocket;
11
+ startSession: (socket: Socket) => Promise<Socket>;
12
+ private isSessionExistAndRunning;
13
+ deleteSession: (sessionId: string) => Promise<void>;
14
+ }
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Whatsapp/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAc3D,qBAAa,QAAQ;gBACP,OAAO,GAAE,eAAoB;IAEzC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAC5C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAEtC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM;IAsB5C,OAAO,CAAC,iBAAiB,CAoBvB;IAEF,OAAO,CAAC,SAAS,CACe;IAEhC,YAAY,WAAkB,MAAM,KAAG,QAAQ,MAAM,CAAC,CAiGpD;IAEF,OAAO,CAAC,wBAAwB,CAoB9B;IAEF,aAAa,cAAqB,MAAM,mBAWtC;CACH"}
@@ -0,0 +1,206 @@
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
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.Whatsapp = void 0;
39
+ const baileys_1 = __importStar(require("@whiskeysockets/baileys"));
40
+ const Defaults_1 = require("../Defaults");
41
+ const Socket_1 = require("../Socket/Socket");
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const path_1 = __importDefault(require("path"));
44
+ const Error_1 = require("../Error");
45
+ const pino_1 = __importDefault(require("pino"));
46
+ const message_status_1 = require("../Utils/message-status");
47
+ const save_media_1 = require("../Utils/save-media");
48
+ class Whatsapp {
49
+ constructor(options = {}) {
50
+ this.sockets = new Map();
51
+ this.callback = new Map();
52
+ this.retryCount = new Map();
53
+ this.shouldLoadSession = (socket) => {
54
+ if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
55
+ fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)) &&
56
+ fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)).length &&
57
+ !this.getSocket(socket.id)) {
58
+ return true;
59
+ }
60
+ return false;
61
+ };
62
+ this.getSocket = (key) => { var _a; return (_a = this.sockets.get(key)) !== null && _a !== void 0 ? _a : null; };
63
+ this.startSession = (socket) => __awaiter(this, void 0, void 0, function* () {
64
+ if (this.isSessionExistAndRunning(socket))
65
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(socket.id));
66
+ const logger = (0, pino_1.default)({ level: "silent" });
67
+ const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
68
+ const startSocket = () => __awaiter(this, void 0, void 0, function* () {
69
+ var _a;
70
+ const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX));
71
+ const sock = (0, baileys_1.default)({
72
+ version,
73
+ auth: {
74
+ creds: state.creds,
75
+ keys: (0, baileys_1.makeCacheableSignalKeyStore)(state.keys, logger),
76
+ },
77
+ logger,
78
+ markOnlineOnConnect: false,
79
+ browser: baileys_1.Browsers.ubuntu("Chrome"),
80
+ });
81
+ socket.socket = sock;
82
+ this.sockets.set(socket.id, socket);
83
+ try {
84
+ sock.ev.process((events) => __awaiter(this, void 0, void 0, function* () {
85
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
86
+ if (events["connection.update"]) {
87
+ const update = events["connection.update"];
88
+ const { connection, lastDisconnect } = update;
89
+ if (update.qr) {
90
+ (_b = socket.onQr) === null || _b === void 0 ? void 0 : _b.call(socket, update.qr);
91
+ }
92
+ if (connection == "connecting") {
93
+ (_c = socket.onConnecting) === null || _c === void 0 ? void 0 : _c.call(socket);
94
+ }
95
+ if (connection === "close") {
96
+ const code = (_e = (_d = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _d === void 0 ? void 0 : _d.output) === null || _e === void 0 ? void 0 : _e.statusCode;
97
+ let retryAttempt = (_f = this.retryCount.get(socket.id)) !== null && _f !== void 0 ? _f : 0;
98
+ let shouldRetry;
99
+ if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
100
+ shouldRetry = true;
101
+ }
102
+ if (shouldRetry) {
103
+ retryAttempt++;
104
+ }
105
+ if (shouldRetry) {
106
+ this.retryCount.set(socket.id, retryAttempt);
107
+ startSocket();
108
+ }
109
+ else {
110
+ this.retryCount.delete(socket.id);
111
+ this.deleteSession(socket.id);
112
+ (_g = socket.onDisconnected) === null || _g === void 0 ? void 0 : _g.call(socket);
113
+ }
114
+ }
115
+ if (connection == "open") {
116
+ this.retryCount.delete(socket.id);
117
+ (_h = socket.onConnected) === null || _h === void 0 ? void 0 : _h.call(socket);
118
+ }
119
+ }
120
+ if (events["creds.update"]) {
121
+ yield saveCreds();
122
+ }
123
+ if (events["messages.update"]) {
124
+ const msg = events["messages.update"][0];
125
+ const data = Object.assign({ sessionId: socket.id, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
126
+ (_j = socket.onMessageUpdated) === null || _j === void 0 ? void 0 : _j.call(socket, data);
127
+ }
128
+ if (events["messages.upsert"]) {
129
+ const msg = (_k = events["messages.upsert"]
130
+ .messages) === null || _k === void 0 ? void 0 : _k[0];
131
+ msg.sessionId = socket.id;
132
+ msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
133
+ msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
134
+ msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
135
+ (_l = socket.onMessageReceived) === null || _l === void 0 ? void 0 : _l.call(socket, msg);
136
+ }
137
+ }));
138
+ if (!sock.authState.creds.registered) {
139
+ yield new Promise((resolve) => setTimeout(resolve, 5000));
140
+ const code = yield sock.requestPairingCode(socket.phoneNumber);
141
+ console.log(code);
142
+ (_a = socket.onPairing) === null || _a === void 0 ? void 0 : _a.call(socket, code);
143
+ }
144
+ return socket;
145
+ }
146
+ catch (error) {
147
+ console.log(error.message);
148
+ return socket;
149
+ }
150
+ });
151
+ return startSocket();
152
+ });
153
+ this.isSessionExistAndRunning = (socket) => {
154
+ if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
155
+ fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)) &&
156
+ fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)).length &&
157
+ this.getSocket(socket.id)) {
158
+ return true;
159
+ }
160
+ return false;
161
+ };
162
+ this.deleteSession = (sessionId) => __awaiter(this, void 0, void 0, function* () {
163
+ const socket = this.getSocket(sessionId);
164
+ if (!socket)
165
+ return;
166
+ yield socket.logout();
167
+ const dir = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX);
168
+ if (fs_1.default.existsSync(dir)) {
169
+ fs_1.default.rmSync(dir, { force: true, recursive: true });
170
+ }
171
+ });
172
+ }
173
+ load(each) {
174
+ return __awaiter(this, void 0, void 0, function* () {
175
+ if (!fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME))) {
176
+ fs_1.default.mkdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME));
177
+ }
178
+ fs_1.default.readdir(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME), (err, dirs) => __awaiter(this, void 0, void 0, function* () {
179
+ var _a;
180
+ if (err) {
181
+ throw err;
182
+ }
183
+ for (const dir of dirs) {
184
+ const sessionId = dir.split("_")[0];
185
+ const phoneNumber = dir.split("_")[1];
186
+ let socket = new Socket_1.Socket({
187
+ id: sessionId,
188
+ phoneNumber: phoneNumber,
189
+ });
190
+ socket = (_a = each === null || each === void 0 ? void 0 : each(socket)) !== null && _a !== void 0 ? _a : socket;
191
+ if (!this.shouldLoadSession(socket))
192
+ continue;
193
+ this.startSession(socket);
194
+ }
195
+ }));
196
+ });
197
+ }
198
+ }
199
+ exports.Whatsapp = Whatsapp;
200
+ const wa = new Whatsapp();
201
+ // wa.load();
202
+ const mySocket = new Socket_1.Socket({ id: "mysocket", phoneNumber: "6281524538841" });
203
+ mySocket.onPairing = (code) => {
204
+ console.log(code);
205
+ };
206
+ wa.startSession(mySocket);
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@deathnaitsa/wa-api",
3
+ "version": "1.0.0",
4
+ "description": "Multi Session Whatsapp Library",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/DeathNaitsa/wa-api.git"
10
+ },
11
+ "homepage": "https://github.com/DeathNaitsa/wa-api#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/DeathNaitsa/wa-api/issues"
14
+ },
15
+ "files": [
16
+ "dist/**/*"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "start": "tsc && node ./dist/index.js",
21
+ "test": "echo \"Error: no test specified\" && exit 1",
22
+ "run-script": "node ./dist/index.js"
23
+ },
24
+ "author": "DeathNaitsa",
25
+ "license": "ISC",
26
+ "dependencies": {
27
+ "@adiwajshing/keyed-db": "^0.2.4",
28
+ "@hapi/boom": "^10.0.1",
29
+ "@whiskeysockets/baileys": "^6.7.16",
30
+ "mime": "^4.0.7",
31
+ "pino": "^9.6.0",
32
+ "qrcode-terminal": "^0.12.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/mime": "^4.0.0"
36
+ }
37
+ }
package/readme.md ADDED
@@ -0,0 +1,108 @@
1
+ # wa-api
2
+
3
+ Leichte Bibliothek zur Verwaltung mehrerer WhatsApp-Sessions – mit **einer** universellen `sendMessage`-Funktion für **alle** Nachrichtentypen.
4
+
5
+ ## 📦 Installation
6
+
7
+ ```bash
8
+ npm install @DeathNaitsa/wa-api@latest
9
+ ```
10
+
11
+ ## 🔌 Import & Setup
12
+
13
+ Verwende den klassischen Import-Stil:
14
+
15
+ ```js
16
+ // CommonJS
17
+ const wa = require('@DeathNaitsa/wa-api');
18
+
19
+ // ES Module
20
+ import * as wa from '@DeathNaitsa/wa-api';
21
+ ```
22
+
23
+ Danach stehen dir alle Funktionen unter dem Namespace `wa` zur Verfügung.
24
+
25
+ ## 🚀 Session Management
26
+
27
+ ```js
28
+ // Neue Session erzeugen und QR-Code scannen
29
+ const session = await wa.startSession('meineSession');
30
+
31
+ // Alternativ: per Pairing-Code starten
32
+ const paired = await wa.startSessionWithPairingCode('meineSession', { phoneNumber: '491234567890' });
33
+
34
+ // Alle aktiven Sessions abrufen
35
+ const sessions = wa.getAllSession(); // z.B. ['meineSession']
36
+
37
+ // Metadaten einer Session abrufen
38
+ const data = wa.getSession('meineSession');
39
+
40
+ // Vorhandene Sessions aus Ordner automatisch laden
41
+ const loaded = await wa.loadSessionsFromStorage();
42
+ console.log('Geladene Sessions:', loaded);
43
+ ```
44
+
45
+ ## 💬 Nachrichten senden mit `sendMessage`
46
+
47
+ Eine **einzige** Funktion für **Text**, **Media**, **Polls**, **Reaktionen**, **Löschen/Pinning**, **Kontakte**, **Standort**, **Weiterleiten** u.v.m.
48
+
49
+ ```js
50
+ await wa.sendMessage(
51
+ 'meineSession', // sessionId
52
+ '491234567890@c.us', // JID oder Telefonnummer
53
+ content, // AnyMessageContent-Objekt
54
+ options // MiscMessageGenerationOptions (optional)
55
+ );
56
+ ```
57
+
58
+ ### Beispiele für `content` & `options`
59
+
60
+ | Typ | content-Beispiel | optionale Flags | Beschreibung |
61
+ | ------------ | ----------------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------- |
62
+ | **Text** | `{ text: 'Hallo Welt!' }` | `{ quoted, mentions }` | Einfache Textnachricht |
63
+ | **Quote** | `{ text: 'Antwort...' }`, `options: { quoted: msgObj }` | | Text als Antwort (Quote) |
64
+ | **Mention** | `{ text: '@491234567890 Hallo' }`, `options: { mentions: ['491234567890@s.whatsapp.net'] }` | | Erwähnung in Text |
65
+ | **Bild** | `{ image: { url:'./bild.png' }, caption:'Bild', viewOnce:true }` | `viewOnce` | Bild senden; `viewOnce` für Einmaldarstellung |
66
+ | **Video** | `{ video: { url:'./video.mp4' }, caption:'Video', gifPlayback:true }` | `gifPlayback` | Video oder GIF (als MP4) |
67
+ | **Audio** | `{ audio: { url:'./audio.ogg' }, mimetype:'audio/ogg', ptt:true }` | `ptt` | Audio/Sprachnachricht |
68
+ | **Dokument** | `{ document: { url:'./doc.pdf', filename:'D.pdf' } }` | | Datei/Dokument |
69
+ | **Umfrage** | `{ poll: { name:'Umfrage?', values:['A','B'], selectableCount:1, toAnnouncementGroup:false } }` | | Neue Umfrage |
70
+ | **Reaktion** | `{ react: { text:'👍', key:msgObj.key } }` | | Nachricht mit Emoji reagieren |
71
+ | **Löschen** | `{ delete: msgObj.key }` | | Nachricht für alle löschen |
72
+ | **Pinning** | `{ pin: { type:1, time:86400, key:msgObj.key } }` | | Nachricht pinnen (1) oder entpinnen (0) |
73
+ | **Kontakte** | `{ contacts:{ displayName:'Max', contacts:[{ vcard }] } }` | | Kontaktkarte |
74
+ | **Standort** | `{ location:{ degreesLatitude:52.52, degreesLongitude:13.405 } }` | | Standort |
75
+ | **Weiterl.** | `{ forward: msgToForward }` | | Nachricht weiterleiten |
76
+
77
+ > **Hinweis:** Weitere Flags und Optionen (`edit`, `mentions`, `quoted`, etc.) können über das `options`-Objekt übergeben werden.
78
+
79
+ ## 🎧 Listener
80
+
81
+ ```js
82
+ // Eingehende Nachrichten
83
+ wa.onMessageReceived(msg => console.log('Neue Message:', msg));
84
+
85
+ // QR-Code zum Scannen aktualisiert
86
+ wa.onQRUpdated(({ sessionId, qr }) => console.log(`Scan QR (${sessionId}):`, qr));
87
+
88
+ // Session erfolgreich verbunden
89
+ wa.onConnected(sessionId => console.log(`Session online: ${sessionId}`));
90
+ ```
91
+
92
+ ## ⚠️ Fehlerbehandlung
93
+
94
+ Alle Fehler werden als `WhatsappError` geworfen:
95
+
96
+ ```js
97
+ try {
98
+ await wa.sendMessage(...);
99
+ } catch (e) {
100
+ if (e instanceof wa.WhatsappError) {
101
+ console.error('WhatsApp-Fehler:', e.message);
102
+ }
103
+ }
104
+ ```
105
+
106
+ ---
107
+
108
+ © 2025 `@DeathNaitsa/wa-api` • Support: [sebloidl13@gmail.com](mailto:sebloidl13@gmail.com)