chore: finish logger sweep and add retry tests
parent
ca0b50d772
commit
ec630839a9
|
|
@ -309,7 +309,7 @@ export async function getReplyFromConfig(
|
||||||
`Command auto-reply timed out after ${elapsed}ms (limit ${timeoutMs}ms)`,
|
`Command auto-reply timed out after ${elapsed}ms (limit ${timeoutMs}ms)`,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
console.error(`Command auto-reply failed after ${elapsed}ms`, err);
|
logError("Command auto-reply failed after ms: " . String(err), runtime);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import { retryAsync } from "./retry.js";
|
||||||
|
|
||||||
|
describe("retryAsync", () => {
|
||||||
|
it("returns on first success", async () => {
|
||||||
|
const fn = vi.fn().mockResolvedValue("ok");
|
||||||
|
const result = await retryAsync(fn, 3, 10);
|
||||||
|
expect(result).toBe("ok");
|
||||||
|
expect(fn).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("retries then succeeds", async () => {
|
||||||
|
const fn = vi
|
||||||
|
.fn()
|
||||||
|
.mockRejectedValueOnce(new Error("fail1"))
|
||||||
|
.mockResolvedValueOnce("ok");
|
||||||
|
const result = await retryAsync(fn, 3, 1);
|
||||||
|
expect(result).toBe("ok");
|
||||||
|
expect(fn).toHaveBeenCalledTimes(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("propagates after exhausting retries", async () => {
|
||||||
|
const fn = vi.fn().mockRejectedValue(new Error("boom"));
|
||||||
|
await expect(retryAsync(fn, 2, 1)).rejects.toThrow("boom");
|
||||||
|
expect(fn).toHaveBeenCalledTimes(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -75,9 +75,10 @@ describe("provider-web", () => {
|
||||||
expect.objectContaining({ printQRInTerminal: false }),
|
expect.objectContaining({ printQRInTerminal: false }),
|
||||||
);
|
);
|
||||||
const passed = makeWASocket.mock.calls[0][0];
|
const passed = makeWASocket.mock.calls[0][0];
|
||||||
expect((passed as { logger?: { level?: string } }).logger?.level).toBe(
|
const passedLogger = (passed as { logger?: { level?: string; trace?: unknown } })
|
||||||
"silent",
|
.logger;
|
||||||
);
|
expect(passedLogger?.level).toBe("silent");
|
||||||
|
expect(typeof passedLogger?.trace).toBe("function");
|
||||||
const sock = getLastSocket();
|
const sock = getLastSocket();
|
||||||
const saveCreds = (
|
const saveCreds = (
|
||||||
await baileys.useMultiFileAuthState.mock.results[0].value
|
await baileys.useMultiFileAuthState.mock.results[0].value
|
||||||
|
|
|
||||||
|
|
@ -23,18 +23,11 @@ import { logInfo, logWarn } from "./logger.js";
|
||||||
const WA_WEB_AUTH_DIR = path.join(os.homedir(), ".warelay", "credentials");
|
const WA_WEB_AUTH_DIR = path.join(os.homedir(), ".warelay", "credentials");
|
||||||
|
|
||||||
export async function createWaSocket(printQr: boolean, verbose: boolean) {
|
export async function createWaSocket(printQr: boolean, verbose: boolean) {
|
||||||
const logger = verbose
|
const logger = pino({ level: verbose ? "info" : "silent" });
|
||||||
? pino({ level: "info" })
|
// Some Baileys internals call logger.trace even when silent; ensure it's present.
|
||||||
: ({
|
if (typeof (logger as Record<string, unknown>).trace !== "function") {
|
||||||
level: "silent",
|
(logger as unknown as { trace: () => void }).trace = () => {};
|
||||||
child: () => ({}) as pino.Logger,
|
}
|
||||||
trace: () => {},
|
|
||||||
debug: () => {},
|
|
||||||
info: () => {},
|
|
||||||
warn: () => {},
|
|
||||||
error: () => {},
|
|
||||||
fatal: () => {},
|
|
||||||
} satisfies Partial<pino.Logger>) as pino.Logger;
|
|
||||||
await ensureDir(WA_WEB_AUTH_DIR);
|
await ensureDir(WA_WEB_AUTH_DIR);
|
||||||
const { state, saveCreds } = await useMultiFileAuthState(WA_WEB_AUTH_DIR);
|
const { state, saveCreds } = await useMultiFileAuthState(WA_WEB_AUTH_DIR);
|
||||||
const { version } = await fetchLatestBaileysVersion();
|
const { version } = await fetchLatestBaileysVersion();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue