mirror of
https://github.com/FranP-code/Baileys.git
synced 2025-10-13 00:32:22 +00:00
chore: format everything
This commit is contained in:
@@ -4,26 +4,34 @@ import { createHash, randomBytes } from 'crypto'
|
||||
import { platform, release } from 'os'
|
||||
import { proto } from '../../WAProto'
|
||||
import { version as baileysVersion } from '../Defaults/baileys-version.json'
|
||||
import { BaileysEventEmitter, BaileysEventMap, BrowsersMap, ConnectionState, DisconnectReason, WACallUpdateType, WAVersion } from '../Types'
|
||||
import {
|
||||
BaileysEventEmitter,
|
||||
BaileysEventMap,
|
||||
BrowsersMap,
|
||||
ConnectionState,
|
||||
DisconnectReason,
|
||||
WACallUpdateType,
|
||||
WAVersion
|
||||
} from '../Types'
|
||||
import { BinaryNode, getAllBinaryNodeChildren, jidDecode } from '../WABinary'
|
||||
|
||||
const PLATFORM_MAP = {
|
||||
'aix': 'AIX',
|
||||
'darwin': 'Mac OS',
|
||||
'win32': 'Windows',
|
||||
'android': 'Android',
|
||||
'freebsd': 'FreeBSD',
|
||||
'openbsd': 'OpenBSD',
|
||||
'sunos': 'Solaris'
|
||||
aix: 'AIX',
|
||||
darwin: 'Mac OS',
|
||||
win32: 'Windows',
|
||||
android: 'Android',
|
||||
freebsd: 'FreeBSD',
|
||||
openbsd: 'OpenBSD',
|
||||
sunos: 'Solaris'
|
||||
}
|
||||
|
||||
export const Browsers: BrowsersMap = {
|
||||
ubuntu: (browser) => ['Ubuntu', browser, '22.04.4'],
|
||||
macOS: (browser) => ['Mac OS', browser, '14.4.1'],
|
||||
baileys: (browser) => ['Baileys', browser, '6.5.0'],
|
||||
windows: (browser) => ['Windows', browser, '10.0.22631'],
|
||||
ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
|
||||
macOS: browser => ['Mac OS', browser, '14.4.1'],
|
||||
baileys: browser => ['Baileys', browser, '6.5.0'],
|
||||
windows: browser => ['Windows', browser, '10.0.22631'],
|
||||
/** The appropriate browser based on your OS & release */
|
||||
appropriate: (browser) => [ PLATFORM_MAP[platform()] || 'Ubuntu', browser, release() ]
|
||||
appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', browser, release()]
|
||||
}
|
||||
|
||||
export const getPlatformId = (browser: string) => {
|
||||
@@ -34,7 +42,7 @@ export const getPlatformId = (browser: string) => {
|
||||
export const BufferJSON = {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
replacer: (k, value: any) => {
|
||||
if(Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {
|
||||
if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {
|
||||
return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') }
|
||||
}
|
||||
|
||||
@@ -43,7 +51,7 @@ export const BufferJSON = {
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
reviver: (_, value: any) => {
|
||||
if(typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
|
||||
if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
|
||||
const val = value.data || value.value
|
||||
return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || [])
|
||||
}
|
||||
@@ -52,17 +60,13 @@ export const BufferJSON = {
|
||||
}
|
||||
}
|
||||
|
||||
export const getKeyAuthor = (
|
||||
key: proto.IMessageKey | undefined | null,
|
||||
meId = 'me'
|
||||
) => (
|
||||
export const getKeyAuthor = (key: proto.IMessageKey | undefined | null, meId = 'me') =>
|
||||
(key?.fromMe ? meId : key?.participant || key?.remoteJid) || ''
|
||||
)
|
||||
|
||||
export const writeRandomPadMax16 = (msg: Uint8Array) => {
|
||||
const pad = randomBytes(1)
|
||||
pad[0] &= 0xf
|
||||
if(!pad[0]) {
|
||||
if (!pad[0]) {
|
||||
pad[0] = 0xf
|
||||
}
|
||||
|
||||
@@ -71,23 +75,19 @@ export const writeRandomPadMax16 = (msg: Uint8Array) => {
|
||||
|
||||
export const unpadRandomMax16 = (e: Uint8Array | Buffer) => {
|
||||
const t = new Uint8Array(e)
|
||||
if(0 === t.length) {
|
||||
if (0 === t.length) {
|
||||
throw new Error('unpadPkcs7 given empty bytes')
|
||||
}
|
||||
|
||||
var r = t[t.length - 1]
|
||||
if(r > t.length) {
|
||||
if (r > t.length) {
|
||||
throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
|
||||
}
|
||||
|
||||
return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
|
||||
}
|
||||
|
||||
export const encodeWAMessage = (message: proto.IMessage) => (
|
||||
writeRandomPadMax16(
|
||||
proto.Message.encode(message).finish()
|
||||
)
|
||||
)
|
||||
export const encodeWAMessage = (message: proto.IMessage) => writeRandomPadMax16(proto.Message.encode(message).finish())
|
||||
|
||||
export const generateRegistrationId = (): number => {
|
||||
return Uint16Array.from(randomBytes(2))[0] & 16383
|
||||
@@ -96,7 +96,7 @@ export const generateRegistrationId = (): number => {
|
||||
export const encodeBigEndian = (e: number, t = 4) => {
|
||||
let r = e
|
||||
const a = new Uint8Array(t)
|
||||
for(let i = t - 1; i >= 0; i--) {
|
||||
for (let i = t - 1; i >= 0; i--) {
|
||||
a[i] = 255 & r
|
||||
r >>>= 8
|
||||
}
|
||||
@@ -104,7 +104,8 @@ export const encodeBigEndian = (e: number, t = 4) => {
|
||||
return a
|
||||
}
|
||||
|
||||
export const toNumber = (t: Long | number | null | undefined): number => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : (t as Long).low) : t || 0)
|
||||
export const toNumber = (t: Long | number | null | undefined): number =>
|
||||
typeof t === 'object' && t ? ('toNumber' in t ? t.toNumber() : (t as Long).low) : t || 0
|
||||
|
||||
/** unix timestamp of a date in seconds */
|
||||
export const unixTimestampSeconds = (date: Date = new Date()) => Math.floor(date.getTime() / 1000)
|
||||
@@ -124,12 +125,12 @@ export const debouncedTimeout = (intervalMs = 1000, task?: () => void) => {
|
||||
timeout && clearTimeout(timeout)
|
||||
timeout = undefined
|
||||
},
|
||||
setTask: (newTask: () => void) => task = newTask,
|
||||
setInterval: (newInterval: number) => intervalMs = newInterval
|
||||
setTask: (newTask: () => void) => (task = newTask),
|
||||
setInterval: (newInterval: number) => (intervalMs = newInterval)
|
||||
}
|
||||
}
|
||||
|
||||
export const delay = (ms: number) => delayCancellable (ms).delay
|
||||
export const delay = (ms: number) => delayCancellable(ms).delay
|
||||
|
||||
export const delayCancellable = (ms: number) => {
|
||||
const stack = new Error().stack
|
||||
@@ -140,7 +141,7 @@ export const delayCancellable = (ms: number) => {
|
||||
reject = _reject
|
||||
})
|
||||
const cancel = () => {
|
||||
clearTimeout (timeout)
|
||||
clearTimeout(timeout)
|
||||
reject(
|
||||
new Boom('Cancelled', {
|
||||
statusCode: 500,
|
||||
@@ -154,29 +155,33 @@ export const delayCancellable = (ms: number) => {
|
||||
return { delay, cancel }
|
||||
}
|
||||
|
||||
export async function promiseTimeout<T>(ms: number | undefined, promise: (resolve: (v: T) => void, reject: (error) => void) => void) {
|
||||
if(!ms) {
|
||||
export async function promiseTimeout<T>(
|
||||
ms: number | undefined,
|
||||
promise: (resolve: (v: T) => void, reject: (error) => void) => void
|
||||
) {
|
||||
if (!ms) {
|
||||
return new Promise(promise)
|
||||
}
|
||||
|
||||
const stack = new Error().stack
|
||||
// Create a promise that rejects in <ms> milliseconds
|
||||
const { delay, cancel } = delayCancellable (ms)
|
||||
const { delay, cancel } = delayCancellable(ms)
|
||||
const p = new Promise((resolve, reject) => {
|
||||
delay
|
||||
.then(() => reject(
|
||||
new Boom('Timed Out', {
|
||||
statusCode: DisconnectReason.timedOut,
|
||||
data: {
|
||||
stack
|
||||
}
|
||||
})
|
||||
))
|
||||
.catch (err => reject(err))
|
||||
.then(() =>
|
||||
reject(
|
||||
new Boom('Timed Out', {
|
||||
statusCode: DisconnectReason.timedOut,
|
||||
data: {
|
||||
stack
|
||||
}
|
||||
})
|
||||
)
|
||||
)
|
||||
.catch(err => reject(err))
|
||||
|
||||
promise (resolve, reject)
|
||||
})
|
||||
.finally (cancel)
|
||||
promise(resolve, reject)
|
||||
}).finally(cancel)
|
||||
return p as Promise<T>
|
||||
}
|
||||
|
||||
@@ -186,9 +191,9 @@ export const generateMessageIDV2 = (userId?: string): string => {
|
||||
const data = Buffer.alloc(8 + 20 + 16)
|
||||
data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)))
|
||||
|
||||
if(userId) {
|
||||
if (userId) {
|
||||
const id = jidDecode(userId)
|
||||
if(id?.user) {
|
||||
if (id?.user) {
|
||||
data.write(id.user, 8)
|
||||
data.write('@c.us', 8 + id.user.length)
|
||||
}
|
||||
@@ -205,37 +210,30 @@ export const generateMessageIDV2 = (userId?: string): string => {
|
||||
export const generateMessageID = () => '3EB0' + randomBytes(18).toString('hex').toUpperCase()
|
||||
|
||||
export function bindWaitForEvent<T extends keyof BaileysEventMap>(ev: BaileysEventEmitter, event: T) {
|
||||
return async(check: (u: BaileysEventMap[T]) => Promise<boolean | undefined>, timeoutMs?: number) => {
|
||||
return async (check: (u: BaileysEventMap[T]) => Promise<boolean | undefined>, timeoutMs?: number) => {
|
||||
let listener: (item: BaileysEventMap[T]) => void
|
||||
let closeListener: (state: Partial<ConnectionState>) => void
|
||||
await (
|
||||
promiseTimeout<void>(
|
||||
timeoutMs,
|
||||
(resolve, reject) => {
|
||||
closeListener = ({ connection, lastDisconnect }) => {
|
||||
if(connection === 'close') {
|
||||
reject(
|
||||
lastDisconnect?.error
|
||||
|| new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
ev.on('connection.update', closeListener)
|
||||
listener = async(update) => {
|
||||
if(await check(update)) {
|
||||
resolve()
|
||||
}
|
||||
}
|
||||
|
||||
ev.on(event, listener)
|
||||
await promiseTimeout<void>(timeoutMs, (resolve, reject) => {
|
||||
closeListener = ({ connection, lastDisconnect }) => {
|
||||
if (connection === 'close') {
|
||||
reject(
|
||||
lastDisconnect?.error || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })
|
||||
)
|
||||
}
|
||||
)
|
||||
.finally(() => {
|
||||
ev.off(event, listener)
|
||||
ev.off('connection.update', closeListener)
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
ev.on('connection.update', closeListener)
|
||||
listener = async update => {
|
||||
if (await check(update)) {
|
||||
resolve()
|
||||
}
|
||||
}
|
||||
|
||||
ev.on(event, listener)
|
||||
}).finally(() => {
|
||||
ev.off(event, listener)
|
||||
ev.off('connection.update', closeListener)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,21 +243,18 @@ export const bindWaitForConnectionUpdate = (ev: BaileysEventEmitter) => bindWait
|
||||
* utility that fetches latest baileys version from the master branch.
|
||||
* Use to ensure your WA connection is always on the latest version
|
||||
*/
|
||||
export const fetchLatestBaileysVersion = async(options: AxiosRequestConfig<{}> = { }) => {
|
||||
export const fetchLatestBaileysVersion = async (options: AxiosRequestConfig<{}> = {}) => {
|
||||
const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json'
|
||||
try {
|
||||
const result = await axios.get<{ version: WAVersion }>(
|
||||
URL,
|
||||
{
|
||||
...options,
|
||||
responseType: 'json'
|
||||
}
|
||||
)
|
||||
const result = await axios.get<{ version: WAVersion }>(URL, {
|
||||
...options,
|
||||
responseType: 'json'
|
||||
})
|
||||
return {
|
||||
version: result.data.version,
|
||||
isLatest: true
|
||||
}
|
||||
} catch(error) {
|
||||
} catch (error) {
|
||||
return {
|
||||
version: baileysVersion as WAVersion,
|
||||
isLatest: false,
|
||||
@@ -272,20 +267,17 @@ export const fetchLatestBaileysVersion = async(options: AxiosRequestConfig<{}> =
|
||||
* A utility that fetches the latest web version of whatsapp.
|
||||
* Use to ensure your WA connection is always on the latest version
|
||||
*/
|
||||
export const fetchLatestWaWebVersion = async(options: AxiosRequestConfig<{}>) => {
|
||||
export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) => {
|
||||
try {
|
||||
const { data } = await axios.get(
|
||||
'https://web.whatsapp.com/sw.js',
|
||||
{
|
||||
...options,
|
||||
responseType: 'json'
|
||||
}
|
||||
)
|
||||
const { data } = await axios.get('https://web.whatsapp.com/sw.js', {
|
||||
...options,
|
||||
responseType: 'json'
|
||||
})
|
||||
|
||||
const regex = /\\?"client_revision\\?":\s*(\d+)/
|
||||
const match = data.match(regex)
|
||||
|
||||
if(!match?.[1]) {
|
||||
if (!match?.[1]) {
|
||||
return {
|
||||
version: baileysVersion as WAVersion,
|
||||
isLatest: false,
|
||||
@@ -301,7 +293,7 @@ export const fetchLatestWaWebVersion = async(options: AxiosRequestConfig<{}>) =>
|
||||
version: [2, 3000, +clientRevision] as WAVersion,
|
||||
isLatest: true
|
||||
}
|
||||
} catch(error) {
|
||||
} catch (error) {
|
||||
return {
|
||||
version: baileysVersion as WAVersion,
|
||||
isLatest: false,
|
||||
@@ -317,9 +309,9 @@ export const generateMdTagPrefix = () => {
|
||||
}
|
||||
|
||||
const STATUS_MAP: { [_: string]: proto.WebMessageInfo.Status } = {
|
||||
'sender': proto.WebMessageInfo.Status.SERVER_ACK,
|
||||
'played': proto.WebMessageInfo.Status.PLAYED,
|
||||
'read': proto.WebMessageInfo.Status.READ,
|
||||
sender: proto.WebMessageInfo.Status.SERVER_ACK,
|
||||
played: proto.WebMessageInfo.Status.PLAYED,
|
||||
read: proto.WebMessageInfo.Status.READ,
|
||||
'read-self': proto.WebMessageInfo.Status.READ
|
||||
}
|
||||
/**
|
||||
@@ -328,7 +320,7 @@ const STATUS_MAP: { [_: string]: proto.WebMessageInfo.Status } = {
|
||||
*/
|
||||
export const getStatusFromReceiptType = (type: string | undefined) => {
|
||||
const status = STATUS_MAP[type!]
|
||||
if(typeof type === 'undefined') {
|
||||
if (typeof type === 'undefined') {
|
||||
return proto.WebMessageInfo.Status.DELIVERY_ACK
|
||||
}
|
||||
|
||||
@@ -348,7 +340,7 @@ export const getErrorCodeFromStreamError = (node: BinaryNode) => {
|
||||
let reason = reasonNode?.tag || 'unknown'
|
||||
const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession)
|
||||
|
||||
if(statusCode === DisconnectReason.restartRequired) {
|
||||
if (statusCode === DisconnectReason.restartRequired) {
|
||||
reason = 'restart required'
|
||||
}
|
||||
|
||||
@@ -361,28 +353,28 @@ export const getErrorCodeFromStreamError = (node: BinaryNode) => {
|
||||
export const getCallStatusFromNode = ({ tag, attrs }: BinaryNode) => {
|
||||
let status: WACallUpdateType
|
||||
switch (tag) {
|
||||
case 'offer':
|
||||
case 'offer_notice':
|
||||
status = 'offer'
|
||||
break
|
||||
case 'terminate':
|
||||
if(attrs.reason === 'timeout') {
|
||||
status = 'timeout'
|
||||
} else {
|
||||
//fired when accepted/rejected/timeout/caller hangs up
|
||||
status = 'terminate'
|
||||
}
|
||||
case 'offer':
|
||||
case 'offer_notice':
|
||||
status = 'offer'
|
||||
break
|
||||
case 'terminate':
|
||||
if (attrs.reason === 'timeout') {
|
||||
status = 'timeout'
|
||||
} else {
|
||||
//fired when accepted/rejected/timeout/caller hangs up
|
||||
status = 'terminate'
|
||||
}
|
||||
|
||||
break
|
||||
case 'reject':
|
||||
status = 'reject'
|
||||
break
|
||||
case 'accept':
|
||||
status = 'accept'
|
||||
break
|
||||
default:
|
||||
status = 'ringing'
|
||||
break
|
||||
break
|
||||
case 'reject':
|
||||
status = 'reject'
|
||||
break
|
||||
case 'accept':
|
||||
status = 'accept'
|
||||
break
|
||||
default:
|
||||
status = 'ringing'
|
||||
break
|
||||
}
|
||||
|
||||
return status
|
||||
@@ -392,16 +384,17 @@ const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: '
|
||||
|
||||
export const getCodeFromWSError = (error: Error) => {
|
||||
let statusCode = 500
|
||||
if(error?.message?.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
|
||||
if (error?.message?.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
|
||||
const code = +error?.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length)
|
||||
if(!Number.isNaN(code) && code >= 400) {
|
||||
if (!Number.isNaN(code) && code >= 400) {
|
||||
statusCode = code
|
||||
}
|
||||
} else if(
|
||||
} else if (
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(error as any)?.code?.startsWith('E')
|
||||
|| error?.message?.includes('timed out')
|
||||
) { // handle ETIMEOUT, ENOTFOUND etc
|
||||
(error as any)?.code?.startsWith('E') ||
|
||||
error?.message?.includes('timed out')
|
||||
) {
|
||||
// handle ETIMEOUT, ENOTFOUND etc
|
||||
statusCode = 408
|
||||
}
|
||||
|
||||
@@ -417,9 +410,9 @@ export const isWABusinessPlatform = (platform: string) => {
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function trimUndefined(obj: {[_: string]: any}) {
|
||||
for(const key in obj) {
|
||||
if(typeof obj[key] === 'undefined') {
|
||||
export function trimUndefined(obj: { [_: string]: any }) {
|
||||
for (const key in obj) {
|
||||
if (typeof obj[key] === 'undefined') {
|
||||
delete obj[key]
|
||||
}
|
||||
}
|
||||
@@ -434,17 +427,17 @@ export function bytesToCrockford(buffer: Buffer): string {
|
||||
let bitCount = 0
|
||||
const crockford: string[] = []
|
||||
|
||||
for(const element of buffer) {
|
||||
for (const element of buffer) {
|
||||
value = (value << 8) | (element & 0xff)
|
||||
bitCount += 8
|
||||
|
||||
while(bitCount >= 5) {
|
||||
while (bitCount >= 5) {
|
||||
crockford.push(CROCKFORD_CHARACTERS.charAt((value >>> (bitCount - 5)) & 31))
|
||||
bitCount -= 5
|
||||
}
|
||||
}
|
||||
|
||||
if(bitCount > 0) {
|
||||
if (bitCount > 0) {
|
||||
crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user