Skip to content

Commit 3c87d6b

Browse files
committed
not yet
1 parent 3398ffb commit 3c87d6b

File tree

5 files changed

+120
-5
lines changed

5 files changed

+120
-5
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"dependencies": {
1818
"@adiwajshing/keyed-db": "^0.2.4",
1919
"@hapi/boom": "^10.0.1",
20-
"@whiskeysockets/baileys": "^6.2.1",
20+
"@whiskeysockets/baileys": "^6.5.0",
2121
"mime": "^3.0.0",
2222
"pino": "^8.11.0",
2323
"qrcode-terminal": "^0.12.0"

pnpm-lock.yaml

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Defaults/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export enum CALLBACK_KEY {
1010
ON_DISCONNECTED = "on-disconnected",
1111
ON_CONNECTING = "on-connecting",
1212
ON_MESSAGE_UPDATED = "on-message-updated",
13+
ON_PAIRING_CODE = "on-pairing-code",
1314
}
1415

1516
export abstract class Messages {

src/Socket/index.ts

+107
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
MessageReceived,
1515
MessageUpdated,
1616
StartSessionParams,
17+
StartSessionWithPairingCodeParams,
1718
} from "../Types";
1819
import { CALLBACK_KEY, CREDENTIALS, Messages } from "../Defaults";
1920
import {
@@ -123,6 +124,106 @@ export const startSession = async (
123124
return startSocket();
124125
};
125126

127+
export const startSessionWithPairingCode = async (
128+
sessionId: string,
129+
options: StartSessionWithPairingCodeParams
130+
): Promise<WASocket> => {
131+
if (isSessionExistAndRunning(sessionId))
132+
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
133+
const logger = pino({ level: "silent" });
134+
135+
const { version } = await fetchLatestBaileysVersion();
136+
const startSocket = async () => {
137+
const { state, saveCreds } = await useMultiFileAuthState(
138+
path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX)
139+
);
140+
const sock: WASocket = makeWASocket({
141+
version,
142+
printQRInTerminal: false,
143+
auth: state,
144+
logger,
145+
markOnlineOnConnect: false,
146+
browser: Browsers.ubuntu("Chrome"),
147+
});
148+
sessions.set(sessionId, { ...sock });
149+
try {
150+
if (!sock.authState.creds.registered) {
151+
console.log("first time pairing");
152+
const code = await sock.requestPairingCode(options.phoneNumber);
153+
console.log(code);
154+
callback.get(CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code);
155+
}
156+
157+
sock.ev.process(async (events) => {
158+
if (events["connection.update"]) {
159+
const update = events["connection.update"];
160+
const { connection, lastDisconnect } = update;
161+
if (update.qr) {
162+
callback.get(CALLBACK_KEY.ON_QR)?.({
163+
sessionId,
164+
qr: update.qr,
165+
});
166+
}
167+
if (connection == "connecting") {
168+
callback.get(CALLBACK_KEY.ON_CONNECTING)?.(sessionId);
169+
}
170+
if (connection === "close") {
171+
const code = (lastDisconnect?.error as Boom)?.output?.statusCode;
172+
let retryAttempt = retryCount.get(sessionId) ?? 0;
173+
let shouldRetry;
174+
if (code != DisconnectReason.loggedOut && retryAttempt < 10) {
175+
shouldRetry = true;
176+
}
177+
if (shouldRetry) {
178+
retryAttempt++;
179+
}
180+
if (shouldRetry) {
181+
retryCount.set(sessionId, retryAttempt);
182+
startSocket();
183+
} else {
184+
retryCount.delete(sessionId);
185+
deleteSession(sessionId);
186+
callback.get(CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId);
187+
}
188+
}
189+
if (connection == "open") {
190+
retryCount.delete(sessionId);
191+
callback.get(CALLBACK_KEY.ON_CONNECTED)?.(sessionId);
192+
}
193+
}
194+
if (events["creds.update"]) {
195+
await saveCreds();
196+
}
197+
if (events["messages.update"]) {
198+
const msg = events["messages.update"][0];
199+
const data: MessageUpdated = {
200+
sessionId: sessionId,
201+
messageStatus: parseMessageStatusCodeToReadable(msg.update.status!),
202+
...msg,
203+
};
204+
callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data);
205+
}
206+
if (events["messages.upsert"]) {
207+
const msg = events["messages.upsert"]
208+
.messages?.[0] as unknown as MessageReceived;
209+
msg.sessionId = sessionId;
210+
msg.saveImage = (path) => saveImageHandler(msg, path);
211+
msg.saveVideo = (path) => saveVideoHandler(msg, path);
212+
msg.saveDocument = (path) => saveDocumentHandler(msg, path);
213+
callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({
214+
...msg,
215+
});
216+
}
217+
});
218+
return sock;
219+
} catch (error) {
220+
// console.log("SOCKET ERROR", error);
221+
return sock;
222+
}
223+
};
224+
return startSocket();
225+
};
226+
126227
/**
127228
* @deprecated Use startSession method instead
128229
*/
@@ -216,3 +317,9 @@ export const onConnecting = (listener: (sessionId: string) => any) => {
216317
export const onMessageUpdate = (listener: (data: MessageUpdated) => any) => {
217318
callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
218319
};
320+
321+
export const onPairingCode = (
322+
listener: (sessionId: string, code: string) => any
323+
) => {
324+
callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
325+
};

src/Types/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ export interface StartSessionParams {
4949
printQR: boolean;
5050
}
5151

52+
export interface StartSessionWithPairingCodeParams {
53+
/**
54+
* Phone Number with Country Code
55+
*/
56+
phoneNumber: string;
57+
}
58+
5259
export type MessageUpdated = WAMessageUpdate & {
5360
sessionId: string;
5461
messageStatus:

0 commit comments

Comments
 (0)