diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index 5fb0ae3..c75ab9a 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -5,7 +5,7 @@ import WebSocket from 'ws' import { proto } from '../../WAProto' import { DEF_CALLBACK_PREFIX, DEF_TAG_PREFIX, DEFAULT_ORIGIN, INITIAL_PREKEY_COUNT, MIN_PREKEY_COUNT } from '../Defaults' import { AuthenticationCreds, BaileysEventEmitter, BaileysEventMap, DisconnectReason, SocketConfig } from '../Types' -import { addTransactionCapability, bindWaitForConnectionUpdate, configureSuccessfulPairing, Curve, generateLoginNode, generateMdTagPrefix, generateRegistrationNode, getErrorCodeFromStreamError, getNextPreKeysNode, makeNoiseHandler, printQRIfNecessaryListener, promiseTimeout } from '../Utils' +import { addTransactionCapability, bindWaitForConnectionUpdate, configureSuccessfulPairing, Curve, generateLoginNode, generateMdTagPrefix, generateRegistrationNode, getCodeFromWSError, getErrorCodeFromStreamError, getNextPreKeysNode, makeNoiseHandler, printQRIfNecessaryListener, promiseTimeout } from '../Utils' import { assertNodeErrorFree, BinaryNode, encodeBinaryNode, getBinaryNodeChild, getBinaryNodeChildren, S_WHATSAPP_NET } from '../WABinary' /** @@ -419,7 +419,12 @@ export const makeSocket = ({ ws.on('message', onMessageRecieved) ws.on('open', validateConnection) - ws.on('error', error => end(new Boom(`WebSocket Error (${error.message})`, { statusCode: 500, data: error }))) + ws.on('error', error => end( + new Boom( + `WebSocket Error (${error.message})`, + { statusCode: getCodeFromWSError(error), data: error } + ) + )) ws.on('close', () => end(new Boom('Connection Terminated', { statusCode: DisconnectReason.connectionClosed }))) // the server terminated the connection ws.on('CB:xmlstreamend', () => end(new Boom('Connection Terminated by Server', { statusCode: DisconnectReason.connectionClosed }))) diff --git a/src/Utils/generics.ts b/src/Utils/generics.ts index 24b651f..00a0233 100644 --- a/src/Utils/generics.ts +++ b/src/Utils/generics.ts @@ -328,4 +328,18 @@ export const getCallStatusFromNode = ({ tag, attrs }: BinaryNode) => { } return status +} + +const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: ' + +export const getCodeFromWSError = (error: Error) => { + let statusCode = 500 + if(error.message.includes(UNEXPECTED_SERVER_CODE_TEXT)) { + const code = +error.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length) + if(!Number.isNaN(code) && code >= 400) { + statusCode = code + } + } + + return statusCode } \ No newline at end of file