Spaces:
Paused
Paused
| import makeWASocket, { | |
| DisconnectReason, | |
| useMultiFileAuthState | |
| } from "@whiskeysockets/baileys"; | |
| import { Boom } from "@hapi/boom"; | |
| import * as fs from "fs"; | |
| import { connectDB } from "./db"; | |
| import { useMongoDBAuthState } from "mongo-baileys"; | |
| async function connectToWhatsApp(onStart?: () => void) { | |
| const { state, saveCreds } = process.env.MONGO_URL | |
| ? await useMongoDBAuthState((await connectDB()).collection as any) | |
| : await useMultiFileAuthState("auth_info_baileys"); | |
| const sock = makeWASocket({ | |
| // can provide additional config here | |
| printQRInTerminal: true, | |
| mobile: false, | |
| keepAliveIntervalMs: 10000, | |
| syncFullHistory: false, | |
| markOnlineOnConnect: true, | |
| defaultQueryTimeoutMs: undefined, | |
| auth: state | |
| }); | |
| sock.ev.on("creds.update", saveCreds); | |
| const setupAuth = new Promise(async (resolve, rej) => { | |
| sock.ev.on("connection.update", (update) => { | |
| const { connection, lastDisconnect, qr } = update; | |
| global.waQrCode = qr || null; | |
| try { | |
| if (connection === "close" && lastDisconnect) { | |
| const statusCode = (lastDisconnect.error as Boom)?.output?.statusCode; | |
| const shouldReconnect = | |
| (lastDisconnect.error as Boom)?.output?.statusCode !== | |
| DisconnectReason.loggedOut; | |
| console.log( | |
| "connection closed due to ", | |
| lastDisconnect.error, | |
| ", status code: ", | |
| statusCode, | |
| ", reconnecting ", | |
| shouldReconnect | |
| ); | |
| // reconnect if not logged out | |
| if (shouldReconnect) { | |
| connectToWhatsApp(); | |
| } else { | |
| // clear credentials | |
| if (lastDisconnect.error) { | |
| if (fs.existsSync("./auth_info_baileys")) { | |
| fs.rmSync("./auth_info_baileys", { | |
| force: true, | |
| recursive: true | |
| }); | |
| } | |
| } | |
| } | |
| } else if (connection === "open") { | |
| console.log("\n ✔ opened connection \n"); | |
| resolve(null); | |
| } | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| }); | |
| }); | |
| const FIVE_MIN_IN_MS = 1000 * 60 * 5; | |
| await Promise.race([ | |
| setupAuth, | |
| new Promise((_, rej) => | |
| setTimeout( | |
| () => rej("Timeout while setting up connection to whatsapp"), | |
| FIVE_MIN_IN_MS | |
| ) | |
| ) | |
| ]); | |
| global.waSock = sock; | |
| } | |
| // run in main file | |
| export { connectToWhatsApp }; | |