Path: blob/master/node_modules/@adiwajshing/baileys/lib/Utils/generics.js
2593 views
"use strict";1var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {2if (k2 === undefined) k2 = k;3Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });4}) : (function(o, m, k, k2) {5if (k2 === undefined) k2 = k;6o[k2] = m[k];7}));8var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {9Object.defineProperty(o, "default", { enumerable: true, value: v });10}) : function(o, v) {11o["default"] = v;12});13var __importStar = (this && this.__importStar) || function (mod) {14if (mod && mod.__esModule) return mod;15var result = {};16if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);17__setModuleDefault(result, mod);18return result;19};20var __importDefault = (this && this.__importDefault) || function (mod) {21return (mod && mod.__esModule) ? mod : { "default": mod };22};23Object.defineProperty(exports, "__esModule", { value: true });24exports.fetchLatestBaileysVersion = exports.printQRIfNecessaryListener = exports.bindWaitForConnectionUpdate = exports.generateMessageID = exports.promiseTimeout = exports.delayCancellable = exports.delay = exports.debouncedTimeout = exports.unixTimestampSeconds = exports.shallowChanges = exports.toNumber = exports.encodeBigEndian = exports.encodeInt = exports.generateRegistrationId = exports.encodeWAMessage = exports.unpadRandomMax16 = exports.writeRandomPadMax16 = exports.BufferJSON = exports.Browsers = void 0;25const boom_1 = require("@hapi/boom");26const axios_1 = __importDefault(require("axios"));27const crypto_1 = require("crypto");28const os_1 = require("os");29const WAProto_1 = require("../../WAProto");30const baileys_version_json_1 = require("../Defaults/baileys-version.json");31const Types_1 = require("../Types");32const WABinary_1 = require("../WABinary");33const PLATFORM_MAP = {34'aix': 'AIX',35'darwin': 'Mac OS',36'win32': 'Windows',37'android': 'Android'38};39exports.Browsers = {40ubuntu: browser => ['Ubuntu', browser, '18.04'],41macOS: browser => ['Mac OS', browser, '10.15.3'],42baileys: browser => ['Baileys', browser, '4.0.0'],43/** The appropriate browser based on your OS & release */44appropriate: browser => [PLATFORM_MAP[os_1.platform()] || 'Ubuntu', browser, os_1.release()]45};46exports.BufferJSON = {47replacer: (k, value) => {48if (Buffer.isBuffer(value) || value instanceof Uint8Array || (value === null || value === void 0 ? void 0 : value.type) === 'Buffer') {49return { type: 'Buffer', data: Buffer.from((value === null || value === void 0 ? void 0 : value.data) || value).toString('base64') };50}51return value;52},53reviver: (_, value) => {54if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {55const val = value.data || value.value;56return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val);57}58return value;59}60};61const writeRandomPadMax16 = (e) => {62function r(e, t) {63for (var r = 0; r < t; r++) {64e.writeUint8(t);65}66}67var t = crypto_1.randomBytes(1);68r(e, 1 + (15 & t[0]));69return e;70};71exports.writeRandomPadMax16 = writeRandomPadMax16;72const unpadRandomMax16 = (e) => {73const t = new Uint8Array(e);74if (0 === t.length) {75throw new Error('unpadPkcs7 given empty bytes');76}77var r = t[t.length - 1];78if (r > t.length) {79throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`);80}81return new Uint8Array(t.buffer, t.byteOffset, t.length - r);82};83exports.unpadRandomMax16 = unpadRandomMax16;84const encodeWAMessage = (message) => (Buffer.from(exports.writeRandomPadMax16(new WABinary_1.Binary(WAProto_1.proto.Message.encode(message).finish())).readByteArray()));85exports.encodeWAMessage = encodeWAMessage;86const generateRegistrationId = () => (Uint16Array.from(crypto_1.randomBytes(2))[0] & 0x3fff);87exports.generateRegistrationId = generateRegistrationId;88const encodeInt = (e, t) => {89for (var r = t, a = new Uint8Array(e), i = e - 1; i >= 0; i--) {90a[i] = 255 & r;91r >>>= 8;92}93return a;94};95exports.encodeInt = encodeInt;96const encodeBigEndian = (e, t = 4) => {97let r = e;98const a = new Uint8Array(t);99for (let i = t - 1; i >= 0; i--) {100a[i] = 255 & r;101r >>>= 8;102}103return a;104};105exports.encodeBigEndian = encodeBigEndian;106const toNumber = (t) => ((typeof t === 'object' && 'toNumber' in t) ? t.toNumber() : t);107exports.toNumber = toNumber;108function shallowChanges(old, current, { lookForDeletedKeys }) {109const changes = {};110for (const key in current) {111if (old[key] !== current[key]) {112changes[key] = current[key] || null;113}114}115if (lookForDeletedKeys) {116for (const key in old) {117if (!changes[key] && old[key] !== current[key]) {118changes[key] = current[key] || null;119}120}121}122return changes;123}124exports.shallowChanges = shallowChanges;125/** unix timestamp of a date in seconds */126const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000);127exports.unixTimestampSeconds = unixTimestampSeconds;128const debouncedTimeout = (intervalMs = 1000, task = undefined) => {129let timeout;130return {131start: (newIntervalMs, newTask) => {132task = newTask || task;133intervalMs = newIntervalMs || intervalMs;134timeout && clearTimeout(timeout);135timeout = setTimeout(task, intervalMs);136},137cancel: () => {138timeout && clearTimeout(timeout);139timeout = undefined;140},141setTask: (newTask) => task = newTask,142setInterval: (newInterval) => intervalMs = newInterval143};144};145exports.debouncedTimeout = debouncedTimeout;146const delay = (ms) => exports.delayCancellable(ms).delay;147exports.delay = delay;148const delayCancellable = (ms) => {149const stack = new Error().stack;150let timeout;151let reject;152const delay = new Promise((resolve, _reject) => {153timeout = setTimeout(resolve, ms);154reject = _reject;155});156const cancel = () => {157clearTimeout(timeout);158reject(new boom_1.Boom('Cancelled', {159statusCode: 500,160data: {161stack162}163}));164};165return { delay, cancel };166};167exports.delayCancellable = delayCancellable;168async function promiseTimeout(ms, promise) {169if (!ms) {170return new Promise(promise);171}172const stack = new Error().stack;173// Create a promise that rejects in <ms> milliseconds174const { delay, cancel } = exports.delayCancellable(ms);175const p = new Promise((resolve, reject) => {176delay177.then(() => reject(new boom_1.Boom('Timed Out', {178statusCode: Types_1.DisconnectReason.timedOut,179data: {180stack181}182})))183.catch(err => reject(err));184promise(resolve, reject);185})186.finally(cancel);187return p;188}189exports.promiseTimeout = promiseTimeout;190// generate a random ID to attach to a message191const generateMessageID = () => 'BAE5' + crypto_1.randomBytes(6).toString('hex').toUpperCase();192exports.generateMessageID = generateMessageID;193const bindWaitForConnectionUpdate = (ev) => (async (check, timeoutMs) => {194let listener;195await (promiseTimeout(timeoutMs, (resolve, reject) => {196listener = (update) => {197var _a;198if (check(update)) {199resolve();200}201else if (update.connection === 'close') {202reject(((_a = update.lastDisconnect) === null || _a === void 0 ? void 0 : _a.error) || new boom_1.Boom('Connection Closed', { statusCode: Types_1.DisconnectReason.connectionClosed }));203}204};205ev.on('connection.update', listener);206})207.finally(() => (ev.off('connection.update', listener))));208});209exports.bindWaitForConnectionUpdate = bindWaitForConnectionUpdate;210const printQRIfNecessaryListener = (ev, logger) => {211ev.on('connection.update', async ({ qr }) => {212if (qr) {213const QR = await Promise.resolve().then(() => __importStar(require('qrcode-terminal'))).catch(err => {214logger.error('QR code terminal not added as dependency');215});216QR === null || QR === void 0 ? void 0 : QR.generate(qr, { small: true });217}218});219};220exports.printQRIfNecessaryListener = printQRIfNecessaryListener;221/**222* utility that fetches latest baileys version from the master branch.223* Use to ensure your WA connection is always on the latest version224*/225const fetchLatestBaileysVersion = async () => {226const URL = 'https://raw.githubusercontent.com/adiwajshing/Baileys/master/src/Defaults/baileys-version.json';227try {228const result = await axios_1.default.get(URL, { responseType: 'json' });229return {230version: result.data.version,231isLatest: true232};233}234catch (error) {235return {236version: baileys_version_json_1.version,237isLatest: false,238error239};240}241};242exports.fetchLatestBaileysVersion = fetchLatestBaileysVersion;243244245