Fix web auth detection and auto-restart after 515
This commit is contained in:
@@ -69,17 +69,17 @@ describe("provider-web", () => {
|
|||||||
it("creates WA socket with QR handler", async () => {
|
it("creates WA socket with QR handler", async () => {
|
||||||
await createWaSocket(true, false);
|
await createWaSocket(true, false);
|
||||||
const makeWASocket = baileys.makeWASocket as ReturnType<typeof vi.fn>;
|
const makeWASocket = baileys.makeWASocket as ReturnType<typeof vi.fn>;
|
||||||
expect(makeWASocket).toHaveBeenCalledWith(
|
expect(makeWASocket).toHaveBeenCalledWith(
|
||||||
expect.objectContaining({ printQRInTerminal: false }),
|
expect.objectContaining({ printQRInTerminal: false }),
|
||||||
);
|
);
|
||||||
const sock = getLastSocket();
|
const sock = getLastSocket();
|
||||||
const saveCreds = (
|
const saveCreds = (
|
||||||
await baileys.useMultiFileAuthState.mock.results[0].value
|
await baileys.useMultiFileAuthState.mock.results[0].value
|
||||||
).saveCreds;
|
).saveCreds;
|
||||||
// trigger creds.update listener
|
// trigger creds.update listener
|
||||||
sock.ev.emit("creds.update", {});
|
sock.ev.emit("creds.update", {});
|
||||||
expect(saveCreds).toHaveBeenCalled();
|
expect(saveCreds).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("waits for connection open", async () => {
|
it("waits for connection open", async () => {
|
||||||
const ev = new EventEmitter();
|
const ev = new EventEmitter();
|
||||||
|
|||||||
@@ -14,11 +14,7 @@ import qrcode from "qrcode-terminal";
|
|||||||
import { danger, info, logVerbose, success } from "./globals.js";
|
import { danger, info, logVerbose, success } from "./globals.js";
|
||||||
import { ensureDir, jidToE164, toWhatsappJid } from "./utils.js";
|
import { ensureDir, jidToE164, toWhatsappJid } from "./utils.js";
|
||||||
|
|
||||||
const WA_WEB_AUTH_DIR = path.join(
|
const WA_WEB_AUTH_DIR = path.join(os.homedir(), ".warelay", "credentials");
|
||||||
os.homedir(),
|
|
||||||
".warelay",
|
|
||||||
"credentials",
|
|
||||||
);
|
|
||||||
|
|
||||||
export async function createWaSocket(printQr: boolean, verbose: boolean) {
|
export async function createWaSocket(printQr: boolean, verbose: boolean) {
|
||||||
await ensureDir(WA_WEB_AUTH_DIR);
|
await ensureDir(WA_WEB_AUTH_DIR);
|
||||||
@@ -136,13 +132,29 @@ export async function loginWeb(
|
|||||||
if (code === 515) {
|
if (code === 515) {
|
||||||
console.log(
|
console.log(
|
||||||
info(
|
info(
|
||||||
"WhatsApp asked for a restart after pairing (code 515); creds are saved. You can now send with provider=web.",
|
"WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return;
|
try {
|
||||||
|
sock.ws?.close();
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
const retry = await createWaSocket(false, verbose);
|
||||||
|
try {
|
||||||
|
await waitForConnection(retry);
|
||||||
|
console.log(
|
||||||
|
success(
|
||||||
|
"✅ Linked after restart; web session ready. You can now send with provider=web.",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
setTimeout(() => retry.ws?.close(), 500);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (code === DisconnectReason.loggedOut) {
|
if (code === DisconnectReason.loggedOut) {
|
||||||
await fs.rm(WA_WEB_AUTH_FILE, { force: true });
|
await fs.rm(WA_WEB_AUTH_DIR, { recursive: true, force: true });
|
||||||
console.error(
|
console.error(
|
||||||
danger(
|
danger(
|
||||||
"WhatsApp reported the session is logged out. Cleared cached web session; please rerun warelay web:login and scan the QR again.",
|
"WhatsApp reported the session is logged out. Cleared cached web session; please rerun warelay web:login and scan the QR again.",
|
||||||
@@ -172,7 +184,7 @@ export { WA_WEB_AUTH_DIR };
|
|||||||
|
|
||||||
export function webAuthExists() {
|
export function webAuthExists() {
|
||||||
return fs
|
return fs
|
||||||
.access(WA_WEB_AUTH_FILE)
|
.access(WA_WEB_AUTH_DIR)
|
||||||
.then(() => true)
|
.then(() => true)
|
||||||
.catch(() => false);
|
.catch(() => false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user