@sjawhar/whatsapp-mcp 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.
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/dist/__tests__/connection.test.d.ts +2 -0
- package/dist/__tests__/connection.test.d.ts.map +1 -0
- package/dist/__tests__/connection.test.js +105 -0
- package/dist/__tests__/connection.test.js.map +1 -0
- package/dist/__tests__/disconnect.test.d.ts +2 -0
- package/dist/__tests__/disconnect.test.d.ts.map +1 -0
- package/dist/__tests__/disconnect.test.js +166 -0
- package/dist/__tests__/disconnect.test.js.map +1 -0
- package/dist/__tests__/download-media.test.d.ts +2 -0
- package/dist/__tests__/download-media.test.d.ts.map +1 -0
- package/dist/__tests__/download-media.test.js +110 -0
- package/dist/__tests__/download-media.test.js.map +1 -0
- package/dist/__tests__/failures/connection-failures.test.d.ts +2 -0
- package/dist/__tests__/failures/connection-failures.test.d.ts.map +1 -0
- package/dist/__tests__/failures/connection-failures.test.js +146 -0
- package/dist/__tests__/failures/connection-failures.test.js.map +1 -0
- package/dist/__tests__/failures/edge-cases.test.d.ts +2 -0
- package/dist/__tests__/failures/edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/failures/edge-cases.test.js +121 -0
- package/dist/__tests__/failures/edge-cases.test.js.map +1 -0
- package/dist/__tests__/failures/resource-failures.test.d.ts +2 -0
- package/dist/__tests__/failures/resource-failures.test.d.ts.map +1 -0
- package/dist/__tests__/failures/resource-failures.test.js +136 -0
- package/dist/__tests__/failures/resource-failures.test.js.map +1 -0
- package/dist/__tests__/failures/security-failures.test.d.ts +2 -0
- package/dist/__tests__/failures/security-failures.test.d.ts.map +1 -0
- package/dist/__tests__/failures/security-failures.test.js +0 -0
- package/dist/__tests__/failures/security-failures.test.js.map +1 -0
- package/dist/__tests__/helpers/fake-baileys.d.ts +52 -0
- package/dist/__tests__/helpers/fake-baileys.d.ts.map +1 -0
- package/dist/__tests__/helpers/fake-baileys.js +60 -0
- package/dist/__tests__/helpers/fake-baileys.js.map +1 -0
- package/dist/__tests__/helpers/mcp-test-client.d.ts +9 -0
- package/dist/__tests__/helpers/mcp-test-client.d.ts.map +1 -0
- package/dist/__tests__/helpers/mcp-test-client.js +40 -0
- package/dist/__tests__/helpers/mcp-test-client.js.map +1 -0
- package/dist/__tests__/helpers/test-db.d.ts +4 -0
- package/dist/__tests__/helpers/test-db.d.ts.map +1 -0
- package/dist/__tests__/helpers/test-db.js +32 -0
- package/dist/__tests__/helpers/test-db.js.map +1 -0
- package/dist/__tests__/integration/chat-navigation.test.d.ts +2 -0
- package/dist/__tests__/integration/chat-navigation.test.d.ts.map +1 -0
- package/dist/__tests__/integration/chat-navigation.test.js +171 -0
- package/dist/__tests__/integration/chat-navigation.test.js.map +1 -0
- package/dist/__tests__/integration/contacts-flow.test.d.ts +2 -0
- package/dist/__tests__/integration/contacts-flow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/contacts-flow.test.js +144 -0
- package/dist/__tests__/integration/contacts-flow.test.js.map +1 -0
- package/dist/__tests__/integration/media-flow.test.d.ts +2 -0
- package/dist/__tests__/integration/media-flow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/media-flow.test.js +225 -0
- package/dist/__tests__/integration/media-flow.test.js.map +1 -0
- package/dist/__tests__/integration/search-flow.test.d.ts +2 -0
- package/dist/__tests__/integration/search-flow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/search-flow.test.js +44 -0
- package/dist/__tests__/integration/search-flow.test.js.map +1 -0
- package/dist/__tests__/integration/send-message.test.d.ts +2 -0
- package/dist/__tests__/integration/send-message.test.d.ts.map +1 -0
- package/dist/__tests__/integration/send-message.test.js +160 -0
- package/dist/__tests__/integration/send-message.test.js.map +1 -0
- package/dist/__tests__/lock-file.test.d.ts +2 -0
- package/dist/__tests__/lock-file.test.d.ts.map +1 -0
- package/dist/__tests__/lock-file.test.js +63 -0
- package/dist/__tests__/lock-file.test.js.map +1 -0
- package/dist/__tests__/medium-fixes.test.d.ts +2 -0
- package/dist/__tests__/medium-fixes.test.d.ts.map +1 -0
- package/dist/__tests__/medium-fixes.test.js +141 -0
- package/dist/__tests__/medium-fixes.test.js.map +1 -0
- package/dist/__tests__/rate-limit.test.d.ts +2 -0
- package/dist/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit.test.js +193 -0
- package/dist/__tests__/rate-limit.test.js.map +1 -0
- package/dist/__tests__/send-file.test.d.ts +2 -0
- package/dist/__tests__/send-file.test.d.ts.map +1 -0
- package/dist/__tests__/send-file.test.js +237 -0
- package/dist/__tests__/send-file.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +2 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +28 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/transcribe.test.d.ts +2 -0
- package/dist/__tests__/transcribe.test.d.ts.map +1 -0
- package/dist/__tests__/transcribe.test.js +71 -0
- package/dist/__tests__/transcribe.test.js.map +1 -0
- package/dist/__tests__/zombie.test.d.ts +2 -0
- package/dist/__tests__/zombie.test.d.ts.map +1 -0
- package/dist/__tests__/zombie.test.js +145 -0
- package/dist/__tests__/zombie.test.js.map +1 -0
- package/dist/db.d.ts +53 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +509 -0
- package/dist/db.js.map +1 -0
- package/dist/import-contacts.d.ts +37 -0
- package/dist/import-contacts.d.ts.map +1 -0
- package/dist/import-contacts.js +242 -0
- package/dist/import-contacts.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/lock.d.ts +16 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +65 -0
- package/dist/lock.js.map +1 -0
- package/dist/tools.d.ts +6 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +339 -0
- package/dist/tools.js.map +1 -0
- package/dist/transcribe.d.ts +8 -0
- package/dist/transcribe.d.ts.map +1 -0
- package/dist/transcribe.js +63 -0
- package/dist/transcribe.js.map +1 -0
- package/dist/utils.d.ts +51 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +156 -0
- package/dist/utils.js.map +1 -0
- package/dist/whatsapp.d.ts +50 -0
- package/dist/whatsapp.d.ts.map +1 -0
- package/dist/whatsapp.js +896 -0
- package/dist/whatsapp.js.map +1 -0
- package/package.json +52 -0
- package/patches/@whiskeysockets+baileys+6.7.21.patch +46 -0
- package/patches/libsignal+2.0.1.patch +84 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { closeTestDb, seedTestDb, setupTestDb } from "./helpers/test-db.js";
|
|
3
|
+
import { createMcpTestClient } from "./helpers/mcp-test-client.js";
|
|
4
|
+
describe("MCP smoke test", () => {
|
|
5
|
+
let client;
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
await setupTestDb();
|
|
8
|
+
seedTestDb();
|
|
9
|
+
client = await createMcpTestClient();
|
|
10
|
+
});
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
await client?.close();
|
|
13
|
+
closeTestDb();
|
|
14
|
+
});
|
|
15
|
+
it("connects MCP client, exposes 15 tools, and returns seeded chats", async () => {
|
|
16
|
+
const tools = await client.listTools();
|
|
17
|
+
expect(tools).toHaveLength(15);
|
|
18
|
+
const listChats = await client.callTool("list_chats", { limit: 20 });
|
|
19
|
+
expect(Array.isArray(listChats)).toBe(true);
|
|
20
|
+
expect(listChats).toEqual(expect.arrayContaining([
|
|
21
|
+
expect.objectContaining({
|
|
22
|
+
jid: "15550001111@s.whatsapp.net",
|
|
23
|
+
name: "Alice Test",
|
|
24
|
+
}),
|
|
25
|
+
]));
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=smoke.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAsB,MAAM,8BAA8B,CAAC;AAEvF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAqB,CAAC;IAE1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,WAAW,EAAE,CAAC;QACpB,UAAU,EAAE,CAAC;QACb,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;QACtB,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CACvB,MAAM,CAAC,eAAe,CAAC;YACrB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,GAAG,EAAE,4BAA4B;gBACjC,IAAI,EAAE,YAAY;aACnB,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/transcribe.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateApiUrl } from "../utils.js";
|
|
3
|
+
describe("validateApiUrl", () => {
|
|
4
|
+
// --- Valid URLs ---
|
|
5
|
+
it("accepts https Groq API URL", () => {
|
|
6
|
+
const result = validateApiUrl("https://api.groq.com/openai/v1/audio/transcriptions");
|
|
7
|
+
expect(result).toBeInstanceOf(URL);
|
|
8
|
+
expect(result.href).toBe("https://api.groq.com/openai/v1/audio/transcriptions");
|
|
9
|
+
});
|
|
10
|
+
it("accepts https OpenAI API URL", () => {
|
|
11
|
+
const result = validateApiUrl("https://api.openai.com/v1/audio/transcriptions");
|
|
12
|
+
expect(result).toBeInstanceOf(URL);
|
|
13
|
+
});
|
|
14
|
+
it("accepts http URL to public host", () => {
|
|
15
|
+
const result = validateApiUrl("http://api.example.com/v1/transcribe");
|
|
16
|
+
expect(result).toBeInstanceOf(URL);
|
|
17
|
+
expect(result.protocol).toBe("http:");
|
|
18
|
+
});
|
|
19
|
+
// --- Protocol rejection ---
|
|
20
|
+
it("rejects file:// protocol", () => {
|
|
21
|
+
expect(() => validateApiUrl("file:///etc/passwd")).toThrow("Only http/https URLs allowed");
|
|
22
|
+
});
|
|
23
|
+
it("rejects ftp:// protocol", () => {
|
|
24
|
+
expect(() => validateApiUrl("ftp://evil.com/file")).toThrow("Only http/https URLs allowed");
|
|
25
|
+
});
|
|
26
|
+
it("rejects javascript: protocol", () => {
|
|
27
|
+
expect(() => validateApiUrl("javascript:alert(1)")).toThrow();
|
|
28
|
+
});
|
|
29
|
+
// --- Localhost rejection ---
|
|
30
|
+
it("rejects localhost hostname", () => {
|
|
31
|
+
expect(() => validateApiUrl("http://localhost:8080/")).toThrow("localhost not allowed");
|
|
32
|
+
});
|
|
33
|
+
it("rejects 127.0.0.1", () => {
|
|
34
|
+
expect(() => validateApiUrl("http://127.0.0.1:8080/")).toThrow("localhost not allowed");
|
|
35
|
+
});
|
|
36
|
+
it("rejects ::1 (IPv6 loopback)", () => {
|
|
37
|
+
expect(() => validateApiUrl("http://[::1]:8080/")).toThrow("localhost not allowed");
|
|
38
|
+
});
|
|
39
|
+
// --- Private IP rejection ---
|
|
40
|
+
it("rejects 10.x.x.x (class A private)", () => {
|
|
41
|
+
expect(() => validateApiUrl("http://10.0.0.1/")).toThrow("Private/internal IP");
|
|
42
|
+
});
|
|
43
|
+
it("rejects 172.16.x.x (class B private)", () => {
|
|
44
|
+
expect(() => validateApiUrl("http://172.16.0.1/")).toThrow("Private/internal IP");
|
|
45
|
+
});
|
|
46
|
+
it("rejects 172.31.255.255 (class B private upper bound)", () => {
|
|
47
|
+
expect(() => validateApiUrl("http://172.31.255.255/")).toThrow("Private/internal IP");
|
|
48
|
+
});
|
|
49
|
+
it("accepts 172.15.0.1 (not in private range)", () => {
|
|
50
|
+
const result = validateApiUrl("http://172.15.0.1/");
|
|
51
|
+
expect(result).toBeInstanceOf(URL);
|
|
52
|
+
});
|
|
53
|
+
it("accepts 172.32.0.1 (not in private range)", () => {
|
|
54
|
+
const result = validateApiUrl("http://172.32.0.1/");
|
|
55
|
+
expect(result).toBeInstanceOf(URL);
|
|
56
|
+
});
|
|
57
|
+
it("rejects 192.168.x.x (class C private)", () => {
|
|
58
|
+
expect(() => validateApiUrl("http://192.168.1.1/")).toThrow("Private/internal IP");
|
|
59
|
+
});
|
|
60
|
+
it("rejects 169.254.169.254 (cloud metadata / link-local)", () => {
|
|
61
|
+
expect(() => validateApiUrl("http://169.254.169.254/")).toThrow("Private/internal IP");
|
|
62
|
+
});
|
|
63
|
+
// --- Invalid URLs ---
|
|
64
|
+
it("rejects completely invalid URL", () => {
|
|
65
|
+
expect(() => validateApiUrl("not-a-url")).toThrow();
|
|
66
|
+
});
|
|
67
|
+
it("rejects empty string", () => {
|
|
68
|
+
expect(() => validateApiUrl("")).toThrow();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=transcribe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.test.js","sourceRoot":"","sources":["../../src/__tests__/transcribe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zombie.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/zombie.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createFakeBaileysSocket } from "./helpers/fake-baileys.js";
|
|
3
|
+
import { closeTestDb, seedTestDb, setupTestDb } from "./helpers/test-db.js";
|
|
4
|
+
const mockState = vi.hoisted(() => ({
|
|
5
|
+
sockets: [],
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("@whiskeysockets/baileys", () => ({
|
|
8
|
+
default: vi.fn(() => {
|
|
9
|
+
const socket = createFakeBaileysSocket();
|
|
10
|
+
mockState.sockets.push(socket);
|
|
11
|
+
return socket;
|
|
12
|
+
}),
|
|
13
|
+
DisconnectReason: {
|
|
14
|
+
loggedOut: 401,
|
|
15
|
+
connectionClosed: 428,
|
|
16
|
+
connectionReplaced: 440,
|
|
17
|
+
badSession: 500,
|
|
18
|
+
unavailableService: 503,
|
|
19
|
+
restartRequired: 515,
|
|
20
|
+
connectionLost: 408,
|
|
21
|
+
forbidden: 403,
|
|
22
|
+
multideviceMismatch: 411,
|
|
23
|
+
},
|
|
24
|
+
fetchLatestBaileysVersion: vi.fn(async () => ({ version: [2, 3000, 0] })),
|
|
25
|
+
downloadMediaMessage: vi.fn(),
|
|
26
|
+
getContentType: vi.fn(),
|
|
27
|
+
initAuthCreds: vi.fn(() => ({})),
|
|
28
|
+
BufferJSON: {
|
|
29
|
+
replacer: (_key, value) => value,
|
|
30
|
+
reviver: (_key, value) => value,
|
|
31
|
+
},
|
|
32
|
+
proto: {
|
|
33
|
+
Message: {
|
|
34
|
+
AppStateSyncKeyData: {
|
|
35
|
+
fromObject: (value) => value,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
}));
|
|
40
|
+
function latestSocket() {
|
|
41
|
+
const socket = mockState.sockets.at(-1);
|
|
42
|
+
if (!socket)
|
|
43
|
+
throw new Error("No fake socket was created");
|
|
44
|
+
return socket;
|
|
45
|
+
}
|
|
46
|
+
describe("zombie watchdog + send health check", () => {
|
|
47
|
+
const originalZombieTimeout = process.env.ZOMBIE_TIMEOUT_MS;
|
|
48
|
+
const originalMaxSendFailures = process.env.MAX_SEND_FAILURES;
|
|
49
|
+
beforeEach(async () => {
|
|
50
|
+
vi.resetModules();
|
|
51
|
+
vi.useFakeTimers();
|
|
52
|
+
mockState.sockets.length = 0;
|
|
53
|
+
process.env.ZOMBIE_TIMEOUT_MS = "120000";
|
|
54
|
+
process.env.MAX_SEND_FAILURES = "3";
|
|
55
|
+
process.env.MIN_SEND_INTERVAL_MS = "0";
|
|
56
|
+
process.env.SEND_JITTER_MS = "0";
|
|
57
|
+
await setupTestDb();
|
|
58
|
+
seedTestDb();
|
|
59
|
+
});
|
|
60
|
+
afterEach(async () => {
|
|
61
|
+
const whatsapp = await import("../whatsapp.js");
|
|
62
|
+
await whatsapp.closeWhatsApp();
|
|
63
|
+
closeTestDb();
|
|
64
|
+
vi.useRealTimers();
|
|
65
|
+
if (originalZombieTimeout === undefined) {
|
|
66
|
+
delete process.env.ZOMBIE_TIMEOUT_MS;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
process.env.ZOMBIE_TIMEOUT_MS = originalZombieTimeout;
|
|
70
|
+
}
|
|
71
|
+
if (originalMaxSendFailures === undefined) {
|
|
72
|
+
delete process.env.MAX_SEND_FAILURES;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
process.env.MAX_SEND_FAILURES = originalMaxSendFailures;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
it("forces socket end after 2 minutes without connection.update activity", async () => {
|
|
79
|
+
const whatsapp = await import("../whatsapp.js");
|
|
80
|
+
await whatsapp.initWhatsApp();
|
|
81
|
+
const socket = latestSocket();
|
|
82
|
+
socket.emitConnectionOpen();
|
|
83
|
+
const endSpy = vi.spyOn(socket, "end");
|
|
84
|
+
vi.advanceTimersByTime(121_000);
|
|
85
|
+
expect(endSpy).toHaveBeenCalled();
|
|
86
|
+
const firstEndArg = endSpy.mock.calls.at(0)?.[0];
|
|
87
|
+
expect(firstEndArg).toBeInstanceOf(Error);
|
|
88
|
+
if (firstEndArg instanceof Error) {
|
|
89
|
+
expect(firstEndArg.message).toContain("Zombie connection detected");
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
it("clears zombie watchdog timer when socket disconnects", async () => {
|
|
93
|
+
const whatsapp = await import("../whatsapp.js");
|
|
94
|
+
await whatsapp.initWhatsApp();
|
|
95
|
+
const socket = latestSocket();
|
|
96
|
+
socket.emitConnectionOpen();
|
|
97
|
+
const timersAfterOpen = vi.getTimerCount();
|
|
98
|
+
expect(timersAfterOpen).toBeGreaterThanOrEqual(1); // at least zombie watchdog
|
|
99
|
+
socket.emitConnectionClose(428);
|
|
100
|
+
// Zombie watchdog cleared (-1), reconnect setTimeout added (+1) → net 0 change
|
|
101
|
+
expect(vi.getTimerCount()).toBe(timersAfterOpen);
|
|
102
|
+
});
|
|
103
|
+
it("forces reconnect after 3 consecutive send failures", async () => {
|
|
104
|
+
const whatsapp = await import("../whatsapp.js");
|
|
105
|
+
await whatsapp.initWhatsApp();
|
|
106
|
+
const socket = latestSocket();
|
|
107
|
+
socket.emitConnectionOpen();
|
|
108
|
+
const endSpy = vi.spyOn(socket, "end");
|
|
109
|
+
const sendSpy = vi.spyOn(socket, "sendMessage").mockRejectedValue(new Error("send failed"));
|
|
110
|
+
await expect(whatsapp.sendTextMessage("15550001111", "one")).rejects.toThrow("send failed");
|
|
111
|
+
await expect(whatsapp.sendTextMessage("15550001111", "two")).rejects.toThrow("send failed");
|
|
112
|
+
await expect(whatsapp.sendTextMessage("15550001111", "three")).rejects.toThrow("send failed");
|
|
113
|
+
expect(sendSpy).toHaveBeenCalledTimes(3);
|
|
114
|
+
expect(endSpy).toHaveBeenCalled();
|
|
115
|
+
const firstEndArg = endSpy.mock.calls.at(0)?.[0];
|
|
116
|
+
expect(firstEndArg).toBeInstanceOf(Error);
|
|
117
|
+
if (firstEndArg instanceof Error) {
|
|
118
|
+
expect(firstEndArg.message).toContain("Send health check failed");
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
it("resets consecutive send failures to zero after a successful send", async () => {
|
|
122
|
+
const whatsapp = await import("../whatsapp.js");
|
|
123
|
+
await whatsapp.initWhatsApp();
|
|
124
|
+
const socket = latestSocket();
|
|
125
|
+
socket.emitConnectionOpen();
|
|
126
|
+
const endSpy = vi.spyOn(socket, "end");
|
|
127
|
+
const sendSpy = vi.spyOn(socket, "sendMessage");
|
|
128
|
+
sendSpy
|
|
129
|
+
.mockRejectedValueOnce(new Error("fail-1"))
|
|
130
|
+
.mockRejectedValueOnce(new Error("fail-2"))
|
|
131
|
+
.mockResolvedValueOnce({ key: { id: "ok" } })
|
|
132
|
+
.mockRejectedValueOnce(new Error("fail-3"))
|
|
133
|
+
.mockRejectedValueOnce(new Error("fail-4"))
|
|
134
|
+
.mockRejectedValueOnce(new Error("fail-5"));
|
|
135
|
+
await expect(whatsapp.sendTextMessage("15550001111", "a")).rejects.toThrow("fail-1");
|
|
136
|
+
await expect(whatsapp.sendTextMessage("15550001111", "b")).rejects.toThrow("fail-2");
|
|
137
|
+
await expect(whatsapp.sendTextMessage("15550001111", "c")).resolves.toMatchObject({ success: true });
|
|
138
|
+
await expect(whatsapp.sendTextMessage("15550001111", "d")).rejects.toThrow("fail-3");
|
|
139
|
+
await expect(whatsapp.sendTextMessage("15550001111", "e")).rejects.toThrow("fail-4");
|
|
140
|
+
expect(endSpy).not.toHaveBeenCalled();
|
|
141
|
+
await expect(whatsapp.sendTextMessage("15550001111", "f")).rejects.toThrow("fail-5");
|
|
142
|
+
expect(endSpy).toHaveBeenCalledTimes(1);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=zombie.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zombie.test.js","sourceRoot":"","sources":["../../src/__tests__/zombie.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAA0B,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,EAAyB;CACnC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;QACzC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,gBAAgB,EAAE;QAChB,SAAS,EAAE,GAAG;QACd,gBAAgB,EAAE,GAAG;QACrB,kBAAkB,EAAE,GAAG;QACvB,UAAU,EAAE,GAAG;QACf,kBAAkB,EAAE,GAAG;QACvB,eAAe,EAAE,GAAG;QACpB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,GAAG;QACd,mBAAmB,EAAE,GAAG;KACzB;IACD,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC7B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,UAAU,EAAE;QACV,QAAQ,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAAC,KAAK;QACjD,OAAO,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAAC,KAAK;KACjD;IACD,KAAK,EAAE;QACL,OAAO,EAAE;YACP,mBAAmB,EAAE;gBACnB,UAAU,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK;aACtC;SACF;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC5D,MAAM,uBAAuB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE9D,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;QAEjC,MAAM,WAAW,EAAE,CAAC;QACpB,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC/B,WAAW,EAAE,CAAC;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,qBAAqB,CAAC;QACxD,CAAC;QAED,IAAI,uBAAuB,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,uBAAuB,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEvC,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEhC,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAClC,MAAM,WAAW,GAAI,MAAM,CAAC,IAAI,CAAC,KAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,WAAW,YAAY,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAE5B,MAAM,eAAe,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,CAAC,eAAe,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAE9E,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAEhC,+EAA+E;QAC/E,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAE5F,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5F,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5F,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAE9F,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAClC,MAAM,WAAW,GAAI,MAAM,CAAC,IAAI,CAAC,KAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,WAAW,YAAY,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAChD,OAAO;aACJ,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC1C,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC1C,qBAAqB,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;aAC5C,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC1C,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC1C,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrF,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrF,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrF,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErF,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import type { WAMessage } from "@whiskeysockets/baileys";
|
|
3
|
+
export declare function upsertChat(jid: string, name?: string | null, conversationTs?: number | null, unreadCount?: number | null): void;
|
|
4
|
+
export declare function upsertContact(jid: string, name?: string | null, notify?: string | null): void;
|
|
5
|
+
export declare function upsertMessage(chatJid: string, msg: WAMessage): void;
|
|
6
|
+
export declare function upsertChats(chats: Array<{
|
|
7
|
+
id: string;
|
|
8
|
+
name?: string | null;
|
|
9
|
+
conversationTimestamp?: any;
|
|
10
|
+
unreadCount?: number | null;
|
|
11
|
+
}>): void;
|
|
12
|
+
export declare function upsertContacts(contacts: Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
name?: string | null;
|
|
15
|
+
notify?: string | null;
|
|
16
|
+
}>): void;
|
|
17
|
+
export declare function upsertMessages(chatJid: string, msgs: WAMessage[]): void;
|
|
18
|
+
export declare function deleteChat(jid: string): void;
|
|
19
|
+
export declare function deleteMessage(chatJid: string, messageId: string): boolean;
|
|
20
|
+
export declare function saveJidMapping(lidJid: string, phoneJid: string): void;
|
|
21
|
+
export declare function getPhoneJid(lidJid: string): string | null;
|
|
22
|
+
export declare function getLidJid(phoneJid: string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Return all known JIDs for a contact — the input JID plus any mapped counterpart.
|
|
25
|
+
* If a phone JID is given, also returns the LID JID (and vice versa).
|
|
26
|
+
*/
|
|
27
|
+
export declare function getAllJidsFor(jid: string): string[];
|
|
28
|
+
export declare function getMessageFromMe(chatJid: string, messageId: string): boolean | null;
|
|
29
|
+
export declare function resolveDisplayName(jid: string): string;
|
|
30
|
+
export declare function getChats(nameFilter?: string, limit?: number): Record<string, unknown>[];
|
|
31
|
+
export declare function getChat(jid: string): Record<string, unknown>;
|
|
32
|
+
export declare function getMessages(jid: string, limit?: number): Record<string, unknown>[];
|
|
33
|
+
export declare function searchMessages(query: string, jid?: string): Record<string, unknown>[];
|
|
34
|
+
export declare function searchContacts(query: string): Record<string, unknown>[];
|
|
35
|
+
export declare function getMessageContext(jid: string, messageId: string, count?: number): Record<string, unknown>;
|
|
36
|
+
export declare function getMessageBlob(jid: string, messageId: string): string | null;
|
|
37
|
+
export declare function getMessageTypeById(chatJid: string, messageId: string): string | null;
|
|
38
|
+
export declare function getTranscription(chatJid: string, messageId: string): string | null;
|
|
39
|
+
export declare function saveTranscription(chatJid: string, messageId: string, transcription: string): void;
|
|
40
|
+
export declare function getLastMessageKey(jid: string): {
|
|
41
|
+
id: string;
|
|
42
|
+
fromMe: boolean;
|
|
43
|
+
remoteJid: string;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
} | null;
|
|
46
|
+
export declare function deleteChatMessages(jid: string): void;
|
|
47
|
+
export declare function getChatName(jid: string): string | null;
|
|
48
|
+
export declare function getContactName(jid: string): string | null;
|
|
49
|
+
/** Return the raw better-sqlite3 instance (for use by import-contacts). */
|
|
50
|
+
export declare function getDb(): Database.Database;
|
|
51
|
+
export declare function initDb(): void;
|
|
52
|
+
export declare function closeDb(): void;
|
|
53
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|