@@ -14,6 +14,7 @@ import type {
14
14
MessageReceived ,
15
15
MessageUpdated ,
16
16
StartSessionParams ,
17
+ StartSessionWithPairingCodeParams ,
17
18
} from "../Types" ;
18
19
import { CALLBACK_KEY , CREDENTIALS , Messages } from "../Defaults" ;
19
20
import {
@@ -123,6 +124,106 @@ export const startSession = async (
123
124
return startSocket ( ) ;
124
125
} ;
125
126
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
+
126
227
/**
127
228
* @deprecated Use startSession method instead
128
229
*/
@@ -216,3 +317,9 @@ export const onConnecting = (listener: (sessionId: string) => any) => {
216
317
export const onMessageUpdate = ( listener : ( data : MessageUpdated ) => any ) => {
217
318
callback . set ( CALLBACK_KEY . ON_MESSAGE_UPDATED , listener ) ;
218
319
} ;
320
+
321
+ export const onPairingCode = (
322
+ listener : ( sessionId : string , code : string ) => any
323
+ ) => {
324
+ callback . set ( CALLBACK_KEY . ON_MESSAGE_UPDATED , listener ) ;
325
+ } ;
0 commit comments